From 574511234dd46fe463f96046a69b9d31c09bd323 Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Tue, 21 Mar 2023 15:29:12 +0800
Subject: [PATCH] 123

---
 /dev/null | 39422 -----------------------------------------------------------
 1 files changed, 0 insertions(+), 39,422 deletions(-)

diff --git a/public/libs/Cesium/Assets/Textures/maki/airport.png b/public/libs/Cesium/Assets/Textures/maki/airport.png
deleted file mode 100644
index 44a8413..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/airport.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/alcohol-shop.png b/public/libs/Cesium/Assets/Textures/maki/alcohol-shop.png
deleted file mode 100644
index b75a5d9..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/alcohol-shop.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/america-football.png b/public/libs/Cesium/Assets/Textures/maki/america-football.png
deleted file mode 100644
index 5a2c6ba..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/america-football.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/art-gallery.png b/public/libs/Cesium/Assets/Textures/maki/art-gallery.png
deleted file mode 100644
index a663512..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/art-gallery.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/bakery.png b/public/libs/Cesium/Assets/Textures/maki/bakery.png
deleted file mode 100644
index 9735d5e..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/bakery.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/bank.png b/public/libs/Cesium/Assets/Textures/maki/bank.png
deleted file mode 100644
index a67cee0..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/bank.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/bar.png b/public/libs/Cesium/Assets/Textures/maki/bar.png
deleted file mode 100644
index 8c2812f..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/bar.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/baseball.png b/public/libs/Cesium/Assets/Textures/maki/baseball.png
deleted file mode 100644
index 23f344b..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/baseball.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/basketball.png b/public/libs/Cesium/Assets/Textures/maki/basketball.png
deleted file mode 100644
index 7ed3bfc..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/basketball.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/beer.png b/public/libs/Cesium/Assets/Textures/maki/beer.png
deleted file mode 100644
index a15cf99..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/beer.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/bicycle.png b/public/libs/Cesium/Assets/Textures/maki/bicycle.png
deleted file mode 100644
index fb871be..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/bicycle.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/building.png b/public/libs/Cesium/Assets/Textures/maki/building.png
deleted file mode 100644
index 885f112..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/building.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/bus.png b/public/libs/Cesium/Assets/Textures/maki/bus.png
deleted file mode 100644
index 7830502..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/bus.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/cafe.png b/public/libs/Cesium/Assets/Textures/maki/cafe.png
deleted file mode 100644
index 2050cba..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/cafe.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/camera.png b/public/libs/Cesium/Assets/Textures/maki/camera.png
deleted file mode 100644
index ec54e12..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/camera.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/campsite.png b/public/libs/Cesium/Assets/Textures/maki/campsite.png
deleted file mode 100644
index 36e0a92..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/campsite.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/car.png b/public/libs/Cesium/Assets/Textures/maki/car.png
deleted file mode 100644
index 2075afa..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/car.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/cemetery.png b/public/libs/Cesium/Assets/Textures/maki/cemetery.png
deleted file mode 100644
index df244fd..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/cemetery.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/cesium.png b/public/libs/Cesium/Assets/Textures/maki/cesium.png
deleted file mode 100644
index ce2755d..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/cesium.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/chemist.png b/public/libs/Cesium/Assets/Textures/maki/chemist.png
deleted file mode 100644
index eb1ea35..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/chemist.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/cinema.png b/public/libs/Cesium/Assets/Textures/maki/cinema.png
deleted file mode 100644
index 56b6925..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/cinema.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/circle-stroked.png b/public/libs/Cesium/Assets/Textures/maki/circle-stroked.png
deleted file mode 100644
index 88689e4..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/circle-stroked.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/circle.png b/public/libs/Cesium/Assets/Textures/maki/circle.png
deleted file mode 100644
index fbbd582..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/circle.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/city.png b/public/libs/Cesium/Assets/Textures/maki/city.png
deleted file mode 100644
index 37d8fad..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/city.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/clothing-store.png b/public/libs/Cesium/Assets/Textures/maki/clothing-store.png
deleted file mode 100644
index ff5f8a2..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/clothing-store.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/college.png b/public/libs/Cesium/Assets/Textures/maki/college.png
deleted file mode 100644
index 1026387..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/college.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/commercial.png b/public/libs/Cesium/Assets/Textures/maki/commercial.png
deleted file mode 100644
index fdf3b63..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/commercial.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/cricket.png b/public/libs/Cesium/Assets/Textures/maki/cricket.png
deleted file mode 100644
index 6642a3a..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/cricket.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/cross.png b/public/libs/Cesium/Assets/Textures/maki/cross.png
deleted file mode 100644
index 8945b3b..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/cross.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/dam.png b/public/libs/Cesium/Assets/Textures/maki/dam.png
deleted file mode 100644
index aed88a8..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/dam.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/danger.png b/public/libs/Cesium/Assets/Textures/maki/danger.png
deleted file mode 100644
index 9479572..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/danger.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/disability.png b/public/libs/Cesium/Assets/Textures/maki/disability.png
deleted file mode 100644
index 1cc3550..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/disability.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/dog-park.png b/public/libs/Cesium/Assets/Textures/maki/dog-park.png
deleted file mode 100644
index 3483e35..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/dog-park.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/embassy.png b/public/libs/Cesium/Assets/Textures/maki/embassy.png
deleted file mode 100644
index 46b7e1e..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/embassy.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/emergency-telephone.png b/public/libs/Cesium/Assets/Textures/maki/emergency-telephone.png
deleted file mode 100644
index fac6239..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/emergency-telephone.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/entrance.png b/public/libs/Cesium/Assets/Textures/maki/entrance.png
deleted file mode 100644
index b0ba8c5..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/entrance.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/farm.png b/public/libs/Cesium/Assets/Textures/maki/farm.png
deleted file mode 100644
index 7b03e82..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/farm.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/fast-food.png b/public/libs/Cesium/Assets/Textures/maki/fast-food.png
deleted file mode 100644
index 9488c26..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/fast-food.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/ferry.png b/public/libs/Cesium/Assets/Textures/maki/ferry.png
deleted file mode 100644
index 58c2f27..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/ferry.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/fire-station.png b/public/libs/Cesium/Assets/Textures/maki/fire-station.png
deleted file mode 100644
index 427512f..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/fire-station.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/fuel.png b/public/libs/Cesium/Assets/Textures/maki/fuel.png
deleted file mode 100644
index dc6059b..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/fuel.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/garden.png b/public/libs/Cesium/Assets/Textures/maki/garden.png
deleted file mode 100644
index 265edb8..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/garden.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/gift.png b/public/libs/Cesium/Assets/Textures/maki/gift.png
deleted file mode 100644
index 866263e..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/gift.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/golf.png b/public/libs/Cesium/Assets/Textures/maki/golf.png
deleted file mode 100644
index 2169d91..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/golf.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/grepin.png b/public/libs/Cesium/Assets/Textures/maki/grepin.png
deleted file mode 100644
index 27ee284..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/grepin.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/grocery.png b/public/libs/Cesium/Assets/Textures/maki/grocery.png
deleted file mode 100644
index 05b09d4..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/grocery.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/hairdresser.png b/public/libs/Cesium/Assets/Textures/maki/hairdresser.png
deleted file mode 100644
index 68fbe1e..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/hairdresser.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/harbor.png b/public/libs/Cesium/Assets/Textures/maki/harbor.png
deleted file mode 100644
index 2814f3c..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/harbor.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/heart.png b/public/libs/Cesium/Assets/Textures/maki/heart.png
deleted file mode 100644
index 82e9808..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/heart.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/heliport.png b/public/libs/Cesium/Assets/Textures/maki/heliport.png
deleted file mode 100644
index 953828d..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/heliport.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/hospital.png b/public/libs/Cesium/Assets/Textures/maki/hospital.png
deleted file mode 100644
index faf294e..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/hospital.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/ice-cream.png b/public/libs/Cesium/Assets/Textures/maki/ice-cream.png
deleted file mode 100644
index 323c964..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/ice-cream.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/industrial.png b/public/libs/Cesium/Assets/Textures/maki/industrial.png
deleted file mode 100644
index 9b3b525..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/industrial.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/land-use.png b/public/libs/Cesium/Assets/Textures/maki/land-use.png
deleted file mode 100644
index f86b21b..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/land-use.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/laundry.png b/public/libs/Cesium/Assets/Textures/maki/laundry.png
deleted file mode 100644
index 53fd20d..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/laundry.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/library.png b/public/libs/Cesium/Assets/Textures/maki/library.png
deleted file mode 100644
index 8564e84..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/library.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/lighthouse.png b/public/libs/Cesium/Assets/Textures/maki/lighthouse.png
deleted file mode 100644
index a78e21a..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/lighthouse.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/lodging.png b/public/libs/Cesium/Assets/Textures/maki/lodging.png
deleted file mode 100644
index 4e41ea6..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/lodging.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/logging.png b/public/libs/Cesium/Assets/Textures/maki/logging.png
deleted file mode 100644
index 4aeef0b..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/logging.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/london-underground.png b/public/libs/Cesium/Assets/Textures/maki/london-underground.png
deleted file mode 100644
index 94972f7..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/london-underground.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/marker-stroked.png b/public/libs/Cesium/Assets/Textures/maki/marker-stroked.png
deleted file mode 100644
index f00d112..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/marker-stroked.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/marker.png b/public/libs/Cesium/Assets/Textures/maki/marker.png
deleted file mode 100644
index 825eeca..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/marker.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/minefield.png b/public/libs/Cesium/Assets/Textures/maki/minefield.png
deleted file mode 100644
index 60e174a..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/minefield.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/mobilephone.png b/public/libs/Cesium/Assets/Textures/maki/mobilephone.png
deleted file mode 100644
index a40ef9c..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/mobilephone.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/monument.png b/public/libs/Cesium/Assets/Textures/maki/monument.png
deleted file mode 100644
index 5b8b7de..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/monument.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/museum.png b/public/libs/Cesium/Assets/Textures/maki/museum.png
deleted file mode 100644
index 23c1790..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/museum.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/music.png b/public/libs/Cesium/Assets/Textures/maki/music.png
deleted file mode 100644
index dbef56f..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/music.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/oil-well.png b/public/libs/Cesium/Assets/Textures/maki/oil-well.png
deleted file mode 100644
index a421f5a..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/oil-well.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/park.png b/public/libs/Cesium/Assets/Textures/maki/park.png
deleted file mode 100644
index 741110e..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/park.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/park2.png b/public/libs/Cesium/Assets/Textures/maki/park2.png
deleted file mode 100644
index 5f60dcc..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/park2.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/parking-garage.png b/public/libs/Cesium/Assets/Textures/maki/parking-garage.png
deleted file mode 100644
index b91a811..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/parking-garage.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/parking.png b/public/libs/Cesium/Assets/Textures/maki/parking.png
deleted file mode 100644
index 6a843d9..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/parking.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/pharmacy.png b/public/libs/Cesium/Assets/Textures/maki/pharmacy.png
deleted file mode 100644
index d82e471..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/pharmacy.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/pitch.png b/public/libs/Cesium/Assets/Textures/maki/pitch.png
deleted file mode 100644
index a8205e8..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/pitch.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/place-of-worship.png b/public/libs/Cesium/Assets/Textures/maki/place-of-worship.png
deleted file mode 100644
index 29f7c31..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/place-of-worship.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/playground.png b/public/libs/Cesium/Assets/Textures/maki/playground.png
deleted file mode 100644
index 5270d3c..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/playground.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/police.png b/public/libs/Cesium/Assets/Textures/maki/police.png
deleted file mode 100644
index 9787a05..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/police.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/polling-place.png b/public/libs/Cesium/Assets/Textures/maki/polling-place.png
deleted file mode 100644
index b2d02a9..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/polling-place.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/post.png b/public/libs/Cesium/Assets/Textures/maki/post.png
deleted file mode 100644
index ee7aaca..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/post.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/prison.png b/public/libs/Cesium/Assets/Textures/maki/prison.png
deleted file mode 100644
index 355cba4..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/prison.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/rail-above.png b/public/libs/Cesium/Assets/Textures/maki/rail-above.png
deleted file mode 100644
index e48d7ea..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/rail-above.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/rail-light.png b/public/libs/Cesium/Assets/Textures/maki/rail-light.png
deleted file mode 100644
index 895565e..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/rail-light.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/rail-metro.png b/public/libs/Cesium/Assets/Textures/maki/rail-metro.png
deleted file mode 100644
index 86078c9..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/rail-metro.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/rail-underground.png b/public/libs/Cesium/Assets/Textures/maki/rail-underground.png
deleted file mode 100644
index 42cfeb7..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/rail-underground.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/rail.png b/public/libs/Cesium/Assets/Textures/maki/rail.png
deleted file mode 100644
index 8af055d..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/rail.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/religious-christian.png b/public/libs/Cesium/Assets/Textures/maki/religious-christian.png
deleted file mode 100644
index 201bc81..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/religious-christian.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/religious-jewish.png b/public/libs/Cesium/Assets/Textures/maki/religious-jewish.png
deleted file mode 100644
index e3c75f6..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/religious-jewish.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/religious-muslim.png b/public/libs/Cesium/Assets/Textures/maki/religious-muslim.png
deleted file mode 100644
index 25cbf08..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/religious-muslim.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/restaurant.png b/public/libs/Cesium/Assets/Textures/maki/restaurant.png
deleted file mode 100644
index 816282a..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/restaurant.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/roadblock.png b/public/libs/Cesium/Assets/Textures/maki/roadblock.png
deleted file mode 100644
index 539f0ed..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/roadblock.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/rocket.png b/public/libs/Cesium/Assets/Textures/maki/rocket.png
deleted file mode 100644
index e6ed718..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/rocket.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/school.png b/public/libs/Cesium/Assets/Textures/maki/school.png
deleted file mode 100644
index fb20bf4..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/school.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/scooter.png b/public/libs/Cesium/Assets/Textures/maki/scooter.png
deleted file mode 100644
index 41f7416..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/scooter.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/shop.png b/public/libs/Cesium/Assets/Textures/maki/shop.png
deleted file mode 100644
index 11a6b75..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/shop.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/skiing.png b/public/libs/Cesium/Assets/Textures/maki/skiing.png
deleted file mode 100644
index 4fc11e2..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/skiing.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/slaughterhouse.png b/public/libs/Cesium/Assets/Textures/maki/slaughterhouse.png
deleted file mode 100644
index 9b094ca..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/slaughterhouse.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/soccer.png b/public/libs/Cesium/Assets/Textures/maki/soccer.png
deleted file mode 100644
index 2385daf..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/soccer.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/square-stroked.png b/public/libs/Cesium/Assets/Textures/maki/square-stroked.png
deleted file mode 100644
index fce75b0..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/square-stroked.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/square.png b/public/libs/Cesium/Assets/Textures/maki/square.png
deleted file mode 100644
index babc9c5..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/square.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/star-stroked.png b/public/libs/Cesium/Assets/Textures/maki/star-stroked.png
deleted file mode 100644
index 242e42e..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/star-stroked.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/star.png b/public/libs/Cesium/Assets/Textures/maki/star.png
deleted file mode 100644
index 447dd38..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/star.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/suitcase.png b/public/libs/Cesium/Assets/Textures/maki/suitcase.png
deleted file mode 100644
index a94f562..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/suitcase.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/swimming.png b/public/libs/Cesium/Assets/Textures/maki/swimming.png
deleted file mode 100644
index b9fbdcc..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/swimming.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/telephone.png b/public/libs/Cesium/Assets/Textures/maki/telephone.png
deleted file mode 100644
index 6d57dc6..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/telephone.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/tennis.png b/public/libs/Cesium/Assets/Textures/maki/tennis.png
deleted file mode 100644
index 6cb6320..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/tennis.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/theatre.png b/public/libs/Cesium/Assets/Textures/maki/theatre.png
deleted file mode 100644
index 772c96e..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/theatre.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/toilets.png b/public/libs/Cesium/Assets/Textures/maki/toilets.png
deleted file mode 100644
index e87cf19..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/toilets.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/town-hall.png b/public/libs/Cesium/Assets/Textures/maki/town-hall.png
deleted file mode 100644
index 1af5c7c..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/town-hall.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/town.png b/public/libs/Cesium/Assets/Textures/maki/town.png
deleted file mode 100644
index 4166169..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/town.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/triangle-stroked.png b/public/libs/Cesium/Assets/Textures/maki/triangle-stroked.png
deleted file mode 100644
index 131c7d9..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/triangle-stroked.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/triangle.png b/public/libs/Cesium/Assets/Textures/maki/triangle.png
deleted file mode 100644
index d9c47f4..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/triangle.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/village.png b/public/libs/Cesium/Assets/Textures/maki/village.png
deleted file mode 100644
index 2650af5..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/village.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/warehouse.png b/public/libs/Cesium/Assets/Textures/maki/warehouse.png
deleted file mode 100644
index 910f1e4..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/warehouse.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/waste-basket.png b/public/libs/Cesium/Assets/Textures/maki/waste-basket.png
deleted file mode 100644
index a71f9e4..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/waste-basket.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/water.png b/public/libs/Cesium/Assets/Textures/maki/water.png
deleted file mode 100644
index 159a557..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/water.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/wetland.png b/public/libs/Cesium/Assets/Textures/maki/wetland.png
deleted file mode 100644
index 1e8dec8..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/wetland.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Assets/Textures/maki/zoo.png b/public/libs/Cesium/Assets/Textures/maki/zoo.png
deleted file mode 100644
index 4802299..0000000
--- a/public/libs/Cesium/Assets/Textures/maki/zoo.png
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Widgets/Images/cur/Hold.cur b/public/libs/Cesium/Widgets/Images/cur/Hold.cur
deleted file mode 100644
index 9937344..0000000
--- a/public/libs/Cesium/Widgets/Images/cur/Hold.cur
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Widgets/Images/cur/Pan.cur b/public/libs/Cesium/Widgets/Images/cur/Pan.cur
deleted file mode 100644
index e02a1f2..0000000
--- a/public/libs/Cesium/Widgets/Images/cur/Pan.cur
+++ /dev/null
Binary files differ
diff --git a/public/libs/Cesium/Widgets/InfoBox/InfoBox.css b/public/libs/Cesium/Widgets/InfoBox/InfoBox.css
deleted file mode 100644
index 61b8af1..0000000
--- a/public/libs/Cesium/Widgets/InfoBox/InfoBox.css
+++ /dev/null
@@ -1,98 +0,0 @@
-.cesium-infoBox {
-    display: block;
-    position: absolute;
-    top: 50px;
-    right: 0;
-    width: 40%;
-    max-width: 480px;
-    background: rgba(38, 38, 38, 0.95);
-    color: #edffff;
-    border: 1px solid #444;
-    border-right: none;
-    border-top-left-radius: 7px;
-    border-bottom-left-radius: 7px;
-    box-shadow: 0 0 10px 1px #000;
-    transform: translate(100%, 0);
-    visibility: hidden;
-    opacity: 0;
-    transition: visibility 0s 0.2s, opacity 0.2s ease-in, transform 0.2s ease-in;
-}
-
-.cesium-infoBox-visible {
-    transform: translate(0, 0);
-    visibility: visible;
-    opacity: 1;
-    transition: opacity 0.2s ease-out, transform 0.2s ease-out;
-}
-
-.cesium-infoBox-title {
-    display: block;
-    height: 20px;
-    padding: 5px 30px 5px 25px;
-    background: rgba(84, 84, 84, 1.0);
-    border-top-left-radius: 7px;
-    text-align: center;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-    overflow: hidden;
-    box-sizing: content-box;
-}
-
-.cesium-infoBox-bodyless .cesium-infoBox-title {
-    border-bottom-left-radius: 7px;
-}
-
-button.cesium-infoBox-camera {
-    display: block;
-    position: absolute;
-    top: 4px;
-    left: 4px;
-    width: 22px;
-    height: 22px;
-    background: transparent;
-    border-color: transparent;
-    border-radius: 3px;
-    padding: 0 5px;
-    margin: 0;
-}
-
-button.cesium-infoBox-close {
-    display: block;
-    position: absolute;
-    top: 5px;
-    right: 5px;
-    height: 20px;
-    background: transparent;
-    border: none;
-    border-radius: 2px;
-    font-weight: bold;
-    font-size: 16px;
-    padding: 0 5px;
-    margin: 0;
-    color: #edffff;
-}
-
-button.cesium-infoBox-close:focus {
-    background: rgba(238, 136, 0, 0.44);
-    outline: none;
-}
-
-button.cesium-infoBox-close:hover {
-    background: #888;
-    color: #000;
-}
-
-button.cesium-infoBox-close:active {
-    background: #a00;
-    color: #000;
-}
-
-.cesium-infoBox-bodyless .cesium-infoBox-iframe {
-    display: none;
-}
-
-.cesium-infoBox-iframe {
-    border: none;
-    width: 100%; /* Fallback */
-    width: calc(100% - 2px);
-}
diff --git a/public/libs/Cesium/Widgets/InfoBox/InfoBoxDescription.css b/public/libs/Cesium/Widgets/InfoBox/InfoBoxDescription.css
deleted file mode 100644
index 962e2dd..0000000
--- a/public/libs/Cesium/Widgets/InfoBox/InfoBoxDescription.css
+++ /dev/null
@@ -1,90 +0,0 @@
-@import url(../shared.css);
-body {
-    margin: 0;
-    padding: 0;
-}
-
-.cesium-infoBox-description {
-    font-family: sans-serif;
-    font-size: 13px;
-    padding: 4px 10px;
-    margin-right: 4px;
-    color: #edffff;
-}
-
-.cesium-infoBox-description a:link,
-.cesium-infoBox-description a:visited,
-.cesium-infoBox-description a:hover,
-.cesium-infoBox-description a:active {
-    color: #edffff;
-}
-
-.cesium-infoBox-description table {
-    color: #edffff;
-}
-
-.cesium-infoBox-defaultTable {
-    width: 100%;
-    color: #edffff;
-}
-
-.cesium-infoBox-defaultTable tr:nth-child(odd) {
-    background-color: rgba(84, 84, 84, 0.8);
-}
-
-.cesium-infoBox-defaultTable tr:nth-child(even) {
-    background-color: rgba(84, 84, 84, 0.25);
-}
-
-.cesium-infoBox-defaultTable th {
-    font-weight: normal;
-    padding: 3px;
-    vertical-align: middle;
-    text-align: center;
-}
-
-.cesium-infoBox-defaultTable td {
-    padding: 3px;
-    vertical-align: middle;
-    text-align: left;
-}
-
-.cesium-infoBox-description-lighter {
-    color: #000000;
-}
-
-.cesium-infoBox-description-lighter a:link,
-.cesium-infoBox-description-lighter a:visited,
-.cesium-infoBox-description-lighter a:hover,
-.cesium-infoBox-description-lighter a:active {
-    color: #000000;
-}
-
-.cesium-infoBox-description-lighter table {
-    color: #000000;
-}
-
-.cesium-infoBox-defaultTable-lighter {
-    width: 100%;
-    color: #000000;
-}
-
-.cesium-infoBox-defaultTable-lighter tr:nth-child(odd) {
-    background-color: rgba(179, 179, 179, 0.8);
-}
-
-.cesium-infoBox-defaultTable-lighter tr:nth-child(even) {
-    background-color: rgba(179, 179, 179, 0.25);
-}
-
-.cesium-infoBox-loadingContainer {
-    margin: 5px;
-    text-align: center;
-}
-
-.cesium-infoBox-loading {
-    display: inline-block;
-    background-image: url(../Images/info-loading.gif);
-    width: 16px;
-    height: 11px;
-}
diff --git a/public/libs/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css b/public/libs/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css
deleted file mode 100644
index 0a40ef9..0000000
--- a/public/libs/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css
+++ /dev/null
@@ -1,112 +0,0 @@
-.cesium-navigationHelpButton-wrapper {
-    position: relative;
-    display: inline-block;
-}
-
-.cesium-navigation-help {
-    visibility: hidden;
-    position: absolute;
-    top: 38px;
-    right: 2px;
-    width: 250px;
-    border-radius: 10px;
-    transform: scale(0.01);
-    transform-origin: 234px -10px;
-    transition: visibility 0s 0.25s, transform 0.25s ease-in;
-}
-
-.cesium-navigation-help-visible {
-    visibility: visible;
-    transform: scale(1);
-    transition: transform 0.25s ease-out;
-}
-
-.cesium-navigation-help-instructions {
-    border: 1px solid #444;
-    background-color: rgba(38, 38, 38, 0.75);
-    padding-bottom: 5px;
-    border-radius: 0 0 10px 10px;
-}
-
-.cesium-click-navigation-help {
-    display: none;
-}
-
-.cesium-touch-navigation-help {
-    display: none;
-    padding-top: 5px;
-}
-
-.cesium-click-navigation-help-visible {
-    display: block;
-}
-
-.cesium-touch-navigation-help-visible {
-    display: block;
-}
-
-.cesium-navigation-help-pan {
-    color: #66ccff;
-    font-weight: bold;
-}
-
-.cesium-navigation-help-zoom {
-    color: #65fd00;
-    font-weight: bold;
-}
-
-.cesium-navigation-help-rotate {
-    color: #ffd800;
-    font-weight: bold;
-}
-
-.cesium-navigation-help-tilt {
-    color: #d800d8;
-    font-weight: bold;
-}
-
-.cesium-navigation-help-details {
-    color: #ffffff;
-}
-
-.cesium-navigation-button {
-    color: #fff;
-    background-color: transparent;
-    border-bottom: none;
-    border-top: 1px solid #444;
-    border-right: 1px solid #444;
-    margin: 0;
-    width: 50%;
-    cursor: pointer;
-}
-
-.cesium-navigation-button-icon {
-    vertical-align: middle;
-    padding: 5px 1px;
-}
-
-.cesium-navigation-button:focus {
-    outline: none;
-}
-
-.cesium-navigation-button-left {
-    border-radius: 10px 0 0 0;
-    border-left: 1px solid #444;
-}
-
-.cesium-navigation-button-right {
-    border-radius: 0 10px 0 0;
-    border-left: none;
-}
-
-.cesium-navigation-button-selected {
-    background-color: rgba(38, 38, 38, 0.75);
-}
-
-.cesium-navigation-button-unselected {
-    background-color: rgba(0, 0, 0, 0.75);
-}
-
-.cesium-navigation-button-unselected:hover {
-    background-color: rgba(76, 76, 76, 0.75);
-}
diff --git a/public/libs/Cesium/Widgets/NavigationHelpButton/lighter.css b/public/libs/Cesium/Widgets/NavigationHelpButton/lighter.css
deleted file mode 100644
index 1da49db..0000000
--- a/public/libs/Cesium/Widgets/NavigationHelpButton/lighter.css
+++ /dev/null
@@ -1,46 +0,0 @@
-.cesium-lighter .cesium-navigation-help-instructions {
-    border: 1px solid #759dc0;
-    background-color: rgba(255, 255, 255, 0.9);
-}
-
-.cesium-lighter .cesium-navigation-help-pan {
-    color: #66ccee;
-    font-weight: bold;
-}
-
-.cesium-lighter .cesium-navigation-help-zoom {
-    color: #65ec00;
-    font-weight: bold;
-}
-
-.cesium-lighter .cesium-navigation-help-rotate {
-    color: #eec722;
-    font-weight: bold;
-}
-
-.cesium-lighter .cesium-navigation-help-tilt {
-    color: #d800d8;
-    font-weight: bold;
-}
-
-.cesium-lighter .cesium-navigation-help-details {
-    color: #222222;
-}
-
-.cesium-lighter .cesium-navigation-button {
-    color: #222222;
-    border-top: 1px solid #759dc0;
-    border-right: 1px solid #759dc0;
-}
-
-.cesium-lighter .cesium-navigation-button-selected {
-    background-color: rgba(196, 225, 255, 0.9);
-}
-
-.cesium-lighter .cesium-navigation-button-unselected {
-    background-color: rgba(226, 240, 255, 0.9);
-}
-
-.cesium-lighter .cesium-navigation-button-unselected:hover {
-    background-color: rgba(166, 210, 255, 0.9);
-}
diff --git a/public/libs/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css b/public/libs/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css
deleted file mode 100644
index 188f237..0000000
--- a/public/libs/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css
+++ /dev/null
@@ -1,16 +0,0 @@
-.cesium-performance-watchdog-message-area {
-    position: relative;
-    background-color: yellow;
-    color: black;
-    padding: 10px;
-}
-
-.cesium-performance-watchdog-message {
-    margin-right: 30px;
-}
-
-.cesium-performance-watchdog-message-dismiss {
-    position: absolute;
-    right: 0;
-    margin: 0 10px 0 0;
-}
diff --git a/public/libs/Cesium/Widgets/SceneModePicker/SceneModePicker.css b/public/libs/Cesium/Widgets/SceneModePicker/SceneModePicker.css
deleted file mode 100644
index 400e9ef..0000000
--- a/public/libs/Cesium/Widgets/SceneModePicker/SceneModePicker.css
+++ /dev/null
@@ -1,68 +0,0 @@
-span.cesium-sceneModePicker-wrapper {
-    display: inline-block;
-    position: relative;
-    margin: 0 3px;
-}
-
-.cesium-sceneModePicker-visible {
-    visibility: visible;
-    opacity: 1;
-    transition: opacity 0.25s linear;
-}
-
-.cesium-sceneModePicker-hidden {
-    visibility: hidden;
-    opacity: 0;
-    transition: visibility 0s 0.25s, opacity 0.25s linear;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-none {
-    display: none;
-}
-
-.cesium-sceneModePicker-slide-svg {
-    transition: left 2s;
-    top: 0;
-    left: 0;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-dropDown-icon {
-    box-sizing: border-box;
-    padding: 0;
-    margin: 3px 0;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D,
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView,
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D {
-    margin: 0 0 3px 0;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D .cesium-sceneModePicker-icon2D {
-    left: 100%;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D .cesium-sceneModePicker-iconColumbusView {
-    left: 200%;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView .cesium-sceneModePicker-icon3D {
-    left: -200%;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView .cesium-sceneModePicker-icon2D {
-    left: -100%;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D .cesium-sceneModePicker-icon3D {
-    left: -100%;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D .cesium-sceneModePicker-iconColumbusView {
-    left: 100%;
-}
-
-.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-selected {
-    border-color: #2e2;
-    box-shadow: 0 0 8px #fff, 0 0 8px #fff;
-}
diff --git a/public/libs/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css b/public/libs/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css
deleted file mode 100644
index 83dbda4..0000000
--- a/public/libs/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css
+++ /dev/null
@@ -1,21 +0,0 @@
-.cesium-selection-wrapper {
-    position: absolute;
-    width: 160px;
-    height: 160px;
-    pointer-events: none;
-    visibility: hidden;
-    opacity: 0;
-    transition: visibility 0s 0.2s, opacity 0.2s ease-in;
-}
-
-.cesium-selection-wrapper-visible {
-    visibility: visible;
-    opacity: 1;
-    transition: opacity 0.2s ease-out;
-}
-
-.cesium-selection-wrapper svg {
-    fill: #2e2;
-    stroke: #000;
-    stroke-width: 1.1px;
-}
diff --git a/public/libs/Cesium/Widgets/Viewer/Viewer.css b/public/libs/Cesium/Widgets/Viewer/Viewer.css
deleted file mode 100644
index e043e08..0000000
--- a/public/libs/Cesium/Widgets/Viewer/Viewer.css
+++ /dev/null
@@ -1,108 +0,0 @@
-.cesium-viewer {
-    font-family: sans-serif;
-    font-size: 16px;
-    overflow: hidden;
-    display: block;
-    position: relative;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-}
-
-.cesium-viewer-cesiumWidgetContainer {
-    width: 100%;
-    height: 100%;
-}
-
-.cesium-viewer-bottom {
-    display: block;
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    padding-right: 5px;
-}
-
-.cesium-viewer .cesium-widget-credits {
-    display: inline;
-    position: static;
-    bottom: auto;
-    left: auto;
-    padding-right: 0;
-    color: #ffffff;
-    font-size: 10px;
-    text-shadow: 0 0 2px #000000;
-}
-
-.cesium-viewer-timelineContainer {
-    position: absolute;
-    bottom: 0;
-    left: 169px;
-    right: 29px;
-    height: 27px;
-    padding: 0;
-    margin: 0;
-    overflow: hidden;
-    font-size: 14px;
-}
-
-.cesium-viewer-animationContainer {
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    padding: 0;
-    width: 169px;
-    height: 112px;
-}
-
-.cesium-viewer-fullscreenContainer {
-    position: absolute;
-    bottom: 0;
-    right: 0;
-    padding: 0;
-    width: 29px;
-    height: 29px;
-    overflow: hidden;
-}
-
-.cesium-viewer-vrContainer {
-    position: absolute;
-    bottom: 0;
-    right: 0;
-    padding: 0;
-    width: 29px;
-    height: 29px;
-    overflow: hidden;
-}
-
-.cesium-viewer-toolbar {
-    display: block;
-    position: absolute;
-    top: 5px;
-    right: 5px;
-}
-
-.cesium-viewer-cesiumInspectorContainer {
-    display: block;
-    position: absolute;
-    top: 50px;
-    right: 10px;
-}
-
-.cesium-viewer-geocoderContainer {
-    position: relative;
-    display: inline-block;
-    margin: 35px 3px;
-}
-
-.cesium-viewer-cesium3DTilesInspectorContainer {
-    display: block;
-    position: absolute;
-    top: 50px;
-    right: 10px;
-    max-height: calc(100% - 120px);
-    box-sizing: border-box;
-    overflow-y: auto;
-    overflow-x: hidden;
-}
diff --git a/public/libs/Cesium/Workers/ArcType-66bc286a.js b/public/libs/Cesium/Workers/ArcType-66bc286a.js
deleted file mode 100644
index 9bc0955..0000000
--- a/public/libs/Cesium/Workers/ArcType-66bc286a.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports'], function (exports) { 'use strict';
-
-    /**
-         * ArcType defines the path that should be taken connecting vertices.
-         *
-         * @exports ArcType
-         */
-        var ArcType = {
-            /**
-             * Straight line that does not conform to the surface of the ellipsoid.
-             *
-             * @type {Number}
-             * @constant
-             */
-            NONE : 0,
-
-            /**
-             * Follow geodesic path.
-             *
-             * @type {Number}
-             * @constant
-             */
-            GEODESIC : 1,
-
-            /**
-             * Follow rhumb or loxodrome path.
-             *
-             * @type {Number}
-             * @constant
-             */
-            RHUMB : 2
-        };
-    var ArcType$1 = Object.freeze(ArcType);
-
-    exports.ArcType = ArcType$1;
-
-});
diff --git a/public/libs/Cesium/Workers/AttributeCompression-84a90a13.js b/public/libs/Cesium/Workers/AttributeCompression-84a90a13.js
deleted file mode 100644
index 1b159ae..0000000
--- a/public/libs/Cesium/Workers/AttributeCompression-84a90a13.js
+++ /dev/null
@@ -1,415 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09'], function (exports, when, Check, _Math, Cartographic, Cartesian2) { 'use strict';
-
-    var RIGHT_SHIFT = 1.0 / 256.0;
-    var LEFT_SHIFT = 256.0;
-
-    /**
-     * Attribute compression and decompression functions.
-     *
-     * @exports AttributeCompression
-     *
-     * @private
-     */
-    var AttributeCompression = {};
-
-    /**
-     * Encodes a normalized vector into 2 SNORM values in the range of [0-rangeMax] following the 'oct' encoding.
-     *
-     * Oct encoding is a compact representation of unit length vectors.
-     * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors",
-     * Cigolle et al 2014: {@link http://jcgt.org/published/0003/02/01/}
-     *
-     * @param {Cartesian3} vector The normalized vector to be compressed into 2 component 'oct' encoding.
-     * @param {Cartesian2} result The 2 component oct-encoded unit length vector.
-     * @param {Number} rangeMax The maximum value of the SNORM range. The encoded vector is stored in log2(rangeMax+1) bits.
-     * @returns {Cartesian2} The 2 component oct-encoded unit length vector.
-     *
-     * @exception {DeveloperError} vector must be normalized.
-     *
-     * @see AttributeCompression.octDecodeInRange
-     */
-    AttributeCompression.octEncodeInRange = function(vector, rangeMax, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('vector', vector);
-        Check.Check.defined('result', result);
-        var magSquared = Cartographic.Cartesian3.magnitudeSquared(vector);
-        if (Math.abs(magSquared - 1.0) > _Math.CesiumMath.EPSILON6) {
-            throw new Check.DeveloperError('vector must be normalized.');
-        }
-        //>>includeEnd('debug');
-
-        result.x = vector.x / (Math.abs(vector.x) + Math.abs(vector.y) + Math.abs(vector.z));
-        result.y = vector.y / (Math.abs(vector.x) + Math.abs(vector.y) + Math.abs(vector.z));
-        if (vector.z < 0) {
-            var x = result.x;
-            var y = result.y;
-            result.x = (1.0 - Math.abs(y)) * _Math.CesiumMath.signNotZero(x);
-            result.y = (1.0 - Math.abs(x)) * _Math.CesiumMath.signNotZero(y);
-        }
-
-        result.x = _Math.CesiumMath.toSNorm(result.x, rangeMax);
-        result.y = _Math.CesiumMath.toSNorm(result.y, rangeMax);
-
-        return result;
-    };
-
-    /**
-     * Encodes a normalized vector into 2 SNORM values in the range of [0-255] following the 'oct' encoding.
-     *
-     * @param {Cartesian3} vector The normalized vector to be compressed into 2 byte 'oct' encoding.
-     * @param {Cartesian2} result The 2 byte oct-encoded unit length vector.
-     * @returns {Cartesian2} The 2 byte oct-encoded unit length vector.
-     *
-     * @exception {DeveloperError} vector must be normalized.
-     *
-     * @see AttributeCompression.octEncodeInRange
-     * @see AttributeCompression.octDecode
-     */
-    AttributeCompression.octEncode = function(vector, result) {
-        return AttributeCompression.octEncodeInRange(vector, 255, result);
-    };
-
-    var octEncodeScratch = new Cartesian2.Cartesian2();
-    var uint8ForceArray = new Uint8Array(1);
-    function forceUint8(value) {
-        uint8ForceArray[0] = value;
-        return uint8ForceArray[0];
-    }
-    /**
-     * @param {Cartesian3} vector The normalized vector to be compressed into 4 byte 'oct' encoding.
-     * @param {Cartesian4} result The 4 byte oct-encoded unit length vector.
-     * @returns {Cartesian4} The 4 byte oct-encoded unit length vector.
-     *
-     * @exception {DeveloperError} vector must be normalized.
-     *
-     * @see AttributeCompression.octEncodeInRange
-     * @see AttributeCompression.octDecodeFromCartesian4
-     */
-    AttributeCompression.octEncodeToCartesian4 = function(vector, result) {
-        AttributeCompression.octEncodeInRange(vector, 65535, octEncodeScratch);
-        result.x = forceUint8(octEncodeScratch.x * RIGHT_SHIFT);
-        result.y = forceUint8(octEncodeScratch.x);
-        result.z = forceUint8(octEncodeScratch.y * RIGHT_SHIFT);
-        result.w = forceUint8(octEncodeScratch.y);
-        return result;
-    };
-
-    /**
-     * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component vector.
-     *
-     * @param {Number} x The x component of the oct-encoded unit length vector.
-     * @param {Number} y The y component of the oct-encoded unit length vector.
-     * @param {Number} rangeMax The maximum value of the SNORM range. The encoded vector is stored in log2(rangeMax+1) bits.
-     * @param {Cartesian3} result The decoded and normalized vector
-     * @returns {Cartesian3} The decoded and normalized vector.
-     *
-     * @exception {DeveloperError} x and y must be unsigned normalized integers between 0 and rangeMax.
-     *
-     * @see AttributeCompression.octEncodeInRange
-     */
-    AttributeCompression.octDecodeInRange = function(x, y, rangeMax, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('result', result);
-        if (x < 0 || x > rangeMax || y < 0 || y > rangeMax) {
-            throw new Check.DeveloperError('x and y must be unsigned normalized integers between 0 and ' + rangeMax);
-        }
-        //>>includeEnd('debug');
-
-        result.x = _Math.CesiumMath.fromSNorm(x, rangeMax);
-        result.y = _Math.CesiumMath.fromSNorm(y, rangeMax);
-        result.z = 1.0 - (Math.abs(result.x) + Math.abs(result.y));
-
-        if (result.z < 0.0)
-        {
-            var oldVX = result.x;
-            result.x = (1.0 - Math.abs(result.y)) * _Math.CesiumMath.signNotZero(oldVX);
-            result.y = (1.0 - Math.abs(oldVX)) * _Math.CesiumMath.signNotZero(result.y);
-        }
-
-        return Cartographic.Cartesian3.normalize(result, result);
-    };
-
-    /**
-     * Decodes a unit-length vector in 2 byte 'oct' encoding to a normalized 3-component vector.
-     *
-     * @param {Number} x The x component of the oct-encoded unit length vector.
-     * @param {Number} y The y component of the oct-encoded unit length vector.
-     * @param {Cartesian3} result The decoded and normalized vector.
-     * @returns {Cartesian3} The decoded and normalized vector.
-     *
-     * @exception {DeveloperError} x and y must be an unsigned normalized integer between 0 and 255.
-     *
-     * @see AttributeCompression.octDecodeInRange
-     */
-    AttributeCompression.octDecode = function(x, y, result) {
-        return AttributeCompression.octDecodeInRange(x, y, 255, result);
-    };
-
-    /**
-     * Decodes a unit-length vector in 4 byte 'oct' encoding to a normalized 3-component vector.
-     *
-     * @param {Cartesian4} encoded The oct-encoded unit length vector.
-     * @param {Cartesian3} result The decoded and normalized vector.
-     * @returns {Cartesian3} The decoded and normalized vector.
-     *
-     * @exception {DeveloperError} x, y, z, and w must be unsigned normalized integers between 0 and 255.
-     *
-     * @see AttributeCompression.octDecodeInRange
-     * @see AttributeCompression.octEncodeToCartesian4
-     */
-    AttributeCompression.octDecodeFromCartesian4 = function(encoded, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('encoded', encoded);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-        var x = encoded.x;
-        var y = encoded.y;
-        var z = encoded.z;
-        var w = encoded.w;
-        //>>includeStart('debug', pragmas.debug);
-        if (x < 0 || x > 255 || y < 0 || y > 255 || z < 0 || z > 255 || w < 0 || w > 255) {
-            throw new Check.DeveloperError('x, y, z, and w must be unsigned normalized integers between 0 and 255');
-        }
-        //>>includeEnd('debug');
-
-        var xOct16 = x * LEFT_SHIFT + y;
-        var yOct16 = z * LEFT_SHIFT + w;
-        return AttributeCompression.octDecodeInRange(xOct16, yOct16, 65535, result);
-    };
-
-    /**
-     * Packs an oct encoded vector into a single floating-point number.
-     *
-     * @param {Cartesian2} encoded The oct encoded vector.
-     * @returns {Number} The oct encoded vector packed into a single float.
-     *
-     */
-    AttributeCompression.octPackFloat = function(encoded) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('encoded', encoded);
-        //>>includeEnd('debug');
-        return 256.0 * encoded.x + encoded.y;
-    };
-
-    var scratchEncodeCart2 = new Cartesian2.Cartesian2();
-
-    /**
-     * Encodes a normalized vector into 2 SNORM values in the range of [0-255] following the 'oct' encoding and
-     * stores those values in a single float-point number.
-     *
-     * @param {Cartesian3} vector The normalized vector to be compressed into 2 byte 'oct' encoding.
-     * @returns {Number} The 2 byte oct-encoded unit length vector.
-     *
-     * @exception {DeveloperError} vector must be normalized.
-     */
-    AttributeCompression.octEncodeFloat = function(vector) {
-        AttributeCompression.octEncode(vector, scratchEncodeCart2);
-        return AttributeCompression.octPackFloat(scratchEncodeCart2);
-    };
-
-    /**
-     * Decodes a unit-length vector in 'oct' encoding packed in a floating-point number to a normalized 3-component vector.
-     *
-     * @param {Number} value The oct-encoded unit length vector stored as a single floating-point number.
-     * @param {Cartesian3} result The decoded and normalized vector
-     * @returns {Cartesian3} The decoded and normalized vector.
-     *
-     */
-    AttributeCompression.octDecodeFloat = function(value, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('value', value);
-        //>>includeEnd('debug');
-
-        var temp = value / 256.0;
-        var x = Math.floor(temp);
-        var y = (temp - x) * 256.0;
-
-        return AttributeCompression.octDecode(x, y, result);
-    };
-
-    /**
-     * Encodes three normalized vectors into 6 SNORM values in the range of [0-255] following the 'oct' encoding and
-     * packs those into two floating-point numbers.
-     *
-     * @param {Cartesian3} v1 A normalized vector to be compressed.
-     * @param {Cartesian3} v2 A normalized vector to be compressed.
-     * @param {Cartesian3} v3 A normalized vector to be compressed.
-     * @param {Cartesian2} result The 'oct' encoded vectors packed into two floating-point numbers.
-     * @returns {Cartesian2} The 'oct' encoded vectors packed into two floating-point numbers.
-     *
-     */
-    AttributeCompression.octPack = function(v1, v2, v3, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('v1', v1);
-        Check.Check.defined('v2', v2);
-        Check.Check.defined('v3', v3);
-        Check.Check.defined('result', result);
-        //>>includeEnd('debug');
-
-        var encoded1 = AttributeCompression.octEncodeFloat(v1);
-        var encoded2 = AttributeCompression.octEncodeFloat(v2);
-
-        var encoded3 = AttributeCompression.octEncode(v3, scratchEncodeCart2);
-        result.x = 65536.0 * encoded3.x + encoded1;
-        result.y = 65536.0 * encoded3.y + encoded2;
-        return result;
-    };
-
-    /**
-     * Decodes three unit-length vectors in 'oct' encoding packed into a floating-point number to a normalized 3-component vector.
-     *
-     * @param {Cartesian2} packed The three oct-encoded unit length vectors stored as two floating-point number.
-     * @param {Cartesian3} v1 One decoded and normalized vector.
-     * @param {Cartesian3} v2 One decoded and normalized vector.
-     * @param {Cartesian3} v3 One decoded and normalized vector.
-     */
-    AttributeCompression.octUnpack = function(packed, v1, v2, v3) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('packed', packed);
-        Check.Check.defined('v1', v1);
-        Check.Check.defined('v2', v2);
-        Check.Check.defined('v3', v3);
-        //>>includeEnd('debug');
-
-        var temp = packed.x / 65536.0;
-        var x = Math.floor(temp);
-        var encodedFloat1 = (temp - x) * 65536.0;
-
-        temp = packed.y / 65536.0;
-        var y = Math.floor(temp);
-        var encodedFloat2 = (temp - y) * 65536.0;
-
-        AttributeCompression.octDecodeFloat(encodedFloat1, v1);
-        AttributeCompression.octDecodeFloat(encodedFloat2, v2);
-        AttributeCompression.octDecode(x, y, v3);
-    };
-
-    /**
-     * Pack texture coordinates into a single float. The texture coordinates will only preserve 12 bits of precision.
-     *
-     * @param {Cartesian2} textureCoordinates The texture coordinates to compress.  Both coordinates must be in the range 0.0-1.0.
-     * @returns {Number} The packed texture coordinates.
-     *
-     */
-    AttributeCompression.compressTextureCoordinates = function(textureCoordinates) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('textureCoordinates', textureCoordinates);
-        //>>includeEnd('debug');
-
-        // Move x and y to the range 0-4095;
-        var x = (textureCoordinates.x * 4095.0) | 0;
-        var y = (textureCoordinates.y * 4095.0) | 0;
-        return 4096.0 * x + y;
-    };
-
-    /**
-     * Decompresses texture coordinates that were packed into a single float.
-     *
-     * @param {Number} compressed The compressed texture coordinates.
-     * @param {Cartesian2} result The decompressed texture coordinates.
-     * @returns {Cartesian2} The modified result parameter.
-     *
-     */
-    AttributeCompression.decompressTextureCoordinates = function(compressed, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('compressed', compressed);
-        Check.Check.defined('result', result);
-        //>>includeEnd('debug');
-
-        var temp = compressed / 4096.0;
-        var xZeroTo4095 = Math.floor(temp);
-        result.x = xZeroTo4095 / 4095.0;
-        result.y = (compressed - xZeroTo4095 * 4096) / 4095;
-        return result;
-    };
-
-    function zigZagDecode(value) {
-        return (value >> 1) ^ (-(value & 1));
-    }
-
-    /**
-     * Decodes delta and ZigZag encoded vertices. This modifies the buffers in place.
-     *
-     * @param {Uint16Array} uBuffer The buffer view of u values.
-     * @param {Uint16Array} vBuffer The buffer view of v values.
-     * @param {Uint16Array} [heightBuffer] The buffer view of height values.
-     *
-     * @see {@link https://github.com/AnalyticalGraphicsInc/quantized-mesh|quantized-mesh-1.0 terrain format}
-     */
-    AttributeCompression.zigZagDeltaDecode = function(uBuffer, vBuffer, heightBuffer) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('uBuffer', uBuffer);
-        Check.Check.defined('vBuffer', vBuffer);
-        Check.Check.typeOf.number.equals('uBuffer.length', 'vBuffer.length', uBuffer.length, vBuffer.length);
-        if (when.defined(heightBuffer)) {
-            Check.Check.typeOf.number.equals('uBuffer.length', 'heightBuffer.length', uBuffer.length, heightBuffer.length);
-        }
-        //>>includeEnd('debug');
-
-        var count = uBuffer.length;
-
-        var u = 0;
-        var v = 0;
-        var height = 0;
-
-        for (var i = 0; i < count; ++i) {
-            u += zigZagDecode(uBuffer[i]);
-            v += zigZagDecode(vBuffer[i]);
-
-            uBuffer[i] = u;
-            vBuffer[i] = v;
-
-            if (when.defined(heightBuffer)) {
-                height += zigZagDecode(heightBuffer[i]);
-                heightBuffer[i] = height;
-            }
-        }
-    };
-
-    // 将oct压缩的short转化为float
-    AttributeCompression.octShortToFloat = function(s){
-        //var tempF = s * 1.0 / ((1 << 15) - 1);
-        return  _Math.CesiumMath.clamp(s * 0.00003051850947599719, -1.0, 1.0);
-    };
-
-    // 将oct压缩的两个short解压为三个float
-    AttributeCompression.octShortDecode = function(x, y, result) {
-        Check.Check.defined('result', result);
-        result.x = AttributeCompression.octShortToFloat(x);
-        result.y = AttributeCompression.octShortToFloat(y);
-        result.z = 1.0 - (Math.abs(result.x) + Math.abs(result.y));
-
-        if (result.z < 0.0)
-        {
-            var oldVX = result.x;
-            result.x = (1.0 - Math.abs(result.y)) * _Math.CesiumMath.signNotZero(oldVX);
-            result.y = (1.0 - Math.abs(oldVX)) * _Math.CesiumMath.signNotZero(result.y);
-        }
-        return Cartographic.Cartesian3.normalize(result, result);
-    };
-
-    exports.AttributeCompression = AttributeCompression;
-
-});
diff --git a/public/libs/Cesium/Workers/BoundingRectangle-dc808c42.js b/public/libs/Cesium/Workers/BoundingRectangle-dc808c42.js
deleted file mode 100644
index 12321eb..0000000
--- a/public/libs/Cesium/Workers/BoundingRectangle-dc808c42.js
+++ /dev/null
@@ -1,376 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788'], function (exports, when, Check, Cartographic, Cartesian2, BoundingSphere) { 'use strict';
-
-    /**
-         * A bounding rectangle given by a corner, width and height.
-         * @alias BoundingRectangle
-         * @constructor
-         *
-         * @param {Number} [x=0.0] The x coordinate of the rectangle.
-         * @param {Number} [y=0.0] The y coordinate of the rectangle.
-         * @param {Number} [width=0.0] The width of the rectangle.
-         * @param {Number} [height=0.0] The height of the rectangle.
-         *
-         * @see BoundingSphere
-         * @see Packable
-         */
-        function BoundingRectangle(x, y, width, height) {
-            /**
-             * The x coordinate of the rectangle.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.x = when.defaultValue(x, 0.0);
-
-            /**
-             * The y coordinate of the rectangle.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.y = when.defaultValue(y, 0.0);
-
-            /**
-             * The width of the rectangle.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.width = when.defaultValue(width, 0.0);
-
-            /**
-             * The height of the rectangle.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.height = when.defaultValue(height, 0.0);
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        BoundingRectangle.packedLength = 4;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {BoundingRectangle} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        BoundingRectangle.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value.x;
-            array[startingIndex++] = value.y;
-            array[startingIndex++] = value.width;
-            array[startingIndex] = value.height;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {BoundingRectangle} [result] The object into which to store the result.
-         * @returns {BoundingRectangle} The modified result parameter or a new BoundingRectangle instance if one was not provided.
-         */
-        BoundingRectangle.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new BoundingRectangle();
-            }
-            result.x = array[startingIndex++];
-            result.y = array[startingIndex++];
-            result.width = array[startingIndex++];
-            result.height = array[startingIndex];
-            return result;
-        };
-
-        /**
-         * Computes a bounding rectangle enclosing the list of 2D points.
-         * The rectangle is oriented with the corner at the bottom left.
-         *
-         * @param {Cartesian2[]} positions List of points that the bounding rectangle will enclose.  Each point must have <code>x</code> and <code>y</code> properties.
-         * @param {BoundingRectangle} [result] The object onto which to store the result.
-         * @returns {BoundingRectangle} The modified result parameter or a new BoundingRectangle instance if one was not provided.
-         */
-        BoundingRectangle.fromPoints = function(positions, result) {
-            if (!when.defined(result)) {
-                result = new BoundingRectangle();
-            }
-
-            if (!when.defined(positions) || positions.length === 0) {
-                result.x = 0;
-                result.y = 0;
-                result.width = 0;
-                result.height = 0;
-                return result;
-            }
-
-            var length = positions.length;
-
-            var minimumX = positions[0].x;
-            var minimumY = positions[0].y;
-
-            var maximumX = positions[0].x;
-            var maximumY = positions[0].y;
-
-            for ( var i = 1; i < length; i++) {
-                var p = positions[i];
-                var x = p.x;
-                var y = p.y;
-
-                minimumX = Math.min(x, minimumX);
-                maximumX = Math.max(x, maximumX);
-                minimumY = Math.min(y, minimumY);
-                maximumY = Math.max(y, maximumY);
-            }
-
-            result.x = minimumX;
-            result.y = minimumY;
-            result.width = maximumX - minimumX;
-            result.height = maximumY - minimumY;
-            return result;
-        };
-
-        var defaultProjection = new BoundingSphere.GeographicProjection();
-        var fromRectangleLowerLeft = new Cartographic.Cartographic();
-        var fromRectangleUpperRight = new Cartographic.Cartographic();
-        /**
-         * Computes a bounding rectangle from a rectangle.
-         *
-         * @param {Rectangle} rectangle The valid rectangle used to create a bounding rectangle.
-         * @param {Object} [projection=GeographicProjection] The projection used to project the rectangle into 2D.
-         * @param {BoundingRectangle} [result] The object onto which to store the result.
-         * @returns {BoundingRectangle} The modified result parameter or a new BoundingRectangle instance if one was not provided.
-         */
-        BoundingRectangle.fromRectangle = function(rectangle, projection, result) {
-            if (!when.defined(result)) {
-                result = new BoundingRectangle();
-            }
-
-            if (!when.defined(rectangle)) {
-                result.x = 0;
-                result.y = 0;
-                result.width = 0;
-                result.height = 0;
-                return result;
-            }
-
-            projection = when.defaultValue(projection, defaultProjection);
-
-            var lowerLeft = projection.project(Cartesian2.Rectangle.southwest(rectangle, fromRectangleLowerLeft));
-            var upperRight = projection.project(Cartesian2.Rectangle.northeast(rectangle, fromRectangleUpperRight));
-
-            Cartesian2.Cartesian2.subtract(upperRight, lowerLeft, upperRight);
-
-            result.x = lowerLeft.x;
-            result.y = lowerLeft.y;
-            result.width = upperRight.x;
-            result.height = upperRight.y;
-            return result;
-        };
-
-        /**
-         * Duplicates a BoundingRectangle instance.
-         *
-         * @param {BoundingRectangle} rectangle The bounding rectangle to duplicate.
-         * @param {BoundingRectangle} [result] The object onto which to store the result.
-         * @returns {BoundingRectangle} The modified result parameter or a new BoundingRectangle instance if one was not provided. (Returns undefined if rectangle is undefined)
-         */
-        BoundingRectangle.clone = function(rectangle, result) {
-            if (!when.defined(rectangle)) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                return new BoundingRectangle(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
-            }
-
-            result.x = rectangle.x;
-            result.y = rectangle.y;
-            result.width = rectangle.width;
-            result.height = rectangle.height;
-            return result;
-        };
-
-        /**
-         * Computes a bounding rectangle that is the union of the left and right bounding rectangles.
-         *
-         * @param {BoundingRectangle} left A rectangle to enclose in bounding rectangle.
-         * @param {BoundingRectangle} right A rectangle to enclose in a bounding rectangle.
-         * @param {BoundingRectangle} [result] The object onto which to store the result.
-         * @returns {BoundingRectangle} The modified result parameter or a new BoundingRectangle instance if one was not provided.
-         */
-        BoundingRectangle.union = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new BoundingRectangle();
-            }
-
-            var lowerLeftX = Math.min(left.x, right.x);
-            var lowerLeftY = Math.min(left.y, right.y);
-            var upperRightX = Math.max(left.x + left.width, right.x + right.width);
-            var upperRightY = Math.max(left.y + left.height, right.y + right.height);
-
-            result.x = lowerLeftX;
-            result.y = lowerLeftY;
-            result.width = upperRightX - lowerLeftX;
-            result.height = upperRightY - lowerLeftY;
-            return result;
-        };
-
-        /**
-         * Computes a bounding rectangle by enlarging the provided rectangle until it contains the provided point.
-         *
-         * @param {BoundingRectangle} rectangle A rectangle to expand.
-         * @param {Cartesian2} point A point to enclose in a bounding rectangle.
-         * @param {BoundingRectangle} [result] The object onto which to store the result.
-         * @returns {BoundingRectangle} The modified result parameter or a new BoundingRectangle instance if one was not provided.
-         */
-        BoundingRectangle.expand = function(rectangle, point, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            Check.Check.typeOf.object('point', point);
-            //>>includeEnd('debug');
-
-            result = BoundingRectangle.clone(rectangle, result);
-
-            var width = point.x - result.x;
-            var height = point.y - result.y;
-
-            if (width > result.width) {
-                result.width = width;
-            } else if (width < 0) {
-                result.width -= width;
-                result.x = point.x;
-            }
-
-            if (height > result.height) {
-                result.height = height;
-            } else if (height < 0) {
-                result.height -= height;
-                result.y = point.y;
-            }
-
-            return result;
-        };
-
-        /**
-         * Determines if two rectangles intersect.
-         *
-         * @param {BoundingRectangle} left A rectangle to check for intersection.
-         * @param {BoundingRectangle} right The other rectangle to check for intersection.
-         * @returns {Intersect} <code>Intersect.INTESECTING</code> if the rectangles intersect, <code>Intersect.OUTSIDE</code> otherwise.
-         */
-        BoundingRectangle.intersect = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            var leftX = left.x;
-            var leftY = left.y;
-            var rightX = right.x;
-            var rightY = right.y;
-            if (!(leftX > rightX + right.width ||
-                  leftX + left.width < rightX ||
-                  leftY + left.height < rightY ||
-                  leftY > rightY + right.height)) {
-                return BoundingSphere.Intersect.INTERSECTING;
-            }
-
-            return BoundingSphere.Intersect.OUTSIDE;
-        };
-
-        /**
-         * Compares the provided BoundingRectangles componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {BoundingRectangle} [left] The first BoundingRectangle.
-         * @param {BoundingRectangle} [right] The second BoundingRectangle.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        BoundingRectangle.equals = function(left, right) {
-            return (left === right) ||
-                   ((when.defined(left)) &&
-                    (when.defined(right)) &&
-                    (left.x === right.x) &&
-                    (left.y === right.y) &&
-                    (left.width === right.width) &&
-                    (left.height === right.height));
-        };
-
-        /**
-         * Duplicates this BoundingRectangle instance.
-         *
-         * @param {BoundingRectangle} [result] The object onto which to store the result.
-         * @returns {BoundingRectangle} The modified result parameter or a new BoundingRectangle instance if one was not provided.
-         */
-        BoundingRectangle.prototype.clone = function(result) {
-            return BoundingRectangle.clone(this, result);
-        };
-
-        /**
-         * Determines if this rectangle intersects with another.
-         *
-         * @param {BoundingRectangle} right A rectangle to check for intersection.
-         * @returns {Intersect} <code>Intersect.INTESECTING</code> if the rectangles intersect, <code>Intersect.OUTSIDE</code> otherwise.
-         */
-        BoundingRectangle.prototype.intersect = function(right) {
-            return BoundingRectangle.intersect(this, right);
-        };
-
-        /**
-         * Compares this BoundingRectangle against the provided BoundingRectangle componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {BoundingRectangle} [right] The right hand side BoundingRectangle.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        BoundingRectangle.prototype.equals = function(right) {
-            return BoundingRectangle.equals(this, right);
-        };
-
-    exports.BoundingRectangle = BoundingRectangle;
-
-});
diff --git a/public/libs/Cesium/Workers/BoundingSphere-775c5788.js b/public/libs/Cesium/Workers/BoundingSphere-775c5788.js
deleted file mode 100644
index 6a0d5f5..0000000
--- a/public/libs/Cesium/Workers/BoundingSphere-775c5788.js
+++ /dev/null
@@ -1,5651 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e'], function (exports, when, Check, _Math, Cartographic, Cartesian2, Cartesian4, RuntimeError) { 'use strict';
-
-    /**
-     * A simple map projection where longitude and latitude are linearly mapped to X and Y by multiplying
-     * them by the {@link Ellipsoid#maximumRadius}.  This projection
-     * is commonly known as geographic, equirectangular, equidistant cylindrical, or plate carrée.  It
-     * is also known as EPSG:4326.
-     *
-     * @alias GeographicProjection
-     * @constructor
-     *
-     * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid.
-     *
-     * @see WebMercatorProjection
-     */
-    function GeographicProjection(ellipsoid) {
-        this._ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-        this._semimajorAxis = this._ellipsoid.maximumRadius;
-        this._oneOverSemimajorAxis = 1.0 / this._semimajorAxis;
-    }
-
-    Object.defineProperties(GeographicProjection.prototype, {
-        /**
-         * Gets the {@link Ellipsoid}.
-         *
-         * @memberof GeographicProjection.prototype
-         *
-         * @type {Ellipsoid}
-         * @readonly
-         */
-        ellipsoid : {
-            get : function() {
-                return this._ellipsoid;
-            }
-        }
-    });
-
-    /**
-     * Projects a set of {@link Cartographic} coordinates, in radians, to map coordinates, in meters.
-     * X and Y are the longitude and latitude, respectively, multiplied by the maximum radius of the
-     * ellipsoid.  Z is the unmodified height.
-     *
-     * @param {Cartographic} cartographic The coordinates to project.
-     * @param {Cartesian3} [result] An instance into which to copy the result.  If this parameter is
-     *        undefined, a new instance is created and returned.
-     * @returns {Cartesian3} The projected coordinates.  If the result parameter is not undefined, the
-     *          coordinates are copied there and that instance is returned.  Otherwise, a new instance is
-     *          created and returned.
-     */
-    GeographicProjection.prototype.project = function(cartographic, result) {
-        // Actually this is the special case of equidistant cylindrical called the plate carree
-        var semimajorAxis = this._semimajorAxis;
-        var x = cartographic.longitude * semimajorAxis;
-        var y = cartographic.latitude * semimajorAxis;
-        var z = cartographic.height;
-
-        if (!when.defined(result)) {
-            return new Cartographic.Cartesian3(x, y, z);
-        }
-
-        result.x = x;
-        result.y = y;
-        result.z = z;
-        return result;
-    };
-
-    /**
-     * Unprojects a set of projected {@link Cartesian3} coordinates, in meters, to {@link Cartographic}
-     * coordinates, in radians.  Longitude and Latitude are the X and Y coordinates, respectively,
-     * divided by the maximum radius of the ellipsoid.  Height is the unmodified Z coordinate.
-     *
-     * @param {Cartesian3} cartesian The Cartesian position to unproject with height (z) in meters.
-     * @param {Cartographic} [result] An instance into which to copy the result.  If this parameter is
-     *        undefined, a new instance is created and returned.
-     * @returns {Cartographic} The unprojected coordinates.  If the result parameter is not undefined, the
-     *          coordinates are copied there and that instance is returned.  Otherwise, a new instance is
-     *          created and returned.
-     */
-    GeographicProjection.prototype.unproject = function(cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(cartesian)) {
-            throw new Check.DeveloperError('cartesian is required');
-        }
-        //>>includeEnd('debug');
-
-        var oneOverEarthSemimajorAxis = this._oneOverSemimajorAxis;
-        var longitude = cartesian.x * oneOverEarthSemimajorAxis;
-        var latitude = cartesian.y * oneOverEarthSemimajorAxis;
-        var height = cartesian.z;
-
-        if (!when.defined(result)) {
-            return new Cartographic.Cartographic(longitude, latitude, height);
-        }
-
-        result.longitude = longitude;
-        result.latitude = latitude;
-        result.height = height;
-        return result;
-    };
-
-    /**
-         * This enumerated type is used in determining where, relative to the frustum, an
-         * object is located. The object can either be fully contained within the frustum (INSIDE),
-         * partially inside the frustum and partially outside (INTERSECTING), or somwhere entirely
-         * outside of the frustum's 6 planes (OUTSIDE).
-         *
-         * @exports Intersect
-         */
-        var Intersect = {
-            /**
-             * Represents that an object is not contained within the frustum.
-             *
-             * @type {Number}
-             * @constant
-             */
-            OUTSIDE : -1,
-
-            /**
-             * Represents that an object intersects one of the frustum's planes.
-             *
-             * @type {Number}
-             * @constant
-             */
-            INTERSECTING : 0,
-
-            /**
-             * Represents that an object is fully within the frustum.
-             *
-             * @type {Number}
-             * @constant
-             */
-            INSIDE : 1
-        };
-    var Intersect$1 = Object.freeze(Intersect);
-
-    /**
-         * Represents the closed interval [start, stop].
-         * @alias Interval
-         * @constructor
-         *
-         * @param {Number} [start=0.0] The beginning of the interval.
-         * @param {Number} [stop=0.0] The end of the interval.
-         */
-        function Interval(start, stop) {
-            /**
-             * The beginning of the interval.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.start = when.defaultValue(start, 0.0);
-            /**
-             * The end of the interval.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.stop = when.defaultValue(stop, 0.0);
-        }
-
-    /**
-         * A 3x3 matrix, indexable as a column-major order array.
-         * Constructor parameters are in row-major order for code readability.
-         * @alias Matrix3
-         * @constructor
-         *
-         * @param {Number} [column0Row0=0.0] The value for column 0, row 0.
-         * @param {Number} [column1Row0=0.0] The value for column 1, row 0.
-         * @param {Number} [column2Row0=0.0] The value for column 2, row 0.
-         * @param {Number} [column0Row1=0.0] The value for column 0, row 1.
-         * @param {Number} [column1Row1=0.0] The value for column 1, row 1.
-         * @param {Number} [column2Row1=0.0] The value for column 2, row 1.
-         * @param {Number} [column0Row2=0.0] The value for column 0, row 2.
-         * @param {Number} [column1Row2=0.0] The value for column 1, row 2.
-         * @param {Number} [column2Row2=0.0] The value for column 2, row 2.
-         *
-         * @see Matrix3.fromColumnMajorArray
-         * @see Matrix3.fromRowMajorArray
-         * @see Matrix3.fromQuaternion
-         * @see Matrix3.fromScale
-         * @see Matrix3.fromUniformScale
-         * @see Matrix2
-         * @see Matrix4
-         */
-        function Matrix3(column0Row0, column1Row0, column2Row0,
-                               column0Row1, column1Row1, column2Row1,
-                               column0Row2, column1Row2, column2Row2) {
-            this[0] = when.defaultValue(column0Row0, 0.0);
-            this[1] = when.defaultValue(column0Row1, 0.0);
-            this[2] = when.defaultValue(column0Row2, 0.0);
-            this[3] = when.defaultValue(column1Row0, 0.0);
-            this[4] = when.defaultValue(column1Row1, 0.0);
-            this[5] = when.defaultValue(column1Row2, 0.0);
-            this[6] = when.defaultValue(column2Row0, 0.0);
-            this[7] = when.defaultValue(column2Row1, 0.0);
-            this[8] = when.defaultValue(column2Row2, 0.0);
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        Matrix3.packedLength = 9;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {Matrix3} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        Matrix3.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value[0];
-            array[startingIndex++] = value[1];
-            array[startingIndex++] = value[2];
-            array[startingIndex++] = value[3];
-            array[startingIndex++] = value[4];
-            array[startingIndex++] = value[5];
-            array[startingIndex++] = value[6];
-            array[startingIndex++] = value[7];
-            array[startingIndex++] = value[8];
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {Matrix3} [result] The object into which to store the result.
-         * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided.
-         */
-        Matrix3.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new Matrix3();
-            }
-
-            result[0] = array[startingIndex++];
-            result[1] = array[startingIndex++];
-            result[2] = array[startingIndex++];
-            result[3] = array[startingIndex++];
-            result[4] = array[startingIndex++];
-            result[5] = array[startingIndex++];
-            result[6] = array[startingIndex++];
-            result[7] = array[startingIndex++];
-            result[8] = array[startingIndex++];
-            return result;
-        };
-
-        /**
-         * Duplicates a Matrix3 instance.
-         *
-         * @param {Matrix3} matrix The matrix to duplicate.
-         * @param {Matrix3} [result] The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided. (Returns undefined if matrix is undefined)
-         */
-        Matrix3.clone = function(matrix, result) {
-            if (!when.defined(matrix)) {
-                return undefined;
-            }
-            if (!when.defined(result)) {
-                return new Matrix3(matrix[0], matrix[3], matrix[6],
-                                   matrix[1], matrix[4], matrix[7],
-                                   matrix[2], matrix[5], matrix[8]);
-            }
-            result[0] = matrix[0];
-            result[1] = matrix[1];
-            result[2] = matrix[2];
-            result[3] = matrix[3];
-            result[4] = matrix[4];
-            result[5] = matrix[5];
-            result[6] = matrix[6];
-            result[7] = matrix[7];
-            result[8] = matrix[8];
-            return result;
-        };
-
-        /**
-         * Creates a Matrix3 from 9 consecutive elements in an array.
-         *
-         * @param {Number[]} array The array whose 9 consecutive elements correspond to the positions of the matrix.  Assumes column-major order.
-         * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to first column first row position in the matrix.
-         * @param {Matrix3} [result] The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided.
-         *
-         * @example
-         * // Create the Matrix3:
-         * // [1.0, 2.0, 3.0]
-         * // [1.0, 2.0, 3.0]
-         * // [1.0, 2.0, 3.0]
-         *
-         * var v = [1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0];
-         * var m = Cesium.Matrix3.fromArray(v);
-         *
-         * // Create same Matrix3 with using an offset into an array
-         * var v2 = [0.0, 0.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0];
-         * var m2 = Cesium.Matrix3.fromArray(v2, 2);
-         */
-        Matrix3.fromArray = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new Matrix3();
-            }
-
-            result[0] = array[startingIndex];
-            result[1] = array[startingIndex + 1];
-            result[2] = array[startingIndex + 2];
-            result[3] = array[startingIndex + 3];
-            result[4] = array[startingIndex + 4];
-            result[5] = array[startingIndex + 5];
-            result[6] = array[startingIndex + 6];
-            result[7] = array[startingIndex + 7];
-            result[8] = array[startingIndex + 8];
-            return result;
-        };
-
-        /**
-         * Creates a Matrix3 instance from a column-major order array.
-         *
-         * @param {Number[]} values The column-major order array.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.
-         */
-        Matrix3.fromColumnMajorArray = function(values, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('values', values);
-            //>>includeEnd('debug');
-
-            return Matrix3.clone(values, result);
-        };
-
-        /**
-         * Creates a Matrix3 instance from a row-major order array.
-         * The resulting matrix will be in column-major order.
-         *
-         * @param {Number[]} values The row-major order array.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.
-         */
-        Matrix3.fromRowMajorArray = function(values, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('values', values);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Matrix3(values[0], values[1], values[2],
-                                   values[3], values[4], values[5],
-                                   values[6], values[7], values[8]);
-            }
-            result[0] = values[0];
-            result[1] = values[3];
-            result[2] = values[6];
-            result[3] = values[1];
-            result[4] = values[4];
-            result[5] = values[7];
-            result[6] = values[2];
-            result[7] = values[5];
-            result[8] = values[8];
-            return result;
-        };
-
-        /**
-         * Computes a 3x3 rotation matrix from the provided quaternion.
-         *
-         * @param {Quaternion} quaternion the quaternion to use.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The 3x3 rotation matrix from this quaternion.
-         */
-        Matrix3.fromQuaternion = function(quaternion, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('quaternion', quaternion);
-            //>>includeEnd('debug');
-
-            var x2 = quaternion.x * quaternion.x;
-            var xy = quaternion.x * quaternion.y;
-            var xz = quaternion.x * quaternion.z;
-            var xw = quaternion.x * quaternion.w;
-            var y2 = quaternion.y * quaternion.y;
-            var yz = quaternion.y * quaternion.z;
-            var yw = quaternion.y * quaternion.w;
-            var z2 = quaternion.z * quaternion.z;
-            var zw = quaternion.z * quaternion.w;
-            var w2 = quaternion.w * quaternion.w;
-
-            var m00 = x2 - y2 - z2 + w2;
-            var m01 = 2.0 * (xy - zw);
-            var m02 = 2.0 * (xz + yw);
-
-            var m10 = 2.0 * (xy + zw);
-            var m11 = -x2 + y2 - z2 + w2;
-            var m12 = 2.0 * (yz - xw);
-
-            var m20 = 2.0 * (xz - yw);
-            var m21 = 2.0 * (yz + xw);
-            var m22 = -x2 - y2 + z2 + w2;
-
-            if (!when.defined(result)) {
-                return new Matrix3(m00, m01, m02,
-                                   m10, m11, m12,
-                                   m20, m21, m22);
-            }
-            result[0] = m00;
-            result[1] = m10;
-            result[2] = m20;
-            result[3] = m01;
-            result[4] = m11;
-            result[5] = m21;
-            result[6] = m02;
-            result[7] = m12;
-            result[8] = m22;
-            return result;
-        };
-
-        /**
-         * Computes a 3x3 rotation matrix from the provided headingPitchRoll. (see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles )
-         *
-         * @param {HeadingPitchRoll} headingPitchRoll the headingPitchRoll to use.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The 3x3 rotation matrix from this headingPitchRoll.
-         */
-        Matrix3.fromHeadingPitchRoll = function(headingPitchRoll, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('headingPitchRoll', headingPitchRoll);
-            //>>includeEnd('debug');
-
-            var cosTheta = Math.cos(-headingPitchRoll.pitch);
-            var cosPsi = Math.cos(-headingPitchRoll.heading);
-            var cosPhi = Math.cos(headingPitchRoll.roll);
-            var sinTheta = Math.sin(-headingPitchRoll.pitch);
-            var sinPsi = Math.sin(-headingPitchRoll.heading);
-            var sinPhi = Math.sin(headingPitchRoll.roll);
-
-            var m00 = cosTheta * cosPsi;
-            var m01 = -cosPhi * sinPsi + sinPhi * sinTheta * cosPsi;
-            var m02 = sinPhi * sinPsi + cosPhi * sinTheta * cosPsi;
-
-            var m10 = cosTheta * sinPsi;
-            var m11 = cosPhi * cosPsi + sinPhi * sinTheta * sinPsi;
-            var m12 = -sinPhi * cosPsi + cosPhi * sinTheta * sinPsi;
-
-            var m20 = -sinTheta;
-            var m21 = sinPhi * cosTheta;
-            var m22 = cosPhi * cosTheta;
-
-            if (!when.defined(result)) {
-                return new Matrix3(m00, m01, m02,
-                    m10, m11, m12,
-                    m20, m21, m22);
-            }
-            result[0] = m00;
-            result[1] = m10;
-            result[2] = m20;
-            result[3] = m01;
-            result[4] = m11;
-            result[5] = m21;
-            result[6] = m02;
-            result[7] = m12;
-            result[8] = m22;
-            return result;
-        };
-
-        /**
-         * Computes a Matrix3 instance representing a non-uniform scale.
-         *
-         * @param {Cartesian3} scale The x, y, and z scale factors.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.
-         *
-         * @example
-         * // Creates
-         * //   [7.0, 0.0, 0.0]
-         * //   [0.0, 8.0, 0.0]
-         * //   [0.0, 0.0, 9.0]
-         * var m = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0));
-         */
-        Matrix3.fromScale = function(scale, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('scale', scale);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Matrix3(
-                    scale.x, 0.0,     0.0,
-                    0.0,     scale.y, 0.0,
-                    0.0,     0.0,     scale.z);
-            }
-
-            result[0] = scale.x;
-            result[1] = 0.0;
-            result[2] = 0.0;
-            result[3] = 0.0;
-            result[4] = scale.y;
-            result[5] = 0.0;
-            result[6] = 0.0;
-            result[7] = 0.0;
-            result[8] = scale.z;
-            return result;
-        };
-
-        /**
-         * Computes a Matrix3 instance representing a uniform scale.
-         *
-         * @param {Number} scale The uniform scale factor.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.
-         *
-         * @example
-         * // Creates
-         * //   [2.0, 0.0, 0.0]
-         * //   [0.0, 2.0, 0.0]
-         * //   [0.0, 0.0, 2.0]
-         * var m = Cesium.Matrix3.fromUniformScale(2.0);
-         */
-        Matrix3.fromUniformScale = function(scale, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('scale', scale);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Matrix3(
-                    scale, 0.0,   0.0,
-                    0.0,   scale, 0.0,
-                    0.0,   0.0,   scale);
-            }
-
-            result[0] = scale;
-            result[1] = 0.0;
-            result[2] = 0.0;
-            result[3] = 0.0;
-            result[4] = scale;
-            result[5] = 0.0;
-            result[6] = 0.0;
-            result[7] = 0.0;
-            result[8] = scale;
-            return result;
-        };
-
-        /**
-         * Computes a Matrix3 instance representing the cross product equivalent matrix of a Cartesian3 vector.
-         *
-         * @param {Cartesian3} vector the vector on the left hand side of the cross product operation.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.
-         *
-         * @example
-         * // Creates
-         * //   [0.0, -9.0,  8.0]
-         * //   [9.0,  0.0, -7.0]
-         * //   [-8.0, 7.0,  0.0]
-         * var m = Cesium.Matrix3.fromCrossProduct(new Cesium.Cartesian3(7.0, 8.0, 9.0));
-         */
-        Matrix3.fromCrossProduct = function(vector, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('vector', vector);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Matrix3(
-                          0.0, -vector.z,  vector.y,
-                     vector.z,       0.0, -vector.x,
-                    -vector.y,  vector.x,       0.0);
-            }
-
-            result[0] = 0.0;
-            result[1] = vector.z;
-            result[2] = -vector.y;
-            result[3] = -vector.z;
-            result[4] = 0.0;
-            result[5] = vector.x;
-            result[6] = vector.y;
-            result[7] = -vector.x;
-            result[8] = 0.0;
-            return result;
-        };
-
-        /**
-         * Creates a rotation matrix around the x-axis.
-         *
-         * @param {Number} angle The angle, in radians, of the rotation.  Positive angles are counterclockwise.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.
-         *
-         * @example
-         * // Rotate a point 45 degrees counterclockwise around the x-axis.
-         * var p = new Cesium.Cartesian3(5, 6, 7);
-         * var m = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(45.0));
-         * var rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3());
-         */
-        Matrix3.fromRotationX = function(angle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('angle', angle);
-            //>>includeEnd('debug');
-
-            var cosAngle = Math.cos(angle);
-            var sinAngle = Math.sin(angle);
-
-            if (!when.defined(result)) {
-                return new Matrix3(
-                    1.0, 0.0, 0.0,
-                    0.0, cosAngle, -sinAngle,
-                    0.0, sinAngle, cosAngle);
-            }
-
-            result[0] = 1.0;
-            result[1] = 0.0;
-            result[2] = 0.0;
-            result[3] = 0.0;
-            result[4] = cosAngle;
-            result[5] = sinAngle;
-            result[6] = 0.0;
-            result[7] = -sinAngle;
-            result[8] = cosAngle;
-
-            return result;
-        };
-
-        /**
-         * Creates a rotation matrix around the y-axis.
-         *
-         * @param {Number} angle The angle, in radians, of the rotation.  Positive angles are counterclockwise.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.
-         *
-         * @example
-         * // Rotate a point 45 degrees counterclockwise around the y-axis.
-         * var p = new Cesium.Cartesian3(5, 6, 7);
-         * var m = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(45.0));
-         * var rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3());
-         */
-        Matrix3.fromRotationY = function(angle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('angle', angle);
-            //>>includeEnd('debug');
-
-            var cosAngle = Math.cos(angle);
-            var sinAngle = Math.sin(angle);
-
-            if (!when.defined(result)) {
-                return new Matrix3(
-                    cosAngle, 0.0, sinAngle,
-                    0.0, 1.0, 0.0,
-                    -sinAngle, 0.0, cosAngle);
-            }
-
-            result[0] = cosAngle;
-            result[1] = 0.0;
-            result[2] = -sinAngle;
-            result[3] = 0.0;
-            result[4] = 1.0;
-            result[5] = 0.0;
-            result[6] = sinAngle;
-            result[7] = 0.0;
-            result[8] = cosAngle;
-
-            return result;
-        };
-
-        /**
-         * Creates a rotation matrix around the z-axis.
-         *
-         * @param {Number} angle The angle, in radians, of the rotation.  Positive angles are counterclockwise.
-         * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.
-         *
-         * @example
-         * // Rotate a point 45 degrees counterclockwise around the z-axis.
-         * var p = new Cesium.Cartesian3(5, 6, 7);
-         * var m = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(45.0));
-         * var rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3());
-         */
-        Matrix3.fromRotationZ = function(angle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('angle', angle);
-            //>>includeEnd('debug');
-
-            var cosAngle = Math.cos(angle);
-            var sinAngle = Math.sin(angle);
-
-            if (!when.defined(result)) {
-                return new Matrix3(
-                    cosAngle, -sinAngle, 0.0,
-                    sinAngle, cosAngle, 0.0,
-                    0.0, 0.0, 1.0);
-            }
-
-            result[0] = cosAngle;
-            result[1] = sinAngle;
-            result[2] = 0.0;
-            result[3] = -sinAngle;
-            result[4] = cosAngle;
-            result[5] = 0.0;
-            result[6] = 0.0;
-            result[7] = 0.0;
-            result[8] = 1.0;
-
-            return result;
-        };
-
-        /**
-         * Creates an Array from the provided Matrix3 instance.
-         * The array will be in column-major order.
-         *
-         * @param {Matrix3} matrix The matrix to use..
-         * @param {Number[]} [result] The Array onto which to store the result.
-         * @returns {Number[]} The modified Array parameter or a new Array instance if one was not provided.
-         */
-        Matrix3.toArray = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return [matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5], matrix[6], matrix[7], matrix[8]];
-            }
-            result[0] = matrix[0];
-            result[1] = matrix[1];
-            result[2] = matrix[2];
-            result[3] = matrix[3];
-            result[4] = matrix[4];
-            result[5] = matrix[5];
-            result[6] = matrix[6];
-            result[7] = matrix[7];
-            result[8] = matrix[8];
-            return result;
-        };
-
-        /**
-         * Computes the array index of the element at the provided row and column.
-         *
-         * @param {Number} row The zero-based index of the row.
-         * @param {Number} column The zero-based index of the column.
-         * @returns {Number} The index of the element at the provided row and column.
-         *
-         * @exception {DeveloperError} row must be 0, 1, or 2.
-         * @exception {DeveloperError} column must be 0, 1, or 2.
-         *
-         * @example
-         * var myMatrix = new Cesium.Matrix3();
-         * var column1Row0Index = Cesium.Matrix3.getElementIndex(1, 0);
-         * var column1Row0 = myMatrix[column1Row0Index]
-         * myMatrix[column1Row0Index] = 10.0;
-         */
-        Matrix3.getElementIndex = function(column, row) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number.greaterThanOrEquals('row', row, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('row', row, 2);
-            Check.Check.typeOf.number.greaterThanOrEquals('column', column, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('column', column, 2);
-            //>>includeEnd('debug');
-
-            return column * 3 + row;
-        };
-
-        /**
-         * Retrieves a copy of the matrix column at the provided index as a Cartesian3 instance.
-         *
-         * @param {Matrix3} matrix The matrix to use.
-         * @param {Number} index The zero-based index of the column to retrieve.
-         * @param {Cartesian3} result The object onto which to store the result.
-         * @returns {Cartesian3} The modified result parameter.
-         *
-         * @exception {DeveloperError} index must be 0, 1, or 2.
-         */
-        Matrix3.getColumn = function(matrix, index, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('index', index, 2);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var startIndex = index * 3;
-            var x = matrix[startIndex];
-            var y = matrix[startIndex + 1];
-            var z = matrix[startIndex + 2];
-
-            result.x = x;
-            result.y = y;
-            result.z = z;
-            return result;
-        };
-
-        /**
-         * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian3 instance.
-         *
-         * @param {Matrix3} matrix The matrix to use.
-         * @param {Number} index The zero-based index of the column to set.
-         * @param {Cartesian3} cartesian The Cartesian whose values will be assigned to the specified column.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         *
-         * @exception {DeveloperError} index must be 0, 1, or 2.
-         */
-        Matrix3.setColumn = function(matrix, index, cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('index', index, 2);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result = Matrix3.clone(matrix, result);
-            var startIndex = index * 3;
-            result[startIndex] = cartesian.x;
-            result[startIndex + 1] = cartesian.y;
-            result[startIndex + 2] = cartesian.z;
-            return result;
-        };
-
-        /**
-         * Retrieves a copy of the matrix row at the provided index as a Cartesian3 instance.
-         *
-         * @param {Matrix3} matrix The matrix to use.
-         * @param {Number} index The zero-based index of the row to retrieve.
-         * @param {Cartesian3} result The object onto which to store the result.
-         * @returns {Cartesian3} The modified result parameter.
-         *
-         * @exception {DeveloperError} index must be 0, 1, or 2.
-         */
-        Matrix3.getRow = function(matrix, index, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('index', index, 2);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var x = matrix[index];
-            var y = matrix[index + 3];
-            var z = matrix[index + 6];
-
-            result.x = x;
-            result.y = y;
-            result.z = z;
-            return result;
-        };
-
-        /**
-         * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian3 instance.
-         *
-         * @param {Matrix3} matrix The matrix to use.
-         * @param {Number} index The zero-based index of the row to set.
-         * @param {Cartesian3} cartesian The Cartesian whose values will be assigned to the specified row.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         *
-         * @exception {DeveloperError} index must be 0, 1, or 2.
-         */
-        Matrix3.setRow = function(matrix, index, cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('index', index, 2);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result = Matrix3.clone(matrix, result);
-            result[index] = cartesian.x;
-            result[index + 3] = cartesian.y;
-            result[index + 6] = cartesian.z;
-            return result;
-        };
-
-        var scratchColumn = new Cartographic.Cartesian3();
-
-        /**
-         * Extracts the non-uniform scale assuming the matrix is an affine transformation.
-         *
-         * @param {Matrix3} matrix The matrix.
-         * @param {Cartesian3} result The object onto which to store the result.
-         * @returns {Cartesian3} The modified result parameter.
-         */
-        Matrix3.getScale = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn));
-            result.y = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.fromElements(matrix[3], matrix[4], matrix[5], scratchColumn));
-            result.z = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.fromElements(matrix[6], matrix[7], matrix[8], scratchColumn));
-            return result;
-        };
-
-        var scratchScale = new Cartographic.Cartesian3();
-
-        /**
-         * Computes the maximum scale assuming the matrix is an affine transformation.
-         * The maximum scale is the maximum length of the column vectors.
-         *
-         * @param {Matrix3} matrix The matrix.
-         * @returns {Number} The maximum scale.
-         */
-        Matrix3.getMaximumScale = function(matrix) {
-            Matrix3.getScale(matrix, scratchScale);
-            return Cartographic.Cartesian3.maximumComponent(scratchScale);
-        };
-
-        /**
-         * Computes the product of two matrices.
-         *
-         * @param {Matrix3} left The first matrix.
-         * @param {Matrix3} right The second matrix.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         */
-        Matrix3.multiply = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var column0Row0 = left[0] * right[0] + left[3] * right[1] + left[6] * right[2];
-            var column0Row1 = left[1] * right[0] + left[4] * right[1] + left[7] * right[2];
-            var column0Row2 = left[2] * right[0] + left[5] * right[1] + left[8] * right[2];
-
-            var column1Row0 = left[0] * right[3] + left[3] * right[4] + left[6] * right[5];
-            var column1Row1 = left[1] * right[3] + left[4] * right[4] + left[7] * right[5];
-            var column1Row2 = left[2] * right[3] + left[5] * right[4] + left[8] * right[5];
-
-            var column2Row0 = left[0] * right[6] + left[3] * right[7] + left[6] * right[8];
-            var column2Row1 = left[1] * right[6] + left[4] * right[7] + left[7] * right[8];
-            var column2Row2 = left[2] * right[6] + left[5] * right[7] + left[8] * right[8];
-
-            result[0] = column0Row0;
-            result[1] = column0Row1;
-            result[2] = column0Row2;
-            result[3] = column1Row0;
-            result[4] = column1Row1;
-            result[5] = column1Row2;
-            result[6] = column2Row0;
-            result[7] = column2Row1;
-            result[8] = column2Row2;
-            return result;
-        };
-
-        /**
-         * Computes the sum of two matrices.
-         *
-         * @param {Matrix3} left The first matrix.
-         * @param {Matrix3} right The second matrix.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         */
-        Matrix3.add = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = left[0] + right[0];
-            result[1] = left[1] + right[1];
-            result[2] = left[2] + right[2];
-            result[3] = left[3] + right[3];
-            result[4] = left[4] + right[4];
-            result[5] = left[5] + right[5];
-            result[6] = left[6] + right[6];
-            result[7] = left[7] + right[7];
-            result[8] = left[8] + right[8];
-            return result;
-        };
-
-        /**
-         * Computes the difference of two matrices.
-         *
-         * @param {Matrix3} left The first matrix.
-         * @param {Matrix3} right The second matrix.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         */
-        Matrix3.subtract = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = left[0] - right[0];
-            result[1] = left[1] - right[1];
-            result[2] = left[2] - right[2];
-            result[3] = left[3] - right[3];
-            result[4] = left[4] - right[4];
-            result[5] = left[5] - right[5];
-            result[6] = left[6] - right[6];
-            result[7] = left[7] - right[7];
-            result[8] = left[8] - right[8];
-            return result;
-        };
-
-        /**
-         * Computes the product of a matrix and a column vector.
-         *
-         * @param {Matrix3} matrix The matrix.
-         * @param {Cartesian3} cartesian The column.
-         * @param {Cartesian3} result The object onto which to store the result.
-         * @returns {Cartesian3} The modified result parameter.
-         */
-        Matrix3.multiplyByVector = function(matrix, cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var vX = cartesian.x;
-            var vY = cartesian.y;
-            var vZ = cartesian.z;
-
-            var x = matrix[0] * vX + matrix[3] * vY + matrix[6] * vZ;
-            var y = matrix[1] * vX + matrix[4] * vY + matrix[7] * vZ;
-            var z = matrix[2] * vX + matrix[5] * vY + matrix[8] * vZ;
-
-            result.x = x;
-            result.y = y;
-            result.z = z;
-            return result;
-        };
-
-        /**
-         * Computes the product of a matrix and a scalar.
-         *
-         * @param {Matrix3} matrix The matrix.
-         * @param {Number} scalar The number to multiply by.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         */
-        Matrix3.multiplyByScalar = function(matrix, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = matrix[0] * scalar;
-            result[1] = matrix[1] * scalar;
-            result[2] = matrix[2] * scalar;
-            result[3] = matrix[3] * scalar;
-            result[4] = matrix[4] * scalar;
-            result[5] = matrix[5] * scalar;
-            result[6] = matrix[6] * scalar;
-            result[7] = matrix[7] * scalar;
-            result[8] = matrix[8] * scalar;
-            return result;
-        };
-
-        /**
-         * Computes the product of a matrix times a (non-uniform) scale, as if the scale were a scale matrix.
-         *
-         * @param {Matrix3} matrix The matrix on the left-hand side.
-         * @param {Cartesian3} scale The non-uniform scale on the right-hand side.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         *
-         *
-         * @example
-         * // Instead of Cesium.Matrix3.multiply(m, Cesium.Matrix3.fromScale(scale), m);
-         * Cesium.Matrix3.multiplyByScale(m, scale, m);
-         *
-         * @see Matrix3.fromScale
-         * @see Matrix3.multiplyByUniformScale
-         */
-        Matrix3.multiplyByScale = function(matrix, scale, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('scale', scale);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = matrix[0] * scale.x;
-            result[1] = matrix[1] * scale.x;
-            result[2] = matrix[2] * scale.x;
-            result[3] = matrix[3] * scale.y;
-            result[4] = matrix[4] * scale.y;
-            result[5] = matrix[5] * scale.y;
-            result[6] = matrix[6] * scale.z;
-            result[7] = matrix[7] * scale.z;
-            result[8] = matrix[8] * scale.z;
-            return result;
-        };
-
-        /**
-         * Creates a negated copy of the provided matrix.
-         *
-         * @param {Matrix3} matrix The matrix to negate.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         */
-        Matrix3.negate = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = -matrix[0];
-            result[1] = -matrix[1];
-            result[2] = -matrix[2];
-            result[3] = -matrix[3];
-            result[4] = -matrix[4];
-            result[5] = -matrix[5];
-            result[6] = -matrix[6];
-            result[7] = -matrix[7];
-            result[8] = -matrix[8];
-            return result;
-        };
-
-        /**
-         * Computes the transpose of the provided matrix.
-         *
-         * @param {Matrix3} matrix The matrix to transpose.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         */
-        Matrix3.transpose = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var column0Row0 = matrix[0];
-            var column0Row1 = matrix[3];
-            var column0Row2 = matrix[6];
-            var column1Row0 = matrix[1];
-            var column1Row1 = matrix[4];
-            var column1Row2 = matrix[7];
-            var column2Row0 = matrix[2];
-            var column2Row1 = matrix[5];
-            var column2Row2 = matrix[8];
-
-            result[0] = column0Row0;
-            result[1] = column0Row1;
-            result[2] = column0Row2;
-            result[3] = column1Row0;
-            result[4] = column1Row1;
-            result[5] = column1Row2;
-            result[6] = column2Row0;
-            result[7] = column2Row1;
-            result[8] = column2Row2;
-            return result;
-        };
-
-        var UNIT = new Cartographic.Cartesian3(1, 1, 1);
-
-        /**
-         * Extracts the rotation assuming the matrix is an affine transformation.
-         *
-         * @param {Matrix3} matrix The matrix.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter
-         */
-        Matrix3.getRotation = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var inverseScale = Cartographic.Cartesian3.divideComponents(UNIT, Matrix3.getScale(matrix, scratchScale), scratchScale);
-            result = Matrix3.multiplyByScale(matrix, inverseScale, result);
-
-            return result;
-        };
-
-        function computeFrobeniusNorm(matrix) {
-            var norm = 0.0;
-            for (var i = 0; i < 9; ++i) {
-                var temp = matrix[i];
-                norm += temp * temp;
-            }
-
-            return Math.sqrt(norm);
-        }
-
-        var rowVal = [1, 0, 0];
-        var colVal = [2, 2, 1];
-
-        function offDiagonalFrobeniusNorm(matrix) {
-            // Computes the "off-diagonal" Frobenius norm.
-            // Assumes matrix is symmetric.
-
-            var norm = 0.0;
-            for (var i = 0; i < 3; ++i) {
-                var temp = matrix[Matrix3.getElementIndex(colVal[i], rowVal[i])];
-                norm += 2.0 * temp * temp;
-            }
-
-            return Math.sqrt(norm);
-        }
-
-        function shurDecomposition(matrix, result) {
-            // This routine was created based upon Matrix Computations, 3rd ed., by Golub and Van Loan,
-            // section 8.4.2 The 2by2 Symmetric Schur Decomposition.
-            //
-            // The routine takes a matrix, which is assumed to be symmetric, and
-            // finds the largest off-diagonal term, and then creates
-            // a matrix (result) which can be used to help reduce it
-
-            var tolerance = _Math.CesiumMath.EPSILON15;
-
-            var maxDiagonal = 0.0;
-            var rotAxis = 1;
-
-            // find pivot (rotAxis) based on max diagonal of matrix
-            for (var i = 0; i < 3; ++i) {
-                var temp = Math.abs(matrix[Matrix3.getElementIndex(colVal[i], rowVal[i])]);
-                if (temp > maxDiagonal) {
-                    rotAxis = i;
-                    maxDiagonal = temp;
-                }
-            }
-
-            var c = 1.0;
-            var s = 0.0;
-
-            var p = rowVal[rotAxis];
-            var q = colVal[rotAxis];
-
-            if (Math.abs(matrix[Matrix3.getElementIndex(q, p)]) > tolerance) {
-                var qq = matrix[Matrix3.getElementIndex(q, q)];
-                var pp = matrix[Matrix3.getElementIndex(p, p)];
-                var qp = matrix[Matrix3.getElementIndex(q, p)];
-
-                var tau = (qq - pp) / 2.0 / qp;
-                var t;
-
-                if (tau < 0.0) {
-                    t = -1.0 / (-tau + Math.sqrt(1.0 + tau * tau));
-                } else {
-                    t = 1.0 / (tau + Math.sqrt(1.0 + tau * tau));
-                }
-
-                c = 1.0 / Math.sqrt(1.0 + t * t);
-                s = t * c;
-            }
-
-            result = Matrix3.clone(Matrix3.IDENTITY, result);
-
-            result[Matrix3.getElementIndex(p, p)] = result[Matrix3.getElementIndex(q, q)] = c;
-            result[Matrix3.getElementIndex(q, p)] = s;
-            result[Matrix3.getElementIndex(p, q)] = -s;
-
-            return result;
-        }
-
-        var jMatrix = new Matrix3();
-        var jMatrixTranspose = new Matrix3();
-
-        /**
-         * Computes the eigenvectors and eigenvalues of a symmetric matrix.
-         * <p>
-         * Returns a diagonal matrix and unitary matrix such that:
-         * <code>matrix = unitary matrix * diagonal matrix * transpose(unitary matrix)</code>
-         * </p>
-         * <p>
-         * The values along the diagonal of the diagonal matrix are the eigenvalues. The columns
-         * of the unitary matrix are the corresponding eigenvectors.
-         * </p>
-         *
-         * @param {Matrix3} matrix The matrix to decompose into diagonal and unitary matrix. Expected to be symmetric.
-         * @param {Object} [result] An object with unitary and diagonal properties which are matrices onto which to store the result.
-         * @returns {Object} An object with unitary and diagonal properties which are the unitary and diagonal matrices, respectively.
-         *
-         * @example
-         * var a = //... symetric matrix
-         * var result = {
-         *     unitary : new Cesium.Matrix3(),
-         *     diagonal : new Cesium.Matrix3()
-         * };
-         * Cesium.Matrix3.computeEigenDecomposition(a, result);
-         *
-         * var unitaryTranspose = Cesium.Matrix3.transpose(result.unitary, new Cesium.Matrix3());
-         * var b = Cesium.Matrix3.multiply(result.unitary, result.diagonal, new Cesium.Matrix3());
-         * Cesium.Matrix3.multiply(b, unitaryTranspose, b); // b is now equal to a
-         *
-         * var lambda = Cesium.Matrix3.getColumn(result.diagonal, 0, new Cesium.Cartesian3()).x;  // first eigenvalue
-         * var v = Cesium.Matrix3.getColumn(result.unitary, 0, new Cesium.Cartesian3());          // first eigenvector
-         * var c = Cesium.Cartesian3.multiplyByScalar(v, lambda, new Cesium.Cartesian3());        // equal to Cesium.Matrix3.multiplyByVector(a, v)
-         */
-        Matrix3.computeEigenDecomposition = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            //>>includeEnd('debug');
-
-            // This routine was created based upon Matrix Computations, 3rd ed., by Golub and Van Loan,
-            // section 8.4.3 The Classical Jacobi Algorithm
-
-            var tolerance = _Math.CesiumMath.EPSILON20;
-            var maxSweeps = 10;
-
-            var count = 0;
-            var sweep = 0;
-
-            if (!when.defined(result)) {
-                result = {};
-            }
-
-            var unitaryMatrix = result.unitary = Matrix3.clone(Matrix3.IDENTITY, result.unitary);
-            var diagMatrix = result.diagonal = Matrix3.clone(matrix, result.diagonal);
-
-            var epsilon = tolerance * computeFrobeniusNorm(diagMatrix);
-
-            while (sweep < maxSweeps && offDiagonalFrobeniusNorm(diagMatrix) > epsilon) {
-                shurDecomposition(diagMatrix, jMatrix);
-                Matrix3.transpose(jMatrix, jMatrixTranspose);
-                Matrix3.multiply(diagMatrix, jMatrix, diagMatrix);
-                Matrix3.multiply(jMatrixTranspose, diagMatrix, diagMatrix);
-                Matrix3.multiply(unitaryMatrix, jMatrix, unitaryMatrix);
-
-                if (++count > 2) {
-                    ++sweep;
-                    count = 0;
-                }
-            }
-
-            return result;
-        };
-
-        /**
-         * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements.
-         *
-         * @param {Matrix3} matrix The matrix with signed elements.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         */
-        Matrix3.abs = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = Math.abs(matrix[0]);
-            result[1] = Math.abs(matrix[1]);
-            result[2] = Math.abs(matrix[2]);
-            result[3] = Math.abs(matrix[3]);
-            result[4] = Math.abs(matrix[4]);
-            result[5] = Math.abs(matrix[5]);
-            result[6] = Math.abs(matrix[6]);
-            result[7] = Math.abs(matrix[7]);
-            result[8] = Math.abs(matrix[8]);
-
-            return result;
-        };
-
-        /**
-         * Computes the determinant of the provided matrix.
-         *
-         * @param {Matrix3} matrix The matrix to use.
-         * @returns {Number} The value of the determinant of the matrix.
-         */
-        Matrix3.determinant = function(matrix) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            //>>includeEnd('debug');
-
-            var m11 = matrix[0];
-            var m21 = matrix[3];
-            var m31 = matrix[6];
-            var m12 = matrix[1];
-            var m22 = matrix[4];
-            var m32 = matrix[7];
-            var m13 = matrix[2];
-            var m23 = matrix[5];
-            var m33 = matrix[8];
-
-            return m11 * (m22 * m33 - m23 * m32) + m12 * (m23 * m31 - m21 * m33) + m13 * (m21 * m32 - m22 * m31);
-        };
-
-        /**
-         * Computes the inverse of the provided matrix.
-         *
-         * @param {Matrix3} matrix The matrix to invert.
-         * @param {Matrix3} result The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter.
-         *
-         * @exception {DeveloperError} matrix is not invertible.
-         */
-        Matrix3.inverse = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var m11 = matrix[0];
-            var m21 = matrix[1];
-            var m31 = matrix[2];
-            var m12 = matrix[3];
-            var m22 = matrix[4];
-            var m32 = matrix[5];
-            var m13 = matrix[6];
-            var m23 = matrix[7];
-            var m33 = matrix[8];
-
-            var determinant = Matrix3.determinant(matrix);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (Math.abs(determinant) <= _Math.CesiumMath.EPSILON15) {
-                throw new Check.DeveloperError('matrix is not invertible');
-            }
-            //>>includeEnd('debug');
-
-            result[0] = m22 * m33 - m23 * m32;
-            result[1] = m23 * m31 - m21 * m33;
-            result[2] = m21 * m32 - m22 * m31;
-            result[3] = m13 * m32 - m12 * m33;
-            result[4] = m11 * m33 - m13 * m31;
-            result[5] = m12 * m31 - m11 * m32;
-            result[6] = m12 * m23 - m13 * m22;
-            result[7] = m13 * m21 - m11 * m23;
-            result[8] = m11 * m22 - m12 * m21;
-
-           var scale = 1.0 / determinant;
-           return Matrix3.multiplyByScalar(result, scale, result);
-        };
-
-        /**
-         * Compares the provided matrices componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Matrix3} [left] The first matrix.
-         * @param {Matrix3} [right] The second matrix.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        Matrix3.equals = function(left, right) {
-            return (left === right) ||
-                   (when.defined(left) &&
-                    when.defined(right) &&
-                    left[0] === right[0] &&
-                    left[1] === right[1] &&
-                    left[2] === right[2] &&
-                    left[3] === right[3] &&
-                    left[4] === right[4] &&
-                    left[5] === right[5] &&
-                    left[6] === right[6] &&
-                    left[7] === right[7] &&
-                    left[8] === right[8]);
-        };
-
-        /**
-         * Compares the provided matrices componentwise and returns
-         * <code>true</code> if they are within the provided epsilon,
-         * <code>false</code> otherwise.
-         *
-         * @param {Matrix3} [left] The first matrix.
-         * @param {Matrix3} [right] The second matrix.
-         * @param {Number} epsilon The epsilon to use for equality testing.
-         * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Matrix3.equalsEpsilon = function(left, right, epsilon) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('epsilon', epsilon);
-            //>>includeEnd('debug');
-
-            return (left === right) ||
-                    (when.defined(left) &&
-                    when.defined(right) &&
-                    Math.abs(left[0] - right[0]) <= epsilon &&
-                    Math.abs(left[1] - right[1]) <= epsilon &&
-                    Math.abs(left[2] - right[2]) <= epsilon &&
-                    Math.abs(left[3] - right[3]) <= epsilon &&
-                    Math.abs(left[4] - right[4]) <= epsilon &&
-                    Math.abs(left[5] - right[5]) <= epsilon &&
-                    Math.abs(left[6] - right[6]) <= epsilon &&
-                    Math.abs(left[7] - right[7]) <= epsilon &&
-                    Math.abs(left[8] - right[8]) <= epsilon);
-        };
-
-        /**
-         * An immutable Matrix3 instance initialized to the identity matrix.
-         *
-         * @type {Matrix3}
-         * @constant
-         */
-        Matrix3.IDENTITY = Object.freeze(new Matrix3(1.0, 0.0, 0.0,
-                                                    0.0, 1.0, 0.0,
-                                                    0.0, 0.0, 1.0));
-
-        /**
-         * An immutable Matrix3 instance initialized to the zero matrix.
-         *
-         * @type {Matrix3}
-         * @constant
-         */
-        Matrix3.ZERO = Object.freeze(new Matrix3(0.0, 0.0, 0.0,
-                                                0.0, 0.0, 0.0,
-                                                0.0, 0.0, 0.0));
-
-        /**
-         * The index into Matrix3 for column 0, row 0.
-         *
-         * @type {Number}
-         * @constant
-         */
-        Matrix3.COLUMN0ROW0 = 0;
-
-        /**
-         * The index into Matrix3 for column 0, row 1.
-         *
-         * @type {Number}
-         * @constant
-         */
-        Matrix3.COLUMN0ROW1 = 1;
-
-        /**
-         * The index into Matrix3 for column 0, row 2.
-         *
-         * @type {Number}
-         * @constant
-         */
-        Matrix3.COLUMN0ROW2 = 2;
-
-        /**
-         * The index into Matrix3 for column 1, row 0.
-         *
-         * @type {Number}
-         * @constant
-         */
-        Matrix3.COLUMN1ROW0 = 3;
-
-        /**
-         * The index into Matrix3 for column 1, row 1.
-         *
-         * @type {Number}
-         * @constant
-         */
-        Matrix3.COLUMN1ROW1 = 4;
-
-        /**
-         * The index into Matrix3 for column 1, row 2.
-         *
-         * @type {Number}
-         * @constant
-         */
-        Matrix3.COLUMN1ROW2 = 5;
-
-        /**
-         * The index into Matrix3 for column 2, row 0.
-         *
-         * @type {Number}
-         * @constant
-         */
-        Matrix3.COLUMN2ROW0 = 6;
-
-        /**
-         * The index into Matrix3 for column 2, row 1.
-         *
-         * @type {Number}
-         * @constant
-         */
-        Matrix3.COLUMN2ROW1 = 7;
-
-        /**
-         * The index into Matrix3 for column 2, row 2.
-         *
-         * @type {Number}
-         * @constant
-         */
-        Matrix3.COLUMN2ROW2 = 8;
-
-        Object.defineProperties(Matrix3.prototype, {
-            /**
-             * Gets the number of items in the collection.
-             * @memberof Matrix3.prototype
-             *
-             * @type {Number}
-             */
-            length : {
-                get : function() {
-                    return Matrix3.packedLength;
-                }
-            }
-        });
-
-        /**
-         * Duplicates the provided Matrix3 instance.
-         *
-         * @param {Matrix3} [result] The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided.
-         */
-        Matrix3.prototype.clone = function(result) {
-            return Matrix3.clone(this, result);
-        };
-
-        /**
-         * Compares this matrix to the provided matrix componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Matrix3} [right] The right hand side matrix.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        Matrix3.prototype.equals = function(right) {
-            return Matrix3.equals(this, right);
-        };
-
-        /**
-         * @private
-         */
-        Matrix3.equalsArray = function(matrix, array, offset) {
-            return matrix[0] === array[offset] &&
-                   matrix[1] === array[offset + 1] &&
-                   matrix[2] === array[offset + 2] &&
-                   matrix[3] === array[offset + 3] &&
-                   matrix[4] === array[offset + 4] &&
-                   matrix[5] === array[offset + 5] &&
-                   matrix[6] === array[offset + 6] &&
-                   matrix[7] === array[offset + 7] &&
-                   matrix[8] === array[offset + 8];
-        };
-
-        /**
-         * Compares this matrix to the provided matrix componentwise and returns
-         * <code>true</code> if they are within the provided epsilon,
-         * <code>false</code> otherwise.
-         *
-         * @param {Matrix3} [right] The right hand side matrix.
-         * @param {Number} epsilon The epsilon to use for equality testing.
-         * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Matrix3.prototype.equalsEpsilon = function(right, epsilon) {
-            return Matrix3.equalsEpsilon(this, right, epsilon);
-        };
-
-        /**
-         * Creates a string representing this Matrix with each row being
-         * on a separate line and in the format '(column0, column1, column2)'.
-         *
-         * @returns {String} A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1, column2)'.
-         */
-        Matrix3.prototype.toString = function() {
-            return '(' + this[0] + ', ' + this[3] + ', ' + this[6] + ')\n' +
-                   '(' + this[1] + ', ' + this[4] + ', ' + this[7] + ')\n' +
-                   '(' + this[2] + ', ' + this[5] + ', ' + this[8] + ')';
-        };
-
-    /**
-     * A 4x4 matrix, indexable as a column-major order array.
-     * Constructor parameters are in row-major order for code readability.
-     * @alias Matrix4
-     * @constructor
-     *
-     * @param {Number} [column0Row0=0.0] The value for column 0, row 0.
-     * @param {Number} [column1Row0=0.0] The value for column 1, row 0.
-     * @param {Number} [column2Row0=0.0] The value for column 2, row 0.
-     * @param {Number} [column3Row0=0.0] The value for column 3, row 0.
-     * @param {Number} [column0Row1=0.0] The value for column 0, row 1.
-     * @param {Number} [column1Row1=0.0] The value for column 1, row 1.
-     * @param {Number} [column2Row1=0.0] The value for column 2, row 1.
-     * @param {Number} [column3Row1=0.0] The value for column 3, row 1.
-     * @param {Number} [column0Row2=0.0] The value for column 0, row 2.
-     * @param {Number} [column1Row2=0.0] The value for column 1, row 2.
-     * @param {Number} [column2Row2=0.0] The value for column 2, row 2.
-     * @param {Number} [column3Row2=0.0] The value for column 3, row 2.
-     * @param {Number} [column0Row3=0.0] The value for column 0, row 3.
-     * @param {Number} [column1Row3=0.0] The value for column 1, row 3.
-     * @param {Number} [column2Row3=0.0] The value for column 2, row 3.
-     * @param {Number} [column3Row3=0.0] The value for column 3, row 3.
-     *
-     * @see Matrix4.fromColumnMajorArray
-     * @see Matrix4.fromRowMajorArray
-     * @see Matrix4.fromRotationTranslation
-     * @see Matrix4.fromTranslationRotationScale
-     * @see Matrix4.fromTranslationQuaternionRotationScale
-     * @see Matrix4.fromTranslation
-     * @see Matrix4.fromScale
-     * @see Matrix4.fromUniformScale
-     * @see Matrix4.fromCamera
-     * @see Matrix4.computePerspectiveFieldOfView
-     * @see Matrix4.computeOrthographicOffCenter
-     * @see Matrix4.computePerspectiveOffCenter
-     * @see Matrix4.computeInfinitePerspectiveOffCenter
-     * @see Matrix4.computeViewportTransformation
-     * @see Matrix4.computeView
-     * @see Matrix2
-     * @see Matrix3
-     * @see Packable
-     */
-    function Matrix4(column0Row0, column1Row0, column2Row0, column3Row0,
-                           column0Row1, column1Row1, column2Row1, column3Row1,
-                           column0Row2, column1Row2, column2Row2, column3Row2,
-                           column0Row3, column1Row3, column2Row3, column3Row3) {
-        this[0] = when.defaultValue(column0Row0, 0.0);
-        this[1] = when.defaultValue(column0Row1, 0.0);
-        this[2] = when.defaultValue(column0Row2, 0.0);
-        this[3] = when.defaultValue(column0Row3, 0.0);
-        this[4] = when.defaultValue(column1Row0, 0.0);
-        this[5] = when.defaultValue(column1Row1, 0.0);
-        this[6] = when.defaultValue(column1Row2, 0.0);
-        this[7] = when.defaultValue(column1Row3, 0.0);
-        this[8] = when.defaultValue(column2Row0, 0.0);
-        this[9] = when.defaultValue(column2Row1, 0.0);
-        this[10] = when.defaultValue(column2Row2, 0.0);
-        this[11] = when.defaultValue(column2Row3, 0.0);
-        this[12] = when.defaultValue(column3Row0, 0.0);
-        this[13] = when.defaultValue(column3Row1, 0.0);
-        this[14] = when.defaultValue(column3Row2, 0.0);
-        this[15] = when.defaultValue(column3Row3, 0.0);
-    }
-
-    /**
-     * The number of elements used to pack the object into an array.
-     * @type {Number}
-     */
-    Matrix4.packedLength = 16;
-
-    /**
-     * Stores the provided instance into the provided array.
-     *
-     * @param {Matrix4} value The value to pack.
-     * @param {Number[]} array The array to pack into.
-     * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-     *
-     * @returns {Number[]} The array that was packed into
-     */
-    Matrix4.pack = function(value, array, startingIndex) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('value', value);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        startingIndex = when.defaultValue(startingIndex, 0);
-
-        array[startingIndex++] = value[0];
-        array[startingIndex++] = value[1];
-        array[startingIndex++] = value[2];
-        array[startingIndex++] = value[3];
-        array[startingIndex++] = value[4];
-        array[startingIndex++] = value[5];
-        array[startingIndex++] = value[6];
-        array[startingIndex++] = value[7];
-        array[startingIndex++] = value[8];
-        array[startingIndex++] = value[9];
-        array[startingIndex++] = value[10];
-        array[startingIndex++] = value[11];
-        array[startingIndex++] = value[12];
-        array[startingIndex++] = value[13];
-        array[startingIndex++] = value[14];
-        array[startingIndex] = value[15];
-
-        return array;
-    };
-
-    /**
-     * Retrieves an instance from a packed array.
-     *
-     * @param {Number[]} array The packed array.
-     * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-     * @param {Matrix4} [result] The object into which to store the result.
-     * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if one was not provided.
-     */
-    Matrix4.unpack = function(array, startingIndex, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        startingIndex = when.defaultValue(startingIndex, 0);
-
-        if (!when.defined(result)) {
-            result = new Matrix4();
-        }
-
-        result[0] = array[startingIndex++];
-        result[1] = array[startingIndex++];
-        result[2] = array[startingIndex++];
-        result[3] = array[startingIndex++];
-        result[4] = array[startingIndex++];
-        result[5] = array[startingIndex++];
-        result[6] = array[startingIndex++];
-        result[7] = array[startingIndex++];
-        result[8] = array[startingIndex++];
-        result[9] = array[startingIndex++];
-        result[10] = array[startingIndex++];
-        result[11] = array[startingIndex++];
-        result[12] = array[startingIndex++];
-        result[13] = array[startingIndex++];
-        result[14] = array[startingIndex++];
-        result[15] = array[startingIndex];
-        return result;
-    };
-
-    /**
-     * Duplicates a Matrix4 instance.
-     *
-     * @param {Matrix4} matrix The matrix to duplicate.
-     * @param {Matrix4} [result] The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if one was not provided. (Returns undefined if matrix is undefined)
-     */
-    Matrix4.clone = function(matrix, result) {
-        if (!when.defined(matrix)) {
-            return undefined;
-        }
-        if (!when.defined(result)) {
-            return new Matrix4(matrix[0], matrix[4], matrix[8], matrix[12],
-                               matrix[1], matrix[5], matrix[9], matrix[13],
-                               matrix[2], matrix[6], matrix[10], matrix[14],
-                               matrix[3], matrix[7], matrix[11], matrix[15]);
-        }
-        result[0] = matrix[0];
-        result[1] = matrix[1];
-        result[2] = matrix[2];
-        result[3] = matrix[3];
-        result[4] = matrix[4];
-        result[5] = matrix[5];
-        result[6] = matrix[6];
-        result[7] = matrix[7];
-        result[8] = matrix[8];
-        result[9] = matrix[9];
-        result[10] = matrix[10];
-        result[11] = matrix[11];
-        result[12] = matrix[12];
-        result[13] = matrix[13];
-        result[14] = matrix[14];
-        result[15] = matrix[15];
-        return result;
-    };
-
-    /**
-     * Creates a Matrix4 from 16 consecutive elements in an array.
-     * @function
-     *
-     * @param {Number[]} array The array whose 16 consecutive elements correspond to the positions of the matrix.  Assumes column-major order.
-     * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to first column first row position in the matrix.
-     * @param {Matrix4} [result] The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if one was not provided.
-     *
-     * @example
-     * // Create the Matrix4:
-     * // [1.0, 2.0, 3.0, 4.0]
-     * // [1.0, 2.0, 3.0, 4.0]
-     * // [1.0, 2.0, 3.0, 4.0]
-     * // [1.0, 2.0, 3.0, 4.0]
-     *
-     * var v = [1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0];
-     * var m = Cesium.Matrix4.fromArray(v);
-     *
-     * // Create same Matrix4 with using an offset into an array
-     * var v2 = [0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0];
-     * var m2 = Cesium.Matrix4.fromArray(v2, 2);
-     */
-    Matrix4.fromArray = Matrix4.unpack;
-
-    /**
-     * Computes a Matrix4 instance from a column-major order array.
-     *
-     * @param {Number[]} values The column-major order array.
-     * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.
-     * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.
-     */
-    Matrix4.fromColumnMajorArray = function(values, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('values', values);
-        //>>includeEnd('debug');
-
-        return Matrix4.clone(values, result);
-    };
-
-    /**
-     * Computes a Matrix4 instance from a row-major order array.
-     * The resulting matrix will be in column-major order.
-     *
-     * @param {Number[]} values The row-major order array.
-     * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.
-     * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.
-     */
-    Matrix4.fromRowMajorArray = function(values, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('values', values);
-        //>>includeEnd('debug');
-
-        if (!when.defined(result)) {
-            return new Matrix4(values[0], values[1], values[2], values[3],
-                               values[4], values[5], values[6], values[7],
-                               values[8], values[9], values[10], values[11],
-                               values[12], values[13], values[14], values[15]);
-        }
-        result[0] = values[0];
-        result[1] = values[4];
-        result[2] = values[8];
-        result[3] = values[12];
-        result[4] = values[1];
-        result[5] = values[5];
-        result[6] = values[9];
-        result[7] = values[13];
-        result[8] = values[2];
-        result[9] = values[6];
-        result[10] = values[10];
-        result[11] = values[14];
-        result[12] = values[3];
-        result[13] = values[7];
-        result[14] = values[11];
-        result[15] = values[15];
-        return result;
-    };
-
-    /**
-     * Computes a Matrix4 instance from a Matrix3 representing the rotation
-     * and a Cartesian3 representing the translation.
-     *
-     * @param {Matrix3} rotation The upper left portion of the matrix representing the rotation.
-     * @param {Cartesian3} [translation=Cartesian3.ZERO] The upper right portion of the matrix representing the translation.
-     * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.
-     * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.
-     */
-    Matrix4.fromRotationTranslation = function(rotation, translation, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('rotation', rotation);
-        //>>includeEnd('debug');
-
-        translation = when.defaultValue(translation, Cartographic.Cartesian3.ZERO);
-
-        if (!when.defined(result)) {
-            return new Matrix4(rotation[0], rotation[3], rotation[6], translation.x,
-                               rotation[1], rotation[4], rotation[7], translation.y,
-                               rotation[2], rotation[5], rotation[8], translation.z,
-                                       0.0,         0.0,         0.0,           1.0);
-        }
-
-        result[0] = rotation[0];
-        result[1] = rotation[1];
-        result[2] = rotation[2];
-        result[3] = 0.0;
-        result[4] = rotation[3];
-        result[5] = rotation[4];
-        result[6] = rotation[5];
-        result[7] = 0.0;
-        result[8] = rotation[6];
-        result[9] = rotation[7];
-        result[10] = rotation[8];
-        result[11] = 0.0;
-        result[12] = translation.x;
-        result[13] = translation.y;
-        result[14] = translation.z;
-        result[15] = 1.0;
-        return result;
-    };
-
-    /**
-     * Computes a Matrix4 instance from a translation, rotation, and scale (TRS)
-     * representation with the rotation represented as a quaternion.
-     *
-     * @param {Cartesian3} translation The translation transformation.
-     * @param {Quaternion} rotation The rotation transformation.
-     * @param {Cartesian3} scale The non-uniform scale transformation.
-     * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.
-     * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.
-     *
-     * @example
-     * var result = Cesium.Matrix4.fromTranslationQuaternionRotationScale(
-     *   new Cesium.Cartesian3(1.0, 2.0, 3.0), // translation
-     *   Cesium.Quaternion.IDENTITY,           // rotation
-     *   new Cesium.Cartesian3(7.0, 8.0, 9.0), // scale
-     *   result);
-     */
-    Matrix4.fromTranslationQuaternionRotationScale = function(translation, rotation, scale, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('translation', translation);
-        Check.Check.typeOf.object('rotation', rotation);
-        Check.Check.typeOf.object('scale', scale);
-        //>>includeEnd('debug');
-
-        if (!when.defined(result)) {
-            result = new Matrix4();
-        }
-
-        var scaleX = scale.x;
-        var scaleY = scale.y;
-        var scaleZ = scale.z;
-
-        var x2 = rotation.x * rotation.x;
-        var xy = rotation.x * rotation.y;
-        var xz = rotation.x * rotation.z;
-        var xw = rotation.x * rotation.w;
-        var y2 = rotation.y * rotation.y;
-        var yz = rotation.y * rotation.z;
-        var yw = rotation.y * rotation.w;
-        var z2 = rotation.z * rotation.z;
-        var zw = rotation.z * rotation.w;
-        var w2 = rotation.w * rotation.w;
-
-        var m00 = x2 - y2 - z2 + w2;
-        var m01 = 2.0 * (xy - zw);
-        var m02 = 2.0 * (xz + yw);
-
-        var m10 = 2.0 * (xy + zw);
-        var m11 = -x2 + y2 - z2 + w2;
-        var m12 = 2.0 * (yz - xw);
-
-        var m20 = 2.0 * (xz - yw);
-        var m21 = 2.0 * (yz + xw);
-        var m22 = -x2 - y2 + z2 + w2;
-
-        result[0]  = m00 * scaleX;
-        result[1]  = m10 * scaleX;
-        result[2]  = m20 * scaleX;
-        result[3]  = 0.0;
-        result[4]  = m01 * scaleY;
-        result[5]  = m11 * scaleY;
-        result[6]  = m21 * scaleY;
-        result[7]  = 0.0;
-        result[8]  = m02 * scaleZ;
-        result[9]  = m12 * scaleZ;
-        result[10] = m22 * scaleZ;
-        result[11] = 0.0;
-        result[12] = translation.x;
-        result[13] = translation.y;
-        result[14] = translation.z;
-        result[15] = 1.0;
-
-        return result;
-    };
-
-    /**
-     * Creates a Matrix4 instance from a {@link TranslationRotationScale} instance.
-     *
-     * @param {TranslationRotationScale} translationRotationScale The instance.
-     * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.
-     * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.
-     */
-    Matrix4.fromTranslationRotationScale = function(translationRotationScale, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('translationRotationScale', translationRotationScale);
-        //>>includeEnd('debug');
-
-        return Matrix4.fromTranslationQuaternionRotationScale(translationRotationScale.translation, translationRotationScale.rotation, translationRotationScale.scale, result);
-    };
-
-    /**
-     * Creates a Matrix4 instance from a Cartesian3 representing the translation.
-     *
-     * @param {Cartesian3} translation The upper right portion of the matrix representing the translation.
-     * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.
-     * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.
-     *
-     * @see Matrix4.multiplyByTranslation
-     */
-    Matrix4.fromTranslation = function(translation, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('translation', translation);
-        //>>includeEnd('debug');
-
-        return Matrix4.fromRotationTranslation(Matrix3.IDENTITY, translation, result);
-    };
-
-    /**
-     * Computes a Matrix4 instance representing a non-uniform scale.
-     *
-     * @param {Cartesian3} scale The x, y, and z scale factors.
-     * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.
-     * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.
-     *
-     * @example
-     * // Creates
-     * //   [7.0, 0.0, 0.0, 0.0]
-     * //   [0.0, 8.0, 0.0, 0.0]
-     * //   [0.0, 0.0, 9.0, 0.0]
-     * //   [0.0, 0.0, 0.0, 1.0]
-     * var m = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0));
-     */
-    Matrix4.fromScale = function(scale, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('scale', scale);
-        //>>includeEnd('debug');
-
-        if (!when.defined(result)) {
-            return new Matrix4(
-                scale.x, 0.0,     0.0,     0.0,
-                0.0,     scale.y, 0.0,     0.0,
-                0.0,     0.0,     scale.z, 0.0,
-                0.0,     0.0,     0.0,     1.0);
-        }
-
-        result[0] = scale.x;
-        result[1] = 0.0;
-        result[2] = 0.0;
-        result[3] = 0.0;
-        result[4] = 0.0;
-        result[5] = scale.y;
-        result[6] = 0.0;
-        result[7] = 0.0;
-        result[8] = 0.0;
-        result[9] = 0.0;
-        result[10] = scale.z;
-        result[11] = 0.0;
-        result[12] = 0.0;
-        result[13] = 0.0;
-        result[14] = 0.0;
-        result[15] = 1.0;
-        return result;
-    };
-
-    /**
-     * Computes a Matrix4 instance representing a uniform scale.
-     *
-     * @param {Number} scale The uniform scale factor.
-     * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.
-     * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.
-     *
-     * @example
-     * // Creates
-     * //   [2.0, 0.0, 0.0, 0.0]
-     * //   [0.0, 2.0, 0.0, 0.0]
-     * //   [0.0, 0.0, 2.0, 0.0]
-     * //   [0.0, 0.0, 0.0, 1.0]
-     * var m = Cesium.Matrix4.fromUniformScale(2.0);
-     */
-    Matrix4.fromUniformScale = function(scale, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('scale', scale);
-        //>>includeEnd('debug');
-
-        if (!when.defined(result)) {
-            return new Matrix4(scale, 0.0,   0.0,   0.0,
-                               0.0,   scale, 0.0,   0.0,
-                               0.0,   0.0,   scale, 0.0,
-                               0.0,   0.0,   0.0,   1.0);
-        }
-
-        result[0] = scale;
-        result[1] = 0.0;
-        result[2] = 0.0;
-        result[3] = 0.0;
-        result[4] = 0.0;
-        result[5] = scale;
-        result[6] = 0.0;
-        result[7] = 0.0;
-        result[8] = 0.0;
-        result[9] = 0.0;
-        result[10] = scale;
-        result[11] = 0.0;
-        result[12] = 0.0;
-        result[13] = 0.0;
-        result[14] = 0.0;
-        result[15] = 1.0;
-        return result;
-    };
-
-    var fromCameraF = new Cartographic.Cartesian3();
-    var fromCameraR = new Cartographic.Cartesian3();
-    var fromCameraU = new Cartographic.Cartesian3();
-
-    /**
-     * Computes a Matrix4 instance from a Camera.
-     *
-     * @param {Camera} camera The camera to use.
-     * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.
-     * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.
-     */
-    Matrix4.fromCamera = function(camera, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('camera', camera);
-        //>>includeEnd('debug');
-
-        var position = camera.position;
-        var direction = camera.direction;
-        var up = camera.up;
-
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('camera.position', position);
-        Check.Check.typeOf.object('camera.direction', direction);
-        Check.Check.typeOf.object('camera.up', up);
-        //>>includeEnd('debug');
-
-        Cartographic.Cartesian3.normalize(direction, fromCameraF);
-        Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(fromCameraF, up, fromCameraR), fromCameraR);
-        Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(fromCameraR, fromCameraF, fromCameraU), fromCameraU);
-
-        var sX = fromCameraR.x;
-        var sY = fromCameraR.y;
-        var sZ = fromCameraR.z;
-        var fX = fromCameraF.x;
-        var fY = fromCameraF.y;
-        var fZ = fromCameraF.z;
-        var uX = fromCameraU.x;
-        var uY = fromCameraU.y;
-        var uZ = fromCameraU.z;
-        var positionX = position.x;
-        var positionY = position.y;
-        var positionZ = position.z;
-        var t0 = sX * -positionX + sY * -positionY+ sZ * -positionZ;
-        var t1 = uX * -positionX + uY * -positionY+ uZ * -positionZ;
-        var t2 = fX * positionX + fY * positionY + fZ * positionZ;
-
-        // The code below this comment is an optimized
-        // version of the commented lines.
-        // Rather that create two matrices and then multiply,
-        // we just bake in the multiplcation as part of creation.
-        // var rotation = new Matrix4(
-        //                 sX,  sY,  sZ, 0.0,
-        //                 uX,  uY,  uZ, 0.0,
-        //                -fX, -fY, -fZ, 0.0,
-        //                 0.0,  0.0,  0.0, 1.0);
-        // var translation = new Matrix4(
-        //                 1.0, 0.0, 0.0, -position.x,
-        //                 0.0, 1.0, 0.0, -position.y,
-        //                 0.0, 0.0, 1.0, -position.z,
-        //                 0.0, 0.0, 0.0, 1.0);
-        // return rotation.multiply(translation);
-        if (!when.defined(result)) {
-            return new Matrix4(
-                    sX,   sY,  sZ, t0,
-                    uX,   uY,  uZ, t1,
-                   -fX,  -fY, -fZ, t2,
-                    0.0, 0.0, 0.0, 1.0);
-        }
-        result[0] = sX;
-        result[1] = uX;
-        result[2] = -fX;
-        result[3] = 0.0;
-        result[4] = sY;
-        result[5] = uY;
-        result[6] = -fY;
-        result[7] = 0.0;
-        result[8] = sZ;
-        result[9] = uZ;
-        result[10] = -fZ;
-        result[11] = 0.0;
-        result[12] = t0;
-        result[13] = t1;
-        result[14] = t2;
-        result[15] = 1.0;
-        return result;
-    };
-
-     /**
-      * Computes a Matrix4 instance representing a perspective transformation matrix.
-      *
-      * @param {Number} fovY The field of view along the Y axis in radians.
-      * @param {Number} aspectRatio The aspect ratio.
-      * @param {Number} near The distance to the near plane in meters.
-      * @param {Number} far The distance to the far plane in meters.
-      * @param {Matrix4} result The object in which the result will be stored.
-      * @returns {Matrix4} The modified result parameter.
-      *
-      * @exception {DeveloperError} fovY must be in (0, PI].
-      * @exception {DeveloperError} aspectRatio must be greater than zero.
-      * @exception {DeveloperError} near must be greater than zero.
-      * @exception {DeveloperError} far must be greater than zero.
-      */
-    Matrix4.computePerspectiveFieldOfView = function(fovY, aspectRatio, near, far, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number.greaterThan('fovY', fovY, 0.0);
-        Check.Check.typeOf.number.lessThan('fovY', fovY, Math.PI);
-        Check.Check.typeOf.number.greaterThan('near', near, 0.0);
-        Check.Check.typeOf.number.greaterThan('far', far, 0.0);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var bottom = Math.tan(fovY * 0.5);
-
-        var column1Row1 = 1.0 / bottom;
-        var column0Row0 = column1Row1 / aspectRatio;
-        var column2Row2 = (far + near) / (near - far);
-        var column3Row2 = (2.0 * far * near) / (near - far);
-
-        result[0] = column0Row0;
-        result[1] = 0.0;
-        result[2] = 0.0;
-        result[3] = 0.0;
-        result[4] = 0.0;
-        result[5] = column1Row1;
-        result[6] = 0.0;
-        result[7] = 0.0;
-        result[8] = 0.0;
-        result[9] = 0.0;
-        result[10] = column2Row2;
-        result[11] = -1.0;
-        result[12] = 0.0;
-        result[13] = 0.0;
-        result[14] = column3Row2;
-        result[15] = 0.0;
-        return result;
-    };
-
-    /**
-    * Computes a Matrix4 instance representing an orthographic transformation matrix.
-    *
-    * @param {Number} left The number of meters to the left of the camera that will be in view.
-    * @param {Number} right The number of meters to the right of the camera that will be in view.
-    * @param {Number} bottom The number of meters below of the camera that will be in view.
-    * @param {Number} top The number of meters above of the camera that will be in view.
-    * @param {Number} near The distance to the near plane in meters.
-    * @param {Number} far The distance to the far plane in meters.
-    * @param {Matrix4} result The object in which the result will be stored.
-    * @returns {Matrix4} The modified result parameter.
-    */
-    Matrix4.computeOrthographicOffCenter = function(left, right, bottom, top, near, far, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('left', left);
-        Check.Check.typeOf.number('right', right);
-        Check.Check.typeOf.number('bottom', bottom);
-        Check.Check.typeOf.number('top', top);
-        Check.Check.typeOf.number('near', near);
-        Check.Check.typeOf.number('far', far);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var a = 1.0 / (right - left);
-        var b = 1.0 / (top - bottom);
-        var c = 1.0 / (far - near);
-
-        var tx = -(right + left) * a;
-        var ty = -(top + bottom) * b;
-        var tz = -(far + near) * c;
-        a *= 2.0;
-        b *= 2.0;
-        c *= -2.0;
-
-        result[0] = a;
-        result[1] = 0.0;
-        result[2] = 0.0;
-        result[3] = 0.0;
-        result[4] = 0.0;
-        result[5] = b;
-        result[6] = 0.0;
-        result[7] = 0.0;
-        result[8] = 0.0;
-        result[9] = 0.0;
-        result[10] = c;
-        result[11] = 0.0;
-        result[12] = tx;
-        result[13] = ty;
-        result[14] = tz;
-        result[15] = 1.0;
-        return result;
-    };
-
-    /**
-     * Computes a Matrix4 instance representing an off center perspective transformation.
-     *
-     * @param {Number} left The number of meters to the left of the camera that will be in view.
-     * @param {Number} right The number of meters to the right of the camera that will be in view.
-     * @param {Number} bottom The number of meters below of the camera that will be in view.
-     * @param {Number} top The number of meters above of the camera that will be in view.
-     * @param {Number} near The distance to the near plane in meters.
-     * @param {Number} far The distance to the far plane in meters.
-     * @param {Matrix4} result The object in which the result will be stored.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.computePerspectiveOffCenter = function(left, right, bottom, top, near, far, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('left', left);
-        Check.Check.typeOf.number('right', right);
-        Check.Check.typeOf.number('bottom', bottom);
-        Check.Check.typeOf.number('top', top);
-        Check.Check.typeOf.number('near', near);
-        Check.Check.typeOf.number('far', far);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var column0Row0 = 2.0 * near / (right - left);
-        var column1Row1 = 2.0 * near / (top - bottom);
-        var column2Row0 = (right + left) / (right - left);
-        var column2Row1 = (top + bottom) / (top - bottom);
-        var column2Row2 = -(far + near) / (far - near);
-        var column2Row3 = -1.0;
-        var column3Row2 = -2.0 * far * near / (far - near);
-
-        result[0] = column0Row0;
-        result[1] = 0.0;
-        result[2] = 0.0;
-        result[3] = 0.0;
-        result[4] = 0.0;
-        result[5] = column1Row1;
-        result[6] = 0.0;
-        result[7] = 0.0;
-        result[8] = column2Row0;
-        result[9] = column2Row1;
-        result[10] = column2Row2;
-        result[11] = column2Row3;
-        result[12] = 0.0;
-        result[13] = 0.0;
-        result[14] = column3Row2;
-        result[15] = 0.0;
-        return result;
-    };
-
-    /**
-     * Computes a Matrix4 instance representing an infinite off center perspective transformation.
-     *
-     * @param {Number} left The number of meters to the left of the camera that will be in view.
-     * @param {Number} right The number of meters to the right of the camera that will be in view.
-     * @param {Number} bottom The number of meters below of the camera that will be in view.
-     * @param {Number} top The number of meters above of the camera that will be in view.
-     * @param {Number} near The distance to the near plane in meters.
-     * @param {Matrix4} result The object in which the result will be stored.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.computeInfinitePerspectiveOffCenter = function(left, right, bottom, top, near, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('left', left);
-        Check.Check.typeOf.number('right', right);
-        Check.Check.typeOf.number('bottom', bottom);
-        Check.Check.typeOf.number('top', top);
-        Check.Check.typeOf.number('near', near);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var column0Row0 = 2.0 * near / (right - left);
-        var column1Row1 = 2.0 * near / (top - bottom);
-        var column2Row0 = (right + left) / (right - left);
-        var column2Row1 = (top + bottom) / (top - bottom);
-        var column2Row2 = -1.0;
-        var column2Row3 = -1.0;
-        var column3Row2 = -2.0 * near;
-
-        result[0] = column0Row0;
-        result[1] = 0.0;
-        result[2] = 0.0;
-        result[3] = 0.0;
-        result[4] = 0.0;
-        result[5] = column1Row1;
-        result[6] = 0.0;
-        result[7] = 0.0;
-        result[8] = column2Row0;
-        result[9] = column2Row1;
-        result[10] = column2Row2;
-        result[11] = column2Row3;
-        result[12] = 0.0;
-        result[13] = 0.0;
-        result[14] = column3Row2;
-        result[15] = 0.0;
-        return result;
-    };
-
-    /**
-     * Computes a Matrix4 instance that transforms from normalized device coordinates to window coordinates.
-     *
-     * @param {Object}[viewport = { x : 0.0, y : 0.0, width : 0.0, height : 0.0 }] The viewport's corners as shown in Example 1.
-     * @param {Number}[nearDepthRange=0.0] The near plane distance in window coordinates.
-     * @param {Number}[farDepthRange=1.0] The far plane distance in window coordinates.
-     * @param {Matrix4} result The object in which the result will be stored.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     * @example
-     * // Create viewport transformation using an explicit viewport and depth range.
-     * var m = Cesium.Matrix4.computeViewportTransformation({
-     *     x : 0.0,
-     *     y : 0.0,
-     *     width : 1024.0,
-     *     height : 768.0
-     * }, 0.0, 1.0, new Cesium.Matrix4());
-     */
-    Matrix4.computeViewportTransformation = function(viewport, nearDepthRange, farDepthRange, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        viewport = when.defaultValue(viewport, when.defaultValue.EMPTY_OBJECT);
-        var x = when.defaultValue(viewport.x, 0.0);
-        var y = when.defaultValue(viewport.y, 0.0);
-        var width = when.defaultValue(viewport.width, 0.0);
-        var height = when.defaultValue(viewport.height, 0.0);
-        nearDepthRange = when.defaultValue(nearDepthRange, 0.0);
-        farDepthRange = when.defaultValue(farDepthRange, 1.0);
-
-        var halfWidth = width * 0.5;
-        var halfHeight = height * 0.5;
-        var halfDepth = (farDepthRange - nearDepthRange) * 0.5;
-
-        var column0Row0 = halfWidth;
-        var column1Row1 = halfHeight;
-        var column2Row2 = halfDepth;
-        var column3Row0 = x + halfWidth;
-        var column3Row1 = y + halfHeight;
-        var column3Row2 = nearDepthRange + halfDepth;
-        var column3Row3 = 1.0;
-
-        result[0] = column0Row0;
-        result[1] = 0.0;
-        result[2] = 0.0;
-        result[3] = 0.0;
-        result[4] = 0.0;
-        result[5] = column1Row1;
-        result[6] = 0.0;
-        result[7] = 0.0;
-        result[8] = 0.0;
-        result[9] = 0.0;
-        result[10] = column2Row2;
-        result[11] = 0.0;
-        result[12] = column3Row0;
-        result[13] = column3Row1;
-        result[14] = column3Row2;
-        result[15] = column3Row3;
-        return result;
-    };
-
-    /**
-     * Computes a Matrix4 instance that transforms from world space to view space.
-     *
-     * @param {Cartesian3} position The position of the camera.
-     * @param {Cartesian3} direction The forward direction.
-     * @param {Cartesian3} up The up direction.
-     * @param {Cartesian3} right The right direction.
-     * @param {Matrix4} result The object in which the result will be stored.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.computeView = function(position, direction, up, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('position', position);
-        Check.Check.typeOf.object('direction', direction);
-        Check.Check.typeOf.object('up', up);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result[0] = right.x;
-        result[1] = up.x;
-        result[2] = -direction.x;
-        result[3] = 0.0;
-        result[4] = right.y;
-        result[5] = up.y;
-        result[6] = -direction.y;
-        result[7] = 0.0;
-        result[8] = right.z;
-        result[9] = up.z;
-        result[10] = -direction.z;
-        result[11] = 0.0;
-        result[12] = -Cartographic.Cartesian3.dot(right, position);
-        result[13] = -Cartographic.Cartesian3.dot(up, position);
-        result[14] = Cartographic.Cartesian3.dot(direction, position);
-        result[15] = 1.0;
-        return result;
-    };
-
-    /**
-     * Computes an Array from the provided Matrix4 instance.
-     * The array will be in column-major order.
-     *
-     * @param {Matrix4} matrix The matrix to use..
-     * @param {Number[]} [result] The Array onto which to store the result.
-     * @returns {Number[]} The modified Array parameter or a new Array instance if one was not provided.
-     *
-     * @example
-     * //create an array from an instance of Matrix4
-     * // m = [10.0, 14.0, 18.0, 22.0]
-     * //     [11.0, 15.0, 19.0, 23.0]
-     * //     [12.0, 16.0, 20.0, 24.0]
-     * //     [13.0, 17.0, 21.0, 25.0]
-     * var a = Cesium.Matrix4.toArray(m);
-     *
-     * // m remains the same
-     * //creates a = [10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0]
-     */
-    Matrix4.toArray = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        //>>includeEnd('debug');
-
-        if (!when.defined(result)) {
-            return [matrix[0], matrix[1], matrix[2], matrix[3],
-                    matrix[4], matrix[5], matrix[6], matrix[7],
-                    matrix[8], matrix[9], matrix[10], matrix[11],
-                    matrix[12], matrix[13], matrix[14], matrix[15]];
-        }
-        result[0] = matrix[0];
-        result[1] = matrix[1];
-        result[2] = matrix[2];
-        result[3] = matrix[3];
-        result[4] = matrix[4];
-        result[5] = matrix[5];
-        result[6] = matrix[6];
-        result[7] = matrix[7];
-        result[8] = matrix[8];
-        result[9] = matrix[9];
-        result[10] = matrix[10];
-        result[11] = matrix[11];
-        result[12] = matrix[12];
-        result[13] = matrix[13];
-        result[14] = matrix[14];
-        result[15] = matrix[15];
-        return result;
-    };
-
-    /**
-     * Computes the array index of the element at the provided row and column.
-     *
-     * @param {Number} row The zero-based index of the row.
-     * @param {Number} column The zero-based index of the column.
-     * @returns {Number} The index of the element at the provided row and column.
-     *
-     * @exception {DeveloperError} row must be 0, 1, 2, or 3.
-     * @exception {DeveloperError} column must be 0, 1, 2, or 3.
-     *
-     * @example
-     * var myMatrix = new Cesium.Matrix4();
-     * var column1Row0Index = Cesium.Matrix4.getElementIndex(1, 0);
-     * var column1Row0 = myMatrix[column1Row0Index];
-     * myMatrix[column1Row0Index] = 10.0;
-     */
-    Matrix4.getElementIndex = function(column, row) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number.greaterThanOrEquals('row', row, 0);
-        Check.Check.typeOf.number.lessThanOrEquals('row', row, 3);
-
-        Check.Check.typeOf.number.greaterThanOrEquals('column', column, 0);
-        Check.Check.typeOf.number.lessThanOrEquals('column', column, 3);
-        //>>includeEnd('debug');
-
-        return column * 4 + row;
-    };
-
-    /**
-     * Retrieves a copy of the matrix column at the provided index as a Cartesian4 instance.
-     *
-     * @param {Matrix4} matrix The matrix to use.
-     * @param {Number} index The zero-based index of the column to retrieve.
-     * @param {Cartesian4} result The object onto which to store the result.
-     * @returns {Cartesian4} The modified result parameter.
-     *
-     * @exception {DeveloperError} index must be 0, 1, 2, or 3.
-     *
-     * @example
-     * //returns a Cartesian4 instance with values from the specified column
-     * // m = [10.0, 11.0, 12.0, 13.0]
-     * //     [14.0, 15.0, 16.0, 17.0]
-     * //     [18.0, 19.0, 20.0, 21.0]
-     * //     [22.0, 23.0, 24.0, 25.0]
-     *
-     * //Example 1: Creates an instance of Cartesian
-     * var a = Cesium.Matrix4.getColumn(m, 2, new Cesium.Cartesian4());
-     *
-     * @example
-     * //Example 2: Sets values for Cartesian instance
-     * var a = new Cesium.Cartesian4();
-     * Cesium.Matrix4.getColumn(m, 2, a);
-     *
-     * // a.x = 12.0; a.y = 16.0; a.z = 20.0; a.w = 24.0;
-     */
-    Matrix4.getColumn = function(matrix, index, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-
-        Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-        Check.Check.typeOf.number.lessThanOrEquals('index', index, 3);
-
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var startIndex = index * 4;
-        var x = matrix[startIndex];
-        var y = matrix[startIndex + 1];
-        var z = matrix[startIndex + 2];
-        var w = matrix[startIndex + 3];
-
-        result.x = x;
-        result.y = y;
-        result.z = z;
-        result.w = w;
-        return result;
-    };
-
-    /**
-     * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian4 instance.
-     *
-     * @param {Matrix4} matrix The matrix to use.
-     * @param {Number} index The zero-based index of the column to set.
-     * @param {Cartesian4} cartesian The Cartesian whose values will be assigned to the specified column.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     * @exception {DeveloperError} index must be 0, 1, 2, or 3.
-     *
-     * @example
-     * //creates a new Matrix4 instance with new column values from the Cartesian4 instance
-     * // m = [10.0, 11.0, 12.0, 13.0]
-     * //     [14.0, 15.0, 16.0, 17.0]
-     * //     [18.0, 19.0, 20.0, 21.0]
-     * //     [22.0, 23.0, 24.0, 25.0]
-     *
-     * var a = Cesium.Matrix4.setColumn(m, 2, new Cesium.Cartesian4(99.0, 98.0, 97.0, 96.0), new Cesium.Matrix4());
-     *
-     * // m remains the same
-     * // a = [10.0, 11.0, 99.0, 13.0]
-     * //     [14.0, 15.0, 98.0, 17.0]
-     * //     [18.0, 19.0, 97.0, 21.0]
-     * //     [22.0, 23.0, 96.0, 25.0]
-     */
-    Matrix4.setColumn = function(matrix, index, cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-
-        Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-        Check.Check.typeOf.number.lessThanOrEquals('index', index, 3);
-
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result = Matrix4.clone(matrix, result);
-        var startIndex = index * 4;
-        result[startIndex] = cartesian.x;
-        result[startIndex + 1] = cartesian.y;
-        result[startIndex + 2] = cartesian.z;
-        result[startIndex + 3] = cartesian.w;
-        return result;
-    };
-
-    /**
-     * Computes a new matrix that replaces the translation in the rightmost column of the provided
-     * matrix with the provided translation.  This assumes the matrix is an affine transformation
-     *
-     * @param {Matrix4} matrix The matrix to use.
-     * @param {Cartesian3} translation The translation that replaces the translation of the provided matrix.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.setTranslation = function(matrix, translation, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('translation', translation);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result[0] = matrix[0];
-        result[1] = matrix[1];
-        result[2] = matrix[2];
-        result[3] = matrix[3];
-
-        result[4] = matrix[4];
-        result[5] = matrix[5];
-        result[6] = matrix[6];
-        result[7] = matrix[7];
-
-        result[8] = matrix[8];
-        result[9] = matrix[9];
-        result[10] = matrix[10];
-        result[11] = matrix[11];
-
-        result[12] = translation.x;
-        result[13] = translation.y;
-        result[14] = translation.z;
-        result[15] = matrix[15];
-
-        return result;
-    };
-
-    var scaleScratch = new Cartographic.Cartesian3();
-    /**
-     * Computes a new matrix that replaces the scale with the provided scale.  This assumes the matrix is an affine transformation
-     *
-     * @param {Matrix4} matrix The matrix to use.
-     * @param {Cartesian3} scale The scale that replaces the scale of the provided matrix.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.setScale = function(matrix, scale, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('scale', scale);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var existingScale = Matrix4.getScale(matrix, scaleScratch);
-        var newScale = Cartographic.Cartesian3.divideComponents(scale, existingScale, scaleScratch);
-        return Matrix4.multiplyByScale(matrix, newScale, result);
-    };
-
-    /**
-     * Retrieves a copy of the matrix row at the provided index as a Cartesian4 instance.
-     *
-     * @param {Matrix4} matrix The matrix to use.
-     * @param {Number} index The zero-based index of the row to retrieve.
-     * @param {Cartesian4} result The object onto which to store the result.
-     * @returns {Cartesian4} The modified result parameter.
-     *
-     * @exception {DeveloperError} index must be 0, 1, 2, or 3.
-     *
-     * @example
-     * //returns a Cartesian4 instance with values from the specified column
-     * // m = [10.0, 11.0, 12.0, 13.0]
-     * //     [14.0, 15.0, 16.0, 17.0]
-     * //     [18.0, 19.0, 20.0, 21.0]
-     * //     [22.0, 23.0, 24.0, 25.0]
-     *
-     * //Example 1: Returns an instance of Cartesian
-     * var a = Cesium.Matrix4.getRow(m, 2, new Cesium.Cartesian4());
-     *
-     * @example
-     * //Example 2: Sets values for a Cartesian instance
-     * var a = new Cesium.Cartesian4();
-     * Cesium.Matrix4.getRow(m, 2, a);
-     *
-     * // a.x = 18.0; a.y = 19.0; a.z = 20.0; a.w = 21.0;
-     */
-    Matrix4.getRow = function(matrix, index, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-
-        Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-        Check.Check.typeOf.number.lessThanOrEquals('index', index, 3);
-
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var x = matrix[index];
-        var y = matrix[index + 4];
-        var z = matrix[index + 8];
-        var w = matrix[index + 12];
-
-        result.x = x;
-        result.y = y;
-        result.z = z;
-        result.w = w;
-        return result;
-    };
-
-    /**
-     * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian4 instance.
-     *
-     * @param {Matrix4} matrix The matrix to use.
-     * @param {Number} index The zero-based index of the row to set.
-     * @param {Cartesian4} cartesian The Cartesian whose values will be assigned to the specified row.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     * @exception {DeveloperError} index must be 0, 1, 2, or 3.
-     *
-     * @example
-     * //create a new Matrix4 instance with new row values from the Cartesian4 instance
-     * // m = [10.0, 11.0, 12.0, 13.0]
-     * //     [14.0, 15.0, 16.0, 17.0]
-     * //     [18.0, 19.0, 20.0, 21.0]
-     * //     [22.0, 23.0, 24.0, 25.0]
-     *
-     * var a = Cesium.Matrix4.setRow(m, 2, new Cesium.Cartesian4(99.0, 98.0, 97.0, 96.0), new Cesium.Matrix4());
-     *
-     * // m remains the same
-     * // a = [10.0, 11.0, 12.0, 13.0]
-     * //     [14.0, 15.0, 16.0, 17.0]
-     * //     [99.0, 98.0, 97.0, 96.0]
-     * //     [22.0, 23.0, 24.0, 25.0]
-     */
-    Matrix4.setRow = function(matrix, index, cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-
-        Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-        Check.Check.typeOf.number.lessThanOrEquals('index', index, 3);
-
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result = Matrix4.clone(matrix, result);
-        result[index] = cartesian.x;
-        result[index + 4] = cartesian.y;
-        result[index + 8] = cartesian.z;
-        result[index + 12] = cartesian.w;
-        return result;
-    };
-
-    var scratchColumn$1 = new Cartographic.Cartesian3();
-
-    /**
-     * Extracts the non-uniform scale assuming the matrix is an affine transformation.
-     *
-     * @param {Matrix4} matrix The matrix.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter
-     */
-    Matrix4.getScale = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn$1));
-        result.y = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.fromElements(matrix[4], matrix[5], matrix[6], scratchColumn$1));
-        result.z = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.fromElements(matrix[8], matrix[9], matrix[10], scratchColumn$1));
-        return result;
-    };
-
-    var scratchScale$1 = new Cartographic.Cartesian3();
-
-    /**
-     * Computes the maximum scale assuming the matrix is an affine transformation.
-     * The maximum scale is the maximum length of the column vectors in the upper-left
-     * 3x3 matrix.
-     *
-     * @param {Matrix4} matrix The matrix.
-     * @returns {Number} The maximum scale.
-     */
-    Matrix4.getMaximumScale = function(matrix) {
-        Matrix4.getScale(matrix, scratchScale$1);
-        return Cartographic.Cartesian3.maximumComponent(scratchScale$1);
-    };
-
-    /**
-     * Computes the product of two matrices.
-     *
-     * @param {Matrix4} left The first matrix.
-     * @param {Matrix4} right The second matrix.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.multiply = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var left0 = left[0];
-        var left1 = left[1];
-        var left2 = left[2];
-        var left3 = left[3];
-        var left4 = left[4];
-        var left5 = left[5];
-        var left6 = left[6];
-        var left7 = left[7];
-        var left8 = left[8];
-        var left9 = left[9];
-        var left10 = left[10];
-        var left11 = left[11];
-        var left12 = left[12];
-        var left13 = left[13];
-        var left14 = left[14];
-        var left15 = left[15];
-
-        var right0 = right[0];
-        var right1 = right[1];
-        var right2 = right[2];
-        var right3 = right[3];
-        var right4 = right[4];
-        var right5 = right[5];
-        var right6 = right[6];
-        var right7 = right[7];
-        var right8 = right[8];
-        var right9 = right[9];
-        var right10 = right[10];
-        var right11 = right[11];
-        var right12 = right[12];
-        var right13 = right[13];
-        var right14 = right[14];
-        var right15 = right[15];
-
-        var column0Row0 = left0 * right0 + left4 * right1 + left8 * right2 + left12 * right3;
-        var column0Row1 = left1 * right0 + left5 * right1 + left9 * right2 + left13 * right3;
-        var column0Row2 = left2 * right0 + left6 * right1 + left10 * right2 + left14 * right3;
-        var column0Row3 = left3 * right0 + left7 * right1 + left11 * right2 + left15 * right3;
-
-        var column1Row0 = left0 * right4 + left4 * right5 + left8 * right6 + left12 * right7;
-        var column1Row1 = left1 * right4 + left5 * right5 + left9 * right6 + left13 * right7;
-        var column1Row2 = left2 * right4 + left6 * right5 + left10 * right6 + left14 * right7;
-        var column1Row3 = left3 * right4 + left7 * right5 + left11 * right6 + left15 * right7;
-
-        var column2Row0 = left0 * right8 + left4 * right9 + left8 * right10 + left12 * right11;
-        var column2Row1 = left1 * right8 + left5 * right9 + left9 * right10 + left13 * right11;
-        var column2Row2 = left2 * right8 + left6 * right9 + left10 * right10 + left14 * right11;
-        var column2Row3 = left3 * right8 + left7 * right9 + left11 * right10 + left15 * right11;
-
-        var column3Row0 = left0 * right12 + left4 * right13 + left8 * right14 + left12 * right15;
-        var column3Row1 = left1 * right12 + left5 * right13 + left9 * right14 + left13 * right15;
-        var column3Row2 = left2 * right12 + left6 * right13 + left10 * right14 + left14 * right15;
-        var column3Row3 = left3 * right12 + left7 * right13 + left11 * right14 + left15 * right15;
-
-        result[0] = column0Row0;
-        result[1] = column0Row1;
-        result[2] = column0Row2;
-        result[3] = column0Row3;
-        result[4] = column1Row0;
-        result[5] = column1Row1;
-        result[6] = column1Row2;
-        result[7] = column1Row3;
-        result[8] = column2Row0;
-        result[9] = column2Row1;
-        result[10] = column2Row2;
-        result[11] = column2Row3;
-        result[12] = column3Row0;
-        result[13] = column3Row1;
-        result[14] = column3Row2;
-        result[15] = column3Row3;
-        return result;
-    };
-
-    /**
-     * Computes the sum of two matrices.
-     *
-     * @param {Matrix4} left The first matrix.
-     * @param {Matrix4} right The second matrix.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.add = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result[0] = left[0] + right[0];
-        result[1] = left[1] + right[1];
-        result[2] = left[2] + right[2];
-        result[3] = left[3] + right[3];
-        result[4] = left[4] + right[4];
-        result[5] = left[5] + right[5];
-        result[6] = left[6] + right[6];
-        result[7] = left[7] + right[7];
-        result[8] = left[8] + right[8];
-        result[9] = left[9] + right[9];
-        result[10] = left[10] + right[10];
-        result[11] = left[11] + right[11];
-        result[12] = left[12] + right[12];
-        result[13] = left[13] + right[13];
-        result[14] = left[14] + right[14];
-        result[15] = left[15] + right[15];
-        return result;
-    };
-
-    /**
-     * Computes the difference of two matrices.
-     *
-     * @param {Matrix4} left The first matrix.
-     * @param {Matrix4} right The second matrix.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.subtract = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result[0] = left[0] - right[0];
-        result[1] = left[1] - right[1];
-        result[2] = left[2] - right[2];
-        result[3] = left[3] - right[3];
-        result[4] = left[4] - right[4];
-        result[5] = left[5] - right[5];
-        result[6] = left[6] - right[6];
-        result[7] = left[7] - right[7];
-        result[8] = left[8] - right[8];
-        result[9] = left[9] - right[9];
-        result[10] = left[10] - right[10];
-        result[11] = left[11] - right[11];
-        result[12] = left[12] - right[12];
-        result[13] = left[13] - right[13];
-        result[14] = left[14] - right[14];
-        result[15] = left[15] - right[15];
-        return result;
-    };
-
-    /**
-     * Computes the product of two matrices assuming the matrices are
-     * affine transformation matrices, where the upper left 3x3 elements
-     * are a rotation matrix, and the upper three elements in the fourth
-     * column are the translation.  The bottom row is assumed to be [0, 0, 0, 1].
-     * The matrix is not verified to be in the proper form.
-     * This method is faster than computing the product for general 4x4
-     * matrices using {@link Matrix4.multiply}.
-     *
-     * @param {Matrix4} left The first matrix.
-     * @param {Matrix4} right The second matrix.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     * @example
-     * var m1 = new Cesium.Matrix4(1.0, 6.0, 7.0, 0.0, 2.0, 5.0, 8.0, 0.0, 3.0, 4.0, 9.0, 0.0, 0.0, 0.0, 0.0, 1.0);
-     * var m2 = Cesium.Transforms.eastNorthUpToFixedFrame(new Cesium.Cartesian3(1.0, 1.0, 1.0));
-     * var m3 = Cesium.Matrix4.multiplyTransformation(m1, m2, new Cesium.Matrix4());
-     */
-    Matrix4.multiplyTransformation = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var left0 = left[0];
-        var left1 = left[1];
-        var left2 = left[2];
-        var left4 = left[4];
-        var left5 = left[5];
-        var left6 = left[6];
-        var left8 = left[8];
-        var left9 = left[9];
-        var left10 = left[10];
-        var left12 = left[12];
-        var left13 = left[13];
-        var left14 = left[14];
-
-        var right0 = right[0];
-        var right1 = right[1];
-        var right2 = right[2];
-        var right4 = right[4];
-        var right5 = right[5];
-        var right6 = right[6];
-        var right8 = right[8];
-        var right9 = right[9];
-        var right10 = right[10];
-        var right12 = right[12];
-        var right13 = right[13];
-        var right14 = right[14];
-
-        var column0Row0 = left0 * right0 + left4 * right1 + left8 * right2;
-        var column0Row1 = left1 * right0 + left5 * right1 + left9 * right2;
-        var column0Row2 = left2 * right0 + left6 * right1 + left10 * right2;
-
-        var column1Row0 = left0 * right4 + left4 * right5 + left8 * right6;
-        var column1Row1 = left1 * right4 + left5 * right5 + left9 * right6;
-        var column1Row2 = left2 * right4 + left6 * right5 + left10 * right6;
-
-        var column2Row0 = left0 * right8 + left4 * right9 + left8 * right10;
-        var column2Row1 = left1 * right8 + left5 * right9 + left9 * right10;
-        var column2Row2 = left2 * right8 + left6 * right9 + left10 * right10;
-
-        var column3Row0 = left0 * right12 + left4 * right13 + left8 * right14 + left12;
-        var column3Row1 = left1 * right12 + left5 * right13 + left9 * right14 + left13;
-        var column3Row2 = left2 * right12 + left6 * right13 + left10 * right14 + left14;
-
-        result[0] = column0Row0;
-        result[1] = column0Row1;
-        result[2] = column0Row2;
-        result[3] = 0.0;
-        result[4] = column1Row0;
-        result[5] = column1Row1;
-        result[6] = column1Row2;
-        result[7] = 0.0;
-        result[8] = column2Row0;
-        result[9] = column2Row1;
-        result[10] = column2Row2;
-        result[11] = 0.0;
-        result[12] = column3Row0;
-        result[13] = column3Row1;
-        result[14] = column3Row2;
-        result[15] = 1.0;
-        return result;
-    };
-
-    /**
-     * Multiplies a transformation matrix (with a bottom row of <code>[0.0, 0.0, 0.0, 1.0]</code>)
-     * by a 3x3 rotation matrix.  This is an optimization
-     * for <code>Matrix4.multiply(m, Matrix4.fromRotationTranslation(rotation), m);</code> with less allocations and arithmetic operations.
-     *
-     * @param {Matrix4} matrix The matrix on the left-hand side.
-     * @param {Matrix3} rotation The 3x3 rotation matrix on the right-hand side.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     * @example
-     * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromRotationTranslation(rotation), m);
-     * Cesium.Matrix4.multiplyByMatrix3(m, rotation, m);
-     */
-    Matrix4.multiplyByMatrix3 = function(matrix, rotation, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('rotation', rotation);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var left0 = matrix[0];
-        var left1 = matrix[1];
-        var left2 = matrix[2];
-        var left4 = matrix[4];
-        var left5 = matrix[5];
-        var left6 = matrix[6];
-        var left8 = matrix[8];
-        var left9 = matrix[9];
-        var left10 = matrix[10];
-
-        var right0 = rotation[0];
-        var right1 = rotation[1];
-        var right2 = rotation[2];
-        var right4 = rotation[3];
-        var right5 = rotation[4];
-        var right6 = rotation[5];
-        var right8 = rotation[6];
-        var right9 = rotation[7];
-        var right10 = rotation[8];
-
-        var column0Row0 = left0 * right0 + left4 * right1 + left8 * right2;
-        var column0Row1 = left1 * right0 + left5 * right1 + left9 * right2;
-        var column0Row2 = left2 * right0 + left6 * right1 + left10 * right2;
-
-        var column1Row0 = left0 * right4 + left4 * right5 + left8 * right6;
-        var column1Row1 = left1 * right4 + left5 * right5 + left9 * right6;
-        var column1Row2 = left2 * right4 + left6 * right5 + left10 * right6;
-
-        var column2Row0 = left0 * right8 + left4 * right9 + left8 * right10;
-        var column2Row1 = left1 * right8 + left5 * right9 + left9 * right10;
-        var column2Row2 = left2 * right8 + left6 * right9 + left10 * right10;
-
-        result[0] = column0Row0;
-        result[1] = column0Row1;
-        result[2] = column0Row2;
-        result[3] = 0.0;
-        result[4] = column1Row0;
-        result[5] = column1Row1;
-        result[6] = column1Row2;
-        result[7] = 0.0;
-        result[8] = column2Row0;
-        result[9] = column2Row1;
-        result[10] = column2Row2;
-        result[11] = 0.0;
-        result[12] = matrix[12];
-        result[13] = matrix[13];
-        result[14] = matrix[14];
-        result[15] = matrix[15];
-        return result;
-    };
-
-    /**
-     * Multiplies a transformation matrix (with a bottom row of <code>[0.0, 0.0, 0.0, 1.0]</code>)
-     * by an implicit translation matrix defined by a {@link Cartesian3}.  This is an optimization
-     * for <code>Matrix4.multiply(m, Matrix4.fromTranslation(position), m);</code> with less allocations and arithmetic operations.
-     *
-     * @param {Matrix4} matrix The matrix on the left-hand side.
-     * @param {Cartesian3} translation The translation on the right-hand side.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     * @example
-     * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromTranslation(position), m);
-     * Cesium.Matrix4.multiplyByTranslation(m, position, m);
-     */
-    Matrix4.multiplyByTranslation = function(matrix, translation, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('translation', translation);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var x = translation.x;
-        var y = translation.y;
-        var z = translation.z;
-
-        var tx = (x * matrix[0]) + (y * matrix[4]) + (z * matrix[8]) + matrix[12];
-        var ty = (x * matrix[1]) + (y * matrix[5]) + (z * matrix[9]) + matrix[13];
-        var tz = (x * matrix[2]) + (y * matrix[6]) + (z * matrix[10]) + matrix[14];
-
-        result[0] = matrix[0];
-        result[1] = matrix[1];
-        result[2] = matrix[2];
-        result[3] = matrix[3];
-        result[4] = matrix[4];
-        result[5] = matrix[5];
-        result[6] = matrix[6];
-        result[7] = matrix[7];
-        result[8] = matrix[8];
-        result[9] = matrix[9];
-        result[10] = matrix[10];
-        result[11] = matrix[11];
-        result[12] = tx;
-        result[13] = ty;
-        result[14] = tz;
-        result[15] = matrix[15];
-        return result;
-    };
-
-    var uniformScaleScratch = new Cartographic.Cartesian3();
-
-    /**
-     * Multiplies an affine transformation matrix (with a bottom row of <code>[0.0, 0.0, 0.0, 1.0]</code>)
-     * by an implicit uniform scale matrix.  This is an optimization
-     * for <code>Matrix4.multiply(m, Matrix4.fromUniformScale(scale), m);</code>, where
-     * <code>m</code> must be an affine matrix.
-     * This function performs fewer allocations and arithmetic operations.
-     *
-     * @param {Matrix4} matrix The affine matrix on the left-hand side.
-     * @param {Number} scale The uniform scale on the right-hand side.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     *
-     * @example
-     * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromUniformScale(scale), m);
-     * Cesium.Matrix4.multiplyByUniformScale(m, scale, m);
-     *
-     * @see Matrix4.fromUniformScale
-     * @see Matrix4.multiplyByScale
-     */
-    Matrix4.multiplyByUniformScale = function(matrix, scale, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.number('scale', scale);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        uniformScaleScratch.x = scale;
-        uniformScaleScratch.y = scale;
-        uniformScaleScratch.z = scale;
-        return Matrix4.multiplyByScale(matrix, uniformScaleScratch, result);
-    };
-
-    /**
-     * Multiplies an affine transformation matrix (with a bottom row of <code>[0.0, 0.0, 0.0, 1.0]</code>)
-     * by an implicit non-uniform scale matrix.  This is an optimization
-     * for <code>Matrix4.multiply(m, Matrix4.fromUniformScale(scale), m);</code>, where
-     * <code>m</code> must be an affine matrix.
-     * This function performs fewer allocations and arithmetic operations.
-     *
-     * @param {Matrix4} matrix The affine matrix on the left-hand side.
-     * @param {Cartesian3} scale The non-uniform scale on the right-hand side.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     *
-     * @example
-     * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromScale(scale), m);
-     * Cesium.Matrix4.multiplyByScale(m, scale, m);
-     *
-     * @see Matrix4.fromScale
-     * @see Matrix4.multiplyByUniformScale
-     */
-    Matrix4.multiplyByScale = function(matrix, scale, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('scale', scale);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var scaleX = scale.x;
-        var scaleY = scale.y;
-        var scaleZ = scale.z;
-
-        // Faster than Cartesian3.equals
-        if ((scaleX === 1.0) && (scaleY === 1.0) && (scaleZ === 1.0)) {
-            return Matrix4.clone(matrix, result);
-        }
-
-        result[0] = scaleX * matrix[0];
-        result[1] = scaleX * matrix[1];
-        result[2] = scaleX * matrix[2];
-        result[3] = 0.0;
-        result[4] = scaleY * matrix[4];
-        result[5] = scaleY * matrix[5];
-        result[6] = scaleY * matrix[6];
-        result[7] = 0.0;
-        result[8] = scaleZ * matrix[8];
-        result[9] = scaleZ * matrix[9];
-        result[10] = scaleZ * matrix[10];
-        result[11] = 0.0;
-        result[12] = matrix[12];
-        result[13] = matrix[13];
-        result[14] = matrix[14];
-        result[15] = 1.0;
-        return result;
-    };
-
-    /**
-     * Computes the product of a matrix and a column vector.
-     *
-     * @param {Matrix4} matrix The matrix.
-     * @param {Cartesian4} cartesian The vector.
-     * @param {Cartesian4} result The object onto which to store the result.
-     * @returns {Cartesian4} The modified result parameter.
-     */
-    Matrix4.multiplyByVector = function(matrix, cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var vX = cartesian.x;
-        var vY = cartesian.y;
-        var vZ = cartesian.z;
-        var vW = cartesian.w;
-
-        var x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ + matrix[12] * vW;
-        var y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ + matrix[13] * vW;
-        var z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ + matrix[14] * vW;
-        var w = matrix[3] * vX + matrix[7] * vY + matrix[11] * vZ + matrix[15] * vW;
-
-        result.x = x;
-        result.y = y;
-        result.z = z;
-        result.w = w;
-        return result;
-    };
-
-    /**
-     * Computes the product of a matrix and a {@link Cartesian3}.  This is equivalent to calling {@link Matrix4.multiplyByVector}
-     * with a {@link Cartesian4} with a <code>w</code> component of zero.
-     *
-     * @param {Matrix4} matrix The matrix.
-     * @param {Cartesian3} cartesian The point.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     *
-     * @example
-     * var p = new Cesium.Cartesian3(1.0, 2.0, 3.0);
-     * var result = Cesium.Matrix4.multiplyByPointAsVector(matrix, p, new Cesium.Cartesian3());
-     * // A shortcut for
-     * //   Cartesian3 p = ...
-     * //   Cesium.Matrix4.multiplyByVector(matrix, new Cesium.Cartesian4(p.x, p.y, p.z, 0.0), result);
-     */
-    Matrix4.multiplyByPointAsVector = function(matrix, cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var vX = cartesian.x;
-        var vY = cartesian.y;
-        var vZ = cartesian.z;
-
-        var x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ;
-        var y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ;
-        var z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ;
-
-        result.x = x;
-        result.y = y;
-        result.z = z;
-        return result;
-    };
-
-    /**
-     * Computes the product of a matrix and a {@link Cartesian3}. This is equivalent to calling {@link Matrix4.multiplyByVector}
-     * with a {@link Cartesian4} with a <code>w</code> component of 1, but returns a {@link Cartesian3} instead of a {@link Cartesian4}.
-     *
-     * @param {Matrix4} matrix The matrix.
-     * @param {Cartesian3} cartesian The point.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     *
-     * @example
-     * var p = new Cesium.Cartesian3(1.0, 2.0, 3.0);
-     * var result = Cesium.Matrix4.multiplyByPoint(matrix, p, new Cesium.Cartesian3());
-     */
-    Matrix4.multiplyByPoint = function(matrix, cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var vX = cartesian.x;
-        var vY = cartesian.y;
-        var vZ = cartesian.z;
-
-        var x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ + matrix[12];
-        var y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ + matrix[13];
-        var z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ + matrix[14];
-
-        result.x = x;
-        result.y = y;
-        result.z = z;
-        return result;
-    };
-
-    /**
-     * Computes the product of a matrix and a scalar.
-     *
-     * @param {Matrix4} matrix The matrix.
-     * @param {Number} scalar The number to multiply by.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     * @example
-     * //create a Matrix4 instance which is a scaled version of the supplied Matrix4
-     * // m = [10.0, 11.0, 12.0, 13.0]
-     * //     [14.0, 15.0, 16.0, 17.0]
-     * //     [18.0, 19.0, 20.0, 21.0]
-     * //     [22.0, 23.0, 24.0, 25.0]
-     *
-     * var a = Cesium.Matrix4.multiplyByScalar(m, -2, new Cesium.Matrix4());
-     *
-     * // m remains the same
-     * // a = [-20.0, -22.0, -24.0, -26.0]
-     * //     [-28.0, -30.0, -32.0, -34.0]
-     * //     [-36.0, -38.0, -40.0, -42.0]
-     * //     [-44.0, -46.0, -48.0, -50.0]
-     */
-    Matrix4.multiplyByScalar = function(matrix, scalar, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.number('scalar', scalar);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result[0] = matrix[0] * scalar;
-        result[1] = matrix[1] * scalar;
-        result[2] = matrix[2] * scalar;
-        result[3] = matrix[3] * scalar;
-        result[4] = matrix[4] * scalar;
-        result[5] = matrix[5] * scalar;
-        result[6] = matrix[6] * scalar;
-        result[7] = matrix[7] * scalar;
-        result[8] = matrix[8] * scalar;
-        result[9] = matrix[9] * scalar;
-        result[10] = matrix[10] * scalar;
-        result[11] = matrix[11] * scalar;
-        result[12] = matrix[12] * scalar;
-        result[13] = matrix[13] * scalar;
-        result[14] = matrix[14] * scalar;
-        result[15] = matrix[15] * scalar;
-        return result;
-    };
-
-    /**
-     * Compute the product of a matrix and a plane.
-     * @param matrix
-     * @param plane
-     * @param result
-     * @returns {*}
-     */
-    Matrix4.multiplyByPlane = function(matrix, plane, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('plane', plane);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var inverseMat = new Matrix4();
-        var invTrans = new Matrix4();
-        Matrix4.inverse(matrix, inverseMat);
-        Matrix4.transpose(inverseMat, invTrans);
-        var v4 = new Cartesian4.Cartesian4(plane.normal.x, plane.normal.y, plane.normal.z, plane.distance);
-        Matrix4.multiplyByVector(invTrans, v4, v4);
-
-        result.normal.x = v4.x;
-        result.normal.y = v4.y;
-        result.normal.z = v4.z;
-        var length = Cartographic.Cartesian3.magnitude(result.normal);
-        Cartographic.Cartesian3.normalize(result.normal, result.normal);
-        result.distance = v4.w / length;
-        return result;
-    };
-
-    /**
-     * Computes a negated copy of the provided matrix.
-     *
-     * @param {Matrix4} matrix The matrix to negate.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     * @example
-     * //create a new Matrix4 instance which is a negation of a Matrix4
-     * // m = [10.0, 11.0, 12.0, 13.0]
-     * //     [14.0, 15.0, 16.0, 17.0]
-     * //     [18.0, 19.0, 20.0, 21.0]
-     * //     [22.0, 23.0, 24.0, 25.0]
-     *
-     * var a = Cesium.Matrix4.negate(m, new Cesium.Matrix4());
-     *
-     * // m remains the same
-     * // a = [-10.0, -11.0, -12.0, -13.0]
-     * //     [-14.0, -15.0, -16.0, -17.0]
-     * //     [-18.0, -19.0, -20.0, -21.0]
-     * //     [-22.0, -23.0, -24.0, -25.0]
-     */
-    Matrix4.negate = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result[0] = -matrix[0];
-        result[1] = -matrix[1];
-        result[2] = -matrix[2];
-        result[3] = -matrix[3];
-        result[4] = -matrix[4];
-        result[5] = -matrix[5];
-        result[6] = -matrix[6];
-        result[7] = -matrix[7];
-        result[8] = -matrix[8];
-        result[9] = -matrix[9];
-        result[10] = -matrix[10];
-        result[11] = -matrix[11];
-        result[12] = -matrix[12];
-        result[13] = -matrix[13];
-        result[14] = -matrix[14];
-        result[15] = -matrix[15];
-        return result;
-    };
-
-    /**
-     * Computes the transpose of the provided matrix.
-     *
-     * @param {Matrix4} matrix The matrix to transpose.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     *
-     * @example
-     * //returns transpose of a Matrix4
-     * // m = [10.0, 11.0, 12.0, 13.0]
-     * //     [14.0, 15.0, 16.0, 17.0]
-     * //     [18.0, 19.0, 20.0, 21.0]
-     * //     [22.0, 23.0, 24.0, 25.0]
-     *
-     * var a = Cesium.Matrix4.transpose(m, new Cesium.Matrix4());
-     *
-     * // m remains the same
-     * // a = [10.0, 14.0, 18.0, 22.0]
-     * //     [11.0, 15.0, 19.0, 23.0]
-     * //     [12.0, 16.0, 20.0, 24.0]
-     * //     [13.0, 17.0, 21.0, 25.0]
-     */
-    Matrix4.transpose = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var matrix1 = matrix[1];
-        var matrix2 = matrix[2];
-        var matrix3 = matrix[3];
-        var matrix6 = matrix[6];
-        var matrix7 = matrix[7];
-        var matrix11 = matrix[11];
-
-        result[0] = matrix[0];
-        result[1] = matrix[4];
-        result[2] = matrix[8];
-        result[3] = matrix[12];
-        result[4] = matrix1;
-        result[5] = matrix[5];
-        result[6] = matrix[9];
-        result[7] = matrix[13];
-        result[8] = matrix2;
-        result[9] = matrix6;
-        result[10] = matrix[10];
-        result[11] = matrix[14];
-        result[12] = matrix3;
-        result[13] = matrix7;
-        result[14] = matrix11;
-        result[15] = matrix[15];
-        return result;
-    };
-
-    /**
-     * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements.
-     *
-     * @param {Matrix4} matrix The matrix with signed elements.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.abs = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result[0] = Math.abs(matrix[0]);
-        result[1] = Math.abs(matrix[1]);
-        result[2] = Math.abs(matrix[2]);
-        result[3] = Math.abs(matrix[3]);
-        result[4] = Math.abs(matrix[4]);
-        result[5] = Math.abs(matrix[5]);
-        result[6] = Math.abs(matrix[6]);
-        result[7] = Math.abs(matrix[7]);
-        result[8] = Math.abs(matrix[8]);
-        result[9] = Math.abs(matrix[9]);
-        result[10] = Math.abs(matrix[10]);
-        result[11] = Math.abs(matrix[11]);
-        result[12] = Math.abs(matrix[12]);
-        result[13] = Math.abs(matrix[13]);
-        result[14] = Math.abs(matrix[14]);
-        result[15] = Math.abs(matrix[15]);
-
-        return result;
-    };
-
-    /**
-     * Compares the provided matrices componentwise and returns
-     * <code>true</code> if they are equal, <code>false</code> otherwise.
-     *
-     * @param {Matrix4} [left] The first matrix.
-     * @param {Matrix4} [right] The second matrix.
-     * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-     *
-     * @example
-     * //compares two Matrix4 instances
-     *
-     * // a = [10.0, 14.0, 18.0, 22.0]
-     * //     [11.0, 15.0, 19.0, 23.0]
-     * //     [12.0, 16.0, 20.0, 24.0]
-     * //     [13.0, 17.0, 21.0, 25.0]
-     *
-     * // b = [10.0, 14.0, 18.0, 22.0]
-     * //     [11.0, 15.0, 19.0, 23.0]
-     * //     [12.0, 16.0, 20.0, 24.0]
-     * //     [13.0, 17.0, 21.0, 25.0]
-     *
-     * if(Cesium.Matrix4.equals(a,b)) {
-     *      console.log("Both matrices are equal");
-     * } else {
-     *      console.log("They are not equal");
-     * }
-     *
-     * //Prints "Both matrices are equal" on the console
-     */
-    Matrix4.equals = function(left, right) {
-        // Given that most matrices will be transformation matrices, the elements
-        // are tested in order such that the test is likely to fail as early
-        // as possible.  I _think_ this is just as friendly to the L1 cache
-        // as testing in index order.  It is certainty faster in practice.
-        return (left === right) ||
-               (when.defined(left) &&
-                when.defined(right) &&
-                // Translation
-                left[12] === right[12] &&
-                left[13] === right[13] &&
-                left[14] === right[14] &&
-
-                // Rotation/scale
-                left[0] === right[0] &&
-                left[1] === right[1] &&
-                left[2] === right[2] &&
-                left[4] === right[4] &&
-                left[5] === right[5] &&
-                left[6] === right[6] &&
-                left[8] === right[8] &&
-                left[9] === right[9] &&
-                left[10] === right[10] &&
-
-                // Bottom row
-                left[3] === right[3] &&
-                left[7] === right[7] &&
-                left[11] === right[11] &&
-                left[15] === right[15]);
-    };
-
-    /**
-     * Compares the provided matrices componentwise and returns
-     * <code>true</code> if they are within the provided epsilon,
-     * <code>false</code> otherwise.
-     *
-     * @param {Matrix4} [left] The first matrix.
-     * @param {Matrix4} [right] The second matrix.
-     * @param {Number} epsilon The epsilon to use for equality testing.
-     * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-     *
-     * @example
-     * //compares two Matrix4 instances
-     *
-     * // a = [10.5, 14.5, 18.5, 22.5]
-     * //     [11.5, 15.5, 19.5, 23.5]
-     * //     [12.5, 16.5, 20.5, 24.5]
-     * //     [13.5, 17.5, 21.5, 25.5]
-     *
-     * // b = [10.0, 14.0, 18.0, 22.0]
-     * //     [11.0, 15.0, 19.0, 23.0]
-     * //     [12.0, 16.0, 20.0, 24.0]
-     * //     [13.0, 17.0, 21.0, 25.0]
-     *
-     * if(Cesium.Matrix4.equalsEpsilon(a,b,0.1)){
-     *      console.log("Difference between both the matrices is less than 0.1");
-     * } else {
-     *      console.log("Difference between both the matrices is not less than 0.1");
-     * }
-     *
-     * //Prints "Difference between both the matrices is not less than 0.1" on the console
-     */
-    Matrix4.equalsEpsilon = function(left, right, epsilon) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('epsilon', epsilon);
-        //>>includeEnd('debug');
-
-        return (left === right) ||
-                (when.defined(left) &&
-                when.defined(right) &&
-                Math.abs(left[0] - right[0]) <= epsilon &&
-                Math.abs(left[1] - right[1]) <= epsilon &&
-                Math.abs(left[2] - right[2]) <= epsilon &&
-                Math.abs(left[3] - right[3]) <= epsilon &&
-                Math.abs(left[4] - right[4]) <= epsilon &&
-                Math.abs(left[5] - right[5]) <= epsilon &&
-                Math.abs(left[6] - right[6]) <= epsilon &&
-                Math.abs(left[7] - right[7]) <= epsilon &&
-                Math.abs(left[8] - right[8]) <= epsilon &&
-                Math.abs(left[9] - right[9]) <= epsilon &&
-                Math.abs(left[10] - right[10]) <= epsilon &&
-                Math.abs(left[11] - right[11]) <= epsilon &&
-                Math.abs(left[12] - right[12]) <= epsilon &&
-                Math.abs(left[13] - right[13]) <= epsilon &&
-                Math.abs(left[14] - right[14]) <= epsilon &&
-                Math.abs(left[15] - right[15]) <= epsilon);
-    };
-
-    /**
-     * Gets the translation portion of the provided matrix, assuming the matrix is a affine transformation matrix.
-     *
-     * @param {Matrix4} matrix The matrix to use.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Matrix4.getTranslation = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = matrix[12];
-        result.y = matrix[13];
-        result.z = matrix[14];
-        return result;
-    };
-
-    /**
-     * Gets the upper left 3x3 rotation matrix of the provided matrix, assuming the matrix is an affine transformation matrix.
-     *
-     * @param {Matrix4} matrix The matrix to use.
-     * @param {Matrix3} result The object onto which to store the result.
-     * @returns {Matrix3} The modified result parameter.
-     *
-     * @example
-     * // returns a Matrix3 instance from a Matrix4 instance
-     *
-     * // m = [10.0, 14.0, 18.0, 22.0]
-     * //     [11.0, 15.0, 19.0, 23.0]
-     * //     [12.0, 16.0, 20.0, 24.0]
-     * //     [13.0, 17.0, 21.0, 25.0]
-     *
-     * var b = new Cesium.Matrix3();
-     * Cesium.Matrix4.getMatrix3(m,b);
-     *
-     * // b = [10.0, 14.0, 18.0]
-     * //     [11.0, 15.0, 19.0]
-     * //     [12.0, 16.0, 20.0]
-     */
-    Matrix4.getMatrix3 = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result[0] = matrix[0];
-        result[1] = matrix[1];
-        result[2] = matrix[2];
-        result[3] = matrix[4];
-        result[4] = matrix[5];
-        result[5] = matrix[6];
-        result[6] = matrix[8];
-        result[7] = matrix[9];
-        result[8] = matrix[10];
-        return result;
-    };
-
-    /**
-     * Gets the upper left 3x3 rotation matrix of the provided matrix, assuming the matrix is a affine transformation matrix.
-     *
-     * @param {Matrix4} matrix The matrix to use.
-     * @param {Matrix3} result The object onto which to store the result.
-     * @returns {Matrix3} The modified result parameter.
-     *
-     * @example
-     * // returns a Matrix3 instance from a Matrix4 instance
-     *
-     * // m = [10.0, 14.0, 18.0, 22.0]
-     * //     [11.0, 15.0, 19.0, 23.0]
-     * //     [12.0, 16.0, 20.0, 24.0]
-     * //     [13.0, 17.0, 21.0, 25.0]
-     *
-     * var b = new Cesium.Matrix3();
-     * Cesium.Matrix4.getRotation(m,b);
-     *
-     * // b = [10.0, 14.0, 18.0]
-     * //     [11.0, 15.0, 19.0]
-     * //     [12.0, 16.0, 20.0]
-     */
-    Matrix4.getRotation = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result[0] = matrix[0];
-        result[1] = matrix[1];
-        result[2] = matrix[2];
-        result[3] = matrix[4];
-        result[4] = matrix[5];
-        result[5] = matrix[6];
-        result[6] = matrix[8];
-        result[7] = matrix[9];
-        result[8] = matrix[10];
-        return result;
-    };
-
-    var scratchInverseRotation = new Matrix3();
-    var scratchMatrix3Zero = new Matrix3();
-    var scratchBottomRow = new Cartesian4.Cartesian4();
-    var scratchExpectedBottomRow = new Cartesian4.Cartesian4(0.0, 0.0, 0.0, 1.0);
-
-     /**
-      * Computes the inverse of the provided matrix using Cramers Rule.
-      * If the determinant is zero, the matrix can not be inverted, and an exception is thrown.
-      * If the matrix is an affine transformation matrix, it is more efficient
-      * to invert it with {@link Matrix4.inverseTransformation}.
-      *
-      * @param {Matrix4} matrix The matrix to invert.
-      * @param {Matrix4} result The object onto which to store the result.
-      * @returns {Matrix4} The modified result parameter.
-      *
-      * @exception {RuntimeError} matrix is not invertible because its determinate is zero.
-      */
-    Matrix4.inverse = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-        //
-        // Ported from:
-        //   ftp://download.intel.com/design/PentiumIII/sml/24504301.pdf
-        //
-        var src0 = matrix[0];
-        var src1 = matrix[4];
-        var src2 = matrix[8];
-        var src3 = matrix[12];
-        var src4 = matrix[1];
-        var src5 = matrix[5];
-        var src6 = matrix[9];
-        var src7 = matrix[13];
-        var src8 = matrix[2];
-        var src9 = matrix[6];
-        var src10 = matrix[10];
-        var src11 = matrix[14];
-        var src12 = matrix[3];
-        var src13 = matrix[7];
-        var src14 = matrix[11];
-        var src15 = matrix[15];
-
-        // calculate pairs for first 8 elements (cofactors)
-        var tmp0 = src10 * src15;
-        var tmp1 = src11 * src14;
-        var tmp2 = src9 * src15;
-        var tmp3 = src11 * src13;
-        var tmp4 = src9 * src14;
-        var tmp5 = src10 * src13;
-        var tmp6 = src8 * src15;
-        var tmp7 = src11 * src12;
-        var tmp8 = src8 * src14;
-        var tmp9 = src10 * src12;
-        var tmp10 = src8 * src13;
-        var tmp11 = src9 * src12;
-
-        // calculate first 8 elements (cofactors)
-        var dst0 = (tmp0 * src5 + tmp3 * src6 + tmp4 * src7) - (tmp1 * src5 + tmp2 * src6 + tmp5 * src7);
-        var dst1 = (tmp1 * src4 + tmp6 * src6 + tmp9 * src7) - (tmp0 * src4 + tmp7 * src6 + tmp8 * src7);
-        var dst2 = (tmp2 * src4 + tmp7 * src5 + tmp10 * src7) - (tmp3 * src4 + tmp6 * src5 + tmp11 * src7);
-        var dst3 = (tmp5 * src4 + tmp8 * src5 + tmp11 * src6) - (tmp4 * src4 + tmp9 * src5 + tmp10 * src6);
-        var dst4 = (tmp1 * src1 + tmp2 * src2 + tmp5 * src3) - (tmp0 * src1 + tmp3 * src2 + tmp4 * src3);
-        var dst5 = (tmp0 * src0 + tmp7 * src2 + tmp8 * src3) - (tmp1 * src0 + tmp6 * src2 + tmp9 * src3);
-        var dst6 = (tmp3 * src0 + tmp6 * src1 + tmp11 * src3) - (tmp2 * src0 + tmp7 * src1 + tmp10 * src3);
-        var dst7 = (tmp4 * src0 + tmp9 * src1 + tmp10 * src2) - (tmp5 * src0 + tmp8 * src1 + tmp11 * src2);
-
-        // calculate pairs for second 8 elements (cofactors)
-        tmp0 = src2 * src7;
-        tmp1 = src3 * src6;
-        tmp2 = src1 * src7;
-        tmp3 = src3 * src5;
-        tmp4 = src1 * src6;
-        tmp5 = src2 * src5;
-        tmp6 = src0 * src7;
-        tmp7 = src3 * src4;
-        tmp8 = src0 * src6;
-        tmp9 = src2 * src4;
-        tmp10 = src0 * src5;
-        tmp11 = src1 * src4;
-
-        // calculate second 8 elements (cofactors)
-        var dst8 = (tmp0 * src13 + tmp3 * src14 + tmp4 * src15) - (tmp1 * src13 + tmp2 * src14 + tmp5 * src15);
-        var dst9 = (tmp1 * src12 + tmp6 * src14 + tmp9 * src15) - (tmp0 * src12 + tmp7 * src14 + tmp8 * src15);
-        var dst10 = (tmp2 * src12 + tmp7 * src13 + tmp10 * src15) - (tmp3 * src12 + tmp6 * src13 + tmp11 * src15);
-        var dst11 = (tmp5 * src12 + tmp8 * src13 + tmp11 * src14) - (tmp4 * src12 + tmp9 * src13 + tmp10 * src14);
-        var dst12 = (tmp2 * src10 + tmp5 * src11 + tmp1 * src9) - (tmp4 * src11 + tmp0 * src9 + tmp3 * src10);
-        var dst13 = (tmp8 * src11 + tmp0 * src8 + tmp7 * src10) - (tmp6 * src10 + tmp9 * src11 + tmp1 * src8);
-        var dst14 = (tmp6 * src9 + tmp11 * src11 + tmp3 * src8) - (tmp10 * src11 + tmp2 * src8 + tmp7 * src9);
-        var dst15 = (tmp10 * src10 + tmp4 * src8 + tmp9 * src9) - (tmp8 * src9 + tmp11 * src10 + tmp5 * src8);
-
-        // calculate determinant
-        var det = src0 * dst0 + src1 * dst1 + src2 * dst2 + src3 * dst3;
-
-        if (Math.abs(det) < _Math.CesiumMath.EPSILON21) {
-                // Special case for a zero scale matrix that can occur, for example,
-                // when a model's node has a [0, 0, 0] scale.
-                if (Matrix3.equalsEpsilon(Matrix4.getRotation(matrix, scratchInverseRotation), scratchMatrix3Zero, _Math.CesiumMath.EPSILON7) &&
-                Cartesian4.Cartesian4.equals(Matrix4.getRow(matrix, 3, scratchBottomRow), scratchExpectedBottomRow)) {
-
-                result[0] = 0.0;
-                result[1] = 0.0;
-                result[2] = 0.0;
-                result[3] = 0.0;
-                result[4] = 0.0;
-                result[5] = 0.0;
-                result[6] = 0.0;
-                result[7] = 0.0;
-                result[8] = 0.0;
-                result[9] = 0.0;
-                result[10] = 0.0;
-                result[11] = 0.0;
-                result[12] = -matrix[12];
-                result[13] = -matrix[13];
-                result[14] = -matrix[14];
-                result[15] = 1.0;
-                return result;
-            }
-
-            throw new RuntimeError.RuntimeError('matrix is not invertible because its determinate is zero.');
-        }
-
-        // calculate matrix inverse
-        det = 1.0 / det;
-
-        result[0] = dst0 * det;
-        result[1] = dst1 * det;
-        result[2] = dst2 * det;
-        result[3] = dst3 * det;
-        result[4] = dst4 * det;
-        result[5] = dst5 * det;
-        result[6] = dst6 * det;
-        result[7] = dst7 * det;
-        result[8] = dst8 * det;
-        result[9] = dst9 * det;
-        result[10] = dst10 * det;
-        result[11] = dst11 * det;
-        result[12] = dst12 * det;
-        result[13] = dst13 * det;
-        result[14] = dst14 * det;
-        result[15] = dst15 * det;
-        return result;
-    };
-
-    /**
-     * Computes the inverse of the provided matrix assuming it is
-     * an affine transformation matrix, where the upper left 3x3 elements
-     * are a rotation matrix, and the upper three elements in the fourth
-     * column are the translation.  The bottom row is assumed to be [0, 0, 0, 1].
-     * The matrix is not verified to be in the proper form.
-     * This method is faster than computing the inverse for a general 4x4
-     * matrix using {@link Matrix4.inverse}.
-     *
-     * @param {Matrix4} matrix The matrix to invert.
-     * @param {Matrix4} result The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter.
-     */
-    Matrix4.inverseTransformation = function(matrix, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('matrix', matrix);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        //This function is an optimized version of the below 4 lines.
-        //var rT = Matrix3.transpose(Matrix4.getRotation(matrix));
-        //var rTN = Matrix3.negate(rT);
-        //var rTT = Matrix3.multiplyByVector(rTN, Matrix4.getTranslation(matrix));
-        //return Matrix4.fromRotationTranslation(rT, rTT, result);
-
-        var matrix0 = matrix[0];
-        var matrix1 = matrix[1];
-        var matrix2 = matrix[2];
-        var matrix4 = matrix[4];
-        var matrix5 = matrix[5];
-        var matrix6 = matrix[6];
-        var matrix8 = matrix[8];
-        var matrix9 = matrix[9];
-        var matrix10 = matrix[10];
-
-        var vX = matrix[12];
-        var vY = matrix[13];
-        var vZ = matrix[14];
-
-        var x = -matrix0 * vX - matrix1 * vY - matrix2 * vZ;
-        var y = -matrix4 * vX - matrix5 * vY - matrix6 * vZ;
-        var z = -matrix8 * vX - matrix9 * vY - matrix10 * vZ;
-
-        result[0] = matrix0;
-        result[1] = matrix4;
-        result[2] = matrix8;
-        result[3] = 0.0;
-        result[4] = matrix1;
-        result[5] = matrix5;
-        result[6] = matrix9;
-        result[7] = 0.0;
-        result[8] = matrix2;
-        result[9] = matrix6;
-        result[10] = matrix10;
-        result[11] = 0.0;
-        result[12] = x;
-        result[13] = y;
-        result[14] = z;
-        result[15] = 1.0;
-        return result;
-    };
-
-    /**
-     * An immutable Matrix4 instance initialized to the identity matrix.
-     *
-     * @type {Matrix4}
-     * @constant
-     */
-    Matrix4.IDENTITY = Object.freeze(new Matrix4(1.0, 0.0, 0.0, 0.0,
-                                                0.0, 1.0, 0.0, 0.0,
-                                                0.0, 0.0, 1.0, 0.0,
-                                                0.0, 0.0, 0.0, 1.0));
-
-    /**
-     * An immutable Matrix4 instance initialized to the zero matrix.
-     *
-     * @type {Matrix4}
-     * @constant
-     */
-    Matrix4.ZERO = Object.freeze(new Matrix4(0.0, 0.0, 0.0, 0.0,
-                                            0.0, 0.0, 0.0, 0.0,
-                                            0.0, 0.0, 0.0, 0.0,
-                                            0.0, 0.0, 0.0, 0.0));
-
-    /**
-     * The index into Matrix4 for column 0, row 0.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN0ROW0 = 0;
-
-    /**
-     * The index into Matrix4 for column 0, row 1.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN0ROW1 = 1;
-
-    /**
-     * The index into Matrix4 for column 0, row 2.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN0ROW2 = 2;
-
-    /**
-     * The index into Matrix4 for column 0, row 3.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN0ROW3 = 3;
-
-    /**
-     * The index into Matrix4 for column 1, row 0.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN1ROW0 = 4;
-
-    /**
-     * The index into Matrix4 for column 1, row 1.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN1ROW1 = 5;
-
-    /**
-     * The index into Matrix4 for column 1, row 2.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN1ROW2 = 6;
-
-    /**
-     * The index into Matrix4 for column 1, row 3.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN1ROW3 = 7;
-
-    /**
-     * The index into Matrix4 for column 2, row 0.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN2ROW0 = 8;
-
-    /**
-     * The index into Matrix4 for column 2, row 1.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN2ROW1 = 9;
-
-    /**
-     * The index into Matrix4 for column 2, row 2.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN2ROW2 = 10;
-
-    /**
-     * The index into Matrix4 for column 2, row 3.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN2ROW3 = 11;
-
-    /**
-     * The index into Matrix4 for column 3, row 0.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN3ROW0 = 12;
-
-    /**
-     * The index into Matrix4 for column 3, row 1.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN3ROW1 = 13;
-
-    /**
-     * The index into Matrix4 for column 3, row 2.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN3ROW2 = 14;
-
-    /**
-     * The index into Matrix4 for column 3, row 3.
-     *
-     * @type {Number}
-     * @constant
-     */
-    Matrix4.COLUMN3ROW3 = 15;
-
-    Object.defineProperties(Matrix4.prototype, {
-        /**
-         * Gets the number of items in the collection.
-         * @memberof Matrix4.prototype
-         *
-         * @type {Number}
-         */
-        length : {
-            get : function() {
-                return Matrix4.packedLength;
-            }
-        }
-    });
-
-    /**
-     * Duplicates the provided Matrix4 instance.
-     *
-     * @param {Matrix4} [result] The object onto which to store the result.
-     * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if one was not provided.
-     */
-    Matrix4.prototype.clone = function(result) {
-        return Matrix4.clone(this, result);
-    };
-
-    /**
-     * Compares this matrix to the provided matrix componentwise and returns
-     * <code>true</code> if they are equal, <code>false</code> otherwise.
-     *
-     * @param {Matrix4} [right] The right hand side matrix.
-     * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-     */
-    Matrix4.prototype.equals = function(right) {
-        return Matrix4.equals(this, right);
-    };
-
-    /**
-     * @private
-     */
-    Matrix4.equalsArray = function(matrix, array, offset) {
-        return matrix[0] === array[offset] &&
-               matrix[1] === array[offset + 1] &&
-               matrix[2] === array[offset + 2] &&
-               matrix[3] === array[offset + 3] &&
-               matrix[4] === array[offset + 4] &&
-               matrix[5] === array[offset + 5] &&
-               matrix[6] === array[offset + 6] &&
-               matrix[7] === array[offset + 7] &&
-               matrix[8] === array[offset + 8] &&
-               matrix[9] === array[offset + 9] &&
-               matrix[10] === array[offset + 10] &&
-               matrix[11] === array[offset + 11] &&
-               matrix[12] === array[offset + 12] &&
-               matrix[13] === array[offset + 13] &&
-               matrix[14] === array[offset + 14] &&
-               matrix[15] === array[offset + 15];
-    };
-
-    /**
-     * Compares this matrix to the provided matrix componentwise and returns
-     * <code>true</code> if they are within the provided epsilon,
-     * <code>false</code> otherwise.
-     *
-     * @param {Matrix4} [right] The right hand side matrix.
-     * @param {Number} epsilon The epsilon to use for equality testing.
-     * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.
-     */
-    Matrix4.prototype.equalsEpsilon = function(right, epsilon) {
-        return Matrix4.equalsEpsilon(this, right, epsilon);
-    };
-
-    /**
-     * Computes a string representing this Matrix with each row being
-     * on a separate line and in the format '(column0, column1, column2, column3)'.
-     *
-     * @returns {String} A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1, column2, column3)'.
-     */
-    Matrix4.prototype.toString = function() {
-        return '(' + this[0] + ', ' + this[4] + ', ' + this[8] + ', ' + this[12] +')\n' +
-               '(' + this[1] + ', ' + this[5] + ', ' + this[9] + ', ' + this[13] +')\n' +
-               '(' + this[2] + ', ' + this[6] + ', ' + this[10] + ', ' + this[14] +')\n' +
-               '(' + this[3] + ', ' + this[7] + ', ' + this[11] + ', ' + this[15] +')';
-    };
-
-    /**
-         * A bounding sphere with a center and a radius.
-         * @alias BoundingSphere
-         * @constructor
-         *
-         * @param {Cartesian3} [center=Cartesian3.ZERO] The center of the bounding sphere.
-         * @param {Number} [radius=0.0] The radius of the bounding sphere.
-         *
-         * @see AxisAlignedBoundingBox
-         * @see BoundingRectangle
-         * @see Packable
-         */
-        function BoundingSphere(center, radius) {
-            /**
-             * The center point of the sphere.
-             * @type {Cartesian3}
-             * @default {@link Cartesian3.ZERO}
-             */
-            this.center = Cartographic.Cartesian3.clone(when.defaultValue(center, Cartographic.Cartesian3.ZERO));
-
-            /**
-             * The radius of the sphere.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.radius = when.defaultValue(radius, 0.0);
-        }
-
-        var fromPointsXMin = new Cartographic.Cartesian3();
-        var fromPointsYMin = new Cartographic.Cartesian3();
-        var fromPointsZMin = new Cartographic.Cartesian3();
-        var fromPointsXMax = new Cartographic.Cartesian3();
-        var fromPointsYMax = new Cartographic.Cartesian3();
-        var fromPointsZMax = new Cartographic.Cartesian3();
-        var fromPointsCurrentPos = new Cartographic.Cartesian3();
-        var fromPointsScratch = new Cartographic.Cartesian3();
-        var fromPointsRitterCenter = new Cartographic.Cartesian3();
-        var fromPointsMinBoxPt = new Cartographic.Cartesian3();
-        var fromPointsMaxBoxPt = new Cartographic.Cartesian3();
-        var fromPointsNaiveCenterScratch = new Cartographic.Cartesian3();
-        var volumeConstant = (4.0 / 3.0) * _Math.CesiumMath.PI;
-
-        /**
-         * Computes a tight-fitting bounding sphere enclosing a list of 3D Cartesian points.
-         * The bounding sphere is computed by running two algorithms, a naive algorithm and
-         * Ritter's algorithm. The smaller of the two spheres is used to ensure a tight fit.
-         *
-         * @param {Cartesian3[]} [positions] An array of points that the bounding sphere will enclose.  Each point must have <code>x</code>, <code>y</code>, and <code>z</code> properties.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if one was not provided.
-         *
-         * @see {@link http://help.agi.com/AGIComponents/html/BlogBoundingSphere.htm|Bounding Sphere computation article}
-         */
-        BoundingSphere.fromPoints = function(positions, result) {
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            if (!when.defined(positions) || positions.length === 0) {
-                result.center = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.center);
-                result.radius = 0.0;
-                return result;
-            }
-
-            var currentPos = Cartographic.Cartesian3.clone(positions[0], fromPointsCurrentPos);
-
-            var xMin = Cartographic.Cartesian3.clone(currentPos, fromPointsXMin);
-            var yMin = Cartographic.Cartesian3.clone(currentPos, fromPointsYMin);
-            var zMin = Cartographic.Cartesian3.clone(currentPos, fromPointsZMin);
-
-            var xMax = Cartographic.Cartesian3.clone(currentPos, fromPointsXMax);
-            var yMax = Cartographic.Cartesian3.clone(currentPos, fromPointsYMax);
-            var zMax = Cartographic.Cartesian3.clone(currentPos, fromPointsZMax);
-
-            var numPositions = positions.length;
-            var i;
-            for (i = 1; i < numPositions; i++) {
-                Cartographic.Cartesian3.clone(positions[i], currentPos);
-
-                var x = currentPos.x;
-                var y = currentPos.y;
-                var z = currentPos.z;
-
-                // Store points containing the the smallest and largest components
-                if (x < xMin.x) {
-                    Cartographic.Cartesian3.clone(currentPos, xMin);
-                }
-
-                if (x > xMax.x) {
-                    Cartographic.Cartesian3.clone(currentPos, xMax);
-                }
-
-                if (y < yMin.y) {
-                    Cartographic.Cartesian3.clone(currentPos, yMin);
-                }
-
-                if (y > yMax.y) {
-                    Cartographic.Cartesian3.clone(currentPos, yMax);
-                }
-
-                if (z < zMin.z) {
-                    Cartographic.Cartesian3.clone(currentPos, zMin);
-                }
-
-                if (z > zMax.z) {
-                    Cartographic.Cartesian3.clone(currentPos, zMax);
-                }
-            }
-
-            // Compute x-, y-, and z-spans (Squared distances b/n each component's min. and max.).
-            var xSpan = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(xMax, xMin, fromPointsScratch));
-            var ySpan = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(yMax, yMin, fromPointsScratch));
-            var zSpan = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(zMax, zMin, fromPointsScratch));
-
-            // Set the diameter endpoints to the largest span.
-            var diameter1 = xMin;
-            var diameter2 = xMax;
-            var maxSpan = xSpan;
-            if (ySpan > maxSpan) {
-                maxSpan = ySpan;
-                diameter1 = yMin;
-                diameter2 = yMax;
-            }
-            if (zSpan > maxSpan) {
-                maxSpan = zSpan;
-                diameter1 = zMin;
-                diameter2 = zMax;
-            }
-
-            // Calculate the center of the initial sphere found by Ritter's algorithm
-            var ritterCenter = fromPointsRitterCenter;
-            ritterCenter.x = (diameter1.x + diameter2.x) * 0.5;
-            ritterCenter.y = (diameter1.y + diameter2.y) * 0.5;
-            ritterCenter.z = (diameter1.z + diameter2.z) * 0.5;
-
-            // Calculate the radius of the initial sphere found by Ritter's algorithm
-            var radiusSquared = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(diameter2, ritterCenter, fromPointsScratch));
-            var ritterRadius = Math.sqrt(radiusSquared);
-
-            // Find the center of the sphere found using the Naive method.
-            var minBoxPt = fromPointsMinBoxPt;
-            minBoxPt.x = xMin.x;
-            minBoxPt.y = yMin.y;
-            minBoxPt.z = zMin.z;
-
-            var maxBoxPt = fromPointsMaxBoxPt;
-            maxBoxPt.x = xMax.x;
-            maxBoxPt.y = yMax.y;
-            maxBoxPt.z = zMax.z;
-
-            var naiveCenter = Cartographic.Cartesian3.midpoint(minBoxPt, maxBoxPt, fromPointsNaiveCenterScratch);
-
-            // Begin 2nd pass to find naive radius and modify the ritter sphere.
-            var naiveRadius = 0;
-            for (i = 0; i < numPositions; i++) {
-                Cartographic.Cartesian3.clone(positions[i], currentPos);
-
-                // Find the furthest point from the naive center to calculate the naive radius.
-                var r = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.subtract(currentPos, naiveCenter, fromPointsScratch));
-                if (r > naiveRadius) {
-                    naiveRadius = r;
-                }
-
-                // Make adjustments to the Ritter Sphere to include all points.
-                var oldCenterToPointSquared = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(currentPos, ritterCenter, fromPointsScratch));
-                if (oldCenterToPointSquared > radiusSquared) {
-                    var oldCenterToPoint = Math.sqrt(oldCenterToPointSquared);
-                    // Calculate new radius to include the point that lies outside
-                    ritterRadius = (ritterRadius + oldCenterToPoint) * 0.5;
-                    radiusSquared = ritterRadius * ritterRadius;
-                    // Calculate center of new Ritter sphere
-                    var oldToNew = oldCenterToPoint - ritterRadius;
-                    ritterCenter.x = (ritterRadius * ritterCenter.x + oldToNew * currentPos.x) / oldCenterToPoint;
-                    ritterCenter.y = (ritterRadius * ritterCenter.y + oldToNew * currentPos.y) / oldCenterToPoint;
-                    ritterCenter.z = (ritterRadius * ritterCenter.z + oldToNew * currentPos.z) / oldCenterToPoint;
-                }
-            }
-
-            if (ritterRadius < naiveRadius) {
-                Cartographic.Cartesian3.clone(ritterCenter, result.center);
-                result.radius = ritterRadius;
-            } else {
-                Cartographic.Cartesian3.clone(naiveCenter, result.center);
-                result.radius = naiveRadius;
-            }
-
-            return result;
-        };
-
-        var defaultProjection = new GeographicProjection();
-        var fromRectangle2DLowerLeft = new Cartographic.Cartesian3();
-        var fromRectangle2DUpperRight = new Cartographic.Cartesian3();
-        var fromRectangle2DSouthwest = new Cartographic.Cartographic();
-        var fromRectangle2DNortheast = new Cartographic.Cartographic();
-
-        /**
-         * Computes a bounding sphere from a rectangle projected in 2D.
-         *
-         * @param {Rectangle} [rectangle] The rectangle around which to create a bounding sphere.
-         * @param {Object} [projection=GeographicProjection] The projection used to project the rectangle into 2D.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.fromRectangle2D = function(rectangle, projection, result) {
-            return BoundingSphere.fromRectangleWithHeights2D(rectangle, projection, 0.0, 0.0, result);
-        };
-
-        /**
-         * Computes a bounding sphere from a rectangle projected in 2D.  The bounding sphere accounts for the
-         * object's minimum and maximum heights over the rectangle.
-         *
-         * @param {Rectangle} [rectangle] The rectangle around which to create a bounding sphere.
-         * @param {Object} [projection=GeographicProjection] The projection used to project the rectangle into 2D.
-         * @param {Number} [minimumHeight=0.0] The minimum height over the rectangle.
-         * @param {Number} [maximumHeight=0.0] The maximum height over the rectangle.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.fromRectangleWithHeights2D = function(rectangle, projection, minimumHeight, maximumHeight, result) {
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            if (!when.defined(rectangle)) {
-                result.center = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.center);
-                result.radius = 0.0;
-                return result;
-            }
-
-            projection = when.defaultValue(projection, defaultProjection);
-
-            Cartesian2.Rectangle.southwest(rectangle, fromRectangle2DSouthwest);
-            fromRectangle2DSouthwest.height = minimumHeight;
-            Cartesian2.Rectangle.northeast(rectangle, fromRectangle2DNortheast);
-            fromRectangle2DNortheast.height = maximumHeight;
-
-            var lowerLeft = projection.project(fromRectangle2DSouthwest, fromRectangle2DLowerLeft);
-            var upperRight = projection.project(fromRectangle2DNortheast, fromRectangle2DUpperRight);
-
-            var width = upperRight.x - lowerLeft.x;
-            var height = upperRight.y - lowerLeft.y;
-            var elevation = upperRight.z - lowerLeft.z;
-
-            result.radius = Math.sqrt(width * width + height * height + elevation * elevation) * 0.5;
-            var center = result.center;
-            center.x = lowerLeft.x + width * 0.5;
-            center.y = lowerLeft.y + height * 0.5;
-            center.z = lowerLeft.z + elevation * 0.5;
-            return result;
-        };
-
-        var fromRectangle3DScratch = [];
-
-        /**
-         * Computes a bounding sphere from a rectangle in 3D. The bounding sphere is created using a subsample of points
-         * on the ellipsoid and contained in the rectangle. It may not be accurate for all rectangles on all types of ellipsoids.
-         *
-         * @param {Rectangle} [rectangle] The valid rectangle used to create a bounding sphere.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid used to determine positions of the rectangle.
-         * @param {Number} [surfaceHeight=0.0] The height above the surface of the ellipsoid.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.fromRectangle3D = function(rectangle, ellipsoid, surfaceHeight, result) {
-            ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            surfaceHeight = when.defaultValue(surfaceHeight, 0.0);
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            if (!when.defined(rectangle)) {
-                result.center = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.center);
-                result.radius = 0.0;
-                return result;
-            }
-
-            var positions = Cartesian2.Rectangle.subsample(rectangle, ellipsoid, surfaceHeight, fromRectangle3DScratch);
-            return BoundingSphere.fromPoints(positions, result);
-        };
-
-        /**
-         * Computes a tight-fitting bounding sphere enclosing a list of 3D points, where the points are
-         * stored in a flat array in X, Y, Z, order.  The bounding sphere is computed by running two
-         * algorithms, a naive algorithm and Ritter's algorithm. The smaller of the two spheres is used to
-         * ensure a tight fit.
-         *
-         * @param {Number[]} [positions] An array of points that the bounding sphere will enclose.  Each point
-         *        is formed from three elements in the array in the order X, Y, Z.
-         * @param {Cartesian3} [center=Cartesian3.ZERO] The position to which the positions are relative, which need not be the
-         *        origin of the coordinate system.  This is useful when the positions are to be used for
-         *        relative-to-center (RTC) rendering.
-         * @param {Number} [stride=3] The number of array elements per vertex.  It must be at least 3, but it may
-         *        be higher.  Regardless of the value of this parameter, the X coordinate of the first position
-         *        is at array index 0, the Y coordinate is at array index 1, and the Z coordinate is at array index
-         *        2.  When stride is 3, the X coordinate of the next position then begins at array index 3.  If
-         *        the stride is 5, however, two array elements are skipped and the next position begins at array
-         *        index 5.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if one was not provided.
-         *
-         * @example
-         * // Compute the bounding sphere from 3 positions, each specified relative to a center.
-         * // In addition to the X, Y, and Z coordinates, the points array contains two additional
-         * // elements per point which are ignored for the purpose of computing the bounding sphere.
-         * var center = new Cesium.Cartesian3(1.0, 2.0, 3.0);
-         * var points = [1.0, 2.0, 3.0, 0.1, 0.2,
-         *               4.0, 5.0, 6.0, 0.1, 0.2,
-         *               7.0, 8.0, 9.0, 0.1, 0.2];
-         * var sphere = Cesium.BoundingSphere.fromVertices(points, center, 5);
-         *
-         * @see {@link http://blogs.agi.com/insight3d/index.php/2008/02/04/a-bounding/|Bounding Sphere computation article}
-         */
-        BoundingSphere.fromVertices = function(positions, center, stride, result) {
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            if (!when.defined(positions) || positions.length === 0) {
-                result.center = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.center);
-                result.radius = 0.0;
-                return result;
-            }
-
-            center = when.defaultValue(center, Cartographic.Cartesian3.ZERO);
-
-            stride = when.defaultValue(stride, 3);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number.greaterThanOrEquals('stride', stride, 3);
-            //>>includeEnd('debug');
-
-            var currentPos = fromPointsCurrentPos;
-            currentPos.x = positions[0] + center.x;
-            currentPos.y = positions[1] + center.y;
-            currentPos.z = positions[2] + center.z;
-
-            var xMin = Cartographic.Cartesian3.clone(currentPos, fromPointsXMin);
-            var yMin = Cartographic.Cartesian3.clone(currentPos, fromPointsYMin);
-            var zMin = Cartographic.Cartesian3.clone(currentPos, fromPointsZMin);
-
-            var xMax = Cartographic.Cartesian3.clone(currentPos, fromPointsXMax);
-            var yMax = Cartographic.Cartesian3.clone(currentPos, fromPointsYMax);
-            var zMax = Cartographic.Cartesian3.clone(currentPos, fromPointsZMax);
-
-            var numElements = positions.length;
-            var i;
-            for (i = 0; i < numElements; i += stride) {
-                var x = positions[i] + center.x;
-                var y = positions[i + 1] + center.y;
-                var z = positions[i + 2] + center.z;
-
-                currentPos.x = x;
-                currentPos.y = y;
-                currentPos.z = z;
-
-                // Store points containing the the smallest and largest components
-                if (x < xMin.x) {
-                    Cartographic.Cartesian3.clone(currentPos, xMin);
-                }
-
-                if (x > xMax.x) {
-                    Cartographic.Cartesian3.clone(currentPos, xMax);
-                }
-
-                if (y < yMin.y) {
-                    Cartographic.Cartesian3.clone(currentPos, yMin);
-                }
-
-                if (y > yMax.y) {
-                    Cartographic.Cartesian3.clone(currentPos, yMax);
-                }
-
-                if (z < zMin.z) {
-                    Cartographic.Cartesian3.clone(currentPos, zMin);
-                }
-
-                if (z > zMax.z) {
-                    Cartographic.Cartesian3.clone(currentPos, zMax);
-                }
-            }
-
-            // Compute x-, y-, and z-spans (Squared distances b/n each component's min. and max.).
-            var xSpan = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(xMax, xMin, fromPointsScratch));
-            var ySpan = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(yMax, yMin, fromPointsScratch));
-            var zSpan = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(zMax, zMin, fromPointsScratch));
-
-            // Set the diameter endpoints to the largest span.
-            var diameter1 = xMin;
-            var diameter2 = xMax;
-            var maxSpan = xSpan;
-            if (ySpan > maxSpan) {
-                maxSpan = ySpan;
-                diameter1 = yMin;
-                diameter2 = yMax;
-            }
-            if (zSpan > maxSpan) {
-                maxSpan = zSpan;
-                diameter1 = zMin;
-                diameter2 = zMax;
-            }
-
-            // Calculate the center of the initial sphere found by Ritter's algorithm
-            var ritterCenter = fromPointsRitterCenter;
-            ritterCenter.x = (diameter1.x + diameter2.x) * 0.5;
-            ritterCenter.y = (diameter1.y + diameter2.y) * 0.5;
-            ritterCenter.z = (diameter1.z + diameter2.z) * 0.5;
-
-            // Calculate the radius of the initial sphere found by Ritter's algorithm
-            var radiusSquared = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(diameter2, ritterCenter, fromPointsScratch));
-            var ritterRadius = Math.sqrt(radiusSquared);
-
-            // Find the center of the sphere found using the Naive method.
-            var minBoxPt = fromPointsMinBoxPt;
-            minBoxPt.x = xMin.x;
-            minBoxPt.y = yMin.y;
-            minBoxPt.z = zMin.z;
-
-            var maxBoxPt = fromPointsMaxBoxPt;
-            maxBoxPt.x = xMax.x;
-            maxBoxPt.y = yMax.y;
-            maxBoxPt.z = zMax.z;
-
-            var naiveCenter = Cartographic.Cartesian3.midpoint(minBoxPt, maxBoxPt, fromPointsNaiveCenterScratch);
-
-            // Begin 2nd pass to find naive radius and modify the ritter sphere.
-            var naiveRadius = 0;
-            for (i = 0; i < numElements; i += stride) {
-                currentPos.x = positions[i] + center.x;
-                currentPos.y = positions[i + 1] + center.y;
-                currentPos.z = positions[i + 2] + center.z;
-
-                // Find the furthest point from the naive center to calculate the naive radius.
-                var r = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.subtract(currentPos, naiveCenter, fromPointsScratch));
-                if (r > naiveRadius) {
-                    naiveRadius = r;
-                }
-
-                // Make adjustments to the Ritter Sphere to include all points.
-                var oldCenterToPointSquared = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(currentPos, ritterCenter, fromPointsScratch));
-                if (oldCenterToPointSquared > radiusSquared) {
-                    var oldCenterToPoint = Math.sqrt(oldCenterToPointSquared);
-                    // Calculate new radius to include the point that lies outside
-                    ritterRadius = (ritterRadius + oldCenterToPoint) * 0.5;
-                    radiusSquared = ritterRadius * ritterRadius;
-                    // Calculate center of new Ritter sphere
-                    var oldToNew = oldCenterToPoint - ritterRadius;
-                    ritterCenter.x = (ritterRadius * ritterCenter.x + oldToNew * currentPos.x) / oldCenterToPoint;
-                    ritterCenter.y = (ritterRadius * ritterCenter.y + oldToNew * currentPos.y) / oldCenterToPoint;
-                    ritterCenter.z = (ritterRadius * ritterCenter.z + oldToNew * currentPos.z) / oldCenterToPoint;
-                }
-            }
-
-            if (ritterRadius < naiveRadius) {
-                Cartographic.Cartesian3.clone(ritterCenter, result.center);
-                result.radius = ritterRadius;
-            } else {
-                Cartographic.Cartesian3.clone(naiveCenter, result.center);
-                result.radius = naiveRadius;
-            }
-
-            return result;
-        };
-
-        /**
-         * Computes a tight-fitting bounding sphere enclosing a list of EncodedCartesian3s, where the points are
-         * stored in parallel flat arrays in X, Y, Z, order.  The bounding sphere is computed by running two
-         * algorithms, a naive algorithm and Ritter's algorithm. The smaller of the two spheres is used to
-         * ensure a tight fit.
-         *
-         * @param {Number[]} [positionsHigh] An array of high bits of the encoded cartesians that the bounding sphere will enclose.  Each point
-         *        is formed from three elements in the array in the order X, Y, Z.
-         * @param {Number[]} [positionsLow] An array of low bits of the encoded cartesians that the bounding sphere will enclose.  Each point
-         *        is formed from three elements in the array in the order X, Y, Z.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if one was not provided.
-         *
-         * @see {@link http://blogs.agi.com/insight3d/index.php/2008/02/04/a-bounding/|Bounding Sphere computation article}
-         */
-        BoundingSphere.fromEncodedCartesianVertices = function(positionsHigh, positionsLow, result) {
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            if (!when.defined(positionsHigh) || !when.defined(positionsLow) || positionsHigh.length !== positionsLow.length || positionsHigh.length === 0) {
-                result.center = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.center);
-                result.radius = 0.0;
-                return result;
-            }
-
-            var currentPos = fromPointsCurrentPos;
-            currentPos.x = positionsHigh[0] + positionsLow[0];
-            currentPos.y = positionsHigh[1] + positionsLow[1];
-            currentPos.z = positionsHigh[2] + positionsLow[2];
-
-            var xMin = Cartographic.Cartesian3.clone(currentPos, fromPointsXMin);
-            var yMin = Cartographic.Cartesian3.clone(currentPos, fromPointsYMin);
-            var zMin = Cartographic.Cartesian3.clone(currentPos, fromPointsZMin);
-
-            var xMax = Cartographic.Cartesian3.clone(currentPos, fromPointsXMax);
-            var yMax = Cartographic.Cartesian3.clone(currentPos, fromPointsYMax);
-            var zMax = Cartographic.Cartesian3.clone(currentPos, fromPointsZMax);
-
-            var numElements = positionsHigh.length;
-            var i;
-            for (i = 0; i < numElements; i += 3) {
-                var x = positionsHigh[i] + positionsLow[i];
-                var y = positionsHigh[i + 1] + positionsLow[i + 1];
-                var z = positionsHigh[i + 2] + positionsLow[i + 2];
-
-                currentPos.x = x;
-                currentPos.y = y;
-                currentPos.z = z;
-
-                // Store points containing the the smallest and largest components
-                if (x < xMin.x) {
-                    Cartographic.Cartesian3.clone(currentPos, xMin);
-                }
-
-                if (x > xMax.x) {
-                    Cartographic.Cartesian3.clone(currentPos, xMax);
-                }
-
-                if (y < yMin.y) {
-                    Cartographic.Cartesian3.clone(currentPos, yMin);
-                }
-
-                if (y > yMax.y) {
-                    Cartographic.Cartesian3.clone(currentPos, yMax);
-                }
-
-                if (z < zMin.z) {
-                    Cartographic.Cartesian3.clone(currentPos, zMin);
-                }
-
-                if (z > zMax.z) {
-                    Cartographic.Cartesian3.clone(currentPos, zMax);
-                }
-            }
-
-            // Compute x-, y-, and z-spans (Squared distances b/n each component's min. and max.).
-            var xSpan = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(xMax, xMin, fromPointsScratch));
-            var ySpan = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(yMax, yMin, fromPointsScratch));
-            var zSpan = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(zMax, zMin, fromPointsScratch));
-
-            // Set the diameter endpoints to the largest span.
-            var diameter1 = xMin;
-            var diameter2 = xMax;
-            var maxSpan = xSpan;
-            if (ySpan > maxSpan) {
-                maxSpan = ySpan;
-                diameter1 = yMin;
-                diameter2 = yMax;
-            }
-            if (zSpan > maxSpan) {
-                maxSpan = zSpan;
-                diameter1 = zMin;
-                diameter2 = zMax;
-            }
-
-            // Calculate the center of the initial sphere found by Ritter's algorithm
-            var ritterCenter = fromPointsRitterCenter;
-            ritterCenter.x = (diameter1.x + diameter2.x) * 0.5;
-            ritterCenter.y = (diameter1.y + diameter2.y) * 0.5;
-            ritterCenter.z = (diameter1.z + diameter2.z) * 0.5;
-
-            // Calculate the radius of the initial sphere found by Ritter's algorithm
-            var radiusSquared = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(diameter2, ritterCenter, fromPointsScratch));
-            var ritterRadius = Math.sqrt(radiusSquared);
-
-            // Find the center of the sphere found using the Naive method.
-            var minBoxPt = fromPointsMinBoxPt;
-            minBoxPt.x = xMin.x;
-            minBoxPt.y = yMin.y;
-            minBoxPt.z = zMin.z;
-
-            var maxBoxPt = fromPointsMaxBoxPt;
-            maxBoxPt.x = xMax.x;
-            maxBoxPt.y = yMax.y;
-            maxBoxPt.z = zMax.z;
-
-            var naiveCenter = Cartographic.Cartesian3.midpoint(minBoxPt, maxBoxPt, fromPointsNaiveCenterScratch);
-
-            // Begin 2nd pass to find naive radius and modify the ritter sphere.
-            var naiveRadius = 0;
-            for (i = 0; i < numElements; i += 3) {
-                currentPos.x = positionsHigh[i] + positionsLow[i];
-                currentPos.y = positionsHigh[i + 1] + positionsLow[i + 1];
-                currentPos.z = positionsHigh[i + 2] + positionsLow[i + 2];
-
-                // Find the furthest point from the naive center to calculate the naive radius.
-                var r = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.subtract(currentPos, naiveCenter, fromPointsScratch));
-                if (r > naiveRadius) {
-                    naiveRadius = r;
-                }
-
-                // Make adjustments to the Ritter Sphere to include all points.
-                var oldCenterToPointSquared = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(currentPos, ritterCenter, fromPointsScratch));
-                if (oldCenterToPointSquared > radiusSquared) {
-                    var oldCenterToPoint = Math.sqrt(oldCenterToPointSquared);
-                    // Calculate new radius to include the point that lies outside
-                    ritterRadius = (ritterRadius + oldCenterToPoint) * 0.5;
-                    radiusSquared = ritterRadius * ritterRadius;
-                    // Calculate center of new Ritter sphere
-                    var oldToNew = oldCenterToPoint - ritterRadius;
-                    ritterCenter.x = (ritterRadius * ritterCenter.x + oldToNew * currentPos.x) / oldCenterToPoint;
-                    ritterCenter.y = (ritterRadius * ritterCenter.y + oldToNew * currentPos.y) / oldCenterToPoint;
-                    ritterCenter.z = (ritterRadius * ritterCenter.z + oldToNew * currentPos.z) / oldCenterToPoint;
-                }
-            }
-
-            if (ritterRadius < naiveRadius) {
-                Cartographic.Cartesian3.clone(ritterCenter, result.center);
-                result.radius = ritterRadius;
-            } else {
-                Cartographic.Cartesian3.clone(naiveCenter, result.center);
-                result.radius = naiveRadius;
-            }
-
-            return result;
-        };
-
-        /**
-         * Computes a bounding sphere from the corner points of an axis-aligned bounding box.  The sphere
-         * tighly and fully encompases the box.
-         *
-         * @param {Cartesian3} [corner] The minimum height over the rectangle.
-         * @param {Cartesian3} [oppositeCorner] The maximum height over the rectangle.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         *
-         * @example
-         * // Create a bounding sphere around the unit cube
-         * var sphere = Cesium.BoundingSphere.fromCornerPoints(new Cesium.Cartesian3(-0.5, -0.5, -0.5), new Cesium.Cartesian3(0.5, 0.5, 0.5));
-         */
-        BoundingSphere.fromCornerPoints = function(corner, oppositeCorner, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('corner', corner);
-            Check.Check.typeOf.object('oppositeCorner', oppositeCorner);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            var center = Cartographic.Cartesian3.midpoint(corner, oppositeCorner, result.center);
-            result.radius = Cartographic.Cartesian3.distance(center, oppositeCorner);
-            return result;
-        };
-
-        /**
-         * Creates a bounding sphere encompassing an ellipsoid.
-         *
-         * @param {Ellipsoid} ellipsoid The ellipsoid around which to create a bounding sphere.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         *
-         * @example
-         * var boundingSphere = Cesium.BoundingSphere.fromEllipsoid(ellipsoid);
-         */
-        BoundingSphere.fromEllipsoid = function(ellipsoid, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('ellipsoid', ellipsoid);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.center);
-            result.radius = ellipsoid.maximumRadius;
-            return result;
-        };
-
-        var fromBoundingSpheresScratch = new Cartographic.Cartesian3();
-
-        /**
-         * Computes a tight-fitting bounding sphere enclosing the provided array of bounding spheres.
-         *
-         * @param {BoundingSphere[]} [boundingSpheres] The array of bounding spheres.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.fromBoundingSpheres = function(boundingSpheres, result) {
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            if (!when.defined(boundingSpheres) || boundingSpheres.length === 0) {
-                result.center = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.center);
-                result.radius = 0.0;
-                return result;
-            }
-
-            var length = boundingSpheres.length;
-            if (length === 1) {
-                return BoundingSphere.clone(boundingSpheres[0], result);
-            }
-
-            if (length === 2) {
-                return BoundingSphere.union(boundingSpheres[0], boundingSpheres[1], result);
-            }
-
-            var positions = [];
-            var i;
-            for (i = 0; i < length; i++) {
-                positions.push(boundingSpheres[i].center);
-            }
-
-            result = BoundingSphere.fromPoints(positions, result);
-
-            var center = result.center;
-            var radius = result.radius;
-            for (i = 0; i < length; i++) {
-                var tmp = boundingSpheres[i];
-                radius = Math.max(radius, Cartographic.Cartesian3.distance(center, tmp.center, fromBoundingSpheresScratch) + tmp.radius);
-            }
-            result.radius = radius;
-
-            return result;
-        };
-
-        var fromOrientedBoundingBoxScratchU = new Cartographic.Cartesian3();
-        var fromOrientedBoundingBoxScratchV = new Cartographic.Cartesian3();
-        var fromOrientedBoundingBoxScratchW = new Cartographic.Cartesian3();
-
-        /**
-         * Computes a tight-fitting bounding sphere enclosing the provided oriented bounding box.
-         *
-         * @param {OrientedBoundingBox} orientedBoundingBox The oriented bounding box.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.fromOrientedBoundingBox = function(orientedBoundingBox, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('orientedBoundingBox', orientedBoundingBox);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            var halfAxes = orientedBoundingBox.halfAxes;
-            var u = Matrix3.getColumn(halfAxes, 0, fromOrientedBoundingBoxScratchU);
-            var v = Matrix3.getColumn(halfAxes, 1, fromOrientedBoundingBoxScratchV);
-            var w = Matrix3.getColumn(halfAxes, 2, fromOrientedBoundingBoxScratchW);
-
-            Cartographic.Cartesian3.add(u, v, u);
-            Cartographic.Cartesian3.add(u, w, u);
-
-            result.center = Cartographic.Cartesian3.clone(orientedBoundingBox.center, result.center);
-            result.radius = Cartographic.Cartesian3.magnitude(u);
-
-            return result;
-        };
-
-        /**
-         * Duplicates a BoundingSphere instance.
-         *
-         * @param {BoundingSphere} sphere The bounding sphere to duplicate.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided. (Returns undefined if sphere is undefined)
-         */
-        BoundingSphere.clone = function(sphere, result) {
-            if (!when.defined(sphere)) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                return new BoundingSphere(sphere.center, sphere.radius);
-            }
-
-            result.center = Cartographic.Cartesian3.clone(sphere.center, result.center);
-            result.radius = sphere.radius;
-            return result;
-        };
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        BoundingSphere.packedLength = 4;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {BoundingSphere} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        BoundingSphere.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var center = value.center;
-            array[startingIndex++] = center.x;
-            array[startingIndex++] = center.y;
-            array[startingIndex++] = center.z;
-            array[startingIndex] = value.radius;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {BoundingSphere} [result] The object into which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if one was not provided.
-         */
-        BoundingSphere.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            var center = result.center;
-            center.x = array[startingIndex++];
-            center.y = array[startingIndex++];
-            center.z = array[startingIndex++];
-            result.radius = array[startingIndex];
-            return result;
-        };
-
-        var unionScratch = new Cartographic.Cartesian3();
-        var unionScratchCenter = new Cartographic.Cartesian3();
-        /**
-         * Computes a bounding sphere that contains both the left and right bounding spheres.
-         *
-         * @param {BoundingSphere} left A sphere to enclose in a bounding sphere.
-         * @param {BoundingSphere} right A sphere to enclose in a bounding sphere.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.union = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            var leftCenter = left.center;
-            var leftRadius = left.radius;
-            var rightCenter = right.center;
-            var rightRadius = right.radius;
-
-            var toRightCenter = Cartographic.Cartesian3.subtract(rightCenter, leftCenter, unionScratch);
-            var centerSeparation = Cartographic.Cartesian3.magnitude(toRightCenter);
-
-            if (leftRadius >= (centerSeparation + rightRadius)) {
-                // Left sphere wins.
-                left.clone(result);
-                return result;
-            }
-
-            if (rightRadius >= (centerSeparation + leftRadius)) {
-                // Right sphere wins.
-                right.clone(result);
-                return result;
-            }
-
-            // There are two tangent points, one on far side of each sphere.
-            var halfDistanceBetweenTangentPoints = (leftRadius + centerSeparation + rightRadius) * 0.5;
-
-            // Compute the center point halfway between the two tangent points.
-            var center = Cartographic.Cartesian3.multiplyByScalar(toRightCenter,
-                    (-leftRadius + halfDistanceBetweenTangentPoints) / centerSeparation, unionScratchCenter);
-            Cartographic.Cartesian3.add(center, leftCenter, center);
-            Cartographic.Cartesian3.clone(center, result.center);
-            result.radius = halfDistanceBetweenTangentPoints;
-
-            return result;
-        };
-
-        var expandScratch = new Cartographic.Cartesian3();
-        /**
-         * Computes a bounding sphere by enlarging the provided sphere to contain the provided point.
-         *
-         * @param {BoundingSphere} sphere A sphere to expand.
-         * @param {Cartesian3} point A point to enclose in a bounding sphere.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.expand = function(sphere, point, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('sphere', sphere);
-            Check.Check.typeOf.object('point', point);
-            //>>includeEnd('debug');
-
-            result = BoundingSphere.clone(sphere, result);
-
-            var radius = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.subtract(point, result.center, expandScratch));
-            if (radius > result.radius) {
-                result.radius = radius;
-            }
-
-            return result;
-        };
-
-        /**
-         * Determines which side of a plane a sphere is located.
-         *
-         * @param {BoundingSphere} sphere The bounding sphere to test.
-         * @param {Plane} plane The plane to test against.
-         * @returns {Intersect} {@link Intersect.INSIDE} if the entire sphere is on the side of the plane
-         *                      the normal is pointing, {@link Intersect.OUTSIDE} if the entire sphere is
-         *                      on the opposite side, and {@link Intersect.INTERSECTING} if the sphere
-         *                      intersects the plane.
-         */
-        BoundingSphere.intersectPlane = function(sphere, plane) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('sphere', sphere);
-            Check.Check.typeOf.object('plane', plane);
-            //>>includeEnd('debug');
-
-            var center = sphere.center;
-            var radius = sphere.radius;
-            var normal = plane.normal;
-            var distanceToPlane = Cartographic.Cartesian3.dot(normal, center) + plane.distance;
-
-            if (distanceToPlane < -radius) {
-                // The center point is negative side of the plane normal
-                return Intersect$1.OUTSIDE;
-            } else if (distanceToPlane < radius) {
-                // The center point is positive side of the plane, but radius extends beyond it; partial overlap
-                return Intersect$1.INTERSECTING;
-            }
-            return Intersect$1.INSIDE;
-        };
-
-        /**
-         * Applies a 4x4 affine transformation matrix to a bounding sphere.
-         *
-         * @param {BoundingSphere} sphere The bounding sphere to apply the transformation to.
-         * @param {Matrix4} transform The transformation matrix to apply to the bounding sphere.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.transform = function(sphere, transform, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('sphere', sphere);
-            Check.Check.typeOf.object('transform', transform);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            result.center = Matrix4.multiplyByPoint(transform, sphere.center, result.center);
-            result.radius = Matrix4.getMaximumScale(transform) * sphere.radius;
-
-            return result;
-        };
-
-        var distanceSquaredToScratch = new Cartographic.Cartesian3();
-
-        /**
-         * Computes the estimated distance squared from the closest point on a bounding sphere to a point.
-         *
-         * @param {BoundingSphere} sphere The sphere.
-         * @param {Cartesian3} cartesian The point
-         * @returns {Number} The estimated distance squared from the bounding sphere to the point.
-         *
-         * @example
-         * // Sort bounding spheres from back to front
-         * spheres.sort(function(a, b) {
-         *     return Cesium.BoundingSphere.distanceSquaredTo(b, camera.positionWC) - Cesium.BoundingSphere.distanceSquaredTo(a, camera.positionWC);
-         * });
-         */
-        BoundingSphere.distanceSquaredTo = function(sphere, cartesian) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('sphere', sphere);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            var diff = Cartographic.Cartesian3.subtract(sphere.center, cartesian, distanceSquaredToScratch);
-            return Cartographic.Cartesian3.magnitudeSquared(diff) - sphere.radius * sphere.radius;
-        };
-
-        /**
-         * Applies a 4x4 affine transformation matrix to a bounding sphere where there is no scale
-         * The transformation matrix is not verified to have a uniform scale of 1.
-         * This method is faster than computing the general bounding sphere transform using {@link BoundingSphere.transform}.
-         *
-         * @param {BoundingSphere} sphere The bounding sphere to apply the transformation to.
-         * @param {Matrix4} transform The transformation matrix to apply to the bounding sphere.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         *
-         * @example
-         * var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(positionOnEllipsoid);
-         * var boundingSphere = new Cesium.BoundingSphere();
-         * var newBoundingSphere = Cesium.BoundingSphere.transformWithoutScale(boundingSphere, modelMatrix);
-         */
-        BoundingSphere.transformWithoutScale = function(sphere, transform, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('sphere', sphere);
-            Check.Check.typeOf.object('transform', transform);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere();
-            }
-
-            result.center = Matrix4.multiplyByPoint(transform, sphere.center, result.center);
-            result.radius = sphere.radius;
-
-            return result;
-        };
-
-        var scratchCartesian3 = new Cartographic.Cartesian3();
-        /**
-         * The distances calculated by the vector from the center of the bounding sphere to position projected onto direction
-         * plus/minus the radius of the bounding sphere.
-         * <br>
-         * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the
-         * closest and farthest planes from position that intersect the bounding sphere.
-         *
-         * @param {BoundingSphere} sphere The bounding sphere to calculate the distance to.
-         * @param {Cartesian3} position The position to calculate the distance from.
-         * @param {Cartesian3} direction The direction from position.
-         * @param {Interval} [result] A Interval to store the nearest and farthest distances.
-         * @returns {Interval} The nearest and farthest distances on the bounding sphere from position in direction.
-         */
-        BoundingSphere.computePlaneDistances = function(sphere, position, direction, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('sphere', sphere);
-            Check.Check.typeOf.object('position', position);
-            Check.Check.typeOf.object('direction', direction);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Interval();
-            }
-
-            var toCenter = Cartographic.Cartesian3.subtract(sphere.center, position, scratchCartesian3);
-            var mag = Cartographic.Cartesian3.dot(direction, toCenter);
-
-            result.start = mag - sphere.radius;
-            result.stop = mag + sphere.radius;
-            return result;
-        };
-
-        var projectTo2DNormalScratch = new Cartographic.Cartesian3();
-        var projectTo2DEastScratch = new Cartographic.Cartesian3();
-        var projectTo2DNorthScratch = new Cartographic.Cartesian3();
-        var projectTo2DWestScratch = new Cartographic.Cartesian3();
-        var projectTo2DSouthScratch = new Cartographic.Cartesian3();
-        var projectTo2DCartographicScratch = new Cartographic.Cartographic();
-        var projectTo2DPositionsScratch = new Array(8);
-        for (var n = 0; n < 8; ++n) {
-            projectTo2DPositionsScratch[n] = new Cartographic.Cartesian3();
-        }
-
-        var projectTo2DProjection = new GeographicProjection();
-        /**
-         * Creates a bounding sphere in 2D from a bounding sphere in 3D world coordinates.
-         *
-         * @param {BoundingSphere} sphere The bounding sphere to transform to 2D.
-         * @param {Object} [projection=GeographicProjection] The projection to 2D.
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.projectTo2D = function(sphere, projection, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('sphere', sphere);
-            //>>includeEnd('debug');
-
-            projection = when.defaultValue(projection, projectTo2DProjection);
-
-            var ellipsoid = projection.ellipsoid;
-            var center = sphere.center;
-            var radius = sphere.radius;
-
-            var normal;
-            if (Cartographic.Cartesian3.equals(center, Cartographic.Cartesian3.ZERO)) {
-                // Bounding sphere is at the center. The geodetic surface normal is not
-                // defined here so pick the x-axis as a fallback.
-                normal = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_X, projectTo2DNormalScratch);
-            } else {
-                normal = ellipsoid.geodeticSurfaceNormal(center, projectTo2DNormalScratch);
-            }
-            var east = Cartographic.Cartesian3.cross(Cartographic.Cartesian3.UNIT_Z, normal, projectTo2DEastScratch);
-            Cartographic.Cartesian3.normalize(east, east);
-            var north = Cartographic.Cartesian3.cross(normal, east, projectTo2DNorthScratch);
-            Cartographic.Cartesian3.normalize(north, north);
-
-            Cartographic.Cartesian3.multiplyByScalar(normal, radius, normal);
-            Cartographic.Cartesian3.multiplyByScalar(north, radius, north);
-            Cartographic.Cartesian3.multiplyByScalar(east, radius, east);
-
-            var south = Cartographic.Cartesian3.negate(north, projectTo2DSouthScratch);
-            var west = Cartographic.Cartesian3.negate(east, projectTo2DWestScratch);
-
-            var positions = projectTo2DPositionsScratch;
-
-            // top NE corner
-            var corner = positions[0];
-            Cartographic.Cartesian3.add(normal, north, corner);
-            Cartographic.Cartesian3.add(corner, east, corner);
-
-            // top NW corner
-            corner = positions[1];
-            Cartographic.Cartesian3.add(normal, north, corner);
-            Cartographic.Cartesian3.add(corner, west, corner);
-
-            // top SW corner
-            corner = positions[2];
-            Cartographic.Cartesian3.add(normal, south, corner);
-            Cartographic.Cartesian3.add(corner, west, corner);
-
-            // top SE corner
-            corner = positions[3];
-            Cartographic.Cartesian3.add(normal, south, corner);
-            Cartographic.Cartesian3.add(corner, east, corner);
-
-            Cartographic.Cartesian3.negate(normal, normal);
-
-            // bottom NE corner
-            corner = positions[4];
-            Cartographic.Cartesian3.add(normal, north, corner);
-            Cartographic.Cartesian3.add(corner, east, corner);
-
-            // bottom NW corner
-            corner = positions[5];
-            Cartographic.Cartesian3.add(normal, north, corner);
-            Cartographic.Cartesian3.add(corner, west, corner);
-
-            // bottom SW corner
-            corner = positions[6];
-            Cartographic.Cartesian3.add(normal, south, corner);
-            Cartographic.Cartesian3.add(corner, west, corner);
-
-            // bottom SE corner
-            corner = positions[7];
-            Cartographic.Cartesian3.add(normal, south, corner);
-            Cartographic.Cartesian3.add(corner, east, corner);
-
-            var length = positions.length;
-            for (var i = 0; i < length; ++i) {
-                var position = positions[i];
-                Cartographic.Cartesian3.add(center, position, position);
-                var cartographic = ellipsoid.cartesianToCartographic(position, projectTo2DCartographicScratch);
-                projection.project(cartographic, position);
-            }
-
-            result = BoundingSphere.fromPoints(positions, result);
-
-            // swizzle center components
-            center = result.center;
-            var x = center.x;
-            var y = center.y;
-            var z = center.z;
-            center.x = z;
-            center.y = x;
-            center.z = y;
-
-            return result;
-        };
-
-        /**
-         * Determines whether or not a sphere is hidden from view by the occluder.
-         *
-         * @param {BoundingSphere} sphere The bounding sphere surrounding the occludee object.
-         * @param {Occluder} occluder The occluder.
-         * @returns {Boolean} <code>true</code> if the sphere is not visible; otherwise <code>false</code>.
-         */
-        BoundingSphere.isOccluded = function(sphere, occluder) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('sphere', sphere);
-            Check.Check.typeOf.object('occluder', occluder);
-            //>>includeEnd('debug');
-            return !occluder.isBoundingSphereVisible(sphere);
-        };
-
-        /**
-         * Compares the provided BoundingSphere componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {BoundingSphere} [left] The first BoundingSphere.
-         * @param {BoundingSphere} [right] The second BoundingSphere.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        BoundingSphere.equals = function(left, right) {
-            return (left === right) ||
-                   ((when.defined(left)) &&
-                    (when.defined(right)) &&
-                    Cartographic.Cartesian3.equals(left.center, right.center) &&
-                    left.radius === right.radius);
-        };
-
-        /**
-         * Determines which side of a plane the sphere is located.
-         *
-         * @param {Plane} plane The plane to test against.
-         * @returns {Intersect} {@link Intersect.INSIDE} if the entire sphere is on the side of the plane
-         *                      the normal is pointing, {@link Intersect.OUTSIDE} if the entire sphere is
-         *                      on the opposite side, and {@link Intersect.INTERSECTING} if the sphere
-         *                      intersects the plane.
-         */
-        BoundingSphere.prototype.intersectPlane = function(plane) {
-            return BoundingSphere.intersectPlane(this, plane);
-        };
-
-        /**
-         * Computes the estimated distance squared from the closest point on a bounding sphere to a point.
-         *
-         * @param {Cartesian3} cartesian The point
-         * @returns {Number} The estimated distance squared from the bounding sphere to the point.
-         *
-         * @example
-         * // Sort bounding spheres from back to front
-         * spheres.sort(function(a, b) {
-         *     return b.distanceSquaredTo(camera.positionWC) - a.distanceSquaredTo(camera.positionWC);
-         * });
-         */
-        BoundingSphere.prototype.distanceSquaredTo = function(cartesian) {
-            return BoundingSphere.distanceSquaredTo(this, cartesian);
-        };
-
-        /**
-         * The distances calculated by the vector from the center of the bounding sphere to position projected onto direction
-         * plus/minus the radius of the bounding sphere.
-         * <br>
-         * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the
-         * closest and farthest planes from position that intersect the bounding sphere.
-         *
-         * @param {Cartesian3} position The position to calculate the distance from.
-         * @param {Cartesian3} direction The direction from position.
-         * @param {Interval} [result] A Interval to store the nearest and farthest distances.
-         * @returns {Interval} The nearest and farthest distances on the bounding sphere from position in direction.
-         */
-        BoundingSphere.prototype.computePlaneDistances = function(position, direction, result) {
-            return BoundingSphere.computePlaneDistances(this, position, direction, result);
-        };
-
-        /**
-         * Determines whether or not a sphere is hidden from view by the occluder.
-         *
-         * @param {Occluder} occluder The occluder.
-         * @returns {Boolean} <code>true</code> if the sphere is not visible; otherwise <code>false</code>.
-         */
-        BoundingSphere.prototype.isOccluded = function(occluder) {
-            return BoundingSphere.isOccluded(this, occluder);
-        };
-
-        /**
-         * Compares this BoundingSphere against the provided BoundingSphere componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {BoundingSphere} [right] The right hand side BoundingSphere.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        BoundingSphere.prototype.equals = function(right) {
-            return BoundingSphere.equals(this, right);
-        };
-
-        /**
-         * Duplicates this BoundingSphere instance.
-         *
-         * @param {BoundingSphere} [result] The object onto which to store the result.
-         * @returns {BoundingSphere} The modified result parameter or a new BoundingSphere instance if none was provided.
-         */
-        BoundingSphere.prototype.clone = function(result) {
-            return BoundingSphere.clone(this, result);
-        };
-
-        /**
-         * Computes the radius of the BoundingSphere.
-         * @returns {Number} The radius of the BoundingSphere.
-         */
-        BoundingSphere.prototype.volume = function() {
-            var radius = this.radius;
-            return volumeConstant * radius * radius * radius;
-        };
-
-    exports.BoundingSphere = BoundingSphere;
-    exports.GeographicProjection = GeographicProjection;
-    exports.Intersect = Intersect$1;
-    exports.Interval = Interval;
-    exports.Matrix3 = Matrix3;
-    exports.Matrix4 = Matrix4;
-
-});
diff --git a/public/libs/Cesium/Workers/BoxGeometry-009c66b6.js b/public/libs/Cesium/Workers/BoxGeometry-009c66b6.js
deleted file mode 100644
index d3a4a32..0000000
--- a/public/libs/Cesium/Workers/BoxGeometry-009c66b6.js
+++ /dev/null
@@ -1,913 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Cartographic-fe4be337', './BoundingSphere-775c5788', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './GeometryAttributes-aacecde6', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402'], function (exports, when, Check, Cartographic, BoundingSphere, ComponentDatatype, GeometryAttribute, PrimitiveType, GeometryAttributes, arrayFill, GeometryOffsetAttribute, VertexFormat) { 'use strict';
-
-    var diffScratch = new Cartographic.Cartesian3();
-
-        /**
-         * Describes a cube centered at the origin.
-         *
-         * @alias BoxGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3} options.minimum The minimum x, y, and z coordinates of the box.
-         * @param {Cartesian3} options.maximum The maximum x, y, and z coordinates of the box.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         *
-         * @see BoxGeometry.fromDimensions
-         * @see BoxGeometry.createGeometry
-         * @see Packable
-         *
-         * @demo {@link https://sandcastle.cesium.com/index.html?src=Box.html|Cesium Sandcastle Box Demo}
-         *
-         * @example
-         * var box = new Cesium.BoxGeometry({
-         *   vertexFormat : Cesium.VertexFormat.POSITION_ONLY,
-         *   maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0),
-         *   minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0)
-         * });
-         * var geometry = Cesium.BoxGeometry.createGeometry(box);
-         */
-        function BoxGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var min = options.minimum;
-            var max = options.maximum;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('min', min);
-            Check.Check.typeOf.object('max', max);
-            if (when.defined(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                throw new Check.DeveloperError('GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry.');
-            }
-            //>>includeEnd('debug');
-
-            var vertexFormat = when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT);
-
-            this._minimum = Cartographic.Cartesian3.clone(min);
-            this._maximum = Cartographic.Cartesian3.clone(max);
-            this._vertexFormat = vertexFormat;
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createBoxGeometry';
-        }
-
-        /**
-         * Creates a cube centered at the origin given its dimensions.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3} options.dimensions The width, depth, and height of the box stored in the x, y, and z coordinates of the <code>Cartesian3</code>, respectively.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @returns {BoxGeometry}
-         *
-         * @exception {DeveloperError} All dimensions components must be greater than or equal to zero.
-         *
-         *
-         * @example
-         * var box = Cesium.BoxGeometry.fromDimensions({
-         *   vertexFormat : Cesium.VertexFormat.POSITION_ONLY,
-         *   dimensions : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0)
-         * });
-         * var geometry = Cesium.BoxGeometry.createGeometry(box);
-         *
-         * @see BoxGeometry.createGeometry
-         */
-        BoxGeometry.fromDimensions = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var dimensions = options.dimensions;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('dimensions', dimensions);
-            Check.Check.typeOf.number.greaterThanOrEquals('dimensions.x', dimensions.x, 0);
-            Check.Check.typeOf.number.greaterThanOrEquals('dimensions.y', dimensions.y, 0);
-            Check.Check.typeOf.number.greaterThanOrEquals('dimensions.z', dimensions.z, 0);
-            //>>includeEnd('debug');
-
-            var corner = Cartographic.Cartesian3.multiplyByScalar(dimensions, 0.5, new Cartographic.Cartesian3());
-
-            return new BoxGeometry({
-                minimum : Cartographic.Cartesian3.negate(corner, new Cartographic.Cartesian3()),
-                maximum : corner,
-                vertexFormat : options.vertexFormat,
-                offsetAttribute: options.offsetAttribute
-            });
-        };
-
-        /**
-         * Creates a cube from the dimensions of an AxisAlignedBoundingBox.
-         *
-         * @param {AxisAlignedBoundingBox} boundingBox A description of the AxisAlignedBoundingBox.
-         * @returns {BoxGeometry}
-         *
-         *
-         *
-         * @example
-         * var aabb = Cesium.AxisAlignedBoundingBox.fromPoints(Cesium.Cartesian3.fromDegreesArray([
-         *      -72.0, 40.0,
-         *      -70.0, 35.0,
-         *      -75.0, 30.0,
-         *      -70.0, 30.0,
-         *      -68.0, 40.0
-         * ]));
-         * var box = Cesium.BoxGeometry.fromAxisAlignedBoundingBox(aabb);
-         *
-         * @see BoxGeometry.createGeometry
-         */
-        BoxGeometry.fromAxisAlignedBoundingBox = function (boundingBox) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('boundingBox', boundingBox);
-            //>>includeEnd('debug');
-
-            return new BoxGeometry({
-                minimum : boundingBox.minimum,
-                maximum : boundingBox.maximum
-            });
-        };
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        BoxGeometry.packedLength = 2 * Cartographic.Cartesian3.packedLength + VertexFormat.VertexFormat.packedLength + 1;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {BoxGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        BoxGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            Cartographic.Cartesian3.pack(value._minimum, array, startingIndex);
-            Cartographic.Cartesian3.pack(value._maximum, array, startingIndex + Cartographic.Cartesian3.packedLength);
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex + 2 * Cartographic.Cartesian3.packedLength);
-            array[startingIndex + 2 * Cartographic.Cartesian3.packedLength + VertexFormat.VertexFormat.packedLength] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchMin = new Cartographic.Cartesian3();
-        var scratchMax = new Cartographic.Cartesian3();
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            minimum: scratchMin,
-            maximum: scratchMax,
-            vertexFormat: scratchVertexFormat,
-            offsetAttribute : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {BoxGeometry} [result] The object into which to store the result.
-         * @returns {BoxGeometry} The modified result parameter or a new BoxGeometry instance if one was not provided.
-         */
-        BoxGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var min = Cartographic.Cartesian3.unpack(array, startingIndex, scratchMin);
-            var max = Cartographic.Cartesian3.unpack(array, startingIndex + Cartographic.Cartesian3.packedLength, scratchMax);
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex + 2 * Cartographic.Cartesian3.packedLength, scratchVertexFormat);
-            var offsetAttribute = array[startingIndex + 2 * Cartographic.Cartesian3.packedLength + VertexFormat.VertexFormat.packedLength];
-
-            if (!when.defined(result)) {
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-                return new BoxGeometry(scratchOptions);
-            }
-
-            result._minimum = Cartographic.Cartesian3.clone(min, result._minimum);
-            result._maximum = Cartographic.Cartesian3.clone(max, result._maximum);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of a box, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {BoxGeometry} boxGeometry A description of the box.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        BoxGeometry.createGeometry = function(boxGeometry) {
-            var min = boxGeometry._minimum;
-            var max = boxGeometry._maximum;
-            var vertexFormat = boxGeometry._vertexFormat;
-
-            if (Cartographic.Cartesian3.equals(min, max)) {
-                return;
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            var indices;
-            var positions;
-
-            if (vertexFormat.position &&
-                    (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent)) {
-                if (vertexFormat.position) {
-                    // 8 corner points.  Duplicated 3 times each for each incident edge/face.
-                    positions = new Float64Array(6 * 4 * 3);
-
-                    // +z face
-                    positions[0]  = min.x;
-                    positions[1]  = min.y;
-                    positions[2]  = max.z;
-                    positions[3]  = max.x;
-                    positions[4]  = min.y;
-                    positions[5]  = max.z;
-                    positions[6]  = max.x;
-                    positions[7]  = max.y;
-                    positions[8]  = max.z;
-                    positions[9]  = min.x;
-                    positions[10] = max.y;
-                    positions[11] = max.z;
-
-                    // -z face
-                    positions[12] = min.x;
-                    positions[13] = min.y;
-                    positions[14] = min.z;
-                    positions[15] = max.x;
-                    positions[16] = min.y;
-                    positions[17] = min.z;
-                    positions[18] = max.x;
-                    positions[19] = max.y;
-                    positions[20] = min.z;
-                    positions[21] = min.x;
-                    positions[22] = max.y;
-                    positions[23] = min.z;
-
-                    // +x face
-                    positions[24] = max.x;
-                    positions[25] = min.y;
-                    positions[26] = min.z;
-                    positions[27] = max.x;
-                    positions[28] = max.y;
-                    positions[29] = min.z;
-                    positions[30] = max.x;
-                    positions[31] = max.y;
-                    positions[32] = max.z;
-                    positions[33] = max.x;
-                    positions[34] = min.y;
-                    positions[35] = max.z;
-
-                    // -x face
-                    positions[36] = min.x;
-                    positions[37] = min.y;
-                    positions[38] = min.z;
-                    positions[39] = min.x;
-                    positions[40] = max.y;
-                    positions[41] = min.z;
-                    positions[42] = min.x;
-                    positions[43] = max.y;
-                    positions[44] = max.z;
-                    positions[45] = min.x;
-                    positions[46] = min.y;
-                    positions[47] = max.z;
-
-                    // +y face
-                    positions[48] = min.x;
-                    positions[49] = max.y;
-                    positions[50] = min.z;
-                    positions[51] = max.x;
-                    positions[52] = max.y;
-                    positions[53] = min.z;
-                    positions[54] = max.x;
-                    positions[55] = max.y;
-                    positions[56] = max.z;
-                    positions[57] = min.x;
-                    positions[58] = max.y;
-                    positions[59] = max.z;
-
-                    // -y face
-                    positions[60] = min.x;
-                    positions[61] = min.y;
-                    positions[62] = min.z;
-                    positions[63] = max.x;
-                    positions[64] = min.y;
-                    positions[65] = min.z;
-                    positions[66] = max.x;
-                    positions[67] = min.y;
-                    positions[68] = max.z;
-                    positions[69] = min.x;
-                    positions[70] = min.y;
-                    positions[71] = max.z;
-
-                    attributes.position = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                        componentsPerAttribute : 3,
-                        values : positions
-                    });
-                }
-
-                if (vertexFormat.normal) {
-                    var normals = new Float32Array(6 * 4 * 3);
-
-                    // +z face
-                    normals[0]  = 0.0;
-                    normals[1]  = 0.0;
-                    normals[2]  = 1.0;
-                    normals[3]  = 0.0;
-                    normals[4]  = 0.0;
-                    normals[5]  = 1.0;
-                    normals[6]  = 0.0;
-                    normals[7]  = 0.0;
-                    normals[8]  = 1.0;
-                    normals[9]  = 0.0;
-                    normals[10] = 0.0;
-                    normals[11] = 1.0;
-
-                    // -z face
-                    normals[12] = 0.0;
-                    normals[13] = 0.0;
-                    normals[14] = -1.0;
-                    normals[15] = 0.0;
-                    normals[16] = 0.0;
-                    normals[17] = -1.0;
-                    normals[18] = 0.0;
-                    normals[19] = 0.0;
-                    normals[20] = -1.0;
-                    normals[21] = 0.0;
-                    normals[22] = 0.0;
-                    normals[23] = -1.0;
-
-                    // +x face
-                    normals[24] = 1.0;
-                    normals[25] = 0.0;
-                    normals[26] = 0.0;
-                    normals[27] = 1.0;
-                    normals[28] = 0.0;
-                    normals[29] = 0.0;
-                    normals[30] = 1.0;
-                    normals[31] = 0.0;
-                    normals[32] = 0.0;
-                    normals[33] = 1.0;
-                    normals[34] = 0.0;
-                    normals[35] = 0.0;
-
-                    // -x face
-                    normals[36] = -1.0;
-                    normals[37] = 0.0;
-                    normals[38] = 0.0;
-                    normals[39] = -1.0;
-                    normals[40] = 0.0;
-                    normals[41] = 0.0;
-                    normals[42] = -1.0;
-                    normals[43] = 0.0;
-                    normals[44] = 0.0;
-                    normals[45] = -1.0;
-                    normals[46] = 0.0;
-                    normals[47] = 0.0;
-
-                    // +y face
-                    normals[48] = 0.0;
-                    normals[49] = 1.0;
-                    normals[50] = 0.0;
-                    normals[51] = 0.0;
-                    normals[52] = 1.0;
-                    normals[53] = 0.0;
-                    normals[54] = 0.0;
-                    normals[55] = 1.0;
-                    normals[56] = 0.0;
-                    normals[57] = 0.0;
-                    normals[58] = 1.0;
-                    normals[59] = 0.0;
-
-                    // -y face
-                    normals[60] = 0.0;
-                    normals[61] = -1.0;
-                    normals[62] = 0.0;
-                    normals[63] = 0.0;
-                    normals[64] = -1.0;
-                    normals[65] = 0.0;
-                    normals[66] = 0.0;
-                    normals[67] = -1.0;
-                    normals[68] = 0.0;
-                    normals[69] = 0.0;
-                    normals[70] = -1.0;
-                    normals[71] = 0.0;
-
-                    attributes.normal = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : normals
-                    });
-                }
-
-                if (vertexFormat.st) {
-                    // 纹理坐标多用一位存储顶点数据哪个面,BOX剖面分析贴纹理需要用
-                    var texCoords = new Float32Array(6 * 4 * 3);
-                    var texValueIndex = 0;
-                    // +z face
-                    texCoords[texValueIndex++]  = 0.0;
-                    texCoords[texValueIndex++]  = 0.0;
-                    texCoords[texValueIndex++]  = -1.0;
-
-                    texCoords[texValueIndex++]  = 1.0;
-                    texCoords[texValueIndex++]  = 0.0;
-                    texCoords[texValueIndex++]  = -1.0;
-
-                    texCoords[texValueIndex++]  = 1.0;
-                    texCoords[texValueIndex++]  = 1.0;
-                    texCoords[texValueIndex++]  = -1.0;
-
-                    texCoords[texValueIndex++]  = 0.0;
-                    texCoords[texValueIndex++]  = 1.0;
-                    texCoords[texValueIndex++]  = -1.0;
-
-                    // -z face
-                    texCoords[texValueIndex++]  = 1.0;
-                    texCoords[texValueIndex++]  = 0.0;
-                    texCoords[texValueIndex++]  = -1.0;
-
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++]  = -1.0;
-
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++]  = -1.0;
-
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++]  = -1.0;
-
-                    //+x face
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 0.0;
-
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 0.0;
-
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 0.0;
-
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 0.0;
-
-                    // -x face
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 0.0;
-
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 0.0;
-
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 0.0;
-
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 0.0;
-
-                    // +y face
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 1.0;
-
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 1.0;
-
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 1.0;
-
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 1.0;
-
-                    // -y face
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 1.0;
-
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 1.0;
-
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 1.0;
-
-                    texCoords[texValueIndex++] = 0.0;
-                    texCoords[texValueIndex++] = 1.0;
-                    texCoords[texValueIndex++] = 1.0;
-
-                    attributes.st = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : texCoords
-                    });
-                }
-
-                if (vertexFormat.tangent) {
-                    var tangents = new Float32Array(6 * 4 * 3);
-
-                    // +z face
-                    tangents[0]  = 1.0;
-                    tangents[1]  = 0.0;
-                    tangents[2]  = 0.0;
-                    tangents[3]  = 1.0;
-                    tangents[4]  = 0.0;
-                    tangents[5]  = 0.0;
-                    tangents[6]  = 1.0;
-                    tangents[7]  = 0.0;
-                    tangents[8]  = 0.0;
-                    tangents[9]  = 1.0;
-                    tangents[10] = 0.0;
-                    tangents[11] = 0.0;
-
-                    // -z face
-                    tangents[12] = -1.0;
-                    tangents[13] = 0.0;
-                    tangents[14] = 0.0;
-                    tangents[15] = -1.0;
-                    tangents[16] = 0.0;
-                    tangents[17] = 0.0;
-                    tangents[18] = -1.0;
-                    tangents[19] = 0.0;
-                    tangents[20] = 0.0;
-                    tangents[21] = -1.0;
-                    tangents[22] = 0.0;
-                    tangents[23] = 0.0;
-
-                    // +x face
-                    tangents[24] = 0.0;
-                    tangents[25] = 1.0;
-                    tangents[26] = 0.0;
-                    tangents[27] = 0.0;
-                    tangents[28] = 1.0;
-                    tangents[29] = 0.0;
-                    tangents[30] = 0.0;
-                    tangents[31] = 1.0;
-                    tangents[32] = 0.0;
-                    tangents[33] = 0.0;
-                    tangents[34] = 1.0;
-                    tangents[35] = 0.0;
-
-                    // -x face
-                    tangents[36] = 0.0;
-                    tangents[37] = -1.0;
-                    tangents[38] = 0.0;
-                    tangents[39] = 0.0;
-                    tangents[40] = -1.0;
-                    tangents[41] = 0.0;
-                    tangents[42] = 0.0;
-                    tangents[43] = -1.0;
-                    tangents[44] = 0.0;
-                    tangents[45] = 0.0;
-                    tangents[46] = -1.0;
-                    tangents[47] = 0.0;
-
-                    // +y face
-                    tangents[48] = -1.0;
-                    tangents[49] = 0.0;
-                    tangents[50] = 0.0;
-                    tangents[51] = -1.0;
-                    tangents[52] = 0.0;
-                    tangents[53] = 0.0;
-                    tangents[54] = -1.0;
-                    tangents[55] = 0.0;
-                    tangents[56] = 0.0;
-                    tangents[57] = -1.0;
-                    tangents[58] = 0.0;
-                    tangents[59] = 0.0;
-
-                    // -y face
-                    tangents[60] = 1.0;
-                    tangents[61] = 0.0;
-                    tangents[62] = 0.0;
-                    tangents[63] = 1.0;
-                    tangents[64] = 0.0;
-                    tangents[65] = 0.0;
-                    tangents[66] = 1.0;
-                    tangents[67] = 0.0;
-                    tangents[68] = 0.0;
-                    tangents[69] = 1.0;
-                    tangents[70] = 0.0;
-                    tangents[71] = 0.0;
-
-                    attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : tangents
-                    });
-                }
-
-                if (vertexFormat.bitangent) {
-                    var bitangents = new Float32Array(6 * 4 * 3);
-
-                    // +z face
-                    bitangents[0] = 0.0;
-                    bitangents[1] = 1.0;
-                    bitangents[2] = 0.0;
-                    bitangents[3] = 0.0;
-                    bitangents[4] = 1.0;
-                    bitangents[5] = 0.0;
-                    bitangents[6] = 0.0;
-                    bitangents[7] = 1.0;
-                    bitangents[8] = 0.0;
-                    bitangents[9] = 0.0;
-                    bitangents[10] = 1.0;
-                    bitangents[11] = 0.0;
-
-                    // -z face
-                    bitangents[12] = 0.0;
-                    bitangents[13] = 1.0;
-                    bitangents[14] = 0.0;
-                    bitangents[15] = 0.0;
-                    bitangents[16] = 1.0;
-                    bitangents[17] = 0.0;
-                    bitangents[18] = 0.0;
-                    bitangents[19] = 1.0;
-                    bitangents[20] = 0.0;
-                    bitangents[21] = 0.0;
-                    bitangents[22] = 1.0;
-                    bitangents[23] = 0.0;
-
-                    // +x face
-                    bitangents[24] = 0.0;
-                    bitangents[25] = 0.0;
-                    bitangents[26] = 1.0;
-                    bitangents[27] = 0.0;
-                    bitangents[28] = 0.0;
-                    bitangents[29] = 1.0;
-                    bitangents[30] = 0.0;
-                    bitangents[31] = 0.0;
-                    bitangents[32] = 1.0;
-                    bitangents[33] = 0.0;
-                    bitangents[34] = 0.0;
-                    bitangents[35] = 1.0;
-
-                    // -x face
-                    bitangents[36] = 0.0;
-                    bitangents[37] = 0.0;
-                    bitangents[38] = 1.0;
-                    bitangents[39] = 0.0;
-                    bitangents[40] = 0.0;
-                    bitangents[41] = 1.0;
-                    bitangents[42] = 0.0;
-                    bitangents[43] = 0.0;
-                    bitangents[44] = 1.0;
-                    bitangents[45] = 0.0;
-                    bitangents[46] = 0.0;
-                    bitangents[47] = 1.0;
-
-                    // +y face
-                    bitangents[48] = 0.0;
-                    bitangents[49] = 0.0;
-                    bitangents[50] = 1.0;
-                    bitangents[51] = 0.0;
-                    bitangents[52] = 0.0;
-                    bitangents[53] = 1.0;
-                    bitangents[54] = 0.0;
-                    bitangents[55] = 0.0;
-                    bitangents[56] = 1.0;
-                    bitangents[57] = 0.0;
-                    bitangents[58] = 0.0;
-                    bitangents[59] = 1.0;
-
-                    // -y face
-                    bitangents[60] = 0.0;
-                    bitangents[61] = 0.0;
-                    bitangents[62] = 1.0;
-                    bitangents[63] = 0.0;
-                    bitangents[64] = 0.0;
-                    bitangents[65] = 1.0;
-                    bitangents[66] = 0.0;
-                    bitangents[67] = 0.0;
-                    bitangents[68] = 1.0;
-                    bitangents[69] = 0.0;
-                    bitangents[70] = 0.0;
-                    bitangents[71] = 1.0;
-
-                    attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : bitangents
-                    });
-                }
-
-                // 12 triangles:  6 faces, 2 triangles each.
-                indices = new Uint16Array(6 * 2 * 3);
-
-                // +z face
-                indices[0] = 0;
-                indices[1] = 1;
-                indices[2] = 2;
-                indices[3] = 0;
-                indices[4] = 2;
-                indices[5] = 3;
-
-                // -z face
-                indices[6] = 4 + 2;
-                indices[7] = 4 + 1;
-                indices[8] = 4 + 0;
-                indices[9] = 4 + 3;
-                indices[10] = 4 + 2;
-                indices[11] = 4 + 0;
-
-                // +x face
-                indices[12] = 8 + 0;
-                indices[13] = 8 + 1;
-                indices[14] = 8 + 2;
-                indices[15] = 8 + 0;
-                indices[16] = 8 + 2;
-                indices[17] = 8 + 3;
-
-                // -x face
-                indices[18] = 12 + 2;
-                indices[19] = 12 + 1;
-                indices[20] = 12 + 0;
-                indices[21] = 12 + 3;
-                indices[22] = 12 + 2;
-                indices[23] = 12 + 0;
-
-                // +y face
-                indices[24] = 16 + 2;
-                indices[25] = 16 + 1;
-                indices[26] = 16 + 0;
-                indices[27] = 16 + 3;
-                indices[28] = 16 + 2;
-                indices[29] = 16 + 0;
-
-                // -y face
-                indices[30] = 20 + 0;
-                indices[31] = 20 + 1;
-                indices[32] = 20 + 2;
-                indices[33] = 20 + 0;
-                indices[34] = 20 + 2;
-                indices[35] = 20 + 3;
-            } else {
-                // Positions only - no need to duplicate corner points
-                positions = new Float64Array(8 * 3);
-
-                positions[0] = min.x;
-                positions[1] = min.y;
-                positions[2] = min.z;
-                positions[3] = max.x;
-                positions[4] = min.y;
-                positions[5] = min.z;
-                positions[6] = max.x;
-                positions[7] = max.y;
-                positions[8] = min.z;
-                positions[9] = min.x;
-                positions[10] = max.y;
-                positions[11] = min.z;
-                positions[12] = min.x;
-                positions[13] = min.y;
-                positions[14] = max.z;
-                positions[15] = max.x;
-                positions[16] = min.y;
-                positions[17] = max.z;
-                positions[18] = max.x;
-                positions[19] = max.y;
-                positions[20] = max.z;
-                positions[21] = min.x;
-                positions[22] = max.y;
-                positions[23] = max.z;
-
-                attributes.position = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : positions
-                });
-
-                // 12 triangles:  6 faces, 2 triangles each.
-                indices = new Uint16Array(6 * 2 * 3);
-
-                // plane z = corner.Z
-                indices[0] = 4;
-                indices[1] = 5;
-                indices[2] = 6;
-                indices[3] = 4;
-                indices[4] = 6;
-                indices[5] = 7;
-
-                // plane z = -corner.Z
-                indices[6] = 1;
-                indices[7] = 0;
-                indices[8] = 3;
-                indices[9] = 1;
-                indices[10] = 3;
-                indices[11] = 2;
-
-                // plane x = corner.X
-                indices[12] = 1;
-                indices[13] = 6;
-                indices[14] = 5;
-                indices[15] = 1;
-                indices[16] = 2;
-                indices[17] = 6;
-
-                // plane y = corner.Y
-                indices[18] = 2;
-                indices[19] = 3;
-                indices[20] = 7;
-                indices[21] = 2;
-                indices[22] = 7;
-                indices[23] = 6;
-
-                // plane x = -corner.X
-                indices[24] = 3;
-                indices[25] = 0;
-                indices[26] = 4;
-                indices[27] = 3;
-                indices[28] = 4;
-                indices[29] = 7;
-
-                // plane y = -corner.Y
-                indices[30] = 0;
-                indices[31] = 1;
-                indices[32] = 5;
-                indices[33] = 0;
-                indices[34] = 5;
-                indices[35] = 4;
-            }
-
-            var diff = Cartographic.Cartesian3.subtract(max, min, diffScratch);
-            var radius = Cartographic.Cartesian3.magnitude(diff) * 0.5;
-
-            if (when.defined(boxGeometry._offsetAttribute)) {
-                var length = positions.length;
-                var applyOffset = new Uint8Array(length / 3);
-                var offsetValue = boxGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                arrayFill.arrayFill(applyOffset, offsetValue);
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values: applyOffset
-                });
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES,
-                boundingSphere : new BoundingSphere.BoundingSphere(Cartographic.Cartesian3.ZERO, radius),
-                offsetAttribute : boxGeometry._offsetAttribute
-            });
-        };
-
-        var unitBoxGeometry;
-
-        /**
-         * Returns the geometric representation of a unit box, including its vertices, indices, and a bounding sphere.
-         * @returns {Geometry} The computed vertices and indices.
-         *
-         * @private
-         */
-        BoxGeometry.getUnitBox = function() {
-            if (!when.defined(unitBoxGeometry)) {
-                unitBoxGeometry = BoxGeometry.createGeometry(BoxGeometry.fromDimensions({
-                    dimensions : new Cartographic.Cartesian3(1.0, 1.0, 1.0),
-                    vertexFormat : VertexFormat.VertexFormat.POSITION_ONLY
-                }));
-            }
-            return unitBoxGeometry;
-        };
-
-    exports.BoxGeometry = BoxGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/Cartesian2-85064f09.js b/public/libs/Cesium/Workers/Cartesian2-85064f09.js
deleted file mode 100644
index 84947bc..0000000
--- a/public/libs/Cesium/Workers/Cartesian2-85064f09.js
+++ /dev/null
@@ -1,2269 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337'], function (exports, when, Check, _Math, Cartographic) { 'use strict';
-
-    function initialize(ellipsoid, x, y, z) {
-        x = when.defaultValue(x, 0.0);
-        y = when.defaultValue(y, 0.0);
-        z = when.defaultValue(z, 0.0);
-
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number.greaterThanOrEquals('x', x, 0.0);
-        Check.Check.typeOf.number.greaterThanOrEquals('y', y, 0.0);
-        Check.Check.typeOf.number.greaterThanOrEquals('z', z, 0.0);
-        //>>includeEnd('debug');
-
-        if(_Math.CesiumMath.equalsEpsilon(z, 6356752.3142451793, _Math.CesiumMath.EPSILON10)){
-            _Math.CesiumMath.Radius = z;
-        }
-
-        ellipsoid._radii = new Cartographic.Cartesian3(x, y, z);
-
-        ellipsoid._radiiSquared = new Cartographic.Cartesian3(x * x,
-                                            y * y,
-                                            z * z);
-
-        ellipsoid._radiiToTheFourth = new Cartographic.Cartesian3(x * x * x * x,
-                                                y * y * y * y,
-                                                z * z * z * z);
-
-        ellipsoid._oneOverRadii = new Cartographic.Cartesian3(x === 0.0 ? 0.0 : 1.0 / x,
-                                            y === 0.0 ? 0.0 : 1.0 / y,
-                                            z === 0.0 ? 0.0 : 1.0 / z);
-
-        ellipsoid._oneOverRadiiSquared = new Cartographic.Cartesian3(x === 0.0 ? 0.0 : 1.0 / (x * x),
-                                                   y === 0.0 ? 0.0 : 1.0 / (y * y),
-                                                   z === 0.0 ? 0.0 : 1.0 / (z * z));
-
-        ellipsoid._minimumRadius = Math.min(x, y, z);
-
-        ellipsoid._maximumRadius = Math.max(x, y, z);
-
-        ellipsoid._centerToleranceSquared = _Math.CesiumMath.EPSILON1;
-
-        if (ellipsoid._radiiSquared.z !== 0) {
-            ellipsoid._squaredXOverSquaredZ = ellipsoid._radiiSquared.x / ellipsoid._radiiSquared.z;
-        }
-    }
-
-    /**
-     * A quadratic surface defined in Cartesian coordinates by the equation
-     * <code>(x / a)^2 + (y / b)^2 + (z / c)^2 = 1</code>.  Primarily used
-     * by Cesium to represent the shape of planetary bodies.
-     *
-     * Rather than constructing this object directly, one of the provided
-     * constants is normally used.
-     * @alias Ellipsoid
-     * @constructor
-     *
-     * @param {Number} [x=0] The radius in the x direction.
-     * @param {Number} [y=0] The radius in the y direction.
-     * @param {Number} [z=0] The radius in the z direction.
-     *
-     * @exception {DeveloperError} All radii components must be greater than or equal to zero.
-     *
-     * @see Ellipsoid.fromCartesian3
-     * @see Ellipsoid.WGS84
-     * @see Ellipsoid.UNIT_SPHERE
-     */
-    function Ellipsoid(x, y, z) {
-        this._radii = undefined;
-        this._radiiSquared = undefined;
-        this._radiiToTheFourth = undefined;
-        this._oneOverRadii = undefined;
-        this._oneOverRadiiSquared = undefined;
-        this._minimumRadius = undefined;
-        this._maximumRadius = undefined;
-        this._centerToleranceSquared = undefined;
-        this._squaredXOverSquaredZ = undefined;
-
-        initialize(this, x, y, z);
-    }
-
-    Object.defineProperties(Ellipsoid.prototype, {
-        /**
-         * Gets the radii of the ellipsoid.
-         * @memberof Ellipsoid.prototype
-         * @type {Cartesian3}
-         * @readonly
-         */
-        radii : {
-            get: function() {
-                return this._radii;
-            }
-        },
-        /**
-         * Gets the squared radii of the ellipsoid.
-         * @memberof Ellipsoid.prototype
-         * @type {Cartesian3}
-         * @readonly
-         */
-        radiiSquared : {
-            get : function() {
-                return this._radiiSquared;
-            }
-        },
-        /**
-         * Gets the radii of the ellipsoid raise to the fourth power.
-         * @memberof Ellipsoid.prototype
-         * @type {Cartesian3}
-         * @readonly
-         */
-        radiiToTheFourth : {
-            get : function() {
-                return this._radiiToTheFourth;
-            }
-        },
-        /**
-         * Gets one over the radii of the ellipsoid.
-         * @memberof Ellipsoid.prototype
-         * @type {Cartesian3}
-         * @readonly
-         */
-        oneOverRadii : {
-            get : function() {
-                return this._oneOverRadii;
-            }
-        },
-        /**
-         * Gets one over the squared radii of the ellipsoid.
-         * @memberof Ellipsoid.prototype
-         * @type {Cartesian3}
-         * @readonly
-         */
-        oneOverRadiiSquared : {
-            get : function() {
-                return this._oneOverRadiiSquared;
-            }
-        },
-        /**
-         * Gets the minimum radius of the ellipsoid.
-         * @memberof Ellipsoid.prototype
-         * @type {Number}
-         * @readonly
-         */
-        minimumRadius : {
-            get : function() {
-                return this._minimumRadius;
-            }
-        },
-        /**
-         * Gets the maximum radius of the ellipsoid.
-         * @memberof Ellipsoid.prototype
-         * @type {Number}
-         * @readonly
-         */
-        maximumRadius : {
-            get : function() {
-                return this._maximumRadius;
-            }
-        }
-    });
-
-    /**
-     * Duplicates an Ellipsoid instance.
-     *
-     * @param {Ellipsoid} ellipsoid The ellipsoid to duplicate.
-     * @param {Ellipsoid} [result] The object onto which to store the result, or undefined if a new
-     *                    instance should be created.
-     * @returns {Ellipsoid} The cloned Ellipsoid. (Returns undefined if ellipsoid is undefined)
-     */
-    Ellipsoid.clone = function(ellipsoid, result) {
-        if (!when.defined(ellipsoid)) {
-            return undefined;
-        }
-        var radii = ellipsoid._radii;
-
-        if (!when.defined(result)) {
-            return new Ellipsoid(radii.x, radii.y, radii.z);
-        }
-
-        Cartographic.Cartesian3.clone(radii, result._radii);
-        Cartographic.Cartesian3.clone(ellipsoid._radiiSquared, result._radiiSquared);
-        Cartographic.Cartesian3.clone(ellipsoid._radiiToTheFourth, result._radiiToTheFourth);
-        Cartographic.Cartesian3.clone(ellipsoid._oneOverRadii, result._oneOverRadii);
-        Cartographic.Cartesian3.clone(ellipsoid._oneOverRadiiSquared, result._oneOverRadiiSquared);
-        result._minimumRadius = ellipsoid._minimumRadius;
-        result._maximumRadius = ellipsoid._maximumRadius;
-        result._centerToleranceSquared = ellipsoid._centerToleranceSquared;
-
-        return result;
-    };
-
-    /**
-     * Computes an Ellipsoid from a Cartesian specifying the radii in x, y, and z directions.
-     *
-     * @param {Cartesian3} [cartesian=Cartesian3.ZERO] The ellipsoid's radius in the x, y, and z directions.
-     * @param {Ellipsoid} [result] The object onto which to store the result, or undefined if a new
-     *                    instance should be created.
-     * @returns {Ellipsoid} A new Ellipsoid instance.
-     *
-     * @exception {DeveloperError} All radii components must be greater than or equal to zero.
-     *
-     * @see Ellipsoid.WGS84
-     * @see Ellipsoid.UNIT_SPHERE
-     */
-    Ellipsoid.fromCartesian3 = function(cartesian, result) {
-        if (!when.defined(result)) {
-            result = new Ellipsoid();
-        }
-
-        if (!when.defined(cartesian)) {
-            return result;
-        }
-
-        initialize(result, cartesian.x, cartesian.y, cartesian.z);
-        return result;
-    };
-
-    /**
-     * An Ellipsoid instance initialized to the WGS84 standard.
-     *
-     * @type {Ellipsoid}
-     * @constant
-     */
-    Ellipsoid.WGS84 = Object.freeze(new Ellipsoid(6378137.0, 6378137.0, _Math.CesiumMath.Radius));
-
-    Ellipsoid.XIAN80 = Object.freeze(new Ellipsoid(6378140.0, 6378140.0, 6356755.29));
-
-    Ellipsoid.CGCS2000 = Object.freeze(new Ellipsoid(6378137.0, 6378137.0, 6356752.31));
-
-    /**
-     * An Ellipsoid instance initialized to radii of (1.0, 1.0, 1.0).
-     *
-     * @type {Ellipsoid}
-     * @constant
-     */
-    Ellipsoid.UNIT_SPHERE = Object.freeze(new Ellipsoid(1.0, 1.0, 1.0));
-
-    /**
-     * An Ellipsoid instance initialized to a sphere with the lunar radius.
-     *
-     * @type {Ellipsoid}
-     * @constant
-     */
-    Ellipsoid.MOON = Object.freeze(new Ellipsoid(_Math.CesiumMath.LUNAR_RADIUS, _Math.CesiumMath.LUNAR_RADIUS, _Math.CesiumMath.LUNAR_RADIUS));
-
-    /**
-     * Duplicates an Ellipsoid instance.
-     *
-     * @param {Ellipsoid} [result] The object onto which to store the result, or undefined if a new
-     *                    instance should be created.
-     * @returns {Ellipsoid} The cloned Ellipsoid.
-     */
-    Ellipsoid.prototype.clone = function(result) {
-        return Ellipsoid.clone(this, result);
-    };
-
-    /**
-     * The number of elements used to pack the object into an array.
-     * @type {Number}
-     */
-    Ellipsoid.packedLength = Cartographic.Cartesian3.packedLength;
-
-    /**
-     * Stores the provided instance into the provided array.
-     *
-     * @param {Ellipsoid} value The value to pack.
-     * @param {Number[]} array The array to pack into.
-     * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-     *
-     * @returns {Number[]} The array that was packed into
-     */
-    Ellipsoid.pack = function(value, array, startingIndex) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('value', value);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        startingIndex = when.defaultValue(startingIndex, 0);
-
-        Cartographic.Cartesian3.pack(value._radii, array, startingIndex);
-
-        return array;
-    };
-
-    /**
-     * Retrieves an instance from a packed array.
-     *
-     * @param {Number[]} array The packed array.
-     * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-     * @param {Ellipsoid} [result] The object into which to store the result.
-     * @returns {Ellipsoid} The modified result parameter or a new Ellipsoid instance if one was not provided.
-     */
-    Ellipsoid.unpack = function(array, startingIndex, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        startingIndex = when.defaultValue(startingIndex, 0);
-
-        var radii = Cartographic.Cartesian3.unpack(array, startingIndex);
-        return Ellipsoid.fromCartesian3(radii, result);
-    };
-
-    /**
-     * Computes the unit vector directed from the center of this ellipsoid toward the provided Cartesian position.
-     * @function
-     *
-     * @param {Cartesian3} cartesian The Cartesian for which to to determine the geocentric normal.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.
-     */
-    Ellipsoid.prototype.geocentricSurfaceNormal = Cartographic.Cartesian3.normalize;
-
-    /**
-     * Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position.
-     *
-     * @param {Cartographic} cartographic The cartographic position for which to to determine the geodetic normal.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.
-     */
-    Ellipsoid.prototype.geodeticSurfaceNormalCartographic = function(cartographic, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartographic', cartographic);
-        //>>includeEnd('debug');
-
-        var longitude = cartographic.longitude;
-        var latitude = cartographic.latitude;
-        var cosLatitude = Math.cos(latitude);
-
-        var x = cosLatitude * Math.cos(longitude);
-        var y = cosLatitude * Math.sin(longitude);
-        var z = Math.sin(latitude);
-
-        if (!when.defined(result)) {
-            result = new Cartographic.Cartesian3();
-        }
-        result.x = x;
-        result.y = y;
-        result.z = z;
-        return Cartographic.Cartesian3.normalize(result, result);
-    };
-
-    /**
-     * Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position.
-     *
-     * @param {Cartesian3} cartesian The Cartesian position for which to to determine the surface normal.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.
-     */
-    Ellipsoid.prototype.geodeticSurfaceNormal = function(cartesian, result) {
-        if (!when.defined(result)) {
-            result = new Cartographic.Cartesian3();
-        }
-        result = Cartographic.Cartesian3.multiplyComponents(cartesian, this._oneOverRadiiSquared, result);
-        return Cartographic.Cartesian3.normalize(result, result);
-    };
-
-    var cartographicToCartesianNormal = new Cartographic.Cartesian3();
-    var cartographicToCartesianK = new Cartographic.Cartesian3();
-
-    /**
-     * Converts the provided cartographic to Cartesian representation.
-     *
-     * @param {Cartographic} cartographic The cartographic position.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.
-     *
-     * @example
-     * //Create a Cartographic and determine it's Cartesian representation on a WGS84 ellipsoid.
-     * var position = new Cesium.Cartographic(Cesium.Math.toRadians(21), Cesium.Math.toRadians(78), 5000);
-     * var cartesianPosition = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
-     */
-    Ellipsoid.prototype.cartographicToCartesian = function(cartographic, result) {
-        //`cartographic is required` is thrown from geodeticSurfaceNormalCartographic.
-        var n = cartographicToCartesianNormal;
-        var k = cartographicToCartesianK;
-        this.geodeticSurfaceNormalCartographic(cartographic, n);
-        Cartographic.Cartesian3.multiplyComponents(this._radiiSquared, n, k);
-        var gamma = Math.sqrt(Cartographic.Cartesian3.dot(n, k));
-        Cartographic.Cartesian3.divideByScalar(k, gamma, k);
-        Cartographic.Cartesian3.multiplyByScalar(n, cartographic.height, n);
-
-        if (!when.defined(result)) {
-            result = new Cartographic.Cartesian3();
-        }
-        return Cartographic.Cartesian3.add(k, n, result);
-    };
-
-    /**
-     * Converts the provided array of cartographics to an array of Cartesians.
-     *
-     * @param {Cartographic[]} cartographics An array of cartographic positions.
-     * @param {Cartesian3[]} [result] The object onto which to store the result.
-     * @returns {Cartesian3[]} The modified result parameter or a new Array instance if none was provided.
-     *
-     * @example
-     * //Convert an array of Cartographics and determine their Cartesian representation on a WGS84 ellipsoid.
-     * var positions = [new Cesium.Cartographic(Cesium.Math.toRadians(21), Cesium.Math.toRadians(78), 0),
-     *                  new Cesium.Cartographic(Cesium.Math.toRadians(21.321), Cesium.Math.toRadians(78.123), 100),
-     *                  new Cesium.Cartographic(Cesium.Math.toRadians(21.645), Cesium.Math.toRadians(78.456), 250)];
-     * var cartesianPositions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray(positions);
-     */
-    Ellipsoid.prototype.cartographicArrayToCartesianArray = function(cartographics, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('cartographics', cartographics);
-        //>>includeEnd('debug')
-
-        var length = cartographics.length;
-        if (!when.defined(result)) {
-            result = new Array(length);
-        } else {
-            result.length = length;
-        }
-        for ( var i = 0; i < length; i++) {
-            result[i] = this.cartographicToCartesian(cartographics[i], result[i]);
-        }
-        return result;
-    };
-
-    var cartesianToCartographicN = new Cartographic.Cartesian3();
-    var cartesianToCartographicP = new Cartographic.Cartesian3();
-    var cartesianToCartographicH = new Cartographic.Cartesian3();
-
-    /**
-     * Converts the provided cartesian to cartographic representation.
-     * The cartesian is undefined at the center of the ellipsoid.
-     *
-     * @param {Cartesian3} cartesian The Cartesian position to convert to cartographic representation.
-     * @param {Cartographic} [result] The object onto which to store the result.
-     * @returns {Cartographic} The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid.
-     *
-     * @example
-     * //Create a Cartesian and determine it's Cartographic representation on a WGS84 ellipsoid.
-     * var position = new Cesium.Cartesian3(17832.12, 83234.52, 952313.73);
-     * var cartographicPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
-     */
-    Ellipsoid.prototype.cartesianToCartographic = function(cartesian, result) {
-        //`cartesian is required.` is thrown from scaleToGeodeticSurface
-        var p = this.scaleToGeodeticSurface(cartesian, cartesianToCartographicP);
-
-        if (!when.defined(p)) {
-            return undefined;
-        }
-
-        var n = this.geodeticSurfaceNormal(p, cartesianToCartographicN);
-        var h = Cartographic.Cartesian3.subtract(cartesian, p, cartesianToCartographicH);
-
-        var longitude = Math.atan2(n.y, n.x);
-        var latitude = Math.asin(n.z);
-        var height = _Math.CesiumMath.sign(Cartographic.Cartesian3.dot(h, cartesian)) * Cartographic.Cartesian3.magnitude(h);
-
-        if (!when.defined(result)) {
-            return new Cartographic.Cartographic(longitude, latitude, height);
-        }
-        result.longitude = longitude;
-        result.latitude = latitude;
-        result.height = height;
-        return result;
-    };
-
-    /**
-     * Converts the provided array of cartesians to an array of cartographics.
-     *
-     * @param {Cartesian3[]} cartesians An array of Cartesian positions.
-     * @param {Cartographic[]} [result] The object onto which to store the result.
-     * @returns {Cartographic[]} The modified result parameter or a new Array instance if none was provided.
-     *
-     * @example
-     * //Create an array of Cartesians and determine their Cartographic representation on a WGS84 ellipsoid.
-     * var positions = [new Cesium.Cartesian3(17832.12, 83234.52, 952313.73),
-     *                  new Cesium.Cartesian3(17832.13, 83234.53, 952313.73),
-     *                  new Cesium.Cartesian3(17832.14, 83234.54, 952313.73)]
-     * var cartographicPositions = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray(positions);
-     */
-    Ellipsoid.prototype.cartesianArrayToCartographicArray = function(cartesians, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('cartesians', cartesians);
-        //>>includeEnd('debug');
-
-        var length = cartesians.length;
-        if (!when.defined(result)) {
-            result = new Array(length);
-        } else {
-            result.length = length;
-        }
-        for ( var i = 0; i < length; ++i) {
-            result[i] = this.cartesianToCartographic(cartesians[i], result[i]);
-        }
-        return result;
-    };
-
-    /**
-     * Scales the provided Cartesian position along the geodetic surface normal
-     * so that it is on the surface of this ellipsoid.  If the position is
-     * at the center of the ellipsoid, this function returns undefined.
-     *
-     * @param {Cartesian3} cartesian The Cartesian position to scale.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter, a new Cartesian3 instance if none was provided, or undefined if the position is at the center.
-     */
-    Ellipsoid.prototype.scaleToGeodeticSurface = function(cartesian, result) {
-        return Cartographic.scaleToGeodeticSurface(cartesian, this._oneOverRadii, this._oneOverRadiiSquared, this._centerToleranceSquared, result);
-    };
-
-    /**
-     * Scales the provided Cartesian position along the geocentric surface normal
-     * so that it is on the surface of this ellipsoid.
-     *
-     * @param {Cartesian3} cartesian The Cartesian position to scale.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.
-     */
-    Ellipsoid.prototype.scaleToGeocentricSurface = function(cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        //>>includeEnd('debug');
-
-        if (!when.defined(result)) {
-            result = new Cartographic.Cartesian3();
-        }
-
-        var positionX = cartesian.x;
-        var positionY = cartesian.y;
-        var positionZ = cartesian.z;
-        var oneOverRadiiSquared = this._oneOverRadiiSquared;
-
-        var beta = 1.0 / Math.sqrt((positionX * positionX) * oneOverRadiiSquared.x +
-                                   (positionY * positionY) * oneOverRadiiSquared.y +
-                                   (positionZ * positionZ) * oneOverRadiiSquared.z);
-
-        return Cartographic.Cartesian3.multiplyByScalar(cartesian, beta, result);
-    };
-
-    /**
-     * Transforms a Cartesian X, Y, Z position to the ellipsoid-scaled space by multiplying
-     * its components by the result of {@link Ellipsoid#oneOverRadii}.
-     *
-     * @param {Cartesian3} position The position to transform.
-     * @param {Cartesian3} [result] The position to which to copy the result, or undefined to create and
-     *        return a new instance.
-     * @returns {Cartesian3} The position expressed in the scaled space.  The returned instance is the
-     *          one passed as the result parameter if it is not undefined, or a new instance of it is.
-     */
-    Ellipsoid.prototype.transformPositionToScaledSpace = function(position, result) {
-        if (!when.defined(result)) {
-            result = new Cartographic.Cartesian3();
-        }
-
-        return Cartographic.Cartesian3.multiplyComponents(position, this._oneOverRadii, result);
-    };
-
-    /**
-     * Transforms a Cartesian X, Y, Z position from the ellipsoid-scaled space by multiplying
-     * its components by the result of {@link Ellipsoid#radii}.
-     *
-     * @param {Cartesian3} position The position to transform.
-     * @param {Cartesian3} [result] The position to which to copy the result, or undefined to create and
-     *        return a new instance.
-     * @returns {Cartesian3} The position expressed in the unscaled space.  The returned instance is the
-     *          one passed as the result parameter if it is not undefined, or a new instance of it is.
-     */
-    Ellipsoid.prototype.transformPositionFromScaledSpace = function(position, result) {
-        if (!when.defined(result)) {
-            result = new Cartographic.Cartesian3();
-        }
-
-        return Cartographic.Cartesian3.multiplyComponents(position, this._radii, result);
-    };
-
-    /**
-     * Compares this Ellipsoid against the provided Ellipsoid componentwise and returns
-     * <code>true</code> if they are equal, <code>false</code> otherwise.
-     *
-     * @param {Ellipsoid} [right] The other Ellipsoid.
-     * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-     */
-    Ellipsoid.prototype.equals = function(right) {
-        return (this === right) ||
-               (when.defined(right) &&
-                Cartographic.Cartesian3.equals(this._radii, right._radii));
-    };
-
-    /**
-     * Creates a string representing this Ellipsoid in the format '(radii.x, radii.y, radii.z)'.
-     *
-     * @returns {String} A string representing this ellipsoid in the format '(radii.x, radii.y, radii.z)'.
-     */
-    Ellipsoid.prototype.toString = function() {
-        return this._radii.toString();
-    };
-
-    /**
-     * Computes a point which is the intersection of the surface normal with the z-axis.
-     *
-     * @param {Cartesian3} position the position. must be on the surface of the ellipsoid.
-     * @param {Number} [buffer = 0.0] A buffer to subtract from the ellipsoid size when checking if the point is inside the ellipsoid.
-     *                                In earth case, with common earth datums, there is no need for this buffer since the intersection point is always (relatively) very close to the center.
-     *                                In WGS84 datum, intersection point is at max z = +-42841.31151331382 (0.673% of z-axis).
-     *                                Intersection point could be outside the ellipsoid if the ratio of MajorAxis / AxisOfRotation is bigger than the square root of 2
-     * @param {Cartesian3} [result] The cartesian to which to copy the result, or undefined to create and
-     *        return a new instance.
-     * @returns {Cartesian3 | undefined} the intersection point if it's inside the ellipsoid, undefined otherwise
-     *
-     * @exception {DeveloperError} position is required.
-     * @exception {DeveloperError} Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y).
-     * @exception {DeveloperError} Ellipsoid.radii.z must be greater than 0.
-     */
-    Ellipsoid.prototype.getSurfaceNormalIntersectionWithZAxis = function(position, buffer, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('position', position);
-
-        if (!_Math.CesiumMath.equalsEpsilon(this._radii.x, this._radii.y, _Math.CesiumMath.EPSILON15)) {
-            throw new Check.DeveloperError('Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)');
-        }
-
-        Check.Check.typeOf.number.greaterThan('Ellipsoid.radii.z', this._radii.z, 0);
-        //>>includeEnd('debug');
-
-        buffer = when.defaultValue(buffer, 0.0);
-
-        var squaredXOverSquaredZ = this._squaredXOverSquaredZ;
-
-        if (!when.defined(result)) {
-            result = new Cartographic.Cartesian3();
-        }
-
-        result.x = 0.0;
-        result.y = 0.0;
-        result.z = position.z * (1 - squaredXOverSquaredZ);
-
-        if (Math.abs(result.z) >= this._radii.z - buffer) {
-            return undefined;
-        }
-
-        return result;
-    };
-
-    /**
-         * A two dimensional region specified as longitude and latitude coordinates.
-         *
-         * @alias Rectangle
-         * @constructor
-         *
-         * @param {Number} [west=0.0] The westernmost longitude, in radians, in the range [-Pi, Pi].
-         * @param {Number} [south=0.0] The southernmost latitude, in radians, in the range [-Pi/2, Pi/2].
-         * @param {Number} [east=0.0] The easternmost longitude, in radians, in the range [-Pi, Pi].
-         * @param {Number} [north=0.0] The northernmost latitude, in radians, in the range [-Pi/2, Pi/2].
-         *
-         * @see Packable
-         */
-        function Rectangle(west, south, east, north) {
-            /**
-             * The westernmost longitude in radians in the range [-Pi, Pi].
-             *
-             * @type {Number}
-             * @default 0.0
-             */
-            this.west = when.defaultValue(west, 0.0);
-
-            /**
-             * The southernmost latitude in radians in the range [-Pi/2, Pi/2].
-             *
-             * @type {Number}
-             * @default 0.0
-             */
-            this.south = when.defaultValue(south, 0.0);
-
-            /**
-             * The easternmost longitude in radians in the range [-Pi, Pi].
-             *
-             * @type {Number}
-             * @default 0.0
-             */
-            this.east = when.defaultValue(east, 0.0);
-
-            /**
-             * The northernmost latitude in radians in the range [-Pi/2, Pi/2].
-             *
-             * @type {Number}
-             * @default 0.0
-             */
-            this.north = when.defaultValue(north, 0.0);
-        }
-
-        Object.defineProperties(Rectangle.prototype, {
-            /**
-             * Gets the width of the rectangle in radians.
-             * @memberof Rectangle.prototype
-             * @type {Number}
-             */
-            width : {
-                get : function() {
-                    return Rectangle.computeWidth(this);
-                }
-            },
-
-            /**
-             * Gets the height of the rectangle in radians.
-             * @memberof Rectangle.prototype
-             * @type {Number}
-             */
-            height : {
-                get : function() {
-                    return Rectangle.computeHeight(this);
-                }
-            }
-        });
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        Rectangle.packedLength = 4;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {Rectangle} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        Rectangle.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value.west;
-            array[startingIndex++] = value.south;
-            array[startingIndex++] = value.east;
-            array[startingIndex] = value.north;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {Rectangle} [result] The object into which to store the result.
-         * @returns {Rectangle} The modified result parameter or a new Rectangle instance if one was not provided.
-         */
-        Rectangle.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new Rectangle();
-            }
-
-            result.west = array[startingIndex++];
-            result.south = array[startingIndex++];
-            result.east = array[startingIndex++];
-            result.north = array[startingIndex];
-            return result;
-        };
-
-        /**
-         * Computes the width of a rectangle in radians.
-         * @param {Rectangle} rectangle The rectangle to compute the width of.
-         * @returns {Number} The width.
-         */
-        Rectangle.computeWidth = function(rectangle) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            //>>includeEnd('debug');
-            var east = rectangle.east;
-            var west = rectangle.west;
-            if (east < west) {
-                east += _Math.CesiumMath.TWO_PI;
-            }
-            return east - west;
-        };
-
-        /**
-         * Computes the height of a rectangle in radians.
-         * @param {Rectangle} rectangle The rectangle to compute the height of.
-         * @returns {Number} The height.
-         */
-        Rectangle.computeHeight = function(rectangle) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            //>>includeEnd('debug');
-            return rectangle.north - rectangle.south;
-        };
-
-        /**
-         * Creates a rectangle given the boundary longitude and latitude in degrees.
-         *
-         * @param {Number} [west=0.0] The westernmost longitude in degrees in the range [-180.0, 180.0].
-         * @param {Number} [south=0.0] The southernmost latitude in degrees in the range [-90.0, 90.0].
-         * @param {Number} [east=0.0] The easternmost longitude in degrees in the range [-180.0, 180.0].
-         * @param {Number} [north=0.0] The northernmost latitude in degrees in the range [-90.0, 90.0].
-         * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.
-         * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.
-         *
-         * @example
-         * var rectangle = Cesium.Rectangle.fromDegrees(0.0, 20.0, 10.0, 30.0);
-         */
-        Rectangle.fromDegrees = function(west, south, east, north, result) {
-            west = _Math.CesiumMath.toRadians(when.defaultValue(west, 0.0));
-            south = _Math.CesiumMath.toRadians(when.defaultValue(south, 0.0));
-            east = _Math.CesiumMath.toRadians(when.defaultValue(east, 0.0));
-            north = _Math.CesiumMath.toRadians(when.defaultValue(north, 0.0));
-
-            if (!when.defined(result)) {
-                return new Rectangle(west, south, east, north);
-            }
-
-            result.west = west;
-            result.south = south;
-            result.east = east;
-            result.north = north;
-
-            return result;
-        };
-
-        /**
-         * Creates a rectangle given the boundary longitude and latitude in radians.
-         *
-         * @param {Number} [west=0.0] The westernmost longitude in radians in the range [-Math.PI, Math.PI].
-         * @param {Number} [south=0.0] The southernmost latitude in radians in the range [-Math.PI/2, Math.PI/2].
-         * @param {Number} [east=0.0] The easternmost longitude in radians in the range [-Math.PI, Math.PI].
-         * @param {Number} [north=0.0] The northernmost latitude in radians in the range [-Math.PI/2, Math.PI/2].
-         * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.
-         * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.
-         *
-         * @example
-         * var rectangle = Cesium.Rectangle.fromRadians(0.0, Math.PI/4, Math.PI/8, 3*Math.PI/4);
-         */
-        Rectangle.fromRadians = function(west, south, east, north, result) {
-            if (!when.defined(result)) {
-                return new Rectangle(west, south, east, north);
-            }
-
-            result.west = when.defaultValue(west, 0.0);
-            result.south = when.defaultValue(south, 0.0);
-            result.east = when.defaultValue(east, 0.0);
-            result.north = when.defaultValue(north, 0.0);
-
-            return result;
-        };
-
-        /**
-         * Creates the smallest possible Rectangle that encloses all positions in the provided array.
-         *
-         * @param {Cartographic[]} cartographics The list of Cartographic instances.
-         * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.
-         * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.
-         */
-        Rectangle.fromCartographicArray = function(cartographics, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartographics', cartographics);
-            //>>includeEnd('debug');
-
-            var west = Number.MAX_VALUE;
-            var east = -Number.MAX_VALUE;
-            var westOverIDL = Number.MAX_VALUE;
-            var eastOverIDL = -Number.MAX_VALUE;
-            var south = Number.MAX_VALUE;
-            var north = -Number.MAX_VALUE;
-
-            for ( var i = 0, len = cartographics.length; i < len; i++) {
-                var position = cartographics[i];
-                west = Math.min(west, position.longitude);
-                east = Math.max(east, position.longitude);
-                south = Math.min(south, position.latitude);
-                north = Math.max(north, position.latitude);
-
-                var lonAdjusted = position.longitude >= 0 ?  position.longitude : position.longitude +  _Math.CesiumMath.TWO_PI;
-                westOverIDL = Math.min(westOverIDL, lonAdjusted);
-                eastOverIDL = Math.max(eastOverIDL, lonAdjusted);
-            }
-
-            if(east - west > eastOverIDL - westOverIDL) {
-                west = westOverIDL;
-                east = eastOverIDL;
-
-                if (east > _Math.CesiumMath.PI) {
-                    east = east - _Math.CesiumMath.TWO_PI;
-                }
-                if (west > _Math.CesiumMath.PI) {
-                    west = west - _Math.CesiumMath.TWO_PI;
-                }
-            }
-
-            if (!when.defined(result)) {
-                return new Rectangle(west, south, east, north);
-            }
-
-            result.west = west;
-            result.south = south;
-            result.east = east;
-            result.north = north;
-            return result;
-        };
-
-        /**
-         * Creates the smallest possible Rectangle that encloses all positions in the provided array.
-         *
-         * @param {Cartesian3[]} cartesians The list of Cartesian instances.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid the cartesians are on.
-         * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.
-         * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.
-         */
-        Rectangle.fromCartesianArray = function(cartesians, ellipsoid, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartesians', cartesians);
-            //>>includeEnd('debug');
-            ellipsoid = when.defaultValue(ellipsoid, Ellipsoid.WGS84);
-
-            var west = Number.MAX_VALUE;
-            var east = -Number.MAX_VALUE;
-            var westOverIDL = Number.MAX_VALUE;
-            var eastOverIDL = -Number.MAX_VALUE;
-            var south = Number.MAX_VALUE;
-            var north = -Number.MAX_VALUE;
-
-            for ( var i = 0, len = cartesians.length; i < len; i++) {
-                var position = ellipsoid.cartesianToCartographic(cartesians[i]);
-                west = Math.min(west, position.longitude);
-                east = Math.max(east, position.longitude);
-                south = Math.min(south, position.latitude);
-                north = Math.max(north, position.latitude);
-
-                var lonAdjusted = position.longitude >= 0 ?  position.longitude : position.longitude +  _Math.CesiumMath.TWO_PI;
-                westOverIDL = Math.min(westOverIDL, lonAdjusted);
-                eastOverIDL = Math.max(eastOverIDL, lonAdjusted);
-            }
-
-            if(east - west > eastOverIDL - westOverIDL) {
-                west = westOverIDL;
-                east = eastOverIDL;
-
-                if (east > _Math.CesiumMath.PI) {
-                    east = east - _Math.CesiumMath.TWO_PI;
-                }
-                if (west > _Math.CesiumMath.PI) {
-                    west = west - _Math.CesiumMath.TWO_PI;
-                }
-            }
-
-            if (!when.defined(result)) {
-                return new Rectangle(west, south, east, north);
-            }
-
-            result.west = west;
-            result.south = south;
-            result.east = east;
-            result.north = north;
-            return result;
-        };
-
-        /**
-         * Duplicates a Rectangle.
-         *
-         * @param {Rectangle} rectangle The rectangle to clone.
-         * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.
-         * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided. (Returns undefined if rectangle is undefined)
-         */
-        Rectangle.clone = function(rectangle, result) {
-            if (!when.defined(rectangle)) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                return new Rectangle(rectangle.west, rectangle.south, rectangle.east, rectangle.north);
-            }
-
-            result.west = rectangle.west;
-            result.south = rectangle.south;
-            result.east = rectangle.east;
-            result.north = rectangle.north;
-            return result;
-        };
-
-        /**
-         * Compares the provided Rectangles componentwise and returns
-         * <code>true</code> if they pass an absolute or relative tolerance test,
-         * <code>false</code> otherwise.
-         *
-         * @param {Rectangle} [left] The first Rectangle.
-         * @param {Rectangle} [right] The second Rectangle.
-         * @param {Number} absoluteEpsilon The absolute epsilon tolerance to use for equality testing.
-         * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Rectangle.equalsEpsilon = function(left, right, absoluteEpsilon) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('absoluteEpsilon', absoluteEpsilon);
-            //>>includeEnd('debug');
-
-            return (left === right) ||
-                   (when.defined(left) &&
-                    when.defined(right) &&
-                    (Math.abs(left.west - right.west) <= absoluteEpsilon) &&
-                    (Math.abs(left.south - right.south) <= absoluteEpsilon) &&
-                    (Math.abs(left.east - right.east) <= absoluteEpsilon) &&
-                    (Math.abs(left.north - right.north) <= absoluteEpsilon));
-        };
-
-        /**
-         * Duplicates this Rectangle.
-         *
-         * @param {Rectangle} [result] The object onto which to store the result.
-         * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.
-         */
-        Rectangle.prototype.clone = function(result) {
-            return Rectangle.clone(this, result);
-        };
-
-        /**
-         * Compares the provided Rectangle with this Rectangle componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Rectangle} [other] The Rectangle to compare.
-         * @returns {Boolean} <code>true</code> if the Rectangles are equal, <code>false</code> otherwise.
-         */
-        Rectangle.prototype.equals = function(other) {
-            return Rectangle.equals(this, other);
-        };
-
-        /**
-         * Compares the provided rectangles and returns <code>true</code> if they are equal,
-         * <code>false</code> otherwise.
-         *
-         * @param {Rectangle} [left] The first Rectangle.
-         * @param {Rectangle} [right] The second Rectangle.
-         * @returns {Boolean} <code>true</code> if left and right are equal; otherwise <code>false</code>.
-         */
-        Rectangle.equals = function(left, right) {
-            return (left === right) ||
-                   ((when.defined(left)) &&
-                    (when.defined(right)) &&
-                    (left.west === right.west) &&
-                    (left.south === right.south) &&
-                    (left.east === right.east) &&
-                    (left.north === right.north));
-        };
-
-        /**
-         * Compares the provided Rectangle with this Rectangle componentwise and returns
-         * <code>true</code> if they are within the provided epsilon,
-         * <code>false</code> otherwise.
-         *
-         * @param {Rectangle} [other] The Rectangle to compare.
-         * @param {Number} epsilon The epsilon to use for equality testing.
-         * @returns {Boolean} <code>true</code> if the Rectangles are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Rectangle.prototype.equalsEpsilon = function(other, epsilon) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('epsilon', epsilon);
-            //>>includeEnd('debug');
-
-            return Rectangle.equalsEpsilon(this, other, epsilon);
-        };
-
-        /**
-         * Checks a Rectangle's properties and throws if they are not in valid ranges.
-         *
-         * @param {Rectangle} rectangle The rectangle to validate
-         *
-         * @exception {DeveloperError} <code>north</code> must be in the interval [<code>-Pi/2</code>, <code>Pi/2</code>].
-         * @exception {DeveloperError} <code>south</code> must be in the interval [<code>-Pi/2</code>, <code>Pi/2</code>].
-         * @exception {DeveloperError} <code>east</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].
-         * @exception {DeveloperError} <code>west</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].
-         */
-        Rectangle.validate = function(rectangle) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-
-            var north = rectangle.north;
-            Check.Check.typeOf.number.greaterThanOrEquals('north', north, -_Math.CesiumMath.PI_OVER_TWO);
-            Check.Check.typeOf.number.lessThanOrEquals('north', north, _Math.CesiumMath.PI_OVER_TWO);
-
-            var south = rectangle.south;
-            Check.Check.typeOf.number.greaterThanOrEquals('south', south, -_Math.CesiumMath.PI_OVER_TWO);
-            Check.Check.typeOf.number.lessThanOrEquals('south', south, _Math.CesiumMath.PI_OVER_TWO);
-
-            var west = rectangle.west;
-            Check.Check.typeOf.number.greaterThanOrEquals('west', west, -Math.PI);
-            Check.Check.typeOf.number.lessThanOrEquals('west', west, Math.PI);
-
-            var east = rectangle.east;
-            Check.Check.typeOf.number.greaterThanOrEquals('east', east, -Math.PI);
-            Check.Check.typeOf.number.lessThanOrEquals('east', east, Math.PI);
-            //>>includeEnd('debug');
-        };
-
-        /**
-         * Computes the southwest corner of a rectangle.
-         *
-         * @param {Rectangle} rectangle The rectangle for which to find the corner
-         * @param {Cartographic} [result] The object onto which to store the result.
-         * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.
-         */
-        Rectangle.southwest = function(rectangle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Cartographic.Cartographic(rectangle.west, rectangle.south);
-            }
-            result.longitude = rectangle.west;
-            result.latitude = rectangle.south;
-            result.height = 0.0;
-            return result;
-        };
-
-        /**
-         * Computes the northwest corner of a rectangle.
-         *
-         * @param {Rectangle} rectangle The rectangle for which to find the corner
-         * @param {Cartographic} [result] The object onto which to store the result.
-         * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.
-         */
-        Rectangle.northwest = function(rectangle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Cartographic.Cartographic(rectangle.west, rectangle.north);
-            }
-            result.longitude = rectangle.west;
-            result.latitude = rectangle.north;
-            result.height = 0.0;
-            return result;
-        };
-
-        /**
-         * Computes the northeast corner of a rectangle.
-         *
-         * @param {Rectangle} rectangle The rectangle for which to find the corner
-         * @param {Cartographic} [result] The object onto which to store the result.
-         * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.
-         */
-        Rectangle.northeast = function(rectangle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Cartographic.Cartographic(rectangle.east, rectangle.north);
-            }
-            result.longitude = rectangle.east;
-            result.latitude = rectangle.north;
-            result.height = 0.0;
-            return result;
-        };
-
-        /**
-         * Computes the southeast corner of a rectangle.
-         *
-         * @param {Rectangle} rectangle The rectangle for which to find the corner
-         * @param {Cartographic} [result] The object onto which to store the result.
-         * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.
-         */
-        Rectangle.southeast = function(rectangle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Cartographic.Cartographic(rectangle.east, rectangle.south);
-            }
-            result.longitude = rectangle.east;
-            result.latitude = rectangle.south;
-            result.height = 0.0;
-            return result;
-        };
-
-        /**
-         * Computes the center of a rectangle.
-         *
-         * @param {Rectangle} rectangle The rectangle for which to find the center
-         * @param {Cartographic} [result] The object onto which to store the result.
-         * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.
-         */
-        Rectangle.center = function(rectangle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            //>>includeEnd('debug');
-
-            var east = rectangle.east;
-            var west = rectangle.west;
-
-            if (east < west) {
-                east += _Math.CesiumMath.TWO_PI;
-            }
-
-            var longitude = _Math.CesiumMath.negativePiToPi((west + east) * 0.5);
-            var latitude = (rectangle.south + rectangle.north) * 0.5;
-
-            if (!when.defined(result)) {
-                return new Cartographic.Cartographic(longitude, latitude);
-            }
-
-            result.longitude = longitude;
-            result.latitude = latitude;
-            result.height = 0.0;
-            return result;
-        };
-
-        /**
-         * Computes the intersection of two rectangles.  This function assumes that the rectangle's coordinates are
-         * latitude and longitude in radians and produces a correct intersection, taking into account the fact that
-         * the same angle can be represented with multiple values as well as the wrapping of longitude at the
-         * anti-meridian.  For a simple intersection that ignores these factors and can be used with projected
-         * coordinates, see {@link Rectangle.simpleIntersection}.
-         *
-         * @param {Rectangle} rectangle On rectangle to find an intersection
-         * @param {Rectangle} otherRectangle Another rectangle to find an intersection
-         * @param {Rectangle} [result] The object onto which to store the result.
-         * @returns {Rectangle|undefined} The modified result parameter, a new Rectangle instance if none was provided or undefined if there is no intersection.
-         */
-        Rectangle.intersection = function(rectangle, otherRectangle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            Check.Check.typeOf.object('otherRectangle', otherRectangle);
-            //>>includeEnd('debug');
-
-            var rectangleEast = rectangle.east;
-            var rectangleWest = rectangle.west;
-
-            var otherRectangleEast = otherRectangle.east;
-            var otherRectangleWest = otherRectangle.west;
-
-            if (rectangleEast < rectangleWest && otherRectangleEast > 0.0) {
-                rectangleEast += _Math.CesiumMath.TWO_PI;
-            } else if (otherRectangleEast < otherRectangleWest && rectangleEast > 0.0) {
-                otherRectangleEast += _Math.CesiumMath.TWO_PI;
-            }
-
-            if (rectangleEast < rectangleWest && otherRectangleWest < 0.0) {
-                otherRectangleWest += _Math.CesiumMath.TWO_PI;
-            } else if (otherRectangleEast < otherRectangleWest && rectangleWest < 0.0) {
-                rectangleWest += _Math.CesiumMath.TWO_PI;
-            }
-
-            var west = _Math.CesiumMath.negativePiToPi(Math.max(rectangleWest, otherRectangleWest));
-            var east = _Math.CesiumMath.negativePiToPi(Math.min(rectangleEast, otherRectangleEast));
-
-            if ((rectangle.west < rectangle.east || otherRectangle.west < otherRectangle.east) && east <= west) {
-                return undefined;
-            }
-
-            var south = Math.max(rectangle.south, otherRectangle.south);
-            var north = Math.min(rectangle.north, otherRectangle.north);
-
-            if (south >= north) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                return new Rectangle(west, south, east, north);
-            }
-            result.west = west;
-            result.south = south;
-            result.east = east;
-            result.north = north;
-            return result;
-        };
-
-        /**
-         * Computes a simple intersection of two rectangles.  Unlike {@link Rectangle.intersection}, this function
-         * does not attempt to put the angular coordinates into a consistent range or to account for crossing the
-         * anti-meridian.  As such, it can be used for rectangles where the coordinates are not simply latitude
-         * and longitude (i.e. projected coordinates).
-         *
-         * @param {Rectangle} rectangle On rectangle to find an intersection
-         * @param {Rectangle} otherRectangle Another rectangle to find an intersection
-         * @param {Rectangle} [result] The object onto which to store the result.
-         * @returns {Rectangle|undefined} The modified result parameter, a new Rectangle instance if none was provided or undefined if there is no intersection.
-         */
-        Rectangle.simpleIntersection = function(rectangle, otherRectangle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            Check.Check.typeOf.object('otherRectangle', otherRectangle);
-            //>>includeEnd('debug');
-
-            var west = Math.max(rectangle.west, otherRectangle.west);
-            var south = Math.max(rectangle.south, otherRectangle.south);
-            var east = Math.min(rectangle.east, otherRectangle.east);
-            var north = Math.min(rectangle.north, otherRectangle.north);
-
-            if (south >= north || west >= east) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                return new Rectangle(west, south, east, north);
-            }
-
-            result.west = west;
-            result.south = south;
-            result.east = east;
-            result.north = north;
-            return result;
-        };
-
-        /**
-         * Computes a rectangle that is the union of two rectangles.
-         *
-         * @param {Rectangle} rectangle A rectangle to enclose in rectangle.
-         * @param {Rectangle} otherRectangle A rectangle to enclose in a rectangle.
-         * @param {Rectangle} [result] The object onto which to store the result.
-         * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.
-         */
-        Rectangle.union = function(rectangle, otherRectangle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            Check.Check.typeOf.object('otherRectangle', otherRectangle);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Rectangle();
-            }
-
-            var rectangleEast = rectangle.east;
-            var rectangleWest = rectangle.west;
-
-            var otherRectangleEast = otherRectangle.east;
-            var otherRectangleWest = otherRectangle.west;
-
-            if (rectangleEast < rectangleWest && otherRectangleEast > 0.0) {
-                rectangleEast += _Math.CesiumMath.TWO_PI;
-            } else if (otherRectangleEast < otherRectangleWest && rectangleEast > 0.0) {
-                otherRectangleEast += _Math.CesiumMath.TWO_PI;
-            }
-
-            if (rectangleEast < rectangleWest && otherRectangleWest < 0.0) {
-                otherRectangleWest += _Math.CesiumMath.TWO_PI;
-            } else if (otherRectangleEast < otherRectangleWest && rectangleWest < 0.0) {
-                rectangleWest += _Math.CesiumMath.TWO_PI;
-            }
-
-            var west = _Math.CesiumMath.convertLongitudeRange(Math.min(rectangleWest, otherRectangleWest));
-            var east = _Math.CesiumMath.convertLongitudeRange(Math.max(rectangleEast, otherRectangleEast));
-
-            result.west = west;
-            result.south = Math.min(rectangle.south, otherRectangle.south);
-            result.east = east;
-            result.north = Math.max(rectangle.north, otherRectangle.north);
-
-            return result;
-        };
-
-        /**
-         * Computes a rectangle by enlarging the provided rectangle until it contains the provided cartographic.
-         *
-         * @param {Rectangle} rectangle A rectangle to expand.
-         * @param {Cartographic} cartographic A cartographic to enclose in a rectangle.
-         * @param {Rectangle} [result] The object onto which to store the result.
-         * @returns {Rectangle} The modified result parameter or a new Rectangle instance if one was not provided.
-         */
-        Rectangle.expand = function(rectangle, cartographic, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            Check.Check.typeOf.object('cartographic', cartographic);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Rectangle();
-            }
-
-            result.west = Math.min(rectangle.west, cartographic.longitude);
-            result.south = Math.min(rectangle.south, cartographic.latitude);
-            result.east = Math.max(rectangle.east, cartographic.longitude);
-            result.north = Math.max(rectangle.north, cartographic.latitude);
-
-            return result;
-        };
-
-        /**
-         * Returns true if the cartographic is on or inside the rectangle, false otherwise.
-         *
-         * @param {Rectangle} rectangle The rectangle
-         * @param {Cartographic} cartographic The cartographic to test.
-         * @returns {Boolean} true if the provided cartographic is inside the rectangle, false otherwise.
-         */
-        Rectangle.contains = function(rectangle, cartographic) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            Check.Check.typeOf.object('cartographic', cartographic);
-            //>>includeEnd('debug');
-
-            var longitude = cartographic.longitude;
-            var latitude = cartographic.latitude;
-
-            var west = rectangle.west;
-            var east = rectangle.east;
-
-            if (east < west) {
-                east += _Math.CesiumMath.TWO_PI;
-                if (longitude < 0.0) {
-                    longitude += _Math.CesiumMath.TWO_PI;
-                }
-            }
-            return (longitude > west || _Math.CesiumMath.equalsEpsilon(longitude, west, _Math.CesiumMath.EPSILON14)) &&
-                   (longitude < east || _Math.CesiumMath.equalsEpsilon(longitude, east, _Math.CesiumMath.EPSILON14)) &&
-                   latitude >= rectangle.south &&
-                   latitude <= rectangle.north;
-        };
-
-        var subsampleLlaScratch = new Cartographic.Cartographic();
-        /**
-         * Samples a rectangle so that it includes a list of Cartesian points suitable for passing to
-         * {@link BoundingSphere#fromPoints}.  Sampling is necessary to account
-         * for rectangles that cover the poles or cross the equator.
-         *
-         * @param {Rectangle} rectangle The rectangle to subsample.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid to use.
-         * @param {Number} [surfaceHeight=0.0] The height of the rectangle above the ellipsoid.
-         * @param {Cartesian3[]} [result] The array of Cartesians onto which to store the result.
-         * @returns {Cartesian3[]} The modified result parameter or a new Array of Cartesians instances if none was provided.
-         */
-        Rectangle.subsample = function(rectangle, ellipsoid, surfaceHeight, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            //>>includeEnd('debug');
-
-            ellipsoid = when.defaultValue(ellipsoid, Ellipsoid.WGS84);
-            surfaceHeight = when.defaultValue(surfaceHeight, 0.0);
-
-            if (!when.defined(result)) {
-                result = [];
-            }
-            var length = 0;
-
-            var north = rectangle.north;
-            var south = rectangle.south;
-            var east = rectangle.east;
-            var west = rectangle.west;
-
-            var lla = subsampleLlaScratch;
-            lla.height = surfaceHeight;
-
-            lla.longitude = west;
-            lla.latitude = north;
-            result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);
-            length++;
-
-            lla.longitude = east;
-            result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);
-            length++;
-
-            lla.latitude = south;
-            result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);
-            length++;
-
-            lla.longitude = west;
-            result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);
-            length++;
-
-            if (north < 0.0) {
-                lla.latitude = north;
-            } else if (south > 0.0) {
-                lla.latitude = south;
-            } else {
-                lla.latitude = 0.0;
-            }
-
-            for ( var i = 1; i < 8; ++i) {
-                lla.longitude = -Math.PI + i * _Math.CesiumMath.PI_OVER_TWO;
-                if (Rectangle.contains(rectangle, lla)) {
-                    result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);
-                    length++;
-                }
-            }
-
-            if (lla.latitude === 0.0) {
-                lla.longitude = west;
-                result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);
-                length++;
-                lla.longitude = east;
-                result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);
-                length++;
-            }
-            result.length = length;
-            return result;
-        };
-
-        var scratchCartographic = new Cartographic.Cartographic();
-        Rectangle.prototype.contains = function(rectangle) {
-            return Rectangle.contains(this, Rectangle.southwest(rectangle, scratchCartographic))
-                && Rectangle.contains(this, Rectangle.northwest(rectangle, scratchCartographic))
-                && Rectangle.contains(this, Rectangle.southeast(rectangle, scratchCartographic))
-                && Rectangle.contains(this, Rectangle.northeast(rectangle, scratchCartographic));
-        };
-
-        /**
-         * The largest possible rectangle.
-         *
-         * @type {Rectangle}
-         * @constant
-        */
-        Rectangle.MAX_VALUE = Object.freeze(new Rectangle(-Math.PI, -_Math.CesiumMath.PI_OVER_TWO, Math.PI, _Math.CesiumMath.PI_OVER_TWO));
-
-    /**
-         * A 2D Cartesian point.
-         * @alias Cartesian2
-         * @constructor
-         *
-         * @param {Number} [x=0.0] The X component.
-         * @param {Number} [y=0.0] The Y component.
-         *
-         * @see Cartesian3
-         * @see Cartesian4
-         * @see Packable
-         */
-        function Cartesian2(x, y) {
-            /**
-             * The X component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.x = when.defaultValue(x, 0.0);
-
-            /**
-             * The Y component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.y = when.defaultValue(y, 0.0);
-        }
-
-        /**
-         * Creates a Cartesian2 instance from x and y coordinates.
-         *
-         * @param {Number} x The x coordinate.
-         * @param {Number} y The y coordinate.
-         * @param {Cartesian2} [result] The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.
-         */
-        Cartesian2.fromElements = function(x, y, result) {
-            if (!when.defined(result)) {
-                return new Cartesian2(x, y);
-            }
-
-            result.x = x;
-            result.y = y;
-            return result;
-        };
-
-        /**
-         * Duplicates a Cartesian2 instance.
-         *
-         * @param {Cartesian2} cartesian The Cartesian to duplicate.
-         * @param {Cartesian2} [result] The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided. (Returns undefined if cartesian is undefined)
-         */
-        Cartesian2.clone = function(cartesian, result) {
-            if (!when.defined(cartesian)) {
-                return undefined;
-            }
-            if (!when.defined(result)) {
-                return new Cartesian2(cartesian.x, cartesian.y);
-            }
-
-            result.x = cartesian.x;
-            result.y = cartesian.y;
-            return result;
-        };
-
-        /**
-         * Creates a Cartesian2 instance from an existing Cartesian3.  This simply takes the
-         * x and y properties of the Cartesian3 and drops z.
-         * @function
-         *
-         * @param {Cartesian3} cartesian The Cartesian3 instance to create a Cartesian2 instance from.
-         * @param {Cartesian2} [result] The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.
-         */
-        Cartesian2.fromCartesian3 = Cartesian2.clone;
-
-        /**
-         * Creates a Cartesian2 instance from an existing Cartesian4.  This simply takes the
-         * x and y properties of the Cartesian4 and drops z and w.
-         * @function
-         *
-         * @param {Cartesian4} cartesian The Cartesian4 instance to create a Cartesian2 instance from.
-         * @param {Cartesian2} [result] The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.
-         */
-        Cartesian2.fromCartesian4 = Cartesian2.clone;
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        Cartesian2.packedLength = 2;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {Cartesian2} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        Cartesian2.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value.x;
-            array[startingIndex] = value.y;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {Cartesian2} [result] The object into which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.
-         */
-        Cartesian2.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new Cartesian2();
-            }
-            result.x = array[startingIndex++];
-            result.y = array[startingIndex];
-            return result;
-        };
-
-        /**
-         * Flattens an array of Cartesian2s into and array of components.
-         *
-         * @param {Cartesian2[]} array The array of cartesians to pack.
-         * @param {Number[]} [result] The array onto which to store the result. If this is a typed array, it must have array.length * 2 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 2) elements.
-
-         * @returns {Number[]} The packed array.
-         */
-        Cartesian2.packArray = function(array, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            var length = array.length;
-            var resultLength = length * 2;
-            if (!when.defined(result)) {
-                result = new Array(resultLength);
-            } else if (!Array.isArray(result) && result.length !== resultLength) {
-                throw new Check.DeveloperError('If result is a typed array, it must have exactly array.length * 2 elements');
-            } else if (result.length !== resultLength) {
-                result.length = resultLength;
-            }
-
-            for (var i = 0; i < length; ++i) {
-                Cartesian2.pack(array[i], result, i * 2);
-            }
-            return result;
-        };
-
-        /**
-         * Unpacks an array of cartesian components into and array of Cartesian2s.
-         *
-         * @param {Number[]} array The array of components to unpack.
-         * @param {Cartesian2[]} [result] The array onto which to store the result.
-         * @returns {Cartesian2[]} The unpacked array.
-         */
-        Cartesian2.unpackArray = function(array, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            Check.Check.typeOf.number.greaterThanOrEquals('array.length', array.length, 2);
-            if (array.length % 2 !== 0) {
-                throw new Check.DeveloperError('array length must be a multiple of 2.');
-            }
-            //>>includeEnd('debug');
-
-            var length = array.length;
-            if (!when.defined(result)) {
-                result = new Array(length / 2);
-            } else {
-                result.length = length / 2;
-            }
-
-            for (var i = 0; i < length; i += 2) {
-                var index = i / 2;
-                result[index] = Cartesian2.unpack(array, i, result[index]);
-            }
-            return result;
-        };
-
-        /**
-         * Creates a Cartesian2 from two consecutive elements in an array.
-         * @function
-         *
-         * @param {Number[]} array The array whose two consecutive elements correspond to the x and y components, respectively.
-         * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to the x component.
-         * @param {Cartesian2} [result] The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.
-         *
-         * @example
-         * // Create a Cartesian2 with (1.0, 2.0)
-         * var v = [1.0, 2.0];
-         * var p = Cesium.Cartesian2.fromArray(v);
-         *
-         * // Create a Cartesian2 with (1.0, 2.0) using an offset into an array
-         * var v2 = [0.0, 0.0, 1.0, 2.0];
-         * var p2 = Cesium.Cartesian2.fromArray(v2, 2);
-         */
-        Cartesian2.fromArray = Cartesian2.unpack;
-
-        /**
-         * Computes the value of the maximum component for the supplied Cartesian.
-         *
-         * @param {Cartesian2} cartesian The cartesian to use.
-         * @returns {Number} The value of the maximum component.
-         */
-        Cartesian2.maximumComponent = function(cartesian) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            return Math.max(cartesian.x, cartesian.y);
-        };
-
-        /**
-         * Computes the value of the minimum component for the supplied Cartesian.
-         *
-         * @param {Cartesian2} cartesian The cartesian to use.
-         * @returns {Number} The value of the minimum component.
-         */
-        Cartesian2.minimumComponent = function(cartesian) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            return Math.min(cartesian.x, cartesian.y);
-        };
-
-        /**
-         * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians.
-         *
-         * @param {Cartesian2} first A cartesian to compare.
-         * @param {Cartesian2} second A cartesian to compare.
-         * @param {Cartesian2} result The object into which to store the result.
-         * @returns {Cartesian2} A cartesian with the minimum components.
-         */
-        Cartesian2.minimumByComponent = function(first, second, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('first', first);
-            Check.Check.typeOf.object('second', second);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = Math.min(first.x, second.x);
-            result.y = Math.min(first.y, second.y);
-
-            return result;
-        };
-
-        /**
-         * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians.
-         *
-         * @param {Cartesian2} first A cartesian to compare.
-         * @param {Cartesian2} second A cartesian to compare.
-         * @param {Cartesian2} result The object into which to store the result.
-         * @returns {Cartesian2} A cartesian with the maximum components.
-         */
-        Cartesian2.maximumByComponent = function(first, second, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('first', first);
-            Check.Check.typeOf.object('second', second);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = Math.max(first.x, second.x);
-            result.y = Math.max(first.y, second.y);
-            return result;
-        };
-
-        /**
-         * Computes the provided Cartesian's squared magnitude.
-         *
-         * @param {Cartesian2} cartesian The Cartesian instance whose squared magnitude is to be computed.
-         * @returns {Number} The squared magnitude.
-         */
-        Cartesian2.magnitudeSquared = function(cartesian) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            return cartesian.x * cartesian.x + cartesian.y * cartesian.y;
-        };
-
-        /**
-         * Computes the Cartesian's magnitude (length).
-         *
-         * @param {Cartesian2} cartesian The Cartesian instance whose magnitude is to be computed.
-         * @returns {Number} The magnitude.
-         */
-        Cartesian2.magnitude = function(cartesian) {
-            return Math.sqrt(Cartesian2.magnitudeSquared(cartesian));
-        };
-
-        var distanceScratch = new Cartesian2();
-
-        /**
-         * Computes the distance between two points.
-         *
-         * @param {Cartesian2} left The first point to compute the distance from.
-         * @param {Cartesian2} right The second point to compute the distance to.
-         * @returns {Number} The distance between two points.
-         *
-         * @example
-         * // Returns 1.0
-         * var d = Cesium.Cartesian2.distance(new Cesium.Cartesian2(1.0, 0.0), new Cesium.Cartesian2(2.0, 0.0));
-         */
-        Cartesian2.distance = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            Cartesian2.subtract(left, right, distanceScratch);
-            return Cartesian2.magnitude(distanceScratch);
-        };
-
-        /**
-         * Computes the squared distance between two points.  Comparing squared distances
-         * using this function is more efficient than comparing distances using {@link Cartesian2#distance}.
-         *
-         * @param {Cartesian2} left The first point to compute the distance from.
-         * @param {Cartesian2} right The second point to compute the distance to.
-         * @returns {Number} The distance between two points.
-         *
-         * @example
-         * // Returns 4.0, not 2.0
-         * var d = Cesium.Cartesian2.distance(new Cesium.Cartesian2(1.0, 0.0), new Cesium.Cartesian2(3.0, 0.0));
-         */
-        Cartesian2.distanceSquared = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            Cartesian2.subtract(left, right, distanceScratch);
-            return Cartesian2.magnitudeSquared(distanceScratch);
-        };
-
-        /**
-         * Computes the normalized form of the supplied Cartesian.
-         *
-         * @param {Cartesian2} cartesian The Cartesian to be normalized.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.normalize = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var magnitude = Cartesian2.magnitude(cartesian);
-
-            result.x = cartesian.x / magnitude;
-            result.y = cartesian.y / magnitude;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (isNaN(result.x) || isNaN(result.y)) {
-                throw new Check.DeveloperError('normalized result is not a number');
-            }
-            //>>includeEnd('debug');
-
-            return result;
-        };
-
-        /**
-         * Computes the dot (scalar) product of two Cartesians.
-         *
-         * @param {Cartesian2} left The first Cartesian.
-         * @param {Cartesian2} right The second Cartesian.
-         * @returns {Number} The dot product.
-         */
-        Cartesian2.dot = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            return left.x * right.x + left.y * right.y;
-        };
-
-        /**
-         * Computes the componentwise product of two Cartesians.
-         *
-         * @param {Cartesian2} left The first Cartesian.
-         * @param {Cartesian2} right The second Cartesian.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.multiplyComponents = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x * right.x;
-            result.y = left.y * right.y;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise quotient of two Cartesians.
-         *
-         * @param {Cartesian2} left The first Cartesian.
-         * @param {Cartesian2} right The second Cartesian.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.divideComponents = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x / right.x;
-            result.y = left.y / right.y;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise sum of two Cartesians.
-         *
-         * @param {Cartesian2} left The first Cartesian.
-         * @param {Cartesian2} right The second Cartesian.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.add = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x + right.x;
-            result.y = left.y + right.y;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise difference of two Cartesians.
-         *
-         * @param {Cartesian2} left The first Cartesian.
-         * @param {Cartesian2} right The second Cartesian.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.subtract = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x - right.x;
-            result.y = left.y - right.y;
-            return result;
-        };
-
-        /**
-         * Multiplies the provided Cartesian componentwise by the provided scalar.
-         *
-         * @param {Cartesian2} cartesian The Cartesian to be scaled.
-         * @param {Number} scalar The scalar to multiply with.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.multiplyByScalar = function(cartesian, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = cartesian.x * scalar;
-            result.y = cartesian.y * scalar;
-            return result;
-        };
-
-        /**
-         * Divides the provided Cartesian componentwise by the provided scalar.
-         *
-         * @param {Cartesian2} cartesian The Cartesian to be divided.
-         * @param {Number} scalar The scalar to divide by.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.divideByScalar = function(cartesian, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = cartesian.x / scalar;
-            result.y = cartesian.y / scalar;
-            return result;
-        };
-
-        /**
-         * Negates the provided Cartesian.
-         *
-         * @param {Cartesian2} cartesian The Cartesian to be negated.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.negate = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = -cartesian.x;
-            result.y = -cartesian.y;
-            return result;
-        };
-
-        /**
-         * Computes the absolute value of the provided Cartesian.
-         *
-         * @param {Cartesian2} cartesian The Cartesian whose absolute value is to be computed.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.abs = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = Math.abs(cartesian.x);
-            result.y = Math.abs(cartesian.y);
-            return result;
-        };
-
-        var lerpScratch = new Cartesian2();
-        /**
-         * Computes the linear interpolation or extrapolation at t using the provided cartesians.
-         *
-         * @param {Cartesian2} start The value corresponding to t at 0.0.
-         * @param {Cartesian2} end The value corresponding to t at 1.0.
-         * @param {Number} t The point along t at which to interpolate.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Cartesian2.lerp = function(start, end, t, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('start', start);
-            Check.Check.typeOf.object('end', end);
-            Check.Check.typeOf.number('t', t);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            Cartesian2.multiplyByScalar(end, t, lerpScratch);
-            result = Cartesian2.multiplyByScalar(start, 1.0 - t, result);
-            return Cartesian2.add(lerpScratch, result, result);
-        };
-
-        var angleBetweenScratch = new Cartesian2();
-        var angleBetweenScratch2 = new Cartesian2();
-        /**
-         * Returns the angle, in radians, between the provided Cartesians.
-         *
-         * @param {Cartesian2} left The first Cartesian.
-         * @param {Cartesian2} right The second Cartesian.
-         * @returns {Number} The angle between the Cartesians.
-         */
-        Cartesian2.angleBetween = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            Cartesian2.normalize(left, angleBetweenScratch);
-            Cartesian2.normalize(right, angleBetweenScratch2);
-            return _Math.CesiumMath.acosClamped(Cartesian2.dot(angleBetweenScratch, angleBetweenScratch2));
-        };
-
-        var mostOrthogonalAxisScratch = new Cartesian2();
-        /**
-         * Returns the axis that is most orthogonal to the provided Cartesian.
-         *
-         * @param {Cartesian2} cartesian The Cartesian on which to find the most orthogonal axis.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The most orthogonal axis.
-         */
-        Cartesian2.mostOrthogonalAxis = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var f = Cartesian2.normalize(cartesian, mostOrthogonalAxisScratch);
-            Cartesian2.abs(f, f);
-
-            if (f.x <= f.y) {
-                result = Cartesian2.clone(Cartesian2.UNIT_X, result);
-            } else {
-                result = Cartesian2.clone(Cartesian2.UNIT_Y, result);
-            }
-
-            return result;
-        };
-
-        /**
-         * Compares the provided Cartesians componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Cartesian2} [left] The first Cartesian.
-         * @param {Cartesian2} [right] The second Cartesian.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        Cartesian2.equals = function(left, right) {
-            return (left === right) ||
-                   ((when.defined(left)) &&
-                    (when.defined(right)) &&
-                    (left.x === right.x) &&
-                    (left.y === right.y));
-        };
-
-        /**
-         * @private
-         */
-        Cartesian2.equalsArray = function(cartesian, array, offset) {
-            return cartesian.x === array[offset] &&
-                   cartesian.y === array[offset + 1];
-        };
-
-        /**
-         * Compares the provided Cartesians componentwise and returns
-         * <code>true</code> if they pass an absolute or relative tolerance test,
-         * <code>false</code> otherwise.
-         *
-         * @param {Cartesian2} [left] The first Cartesian.
-         * @param {Cartesian2} [right] The second Cartesian.
-         * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-         * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-         * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Cartesian2.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) {
-            return (left === right) ||
-                   (when.defined(left) &&
-                    when.defined(right) &&
-                    _Math.CesiumMath.equalsEpsilon(left.x, right.x, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(left.y, right.y, relativeEpsilon, absoluteEpsilon));
-        };
-
-        /**
-         * An immutable Cartesian2 instance initialized to (0.0, 0.0).
-         *
-         * @type {Cartesian2}
-         * @constant
-         */
-        Cartesian2.ZERO = Object.freeze(new Cartesian2(0.0, 0.0));
-
-        /**
-         * An immutable Cartesian2 instance initialized to (1.0, 0.0).
-         *
-         * @type {Cartesian2}
-         * @constant
-         */
-        Cartesian2.UNIT_X = Object.freeze(new Cartesian2(1.0, 0.0));
-
-        /**
-         * An immutable Cartesian2 instance initialized to (0.0, 1.0).
-         *
-         * @type {Cartesian2}
-         * @constant
-         */
-        Cartesian2.UNIT_Y = Object.freeze(new Cartesian2(0.0, 1.0));
-
-        /**
-         * Duplicates this Cartesian2 instance.
-         *
-         * @param {Cartesian2} [result] The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.
-         */
-        Cartesian2.prototype.clone = function(result) {
-            return Cartesian2.clone(this, result);
-        };
-
-        /**
-         * Compares this Cartesian against the provided Cartesian componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Cartesian2} [right] The right hand side Cartesian.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        Cartesian2.prototype.equals = function(right) {
-            return Cartesian2.equals(this, right);
-        };
-
-        /**
-         * Compares this Cartesian against the provided Cartesian componentwise and returns
-         * <code>true</code> if they pass an absolute or relative tolerance test,
-         * <code>false</code> otherwise.
-         *
-         * @param {Cartesian2} [right] The right hand side Cartesian.
-         * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-         * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-         * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Cartesian2.prototype.equalsEpsilon = function(right, relativeEpsilon, absoluteEpsilon) {
-            return Cartesian2.equalsEpsilon(this, right, relativeEpsilon, absoluteEpsilon);
-        };
-
-        /**
-         * Creates a string representing this Cartesian in the format '(x, y)'.
-         *
-         * @returns {String} A string representing the provided Cartesian in the format '(x, y)'.
-         */
-        Cartesian2.prototype.toString = function() {
-            return '(' + this.x + ', ' + this.y + ')';
-        };
-
-    exports.Cartesian2 = Cartesian2;
-    exports.Ellipsoid = Ellipsoid;
-    exports.Rectangle = Rectangle;
-
-});
diff --git a/public/libs/Cesium/Workers/Cartesian4-5af5bb24.js b/public/libs/Cesium/Workers/Cartesian4-5af5bb24.js
deleted file mode 100644
index bdc912a..0000000
--- a/public/libs/Cesium/Workers/Cartesian4-5af5bb24.js
+++ /dev/null
@@ -1,927 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240'], function (exports, when, Check, _Math) { 'use strict';
-
-    /**
-         * A 4D Cartesian point.
-         * @alias Cartesian4
-         * @constructor
-         *
-         * @param {Number} [x=0.0] The X component.
-         * @param {Number} [y=0.0] The Y component.
-         * @param {Number} [z=0.0] The Z component.
-         * @param {Number} [w=0.0] The W component.
-         *
-         * @see Cartesian2
-         * @see Cartesian3
-         * @see Packable
-         */
-        function Cartesian4(x, y, z, w) {
-            /**
-             * The X component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.x = when.defaultValue(x, 0.0);
-
-            /**
-             * The Y component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.y = when.defaultValue(y, 0.0);
-
-            /**
-             * The Z component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.z = when.defaultValue(z, 0.0);
-
-            /**
-             * The W component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.w = when.defaultValue(w, 0.0);
-        }
-
-        /**
-         * Creates a Cartesian4 instance from x, y, z and w coordinates.
-         *
-         * @param {Number} x The x coordinate.
-         * @param {Number} y The y coordinate.
-         * @param {Number} z The z coordinate.
-         * @param {Number} w The w coordinate.
-         * @param {Cartesian4} [result] The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter or a new Cartesian4 instance if one was not provided.
-         */
-        Cartesian4.fromElements = function(x, y, z, w, result) {
-            if (!when.defined(result)) {
-                return new Cartesian4(x, y, z, w);
-            }
-
-            result.x = x;
-            result.y = y;
-            result.z = z;
-            result.w = w;
-            return result;
-        };
-
-        /**
-         * Creates a Cartesian4 instance from a {@link Color}. <code>red</code>, <code>green</code>, <code>blue</code>,
-         * and <code>alpha</code> map to <code>x</code>, <code>y</code>, <code>z</code>, and <code>w</code>, respectively.
-         *
-         * @param {Color} color The source color.
-         * @param {Cartesian4} [result] The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter or a new Cartesian4 instance if one was not provided.
-         */
-        Cartesian4.fromColor = function(color, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('color', color);
-            //>>includeEnd('debug');
-            if (!when.defined(result)) {
-                return new Cartesian4(color.red, color.green, color.blue, color.alpha);
-            }
-
-            result.x = color.red;
-            result.y = color.green;
-            result.z = color.blue;
-            result.w = color.alpha;
-            return result;
-        };
-
-        /**
-         * Duplicates a Cartesian4 instance.
-         *
-         * @param {Cartesian4} cartesian The Cartesian to duplicate.
-         * @param {Cartesian4} [result] The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter or a new Cartesian4 instance if one was not provided. (Returns undefined if cartesian is undefined)
-         */
-        Cartesian4.clone = function(cartesian, result) {
-            if (!when.defined(cartesian)) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                return new Cartesian4(cartesian.x, cartesian.y, cartesian.z, cartesian.w);
-            }
-
-            result.x = cartesian.x;
-            result.y = cartesian.y;
-            result.z = cartesian.z;
-            result.w = cartesian.w;
-            return result;
-        };
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        Cartesian4.packedLength = 4;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {Cartesian4} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        Cartesian4.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value.x;
-            array[startingIndex++] = value.y;
-            array[startingIndex++] = value.z;
-            array[startingIndex] = value.w;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {Cartesian4} [result] The object into which to store the result.
-         * @returns {Cartesian4}  The modified result parameter or a new Cartesian4 instance if one was not provided.
-         */
-        Cartesian4.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new Cartesian4();
-            }
-            result.x = array[startingIndex++];
-            result.y = array[startingIndex++];
-            result.z = array[startingIndex++];
-            result.w = array[startingIndex];
-            return result;
-        };
-
-        /**
-         * Flattens an array of Cartesian4s into and array of components.
-         *
-         * @param {Cartesian4[]} array The array of cartesians to pack.
-         * @param {Number[]} [result] The array onto which to store the result. If this is a typed array, it must have array.length * 4 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 4) elements.
-
-         * @returns {Number[]} The packed array.
-         */
-        Cartesian4.packArray = function(array, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            var length = array.length;
-            var resultLength = length * 4;
-            if (!when.defined(result)) {
-                result = new Array(resultLength);
-            } else if (!Array.isArray(result) && result.length !== resultLength) {
-                throw new Check.DeveloperError('If result is a typed array, it must have exactly array.length * 4 elements');
-            } else if (result.length !== resultLength) {
-                result.length = resultLength;
-            }
-
-            for (var i = 0; i < length; ++i) {
-                Cartesian4.pack(array[i], result, i * 4);
-            }
-            return result;
-        };
-
-        /**
-         * Unpacks an array of cartesian components into and array of Cartesian4s.
-         *
-         * @param {Number[]} array The array of components to unpack.
-         * @param {Cartesian4[]} [result] The array onto which to store the result.
-         * @returns {Cartesian4[]} The unpacked array.
-         */
-        Cartesian4.unpackArray = function(array, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            Check.Check.typeOf.number.greaterThanOrEquals('array.length', array.length, 4);
-            if (array.length % 4 !== 0) {
-                throw new Check.DeveloperError('array length must be a multiple of 4.');
-            }
-            //>>includeEnd('debug');
-
-            var length = array.length;
-            if (!when.defined(result)) {
-                result = new Array(length / 4);
-            } else {
-                result.length = length / 4;
-            }
-
-            for (var i = 0; i < length; i += 4) {
-                var index = i / 4;
-                result[index] = Cartesian4.unpack(array, i, result[index]);
-            }
-            return result;
-        };
-
-        /**
-         * Creates a Cartesian4 from four consecutive elements in an array.
-         * @function
-         *
-         * @param {Number[]} array The array whose four consecutive elements correspond to the x, y, z, and w components, respectively.
-         * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to the x component.
-         * @param {Cartesian4} [result] The object onto which to store the result.
-         * @returns {Cartesian4}  The modified result parameter or a new Cartesian4 instance if one was not provided.
-         *
-         * @example
-         * // Create a Cartesian4 with (1.0, 2.0, 3.0, 4.0)
-         * var v = [1.0, 2.0, 3.0, 4.0];
-         * var p = Cesium.Cartesian4.fromArray(v);
-         *
-         * // Create a Cartesian4 with (1.0, 2.0, 3.0, 4.0) using an offset into an array
-         * var v2 = [0.0, 0.0, 1.0, 2.0, 3.0, 4.0];
-         * var p2 = Cesium.Cartesian4.fromArray(v2, 2);
-         */
-        Cartesian4.fromArray = Cartesian4.unpack;
-
-        /**
-         * Computes the value of the maximum component for the supplied Cartesian.
-         *
-         * @param {Cartesian4} cartesian The cartesian to use.
-         * @returns {Number} The value of the maximum component.
-         */
-        Cartesian4.maximumComponent = function(cartesian) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            return Math.max(cartesian.x, cartesian.y, cartesian.z, cartesian.w);
-        };
-
-        /**
-         * Computes the value of the minimum component for the supplied Cartesian.
-         *
-         * @param {Cartesian4} cartesian The cartesian to use.
-         * @returns {Number} The value of the minimum component.
-         */
-        Cartesian4.minimumComponent = function(cartesian) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            return Math.min(cartesian.x, cartesian.y, cartesian.z, cartesian.w);
-        };
-
-        /**
-         * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians.
-         *
-         * @param {Cartesian4} first A cartesian to compare.
-         * @param {Cartesian4} second A cartesian to compare.
-         * @param {Cartesian4} result The object into which to store the result.
-         * @returns {Cartesian4} A cartesian with the minimum components.
-         */
-        Cartesian4.minimumByComponent = function(first, second, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('first', first);
-            Check.Check.typeOf.object('second', second);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = Math.min(first.x, second.x);
-            result.y = Math.min(first.y, second.y);
-            result.z = Math.min(first.z, second.z);
-            result.w = Math.min(first.w, second.w);
-
-            return result;
-        };
-
-        /**
-         * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians.
-         *
-         * @param {Cartesian4} first A cartesian to compare.
-         * @param {Cartesian4} second A cartesian to compare.
-         * @param {Cartesian4} result The object into which to store the result.
-         * @returns {Cartesian4} A cartesian with the maximum components.
-         */
-        Cartesian4.maximumByComponent = function(first, second, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('first', first);
-            Check.Check.typeOf.object('second', second);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = Math.max(first.x, second.x);
-            result.y = Math.max(first.y, second.y);
-            result.z = Math.max(first.z, second.z);
-            result.w = Math.max(first.w, second.w);
-
-            return result;
-        };
-
-        /**
-         * Computes the provided Cartesian's squared magnitude.
-         *
-         * @param {Cartesian4} cartesian The Cartesian instance whose squared magnitude is to be computed.
-         * @returns {Number} The squared magnitude.
-         */
-        Cartesian4.magnitudeSquared = function(cartesian) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z + cartesian.w * cartesian.w;
-        };
-
-        /**
-         * Computes the Cartesian's magnitude (length).
-         *
-         * @param {Cartesian4} cartesian The Cartesian instance whose magnitude is to be computed.
-         * @returns {Number} The magnitude.
-         */
-        Cartesian4.magnitude = function(cartesian) {
-            return Math.sqrt(Cartesian4.magnitudeSquared(cartesian));
-        };
-
-        var distanceScratch = new Cartesian4();
-
-        /**
-         * Computes the 4-space distance between two points.
-         *
-         * @param {Cartesian4} left The first point to compute the distance from.
-         * @param {Cartesian4} right The second point to compute the distance to.
-         * @returns {Number} The distance between two points.
-         *
-         * @example
-         * // Returns 1.0
-         * var d = Cesium.Cartesian4.distance(
-         *   new Cesium.Cartesian4(1.0, 0.0, 0.0, 0.0),
-         *   new Cesium.Cartesian4(2.0, 0.0, 0.0, 0.0));
-         */
-        Cartesian4.distance = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            Cartesian4.subtract(left, right, distanceScratch);
-            return Cartesian4.magnitude(distanceScratch);
-        };
-
-        /**
-         * Computes the squared distance between two points.  Comparing squared distances
-         * using this function is more efficient than comparing distances using {@link Cartesian4#distance}.
-         *
-         * @param {Cartesian4} left The first point to compute the distance from.
-         * @param {Cartesian4} right The second point to compute the distance to.
-         * @returns {Number} The distance between two points.
-         *
-         * @example
-         * // Returns 4.0, not 2.0
-         * var d = Cesium.Cartesian4.distance(
-         *   new Cesium.Cartesian4(1.0, 0.0, 0.0, 0.0),
-         *   new Cesium.Cartesian4(3.0, 0.0, 0.0, 0.0));
-         */
-        Cartesian4.distanceSquared = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            Cartesian4.subtract(left, right, distanceScratch);
-            return Cartesian4.magnitudeSquared(distanceScratch);
-        };
-
-        /**
-         * Computes the normalized form of the supplied Cartesian.
-         *
-         * @param {Cartesian4} cartesian The Cartesian to be normalized.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.normalize = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var magnitude = Cartesian4.magnitude(cartesian);
-
-            result.x = cartesian.x / magnitude;
-            result.y = cartesian.y / magnitude;
-            result.z = cartesian.z / magnitude;
-            result.w = cartesian.w / magnitude;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (isNaN(result.x) || isNaN(result.y) || isNaN(result.z) || isNaN(result.w)) {
-                throw new Check.DeveloperError('normalized result is not a number');
-            }
-            //>>includeEnd('debug');
-
-            return result;
-        };
-
-        /**
-         * Computes the dot (scalar) product of two Cartesians.
-         *
-         * @param {Cartesian4} left The first Cartesian.
-         * @param {Cartesian4} right The second Cartesian.
-         * @returns {Number} The dot product.
-         */
-        Cartesian4.dot = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w;
-        };
-
-        /**
-         * Computes the componentwise product of two Cartesians.
-         *
-         * @param {Cartesian4} left The first Cartesian.
-         * @param {Cartesian4} right The second Cartesian.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.multiplyComponents = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x * right.x;
-            result.y = left.y * right.y;
-            result.z = left.z * right.z;
-            result.w = left.w * right.w;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise quotient of two Cartesians.
-         *
-         * @param {Cartesian4} left The first Cartesian.
-         * @param {Cartesian4} right The second Cartesian.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.divideComponents = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x / right.x;
-            result.y = left.y / right.y;
-            result.z = left.z / right.z;
-            result.w = left.w / right.w;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise sum of two Cartesians.
-         *
-         * @param {Cartesian4} left The first Cartesian.
-         * @param {Cartesian4} right The second Cartesian.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.add = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x + right.x;
-            result.y = left.y + right.y;
-            result.z = left.z + right.z;
-            result.w = left.w + right.w;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise difference of two Cartesians.
-         *
-         * @param {Cartesian4} left The first Cartesian.
-         * @param {Cartesian4} right The second Cartesian.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.subtract = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x - right.x;
-            result.y = left.y - right.y;
-            result.z = left.z - right.z;
-            result.w = left.w - right.w;
-            return result;
-        };
-
-        /**
-         * Multiplies the provided Cartesian componentwise by the provided scalar.
-         *
-         * @param {Cartesian4} cartesian The Cartesian to be scaled.
-         * @param {Number} scalar The scalar to multiply with.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.multiplyByScalar = function(cartesian, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = cartesian.x * scalar;
-            result.y = cartesian.y * scalar;
-            result.z = cartesian.z * scalar;
-            result.w = cartesian.w * scalar;
-            return result;
-        };
-
-        /**
-         * Divides the provided Cartesian componentwise by the provided scalar.
-         *
-         * @param {Cartesian4} cartesian The Cartesian to be divided.
-         * @param {Number} scalar The scalar to divide by.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.divideByScalar = function(cartesian, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = cartesian.x / scalar;
-            result.y = cartesian.y / scalar;
-            result.z = cartesian.z / scalar;
-            result.w = cartesian.w / scalar;
-            return result;
-        };
-
-        /**
-         * Negates the provided Cartesian.
-         *
-         * @param {Cartesian4} cartesian The Cartesian to be negated.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.negate = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = -cartesian.x;
-            result.y = -cartesian.y;
-            result.z = -cartesian.z;
-            result.w = -cartesian.w;
-            return result;
-        };
-
-        /**
-         * Computes the absolute value of the provided Cartesian.
-         *
-         * @param {Cartesian4} cartesian The Cartesian whose absolute value is to be computed.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.abs = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = Math.abs(cartesian.x);
-            result.y = Math.abs(cartesian.y);
-            result.z = Math.abs(cartesian.z);
-            result.w = Math.abs(cartesian.w);
-            return result;
-        };
-
-        var lerpScratch = new Cartesian4();
-        /**
-         * Computes the linear interpolation or extrapolation at t using the provided cartesians.
-         *
-         * @param {Cartesian4} start The value corresponding to t at 0.0.
-         * @param {Cartesian4}end The value corresponding to t at 1.0.
-         * @param {Number} t The point along t at which to interpolate.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter.
-         */
-        Cartesian4.lerp = function(start, end, t, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('start', start);
-            Check.Check.typeOf.object('end', end);
-            Check.Check.typeOf.number('t', t);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            Cartesian4.multiplyByScalar(end, t, lerpScratch);
-            result = Cartesian4.multiplyByScalar(start, 1.0 - t, result);
-            return Cartesian4.add(lerpScratch, result, result);
-        };
-
-        var mostOrthogonalAxisScratch = new Cartesian4();
-        /**
-         * Returns the axis that is most orthogonal to the provided Cartesian.
-         *
-         * @param {Cartesian4} cartesian The Cartesian on which to find the most orthogonal axis.
-         * @param {Cartesian4} result The object onto which to store the result.
-         * @returns {Cartesian4} The most orthogonal axis.
-         */
-        Cartesian4.mostOrthogonalAxis = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var f = Cartesian4.normalize(cartesian, mostOrthogonalAxisScratch);
-            Cartesian4.abs(f, f);
-
-            if (f.x <= f.y) {
-                if (f.x <= f.z) {
-                    if (f.x <= f.w) {
-                        result = Cartesian4.clone(Cartesian4.UNIT_X, result);
-                    } else {
-                        result = Cartesian4.clone(Cartesian4.UNIT_W, result);
-                    }
-                } else if (f.z <= f.w) {
-                    result = Cartesian4.clone(Cartesian4.UNIT_Z, result);
-                } else {
-                    result = Cartesian4.clone(Cartesian4.UNIT_W, result);
-                }
-            } else if (f.y <= f.z) {
-                if (f.y <= f.w) {
-                    result = Cartesian4.clone(Cartesian4.UNIT_Y, result);
-                } else {
-                    result = Cartesian4.clone(Cartesian4.UNIT_W, result);
-                }
-            } else if (f.z <= f.w) {
-                result = Cartesian4.clone(Cartesian4.UNIT_Z, result);
-            } else {
-                result = Cartesian4.clone(Cartesian4.UNIT_W, result);
-            }
-
-            return result;
-        };
-
-        /**
-         * Compares the provided Cartesians componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Cartesian4} [left] The first Cartesian.
-         * @param {Cartesian4} [right] The second Cartesian.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        Cartesian4.equals = function(left, right) {
-            return (left === right) ||
-                   ((when.defined(left)) &&
-                    (when.defined(right)) &&
-                    (left.x === right.x) &&
-                    (left.y === right.y) &&
-                    (left.z === right.z) &&
-                    (left.w === right.w));
-        };
-
-        /**
-         * @private
-         */
-        Cartesian4.equalsArray = function(cartesian, array, offset) {
-            return cartesian.x === array[offset] &&
-                   cartesian.y === array[offset + 1] &&
-                   cartesian.z === array[offset + 2] &&
-                   cartesian.w === array[offset + 3];
-        };
-
-        /**
-         * Compares the provided Cartesians componentwise and returns
-         * <code>true</code> if they pass an absolute or relative tolerance test,
-         * <code>false</code> otherwise.
-         *
-         * @param {Cartesian4} [left] The first Cartesian.
-         * @param {Cartesian4} [right] The second Cartesian.
-         * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-         * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-         * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Cartesian4.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) {
-            return (left === right) ||
-                   (when.defined(left) &&
-                    when.defined(right) &&
-                    _Math.CesiumMath.equalsEpsilon(left.x, right.x, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(left.y, right.y, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(left.z, right.z, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(left.w, right.w, relativeEpsilon, absoluteEpsilon));
-        };
-
-        /**
-         * An immutable Cartesian4 instance initialized to (0.0, 0.0, 0.0, 0.0).
-         *
-         * @type {Cartesian4}
-         * @constant
-         */
-        Cartesian4.ZERO = Object.freeze(new Cartesian4(0.0, 0.0, 0.0, 0.0));
-
-        /**
-         * An immutable Cartesian4 instance initialized to (1.0, 0.0, 0.0, 0.0).
-         *
-         * @type {Cartesian4}
-         * @constant
-         */
-        Cartesian4.UNIT_X = Object.freeze(new Cartesian4(1.0, 0.0, 0.0, 0.0));
-
-        /**
-         * An immutable Cartesian4 instance initialized to (0.0, 1.0, 0.0, 0.0).
-         *
-         * @type {Cartesian4}
-         * @constant
-         */
-        Cartesian4.UNIT_Y = Object.freeze(new Cartesian4(0.0, 1.0, 0.0, 0.0));
-
-        /**
-         * An immutable Cartesian4 instance initialized to (0.0, 0.0, 1.0, 0.0).
-         *
-         * @type {Cartesian4}
-         * @constant
-         */
-        Cartesian4.UNIT_Z = Object.freeze(new Cartesian4(0.0, 0.0, 1.0, 0.0));
-
-        /**
-         * An immutable Cartesian4 instance initialized to (0.0, 0.0, 0.0, 1.0).
-         *
-         * @type {Cartesian4}
-         * @constant
-         */
-        Cartesian4.UNIT_W = Object.freeze(new Cartesian4(0.0, 0.0, 0.0, 1.0));
-
-        /**
-         * Duplicates this Cartesian4 instance.
-         *
-         * @param {Cartesian4} [result] The object onto which to store the result.
-         * @returns {Cartesian4} The modified result parameter or a new Cartesian4 instance if one was not provided.
-         */
-        Cartesian4.prototype.clone = function(result) {
-            return Cartesian4.clone(this, result);
-        };
-
-        /**
-         * Compares this Cartesian against the provided Cartesian componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Cartesian4} [right] The right hand side Cartesian.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        Cartesian4.prototype.equals = function(right) {
-            return Cartesian4.equals(this, right);
-        };
-
-        /**
-         * Compares this Cartesian against the provided Cartesian componentwise and returns
-         * <code>true</code> if they pass an absolute or relative tolerance test,
-         * <code>false</code> otherwise.
-         *
-         * @param {Cartesian4} [right] The right hand side Cartesian.
-         * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-         * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-         * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Cartesian4.prototype.equalsEpsilon = function(right, relativeEpsilon, absoluteEpsilon) {
-            return Cartesian4.equalsEpsilon(this, right, relativeEpsilon, absoluteEpsilon);
-        };
-
-        /**
-         * Creates a string representing this Cartesian in the format '(x, y, z, w)'.
-         *
-         * @returns {String} A string representing the provided Cartesian in the format '(x, y, z, w)'.
-         */
-        Cartesian4.prototype.toString = function() {
-            return '(' + this.x + ', ' + this.y + ', ' + this.z + ', ' + this.w + ')';
-        };
-
-        var scratchFloatArray = new Float32Array(1);
-        var SHIFT_LEFT_8 = 256.0;
-        var SHIFT_LEFT_16 = 65536.0;
-        var SHIFT_LEFT_24 = 16777216.0;
-
-        var SHIFT_RIGHT_8 = 1.0 / SHIFT_LEFT_8;
-        var SHIFT_RIGHT_16 = 1.0 / SHIFT_LEFT_16;
-        var SHIFT_RIGHT_24 = 1.0 / SHIFT_LEFT_24;
-
-        var BIAS = 38.0;
-
-        /**
-         * Packs an arbitrary floating point value to 4 values representable using uint8.
-         *
-         * @param {Number} value A floating point number
-         * @param {Cartesian4} [result] The Cartesian4 that will contain the packed float.
-         * @returns {Cartesian4} A Cartesian4 representing the float packed to values in x, y, z, and w.
-         */
-        Cartesian4.packFloat = function(value, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('value', value);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartesian4();
-            }
-
-            // Force the value to 32 bit precision
-            scratchFloatArray[0] = value;
-            value = scratchFloatArray[0];
-
-            if (value === 0.0) {
-                return Cartesian4.clone(Cartesian4.ZERO, result);
-            }
-
-            var sign = value < 0.0 ? 1.0 : 0.0;
-            var exponent;
-
-            if (!isFinite(value)) {
-                value = 0.1;
-                exponent = BIAS;
-            } else {
-                value = Math.abs(value);
-                exponent = Math.floor(_Math.CesiumMath.logBase(value, 10)) + 1.0;
-                value = value / Math.pow(10.0, exponent);
-            }
-
-            var temp = value * SHIFT_LEFT_8;
-            result.x = Math.floor(temp);
-            temp = (temp - result.x) * SHIFT_LEFT_8;
-            result.y = Math.floor(temp);
-            temp = (temp - result.y) * SHIFT_LEFT_8;
-            result.z = Math.floor(temp);
-            result.w = (exponent + BIAS) * 2.0 + sign;
-
-            return result;
-        };
-
-        /**
-         * Unpacks a float packed using Cartesian4.packFloat.
-         *
-         * @param {Cartesian4} packedFloat A Cartesian4 containing a float packed to 4 values representable using uint8.
-         * @returns {Number} The unpacked float.
-         * @private
-         */
-        Cartesian4.unpackFloat = function(packedFloat) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('packedFloat', packedFloat);
-            //>>includeEnd('debug');
-
-            var temp = packedFloat.w / 2.0;
-            var exponent = Math.floor(temp);
-            var sign = (temp - exponent) * 2.0;
-            exponent = exponent - BIAS;
-
-            sign = sign * 2.0 - 1.0;
-            sign = -sign;
-
-            if (exponent >= BIAS) {
-                return sign < 0.0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY;
-            }
-
-            var unpacked = sign * packedFloat.x * SHIFT_RIGHT_8;
-            unpacked += sign * packedFloat.y * SHIFT_RIGHT_16;
-            unpacked += sign * packedFloat.z * SHIFT_RIGHT_24;
-
-            return unpacked * Math.pow(10.0, exponent);
-        };
-
-    exports.Cartesian4 = Cartesian4;
-
-});
diff --git a/public/libs/Cesium/Workers/Cartographic-fe4be337.js b/public/libs/Cesium/Workers/Cartographic-fe4be337.js
deleted file mode 100644
index 537cc0f..0000000
--- a/public/libs/Cesium/Workers/Cartographic-fe4be337.js
+++ /dev/null
@@ -1,1527 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240'], function (exports, when, Check, _Math) { 'use strict';
-
-    /**
-     * A 3D Cartesian point.
-     * @alias Cartesian3
-     * @constructor
-     *
-     * @param {Number} [x=0.0] The X component.
-     * @param {Number} [y=0.0] The Y component.
-     * @param {Number} [z=0.0] The Z component.
-     *
-     * @see Cartesian2
-     * @see Cartesian4
-     * @see Packable
-     */
-    function Cartesian3(x, y, z) {
-        /**
-         * The X component.
-         * @type {Number}
-         * @default 0.0
-         */
-        this.x = when.defaultValue(x, 0.0);
-
-        /**
-         * The Y component.
-         * @type {Number}
-         * @default 0.0
-         */
-        this.y = when.defaultValue(y, 0.0);
-
-        /**
-         * The Z component.
-         * @type {Number}
-         * @default 0.0
-         */
-        this.z = when.defaultValue(z, 0.0);
-    }
-
-    /**
-     * Converts the provided Spherical into Cartesian3 coordinates.
-     *
-     * @param {Spherical} spherical The Spherical to be converted to Cartesian3.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
-     */
-    Cartesian3.fromSpherical = function(spherical, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('spherical', spherical);
-        //>>includeEnd('debug');
-
-        if (!when.defined(result)) {
-            result = new Cartesian3();
-        }
-
-        var clock = spherical.clock;
-        var cone = spherical.cone;
-        var magnitude = when.defaultValue(spherical.magnitude, 1.0);
-        var radial = magnitude * Math.sin(cone);
-        result.x = radial * Math.cos(clock);
-        result.y = radial * Math.sin(clock);
-        result.z = magnitude * Math.cos(cone);
-        return result;
-    };
-
-    /**
-     * Creates a Cartesian3 instance from x, y and z coordinates.
-     *
-     * @param {Number} x The x coordinate.
-     * @param {Number} y The y coordinate.
-     * @param {Number} z The z coordinate.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
-     */
-    Cartesian3.fromElements = function(x, y, z, result) {
-        if (!when.defined(result)) {
-            return new Cartesian3(x, y, z);
-        }
-
-        result.x = x;
-        result.y = y;
-        result.z = z;
-        return result;
-    };
-
-    /**
-     * Duplicates a Cartesian3 instance.
-     *
-     * @param {Cartesian3} cartesian The Cartesian to duplicate.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided. (Returns undefined if cartesian is undefined)
-     */
-    Cartesian3.clone = function(cartesian, result) {
-        if (!when.defined(cartesian)) {
-            return undefined;
-        }
-        if (!when.defined(result)) {
-            return new Cartesian3(cartesian.x, cartesian.y, cartesian.z);
-        }
-
-        result.x = cartesian.x;
-        result.y = cartesian.y;
-        result.z = cartesian.z;
-        return result;
-    };
-
-    /**
-     * Creates a Cartesian3 instance from an existing Cartesian4.  This simply takes the
-     * x, y, and z properties of the Cartesian4 and drops w.
-     * @function
-     *
-     * @param {Cartesian4} cartesian The Cartesian4 instance to create a Cartesian3 instance from.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
-     */
-    Cartesian3.fromCartesian4 = Cartesian3.clone;
-
-    /**
-     * The number of elements used to pack the object into an array.
-     * @type {Number}
-     */
-    Cartesian3.packedLength = 3;
-
-    /**
-     * Stores the provided instance into the provided array.
-     *
-     * @param {Cartesian3} value The value to pack.
-     * @param {Number[]} array The array to pack into.
-     * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-     *
-     * @returns {Number[]} The array that was packed into
-     */
-    Cartesian3.pack = function(value, array, startingIndex) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('value', value);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        startingIndex = when.defaultValue(startingIndex, 0);
-
-        array[startingIndex++] = value.x;
-        array[startingIndex++] = value.y;
-        array[startingIndex] = value.z;
-
-        return array;
-    };
-
-    /**
-     * Retrieves an instance from a packed array.
-     *
-     * @param {Number[]} array The packed array.
-     * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-     * @param {Cartesian3} [result] The object into which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
-     */
-    Cartesian3.unpack = function(array, startingIndex, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        startingIndex = when.defaultValue(startingIndex, 0);
-
-        if (!when.defined(result)) {
-            result = new Cartesian3();
-        }
-        result.x = array[startingIndex++];
-        result.y = array[startingIndex++];
-        result.z = array[startingIndex];
-        return result;
-    };
-
-    /**
-     * Flattens an array of Cartesian3s into an array of components.
-     *
-     * @param {Cartesian3[]} array The array of cartesians to pack.
-     * @param {Number[]} result The array onto which to store the result.
-     * @returns {Number[]} The packed array.
-     */
-    Cartesian3.packArray = function(array, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        var length = array.length;
-        if (!when.defined(result)) {
-            result = new Array(length * 3);
-        } else {
-            result.length = length * 3;
-        }
-
-        for (var i = 0; i < length; ++i) {
-            Cartesian3.pack(array[i], result, i * 3);
-        }
-        return result;
-    };
-
-    /**
-     * Unpacks an array of cartesian components into an array of Cartesian3s.
-     *
-     * @param {Number[]} array The array of components to unpack.
-     * @param {Cartesian3[]} result The array onto which to store the result.
-     * @returns {Cartesian3[]} The unpacked array.
-     */
-    Cartesian3.unpackArray = function(array, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('array', array);
-        Check.Check.typeOf.number.greaterThanOrEquals('array.length', array.length, 3);
-        if (array.length % 3 !== 0) {
-            throw new Check.DeveloperError('array length must be a multiple of 3.');
-        }
-        //>>includeEnd('debug');
-
-        var length = array.length;
-        if (!when.defined(result)) {
-            result = new Array(length / 3);
-        } else {
-            result.length = length / 3;
-        }
-
-        for (var i = 0; i < length; i += 3) {
-            var index = i / 3;
-            result[index] = Cartesian3.unpack(array, i, result[index]);
-        }
-        return result;
-    };
-
-    /**
-     * Creates a Cartesian3 from three consecutive elements in an array.
-     * @function
-     *
-     * @param {Number[]} array The array whose three consecutive elements correspond to the x, y, and z components, respectively.
-     * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to the x component.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
-     *
-     * @example
-     * // Create a Cartesian3 with (1.0, 2.0, 3.0)
-     * var v = [1.0, 2.0, 3.0];
-     * var p = Cesium.Cartesian3.fromArray(v);
-     *
-     * // Create a Cartesian3 with (1.0, 2.0, 3.0) using an offset into an array
-     * var v2 = [0.0, 0.0, 1.0, 2.0, 3.0];
-     * var p2 = Cesium.Cartesian3.fromArray(v2, 2);
-     */
-    Cartesian3.fromArray = Cartesian3.unpack;
-
-    /**
-     * Computes the value of the maximum component for the supplied Cartesian.
-     *
-     * @param {Cartesian3} cartesian The cartesian to use.
-     * @returns {Number} The value of the maximum component.
-     */
-    Cartesian3.maximumComponent = function(cartesian) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        //>>includeEnd('debug');
-
-        return Math.max(cartesian.x, cartesian.y, cartesian.z);
-    };
-
-    /**
-     * Computes the value of the minimum component for the supplied Cartesian.
-     *
-     * @param {Cartesian3} cartesian The cartesian to use.
-     * @returns {Number} The value of the minimum component.
-     */
-    Cartesian3.minimumComponent = function(cartesian) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        //>>includeEnd('debug');
-
-        return Math.min(cartesian.x, cartesian.y, cartesian.z);
-    };
-
-    /**
-     * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians.
-     *
-     * @param {Cartesian3} first A cartesian to compare.
-     * @param {Cartesian3} second A cartesian to compare.
-     * @param {Cartesian3} result The object into which to store the result.
-     * @returns {Cartesian3} A cartesian with the minimum components.
-     */
-    Cartesian3.minimumByComponent = function(first, second, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('first', first);
-        Check.Check.typeOf.object('second', second);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = Math.min(first.x, second.x);
-        result.y = Math.min(first.y, second.y);
-        result.z = Math.min(first.z, second.z);
-
-        return result;
-    };
-
-    /**
-     * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians.
-     *
-     * @param {Cartesian3} first A cartesian to compare.
-     * @param {Cartesian3} second A cartesian to compare.
-     * @param {Cartesian3} result The object into which to store the result.
-     * @returns {Cartesian3} A cartesian with the maximum components.
-     */
-    Cartesian3.maximumByComponent = function(first, second, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('first', first);
-        Check.Check.typeOf.object('second', second);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = Math.max(first.x, second.x);
-        result.y = Math.max(first.y, second.y);
-        result.z = Math.max(first.z, second.z);
-        return result;
-    };
-
-    /**
-     * Computes the provided Cartesian's squared magnitude.
-     *
-     * @param {Cartesian3} cartesian The Cartesian instance whose squared magnitude is to be computed.
-     * @returns {Number} The squared magnitude.
-     */
-    Cartesian3.magnitudeSquared = function(cartesian) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        //>>includeEnd('debug');
-
-        return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z;
-    };
-
-    /**
-     * Computes the Cartesian's magnitude (length).
-     *
-     * @param {Cartesian3} cartesian The Cartesian instance whose magnitude is to be computed.
-     * @returns {Number} The magnitude.
-     */
-    Cartesian3.magnitude = function(cartesian) {
-        return Math.sqrt(Cartesian3.magnitudeSquared(cartesian));
-    };
-
-    var distanceScratch = new Cartesian3();
-
-    /**
-     * Computes the distance between two points.
-     *
-     * @param {Cartesian3} left The first point to compute the distance from.
-     * @param {Cartesian3} right The second point to compute the distance to.
-     * @returns {Number} The distance between two points.
-     *
-     * @example
-     * // Returns 1.0
-     * var d = Cesium.Cartesian3.distance(new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(2.0, 0.0, 0.0));
-     */
-    Cartesian3.distance = function(left, right) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        //>>includeEnd('debug');
-
-        Cartesian3.subtract(left, right, distanceScratch);
-        return Cartesian3.magnitude(distanceScratch);
-    };
-
-    /**
-     * Computes the squared distance between two points.  Comparing squared distances
-     * using this function is more efficient than comparing distances using {@link Cartesian3#distance}.
-     *
-     * @param {Cartesian3} left The first point to compute the distance from.
-     * @param {Cartesian3} right The second point to compute the distance to.
-     * @returns {Number} The distance between two points.
-     *
-     * @example
-     * // Returns 4.0, not 2.0
-     * var d = Cesium.Cartesian3.distanceSquared(new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(3.0, 0.0, 0.0));
-     */
-    Cartesian3.distanceSquared = function(left, right) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        //>>includeEnd('debug');
-
-        Cartesian3.subtract(left, right, distanceScratch);
-        return Cartesian3.magnitudeSquared(distanceScratch);
-    };
-
-    /**
-     * Computes the normalized form of the supplied Cartesian.
-     *
-     * @param {Cartesian3} cartesian The Cartesian to be normalized.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.normalize = function(cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var magnitude = Cartesian3.magnitude(cartesian);
-
-        result.x = cartesian.x / magnitude;
-        result.y = cartesian.y / magnitude;
-        result.z = cartesian.z / magnitude;
-
-        //>>includeStart('debug', pragmas.debug);
-        if (isNaN(result.x) || isNaN(result.y) || isNaN(result.z)) {
-            throw new Check.DeveloperError('normalized result is not a number');
-        }
-        //>>includeEnd('debug');
-
-        return result;
-    };
-
-    /**
-     * Computes the dot (scalar) product of two Cartesians.
-     *
-     * @param {Cartesian3} left The first Cartesian.
-     * @param {Cartesian3} right The second Cartesian.
-     * @returns {Number} The dot product.
-     */
-    Cartesian3.dot = function(left, right) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        //>>includeEnd('debug');
-
-        return left.x * right.x + left.y * right.y + left.z * right.z;
-    };
-
-    /**
-     * Computes the componentwise product of two Cartesians.
-     *
-     * @param {Cartesian3} left The first Cartesian.
-     * @param {Cartesian3} right The second Cartesian.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.multiplyComponents = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = left.x * right.x;
-        result.y = left.y * right.y;
-        result.z = left.z * right.z;
-        return result;
-    };
-
-    /**
-     * Computes the componentwise quotient of two Cartesians.
-     *
-     * @param {Cartesian3} left The first Cartesian.
-     * @param {Cartesian3} right The second Cartesian.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.divideComponents = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = left.x / right.x;
-        result.y = left.y / right.y;
-        result.z = left.z / right.z;
-        return result;
-    };
-
-    /**
-     * Computes the componentwise sum of two Cartesians.
-     *
-     * @param {Cartesian3} left The first Cartesian.
-     * @param {Cartesian3} right The second Cartesian.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.add = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = left.x + right.x;
-        result.y = left.y + right.y;
-        result.z = left.z + right.z;
-        return result;
-    };
-
-    /**
-     * Computes the componentwise difference of two Cartesians.
-     *
-     * @param {Cartesian3} left The first Cartesian.
-     * @param {Cartesian3} right The second Cartesian.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.subtract = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = left.x - right.x;
-        result.y = left.y - right.y;
-        result.z = left.z - right.z;
-        return result;
-    };
-
-    /**
-     * Multiplies the provided Cartesian componentwise by the provided scalar.
-     *
-     * @param {Cartesian3} cartesian The Cartesian to be scaled.
-     * @param {Number} scalar The scalar to multiply with.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.multiplyByScalar = function(cartesian, scalar, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.number('scalar', scalar);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = cartesian.x * scalar;
-        result.y = cartesian.y * scalar;
-        result.z = cartesian.z * scalar;
-        return result;
-    };
-
-    /**
-     * Divides the provided Cartesian componentwise by the provided scalar.
-     *
-     * @param {Cartesian3} cartesian The Cartesian to be divided.
-     * @param {Number} scalar The scalar to divide by.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.divideByScalar = function(cartesian, scalar, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.number('scalar', scalar);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = cartesian.x / scalar;
-        result.y = cartesian.y / scalar;
-        result.z = cartesian.z / scalar;
-        return result;
-    };
-
-    /**
-     * Negates the provided Cartesian.
-     *
-     * @param {Cartesian3} cartesian The Cartesian to be negated.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.negate = function(cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = -cartesian.x;
-        result.y = -cartesian.y;
-        result.z = -cartesian.z;
-        return result;
-    };
-
-    /**
-     * Computes the absolute value of the provided Cartesian.
-     *
-     * @param {Cartesian3} cartesian The Cartesian whose absolute value is to be computed.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.abs = function(cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = Math.abs(cartesian.x);
-        result.y = Math.abs(cartesian.y);
-        result.z = Math.abs(cartesian.z);
-        return result;
-    };
-
-    var lerpScratch = new Cartesian3();
-    /**
-     * Computes the linear interpolation or extrapolation at t using the provided cartesians.
-     *
-     * @param {Cartesian3} start The value corresponding to t at 0.0.
-     * @param {Cartesian3} end The value corresponding to t at 1.0.
-     * @param {Number} t The point along t at which to interpolate.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter.
-     */
-    Cartesian3.lerp = function(start, end, t, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('start', start);
-        Check.Check.typeOf.object('end', end);
-        Check.Check.typeOf.number('t', t);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        Cartesian3.multiplyByScalar(end, t, lerpScratch);
-        result = Cartesian3.multiplyByScalar(start, 1.0 - t, result);
-        return Cartesian3.add(lerpScratch, result, result);
-    };
-
-    var angleBetweenScratch = new Cartesian3();
-    var angleBetweenScratch2 = new Cartesian3();
-    /**
-     * Returns the angle, in radians, between the provided Cartesians.
-     *
-     * @param {Cartesian3} left The first Cartesian.
-     * @param {Cartesian3} right The second Cartesian.
-     * @returns {Number} The angle between the Cartesians.
-     */
-    Cartesian3.angleBetween = function(left, right) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        //>>includeEnd('debug');
-
-        Cartesian3.normalize(left, angleBetweenScratch);
-        Cartesian3.normalize(right, angleBetweenScratch2);
-        var cosine = Cartesian3.dot(angleBetweenScratch, angleBetweenScratch2);
-        var sine = Cartesian3.magnitude(Cartesian3.cross(angleBetweenScratch, angleBetweenScratch2, angleBetweenScratch));
-        return Math.atan2(sine, cosine);
-    };
-
-    var mostOrthogonalAxisScratch = new Cartesian3();
-    /**
-     * Returns the axis that is most orthogonal to the provided Cartesian.
-     *
-     * @param {Cartesian3} cartesian The Cartesian on which to find the most orthogonal axis.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The most orthogonal axis.
-     */
-    Cartesian3.mostOrthogonalAxis = function(cartesian, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('cartesian', cartesian);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var f = Cartesian3.normalize(cartesian, mostOrthogonalAxisScratch);
-        Cartesian3.abs(f, f);
-
-        if (f.x <= f.y) {
-            if (f.x <= f.z) {
-                result = Cartesian3.clone(Cartesian3.UNIT_X, result);
-            } else {
-                result = Cartesian3.clone(Cartesian3.UNIT_Z, result);
-            }
-        } else if (f.y <= f.z) {
-            result = Cartesian3.clone(Cartesian3.UNIT_Y, result);
-        } else {
-            result = Cartesian3.clone(Cartesian3.UNIT_Z, result);
-        }
-
-        return result;
-    };
-
-    /**
-     * Projects vector a onto vector b
-     * @param {Cartesian3} a The vector that needs projecting
-     * @param {Cartesian3} b The vector to project onto
-     * @param {Cartesian3} result The result cartesian
-     * @returns {Cartesian3} The modified result parameter
-     */
-    Cartesian3.projectVector = function(a, b, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('a', a);
-        Check.Check.defined('b', b);
-        Check.Check.defined('result', result);
-        //>>includeEnd('debug');
-
-        var scalar = Cartesian3.dot(a, b) / Cartesian3.dot(b, b);
-        return Cartesian3.multiplyByScalar(b, scalar, result);
-    };
-
-    /**
-     * Compares the provided Cartesians componentwise and returns
-     * <code>true</code> if they are equal, <code>false</code> otherwise.
-     *
-     * @param {Cartesian3} [left] The first Cartesian.
-     * @param {Cartesian3} [right] The second Cartesian.
-     * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-     */
-    Cartesian3.equals = function(left, right) {
-            return (left === right) ||
-              ((when.defined(left)) &&
-               (when.defined(right)) &&
-               (left.x === right.x) &&
-               (left.y === right.y) &&
-               (left.z === right.z));
-    };
-
-    /**
-     * @private
-     */
-    Cartesian3.equalsArray = function(cartesian, array, offset) {
-        return cartesian.x === array[offset] &&
-               cartesian.y === array[offset + 1] &&
-               cartesian.z === array[offset + 2];
-    };
-
-    /**
-     * Compares the provided Cartesians componentwise and returns
-     * <code>true</code> if they pass an absolute or relative tolerance test,
-     * <code>false</code> otherwise.
-     *
-     * @param {Cartesian3} [left] The first Cartesian.
-     * @param {Cartesian3} [right] The second Cartesian.
-     * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-     * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-     * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-     */
-    Cartesian3.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) {
-        return (left === right) ||
-               (when.defined(left) &&
-                when.defined(right) &&
-                _Math.CesiumMath.equalsEpsilon(left.x, right.x, relativeEpsilon, absoluteEpsilon) &&
-                _Math.CesiumMath.equalsEpsilon(left.y, right.y, relativeEpsilon, absoluteEpsilon) &&
-                _Math.CesiumMath.equalsEpsilon(left.z, right.z, relativeEpsilon, absoluteEpsilon));
-    };
-
-    /**
-     * Computes the cross (outer) product of two Cartesians.
-     *
-     * @param {Cartesian3} left The first Cartesian.
-     * @param {Cartesian3} right The second Cartesian.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The cross product.
-     */
-    Cartesian3.cross = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        var leftX = left.x;
-        var leftY = left.y;
-        var leftZ = left.z;
-        var rightX = right.x;
-        var rightY = right.y;
-        var rightZ = right.z;
-
-        var x = leftY * rightZ - leftZ * rightY;
-        var y = leftZ * rightX - leftX * rightZ;
-        var z = leftX * rightY - leftY * rightX;
-
-        result.x = x;
-        result.y = y;
-        result.z = z;
-        return result;
-    };
-
-    /**
-     * Computes the midpoint between the right and left Cartesian.
-     * @param {Cartesian3} left The first Cartesian.
-     * @param {Cartesian3} right The second Cartesian.
-     * @param {Cartesian3} result The object onto which to store the result.
-     * @returns {Cartesian3} The midpoint.
-     */
-    Cartesian3.midpoint = function(left, right, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('left', left);
-        Check.Check.typeOf.object('right', right);
-        Check.Check.typeOf.object('result', result);
-        //>>includeEnd('debug');
-
-        result.x = (left.x + right.x) * 0.5;
-        result.y = (left.y + right.y) * 0.5;
-        result.z = (left.z + right.z) * 0.5;
-
-        return result;
-    };
-
-    /**
-     * Returns a Cartesian3 position from longitude and latitude values given in degrees.
-     *
-     * @param {Number} longitude The longitude, in degrees
-     * @param {Number} latitude The latitude, in degrees
-     * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.
-     * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The position
-     *
-     * @example
-     * var position = Cesium.Cartesian3.fromDegrees(-115.0, 37.0);
-     */
-    Cartesian3.fromDegrees = function(longitude, latitude, height, ellipsoid, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('longitude', longitude);
-        Check.Check.typeOf.number('latitude', latitude);
-        //>>includeEnd('debug');
-
-        longitude = _Math.CesiumMath.toRadians(longitude);
-        latitude = _Math.CesiumMath.toRadians(latitude);
-        return Cartesian3.fromRadians(longitude, latitude, height, ellipsoid, result);
-    };
-
-    var scratchN = new Cartesian3();
-    var scratchK = new Cartesian3();
-    var wgs84RadiiSquared = new Cartesian3(6378137.0 * 6378137.0, 6378137.0 * 6378137.0, 6356752.3142451793 * 6356752.3142451793);
-    var wgs84RadiiSquaredEx = new Cartesian3(6378137.0 * 6378137.0, 6378137.0 * 6378137.0, 6378137 * 6378137);
-
-    /**
-     * Returns a Cartesian3 position from longitude and latitude values given in radians.
-     *
-     * @param {Number} longitude The longitude, in radians
-     * @param {Number} latitude The latitude, in radians
-     * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.
-     * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The position
-     *
-     * @example
-     * var position = Cesium.Cartesian3.fromRadians(-2.007, 0.645);
-     */
-    Cartesian3.fromRadians = function(longitude, latitude, height, ellipsoid, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('longitude', longitude);
-        Check.Check.typeOf.number('latitude', latitude);
-        //>>includeEnd('debug');
-
-        height = when.defaultValue(height, 0.0);
-        var radiiSquared = when.defined(ellipsoid) ? ellipsoid.radiiSquared : wgs84RadiiSquaredEx;
-
-        if(_Math.CesiumMath.equalsEpsilon(_Math.CesiumMath.Radius, 6356752.3142451793, _Math.CesiumMath.EPSILON10))
-        {
-            radiiSquared = when.defined(ellipsoid) ? ellipsoid.radiiSquared : wgs84RadiiSquared;
-        }
-
-        var cosLatitude = Math.cos(latitude);
-        scratchN.x = cosLatitude * Math.cos(longitude);
-        scratchN.y = cosLatitude * Math.sin(longitude);
-        scratchN.z = Math.sin(latitude);
-        scratchN = Cartesian3.normalize(scratchN, scratchN);
-
-        Cartesian3.multiplyComponents(radiiSquared, scratchN, scratchK);
-        var gamma = Math.sqrt(Cartesian3.dot(scratchN, scratchK));
-        scratchK = Cartesian3.divideByScalar(scratchK, gamma, scratchK);
-        scratchN = Cartesian3.multiplyByScalar(scratchN, height, scratchN);
-
-        if (!when.defined(result)) {
-            result = new Cartesian3();
-        }
-        return Cartesian3.add(scratchK, scratchN, result);
-    };
-
-    /**
-     * Returns an array of Cartesian3 positions given an array of longitude and latitude values given in degrees.
-     *
-     * @param {Number[]} coordinates A list of longitude and latitude values. Values alternate [longitude, latitude, longitude, latitude...].
-     * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the coordinates lie.
-     * @param {Cartesian3[]} [result] An array of Cartesian3 objects to store the result.
-     * @returns {Cartesian3[]} The array of positions.
-     *
-     * @example
-     * var positions = Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0, -107.0, 33.0]);
-     */
-    Cartesian3.fromDegreesArray = function(coordinates, ellipsoid, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('coordinates', coordinates);
-        if (coordinates.length < 2 || coordinates.length % 2 !== 0) {
-            throw new Check.DeveloperError('the number of coordinates must be a multiple of 2 and at least 2');
-        }
-        //>>includeEnd('debug');
-
-        var length = coordinates.length;
-        if (!when.defined(result)) {
-            result = new Array(length / 2);
-        } else {
-            result.length = length / 2;
-        }
-
-        for (var i = 0; i < length; i += 2) {
-            var longitude = coordinates[i];
-            var latitude = coordinates[i + 1];
-            var index = i / 2;
-            result[index] = Cartesian3.fromDegrees(longitude, latitude, 0, ellipsoid, result[index]);
-        }
-
-        return result;
-    };
-
-    /**
-     * Returns an array of Cartesian3 positions given an array of longitude and latitude values given in radians.
-     *
-     * @param {Number[]} coordinates A list of longitude and latitude values. Values alternate [longitude, latitude, longitude, latitude...].
-     * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the coordinates lie.
-     * @param {Cartesian3[]} [result] An array of Cartesian3 objects to store the result.
-     * @returns {Cartesian3[]} The array of positions.
-     *
-     * @example
-     * var positions = Cesium.Cartesian3.fromRadiansArray([-2.007, 0.645, -1.867, .575]);
-     */
-    Cartesian3.fromRadiansArray = function(coordinates, ellipsoid, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('coordinates', coordinates);
-        if (coordinates.length < 2 || coordinates.length % 2 !== 0) {
-            throw new Check.DeveloperError('the number of coordinates must be a multiple of 2 and at least 2');
-        }
-        //>>includeEnd('debug');
-
-        var length = coordinates.length;
-        if (!when.defined(result)) {
-            result = new Array(length / 2);
-        } else {
-            result.length = length / 2;
-        }
-
-        for (var i = 0; i < length; i += 2) {
-            var longitude = coordinates[i];
-            var latitude = coordinates[i + 1];
-            var index = i / 2;
-            result[index] = Cartesian3.fromRadians(longitude, latitude, 0, ellipsoid, result[index]);
-        }
-
-        return result;
-    };
-
-    /**
-     * Returns an array of Cartesian3 positions given an array of longitude, latitude and height values where longitude and latitude are given in degrees.
-     *
-     * @param {Number[]} coordinates A list of longitude, latitude and height values. Values alternate [longitude, latitude, height, longitude, latitude, height...].
-     * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.
-     * @param {Cartesian3[]} [result] An array of Cartesian3 objects to store the result.
-     * @returns {Cartesian3[]} The array of positions.
-     *
-     * @example
-     * var positions = Cesium.Cartesian3.fromDegreesArrayHeights([-115.0, 37.0, 100000.0, -107.0, 33.0, 150000.0]);
-     */
-    Cartesian3.fromDegreesArrayHeights = function(coordinates, ellipsoid, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('coordinates', coordinates);
-        if (coordinates.length < 3 || coordinates.length % 3 !== 0) {
-            throw new Check.DeveloperError('the number of coordinates must be a multiple of 3 and at least 3');
-        }
-        //>>includeEnd('debug');
-
-        var length = coordinates.length;
-        if (!when.defined(result)) {
-            result = new Array(length / 3);
-        } else {
-            result.length = length / 3;
-        }
-
-        for (var i = 0; i < length; i += 3) {
-            var longitude = coordinates[i];
-            var latitude = coordinates[i + 1];
-            var height = coordinates[i + 2];
-            var index = i / 3;
-            result[index] = Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result[index]);
-        }
-
-        return result;
-    };
-
-    /**
-     * Returns an array of Cartesian3 positions given an array of longitude, latitude and height values where longitude and latitude are given in radians.
-     *
-     * @param {Number[]} coordinates A list of longitude, latitude and height values. Values alternate [longitude, latitude, height, longitude, latitude, height...].
-     * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.
-     * @param {Cartesian3[]} [result] An array of Cartesian3 objects to store the result.
-     * @returns {Cartesian3[]} The array of positions.
-     *
-     * @example
-     * var positions = Cesium.Cartesian3.fromRadiansArrayHeights([-2.007, 0.645, 100000.0, -1.867, .575, 150000.0]);
-     */
-    Cartesian3.fromRadiansArrayHeights = function(coordinates, ellipsoid, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('coordinates', coordinates);
-        if (coordinates.length < 3 || coordinates.length % 3 !== 0) {
-            throw new Check.DeveloperError('the number of coordinates must be a multiple of 3 and at least 3');
-        }
-        //>>includeEnd('debug');
-
-        var length = coordinates.length;
-        if (!when.defined(result)) {
-            result = new Array(length / 3);
-        } else {
-            result.length = length / 3;
-        }
-
-        for (var i = 0; i < length; i += 3) {
-            var longitude = coordinates[i];
-            var latitude = coordinates[i + 1];
-            var height = coordinates[i + 2];
-            var index = i / 3;
-            result[index] = Cartesian3.fromRadians(longitude, latitude, height, ellipsoid, result[index]);
-        }
-
-        return result;
-    };
-
-    /**
-     * An immutable Cartesian3 instance initialized to (0.0, 0.0, 0.0).
-     *
-     * @type {Cartesian3}
-     * @constant
-     */
-    Cartesian3.ZERO = Object.freeze(new Cartesian3(0.0, 0.0, 0.0));
-
-    /**
-     * An immutable Cartesian3 instance initialized to (1.0, 0.0, 0.0).
-     *
-     * @type {Cartesian3}
-     * @constant
-     */
-    Cartesian3.UNIT_X = Object.freeze(new Cartesian3(1.0, 0.0, 0.0));
-
-    /**
-     * An immutable Cartesian3 instance initialized to (0.0, 1.0, 0.0).
-     *
-     * @type {Cartesian3}
-     * @constant
-     */
-    Cartesian3.UNIT_Y = Object.freeze(new Cartesian3(0.0, 1.0, 0.0));
-
-    /**
-     * An immutable Cartesian3 instance initialized to (0.0, 0.0, 1.0).
-     *
-     * @type {Cartesian3}
-     * @constant
-     */
-    Cartesian3.UNIT_Z = Object.freeze(new Cartesian3(0.0, 0.0, 1.0));
-
-    /**
-     * Duplicates this Cartesian3 instance.
-     *
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
-     */
-    Cartesian3.prototype.clone = function(result) {
-        return Cartesian3.clone(this, result);
-    };
-
-    /**
-     * Compares this Cartesian against the provided Cartesian componentwise and returns
-     * <code>true</code> if they are equal, <code>false</code> otherwise.
-     *
-     * @param {Cartesian3} [right] The right hand side Cartesian.
-     * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-     */
-    Cartesian3.prototype.equals = function(right) {
-        return Cartesian3.equals(this, right);
-    };
-
-    /**
-     * Compares this Cartesian against the provided Cartesian componentwise and returns
-     * <code>true</code> if they pass an absolute or relative tolerance test,
-     * <code>false</code> otherwise.
-     *
-     * @param {Cartesian3} [right] The right hand side Cartesian.
-     * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-     * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-     * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.
-     */
-    Cartesian3.prototype.equalsEpsilon = function(right, relativeEpsilon, absoluteEpsilon) {
-        return Cartesian3.equalsEpsilon(this, right, relativeEpsilon, absoluteEpsilon);
-    };
-
-    /**
-     * Creates a string representing this Cartesian in the format '(x, y, z)'.
-     *
-     * @returns {String} A string representing this Cartesian in the format '(x, y, z)'.
-     */
-    Cartesian3.prototype.toString = function() {
-        return '(' + this.x + ', ' + this.y + ', ' + this.z + ')';
-    };
-
-    var scaleToGeodeticSurfaceIntersection = new Cartesian3();
-        var scaleToGeodeticSurfaceGradient = new Cartesian3();
-
-        /**
-         * Scales the provided Cartesian position along the geodetic surface normal
-         * so that it is on the surface of this ellipsoid.  If the position is
-         * at the center of the ellipsoid, this function returns undefined.
-         *
-         * @param {Cartesian3} cartesian The Cartesian position to scale.
-         * @param {Cartesian3} oneOverRadii One over radii of the ellipsoid.
-         * @param {Cartesian3} oneOverRadiiSquared One over radii squared of the ellipsoid.
-         * @param {Number} centerToleranceSquared Tolerance for closeness to the center.
-         * @param {Cartesian3} [result] The object onto which to store the result.
-         * @returns {Cartesian3} The modified result parameter, a new Cartesian3 instance if none was provided, or undefined if the position is at the center.
-         *
-         * @exports scaleToGeodeticSurface
-         *
-         * @private
-         */
-        function scaleToGeodeticSurface(cartesian, oneOverRadii, oneOverRadiiSquared, centerToleranceSquared, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(cartesian)) {
-                throw new Check.DeveloperError('cartesian is required.');
-            }
-            if (!when.defined(oneOverRadii)) {
-                throw new Check.DeveloperError('oneOverRadii is required.');
-            }
-            if (!when.defined(oneOverRadiiSquared)) {
-                throw new Check.DeveloperError('oneOverRadiiSquared is required.');
-            }
-            if (!when.defined(centerToleranceSquared)) {
-                throw new Check.DeveloperError('centerToleranceSquared is required.');
-            }
-            //>>includeEnd('debug');
-
-            var positionX = cartesian.x;
-            var positionY = cartesian.y;
-            var positionZ = cartesian.z;
-
-            var oneOverRadiiX = oneOverRadii.x;
-            var oneOverRadiiY = oneOverRadii.y;
-            var oneOverRadiiZ = oneOverRadii.z;
-
-            var x2 = positionX * positionX * oneOverRadiiX * oneOverRadiiX;
-            var y2 = positionY * positionY * oneOverRadiiY * oneOverRadiiY;
-            var z2 = positionZ * positionZ * oneOverRadiiZ * oneOverRadiiZ;
-
-            // Compute the squared ellipsoid norm.
-            var squaredNorm = x2 + y2 + z2;
-            var ratio = Math.sqrt(1.0 / squaredNorm);
-
-            // As an initial approximation, assume that the radial intersection is the projection point.
-            var intersection = Cartesian3.multiplyByScalar(cartesian, ratio, scaleToGeodeticSurfaceIntersection);
-
-            // If the position is near the center, the iteration will not converge.
-            if (squaredNorm < centerToleranceSquared) {
-                return !isFinite(ratio) ? undefined : Cartesian3.clone(intersection, result);
-            }
-
-            var oneOverRadiiSquaredX = oneOverRadiiSquared.x;
-            var oneOverRadiiSquaredY = oneOverRadiiSquared.y;
-            var oneOverRadiiSquaredZ = oneOverRadiiSquared.z;
-
-            // Use the gradient at the intersection point in place of the true unit normal.
-            // The difference in magnitude will be absorbed in the multiplier.
-            var gradient = scaleToGeodeticSurfaceGradient;
-            gradient.x = intersection.x * oneOverRadiiSquaredX * 2.0;
-            gradient.y = intersection.y * oneOverRadiiSquaredY * 2.0;
-            gradient.z = intersection.z * oneOverRadiiSquaredZ * 2.0;
-
-            // Compute the initial guess at the normal vector multiplier, lambda.
-            var lambda = (1.0 - ratio) * Cartesian3.magnitude(cartesian) / (0.5 * Cartesian3.magnitude(gradient));
-            var correction = 0.0;
-
-            var func;
-            var denominator;
-            var xMultiplier;
-            var yMultiplier;
-            var zMultiplier;
-            var xMultiplier2;
-            var yMultiplier2;
-            var zMultiplier2;
-            var xMultiplier3;
-            var yMultiplier3;
-            var zMultiplier3;
-
-            do {
-                lambda -= correction;
-
-                xMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredX);
-                yMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredY);
-                zMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredZ);
-
-                xMultiplier2 = xMultiplier * xMultiplier;
-                yMultiplier2 = yMultiplier * yMultiplier;
-                zMultiplier2 = zMultiplier * zMultiplier;
-
-                xMultiplier3 = xMultiplier2 * xMultiplier;
-                yMultiplier3 = yMultiplier2 * yMultiplier;
-                zMultiplier3 = zMultiplier2 * zMultiplier;
-
-                func = x2 * xMultiplier2 + y2 * yMultiplier2 + z2 * zMultiplier2 - 1.0;
-
-                // "denominator" here refers to the use of this expression in the velocity and acceleration
-                // computations in the sections to follow.
-                denominator = x2 * xMultiplier3 * oneOverRadiiSquaredX + y2 * yMultiplier3 * oneOverRadiiSquaredY + z2 * zMultiplier3 * oneOverRadiiSquaredZ;
-
-                var derivative = -2.0 * denominator;
-
-                correction = func / derivative;
-            } while (Math.abs(func) > _Math.CesiumMath.EPSILON12);
-
-            if (!when.defined(result)) {
-                return new Cartesian3(positionX * xMultiplier, positionY * yMultiplier, positionZ * zMultiplier);
-            }
-            result.x = positionX * xMultiplier;
-            result.y = positionY * yMultiplier;
-            result.z = positionZ * zMultiplier;
-            return result;
-        }
-
-    /**
-     * A position defined by longitude, latitude, and height.
-     * @alias Cartographic
-     * @constructor
-     *
-     * @param {Number} [longitude=0.0] The longitude, in radians.
-     * @param {Number} [latitude=0.0] The latitude, in radians.
-     * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.
-     *
-     * @see Ellipsoid
-     */
-    function Cartographic(longitude, latitude, height) {
-        /**
-         * The longitude, in radians.
-         * @type {Number}
-         * @default 0.0
-         */
-        this.longitude = when.defaultValue(longitude, 0.0);
-
-        /**
-         * The latitude, in radians.
-         * @type {Number}
-         * @default 0.0
-         */
-        this.latitude = when.defaultValue(latitude, 0.0);
-
-        /**
-         * The height, in meters, above the ellipsoid.
-         * @type {Number}
-         * @default 0.0
-         */
-        this.height = when.defaultValue(height, 0.0);
-    }
-
-    /**
-     * Creates a new Cartographic instance from longitude and latitude
-     * specified in radians.
-     *
-     * @param {Number} longitude The longitude, in radians.
-     * @param {Number} latitude The latitude, in radians.
-     * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.
-     * @param {Cartographic} [result] The object onto which to store the result.
-     * @returns {Cartographic} The modified result parameter or a new Cartographic instance if one was not provided.
-     */
-    Cartographic.fromRadians = function(longitude, latitude, height, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('longitude', longitude);
-        Check.Check.typeOf.number('latitude', latitude);
-        //>>includeEnd('debug');
-
-        height = when.defaultValue(height, 0.0);
-
-        if (!when.defined(result)) {
-            return new Cartographic(longitude, latitude, height);
-        }
-
-        result.longitude = longitude;
-        result.latitude = latitude;
-        result.height = height;
-        return result;
-    };
-
-    /**
-     * Creates a new Cartographic instance from longitude and latitude
-     * specified in degrees.  The values in the resulting object will
-     * be in radians.
-     *
-     * @param {Number} longitude The longitude, in degrees.
-     * @param {Number} latitude The latitude, in degrees.
-     * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.
-     * @param {Cartographic} [result] The object onto which to store the result.
-     * @returns {Cartographic} The modified result parameter or a new Cartographic instance if one was not provided.
-     */
-    Cartographic.fromDegrees = function(longitude, latitude, height, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('longitude', longitude);
-        Check.Check.typeOf.number('latitude', latitude);
-        //>>includeEnd('debug');
-        longitude = _Math.CesiumMath.toRadians(longitude);
-        latitude = _Math.CesiumMath.toRadians(latitude);
-
-        return Cartographic.fromRadians(longitude, latitude, height, result);
-    };
-
-    var cartesianToCartographicN = new Cartesian3();
-    var cartesianToCartographicP = new Cartesian3();
-    var cartesianToCartographicH = new Cartesian3();
-    var wgs84OneOverRadii = new Cartesian3(1.0 / 6378137.0, 1.0 / 6378137.0, 1.0 / 6356752.3142451793);
-    var wgs84OneOverRadiiEx = new Cartesian3(1.0 / 6378137.0, 1.0 / 6378137.0, 1.0 / 6378137.0);
-    var wgs84OneOverRadiiSquared = new Cartesian3(1.0 / (6378137.0 * 6378137.0), 1.0 / (6378137.0 * 6378137.0), 1.0 / (6356752.3142451793 * 6356752.3142451793));
-    var wgs84OneOverRadiiSquaredEx = new Cartesian3(1.0 / (6378137.0 * 6378137.0), 1.0 / (6378137.0 * 6378137.0), 1.0 / (6378137.0 * 6378137.0));
-    var wgs84CenterToleranceSquared = _Math.CesiumMath.EPSILON1;
-
-    /**
-     * Creates a new Cartographic instance from a Cartesian position. The values in the
-     * resulting object will be in radians.
-     *
-     * @param {Cartesian3} cartesian The Cartesian position to convert to cartographic representation.
-     * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.
-     * @param {Cartographic} [result] The object onto which to store the result.
-     * @returns {Cartographic} The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid.
-     */
-    Cartographic.fromCartesian = function(cartesian, ellipsoid, result) {
-        var oneOverRadii = when.defined(ellipsoid) ? ellipsoid.oneOverRadii : wgs84OneOverRadiiEx;
-        var oneOverRadiiSquared = when.defined(ellipsoid) ? ellipsoid.oneOverRadiiSquared : wgs84OneOverRadiiSquaredEx;
-        var centerToleranceSquared = when.defined(ellipsoid) ? ellipsoid._centerToleranceSquared : wgs84CenterToleranceSquared;
-
-        if(_Math.CesiumMath.equalsEpsilon(_Math.CesiumMath.Radius, 6356752.3142451793, _Math.CesiumMath.EPSILON10)) {
-            oneOverRadii = when.defined(ellipsoid) ? ellipsoid.oneOverRadii : wgs84OneOverRadii;
-            oneOverRadiiSquared = when.defined(ellipsoid) ? ellipsoid.oneOverRadiiSquared : wgs84OneOverRadiiSquared;
-        }
-
-        //`cartesian is required.` is thrown from scaleToGeodeticSurface
-        var p = scaleToGeodeticSurface(cartesian, oneOverRadii, oneOverRadiiSquared, centerToleranceSquared, cartesianToCartographicP);
-
-        if (!when.defined(p)) {
-            return undefined;
-        }
-
-        var n = Cartesian3.multiplyComponents(p, oneOverRadiiSquared, cartesianToCartographicN);
-        n = Cartesian3.normalize(n, n);
-
-        var h = Cartesian3.subtract(cartesian, p, cartesianToCartographicH);
-
-        var longitude = Math.atan2(n.y, n.x);
-        var latitude = Math.asin(n.z);
-        var height = _Math.CesiumMath.sign(Cartesian3.dot(h, cartesian)) * Cartesian3.magnitude(h);
-
-        if (!when.defined(result)) {
-            return new Cartographic(longitude, latitude, height);
-        }
-        result.longitude = longitude;
-        result.latitude = latitude;
-        result.height = height;
-        return result;
-    };
-
-    /**
-     * Creates a new Cartesian3 instance from a Cartographic input. The values in the inputted
-     * object should be in radians.
-     *
-     * @param {Cartographic} cartographic Input to be converted into a Cartesian3 output.
-     * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.
-     * @param {Cartesian3} [result] The object onto which to store the result.
-     * @returns {Cartesian3} The position
-     */
-    Cartographic.toCartesian = function(cartographic, ellipsoid, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('cartographic', cartographic);
-        //>>includeEnd('debug');
-
-        return Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height, ellipsoid, result);
-    };
-
-    /**
-     * Computes the distance between two points by global
-     *
-     * @param {Number} longitudeA The longitude, in degrees.
-     * @param {Number} latitudeA The latitude, in degrees.
-     * @param {Number} longitudeB The longitude, in degrees.
-     * @param {Number} latitudeB The latitude, in degrees.
-     */
-    Cartographic.sphericalDistance = function(longitudeA, latitudeA, longitudeB, latitudeB) {
-        Check.Check.defined('longitudeA', longitudeA);
-        Check.Check.defined('longitudeB', longitudeB);
-        Check.Check.defined('latitudeA', latitudeA);
-        Check.Check.defined('latitudeB', latitudeB);
-
-        if(longitudeA === longitudeB && latitudeA === latitudeB){
-            return 0.0;
-        }
-
-        var latA = _Math.CesiumMath.toRadians(latitudeA);
-        var latB = _Math.CesiumMath.toRadians(latitudeB);
-        var lonA = _Math.CesiumMath.toRadians(longitudeA);
-        var lonB = _Math.CesiumMath.toRadians(longitudeB);
-
-        var a2 = lonA * lonA + latA * latA;
-        var b2 = lonB * lonB + latB * latB;
-        var c2 = (lonA - lonB) * (lonA - lonB) + (latA - latB) * (latA - latB);
-
-        var dacos = (a2 + b2 - c2) / (2.0 * Math.sqrt(a2) * Math.sqrt(b2));
-        dacos = _Math.CesiumMath.clamp(dacos, -1.0, 1.0);
-        return Math.acos(dacos) * _Math.CesiumMath.Radius;
-    };
-
-    /**
-     * Duplicates a Cartographic instance.
-     *
-     * @param {Cartographic} cartographic The cartographic to duplicate.
-     * @param {Cartographic} [result] The object onto which to store the result.
-     * @returns {Cartographic} The modified result parameter or a new Cartographic instance if one was not provided. (Returns undefined if cartographic is undefined)
-     */
-    Cartographic.clone = function(cartographic, result) {
-        if (!when.defined(cartographic)) {
-            return undefined;
-        }
-        if (!when.defined(result)) {
-            return new Cartographic(cartographic.longitude, cartographic.latitude, cartographic.height);
-        }
-        result.longitude = cartographic.longitude;
-        result.latitude = cartographic.latitude;
-        result.height = cartographic.height;
-        return result;
-    };
-
-    /**
-     * Compares the provided cartographics componentwise and returns
-     * <code>true</code> if they are equal, <code>false</code> otherwise.
-     *
-     * @param {Cartographic} [left] The first cartographic.
-     * @param {Cartographic} [right] The second cartographic.
-     * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-     */
-    Cartographic.equals = function(left, right) {
-        return (left === right) ||
-                ((when.defined(left)) &&
-                 (when.defined(right)) &&
-                 (left.longitude === right.longitude) &&
-                 (left.latitude === right.latitude) &&
-                 (left.height === right.height));
-    };
-
-    /**
-     * Compares the provided cartographics componentwise and returns
-     * <code>true</code> if they are within the provided epsilon,
-     * <code>false</code> otherwise.
-     *
-     * @param {Cartographic} [left] The first cartographic.
-     * @param {Cartographic} [right] The second cartographic.
-     * @param {Number} epsilon The epsilon to use for equality testing.
-     * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-     */
-    Cartographic.equalsEpsilon = function(left, right, epsilon) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number('epsilon', epsilon);
-        //>>includeEnd('debug');
-
-        return (left === right) ||
-               ((when.defined(left)) &&
-                (when.defined(right)) &&
-                (Math.abs(left.longitude - right.longitude) <= epsilon) &&
-                (Math.abs(left.latitude - right.latitude) <= epsilon) &&
-                (Math.abs(left.height - right.height) <= epsilon));
-    };
-
-    /**
-     * An immutable Cartographic instance initialized to (0.0, 0.0, 0.0).
-     *
-     * @type {Cartographic}
-     * @constant
-     */
-    Cartographic.ZERO = Object.freeze(new Cartographic(0.0, 0.0, 0.0));
-
-    /**
-     * Duplicates this instance.
-     *
-     * @param {Cartographic} [result] The object onto which to store the result.
-     * @returns {Cartographic} The modified result parameter or a new Cartographic instance if one was not provided.
-     */
-    Cartographic.prototype.clone = function(result) {
-        return Cartographic.clone(this, result);
-    };
-
-    /**
-     * Compares the provided against this cartographic componentwise and returns
-     * <code>true</code> if they are equal, <code>false</code> otherwise.
-     *
-     * @param {Cartographic} [right] The second cartographic.
-     * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-     */
-    Cartographic.prototype.equals = function(right) {
-        return Cartographic.equals(this, right);
-    };
-
-    /**
-     * Compares the provided against this cartographic componentwise and returns
-     * <code>true</code> if they are within the provided epsilon,
-     * <code>false</code> otherwise.
-     *
-     * @param {Cartographic} [right] The second cartographic.
-     * @param {Number} epsilon The epsilon to use for equality testing.
-     * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-     */
-    Cartographic.prototype.equalsEpsilon = function(right, epsilon) {
-        return Cartographic.equalsEpsilon(this, right, epsilon);
-    };
-
-    /**
-     * Creates a string representing this cartographic in the format '(longitude, latitude, height)'.
-     *
-     * @returns {String} A string representing the provided cartographic in the format '(longitude, latitude, height)'.
-     */
-    Cartographic.prototype.toString = function() {
-        return '(' + this.longitude + ', ' + this.latitude + ', ' + this.height + ')';
-    };
-
-    exports.Cartesian3 = Cartesian3;
-    exports.Cartographic = Cartographic;
-    exports.scaleToGeodeticSurface = scaleToGeodeticSurface;
-
-});
diff --git a/public/libs/Cesium/Workers/Check-70bec281.js b/public/libs/Cesium/Workers/Check-70bec281.js
deleted file mode 100644
index f0a9e92..0000000
--- a/public/libs/Cesium/Workers/Check-70bec281.js
+++ /dev/null
@@ -1,274 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60'], function (exports, when) { 'use strict';
-
-    /**
-         * Constructs an exception object that is thrown due to a developer error, e.g., invalid argument,
-         * argument out of range, etc.  This exception should only be thrown during development;
-         * it usually indicates a bug in the calling code.  This exception should never be
-         * caught; instead the calling code should strive not to generate it.
-         * <br /><br />
-         * On the other hand, a {@link RuntimeError} indicates an exception that may
-         * be thrown at runtime, e.g., out of memory, that the calling code should be prepared
-         * to catch.
-         *
-         * @alias DeveloperError
-         * @constructor
-         * @extends Error
-         *
-         * @param {String} [message] The error message for this exception.
-         *
-         * @see RuntimeError
-         */
-        function DeveloperError(message) {
-            /**
-             * 'DeveloperError' indicating that this exception was thrown due to a developer error.
-             * @type {String}
-             * @readonly
-             */
-            this.name = 'DeveloperError';
-
-            /**
-             * The explanation for why this exception was thrown.
-             * @type {String}
-             * @readonly
-             */
-            this.message = message;
-
-            //Browsers such as IE don't have a stack property until you actually throw the error.
-            var stack;
-            try {
-                throw new Error();
-            } catch (e) {
-                stack = e.stack;
-            }
-
-            /**
-             * The stack trace of this exception, if available.
-             * @type {String}
-             * @readonly
-             */
-            this.stack = stack;
-        }
-
-        if (when.defined(Object.create)) {
-            DeveloperError.prototype = Object.create(Error.prototype);
-            DeveloperError.prototype.constructor = DeveloperError;
-        }
-
-        DeveloperError.prototype.toString = function() {
-            var str = this.name + ': ' + this.message;
-
-            if (when.defined(this.stack)) {
-                str += '\n' + this.stack.toString();
-            }
-
-            return str;
-        };
-
-        /**
-         * @private
-         */
-        DeveloperError.throwInstantiationError = function() {
-            throw new DeveloperError('This function defines an interface and should not be called directly.');
-        };
-
-    /**
-         * Contains functions for checking that supplied arguments are of a specified type
-         * or meet specified conditions
-         * @private
-         */
-        var Check = {};
-
-        /**
-         * Contains type checking functions, all using the typeof operator
-         */
-        Check.typeOf = {};
-
-        function getUndefinedErrorMessage(name) {
-            return name + ' is required, actual value was undefined';
-        }
-
-        function getFailedTypeErrorMessage(actual, expected, name) {
-            return 'Expected ' + name + ' to be typeof ' + expected + ', actual typeof was ' + actual;
-        }
-
-        /**
-         * Throws if test is not defined
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value that is to be checked
-         * @exception {DeveloperError} test must be defined
-         */
-        Check.defined = function (name, test) {
-            if (!when.defined(test)) {
-                throw new DeveloperError(getUndefinedErrorMessage(name));
-            }
-        };
-
-        /**
-         * Throws if test is not typeof 'function'
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value to test
-         * @exception {DeveloperError} test must be typeof 'function'
-         */
-        Check.typeOf.func = function (name, test) {
-            if (typeof test !== 'function') {
-                throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'function', name));
-            }
-        };
-
-        /**
-         * Throws if test is not typeof 'string'
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value to test
-         * @exception {DeveloperError} test must be typeof 'string'
-         */
-        Check.typeOf.string = function (name, test) {
-            if (typeof test !== 'string') {
-                throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'string', name));
-            }
-        };
-
-        /**
-         * Throws if test is not typeof 'number'
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value to test
-         * @exception {DeveloperError} test must be typeof 'number'
-         */
-        Check.typeOf.number = function (name, test) {
-            if (typeof test !== 'number') {
-                throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'number', name));
-            }
-        };
-
-        /**
-         * Throws if test is not typeof 'number' and less than limit
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value to test
-         * @param {Number} limit The limit value to compare against
-         * @exception {DeveloperError} test must be typeof 'number' and less than limit
-         */
-        Check.typeOf.number.lessThan = function (name, test, limit) {
-            Check.typeOf.number(name, test);
-            if (test >= limit) {
-                throw new DeveloperError('Expected ' + name + ' to be less than ' + limit + ', actual value was ' + test);
-            }
-        };
-
-        /**
-         * Throws if test is not typeof 'number' and less than or equal to limit
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value to test
-         * @param {Number} limit The limit value to compare against
-         * @exception {DeveloperError} test must be typeof 'number' and less than or equal to limit
-         */
-        Check.typeOf.number.lessThanOrEquals = function (name, test, limit) {
-            Check.typeOf.number(name, test);
-            if (test > limit) {
-                throw new DeveloperError('Expected ' + name + ' to be less than or equal to ' + limit + ', actual value was ' + test);
-            }
-        };
-
-        /**
-         * Throws if test is not typeof 'number' and greater than limit
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value to test
-         * @param {Number} limit The limit value to compare against
-         * @exception {DeveloperError} test must be typeof 'number' and greater than limit
-         */
-        Check.typeOf.number.greaterThan = function (name, test, limit) {
-            Check.typeOf.number(name, test);
-            if (test <= limit) {
-                throw new DeveloperError('Expected ' + name + ' to be greater than ' + limit + ', actual value was ' + test);
-            }
-        };
-
-        /**
-         * Throws if test is not typeof 'number' and greater than or equal to limit
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value to test
-         * @param {Number} limit The limit value to compare against
-         * @exception {DeveloperError} test must be typeof 'number' and greater than or equal to limit
-         */
-        Check.typeOf.number.greaterThanOrEquals = function (name, test, limit) {
-            Check.typeOf.number(name, test);
-            if (test < limit) {
-                throw new DeveloperError('Expected ' + name + ' to be greater than or equal to' + limit + ', actual value was ' + test);
-            }
-        };
-
-        /**
-         * Throws if test is not typeof 'object'
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value to test
-         * @exception {DeveloperError} test must be typeof 'object'
-         */
-        Check.typeOf.object = function (name, test) {
-            if (typeof test !== 'object') {
-                throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'object', name));
-            }
-        };
-
-        /**
-         * Throws if test is not typeof 'boolean'
-         *
-         * @param {String} name The name of the variable being tested
-         * @param {*} test The value to test
-         * @exception {DeveloperError} test must be typeof 'boolean'
-         */
-        Check.typeOf.bool = function (name, test) {
-            if (typeof test !== 'boolean') {
-                throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'boolean', name));
-            }
-        };
-
-        /**
-         * Throws if test1 and test2 is not typeof 'number' and not equal in value
-         *
-         * @param {String} name1 The name of the first variable being tested
-         * @param {String} name2 The name of the second variable being tested against
-         * @param {*} test1 The value to test
-         * @param {*} test2 The value to test against
-         * @exception {DeveloperError} test1 and test2 should be type of 'number' and be equal in value
-         */
-        Check.typeOf.number.equals = function (name1, name2, test1, test2) {
-            Check.typeOf.number(name1, test1);
-            Check.typeOf.number(name2, test2);
-            if (test1 !== test2) {
-                throw new DeveloperError(name1 + ' must be equal to ' + name2 + ', the actual values are ' + test1 + ' and ' + test2);
-            }
-        };
-
-    exports.Check = Check;
-    exports.DeveloperError = DeveloperError;
-
-});
diff --git a/public/libs/Cesium/Workers/Color-69f1845f.js b/public/libs/Cesium/Workers/Color-69f1845f.js
deleted file mode 100644
index a449f01..0000000
--- a/public/libs/Cesium/Workers/Color-69f1845f.js
+++ /dev/null
@@ -1,2225 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './FeatureDetection-7bd32c34'], function (exports, when, Check, _Math, FeatureDetection) { 'use strict';
-
-    function hue2rgb(m1, m2, h) {
-            if (h < 0) {
-                h += 1;
-            }
-            if (h > 1) {
-                h -= 1;
-            }
-            if (h * 6 < 1) {
-                return m1 + (m2 - m1) * 6 * h;
-            }
-            if (h * 2 < 1) {
-                return m2;
-            }
-            if (h * 3 < 2) {
-                return m1 + (m2 - m1) * (2 / 3 - h) * 6;
-            }
-            return m1;
-        }
-
-        /**
-         * A color, specified using red, green, blue, and alpha values,
-         * which range from <code>0</code> (no intensity) to <code>1.0</code> (full intensity).
-         * @param {Number} [red=1.0] The red component.
-         * @param {Number} [green=1.0] The green component.
-         * @param {Number} [blue=1.0] The blue component.
-         * @param {Number} [alpha=1.0] The alpha component.
-         *
-         * @constructor
-         * @alias Color
-         *
-         * @see Packable
-         */
-        function Color(red, green, blue, alpha) {
-            /**
-             * The red component.
-             * @type {Number}
-             * @default 1.0
-             */
-            this.red = when.defaultValue(red, 1.0);
-            /**
-             * The green component.
-             * @type {Number}
-             * @default 1.0
-             */
-            this.green = when.defaultValue(green, 1.0);
-            /**
-             * The blue component.
-             * @type {Number}
-             * @default 1.0
-             */
-            this.blue = when.defaultValue(blue, 1.0);
-            /**
-             * The alpha component.
-             * @type {Number}
-             * @default 1.0
-             */
-            this.alpha = when.defaultValue(alpha, 1.0);
-        }
-
-        /**
-         * Creates a Color instance from a {@link Cartesian4}. <code>x</code>, <code>y</code>, <code>z</code>,
-         * and <code>w</code> map to <code>red</code>, <code>green</code>, <code>blue</code>, and <code>alpha</code>, respectively.
-         *
-         * @param {Cartesian4} cartesian The source cartesian.
-         * @param {Color} [result] The object onto which to store the result.
-         * @returns {Color} The modified result parameter or a new Color instance if one was not provided.
-         */
-        Color.fromCartesian4 = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Color(cartesian.x, cartesian.y, cartesian.z, cartesian.w);
-            }
-
-            result.red = cartesian.x;
-            result.green = cartesian.y;
-            result.blue = cartesian.z;
-            result.alpha = cartesian.w;
-            return result;
-        };
-
-        /**
-         * Creates a new Color specified using red, green, blue, and alpha values
-         * that are in the range of 0 to 255, converting them internally to a range of 0.0 to 1.0.
-         *
-         * @param {Number} [red=255] The red component.
-         * @param {Number} [green=255] The green component.
-         * @param {Number} [blue=255] The blue component.
-         * @param {Number} [alpha=255] The alpha component.
-         * @param {Color} [result] The object onto which to store the result.
-         * @returns {Color} The modified result parameter or a new Color instance if one was not provided.
-         */
-        Color.fromBytes = function(red, green, blue, alpha, result) {
-            red = Color.byteToFloat(when.defaultValue(red, 255.0));
-            green = Color.byteToFloat(when.defaultValue(green, 255.0));
-            blue = Color.byteToFloat(when.defaultValue(blue, 255.0));
-            alpha = Color.byteToFloat(when.defaultValue(alpha, 255.0));
-
-            if (!when.defined(result)) {
-                return new Color(red, green, blue, alpha);
-            }
-
-            result.red = red;
-            result.green = green;
-            result.blue = blue;
-            result.alpha = alpha;
-            return result;
-        };
-
-        /**
-         * Creates a new Color that has the same red, green, and blue components
-         * of the specified color, but with the specified alpha value.
-         *
-         * @param {Color} color The base color
-         * @param {Number} alpha The new alpha component.
-         * @param {Color} [result] The object onto which to store the result.
-         * @returns {Color} The modified result parameter or a new Color instance if one was not provided.
-         *
-         * @example var translucentRed = Cesium.Color.fromAlpha(Cesium.Color.RED, 0.9);
-         */
-        Color.fromAlpha = function(color, alpha, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('color', color);
-            Check.Check.typeOf.number('alpha', alpha);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Color(color.red, color.green, color.blue, alpha);
-            }
-
-            result.red = color.red;
-            result.green = color.green;
-            result.blue = color.blue;
-            result.alpha = alpha;
-            return result;
-        };
-
-        var scratchArrayBuffer;
-        var scratchUint32Array;
-        var scratchUint8Array;
-        if (FeatureDetection.FeatureDetection.supportsTypedArrays()) {
-            scratchArrayBuffer = new ArrayBuffer(4);
-            scratchUint32Array = new Uint32Array(scratchArrayBuffer);
-            scratchUint8Array = new Uint8Array(scratchArrayBuffer);
-        }
-
-        /**
-         * Creates a new Color from a single numeric unsigned 32-bit RGBA value, using the endianness
-         * of the system.
-         *
-         * @param {Number} rgba A single numeric unsigned 32-bit RGBA value.
-         * @param {Color} [result] The object to store the result in, if undefined a new instance will be created.
-         * @returns {Color} The color object.
-         *
-         * @example
-         * var color = Cesium.Color.fromRgba(0x67ADDFFF);
-         *
-         * @see Color#toRgba
-         */
-        Color.fromRgba = function(rgba, result) {
-            // scratchUint32Array and scratchUint8Array share an underlying array buffer
-            scratchUint32Array[0] = rgba;
-            return Color.fromBytes(scratchUint8Array[0], scratchUint8Array[1], scratchUint8Array[2], scratchUint8Array[3], result);
-        };
-
-        Color.byteToRgba = function(red, green, blue, alpha) {
-            scratchUint8Array[0] = red;
-            scratchUint8Array[1] = green;
-            scratchUint8Array[2] = blue;
-            scratchUint8Array[3] = alpha;
-            return scratchUint32Array[0];
-        };
-
-        /**
-         * Creates a Color instance from hue, saturation, and lightness.
-         *
-         * @param {Number} [hue=0] The hue angle 0...1
-         * @param {Number} [saturation=0] The saturation value 0...1
-         * @param {Number} [lightness=0] The lightness value 0...1
-         * @param {Number} [alpha=1.0] The alpha component 0...1
-         * @param {Color} [result] The object to store the result in, if undefined a new instance will be created.
-         * @returns {Color} The color object.
-         *
-         * @see {@link http://www.w3.org/TR/css3-color/#hsl-color|CSS color values}
-         */
-        Color.fromHsl = function(hue, saturation, lightness, alpha, result) {
-            hue = when.defaultValue(hue, 0.0) % 1.0;
-            saturation = when.defaultValue(saturation, 0.0);
-            lightness = when.defaultValue(lightness, 0.0);
-            alpha = when.defaultValue(alpha, 1.0);
-
-            var red = lightness;
-            var green = lightness;
-            var blue = lightness;
-
-            if (saturation !== 0) {
-                var m2;
-                if (lightness < 0.5) {
-                    m2 = lightness * (1 + saturation);
-                } else {
-                    m2 = lightness + saturation - lightness * saturation;
-                }
-
-                var m1 = 2.0 * lightness - m2;
-                red = hue2rgb(m1, m2, hue + 1 / 3);
-                green = hue2rgb(m1, m2, hue);
-                blue = hue2rgb(m1, m2, hue - 1 / 3);
-            }
-
-            if (!when.defined(result)) {
-                return new Color(red, green, blue, alpha);
-            }
-
-            result.red = red;
-            result.green = green;
-            result.blue = blue;
-            result.alpha = alpha;
-            return result;
-        };
-
-        /**
-         * Creates a random color using the provided options. For reproducible random colors, you should
-         * call {@link CesiumMath#setRandomNumberSeed} once at the beginning of your application.
-         *
-         * @param {Object} [options] Object with the following properties:
-         * @param {Number} [options.red] If specified, the red component to use instead of a randomized value.
-         * @param {Number} [options.minimumRed=0.0] The maximum red value to generate if none was specified.
-         * @param {Number} [options.maximumRed=1.0] The minimum red value to generate if none was specified.
-         * @param {Number} [options.green] If specified, the green component to use instead of a randomized value.
-         * @param {Number} [options.minimumGreen=0.0] The maximum green value to generate if none was specified.
-         * @param {Number} [options.maximumGreen=1.0] The minimum green value to generate if none was specified.
-         * @param {Number} [options.blue] If specified, the blue component to use instead of a randomized value.
-         * @param {Number} [options.minimumBlue=0.0] The maximum blue value to generate if none was specified.
-         * @param {Number} [options.maximumBlue=1.0] The minimum blue value to generate if none was specified.
-         * @param {Number} [options.alpha] If specified, the alpha component to use instead of a randomized value.
-         * @param {Number} [options.minimumAlpha=0.0] The maximum alpha value to generate if none was specified.
-         * @param {Number} [options.maximumAlpha=1.0] The minimum alpha value to generate if none was specified.
-         * @param {Color} [result] The object to store the result in, if undefined a new instance will be created.
-         * @returns {Color} The modified result parameter or a new instance if result was undefined.
-         *
-         * @exception {DeveloperError} minimumRed must be less than or equal to maximumRed.
-         * @exception {DeveloperError} minimumGreen must be less than or equal to maximumGreen.
-         * @exception {DeveloperError} minimumBlue must be less than or equal to maximumBlue.
-         * @exception {DeveloperError} minimumAlpha must be less than or equal to maximumAlpha.
-         *
-         * @example
-         * //Create a completely random color
-         * var color = Cesium.Color.fromRandom();
-         *
-         * //Create a random shade of yellow.
-         * var color = Cesium.Color.fromRandom({
-         *     red : 1.0,
-         *     green : 1.0,
-         *     alpha : 1.0
-         * });
-         *
-         * //Create a random bright color.
-         * var color = Cesium.Color.fromRandom({
-         *     minimumRed : 0.75,
-         *     minimumGreen : 0.75,
-         *     minimumBlue : 0.75,
-         *     alpha : 1.0
-         * });
-         */
-        Color.fromRandom = function(options, result) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var red = options.red;
-            if (!when.defined(red)) {
-                var minimumRed = when.defaultValue(options.minimumRed, 0);
-                var maximumRed = when.defaultValue(options.maximumRed, 1.0);
-
-                //>>includeStart('debug', pragmas.debug);
-                Check.Check.typeOf.number.lessThanOrEquals('minimumRed', minimumRed, maximumRed);
-                //>>includeEnd('debug');
-
-                red = minimumRed + (_Math.CesiumMath.nextRandomNumber() * (maximumRed - minimumRed));
-            }
-
-            var green = options.green;
-            if (!when.defined(green)) {
-                var minimumGreen = when.defaultValue(options.minimumGreen, 0);
-                var maximumGreen = when.defaultValue(options.maximumGreen, 1.0);
-
-                //>>includeStart('debug', pragmas.debug);
-                Check.Check.typeOf.number.lessThanOrEquals('minimumGreen', minimumGreen, maximumGreen);
-                //>>includeEnd('debug');
-                green = minimumGreen + (_Math.CesiumMath.nextRandomNumber() * (maximumGreen - minimumGreen));
-            }
-
-            var blue = options.blue;
-            if (!when.defined(blue)) {
-                var minimumBlue = when.defaultValue(options.minimumBlue, 0);
-                var maximumBlue = when.defaultValue(options.maximumBlue, 1.0);
-
-                //>>includeStart('debug', pragmas.debug);
-                Check.Check.typeOf.number.lessThanOrEquals('minimumBlue', minimumBlue, maximumBlue);
-                //>>includeEnd('debug');
-
-                blue = minimumBlue + (_Math.CesiumMath.nextRandomNumber() * (maximumBlue - minimumBlue));
-            }
-
-            var alpha = options.alpha;
-            if (!when.defined(alpha)) {
-                var minimumAlpha = when.defaultValue(options.minimumAlpha, 0);
-                var maximumAlpha = when.defaultValue(options.maximumAlpha, 1.0);
-
-                //>>includeStart('debug', pragmas.debug);
-                Check.Check.typeOf.number.lessThanOrEquals('minumumAlpha', minimumAlpha, maximumAlpha);
-                //>>includeEnd('debug');
-
-                alpha = minimumAlpha + (_Math.CesiumMath.nextRandomNumber() * (maximumAlpha - minimumAlpha));
-            }
-
-            if (!when.defined(result)) {
-                return new Color(red, green, blue, alpha);
-            }
-
-            result.red = red;
-            result.green = green;
-            result.blue = blue;
-            result.alpha = alpha;
-            return result;
-        };
-
-        //#rgb
-        var rgbMatcher = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i;
-        //#rrggbb
-        var rrggbbMatcher = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;
-        //rgb(), rgba(), or rgb%()
-        var rgbParenthesesMatcher = /^rgba?\(\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)\s*,\s*([0-9.]+%?)(?:\s*,\s*([0-9.]+))?\s*\)$/i;
-        //hsl(), hsla(), or hsl%()
-        var hslParenthesesMatcher = /^hsla?\(\s*([0-9.]+)\s*,\s*([0-9.]+%)\s*,\s*([0-9.]+%)(?:\s*,\s*([0-9.]+))?\s*\)$/i;
-
-        /**
-         * Creates a Color instance from a CSS color value.
-         *
-         * @param {String} color The CSS color value in #rgb, #rrggbb, rgb(), rgba(), hsl(), or hsla() format.
-         * @param {Color} [result] The object to store the result in, if undefined a new instance will be created.
-         * @returns {Color} The color object, or undefined if the string was not a valid CSS color.
-         *
-         *
-         * @example
-         * var cesiumBlue = Cesium.Color.fromCssColorString('#67ADDF');
-         * var green = Cesium.Color.fromCssColorString('green');
-         *
-         * @see {@link http://www.w3.org/TR/css3-color|CSS color values}
-         */
-        Color.fromCssColorString = function(color, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.string('color', color);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Color();
-            }
-
-            var namedColor = Color[color.toUpperCase()];
-            if (when.defined(namedColor)) {
-                Color.clone(namedColor, result);
-                return result;
-            }
-
-            var matches = rgbMatcher.exec(color);
-            if (matches !== null) {
-                result.red = parseInt(matches[1], 16) / 15;
-                result.green = parseInt(matches[2], 16) / 15.0;
-                result.blue = parseInt(matches[3], 16) / 15.0;
-                result.alpha = 1.0;
-                return result;
-            }
-
-            matches = rrggbbMatcher.exec(color);
-            if (matches !== null) {
-                result.red = parseInt(matches[1], 16) / 255.0;
-                result.green = parseInt(matches[2], 16) / 255.0;
-                result.blue = parseInt(matches[3], 16) / 255.0;
-                result.alpha = 1.0;
-                return result;
-            }
-
-            matches = rgbParenthesesMatcher.exec(color);
-            if (matches !== null) {
-                result.red = parseFloat(matches[1]) / ('%' === matches[1].substr(-1) ? 100.0 : 255.0);
-                result.green = parseFloat(matches[2]) / ('%' === matches[2].substr(-1) ? 100.0 : 255.0);
-                result.blue = parseFloat(matches[3]) / ('%' === matches[3].substr(-1) ? 100.0 : 255.0);
-                result.alpha = parseFloat(when.defaultValue(matches[4], '1.0'));
-                return result;
-            }
-
-            matches = hslParenthesesMatcher.exec(color);
-            if (matches !== null) {
-                return Color.fromHsl(parseFloat(matches[1]) / 360.0,
-                                     parseFloat(matches[2]) / 100.0,
-                                     parseFloat(matches[3]) / 100.0,
-                                     parseFloat(when.defaultValue(matches[4], '1.0')), result);
-            }
-
-            result = undefined;
-            return result;
-        };
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        Color.packedLength = 4;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {Color} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        Color.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-            array[startingIndex++] = value.red;
-            array[startingIndex++] = value.green;
-            array[startingIndex++] = value.blue;
-            array[startingIndex] = value.alpha;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {Color} [result] The object into which to store the result.
-         * @returns {Color} The modified result parameter or a new Color instance if one was not provided.
-         */
-        Color.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-            if (!when.defined(result)) {
-                result = new Color();
-            }
-            result.red = array[startingIndex++];
-            result.green = array[startingIndex++];
-            result.blue = array[startingIndex++];
-            result.alpha = array[startingIndex];
-            return result;
-        };
-
-        /**
-         * Converts a 'byte' color component in the range of 0 to 255 into
-         * a 'float' color component in the range of 0 to 1.0.
-         *
-         * @param {Number} number The number to be converted.
-         * @returns {Number} The converted number.
-         */
-        Color.byteToFloat = function(number) {
-            return number / 255.0;
-        };
-
-        /**
-         * Converts a 'float' color component in the range of 0 to 1.0 into
-         * a 'byte' color component in the range of 0 to 255.
-         *
-         * @param {Number} number The number to be converted.
-         * @returns {Number} The converted number.
-         */
-        Color.floatToByte = function(number) {
-            return number === 1.0 ? 255.0 : (number * 256.0) | 0;
-        };
-
-        /**
-         * Duplicates a Color.
-         *
-         * @param {Color} color The Color to duplicate.
-         * @param {Color} [result] The object to store the result in, if undefined a new instance will be created.
-         * @returns {Color} The modified result parameter or a new instance if result was undefined. (Returns undefined if color is undefined)
-         */
-        Color.clone = function(color, result) {
-            if (!when.defined(color)) {
-                return undefined;
-            }
-            if (!when.defined(result)) {
-                return new Color(color.red, color.green, color.blue, color.alpha);
-            }
-            result.red = color.red;
-            result.green = color.green;
-            result.blue = color.blue;
-            result.alpha = color.alpha;
-            return result;
-        };
-
-        /**
-         * Returns true if the first Color equals the second color.
-         *
-         * @param {Color} left The first Color to compare for equality.
-         * @param {Color} right The second Color to compare for equality.
-         * @returns {Boolean} <code>true</code> if the Colors are equal; otherwise, <code>false</code>.
-         */
-        Color.equals = function(left, right) {
-            return (left === right) || //
-                   (when.defined(left) && //
-                    when.defined(right) && //
-                    left.red === right.red && //
-                    left.green === right.green && //
-                    left.blue === right.blue && //
-                    left.alpha === right.alpha);
-        };
-
-        /**
-         * @private
-         */
-        Color.equalsArray = function(color, array, offset) {
-            return color.red === array[offset] &&
-                   color.green === array[offset + 1] &&
-                   color.blue === array[offset + 2] &&
-                   color.alpha === array[offset + 3];
-        };
-
-        /**
-         * Returns a duplicate of a Color instance.
-         *
-         * @param {Color} [result] The object to store the result in, if undefined a new instance will be created.
-         * @returns {Color} The modified result parameter or a new instance if result was undefined.
-         */
-        Color.prototype.clone = function(result) {
-            return Color.clone(this, result);
-        };
-
-        /**
-         * Returns true if this Color equals other.
-         *
-         * @param {Color} other The Color to compare for equality.
-         * @returns {Boolean} <code>true</code> if the Colors are equal; otherwise, <code>false</code>.
-         */
-        Color.prototype.equals = function(other) {
-            return Color.equals(this, other);
-        };
-
-        /**
-         * Returns <code>true</code> if this Color equals other componentwise within the specified epsilon.
-         *
-         * @param {Color} other The Color to compare for equality.
-         * @param {Number} [epsilon=0.0] The epsilon to use for equality testing.
-         * @returns {Boolean} <code>true</code> if the Colors are equal within the specified epsilon; otherwise, <code>false</code>.
-         */
-        Color.prototype.equalsEpsilon = function(other, epsilon) {
-            return (this === other) || //
-                   ((when.defined(other)) && //
-                    (Math.abs(this.red - other.red) <= epsilon) && //
-                    (Math.abs(this.green - other.green) <= epsilon) && //
-                    (Math.abs(this.blue - other.blue) <= epsilon) && //
-                    (Math.abs(this.alpha - other.alpha) <= epsilon));
-        };
-
-        /**
-         * Creates a string representing this Color in the format '(red, green, blue, alpha)'.
-         *
-         * @returns {String} A string representing this Color in the format '(red, green, blue, alpha)'.
-         */
-        Color.prototype.toString = function() {
-            return '(' + this.red + ', ' + this.green + ', ' + this.blue + ', ' + this.alpha + ')';
-        };
-
-        /**
-         * Creates a string containing the CSS color value for this color.
-         *
-         * @returns {String} The CSS equivalent of this color.
-         *
-         * @see {@link http://www.w3.org/TR/css3-color/#rgba-color|CSS RGB or RGBA color values}
-         */
-        Color.prototype.toCssColorString = function() {
-            var red = Color.floatToByte(this.red);
-            var green = Color.floatToByte(this.green);
-            var blue = Color.floatToByte(this.blue);
-            if (this.alpha === 1) {
-                return 'rgb(' + red + ',' + green + ',' + blue + ')';
-            }
-            return 'rgba(' + red + ',' + green + ',' + blue + ',' + this.alpha + ')';
-        };
-
-        /**
-         * Converts this color to an array of red, green, blue, and alpha values
-         * that are in the range of 0 to 255.
-         *
-         * @param {Number[]} [result] The array to store the result in, if undefined a new instance will be created.
-         * @returns {Number[]} The modified result parameter or a new instance if result was undefined.
-         */
-        Color.prototype.toBytes = function(result) {
-            var red = Color.floatToByte(this.red);
-            var green = Color.floatToByte(this.green);
-            var blue = Color.floatToByte(this.blue);
-            var alpha = Color.floatToByte(this.alpha);
-
-            if (!when.defined(result)) {
-                return [red, green, blue, alpha];
-            }
-            result[0] = red;
-            result[1] = green;
-            result[2] = blue;
-            result[3] = alpha;
-            return result;
-        };
-
-        /**
-         * Converts this color to a single numeric unsigned 32-bit RGBA value, using the endianness
-         * of the system.
-         *
-         * @returns {Number} A single numeric unsigned 32-bit RGBA value.
-         *
-         *
-         * @example
-         * var rgba = Cesium.Color.BLUE.toRgba();
-         *
-         * @see Color.fromRgba
-         */
-        Color.prototype.toRgba = function() {
-            // scratchUint32Array and scratchUint8Array share an underlying array buffer
-            scratchUint8Array[0] = Color.floatToByte(this.red);
-            scratchUint8Array[1] = Color.floatToByte(this.green);
-            scratchUint8Array[2] = Color.floatToByte(this.blue);
-            scratchUint8Array[3] = Color.floatToByte(this.alpha);
-            return scratchUint32Array[0];
-        };
-
-        /**
-         * Brightens this color by the provided magnitude.
-         *
-         * @param {Number} magnitude A positive number indicating the amount to brighten.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         *
-         * @example
-         * var brightBlue = Cesium.Color.BLUE.brighten(0.5, new Cesium.Color());
-         */
-        Color.prototype.brighten = function(magnitude, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('magnitude', magnitude);
-            Check.Check.typeOf.number.greaterThanOrEquals('magnitude', magnitude, 0.0);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            magnitude = (1.0 - magnitude);
-            result.red = 1.0 - ((1.0 - this.red) * magnitude);
-            result.green = 1.0 - ((1.0 - this.green) * magnitude);
-            result.blue = 1.0 - ((1.0 - this.blue) * magnitude);
-            result.alpha = this.alpha;
-            return result;
-        };
-
-        /**
-         * Darkens this color by the provided magnitude.
-         *
-         * @param {Number} magnitude A positive number indicating the amount to darken.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         *
-         * @example
-         * var darkBlue = Cesium.Color.BLUE.darken(0.5, new Cesium.Color());
-         */
-        Color.prototype.darken = function(magnitude, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('magnitude', magnitude);
-            Check.Check.typeOf.number.greaterThanOrEquals('magnitude', magnitude, 0.0);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            magnitude = (1.0 - magnitude);
-            result.red = this.red * magnitude;
-            result.green = this.green * magnitude;
-            result.blue = this.blue * magnitude;
-            result.alpha = this.alpha;
-            return result;
-        };
-
-        /**
-         * Creates a new Color that has the same red, green, and blue components
-         * as this Color, but with the specified alpha value.
-         *
-         * @param {Number} alpha The new alpha component.
-         * @param {Color} [result] The object onto which to store the result.
-         * @returns {Color} The modified result parameter or a new Color instance if one was not provided.
-         *
-         * @example var translucentRed = Cesium.Color.RED.withAlpha(0.9);
-         */
-        Color.prototype.withAlpha = function(alpha, result) {
-            return Color.fromAlpha(this, alpha, result);
-        };
-
-        /**
-         * Computes the componentwise sum of two Colors.
-         *
-         * @param {Color} left The first Color.
-         * @param {Color} right The second Color.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         */
-        Color.add = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.red = left.red + right.red;
-            result.green = left.green + right.green;
-            result.blue = left.blue + right.blue;
-            result.alpha = left.alpha + right.alpha;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise difference of two Colors.
-         *
-         * @param {Color} left The first Color.
-         * @param {Color} right The second Color.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         */
-        Color.subtract = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.red = left.red - right.red;
-            result.green = left.green - right.green;
-            result.blue = left.blue - right.blue;
-            result.alpha = left.alpha - right.alpha;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise product of two Colors.
-         *
-         * @param {Color} left The first Color.
-         * @param {Color} right The second Color.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         */
-        Color.multiply = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.red = left.red * right.red;
-            result.green = left.green * right.green;
-            result.blue = left.blue * right.blue;
-            result.alpha = left.alpha * right.alpha;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise quotient of two Colors.
-         *
-         * @param {Color} left The first Color.
-         * @param {Color} right The second Color.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         */
-        Color.divide = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.red = left.red / right.red;
-            result.green = left.green / right.green;
-            result.blue = left.blue / right.blue;
-            result.alpha = left.alpha / right.alpha;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise modulus of two Colors.
-         *
-         * @param {Color} left The first Color.
-         * @param {Color} right The second Color.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         */
-        Color.mod = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.red = left.red % right.red;
-            result.green = left.green % right.green;
-            result.blue = left.blue % right.blue;
-            result.alpha = left.alpha % right.alpha;
-            return result;
-        };
-
-        /**
-         * Computes the linear interpolation or extrapolation at t between the provided colors.
-         *
-         * @param {Color} start The color corresponding to t at 0.0.
-         * @param {Color} end The color corresponding to t at 1.0.
-         * @param {Number} t The point along t at which to interpolate.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         */
-        Color.lerp = function(start, end, t, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('start', start);
-            Check.Check.typeOf.object('end', end);
-            Check.Check.typeOf.number('t', t);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.red = _Math.CesiumMath.lerp(start.red, end.red, t);
-            result.green = _Math.CesiumMath.lerp(start.green, end.green, t);
-            result.blue = _Math.CesiumMath.lerp(start.blue, end.blue, t);
-            result.alpha = _Math.CesiumMath.lerp(start.alpha, end.alpha, t);
-            return result;
-        };
-
-        /**
-         * Multiplies the provided Color componentwise by the provided scalar.
-         *
-         * @param {Color} color The Color to be scaled.
-         * @param {Number} scalar The scalar to multiply with.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         */
-        Color.multiplyByScalar = function(color, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('color', color);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.red = color.red * scalar;
-            result.green = color.green * scalar;
-            result.blue = color.blue * scalar;
-            result.alpha = color.alpha * scalar;
-            return result;
-        };
-
-        /**
-         * Divides the provided Color componentwise by the provided scalar.
-         *
-         * @param {Color} color The Color to be divided.
-         * @param {Number} scalar The scalar to divide with.
-         * @param {Color} result The object onto which to store the result.
-         * @returns {Color} The modified result parameter.
-         */
-        Color.divideByScalar = function(color, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('color', color);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.red = color.red / scalar;
-            result.green = color.green / scalar;
-            result.blue = color.blue / scalar;
-            result.alpha = color.alpha / scalar;
-            return result;
-        };
-
-        /**
-         * An immutable Color instance initialized to CSS color #F0F8FF
-         * <span class="colorSwath" style="background: #F0F8FF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.ALICEBLUE = Object.freeze(Color.fromCssColorString('#F0F8FF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FAEBD7
-         * <span class="colorSwath" style="background: #FAEBD7;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.ANTIQUEWHITE = Object.freeze(Color.fromCssColorString('#FAEBD7'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #00FFFF
-         * <span class="colorSwath" style="background: #00FFFF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.AQUA = Object.freeze(Color.fromCssColorString('#00FFFF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #7FFFD4
-         * <span class="colorSwath" style="background: #7FFFD4;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.AQUAMARINE = Object.freeze(Color.fromCssColorString('#7FFFD4'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #F0FFFF
-         * <span class="colorSwath" style="background: #F0FFFF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.AZURE = Object.freeze(Color.fromCssColorString('#F0FFFF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #F5F5DC
-         * <span class="colorSwath" style="background: #F5F5DC;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.BEIGE = Object.freeze(Color.fromCssColorString('#F5F5DC'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFE4C4
-         * <span class="colorSwath" style="background: #FFE4C4;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.BISQUE = Object.freeze(Color.fromCssColorString('#FFE4C4'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #000000
-         * <span class="colorSwath" style="background: #000000;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.BLACK = Object.freeze(Color.fromCssColorString('#000000'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFEBCD
-         * <span class="colorSwath" style="background: #FFEBCD;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.BLANCHEDALMOND = Object.freeze(Color.fromCssColorString('#FFEBCD'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #0000FF
-         * <span class="colorSwath" style="background: #0000FF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.BLUE = Object.freeze(Color.fromCssColorString('#0000FF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #8A2BE2
-         * <span class="colorSwath" style="background: #8A2BE2;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.BLUEVIOLET = Object.freeze(Color.fromCssColorString('#8A2BE2'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #A52A2A
-         * <span class="colorSwath" style="background: #A52A2A;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.BROWN = Object.freeze(Color.fromCssColorString('#A52A2A'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #DEB887
-         * <span class="colorSwath" style="background: #DEB887;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.BURLYWOOD = Object.freeze(Color.fromCssColorString('#DEB887'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #5F9EA0
-         * <span class="colorSwath" style="background: #5F9EA0;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.CADETBLUE = Object.freeze(Color.fromCssColorString('#5F9EA0'));
-        /**
-         * An immutable Color instance initialized to CSS color #7FFF00
-         * <span class="colorSwath" style="background: #7FFF00;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.CHARTREUSE = Object.freeze(Color.fromCssColorString('#7FFF00'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #D2691E
-         * <span class="colorSwath" style="background: #D2691E;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.CHOCOLATE = Object.freeze(Color.fromCssColorString('#D2691E'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FF7F50
-         * <span class="colorSwath" style="background: #FF7F50;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.CORAL = Object.freeze(Color.fromCssColorString('#FF7F50'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #6495ED
-         * <span class="colorSwath" style="background: #6495ED;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.CORNFLOWERBLUE = Object.freeze(Color.fromCssColorString('#6495ED'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFF8DC
-         * <span class="colorSwath" style="background: #FFF8DC;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.CORNSILK = Object.freeze(Color.fromCssColorString('#FFF8DC'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #DC143C
-         * <span class="colorSwath" style="background: #DC143C;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.CRIMSON = Object.freeze(Color.fromCssColorString('#DC143C'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #00FFFF
-         * <span class="colorSwath" style="background: #00FFFF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.CYAN = Object.freeze(Color.fromCssColorString('#00FFFF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #00008B
-         * <span class="colorSwath" style="background: #00008B;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKBLUE = Object.freeze(Color.fromCssColorString('#00008B'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #008B8B
-         * <span class="colorSwath" style="background: #008B8B;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKCYAN = Object.freeze(Color.fromCssColorString('#008B8B'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #B8860B
-         * <span class="colorSwath" style="background: #B8860B;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKGOLDENROD = Object.freeze(Color.fromCssColorString('#B8860B'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #A9A9A9
-         * <span class="colorSwath" style="background: #A9A9A9;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKGRAY = Object.freeze(Color.fromCssColorString('#A9A9A9'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #006400
-         * <span class="colorSwath" style="background: #006400;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKGREEN = Object.freeze(Color.fromCssColorString('#006400'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #A9A9A9
-         * <span class="colorSwath" style="background: #A9A9A9;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKGREY = Color.DARKGRAY;
-
-        /**
-         * An immutable Color instance initialized to CSS color #BDB76B
-         * <span class="colorSwath" style="background: #BDB76B;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKKHAKI = Object.freeze(Color.fromCssColorString('#BDB76B'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #8B008B
-         * <span class="colorSwath" style="background: #8B008B;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKMAGENTA = Object.freeze(Color.fromCssColorString('#8B008B'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #556B2F
-         * <span class="colorSwath" style="background: #556B2F;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKOLIVEGREEN = Object.freeze(Color.fromCssColorString('#556B2F'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FF8C00
-         * <span class="colorSwath" style="background: #FF8C00;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKORANGE = Object.freeze(Color.fromCssColorString('#FF8C00'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #9932CC
-         * <span class="colorSwath" style="background: #9932CC;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKORCHID = Object.freeze(Color.fromCssColorString('#9932CC'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #8B0000
-         * <span class="colorSwath" style="background: #8B0000;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKRED = Object.freeze(Color.fromCssColorString('#8B0000'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #E9967A
-         * <span class="colorSwath" style="background: #E9967A;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKSALMON = Object.freeze(Color.fromCssColorString('#E9967A'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #8FBC8F
-         * <span class="colorSwath" style="background: #8FBC8F;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKSEAGREEN = Object.freeze(Color.fromCssColorString('#8FBC8F'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #483D8B
-         * <span class="colorSwath" style="background: #483D8B;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKSLATEBLUE = Object.freeze(Color.fromCssColorString('#483D8B'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #2F4F4F
-         * <span class="colorSwath" style="background: #2F4F4F;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKSLATEGRAY = Object.freeze(Color.fromCssColorString('#2F4F4F'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #2F4F4F
-         * <span class="colorSwath" style="background: #2F4F4F;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKSLATEGREY = Color.DARKSLATEGRAY;
-
-        /**
-         * An immutable Color instance initialized to CSS color #00CED1
-         * <span class="colorSwath" style="background: #00CED1;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKTURQUOISE = Object.freeze(Color.fromCssColorString('#00CED1'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #9400D3
-         * <span class="colorSwath" style="background: #9400D3;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DARKVIOLET = Object.freeze(Color.fromCssColorString('#9400D3'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FF1493
-         * <span class="colorSwath" style="background: #FF1493;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DEEPPINK = Object.freeze(Color.fromCssColorString('#FF1493'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #00BFFF
-         * <span class="colorSwath" style="background: #00BFFF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DEEPSKYBLUE = Object.freeze(Color.fromCssColorString('#00BFFF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #696969
-         * <span class="colorSwath" style="background: #696969;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DIMGRAY = Object.freeze(Color.fromCssColorString('#696969'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #696969
-         * <span class="colorSwath" style="background: #696969;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DIMGREY = Color.DIMGRAY;
-
-        /**
-         * An immutable Color instance initialized to CSS color #1E90FF
-         * <span class="colorSwath" style="background: #1E90FF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.DODGERBLUE = Object.freeze(Color.fromCssColorString('#1E90FF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #B22222
-         * <span class="colorSwath" style="background: #B22222;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.FIREBRICK = Object.freeze(Color.fromCssColorString('#B22222'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFFAF0
-         * <span class="colorSwath" style="background: #FFFAF0;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.FLORALWHITE = Object.freeze(Color.fromCssColorString('#FFFAF0'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #228B22
-         * <span class="colorSwath" style="background: #228B22;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.FORESTGREEN = Object.freeze(Color.fromCssColorString('#228B22'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FF00FF
-         * <span class="colorSwath" style="background: #FF00FF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.FUCHSIA = Object.freeze(Color.fromCssColorString('#FF00FF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #DCDCDC
-         * <span class="colorSwath" style="background: #DCDCDC;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.GAINSBORO = Object.freeze(Color.fromCssColorString('#DCDCDC'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #F8F8FF
-         * <span class="colorSwath" style="background: #F8F8FF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.GHOSTWHITE = Object.freeze(Color.fromCssColorString('#F8F8FF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFD700
-         * <span class="colorSwath" style="background: #FFD700;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.GOLD = Object.freeze(Color.fromCssColorString('#FFD700'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #DAA520
-         * <span class="colorSwath" style="background: #DAA520;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.GOLDENROD = Object.freeze(Color.fromCssColorString('#DAA520'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #808080
-         * <span class="colorSwath" style="background: #808080;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.GRAY = Object.freeze(Color.fromCssColorString('#808080'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #008000
-         * <span class="colorSwath" style="background: #008000;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.GREEN = Object.freeze(Color.fromCssColorString('#008000'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #ADFF2F
-         * <span class="colorSwath" style="background: #ADFF2F;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.GREENYELLOW = Object.freeze(Color.fromCssColorString('#ADFF2F'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #808080
-         * <span class="colorSwath" style="background: #808080;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.GREY = Color.GRAY;
-
-        /**
-         * An immutable Color instance initialized to CSS color #F0FFF0
-         * <span class="colorSwath" style="background: #F0FFF0;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.HONEYDEW = Object.freeze(Color.fromCssColorString('#F0FFF0'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FF69B4
-         * <span class="colorSwath" style="background: #FF69B4;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.HOTPINK = Object.freeze(Color.fromCssColorString('#FF69B4'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #CD5C5C
-         * <span class="colorSwath" style="background: #CD5C5C;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.INDIANRED = Object.freeze(Color.fromCssColorString('#CD5C5C'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #4B0082
-         * <span class="colorSwath" style="background: #4B0082;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.INDIGO = Object.freeze(Color.fromCssColorString('#4B0082'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFFFF0
-         * <span class="colorSwath" style="background: #FFFFF0;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.IVORY = Object.freeze(Color.fromCssColorString('#FFFFF0'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #F0E68C
-         * <span class="colorSwath" style="background: #F0E68C;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.KHAKI = Object.freeze(Color.fromCssColorString('#F0E68C'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #E6E6FA
-         * <span class="colorSwath" style="background: #E6E6FA;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LAVENDER = Object.freeze(Color.fromCssColorString('#E6E6FA'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFF0F5
-         * <span class="colorSwath" style="background: #FFF0F5;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LAVENDAR_BLUSH = Object.freeze(Color.fromCssColorString('#FFF0F5'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #7CFC00
-         * <span class="colorSwath" style="background: #7CFC00;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LAWNGREEN = Object.freeze(Color.fromCssColorString('#7CFC00'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFFACD
-         * <span class="colorSwath" style="background: #FFFACD;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LEMONCHIFFON = Object.freeze(Color.fromCssColorString('#FFFACD'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #ADD8E6
-         * <span class="colorSwath" style="background: #ADD8E6;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTBLUE = Object.freeze(Color.fromCssColorString('#ADD8E6'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #F08080
-         * <span class="colorSwath" style="background: #F08080;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTCORAL = Object.freeze(Color.fromCssColorString('#F08080'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #E0FFFF
-         * <span class="colorSwath" style="background: #E0FFFF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTCYAN = Object.freeze(Color.fromCssColorString('#E0FFFF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FAFAD2
-         * <span class="colorSwath" style="background: #FAFAD2;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTGOLDENRODYELLOW = Object.freeze(Color.fromCssColorString('#FAFAD2'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #D3D3D3
-         * <span class="colorSwath" style="background: #D3D3D3;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTGRAY = Object.freeze(Color.fromCssColorString('#D3D3D3'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #90EE90
-         * <span class="colorSwath" style="background: #90EE90;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTGREEN = Object.freeze(Color.fromCssColorString('#90EE90'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #D3D3D3
-         * <span class="colorSwath" style="background: #D3D3D3;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTGREY = Color.LIGHTGRAY;
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFB6C1
-         * <span class="colorSwath" style="background: #FFB6C1;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTPINK = Object.freeze(Color.fromCssColorString('#FFB6C1'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #20B2AA
-         * <span class="colorSwath" style="background: #20B2AA;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTSEAGREEN = Object.freeze(Color.fromCssColorString('#20B2AA'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #87CEFA
-         * <span class="colorSwath" style="background: #87CEFA;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTSKYBLUE = Object.freeze(Color.fromCssColorString('#87CEFA'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #778899
-         * <span class="colorSwath" style="background: #778899;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTSLATEGRAY = Object.freeze(Color.fromCssColorString('#778899'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #778899
-         * <span class="colorSwath" style="background: #778899;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTSLATEGREY = Color.LIGHTSLATEGRAY;
-
-        /**
-         * An immutable Color instance initialized to CSS color #B0C4DE
-         * <span class="colorSwath" style="background: #B0C4DE;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTSTEELBLUE = Object.freeze(Color.fromCssColorString('#B0C4DE'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFFFE0
-         * <span class="colorSwath" style="background: #FFFFE0;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIGHTYELLOW = Object.freeze(Color.fromCssColorString('#FFFFE0'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #00FF00
-         * <span class="colorSwath" style="background: #00FF00;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIME = Object.freeze(Color.fromCssColorString('#00FF00'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #32CD32
-         * <span class="colorSwath" style="background: #32CD32;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LIMEGREEN = Object.freeze(Color.fromCssColorString('#32CD32'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FAF0E6
-         * <span class="colorSwath" style="background: #FAF0E6;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.LINEN = Object.freeze(Color.fromCssColorString('#FAF0E6'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FF00FF
-         * <span class="colorSwath" style="background: #FF00FF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MAGENTA = Object.freeze(Color.fromCssColorString('#FF00FF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #800000
-         * <span class="colorSwath" style="background: #800000;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MAROON = Object.freeze(Color.fromCssColorString('#800000'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #66CDAA
-         * <span class="colorSwath" style="background: #66CDAA;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MEDIUMAQUAMARINE = Object.freeze(Color.fromCssColorString('#66CDAA'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #0000CD
-         * <span class="colorSwath" style="background: #0000CD;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MEDIUMBLUE = Object.freeze(Color.fromCssColorString('#0000CD'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #BA55D3
-         * <span class="colorSwath" style="background: #BA55D3;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MEDIUMORCHID = Object.freeze(Color.fromCssColorString('#BA55D3'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #9370DB
-         * <span class="colorSwath" style="background: #9370DB;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MEDIUMPURPLE = Object.freeze(Color.fromCssColorString('#9370DB'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #3CB371
-         * <span class="colorSwath" style="background: #3CB371;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MEDIUMSEAGREEN = Object.freeze(Color.fromCssColorString('#3CB371'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #7B68EE
-         * <span class="colorSwath" style="background: #7B68EE;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MEDIUMSLATEBLUE = Object.freeze(Color.fromCssColorString('#7B68EE'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #00FA9A
-         * <span class="colorSwath" style="background: #00FA9A;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MEDIUMSPRINGGREEN = Object.freeze(Color.fromCssColorString('#00FA9A'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #48D1CC
-         * <span class="colorSwath" style="background: #48D1CC;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MEDIUMTURQUOISE = Object.freeze(Color.fromCssColorString('#48D1CC'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #C71585
-         * <span class="colorSwath" style="background: #C71585;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MEDIUMVIOLETRED = Object.freeze(Color.fromCssColorString('#C71585'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #191970
-         * <span class="colorSwath" style="background: #191970;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MIDNIGHTBLUE = Object.freeze(Color.fromCssColorString('#191970'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #F5FFFA
-         * <span class="colorSwath" style="background: #F5FFFA;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MINTCREAM = Object.freeze(Color.fromCssColorString('#F5FFFA'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFE4E1
-         * <span class="colorSwath" style="background: #FFE4E1;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MISTYROSE = Object.freeze(Color.fromCssColorString('#FFE4E1'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFE4B5
-         * <span class="colorSwath" style="background: #FFE4B5;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.MOCCASIN = Object.freeze(Color.fromCssColorString('#FFE4B5'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFDEAD
-         * <span class="colorSwath" style="background: #FFDEAD;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.NAVAJOWHITE = Object.freeze(Color.fromCssColorString('#FFDEAD'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #000080
-         * <span class="colorSwath" style="background: #000080;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.NAVY = Object.freeze(Color.fromCssColorString('#000080'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FDF5E6
-         * <span class="colorSwath" style="background: #FDF5E6;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.OLDLACE = Object.freeze(Color.fromCssColorString('#FDF5E6'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #808000
-         * <span class="colorSwath" style="background: #808000;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.OLIVE = Object.freeze(Color.fromCssColorString('#808000'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #6B8E23
-         * <span class="colorSwath" style="background: #6B8E23;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.OLIVEDRAB = Object.freeze(Color.fromCssColorString('#6B8E23'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFA500
-         * <span class="colorSwath" style="background: #FFA500;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.ORANGE = Object.freeze(Color.fromCssColorString('#FFA500'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FF4500
-         * <span class="colorSwath" style="background: #FF4500;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.ORANGERED = Object.freeze(Color.fromCssColorString('#FF4500'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #DA70D6
-         * <span class="colorSwath" style="background: #DA70D6;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.ORCHID = Object.freeze(Color.fromCssColorString('#DA70D6'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #EEE8AA
-         * <span class="colorSwath" style="background: #EEE8AA;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PALEGOLDENROD = Object.freeze(Color.fromCssColorString('#EEE8AA'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #98FB98
-         * <span class="colorSwath" style="background: #98FB98;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PALEGREEN = Object.freeze(Color.fromCssColorString('#98FB98'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #AFEEEE
-         * <span class="colorSwath" style="background: #AFEEEE;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PALETURQUOISE = Object.freeze(Color.fromCssColorString('#AFEEEE'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #DB7093
-         * <span class="colorSwath" style="background: #DB7093;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PALEVIOLETRED = Object.freeze(Color.fromCssColorString('#DB7093'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFEFD5
-         * <span class="colorSwath" style="background: #FFEFD5;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PAPAYAWHIP = Object.freeze(Color.fromCssColorString('#FFEFD5'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFDAB9
-         * <span class="colorSwath" style="background: #FFDAB9;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PEACHPUFF = Object.freeze(Color.fromCssColorString('#FFDAB9'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #CD853F
-         * <span class="colorSwath" style="background: #CD853F;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PERU = Object.freeze(Color.fromCssColorString('#CD853F'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFC0CB
-         * <span class="colorSwath" style="background: #FFC0CB;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PINK = Object.freeze(Color.fromCssColorString('#FFC0CB'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #DDA0DD
-         * <span class="colorSwath" style="background: #DDA0DD;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PLUM = Object.freeze(Color.fromCssColorString('#DDA0DD'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #B0E0E6
-         * <span class="colorSwath" style="background: #B0E0E6;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.POWDERBLUE = Object.freeze(Color.fromCssColorString('#B0E0E6'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #800080
-         * <span class="colorSwath" style="background: #800080;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.PURPLE = Object.freeze(Color.fromCssColorString('#800080'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FF0000
-         * <span class="colorSwath" style="background: #FF0000;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.RED = Object.freeze(Color.fromCssColorString('#FF0000'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #BC8F8F
-         * <span class="colorSwath" style="background: #BC8F8F;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.ROSYBROWN = Object.freeze(Color.fromCssColorString('#BC8F8F'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #4169E1
-         * <span class="colorSwath" style="background: #4169E1;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.ROYALBLUE = Object.freeze(Color.fromCssColorString('#4169E1'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #8B4513
-         * <span class="colorSwath" style="background: #8B4513;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SADDLEBROWN = Object.freeze(Color.fromCssColorString('#8B4513'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FA8072
-         * <span class="colorSwath" style="background: #FA8072;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SALMON = Object.freeze(Color.fromCssColorString('#FA8072'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #F4A460
-         * <span class="colorSwath" style="background: #F4A460;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SANDYBROWN = Object.freeze(Color.fromCssColorString('#F4A460'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #2E8B57
-         * <span class="colorSwath" style="background: #2E8B57;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SEAGREEN = Object.freeze(Color.fromCssColorString('#2E8B57'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFF5EE
-         * <span class="colorSwath" style="background: #FFF5EE;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SEASHELL = Object.freeze(Color.fromCssColorString('#FFF5EE'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #A0522D
-         * <span class="colorSwath" style="background: #A0522D;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SIENNA = Object.freeze(Color.fromCssColorString('#A0522D'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #C0C0C0
-         * <span class="colorSwath" style="background: #C0C0C0;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SILVER = Object.freeze(Color.fromCssColorString('#C0C0C0'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #87CEEB
-         * <span class="colorSwath" style="background: #87CEEB;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SKYBLUE = Object.freeze(Color.fromCssColorString('#87CEEB'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #6A5ACD
-         * <span class="colorSwath" style="background: #6A5ACD;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SLATEBLUE = Object.freeze(Color.fromCssColorString('#6A5ACD'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #708090
-         * <span class="colorSwath" style="background: #708090;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SLATEGRAY = Object.freeze(Color.fromCssColorString('#708090'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #708090
-         * <span class="colorSwath" style="background: #708090;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SLATEGREY = Color.SLATEGRAY;
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFFAFA
-         * <span class="colorSwath" style="background: #FFFAFA;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SNOW = Object.freeze(Color.fromCssColorString('#FFFAFA'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #00FF7F
-         * <span class="colorSwath" style="background: #00FF7F;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.SPRINGGREEN = Object.freeze(Color.fromCssColorString('#00FF7F'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #4682B4
-         * <span class="colorSwath" style="background: #4682B4;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.STEELBLUE = Object.freeze(Color.fromCssColorString('#4682B4'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #D2B48C
-         * <span class="colorSwath" style="background: #D2B48C;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.TAN = Object.freeze(Color.fromCssColorString('#D2B48C'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #008080
-         * <span class="colorSwath" style="background: #008080;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.TEAL = Object.freeze(Color.fromCssColorString('#008080'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #D8BFD8
-         * <span class="colorSwath" style="background: #D8BFD8;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.THISTLE = Object.freeze(Color.fromCssColorString('#D8BFD8'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FF6347
-         * <span class="colorSwath" style="background: #FF6347;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.TOMATO = Object.freeze(Color.fromCssColorString('#FF6347'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #40E0D0
-         * <span class="colorSwath" style="background: #40E0D0;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.TURQUOISE = Object.freeze(Color.fromCssColorString('#40E0D0'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #EE82EE
-         * <span class="colorSwath" style="background: #EE82EE;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.VIOLET = Object.freeze(Color.fromCssColorString('#EE82EE'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #F5DEB3
-         * <span class="colorSwath" style="background: #F5DEB3;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.WHEAT = Object.freeze(Color.fromCssColorString('#F5DEB3'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFFFFF
-         * <span class="colorSwath" style="background: #FFFFFF;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.WHITE = Object.freeze(Color.fromCssColorString('#FFFFFF'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #F5F5F5
-         * <span class="colorSwath" style="background: #F5F5F5;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.WHITESMOKE = Object.freeze(Color.fromCssColorString('#F5F5F5'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #FFFF00
-         * <span class="colorSwath" style="background: #FFFF00;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.YELLOW = Object.freeze(Color.fromCssColorString('#FFFF00'));
-
-        /**
-         * An immutable Color instance initialized to CSS color #9ACD32
-         * <span class="colorSwath" style="background: #9ACD32;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.YELLOWGREEN = Object.freeze(Color.fromCssColorString('#9ACD32'));
-
-        /**
-         * An immutable Color instance initialized to CSS transparent.
-         * <span class="colorSwath" style="background: transparent;"></span>
-         *
-         * @constant
-         * @type {Color}
-         */
-        Color.TRANSPARENT = Object.freeze(new Color(0, 0, 0, 0));
-
-    exports.Color = Color;
-
-});
diff --git a/public/libs/Cesium/Workers/ComponentDatatype-5862616f.js b/public/libs/Cesium/Workers/ComponentDatatype-5862616f.js
deleted file mode 100644
index 6de388e..0000000
--- a/public/libs/Cesium/Workers/ComponentDatatype-5862616f.js
+++ /dev/null
@@ -1,343 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './WebGLConstants-4c11ee5f'], function (exports, when, Check, WebGLConstants) { 'use strict';
-
-    /**
-         * WebGL component datatypes.  Components are intrinsics,
-         * which form attributes, which form vertices.
-         *
-         * @exports ComponentDatatype
-         */
-        var ComponentDatatype = {
-            /**
-             * 8-bit signed byte corresponding to <code>gl.BYTE</code> and the type
-             * of an element in <code>Int8Array</code>.
-             *
-             * @type {Number}
-             * @constant
-             */
-            BYTE : WebGLConstants.WebGLConstants.BYTE,
-
-            /**
-             * 8-bit unsigned byte corresponding to <code>UNSIGNED_BYTE</code> and the type
-             * of an element in <code>Uint8Array</code>.
-             *
-             * @type {Number}
-             * @constant
-             */
-            UNSIGNED_BYTE : WebGLConstants.WebGLConstants.UNSIGNED_BYTE,
-
-            /**
-             * 16-bit signed short corresponding to <code>SHORT</code> and the type
-             * of an element in <code>Int16Array</code>.
-             *
-             * @type {Number}
-             * @constant
-             */
-            SHORT : WebGLConstants.WebGLConstants.SHORT,
-
-            /**
-             * 16-bit unsigned short corresponding to <code>UNSIGNED_SHORT</code> and the type
-             * of an element in <code>Uint16Array</code>.
-             *
-             * @type {Number}
-             * @constant
-             */
-            UNSIGNED_SHORT : WebGLConstants.WebGLConstants.UNSIGNED_SHORT,
-
-            /**
-             * 32-bit signed int corresponding to <code>INT</code> and the type
-             * of an element in <code>Int32Array</code>.
-             *
-             * @memberOf ComponentDatatype
-             *
-             * @type {Number}
-             * @constant
-             */
-            INT : WebGLConstants.WebGLConstants.INT,
-
-            /**
-             * 32-bit unsigned int corresponding to <code>UNSIGNED_INT</code> and the type
-             * of an element in <code>Uint32Array</code>.
-             *
-             * @memberOf ComponentDatatype
-             *
-             * @type {Number}
-             * @constant
-             */
-            UNSIGNED_INT : WebGLConstants.WebGLConstants.UNSIGNED_INT,
-
-            /**
-             * 32-bit floating-point corresponding to <code>FLOAT</code> and the type
-             * of an element in <code>Float32Array</code>.
-             *
-             * @type {Number}
-             * @constant
-             */
-            FLOAT : WebGLConstants.WebGLConstants.FLOAT,
-
-            /**
-             * 64-bit floating-point corresponding to <code>gl.DOUBLE</code> (in Desktop OpenGL;
-             * this is not supported in WebGL, and is emulated in Cesium via {@link GeometryPipeline.encodeAttribute})
-             * and the type of an element in <code>Float64Array</code>.
-             *
-             * @memberOf ComponentDatatype
-             *
-             * @type {Number}
-             * @constant
-             * @default 0x140A
-             */
-            DOUBLE : WebGLConstants.WebGLConstants.DOUBLE
-        };
-
-        /**
-         * Returns the size, in bytes, of the corresponding datatype.
-         *
-         * @param {ComponentDatatype} componentDatatype The component datatype to get the size of.
-         * @returns {Number} The size in bytes.
-         *
-         * @exception {DeveloperError} componentDatatype is not a valid value.
-         *
-         * @example
-         * // Returns Int8Array.BYTES_PER_ELEMENT
-         * var size = Cesium.ComponentDatatype.getSizeInBytes(Cesium.ComponentDatatype.BYTE);
-         */
-        ComponentDatatype.getSizeInBytes = function(componentDatatype){
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(componentDatatype)) {
-                throw new Check.DeveloperError('value is required.');
-            }
-            //>>includeEnd('debug');
-
-            switch (componentDatatype) {
-            case ComponentDatatype.BYTE:
-                return Int8Array.BYTES_PER_ELEMENT;
-            case ComponentDatatype.UNSIGNED_BYTE:
-                return Uint8Array.BYTES_PER_ELEMENT;
-            case ComponentDatatype.SHORT:
-                return Int16Array.BYTES_PER_ELEMENT;
-            case ComponentDatatype.UNSIGNED_SHORT:
-                return Uint16Array.BYTES_PER_ELEMENT;
-            case ComponentDatatype.INT:
-                return Int32Array.BYTES_PER_ELEMENT;
-            case ComponentDatatype.UNSIGNED_INT:
-                return Uint32Array.BYTES_PER_ELEMENT;
-            case ComponentDatatype.FLOAT:
-                return Float32Array.BYTES_PER_ELEMENT;
-            case ComponentDatatype.DOUBLE:
-                return Float64Array.BYTES_PER_ELEMENT;
-            //>>includeStart('debug', pragmas.debug);
-            default:
-                throw new Check.DeveloperError('componentDatatype is not a valid value.');
-            //>>includeEnd('debug');
-            }
-        };
-
-        /**
-         * Gets the {@link ComponentDatatype} for the provided TypedArray instance.
-         *
-         * @param {TypedArray} array The typed array.
-         * @returns {ComponentDatatype} The ComponentDatatype for the provided array, or undefined if the array is not a TypedArray.
-         */
-        ComponentDatatype.fromTypedArray = function(array) {
-            if (array instanceof Int8Array) {
-                return ComponentDatatype.BYTE;
-            }
-            if (array instanceof Uint8Array) {
-                return ComponentDatatype.UNSIGNED_BYTE;
-            }
-            if (array instanceof Int16Array) {
-                return ComponentDatatype.SHORT;
-            }
-            if (array instanceof Uint16Array) {
-                return ComponentDatatype.UNSIGNED_SHORT;
-            }
-            if (array instanceof Int32Array) {
-                return ComponentDatatype.INT;
-            }
-            if (array instanceof Uint32Array) {
-                return ComponentDatatype.UNSIGNED_INT;
-            }
-            if (array instanceof Float32Array) {
-                return ComponentDatatype.FLOAT;
-            }
-            if (array instanceof Float64Array) {
-                return ComponentDatatype.DOUBLE;
-            }
-        };
-
-        /**
-         * Validates that the provided component datatype is a valid {@link ComponentDatatype}
-         *
-         * @param {ComponentDatatype} componentDatatype The component datatype to validate.
-         * @returns {Boolean} <code>true</code> if the provided component datatype is a valid value; otherwise, <code>false</code>.
-         *
-         * @example
-         * if (!Cesium.ComponentDatatype.validate(componentDatatype)) {
-         *   throw new Cesium.DeveloperError('componentDatatype must be a valid value.');
-         * }
-         */
-        ComponentDatatype.validate = function(componentDatatype) {
-            return when.defined(componentDatatype) &&
-                   (componentDatatype === ComponentDatatype.BYTE ||
-                    componentDatatype === ComponentDatatype.UNSIGNED_BYTE ||
-                    componentDatatype === ComponentDatatype.SHORT ||
-                    componentDatatype === ComponentDatatype.UNSIGNED_SHORT ||
-                    componentDatatype === ComponentDatatype.INT ||
-                    componentDatatype === ComponentDatatype.UNSIGNED_INT ||
-                    componentDatatype === ComponentDatatype.FLOAT ||
-                    componentDatatype === ComponentDatatype.DOUBLE);
-        };
-
-        /**
-         * Creates a typed array corresponding to component data type.
-         *
-         * @param {ComponentDatatype} componentDatatype The component data type.
-         * @param {Number|Array} valuesOrLength The length of the array to create or an array.
-         * @returns {Int8Array|Uint8Array|Int16Array|Uint16Array|Int32Array|Uint32Array|Float32Array|Float64Array} A typed array.
-         *
-         * @exception {DeveloperError} componentDatatype is not a valid value.
-         *
-         * @example
-         * // creates a Float32Array with length of 100
-         * var typedArray = Cesium.ComponentDatatype.createTypedArray(Cesium.ComponentDatatype.FLOAT, 100);
-         */
-        ComponentDatatype.createTypedArray = function(componentDatatype, valuesOrLength) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(componentDatatype)) {
-                throw new Check.DeveloperError('componentDatatype is required.');
-            }
-            if (!when.defined(valuesOrLength)) {
-                throw new Check.DeveloperError('valuesOrLength is required.');
-            }
-            //>>includeEnd('debug');
-
-            switch (componentDatatype) {
-            case ComponentDatatype.BYTE:
-                return new Int8Array(valuesOrLength);
-            case ComponentDatatype.UNSIGNED_BYTE:
-                return new Uint8Array(valuesOrLength);
-            case ComponentDatatype.SHORT:
-                return new Int16Array(valuesOrLength);
-            case ComponentDatatype.UNSIGNED_SHORT:
-                return new Uint16Array(valuesOrLength);
-            case ComponentDatatype.INT:
-                return new Int32Array(valuesOrLength);
-            case ComponentDatatype.UNSIGNED_INT:
-                return new Uint32Array(valuesOrLength);
-            case ComponentDatatype.FLOAT:
-                return new Float32Array(valuesOrLength);
-            case ComponentDatatype.DOUBLE:
-                return new Float64Array(valuesOrLength);
-            //>>includeStart('debug', pragmas.debug);
-            default:
-                throw new Check.DeveloperError('componentDatatype is not a valid value.');
-            //>>includeEnd('debug');
-            }
-        };
-
-        /**
-         * Creates a typed view of an array of bytes.
-         *
-         * @param {ComponentDatatype} componentDatatype The type of the view to create.
-         * @param {ArrayBuffer} buffer The buffer storage to use for the view.
-         * @param {Number} [byteOffset] The offset, in bytes, to the first element in the view.
-         * @param {Number} [length] The number of elements in the view.
-         * @returns {Int8Array|Uint8Array|Int16Array|Uint16Array|Int32Array|Uint32Array|Float32Array|Float64Array} A typed array view of the buffer.
-         *
-         * @exception {DeveloperError} componentDatatype is not a valid value.
-         */
-        ComponentDatatype.createArrayBufferView = function(componentDatatype, buffer, byteOffset, length) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(componentDatatype)) {
-                throw new Check.DeveloperError('componentDatatype is required.');
-            }
-            if (!when.defined(buffer)) {
-                throw new Check.DeveloperError('buffer is required.');
-            }
-            //>>includeEnd('debug');
-
-            byteOffset = when.defaultValue(byteOffset, 0);
-            length = when.defaultValue(length, (buffer.byteLength - byteOffset) / ComponentDatatype.getSizeInBytes(componentDatatype));
-
-            switch (componentDatatype) {
-            case ComponentDatatype.BYTE:
-                return new Int8Array(buffer, byteOffset, length);
-            case ComponentDatatype.UNSIGNED_BYTE:
-                return new Uint8Array(buffer, byteOffset, length);
-            case ComponentDatatype.SHORT:
-                return new Int16Array(buffer, byteOffset, length);
-            case ComponentDatatype.UNSIGNED_SHORT:
-                return new Uint16Array(buffer, byteOffset, length);
-            case ComponentDatatype.INT:
-                return new Int32Array(buffer, byteOffset, length);
-            case ComponentDatatype.UNSIGNED_INT:
-                return new Uint32Array(buffer, byteOffset, length);
-            case ComponentDatatype.FLOAT:
-                return new Float32Array(buffer, byteOffset, length);
-            case ComponentDatatype.DOUBLE:
-                return new Float64Array(buffer, byteOffset, length);
-            //>>includeStart('debug', pragmas.debug);
-            default:
-                throw new Check.DeveloperError('componentDatatype is not a valid value.');
-            //>>includeEnd('debug');
-            }
-        };
-
-        /**
-         * Get the ComponentDatatype from its name.
-         *
-         * @param {String} name The name of the ComponentDatatype.
-         * @returns {ComponentDatatype} The ComponentDatatype.
-         *
-         * @exception {DeveloperError} name is not a valid value.
-         */
-        ComponentDatatype.fromName = function(name) {
-            switch (name) {
-                case 'BYTE':
-                    return ComponentDatatype.BYTE;
-                case 'UNSIGNED_BYTE':
-                    return ComponentDatatype.UNSIGNED_BYTE;
-                case 'SHORT':
-                    return ComponentDatatype.SHORT;
-                case 'UNSIGNED_SHORT':
-                    return ComponentDatatype.UNSIGNED_SHORT;
-                case 'INT':
-                    return ComponentDatatype.INT;
-                case 'UNSIGNED_INT':
-                    return ComponentDatatype.UNSIGNED_INT;
-                case 'FLOAT':
-                    return ComponentDatatype.FLOAT;
-                case 'DOUBLE':
-                    return ComponentDatatype.DOUBLE;
-                //>>includeStart('debug', pragmas.debug);
-                default:
-                    throw new Check.DeveloperError('name is not a valid value.');
-                //>>includeEnd('debug');
-            }
-        };
-    var ComponentDatatype$1 = Object.freeze(ComponentDatatype);
-
-    exports.ComponentDatatype = ComponentDatatype$1;
-
-});
diff --git a/public/libs/Cesium/Workers/CoplanarPolygonGeometryLibrary-81d1880f.js b/public/libs/Cesium/Workers/CoplanarPolygonGeometryLibrary-81d1880f.js
deleted file mode 100644
index 9824ff0..0000000
--- a/public/libs/Cesium/Workers/CoplanarPolygonGeometryLibrary-81d1880f.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './Check-70bec281', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './OrientedBoundingBox-0ede1598'], function (exports, Check, Cartographic, Cartesian2, BoundingSphere, OrientedBoundingBox) { 'use strict';
-
-    /**
-         * @private
-         */
-        var CoplanarPolygonGeometryLibrary = {};
-
-        var scratchIntersectionPoint = new Cartographic.Cartesian3();
-        var scratchXAxis = new Cartographic.Cartesian3();
-        var scratchYAxis = new Cartographic.Cartesian3();
-        var scratchZAxis = new Cartographic.Cartesian3();
-        var obbScratch = new OrientedBoundingBox.OrientedBoundingBox();
-
-        CoplanarPolygonGeometryLibrary.validOutline = function(positions) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('positions', positions);
-            //>>includeEnd('debug');
-
-            var orientedBoundingBox = OrientedBoundingBox.OrientedBoundingBox.fromPoints(positions, obbScratch);
-            var halfAxes = orientedBoundingBox.halfAxes;
-            var xAxis = BoundingSphere.Matrix3.getColumn(halfAxes, 0, scratchXAxis);
-            var yAxis = BoundingSphere.Matrix3.getColumn(halfAxes, 1, scratchYAxis);
-            var zAxis = BoundingSphere.Matrix3.getColumn(halfAxes, 2, scratchZAxis);
-
-            var xMag = Cartographic.Cartesian3.magnitude(xAxis);
-            var yMag = Cartographic.Cartesian3.magnitude(yAxis);
-            var zMag = Cartographic.Cartesian3.magnitude(zAxis);
-
-            // If all the points are on a line return undefined because we can't draw a polygon
-            return !((xMag === 0 && (yMag === 0 || zMag === 0)) || (yMag === 0 && zMag === 0));
-        };
-
-        // call after removeDuplicates
-        CoplanarPolygonGeometryLibrary.computeProjectTo2DArguments = function(positions, centerResult, planeAxis1Result, planeAxis2Result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('positions', positions);
-            Check.Check.defined('centerResult', centerResult);
-            Check.Check.defined('planeAxis1Result', planeAxis1Result);
-            Check.Check.defined('planeAxis2Result', planeAxis2Result);
-            //>>includeEnd('debug');
-
-            var orientedBoundingBox = OrientedBoundingBox.OrientedBoundingBox.fromPoints(positions, obbScratch);
-            var halfAxes = orientedBoundingBox.halfAxes;
-            var xAxis = BoundingSphere.Matrix3.getColumn(halfAxes, 0, scratchXAxis);
-            var yAxis = BoundingSphere.Matrix3.getColumn(halfAxes, 1, scratchYAxis);
-            var zAxis = BoundingSphere.Matrix3.getColumn(halfAxes, 2, scratchZAxis);
-
-            var xMag = Cartographic.Cartesian3.magnitude(xAxis);
-            var yMag = Cartographic.Cartesian3.magnitude(yAxis);
-            var zMag = Cartographic.Cartesian3.magnitude(zAxis);
-            var min = Math.min(xMag, yMag, zMag);
-
-            // If all the points are on a line return undefined because we can't draw a polygon
-            if ((xMag === 0 && (yMag === 0 || zMag === 0)) || (yMag === 0 && zMag === 0)) {
-                return false;
-            }
-
-            var planeAxis1;
-            var planeAxis2;
-
-            if (min === yMag || min === zMag) {
-                planeAxis1 = xAxis;
-            }
-            if (min === xMag) {
-                planeAxis1 = yAxis;
-            } else if (min === zMag) {
-                planeAxis2 = yAxis;
-            }
-            if (min === xMag || min === yMag) {
-                planeAxis2 = zAxis;
-            }
-
-            Cartographic.Cartesian3.normalize(planeAxis1, planeAxis1Result);
-            Cartographic.Cartesian3.normalize(planeAxis2, planeAxis2Result);
-            Cartographic.Cartesian3.clone(orientedBoundingBox.center, centerResult);
-            return true;
-        };
-
-        function projectTo2D(position, center, axis1, axis2, result) {
-            var v = Cartographic.Cartesian3.subtract(position, center, scratchIntersectionPoint);
-            var x = Cartographic.Cartesian3.dot(axis1, v);
-            var y = Cartographic.Cartesian3.dot(axis2, v);
-
-            return Cartesian2.Cartesian2.fromElements(x, y, result);
-        }
-
-        CoplanarPolygonGeometryLibrary.createProjectPointsTo2DFunction = function(center, axis1, axis2) {
-            return function(positions) {
-                var positionResults = new Array(positions.length);
-                for (var i = 0; i < positions.length; i++) {
-                    positionResults[i] = projectTo2D(positions[i], center, axis1, axis2);
-                }
-
-                return positionResults;
-            };
-        };
-
-        CoplanarPolygonGeometryLibrary.createProjectPointTo2DFunction = function(center, axis1, axis2) {
-            return function(position, result) {
-                return projectTo2D(position, center, axis1, axis2, result);
-            };
-        };
-
-    exports.CoplanarPolygonGeometryLibrary = CoplanarPolygonGeometryLibrary;
-
-});
diff --git a/public/libs/Cesium/Workers/CorridorGeometryLibrary-d15f4d38.js b/public/libs/Cesium/Workers/CorridorGeometryLibrary-d15f4d38.js
deleted file mode 100644
index 43a5b96..0000000
--- a/public/libs/Cesium/Workers/CorridorGeometryLibrary-d15f4d38.js
+++ /dev/null
@@ -1,318 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Math-61ede240', './Cartographic-fe4be337', './BoundingSphere-775c5788', './Transforms-a1cf7267', './PolylineVolumeGeometryLibrary-5bb7662e', './PolylinePipeline-a9f32196'], function (exports, when, _Math, Cartographic, BoundingSphere, Transforms, PolylineVolumeGeometryLibrary, PolylinePipeline) { 'use strict';
-
-    /**
-         * @private
-         */
-        var CorridorGeometryLibrary = {};
-
-        var scratch1 = new Cartographic.Cartesian3();
-        var scratch2 = new Cartographic.Cartesian3();
-        var scratch3 = new Cartographic.Cartesian3();
-        var scratch4 = new Cartographic.Cartesian3();
-
-        var scaleArray2 = [new Cartographic.Cartesian3(), new Cartographic.Cartesian3()];
-
-        var cartesian1 = new Cartographic.Cartesian3();
-        var cartesian2 = new Cartographic.Cartesian3();
-        var cartesian3 = new Cartographic.Cartesian3();
-        var cartesian4 = new Cartographic.Cartesian3();
-        var cartesian5 = new Cartographic.Cartesian3();
-        var cartesian6 = new Cartographic.Cartesian3();
-        var cartesian7 = new Cartographic.Cartesian3();
-        var cartesian8 = new Cartographic.Cartesian3();
-        var cartesian9 = new Cartographic.Cartesian3();
-        var cartesian10 = new Cartographic.Cartesian3();
-
-        var quaterion = new Transforms.Quaternion();
-        var rotMatrix = new BoundingSphere.Matrix3();
-        function computeRoundCorner(cornerPoint, startPoint, endPoint, cornerType, leftIsOutside) {
-            var angle = Cartographic.Cartesian3.angleBetween(Cartographic.Cartesian3.subtract(startPoint, cornerPoint, scratch1), Cartographic.Cartesian3.subtract(endPoint, cornerPoint, scratch2));
-            var granularity = (cornerType === PolylineVolumeGeometryLibrary.CornerType.BEVELED) ? 1 : Math.ceil(angle / _Math.CesiumMath.toRadians(5)) + 1;
-
-            var size = granularity * 3;
-            var array = new Array(size);
-
-            array[size - 3] = endPoint.x;
-            array[size - 2] = endPoint.y;
-            array[size - 1] = endPoint.z;
-
-            var m;
-            if (leftIsOutside) {
-                m = BoundingSphere.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(Cartographic.Cartesian3.negate(cornerPoint, scratch1), angle / granularity, quaterion), rotMatrix);
-            } else {
-                m = BoundingSphere.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(cornerPoint, angle / granularity, quaterion), rotMatrix);
-            }
-
-            var index = 0;
-            startPoint = Cartographic.Cartesian3.clone(startPoint, scratch1);
-            for (var i = 0; i < granularity; i++) {
-                startPoint = BoundingSphere.Matrix3.multiplyByVector(m, startPoint, startPoint);
-                array[index++] = startPoint.x;
-                array[index++] = startPoint.y;
-                array[index++] = startPoint.z;
-            }
-
-            return array;
-        }
-
-        function addEndCaps(calculatedPositions) {
-            var cornerPoint = cartesian1;
-            var startPoint = cartesian2;
-            var endPoint = cartesian3;
-
-            var leftEdge = calculatedPositions[1];
-            startPoint = Cartographic.Cartesian3.fromArray(calculatedPositions[1], leftEdge.length - 3, startPoint);
-            endPoint = Cartographic.Cartesian3.fromArray(calculatedPositions[0], 0, endPoint);
-            cornerPoint = Cartographic.Cartesian3.midpoint(startPoint, endPoint, cornerPoint);
-            var firstEndCap = computeRoundCorner(cornerPoint, startPoint, endPoint, PolylineVolumeGeometryLibrary.CornerType.ROUNDED, false);
-
-            var length = calculatedPositions.length - 1;
-            var rightEdge = calculatedPositions[length - 1];
-            leftEdge = calculatedPositions[length];
-            startPoint = Cartographic.Cartesian3.fromArray(rightEdge, rightEdge.length - 3, startPoint);
-            endPoint = Cartographic.Cartesian3.fromArray(leftEdge, 0, endPoint);
-            cornerPoint = Cartographic.Cartesian3.midpoint(startPoint, endPoint, cornerPoint);
-            var lastEndCap = computeRoundCorner(cornerPoint, startPoint, endPoint, PolylineVolumeGeometryLibrary.CornerType.ROUNDED, false);
-
-            return [firstEndCap, lastEndCap];
-        }
-
-        function computeMiteredCorner(position, leftCornerDirection, lastPoint, leftIsOutside) {
-            var cornerPoint = scratch1;
-            if (leftIsOutside) {
-                cornerPoint = Cartographic.Cartesian3.add(position, leftCornerDirection, cornerPoint);
-            } else {
-                leftCornerDirection = Cartographic.Cartesian3.negate(leftCornerDirection, leftCornerDirection);
-                cornerPoint = Cartographic.Cartesian3.add(position, leftCornerDirection, cornerPoint);
-            }
-            return [cornerPoint.x, cornerPoint.y, cornerPoint.z, lastPoint.x, lastPoint.y, lastPoint.z];
-        }
-
-        function addShiftedPositions(positions, left, scalar, calculatedPositions) {
-            var rightPositions = new Array(positions.length);
-            var leftPositions = new Array(positions.length);
-            var scaledLeft = Cartographic.Cartesian3.multiplyByScalar(left, scalar, scratch1);
-            var scaledRight = Cartographic.Cartesian3.negate(scaledLeft, scratch2);
-            var rightIndex = 0;
-            var leftIndex = positions.length - 1;
-
-            for (var i = 0; i < positions.length; i += 3) {
-                var pos = Cartographic.Cartesian3.fromArray(positions, i, scratch3);
-                var rightPos = Cartographic.Cartesian3.add(pos, scaledRight, scratch4);
-                rightPositions[rightIndex++] = rightPos.x;
-                rightPositions[rightIndex++] = rightPos.y;
-                rightPositions[rightIndex++] = rightPos.z;
-
-                var leftPos = Cartographic.Cartesian3.add(pos, scaledLeft, scratch4);
-                leftPositions[leftIndex--] = leftPos.z;
-                leftPositions[leftIndex--] = leftPos.y;
-                leftPositions[leftIndex--] = leftPos.x;
-            }
-            calculatedPositions.push(rightPositions, leftPositions);
-
-            return calculatedPositions;
-        }
-
-        /**
-         * @private
-         */
-        CorridorGeometryLibrary.addAttribute = function(attribute, value, front, back) {
-            var x = value.x;
-            var y = value.y;
-            var z = value.z;
-            if (when.defined(front)) {
-                attribute[front] = x;
-                attribute[front + 1] = y;
-                attribute[front + 2] = z;
-            }
-            if (when.defined(back)) {
-                attribute[back] = z;
-                attribute[back - 1] = y;
-                attribute[back - 2] = x;
-            }
-        };
-
-        var scratchForwardProjection = new Cartographic.Cartesian3();
-        var scratchBackwardProjection = new Cartographic.Cartesian3();
-
-        /**
-         * @private
-         */
-        CorridorGeometryLibrary.computePositions = function(params) {
-            var granularity = params.granularity;
-            var positions = params.positions;
-            var ellipsoid = params.ellipsoid;
-            var width = params.width / 2;
-            var cornerType = params.cornerType;
-            var saveAttributes = params.saveAttributes;
-            var normal = cartesian1;
-            var forward = cartesian2;
-            var backward = cartesian3;
-            var left = cartesian4;
-            var cornerDirection = cartesian5;
-            var startPoint = cartesian6;
-            var previousPos = cartesian7;
-            var rightPos = cartesian8;
-            var leftPos = cartesian9;
-            var center = cartesian10;
-            var calculatedPositions = [];
-            var calculatedLefts = (saveAttributes) ? [] : undefined;
-            var calculatedNormals = (saveAttributes) ? [] : undefined;
-            var position = positions[0]; //add first point
-            var nextPosition = positions[1];
-
-            forward = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.subtract(nextPosition, position, forward), forward);
-            normal = ellipsoid.geodeticSurfaceNormal(position, normal);
-            left = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(normal, forward, left), left);
-            if (saveAttributes) {
-                calculatedLefts.push(left.x, left.y, left.z);
-                calculatedNormals.push(normal.x, normal.y, normal.z);
-            }
-            previousPos = Cartographic.Cartesian3.clone(position, previousPos);
-            position = nextPosition;
-            backward = Cartographic.Cartesian3.negate(forward, backward);
-
-            var subdividedPositions;
-            var corners = [];
-            var i;
-            var length = positions.length;
-            for (i = 1; i < length - 1; i++) { // add middle points and corners
-                normal = ellipsoid.geodeticSurfaceNormal(position, normal);
-                nextPosition = positions[i + 1];
-                forward = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.subtract(nextPosition, position, forward), forward);
-                cornerDirection = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.add(forward, backward, cornerDirection), cornerDirection);
-
-                var forwardProjection = Cartographic.Cartesian3.multiplyByScalar(normal, Cartographic.Cartesian3.dot(forward, normal), scratchForwardProjection);
-                Cartographic.Cartesian3.subtract(forward, forwardProjection, forwardProjection);
-                Cartographic.Cartesian3.normalize(forwardProjection, forwardProjection);
-
-                var backwardProjection = Cartographic.Cartesian3.multiplyByScalar(normal, Cartographic.Cartesian3.dot(backward, normal), scratchBackwardProjection);
-                Cartographic.Cartesian3.subtract(backward, backwardProjection, backwardProjection);
-                Cartographic.Cartesian3.normalize(backwardProjection, backwardProjection);
-
-                var doCorner = !_Math.CesiumMath.equalsEpsilon(Math.abs(Cartographic.Cartesian3.dot(forwardProjection, backwardProjection)), 1.0, _Math.CesiumMath.EPSILON7);
-
-                if (doCorner) {
-                    cornerDirection = Cartographic.Cartesian3.cross(cornerDirection, normal, cornerDirection);
-                    cornerDirection = Cartographic.Cartesian3.cross(normal, cornerDirection, cornerDirection);
-                    cornerDirection = Cartographic.Cartesian3.normalize(cornerDirection, cornerDirection);
-                    var scalar = width / Math.max(0.25, Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.cross(cornerDirection, backward, scratch1)));
-                    var leftIsOutside = PolylineVolumeGeometryLibrary.PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(forward, backward, position, ellipsoid);
-                    cornerDirection = Cartographic.Cartesian3.multiplyByScalar(cornerDirection, scalar, cornerDirection);
-                    if (leftIsOutside) {
-                        rightPos = Cartographic.Cartesian3.add(position, cornerDirection, rightPos);
-                        center = Cartographic.Cartesian3.add(rightPos, Cartographic.Cartesian3.multiplyByScalar(left, width, center), center);
-                        leftPos = Cartographic.Cartesian3.add(rightPos, Cartographic.Cartesian3.multiplyByScalar(left, width * 2, leftPos), leftPos);
-                        scaleArray2[0] = Cartographic.Cartesian3.clone(previousPos, scaleArray2[0]);
-                        scaleArray2[1] = Cartographic.Cartesian3.clone(center, scaleArray2[1]);
-                        subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
-                            positions: scaleArray2,
-                            granularity: granularity,
-                            ellipsoid: ellipsoid
-                        });
-                        calculatedPositions = addShiftedPositions(subdividedPositions, left, width, calculatedPositions);
-                        if (saveAttributes) {
-                            calculatedLefts.push(left.x, left.y, left.z);
-                            calculatedNormals.push(normal.x, normal.y, normal.z);
-                        }
-                        startPoint = Cartographic.Cartesian3.clone(leftPos, startPoint);
-                        left = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(normal, forward, left), left);
-                        leftPos = Cartographic.Cartesian3.add(rightPos, Cartographic.Cartesian3.multiplyByScalar(left, width * 2, leftPos), leftPos);
-                        previousPos = Cartographic.Cartesian3.add(rightPos, Cartographic.Cartesian3.multiplyByScalar(left, width, previousPos), previousPos);
-                        if (cornerType === PolylineVolumeGeometryLibrary.CornerType.ROUNDED || cornerType === PolylineVolumeGeometryLibrary.CornerType.BEVELED) {
-                            corners.push({
-                                leftPositions : computeRoundCorner(rightPos, startPoint, leftPos, cornerType, leftIsOutside)
-                            });
-                        } else {
-                            corners.push({
-                                leftPositions : computeMiteredCorner(position, Cartographic.Cartesian3.negate(cornerDirection, cornerDirection), leftPos, leftIsOutside)
-                            });
-                        }
-                    } else {
-                        leftPos = Cartographic.Cartesian3.add(position, cornerDirection, leftPos);
-                        center = Cartographic.Cartesian3.add(leftPos, Cartographic.Cartesian3.negate(Cartographic.Cartesian3.multiplyByScalar(left, width, center), center), center);
-                        rightPos = Cartographic.Cartesian3.add(leftPos, Cartographic.Cartesian3.negate(Cartographic.Cartesian3.multiplyByScalar(left, width * 2, rightPos), rightPos), rightPos);
-                        scaleArray2[0] = Cartographic.Cartesian3.clone(previousPos, scaleArray2[0]);
-                        scaleArray2[1] = Cartographic.Cartesian3.clone(center, scaleArray2[1]);
-                        subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
-                            positions: scaleArray2,
-                            granularity: granularity,
-                            ellipsoid: ellipsoid
-                        });
-                        calculatedPositions = addShiftedPositions(subdividedPositions, left, width, calculatedPositions);
-                        if (saveAttributes) {
-                            calculatedLefts.push(left.x, left.y, left.z);
-                            calculatedNormals.push(normal.x, normal.y, normal.z);
-                        }
-                        startPoint = Cartographic.Cartesian3.clone(rightPos, startPoint);
-                        left = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(normal, forward, left), left);
-                        rightPos = Cartographic.Cartesian3.add(leftPos, Cartographic.Cartesian3.negate(Cartographic.Cartesian3.multiplyByScalar(left, width * 2, rightPos), rightPos), rightPos);
-                        previousPos = Cartographic.Cartesian3.add(leftPos, Cartographic.Cartesian3.negate(Cartographic.Cartesian3.multiplyByScalar(left, width, previousPos), previousPos), previousPos);
-                        if (cornerType === PolylineVolumeGeometryLibrary.CornerType.ROUNDED || cornerType === PolylineVolumeGeometryLibrary.CornerType.BEVELED) {
-                            corners.push({
-                                rightPositions : computeRoundCorner(leftPos, startPoint, rightPos, cornerType, leftIsOutside)
-                            });
-                        } else {
-                            corners.push({
-                                rightPositions : computeMiteredCorner(position, cornerDirection, rightPos, leftIsOutside)
-                            });
-                        }
-                    }
-                    backward = Cartographic.Cartesian3.negate(forward, backward);
-                }
-                position = nextPosition;
-            }
-
-            normal = ellipsoid.geodeticSurfaceNormal(position, normal);
-            scaleArray2[0] = Cartographic.Cartesian3.clone(previousPos, scaleArray2[0]);
-            scaleArray2[1] = Cartographic.Cartesian3.clone(position, scaleArray2[1]);
-            subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
-                positions: scaleArray2,
-                granularity: granularity,
-                ellipsoid: ellipsoid
-            });
-            calculatedPositions = addShiftedPositions(subdividedPositions, left, width, calculatedPositions);
-            if (saveAttributes) {
-                calculatedLefts.push(left.x, left.y, left.z);
-                calculatedNormals.push(normal.x, normal.y, normal.z);
-            }
-
-            var endPositions;
-            if (cornerType === PolylineVolumeGeometryLibrary.CornerType.ROUNDED) {
-                endPositions = addEndCaps(calculatedPositions);
-            }
-
-            return {
-                positions : calculatedPositions,
-                corners : corners,
-                lefts : calculatedLefts,
-                normals : calculatedNormals,
-                endPositions : endPositions
-            };
-        };
-
-    exports.CorridorGeometryLibrary = CorridorGeometryLibrary;
-
-});
diff --git a/public/libs/Cesium/Workers/CylinderGeometry-3fb30286.js b/public/libs/Cesium/Workers/CylinderGeometry-3fb30286.js
deleted file mode 100644
index c1800d4..0000000
--- a/public/libs/Cesium/Workers/CylinderGeometry-3fb30286.js
+++ /dev/null
@@ -1,445 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './CylinderGeometryLibrary-8c0fda9f'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, ComponentDatatype, GeometryAttribute, PrimitiveType, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, VertexFormat, CylinderGeometryLibrary) { 'use strict';
-
-    var radiusScratch = new Cartesian2.Cartesian2();
-        var normalScratch = new Cartographic.Cartesian3();
-        var bitangentScratch = new Cartographic.Cartesian3();
-        var tangentScratch = new Cartographic.Cartesian3();
-        var positionScratch = new Cartographic.Cartesian3();
-
-        /**
-         * A description of a cylinder.
-         *
-         * @alias CylinderGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Number} options.length The length of the cylinder.
-         * @param {Number} options.topRadius The radius of the top of the cylinder.
-         * @param {Number} options.bottomRadius The radius of the bottom of the cylinder.
-         * @param {Number} [options.slices=128] The number of edges around the perimeter of the cylinder.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         *
-         * @exception {DeveloperError} options.slices must be greater than or equal to 3.
-         *
-         * @see CylinderGeometry.createGeometry
-         *
-         * @example
-         * // create cylinder geometry
-         * var cylinder = new Cesium.CylinderGeometry({
-         *     length: 200000,
-         *     topRadius: 80000,
-         *     bottomRadius: 200000,
-         * });
-         * var geometry = Cesium.CylinderGeometry.createGeometry(cylinder);
-         */
-        function CylinderGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var length = options.length;
-            var topRadius = options.topRadius;
-            var bottomRadius = options.bottomRadius;
-            var vertexFormat = when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT);
-            var slices = when.defaultValue(options.slices, 128);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(length)) {
-                throw new Check.DeveloperError('options.length must be defined.');
-            }
-            if (!when.defined(topRadius)) {
-                throw new Check.DeveloperError('options.topRadius must be defined.');
-            }
-            if (!when.defined(bottomRadius)) {
-                throw new Check.DeveloperError('options.bottomRadius must be defined.');
-            }
-            if (slices < 3) {
-                throw new Check.DeveloperError('options.slices must be greater than or equal to 3.');
-            }
-            if (when.defined(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                throw new Check.DeveloperError('GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry.');
-            }
-            //>>includeEnd('debug');
-
-            this._length = length;
-            this._topRadius = topRadius;
-            this._bottomRadius = bottomRadius;
-            this._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat);
-            this._slices = slices;
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createCylinderGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        CylinderGeometry.packedLength = VertexFormat.VertexFormat.packedLength + 5;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {CylinderGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        CylinderGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._length;
-            array[startingIndex++] = value._topRadius;
-            array[startingIndex++] = value._bottomRadius;
-            array[startingIndex++] = value._slices;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            vertexFormat : scratchVertexFormat,
-            length : undefined,
-            topRadius : undefined,
-            bottomRadius : undefined,
-            slices : undefined,
-            offsetAttribute : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {CylinderGeometry} [result] The object into which to store the result.
-         * @returns {CylinderGeometry} The modified result parameter or a new CylinderGeometry instance if one was not provided.
-         */
-        CylinderGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var length = array[startingIndex++];
-            var topRadius = array[startingIndex++];
-            var bottomRadius = array[startingIndex++];
-            var slices = array[startingIndex++];
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.length = length;
-                scratchOptions.topRadius = topRadius;
-                scratchOptions.bottomRadius = bottomRadius;
-                scratchOptions.slices = slices;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-                return new CylinderGeometry(scratchOptions);
-            }
-
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._length = length;
-            result._topRadius = topRadius;
-            result._bottomRadius = bottomRadius;
-            result._slices = slices;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of a cylinder, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {CylinderGeometry} cylinderGeometry A description of the cylinder.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        CylinderGeometry.createGeometry = function(cylinderGeometry) {
-            var length = cylinderGeometry._length;
-            var topRadius = cylinderGeometry._topRadius;
-            var bottomRadius = cylinderGeometry._bottomRadius;
-            var vertexFormat = cylinderGeometry._vertexFormat;
-            var slices = cylinderGeometry._slices;
-
-            if ((length <= 0) || (topRadius < 0) || (bottomRadius < 0) || ((topRadius === 0) && (bottomRadius === 0))) {
-                return;
-            }
-
-            var twoSlices = slices + slices;
-            var threeSlices = slices + twoSlices;
-            var numVertices = twoSlices + twoSlices;
-
-            var positions = CylinderGeometryLibrary.CylinderGeometryLibrary.computePositions(length, topRadius, bottomRadius, slices, true);
-
-            var st = (vertexFormat.st) ? new Float32Array(numVertices * 2) : undefined;
-            var normals = (vertexFormat.normal) ? new Float32Array(numVertices * 3) : undefined;
-            var tangents = (vertexFormat.tangent) ? new Float32Array(numVertices * 3) : undefined;
-            var bitangents = (vertexFormat.bitangent) ? new Float32Array(numVertices * 3) : undefined;
-
-            var i;
-            var computeNormal = (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent);
-
-            if (computeNormal) {
-                var computeTangent = (vertexFormat.tangent || vertexFormat.bitangent);
-
-                var normalIndex = 0;
-                var tangentIndex = 0;
-                var bitangentIndex = 0;
-
-                var theta = Math.atan2(bottomRadius - topRadius, length);
-                var normal = normalScratch;
-                normal.z = Math.sin(theta);
-                var normalScale = Math.cos(theta);
-                var tangent = tangentScratch;
-                var bitangent = bitangentScratch;
-
-                for (i = 0; i < slices; i++) {
-                    var angle = i / slices * _Math.CesiumMath.TWO_PI;
-                    var x = normalScale * Math.cos(angle);
-                    var y = normalScale * Math.sin(angle);
-                    if (computeNormal) {
-                        normal.x = x;
-                        normal.y = y;
-
-                        if (computeTangent) {
-                            tangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(Cartographic.Cartesian3.UNIT_Z, normal, tangent), tangent);
-                        }
-
-                        if (vertexFormat.normal) {
-                            normals[normalIndex++] = normal.x;
-                            normals[normalIndex++] = normal.y;
-                            normals[normalIndex++] = normal.z;
-                            normals[normalIndex++] = normal.x;
-                            normals[normalIndex++] = normal.y;
-                            normals[normalIndex++] = normal.z;
-                        }
-
-                        if (vertexFormat.tangent) {
-                            tangents[tangentIndex++] = tangent.x;
-                            tangents[tangentIndex++] = tangent.y;
-                            tangents[tangentIndex++] = tangent.z;
-                            tangents[tangentIndex++] = tangent.x;
-                            tangents[tangentIndex++] = tangent.y;
-                            tangents[tangentIndex++] = tangent.z;
-                        }
-
-                        if (vertexFormat.bitangent) {
-                            bitangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(normal, tangent, bitangent), bitangent);
-                            bitangents[bitangentIndex++] = bitangent.x;
-                            bitangents[bitangentIndex++] = bitangent.y;
-                            bitangents[bitangentIndex++] = bitangent.z;
-                            bitangents[bitangentIndex++] = bitangent.x;
-                            bitangents[bitangentIndex++] = bitangent.y;
-                            bitangents[bitangentIndex++] = bitangent.z;
-                        }
-                    }
-                }
-
-                for (i = 0; i < slices; i++) {
-                    if (vertexFormat.normal) {
-                        normals[normalIndex++] = 0;
-                        normals[normalIndex++] = 0;
-                        normals[normalIndex++] = -1;
-                    }
-                    if (vertexFormat.tangent) {
-                        tangents[tangentIndex++] = 1;
-                        tangents[tangentIndex++] = 0;
-                        tangents[tangentIndex++] = 0;
-                    }
-                    if (vertexFormat.bitangent) {
-                        bitangents[bitangentIndex++] = 0;
-                        bitangents[bitangentIndex++] = -1;
-                        bitangents[bitangentIndex++] = 0;
-                    }
-                }
-
-                for (i = 0; i < slices; i++) {
-                    if (vertexFormat.normal) {
-                        normals[normalIndex++] = 0;
-                        normals[normalIndex++] = 0;
-                        normals[normalIndex++] = 1;
-                    }
-                    if (vertexFormat.tangent) {
-                        tangents[tangentIndex++] = 1;
-                        tangents[tangentIndex++] = 0;
-                        tangents[tangentIndex++] = 0;
-                    }
-                    if (vertexFormat.bitangent) {
-                        bitangents[bitangentIndex++] = 0;
-                        bitangents[bitangentIndex++] = 1;
-                        bitangents[bitangentIndex++] = 0;
-                    }
-                }
-            }
-
-            var numIndices = 12 * slices - 12;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(numVertices, numIndices);
-            var index = 0;
-            var j = 0;
-            for (i = 0; i < slices - 1; i++) {
-                indices[index++] = j;
-                indices[index++] = j + 2;
-                indices[index++] = j + 3;
-
-                indices[index++] = j;
-                indices[index++] = j + 3;
-                indices[index++] = j + 1;
-
-                j += 2;
-            }
-
-            indices[index++] = twoSlices - 2;
-            indices[index++] = 0;
-            indices[index++] = 1;
-            indices[index++] = twoSlices - 2;
-            indices[index++] = 1;
-            indices[index++] = twoSlices - 1;
-
-            for (i = 1; i < slices - 1; i++) {
-                indices[index++] = twoSlices + i + 1;
-                indices[index++] = twoSlices + i;
-                indices[index++] = twoSlices;
-            }
-
-            for (i = 1; i < slices - 1; i++) {
-                indices[index++] = threeSlices;
-                indices[index++] = threeSlices + i;
-                indices[index++] = threeSlices + i + 1;
-            }
-
-            var textureCoordIndex = 0;
-            if (vertexFormat.st) {
-                var rad = Math.max(topRadius, bottomRadius);
-                for (i = 0; i < numVertices; i++) {
-                    var position = Cartographic.Cartesian3.fromArray(positions, i * 3, positionScratch);
-                    st[textureCoordIndex++] = (position.x + rad) / (2.0 * rad);
-                    st[textureCoordIndex++] = (position.y + rad) / (2.0 * rad);
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            if (vertexFormat.position) {
-                attributes.position = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype: ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute: 3,
-                    values: positions
-                });
-            }
-
-            if (vertexFormat.normal) {
-                attributes.normal = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : normals
-                });
-            }
-
-            if (vertexFormat.tangent) {
-                attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : tangents
-                });
-            }
-
-            if (vertexFormat.bitangent) {
-                attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : bitangents
-                });
-            }
-
-            if (vertexFormat.st) {
-                attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : st
-                });
-            }
-
-            radiusScratch.x = length * 0.5;
-            radiusScratch.y = Math.max(bottomRadius, topRadius);
-
-            var boundingSphere = new BoundingSphere.BoundingSphere(Cartographic.Cartesian3.ZERO, Cartesian2.Cartesian2.magnitude(radiusScratch));
-
-            if (when.defined(cylinderGeometry._offsetAttribute)) {
-                length = positions.length;
-                var applyOffset = new Uint8Array(length / 3);
-                var offsetValue = cylinderGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                arrayFill.arrayFill(applyOffset, offsetValue);
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values: applyOffset
-                });
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES,
-                boundingSphere : boundingSphere,
-                offsetAttribute : cylinderGeometry._offsetAttribute
-            });
-        };
-
-        var unitCylinderGeometry;
-
-        /**
-         * Returns the geometric representation of a unit cylinder, including its vertices, indices, and a bounding sphere.
-         * @returns {Geometry} The computed vertices and indices.
-         *
-         * @private
-         */
-        CylinderGeometry.getUnitCylinder = function() {
-            if (!when.defined(unitCylinderGeometry)) {
-                unitCylinderGeometry = CylinderGeometry.createGeometry(new CylinderGeometry({
-                    topRadius : 1.0,
-                    bottomRadius : 1.0,
-                    length : 1.0,
-                    vertexFormat : VertexFormat.VertexFormat.POSITION_ONLY
-                }));
-            }
-            return unitCylinderGeometry;
-        };
-
-    exports.CylinderGeometry = CylinderGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/CylinderGeometryLibrary-8c0fda9f.js b/public/libs/Cesium/Workers/CylinderGeometryLibrary-8c0fda9f.js
deleted file mode 100644
index bb6ab9f..0000000
--- a/public/libs/Cesium/Workers/CylinderGeometryLibrary-8c0fda9f.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './Math-61ede240'], function (exports, _Math) { 'use strict';
-
-    /**
-         * @private
-         */
-        var CylinderGeometryLibrary = {};
-
-        /**
-         * @private
-         */
-        CylinderGeometryLibrary.computePositions = function(length, topRadius, bottomRadius, slices, fill){
-            var topZ = length * 0.5;
-            var bottomZ = -topZ;
-
-            var twoSlice = slices + slices;
-            var size = (fill) ? 2 * twoSlice : twoSlice;
-            var positions = new Float64Array(size*3);
-            var i;
-            var index = 0;
-            var tbIndex = 0;
-            var bottomOffset = (fill) ? twoSlice*3 : 0;
-            var topOffset = (fill) ? (twoSlice + slices)*3 : slices*3;
-
-            for (i = 0; i < slices; i++) {
-                var angle = i / slices * _Math.CesiumMath.TWO_PI;
-                var x = Math.cos(angle);
-                var y = Math.sin(angle);
-                var bottomX = x * bottomRadius;
-                var bottomY = y * bottomRadius;
-                var topX = x * topRadius;
-                var topY = y * topRadius;
-
-                positions[tbIndex + bottomOffset] = bottomX;
-                positions[tbIndex + bottomOffset + 1] = bottomY;
-                positions[tbIndex + bottomOffset + 2] = bottomZ;
-
-                positions[tbIndex + topOffset] = topX;
-                positions[tbIndex + topOffset + 1] = topY;
-                positions[tbIndex + topOffset + 2] = topZ;
-                tbIndex += 3;
-                if (fill) {
-                    positions[index++] = bottomX;
-                    positions[index++] = bottomY;
-                    positions[index++] = bottomZ;
-                    positions[index++] = topX;
-                    positions[index++] = topY;
-                    positions[index++] = topZ;
-                }
-            }
-
-            return positions;
-        };
-
-    exports.CylinderGeometryLibrary = CylinderGeometryLibrary;
-
-});
diff --git a/public/libs/Cesium/Workers/EllipseGeometry-185aabb4.js b/public/libs/Cesium/Workers/EllipseGeometry-185aabb4.js
deleted file mode 100644
index 43b3af0..0000000
--- a/public/libs/Cesium/Workers/EllipseGeometry-185aabb4.js
+++ /dev/null
@@ -1,1073 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './Transforms-a1cf7267', './GeometryAttributes-aacecde6', './GeometryPipeline-245a05d7', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './EllipseGeometryLibrary-7533a967', './GeometryInstance-93a01b5d'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, ComponentDatatype, GeometryAttribute, PrimitiveType, Transforms, GeometryAttributes, GeometryPipeline, IndexDatatype, arrayFill, GeometryOffsetAttribute, VertexFormat, EllipseGeometryLibrary, GeometryInstance) { 'use strict';
-
-    var scratchCartesian1 = new Cartographic.Cartesian3();
-        var scratchCartesian2 = new Cartographic.Cartesian3();
-        var scratchCartesian3 = new Cartographic.Cartesian3();
-        var scratchCartesian4 = new Cartographic.Cartesian3();
-        var texCoordScratch = new Cartesian2.Cartesian2();
-        var textureMatrixScratch = new BoundingSphere.Matrix3();
-        var tangentMatrixScratch = new BoundingSphere.Matrix3();
-        var quaternionScratch = new Transforms.Quaternion();
-
-        var scratchNormal = new Cartographic.Cartesian3();
-        var scratchTangent = new Cartographic.Cartesian3();
-        var scratchBitangent = new Cartographic.Cartesian3();
-
-        var scratchCartographic = new Cartographic.Cartographic();
-        var projectedCenterScratch = new Cartographic.Cartesian3();
-
-        var scratchMinTexCoord = new Cartesian2.Cartesian2();
-        var scratchMaxTexCoord = new Cartesian2.Cartesian2();
-
-        function computeTopBottomAttributes(positions, options, extrude) {
-            var vertexFormat = options.vertexFormat;
-            var center = options.center;
-            var semiMajorAxis = options.semiMajorAxis;
-            var semiMinorAxis = options.semiMinorAxis;
-            var ellipsoid = options.ellipsoid;
-            var stRotation = options.stRotation;
-            var size = (extrude) ? positions.length / 3 * 2 : positions.length / 3;
-            var shadowVolume = options.shadowVolume;
-
-            var textureCoordinates = (vertexFormat.st) ? new Float32Array(size * 2) : undefined;
-            var normals = (vertexFormat.normal) ? new Float32Array(size * 3) : undefined;
-            var tangents = (vertexFormat.tangent) ? new Float32Array(size * 3) : undefined;
-            var bitangents = (vertexFormat.bitangent) ? new Float32Array(size * 3) : undefined;
-
-            var extrudeNormals = (shadowVolume) ? new Float32Array(size * 3) : undefined;
-
-            var textureCoordIndex = 0;
-
-            // Raise positions to a height above the ellipsoid and compute the
-            // texture coordinates, normals, tangents, and bitangents.
-            var normal = scratchNormal;
-            var tangent = scratchTangent;
-            var bitangent = scratchBitangent;
-
-            var projection = new BoundingSphere.GeographicProjection(ellipsoid);
-            var projectedCenter = projection.project(ellipsoid.cartesianToCartographic(center, scratchCartographic), projectedCenterScratch);
-
-            var geodeticNormal = ellipsoid.scaleToGeodeticSurface(center, scratchCartesian1);
-            ellipsoid.geodeticSurfaceNormal(geodeticNormal, geodeticNormal);
-
-            var textureMatrix = textureMatrixScratch;
-            var tangentMatrix = tangentMatrixScratch;
-            if (stRotation !== 0) {
-                var rotation = Transforms.Quaternion.fromAxisAngle(geodeticNormal, stRotation, quaternionScratch);
-                textureMatrix = BoundingSphere.Matrix3.fromQuaternion(rotation, textureMatrix);
-
-                rotation = Transforms.Quaternion.fromAxisAngle(geodeticNormal, -stRotation, quaternionScratch);
-                tangentMatrix = BoundingSphere.Matrix3.fromQuaternion(rotation, tangentMatrix);
-            } else {
-                textureMatrix = BoundingSphere.Matrix3.clone(BoundingSphere.Matrix3.IDENTITY, textureMatrix);
-                tangentMatrix = BoundingSphere.Matrix3.clone(BoundingSphere.Matrix3.IDENTITY, tangentMatrix);
-            }
-
-            var minTexCoord = Cartesian2.Cartesian2.fromElements(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, scratchMinTexCoord);
-            var maxTexCoord = Cartesian2.Cartesian2.fromElements(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, scratchMaxTexCoord);
-
-            var length = positions.length;
-            var bottomOffset = (extrude) ? length : 0;
-            var stOffset = bottomOffset / 3 * 2;
-            for (var i = 0; i < length; i += 3) {
-                var i1 = i + 1;
-                var i2 = i + 2;
-                var position = Cartographic.Cartesian3.fromArray(positions, i, scratchCartesian1);
-
-                if (vertexFormat.st) {
-                    var rotatedPoint = BoundingSphere.Matrix3.multiplyByVector(textureMatrix, position, scratchCartesian2);
-                    var projectedPoint = projection.project(ellipsoid.cartesianToCartographic(rotatedPoint, scratchCartographic), scratchCartesian3);
-                    Cartographic.Cartesian3.subtract(projectedPoint, projectedCenter, projectedPoint);
-
-                    texCoordScratch.x = (projectedPoint.x + semiMajorAxis) / (2.0 * semiMajorAxis);
-                    texCoordScratch.y = (projectedPoint.y + semiMinorAxis) / (2.0 * semiMinorAxis);
-
-                    minTexCoord.x = Math.min(texCoordScratch.x, minTexCoord.x);
-                    minTexCoord.y = Math.min(texCoordScratch.y, minTexCoord.y);
-                    maxTexCoord.x = Math.max(texCoordScratch.x, maxTexCoord.x);
-                    maxTexCoord.y = Math.max(texCoordScratch.y, maxTexCoord.y);
-
-                    if (extrude) {
-                        textureCoordinates[textureCoordIndex + stOffset] = texCoordScratch.x;
-                        textureCoordinates[textureCoordIndex + 1 + stOffset] = texCoordScratch.y;
-                    }
-
-                    textureCoordinates[textureCoordIndex++] = texCoordScratch.x;
-                    textureCoordinates[textureCoordIndex++] = texCoordScratch.y;
-                }
-
-                if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent || shadowVolume) {
-                    normal = ellipsoid.geodeticSurfaceNormal(position, normal);
-
-                    if (shadowVolume) {
-                        extrudeNormals[i + bottomOffset] = -normal.x;
-                        extrudeNormals[i1 + bottomOffset] = -normal.y;
-                        extrudeNormals[i2 + bottomOffset] = -normal.z;
-                    }
-
-                    if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
-                        if (vertexFormat.tangent || vertexFormat.bitangent) {
-                            tangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(Cartographic.Cartesian3.UNIT_Z, normal, tangent), tangent);
-                            BoundingSphere.Matrix3.multiplyByVector(tangentMatrix, tangent, tangent);
-                        }
-                        if (vertexFormat.normal) {
-                            normals[i] = normal.x;
-                            normals[i1] = normal.y;
-                            normals[i2] = normal.z;
-                            if (extrude) {
-                                normals[i + bottomOffset] = -normal.x;
-                                normals[i1 + bottomOffset] = -normal.y;
-                                normals[i2 + bottomOffset] = -normal.z;
-                            }
-                        }
-
-                        if (vertexFormat.tangent) {
-                            tangents[i] = tangent.x;
-                            tangents[i1] = tangent.y;
-                            tangents[i2] = tangent.z;
-                            if (extrude) {
-                                tangents[i + bottomOffset] = -tangent.x;
-                                tangents[i1 + bottomOffset] = -tangent.y;
-                                tangents[i2 + bottomOffset] = -tangent.z;
-                            }
-                        }
-
-                        if (vertexFormat.bitangent) {
-                            bitangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(normal, tangent, bitangent), bitangent);
-                            bitangents[i ] = bitangent.x;
-                            bitangents[i1] = bitangent.y;
-                            bitangents[i2] = bitangent.z;
-                            if (extrude) {
-                                bitangents[i + bottomOffset] = bitangent.x;
-                                bitangents[i1 + bottomOffset] = bitangent.y;
-                                bitangents[i2 + bottomOffset] = bitangent.z;
-                            }
-                        }
-                    }
-                }
-            }
-
-            if (vertexFormat.st) {
-                length = textureCoordinates.length;
-                for (var k = 0; k < length; k += 2) {
-                    textureCoordinates[k] = (textureCoordinates[k] - minTexCoord.x) / (maxTexCoord.x - minTexCoord.x);
-                    textureCoordinates[k + 1] = (textureCoordinates[k + 1] - minTexCoord.y) / (maxTexCoord.y - minTexCoord.y);
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-
-            if (vertexFormat.position) {
-                var finalPositions = EllipseGeometryLibrary.EllipseGeometryLibrary.raisePositionsToHeight(positions, options, extrude);
-                attributes.position = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : finalPositions
-                });
-            }
-
-            if (vertexFormat.st) {
-                attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : textureCoordinates
-                });
-            }
-
-            if (vertexFormat.normal) {
-                attributes.normal = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : normals
-                });
-            }
-
-            if (vertexFormat.tangent) {
-                attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : tangents
-                });
-            }
-
-            if (vertexFormat.bitangent) {
-                attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : bitangents
-                });
-            }
-
-            if (shadowVolume) {
-                attributes.extrudeDirection = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : extrudeNormals
-                });
-            }
-
-            if (extrude && when.defined(options.offsetAttribute)) {
-                var offsetAttribute = new Uint8Array(size);
-                if (options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                    offsetAttribute = arrayFill.arrayFill(offsetAttribute, 1, 0, size / 2);
-                } else {
-                    var offsetValue = options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    offsetAttribute = arrayFill.arrayFill(offsetAttribute, offsetValue);
-                }
-
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values : offsetAttribute
-                });
-            }
-
-            return attributes;
-        }
-
-        function topIndices(numPts) {
-            // numTriangles in half = 3 + 8 + 12 + ... = -1 + 4 + (4 + 4) + (4 + 4 + 4) + ... = -1 + 4 * (1 + 2 + 3 + ...)
-            //              = -1 + 4 * ((n * ( n + 1)) / 2)
-            // total triangles = 2 * numTrangles in half
-            // indices = total triangles * 3;
-            // Substitute numPts for n above
-
-            var indices = new Array(12 * (numPts * ( numPts + 1)) - 6);
-            var indicesIndex = 0;
-            var prevIndex;
-            var numInterior;
-            var positionIndex;
-            var i;
-            var j;
-            // Indices triangles to the 'right' of the north vector
-
-            prevIndex = 0;
-            positionIndex = 1;
-            for (i = 0; i < 3; i++) {
-                indices[indicesIndex++] = positionIndex++;
-                indices[indicesIndex++] = prevIndex;
-                indices[indicesIndex++] = positionIndex;
-            }
-
-            for (i = 2; i < numPts + 1; ++i) {
-                positionIndex = i * (i + 1) - 1;
-                prevIndex = (i - 1) * i - 1;
-
-                indices[indicesIndex++] = positionIndex++;
-                indices[indicesIndex++] = prevIndex;
-                indices[indicesIndex++] = positionIndex;
-
-                numInterior = 2 * i;
-                for (j = 0; j < numInterior - 1; ++j) {
-
-                    indices[indicesIndex++] = positionIndex;
-                    indices[indicesIndex++] = prevIndex++;
-                    indices[indicesIndex++] = prevIndex;
-
-                    indices[indicesIndex++] = positionIndex++;
-                    indices[indicesIndex++] = prevIndex;
-                    indices[indicesIndex++] = positionIndex;
-                }
-
-                indices[indicesIndex++] = positionIndex++;
-                indices[indicesIndex++] = prevIndex;
-                indices[indicesIndex++] = positionIndex;
-            }
-
-            // Indices for center column of triangles
-            numInterior = numPts * 2;
-            ++positionIndex;
-            ++prevIndex;
-            for (i = 0; i < numInterior - 1; ++i) {
-                indices[indicesIndex++] = positionIndex;
-                indices[indicesIndex++] = prevIndex++;
-                indices[indicesIndex++] = prevIndex;
-
-                indices[indicesIndex++] = positionIndex++;
-                indices[indicesIndex++] = prevIndex;
-                indices[indicesIndex++] = positionIndex;
-            }
-
-            indices[indicesIndex++] = positionIndex;
-            indices[indicesIndex++] = prevIndex++;
-            indices[indicesIndex++] = prevIndex;
-
-            indices[indicesIndex++] = positionIndex++;
-            indices[indicesIndex++] = prevIndex++;
-            indices[indicesIndex++] = prevIndex;
-
-            // Reverse the process creating indices to the 'left' of the north vector
-            ++prevIndex;
-            for (i = numPts - 1; i > 1; --i) {
-                indices[indicesIndex++] = prevIndex++;
-                indices[indicesIndex++] = prevIndex;
-                indices[indicesIndex++] = positionIndex;
-
-                numInterior = 2 * i;
-                for (j = 0; j < numInterior - 1; ++j) {
-                    indices[indicesIndex++] = positionIndex;
-                    indices[indicesIndex++] = prevIndex++;
-                    indices[indicesIndex++] = prevIndex;
-
-                    indices[indicesIndex++] = positionIndex++;
-                    indices[indicesIndex++] = prevIndex;
-                    indices[indicesIndex++] = positionIndex;
-                }
-
-                indices[indicesIndex++] = prevIndex++;
-                indices[indicesIndex++] = prevIndex++;
-                indices[indicesIndex++] = positionIndex++;
-            }
-
-            for (i = 0; i < 3; i++) {
-                indices[indicesIndex++] = prevIndex++;
-                indices[indicesIndex++] = prevIndex;
-                indices[indicesIndex++] = positionIndex;
-            }
-            return indices;
-        }
-
-        var boundingSphereCenter = new Cartographic.Cartesian3();
-
-        function computeEllipse(options) {
-            var center = options.center;
-            boundingSphereCenter = Cartographic.Cartesian3.multiplyByScalar(options.ellipsoid.geodeticSurfaceNormal(center, boundingSphereCenter), options.height, boundingSphereCenter);
-            boundingSphereCenter = Cartographic.Cartesian3.add(center, boundingSphereCenter, boundingSphereCenter);
-            var boundingSphere = new BoundingSphere.BoundingSphere(boundingSphereCenter, options.semiMajorAxis);
-            var cep = EllipseGeometryLibrary.EllipseGeometryLibrary.computeEllipsePositions(options, true, false);
-            var positions = cep.positions;
-            var numPts = cep.numPts;
-            var attributes = computeTopBottomAttributes(positions, options, false);
-            var indices = topIndices(numPts);
-            indices = IndexDatatype.IndexDatatype.createTypedArray(positions.length / 3, indices);
-            return {
-                boundingSphere : boundingSphere,
-                attributes : attributes,
-                indices : indices
-            };
-        }
-
-        function computeWallAttributes(positions, options) {
-            var vertexFormat = options.vertexFormat;
-            var center = options.center;
-            var semiMajorAxis = options.semiMajorAxis;
-            var semiMinorAxis = options.semiMinorAxis;
-            var ellipsoid = options.ellipsoid;
-            var height = options.height;
-            var extrudedHeight = options.extrudedHeight;
-            var stRotation = options.stRotation;
-            var size = positions.length / 3 * 2;
-
-            var finalPositions = new Float64Array(size * 3);
-            var textureCoordinates = (vertexFormat.st) ? new Float32Array(size * 2) : undefined;
-            var normals = (vertexFormat.normal) ? new Float32Array(size * 3) : undefined;
-            var tangents = (vertexFormat.tangent) ? new Float32Array(size * 3) : undefined;
-            var bitangents = (vertexFormat.bitangent) ? new Float32Array(size * 3) : undefined;
-
-            var shadowVolume = options.shadowVolume;
-            var extrudeNormals = (shadowVolume) ? new Float32Array(size * 3) : undefined;
-
-            var textureCoordIndex = 0;
-
-            // Raise positions to a height above the ellipsoid and compute the
-            // texture coordinates, normals, tangents, and bitangents.
-            var normal = scratchNormal;
-            var tangent = scratchTangent;
-            var bitangent = scratchBitangent;
-
-            var projection = new BoundingSphere.GeographicProjection(ellipsoid);
-            var projectedCenter = projection.project(ellipsoid.cartesianToCartographic(center, scratchCartographic), projectedCenterScratch);
-
-            var geodeticNormal = ellipsoid.scaleToGeodeticSurface(center, scratchCartesian1);
-            ellipsoid.geodeticSurfaceNormal(geodeticNormal, geodeticNormal);
-            var rotation = Transforms.Quaternion.fromAxisAngle(geodeticNormal, stRotation, quaternionScratch);
-            var textureMatrix = BoundingSphere.Matrix3.fromQuaternion(rotation, textureMatrixScratch);
-
-            var minTexCoord = Cartesian2.Cartesian2.fromElements(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, scratchMinTexCoord);
-            var maxTexCoord = Cartesian2.Cartesian2.fromElements(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, scratchMaxTexCoord);
-
-            var length = positions.length;
-            var stOffset = length / 3 * 2;
-            for (var i = 0; i < length; i += 3) {
-                var i1 = i + 1;
-                var i2 = i + 2;
-                var position = Cartographic.Cartesian3.fromArray(positions, i, scratchCartesian1);
-                var extrudedPosition;
-
-                if (vertexFormat.st) {
-                    var rotatedPoint = BoundingSphere.Matrix3.multiplyByVector(textureMatrix, position, scratchCartesian2);
-                    var projectedPoint = projection.project(ellipsoid.cartesianToCartographic(rotatedPoint, scratchCartographic), scratchCartesian3);
-                    Cartographic.Cartesian3.subtract(projectedPoint, projectedCenter, projectedPoint);
-
-                    texCoordScratch.x = (projectedPoint.x + semiMajorAxis) / (2.0 * semiMajorAxis);
-                    texCoordScratch.y = (projectedPoint.y + semiMinorAxis) / (2.0 * semiMinorAxis);
-
-                    minTexCoord.x = Math.min(texCoordScratch.x, minTexCoord.x);
-                    minTexCoord.y = Math.min(texCoordScratch.y, minTexCoord.y);
-                    maxTexCoord.x = Math.max(texCoordScratch.x, maxTexCoord.x);
-                    maxTexCoord.y = Math.max(texCoordScratch.y, maxTexCoord.y);
-
-                    textureCoordinates[textureCoordIndex + stOffset] = texCoordScratch.x;
-                    textureCoordinates[textureCoordIndex + 1 + stOffset] = texCoordScratch.y;
-
-                    textureCoordinates[textureCoordIndex++] = texCoordScratch.x;
-                    textureCoordinates[textureCoordIndex++] = texCoordScratch.y;
-                }
-
-                position = ellipsoid.scaleToGeodeticSurface(position, position);
-                extrudedPosition = Cartographic.Cartesian3.clone(position, scratchCartesian2);
-                normal = ellipsoid.geodeticSurfaceNormal(position, normal);
-
-                if (shadowVolume) {
-                    extrudeNormals[i + length] = -normal.x;
-                    extrudeNormals[i1 + length] = -normal.y;
-                    extrudeNormals[i2 + length] = -normal.z;
-                }
-
-                var scaledNormal = Cartographic.Cartesian3.multiplyByScalar(normal, height, scratchCartesian4);
-                position = Cartographic.Cartesian3.add(position, scaledNormal, position);
-                scaledNormal = Cartographic.Cartesian3.multiplyByScalar(normal, extrudedHeight, scaledNormal);
-                extrudedPosition = Cartographic.Cartesian3.add(extrudedPosition, scaledNormal, extrudedPosition);
-
-                if (vertexFormat.position) {
-                    finalPositions[i + length] = extrudedPosition.x;
-                    finalPositions[i1 + length] = extrudedPosition.y;
-                    finalPositions[i2 + length] = extrudedPosition.z;
-
-                    finalPositions[i] = position.x;
-                    finalPositions[i1] = position.y;
-                    finalPositions[i2] = position.z;
-                }
-
-                if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
-
-                    bitangent = Cartographic.Cartesian3.clone(normal, bitangent);
-                    var next = Cartographic.Cartesian3.fromArray(positions, (i + 3) % length, scratchCartesian4);
-                    Cartographic.Cartesian3.subtract(next, position, next);
-                    var bottom = Cartographic.Cartesian3.subtract(extrudedPosition, position, scratchCartesian3);
-
-                    normal = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(bottom, next, normal), normal);
-
-                    if (vertexFormat.normal) {
-                        normals[i] = normal.x;
-                        normals[i1] = normal.y;
-                        normals[i2] = normal.z;
-
-                        normals[i + length] = normal.x;
-                        normals[i1 + length] = normal.y;
-                        normals[i2 + length] = normal.z;
-                    }
-
-                    if (vertexFormat.tangent) {
-                        tangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(bitangent, normal, tangent), tangent);
-                        tangents[i] = tangent.x;
-                        tangents[i1] = tangent.y;
-                        tangents[i2] = tangent.z;
-
-                        tangents[i + length] = tangent.x;
-                        tangents[i + 1 + length] = tangent.y;
-                        tangents[i + 2 + length] = tangent.z;
-                    }
-
-                    if (vertexFormat.bitangent) {
-                        bitangents[i ] = bitangent.x;
-                        bitangents[i1] = bitangent.y;
-                        bitangents[i2] = bitangent.z;
-
-                        bitangents[i + length] = bitangent.x;
-                        bitangents[i1 + length] = bitangent.y;
-                        bitangents[i2 + length] = bitangent.z;
-                    }
-                }
-            }
-
-            if (vertexFormat.st) {
-                length = textureCoordinates.length;
-                for (var k = 0; k < length; k += 2) {
-                    textureCoordinates[k] = (textureCoordinates[k] - minTexCoord.x) / (maxTexCoord.x - minTexCoord.x);
-                    textureCoordinates[k + 1] = (textureCoordinates[k + 1] - minTexCoord.y) / (maxTexCoord.y - minTexCoord.y);
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-
-            if (vertexFormat.position) {
-                attributes.position = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : finalPositions
-                });
-            }
-
-            if (vertexFormat.st) {
-                attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : textureCoordinates
-                });
-            }
-
-            if (vertexFormat.normal) {
-                attributes.normal = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : normals
-                });
-            }
-
-            if (vertexFormat.tangent) {
-                attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : tangents
-                });
-            }
-
-            if (vertexFormat.bitangent) {
-                attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : bitangents
-                });
-            }
-
-            if (shadowVolume) {
-                attributes.extrudeDirection = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : extrudeNormals
-                });
-            }
-
-            if (when.defined(options.offsetAttribute)) {
-                var offsetAttribute = new Uint8Array(size);
-                if (options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                    offsetAttribute = arrayFill.arrayFill(offsetAttribute, 1, 0, size / 2);
-                } else {
-                    var offsetValue = options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    offsetAttribute = arrayFill.arrayFill(offsetAttribute, offsetValue);
-                }
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values : offsetAttribute
-                });
-            }
-
-            return attributes;
-        }
-
-        function computeWallIndices(positions) {
-            var length = positions.length / 3;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(length, length * 6);
-            var index = 0;
-            for (var i = 0; i < length; i++) {
-                var UL = i;
-                var LL = i + length;
-                var UR = (UL + 1) % length;
-                var LR = UR + length;
-                indices[index++] = UL;
-                indices[index++] = LL;
-                indices[index++] = UR;
-                indices[index++] = UR;
-                indices[index++] = LL;
-                indices[index++] = LR;
-            }
-
-            return indices;
-        }
-
-        var topBoundingSphere = new BoundingSphere.BoundingSphere();
-        var bottomBoundingSphere = new BoundingSphere.BoundingSphere();
-
-        function computeExtrudedEllipse(options) {
-            var center = options.center;
-            var ellipsoid = options.ellipsoid;
-            var semiMajorAxis = options.semiMajorAxis;
-            var scaledNormal = Cartographic.Cartesian3.multiplyByScalar(ellipsoid.geodeticSurfaceNormal(center, scratchCartesian1), options.height, scratchCartesian1);
-            topBoundingSphere.center = Cartographic.Cartesian3.add(center, scaledNormal, topBoundingSphere.center);
-            topBoundingSphere.radius = semiMajorAxis;
-
-            scaledNormal = Cartographic.Cartesian3.multiplyByScalar(ellipsoid.geodeticSurfaceNormal(center, scaledNormal), options.extrudedHeight, scaledNormal);
-            bottomBoundingSphere.center = Cartographic.Cartesian3.add(center, scaledNormal, bottomBoundingSphere.center);
-            bottomBoundingSphere.radius = semiMajorAxis;
-
-            var cep = EllipseGeometryLibrary.EllipseGeometryLibrary.computeEllipsePositions(options, true, true);
-            var positions = cep.positions;
-            var numPts = cep.numPts;
-            var outerPositions = cep.outerPositions;
-            var boundingSphere = BoundingSphere.BoundingSphere.union(topBoundingSphere, bottomBoundingSphere);
-            var topBottomAttributes = computeTopBottomAttributes(positions, options, true);
-            var indices = topIndices(numPts);
-            var length = indices.length;
-            indices.length = length * 2;
-            var posLength = positions.length / 3;
-            for (var i = 0; i < length; i += 3) {
-                indices[i + length] = indices[i + 2] + posLength;
-                indices[i + 1 + length] = indices[i + 1] + posLength;
-                indices[i + 2 + length] = indices[i] + posLength;
-            }
-
-            var topBottomIndices = IndexDatatype.IndexDatatype.createTypedArray(posLength * 2 / 3, indices);
-
-            var topBottomGeo = new GeometryAttribute.Geometry({
-                attributes : topBottomAttributes,
-                indices : topBottomIndices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES
-            });
-
-            var wallAttributes = computeWallAttributes(outerPositions, options);
-            indices = computeWallIndices(outerPositions);
-            var wallIndices = IndexDatatype.IndexDatatype.createTypedArray(outerPositions.length * 2 / 3, indices);
-
-            var wallGeo = new GeometryAttribute.Geometry({
-                attributes : wallAttributes,
-                indices : wallIndices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES
-            });
-
-            var geo = GeometryPipeline.GeometryPipeline.combineInstances([
-                new GeometryInstance.GeometryInstance({
-                    geometry : topBottomGeo
-                }),
-                new GeometryInstance.GeometryInstance({
-                    geometry : wallGeo
-                })
-            ]);
-
-            return {
-                boundingSphere : boundingSphere,
-                attributes : geo[0].attributes,
-                indices : geo[0].indices
-            };
-        }
-
-        function computeRectangle(center, semiMajorAxis, semiMinorAxis, rotation, granularity, ellipsoid, result) {
-            var cep = EllipseGeometryLibrary.EllipseGeometryLibrary.computeEllipsePositions({
-                center : center,
-                semiMajorAxis : semiMajorAxis,
-                semiMinorAxis : semiMinorAxis,
-                rotation : rotation,
-                granularity : granularity
-            }, false, true);
-            var positionsFlat = cep.outerPositions;
-            var positionsCount = positionsFlat.length / 3;
-            var positions = new Array(positionsCount);
-            for (var i = 0; i < positionsCount; ++i) {
-                positions[i] = Cartographic.Cartesian3.fromArray(positionsFlat, i * 3);
-            }
-            var rectangle = Cartesian2.Rectangle.fromCartesianArray(positions, ellipsoid, result);
-            // Rectangle width goes beyond 180 degrees when the ellipse crosses a pole.
-            // When this happens, make the rectangle into a "circle" around the pole
-            if (rectangle.width > _Math.CesiumMath.PI) {
-                rectangle.north = rectangle.north > 0.0 ? _Math.CesiumMath.PI_OVER_TWO - _Math.CesiumMath.EPSILON7 : rectangle.north;
-                rectangle.south = rectangle.south < 0.0 ? _Math.CesiumMath.EPSILON7 - _Math.CesiumMath.PI_OVER_TWO : rectangle.south;
-                rectangle.east = _Math.CesiumMath.PI;
-                rectangle.west = -_Math.CesiumMath.PI;
-            }
-            return rectangle;
-        }
-
-        /**
-         * A description of an ellipse on an ellipsoid. Ellipse geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}.
-         *
-         * @alias EllipseGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3} options.center The ellipse's center point in the fixed frame.
-         * @param {Number} options.semiMajorAxis The length of the ellipse's semi-major axis in meters.
-         * @param {Number} options.semiMinorAxis The length of the ellipse's semi-minor axis in meters.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid the ellipse will be on.
-         * @param {Number} [options.height=0.0] The distance in meters between the ellipse and the ellipsoid surface.
-         * @param {Number} [options.extrudedHeight] The distance in meters between the ellipse's extruded face and the ellipsoid surface.
-         * @param {Number} [options.rotation=0.0] The angle of rotation counter-clockwise from north.
-         * @param {Number} [options.stRotation=0.0] The rotation of the texture coordinates counter-clockwise from north.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The angular distance between points on the ellipse in radians.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         *
-         * @exception {DeveloperError} semiMajorAxis and semiMinorAxis must be greater than zero.
-         * @exception {DeveloperError} semiMajorAxis must be greater than or equal to the semiMinorAxis.
-         * @exception {DeveloperError} granularity must be greater than zero.
-         *
-         *
-         * @example
-         * // Create an ellipse.
-         * var ellipse = new Cesium.EllipseGeometry({
-         *   center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
-         *   semiMajorAxis : 500000.0,
-         *   semiMinorAxis : 300000.0,
-         *   rotation : Cesium.Math.toRadians(60.0)
-         * });
-         * var geometry = Cesium.EllipseGeometry.createGeometry(ellipse);
-         *
-         * @see EllipseGeometry.createGeometry
-         */
-        function EllipseGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var center = options.center;
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var semiMajorAxis = options.semiMajorAxis;
-            var semiMinorAxis = options.semiMinorAxis;
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            var vertexFormat = when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.center', center);
-            Check.Check.typeOf.number('options.semiMajorAxis', semiMajorAxis);
-            Check.Check.typeOf.number('options.semiMinorAxis', semiMinorAxis);
-            if (semiMajorAxis < semiMinorAxis) {
-                throw new Check.DeveloperError('semiMajorAxis must be greater than or equal to the semiMinorAxis.');
-            }
-            if (granularity <= 0.0) {
-                throw new Check.DeveloperError('granularity must be greater than zero.');
-            }
-            //>>includeEnd('debug');
-
-            var height = when.defaultValue(options.height, 0.0);
-            var extrudedHeight = when.defaultValue(options.extrudedHeight, height);
-
-            this._center = Cartographic.Cartesian3.clone(center);
-            this._semiMajorAxis = semiMajorAxis;
-            this._semiMinorAxis = semiMinorAxis;
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid);
-            this._rotation = when.defaultValue(options.rotation, 0.0);
-            this._stRotation = when.defaultValue(options.stRotation, 0.0);
-            this._height = Math.max(extrudedHeight, height);
-            this._granularity = granularity;
-            this._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat);
-            this._extrudedHeight = Math.min(extrudedHeight, height);
-            this._shadowVolume = when.defaultValue(options.shadowVolume, false);
-            this._workerName = 'createEllipseGeometry';
-            this._offsetAttribute = options.offsetAttribute;
-
-            this._rectangle = undefined;
-            this._textureCoordinateRotationPoints = undefined;
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        EllipseGeometry.packedLength = Cartographic.Cartesian3.packedLength + Cartesian2.Ellipsoid.packedLength + VertexFormat.VertexFormat.packedLength + 9;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {EllipseGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        EllipseGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            Cartographic.Cartesian3.pack(value._center, array, startingIndex);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._semiMajorAxis;
-            array[startingIndex++] = value._semiMinorAxis;
-            array[startingIndex++] = value._rotation;
-            array[startingIndex++] = value._stRotation;
-            array[startingIndex++] = value._height;
-            array[startingIndex++] = value._granularity;
-            array[startingIndex++] = value._extrudedHeight;
-            array[startingIndex++] = value._shadowVolume ? 1.0 : 0.0;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchCenter = new Cartographic.Cartesian3();
-        var scratchEllipsoid = new Cartesian2.Ellipsoid();
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            center : scratchCenter,
-            ellipsoid : scratchEllipsoid,
-            vertexFormat : scratchVertexFormat,
-            semiMajorAxis : undefined,
-            semiMinorAxis : undefined,
-            rotation : undefined,
-            stRotation : undefined,
-            height : undefined,
-            granularity : undefined,
-            extrudedHeight : undefined,
-            shadowVolume: undefined,
-            offsetAttribute: undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {EllipseGeometry} [result] The object into which to store the result.
-         * @returns {EllipseGeometry} The modified result parameter or a new EllipseGeometry instance if one was not provided.
-         */
-        EllipseGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var center = Cartographic.Cartesian3.unpack(array, startingIndex, scratchCenter);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var semiMajorAxis = array[startingIndex++];
-            var semiMinorAxis = array[startingIndex++];
-            var rotation = array[startingIndex++];
-            var stRotation = array[startingIndex++];
-            var height = array[startingIndex++];
-            var granularity = array[startingIndex++];
-            var extrudedHeight = array[startingIndex++];
-            var shadowVolume = array[startingIndex++] === 1.0;
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.height = height;
-                scratchOptions.extrudedHeight = extrudedHeight;
-                scratchOptions.granularity = granularity;
-                scratchOptions.stRotation = stRotation;
-                scratchOptions.rotation = rotation;
-                scratchOptions.semiMajorAxis = semiMajorAxis;
-                scratchOptions.semiMinorAxis = semiMinorAxis;
-                scratchOptions.shadowVolume = shadowVolume;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-                return new EllipseGeometry(scratchOptions);
-            }
-
-            result._center = Cartographic.Cartesian3.clone(center, result._center);
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._semiMajorAxis = semiMajorAxis;
-            result._semiMinorAxis = semiMinorAxis;
-            result._rotation = rotation;
-            result._stRotation = stRotation;
-            result._height = height;
-            result._granularity = granularity;
-            result._extrudedHeight = extrudedHeight;
-            result._shadowVolume = shadowVolume;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the bounding rectangle based on the provided options
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3} options.center The ellipse's center point in the fixed frame.
-         * @param {Number} options.semiMajorAxis The length of the ellipse's semi-major axis in meters.
-         * @param {Number} options.semiMinorAxis The length of the ellipse's semi-minor axis in meters.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid the ellipse will be on.
-         * @param {Number} [options.rotation=0.0] The angle of rotation counter-clockwise from north.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The angular distance between points on the ellipse in radians.
-         * @param {Rectangle} [result] An object in which to store the result
-         *
-         * @returns {Rectangle} The result rectangle
-         */
-        EllipseGeometry.computeRectangle = function(options, result) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var center = options.center;
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var semiMajorAxis = options.semiMajorAxis;
-            var semiMinorAxis = options.semiMinorAxis;
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            var rotation = when.defaultValue(options.rotation, 0.0);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.center', center);
-            Check.Check.typeOf.number('options.semiMajorAxis', semiMajorAxis);
-            Check.Check.typeOf.number('options.semiMinorAxis', semiMinorAxis);
-            if (semiMajorAxis < semiMinorAxis) {
-                throw new Check.DeveloperError('semiMajorAxis must be greater than or equal to the semiMinorAxis.');
-            }
-            if (granularity <= 0.0) {
-                throw new Check.DeveloperError('granularity must be greater than zero.');
-            }
-            //>>includeEnd('debug');
-
-            return computeRectangle(center, semiMajorAxis, semiMinorAxis, rotation, granularity, ellipsoid, result);
-        };
-
-        /**
-         * Computes the geometric representation of a ellipse on an ellipsoid, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {EllipseGeometry} ellipseGeometry A description of the ellipse.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        EllipseGeometry.createGeometry = function(ellipseGeometry) {
-            if ((ellipseGeometry._semiMajorAxis <= 0.0) || (ellipseGeometry._semiMinorAxis <= 0.0)) {
-                return;
-            }
-
-            var height = ellipseGeometry._height;
-            var extrudedHeight = ellipseGeometry._extrudedHeight;
-            var extrude = !_Math.CesiumMath.equalsEpsilon(height, extrudedHeight, 0, _Math.CesiumMath.EPSILON2);
-
-            ellipseGeometry._center = ellipseGeometry._ellipsoid.scaleToGeodeticSurface(ellipseGeometry._center, ellipseGeometry._center);
-            var options = {
-                center : ellipseGeometry._center,
-                semiMajorAxis : ellipseGeometry._semiMajorAxis,
-                semiMinorAxis : ellipseGeometry._semiMinorAxis,
-                ellipsoid : ellipseGeometry._ellipsoid,
-                rotation : ellipseGeometry._rotation,
-                height : height,
-                granularity : ellipseGeometry._granularity,
-                vertexFormat : ellipseGeometry._vertexFormat,
-                stRotation : ellipseGeometry._stRotation
-            };
-            var geometry;
-            if (extrude) {
-                options.extrudedHeight = extrudedHeight;
-                options.shadowVolume = ellipseGeometry._shadowVolume;
-                options.offsetAttribute = ellipseGeometry._offsetAttribute;
-                geometry = computeExtrudedEllipse(options);
-            } else {
-                geometry = computeEllipse(options);
-
-                if (when.defined(ellipseGeometry._offsetAttribute)) {
-                    var length = geometry.attributes.position.values.length;
-                    var applyOffset = new Uint8Array(length / 3);
-                    var offsetValue = ellipseGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    arrayFill.arrayFill(applyOffset, offsetValue);
-                    geometry.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        componentsPerAttribute : 1,
-                        values: applyOffset
-                    });
-                }
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : geometry.attributes,
-                indices : geometry.indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES,
-                boundingSphere : geometry.boundingSphere,
-                offsetAttribute : ellipseGeometry._offsetAttribute
-            });
-        };
-
-        /**
-         * @private
-         */
-        EllipseGeometry.createShadowVolume = function(ellipseGeometry, minHeightFunc, maxHeightFunc) {
-            var granularity = ellipseGeometry._granularity;
-            var ellipsoid = ellipseGeometry._ellipsoid;
-
-            var minHeight = minHeightFunc(granularity, ellipsoid);
-            var maxHeight = maxHeightFunc(granularity, ellipsoid);
-
-            return new EllipseGeometry({
-                center : ellipseGeometry._center,
-                semiMajorAxis : ellipseGeometry._semiMajorAxis,
-                semiMinorAxis : ellipseGeometry._semiMinorAxis,
-                ellipsoid : ellipsoid,
-                rotation : ellipseGeometry._rotation,
-                stRotation : ellipseGeometry._stRotation,
-                granularity : granularity,
-                extrudedHeight : minHeight,
-                height : maxHeight,
-                vertexFormat : VertexFormat.VertexFormat.POSITION_ONLY,
-                shadowVolume: true
-            });
-        };
-
-        function textureCoordinateRotationPoints(ellipseGeometry) {
-            var stRotation = -ellipseGeometry._stRotation;
-            if (stRotation === 0.0) {
-                return [0, 0, 0, 1, 1, 0];
-            }
-
-            var cep = EllipseGeometryLibrary.EllipseGeometryLibrary.computeEllipsePositions({
-                center : ellipseGeometry._center,
-                semiMajorAxis : ellipseGeometry._semiMajorAxis,
-                semiMinorAxis : ellipseGeometry._semiMinorAxis,
-                rotation : ellipseGeometry._rotation,
-                granularity : ellipseGeometry._granularity
-            }, false, true);
-            var positionsFlat = cep.outerPositions;
-            var positionsCount = positionsFlat.length / 3;
-            var positions = new Array(positionsCount);
-            for (var i = 0; i < positionsCount; ++i) {
-                positions[i] = Cartographic.Cartesian3.fromArray(positionsFlat, i * 3);
-            }
-
-            var ellipsoid = ellipseGeometry._ellipsoid;
-            var boundingRectangle = ellipseGeometry.rectangle;
-            return GeometryAttribute.Geometry._textureCoordinateRotationPoints(positions, stRotation, ellipsoid, boundingRectangle);
-        }
-
-        Object.defineProperties(EllipseGeometry.prototype, {
-            /**
-             * @private
-             */
-            rectangle : {
-                get : function() {
-                    if (!when.defined(this._rectangle)) {
-                        this._rectangle = computeRectangle(this._center, this._semiMajorAxis, this._semiMinorAxis, this._rotation, this._granularity, this._ellipsoid);
-                    }
-                    return this._rectangle;
-                }
-            },
-            /**
-             * For remapping texture coordinates when rendering EllipseGeometries as GroundPrimitives.
-             * @private
-             */
-            textureCoordinateRotationPoints : {
-                get : function() {
-                    if (!when.defined(this._textureCoordinateRotationPoints)) {
-                        this._textureCoordinateRotationPoints = textureCoordinateRotationPoints(this);
-                    }
-                    return this._textureCoordinateRotationPoints;
-                }
-            }
-        });
-
-    exports.EllipseGeometry = EllipseGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/EllipseGeometryLibrary-7533a967.js b/public/libs/Cesium/Workers/EllipseGeometryLibrary-7533a967.js
deleted file mode 100644
index 6b0fa75..0000000
--- a/public/libs/Cesium/Workers/EllipseGeometryLibrary-7533a967.js
+++ /dev/null
@@ -1,285 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './Math-61ede240', './Cartographic-fe4be337', './BoundingSphere-775c5788', './Transforms-a1cf7267'], function (exports, _Math, Cartographic, BoundingSphere, Transforms) { 'use strict';
-
-    var EllipseGeometryLibrary = {};
-
-        var rotAxis = new Cartographic.Cartesian3();
-        var tempVec = new Cartographic.Cartesian3();
-        var unitQuat = new Transforms.Quaternion();
-        var rotMtx = new BoundingSphere.Matrix3();
-
-        function pointOnEllipsoid(theta, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, result) {
-            var azimuth = theta + rotation;
-
-            Cartographic.Cartesian3.multiplyByScalar(eastVec, Math.cos(azimuth), rotAxis);
-            Cartographic.Cartesian3.multiplyByScalar(northVec, Math.sin(azimuth), tempVec);
-            Cartographic.Cartesian3.add(rotAxis, tempVec, rotAxis);
-
-            var cosThetaSquared = Math.cos(theta);
-            cosThetaSquared = cosThetaSquared * cosThetaSquared;
-
-            var sinThetaSquared = Math.sin(theta);
-            sinThetaSquared = sinThetaSquared * sinThetaSquared;
-
-            var radius = ab / Math.sqrt(bSqr * cosThetaSquared + aSqr * sinThetaSquared);
-            var angle = radius / mag;
-
-            // Create the quaternion to rotate the position vector to the boundary of the ellipse.
-            Transforms.Quaternion.fromAxisAngle(rotAxis, angle, unitQuat);
-            BoundingSphere.Matrix3.fromQuaternion(unitQuat, rotMtx);
-
-            BoundingSphere.Matrix3.multiplyByVector(rotMtx, unitPos, result);
-            Cartographic.Cartesian3.normalize(result, result);
-            Cartographic.Cartesian3.multiplyByScalar(result, mag, result);
-            return result;
-        }
-
-        var scratchCartesian1 = new Cartographic.Cartesian3();
-        var scratchCartesian2 = new Cartographic.Cartesian3();
-        var scratchCartesian3 = new Cartographic.Cartesian3();
-        var scratchNormal = new Cartographic.Cartesian3();
-        /**
-         * Returns the positions raised to the given heights
-         * @private
-         */
-        EllipseGeometryLibrary.raisePositionsToHeight = function(positions, options, extrude) {
-            var ellipsoid = options.ellipsoid;
-            var height = options.height;
-            var extrudedHeight = options.extrudedHeight;
-            var size = (extrude) ? positions.length / 3 * 2 : positions.length / 3;
-
-            var finalPositions = new Float64Array(size * 3);
-
-            var length = positions.length;
-            var bottomOffset = (extrude) ? length : 0;
-            for (var i = 0; i < length; i += 3) {
-                var i1 = i + 1;
-                var i2 = i + 2;
-
-                var position = Cartographic.Cartesian3.fromArray(positions, i, scratchCartesian1);
-                ellipsoid.scaleToGeodeticSurface(position, position);
-
-                var extrudedPosition = Cartographic.Cartesian3.clone(position, scratchCartesian2);
-                var normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal);
-                var scaledNormal = Cartographic.Cartesian3.multiplyByScalar(normal, height, scratchCartesian3);
-                Cartographic.Cartesian3.add(position, scaledNormal, position);
-
-                if (extrude) {
-                    Cartographic.Cartesian3.multiplyByScalar(normal, extrudedHeight, scaledNormal);
-                    Cartographic.Cartesian3.add(extrudedPosition, scaledNormal, extrudedPosition);
-
-                    finalPositions[i + bottomOffset] = extrudedPosition.x;
-                    finalPositions[i1 + bottomOffset] = extrudedPosition.y;
-                    finalPositions[i2 + bottomOffset] = extrudedPosition.z;
-                }
-
-                finalPositions[i] = position.x;
-                finalPositions[i1] = position.y;
-                finalPositions[i2] = position.z;
-            }
-
-            return finalPositions;
-        };
-
-        var unitPosScratch = new Cartographic.Cartesian3();
-        var eastVecScratch = new Cartographic.Cartesian3();
-        var northVecScratch = new Cartographic.Cartesian3();
-        /**
-         * Returns an array of positions that make up the ellipse.
-         * @private
-         */
-        EllipseGeometryLibrary.computeEllipsePositions = function(options, addFillPositions, addEdgePositions) {
-            var semiMinorAxis = options.semiMinorAxis;
-            var semiMajorAxis = options.semiMajorAxis;
-            var rotation = options.rotation;
-            var center = options.center;
-
-            // Computing the arc-length of the ellipse is too expensive to be practical. Estimating it using the
-            // arc length of the sphere is too inaccurate and creates sharp edges when either the semi-major or
-            // semi-minor axis is much bigger than the other. Instead, scale the angle delta to make
-            // the distance along the ellipse boundary more closely match the granularity.
-            var granularity = options.granularity * 8.0;
-
-            var aSqr = semiMinorAxis * semiMinorAxis;
-            var bSqr = semiMajorAxis * semiMajorAxis;
-            var ab = semiMajorAxis * semiMinorAxis;
-
-            var mag = Cartographic.Cartesian3.magnitude(center);
-
-            var unitPos = Cartographic.Cartesian3.normalize(center, unitPosScratch);
-            var eastVec = Cartographic.Cartesian3.cross(Cartographic.Cartesian3.UNIT_Z, center, eastVecScratch);
-            eastVec = Cartographic.Cartesian3.normalize(eastVec, eastVec);
-            var northVec = Cartographic.Cartesian3.cross(unitPos, eastVec, northVecScratch);
-
-            // The number of points in the first quadrant
-            var numPts = 1 + Math.ceil(_Math.CesiumMath.PI_OVER_TWO / granularity);
-
-            var deltaTheta = _Math.CesiumMath.PI_OVER_TWO / (numPts - 1);
-            var theta = _Math.CesiumMath.PI_OVER_TWO - numPts * deltaTheta;
-            if (theta < 0.0) {
-                numPts -= Math.ceil(Math.abs(theta) / deltaTheta);
-            }
-
-            // If the number of points were three, the ellipse
-            // would be tessellated like below:
-            //
-            //         *---*
-            //       / | \ | \
-            //     *---*---*---*
-            //   / | \ | \ | \ | \
-            //  / .*---*---*---*. \
-            // * ` | \ | \ | \ | `*
-            //  \`.*---*---*---*.`/
-            //   \ | \ | \ | \ | /
-            //     *---*---*---*
-            //       \ | \ | /
-            //         *---*
-            // The first and last column have one position and fan to connect to the adjacent column.
-            // Each other vertical column contains an even number of positions.
-            var size = 2 * (numPts * (numPts + 2));
-            var positions = (addFillPositions) ? new Array(size * 3) : undefined;
-            var positionIndex = 0;
-            var position = scratchCartesian1;
-            var reflectedPosition = scratchCartesian2;
-
-            var outerPositionsLength = (numPts * 4) * 3;
-            var outerRightIndex = outerPositionsLength - 1;
-            var outerLeftIndex = 0;
-            var outerPositions = (addEdgePositions) ? new Array(outerPositionsLength) : undefined;
-
-            var i;
-            var j;
-            var numInterior;
-            var t;
-            var interiorPosition;
-
-            // Compute points in the 'eastern' half of the ellipse
-            theta = _Math.CesiumMath.PI_OVER_TWO;
-            position = pointOnEllipsoid(theta, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, position);
-            if (addFillPositions) {
-                positions[positionIndex++] = position.x;
-                positions[positionIndex++] = position.y;
-                positions[positionIndex++] = position.z;
-            }
-            if (addEdgePositions) {
-                outerPositions[outerRightIndex--] = position.z;
-                outerPositions[outerRightIndex--] = position.y;
-                outerPositions[outerRightIndex--] = position.x;
-            }
-            theta = _Math.CesiumMath.PI_OVER_TWO -  deltaTheta;
-            for (i = 1; i < numPts + 1; ++i) {
-                position = pointOnEllipsoid(theta, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, position);
-                reflectedPosition = pointOnEllipsoid(Math.PI - theta, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, reflectedPosition);
-
-                if (addFillPositions) {
-                    positions[positionIndex++] = position.x;
-                    positions[positionIndex++] = position.y;
-                    positions[positionIndex++] = position.z;
-
-                    numInterior = 2 * i + 2;
-                    for (j = 1; j < numInterior - 1; ++j) {
-                        t = j / (numInterior - 1);
-                        interiorPosition = Cartographic.Cartesian3.lerp(position, reflectedPosition, t, scratchCartesian3);
-                        positions[positionIndex++] = interiorPosition.x;
-                        positions[positionIndex++] = interiorPosition.y;
-                        positions[positionIndex++] = interiorPosition.z;
-                    }
-
-                    positions[positionIndex++] = reflectedPosition.x;
-                    positions[positionIndex++] = reflectedPosition.y;
-                    positions[positionIndex++] = reflectedPosition.z;
-                }
-
-                if (addEdgePositions) {
-                    outerPositions[outerRightIndex--] = position.z;
-                    outerPositions[outerRightIndex--] = position.y;
-                    outerPositions[outerRightIndex--] = position.x;
-                    outerPositions[outerLeftIndex++] = reflectedPosition.x;
-                    outerPositions[outerLeftIndex++] = reflectedPosition.y;
-                    outerPositions[outerLeftIndex++] = reflectedPosition.z;
-                }
-
-                theta = _Math.CesiumMath.PI_OVER_TWO - (i + 1) * deltaTheta;
-            }
-
-            // Compute points in the 'western' half of the ellipse
-            for (i = numPts; i > 1; --i) {
-                theta = _Math.CesiumMath.PI_OVER_TWO - (i - 1) * deltaTheta;
-
-                position = pointOnEllipsoid(-theta, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, position);
-                reflectedPosition = pointOnEllipsoid(theta + Math.PI, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, reflectedPosition);
-
-                if (addFillPositions) {
-                    positions[positionIndex++] = position.x;
-                    positions[positionIndex++] = position.y;
-                    positions[positionIndex++] = position.z;
-
-                    numInterior = 2 * (i - 1) + 2;
-                    for (j = 1; j < numInterior - 1; ++j) {
-                        t = j / (numInterior - 1);
-                        interiorPosition = Cartographic.Cartesian3.lerp(position, reflectedPosition, t, scratchCartesian3);
-                        positions[positionIndex++] = interiorPosition.x;
-                        positions[positionIndex++] = interiorPosition.y;
-                        positions[positionIndex++] = interiorPosition.z;
-                    }
-
-                    positions[positionIndex++] = reflectedPosition.x;
-                    positions[positionIndex++] = reflectedPosition.y;
-                    positions[positionIndex++] = reflectedPosition.z;
-                }
-
-                if (addEdgePositions) {
-                    outerPositions[outerRightIndex--] = position.z;
-                    outerPositions[outerRightIndex--] = position.y;
-                    outerPositions[outerRightIndex--] = position.x;
-                    outerPositions[outerLeftIndex++] = reflectedPosition.x;
-                    outerPositions[outerLeftIndex++] = reflectedPosition.y;
-                    outerPositions[outerLeftIndex++] = reflectedPosition.z;
-                }
-            }
-
-            theta = _Math.CesiumMath.PI_OVER_TWO;
-            position = pointOnEllipsoid(-theta, rotation, northVec, eastVec, aSqr, ab, bSqr, mag, unitPos, position);
-
-            var r = {};
-            if (addFillPositions) {
-                positions[positionIndex++] = position.x;
-                positions[positionIndex++] = position.y;
-                positions[positionIndex++] = position.z;
-                r.positions = positions;
-                r.numPts = numPts;
-            }
-            if (addEdgePositions) {
-                outerPositions[outerRightIndex--] = position.z;
-                outerPositions[outerRightIndex--] = position.y;
-                outerPositions[outerRightIndex--] = position.x;
-                r.outerPositions = outerPositions;
-            }
-
-            return r;
-        };
-
-    exports.EllipseGeometryLibrary = EllipseGeometryLibrary;
-
-});
diff --git a/public/libs/Cesium/Workers/EllipseOutlineGeometry-9a21ac97.js b/public/libs/Cesium/Workers/EllipseOutlineGeometry-9a21ac97.js
deleted file mode 100644
index 834ce11..0000000
--- a/public/libs/Cesium/Workers/EllipseOutlineGeometry-9a21ac97.js
+++ /dev/null
@@ -1,387 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './EllipseGeometryLibrary-7533a967'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, ComponentDatatype, GeometryAttribute, PrimitiveType, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, EllipseGeometryLibrary) { 'use strict';
-
-    var scratchCartesian1 = new Cartographic.Cartesian3();
-        var boundingSphereCenter = new Cartographic.Cartesian3();
-
-        function computeEllipse(options) {
-            var center = options.center;
-            boundingSphereCenter = Cartographic.Cartesian3.multiplyByScalar(options.ellipsoid.geodeticSurfaceNormal(center, boundingSphereCenter), options.height, boundingSphereCenter);
-            boundingSphereCenter = Cartographic.Cartesian3.add(center, boundingSphereCenter, boundingSphereCenter);
-            var boundingSphere = new BoundingSphere.BoundingSphere(boundingSphereCenter, options.semiMajorAxis);
-            var positions = EllipseGeometryLibrary.EllipseGeometryLibrary.computeEllipsePositions(options, false, true).outerPositions;
-
-            var attributes = new GeometryAttributes.GeometryAttributes({
-                position: new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : EllipseGeometryLibrary.EllipseGeometryLibrary.raisePositionsToHeight(positions, options, false)
-                })
-            });
-
-            var length = positions.length / 3;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(length, length * 2);
-            var index = 0;
-            for ( var i = 0; i < length; ++i) {
-                indices[index++] = i;
-                indices[index++] = (i + 1) % length;
-            }
-
-            return {
-                boundingSphere : boundingSphere,
-                attributes : attributes,
-                indices : indices
-            };
-        }
-
-        var topBoundingSphere = new BoundingSphere.BoundingSphere();
-        var bottomBoundingSphere = new BoundingSphere.BoundingSphere();
-        function computeExtrudedEllipse(options) {
-            var center = options.center;
-            var ellipsoid = options.ellipsoid;
-            var semiMajorAxis = options.semiMajorAxis;
-            var scaledNormal = Cartographic.Cartesian3.multiplyByScalar(ellipsoid.geodeticSurfaceNormal(center, scratchCartesian1), options.height, scratchCartesian1);
-            topBoundingSphere.center = Cartographic.Cartesian3.add(center, scaledNormal, topBoundingSphere.center);
-            topBoundingSphere.radius = semiMajorAxis;
-
-            scaledNormal = Cartographic.Cartesian3.multiplyByScalar(ellipsoid.geodeticSurfaceNormal(center, scaledNormal), options.extrudedHeight, scaledNormal);
-            bottomBoundingSphere.center = Cartographic.Cartesian3.add(center, scaledNormal, bottomBoundingSphere.center);
-            bottomBoundingSphere.radius = semiMajorAxis;
-
-            var positions = EllipseGeometryLibrary.EllipseGeometryLibrary.computeEllipsePositions(options, false, true).outerPositions;
-            var attributes = new GeometryAttributes.GeometryAttributes({
-                position: new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : EllipseGeometryLibrary.EllipseGeometryLibrary.raisePositionsToHeight(positions, options, true)
-                })
-            });
-
-            positions = attributes.position.values;
-            var boundingSphere = BoundingSphere.BoundingSphere.union(topBoundingSphere, bottomBoundingSphere);
-            var length = positions.length/3;
-
-            if (when.defined(options.offsetAttribute)) {
-                var applyOffset = new Uint8Array(length);
-                if (options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                    applyOffset = arrayFill.arrayFill(applyOffset, 1, 0, length / 2);
-                } else {
-                    var offsetValue = options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    applyOffset = arrayFill.arrayFill(applyOffset, offsetValue);
-                }
-
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values: applyOffset
-                });
-            }
-
-            var numberOfVerticalLines = when.defaultValue(options.numberOfVerticalLines, 16);
-            numberOfVerticalLines = _Math.CesiumMath.clamp(numberOfVerticalLines, 0, length/2);
-
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(length, length * 2 + numberOfVerticalLines * 2);
-
-            length /= 2;
-            var index = 0;
-            var i;
-            for (i = 0; i < length; ++i) {
-                indices[index++] = i;
-                indices[index++] = (i + 1) % length;
-                indices[index++] = i + length;
-                indices[index++] = ((i + 1) % length) + length;
-            }
-
-            var numSide;
-            if (numberOfVerticalLines > 0) {
-                var numSideLines = Math.min(numberOfVerticalLines, length);
-                numSide = Math.round(length / numSideLines);
-
-                var maxI = Math.min(numSide * numberOfVerticalLines, length);
-                for (i = 0; i < maxI; i += numSide) {
-                    indices[index++] = i;
-                    indices[index++] = i + length;
-                }
-            }
-
-            return {
-                boundingSphere : boundingSphere,
-                attributes : attributes,
-                indices : indices
-            };
-        }
-
-        /**
-         * A description of the outline of an ellipse on an ellipsoid.
-         *
-         * @alias EllipseOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3} options.center The ellipse's center point in the fixed frame.
-         * @param {Number} options.semiMajorAxis The length of the ellipse's semi-major axis in meters.
-         * @param {Number} options.semiMinorAxis The length of the ellipse's semi-minor axis in meters.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid the ellipse will be on.
-         * @param {Number} [options.height=0.0] The distance in meters between the ellipse and the ellipsoid surface.
-         * @param {Number} [options.extrudedHeight] The distance in meters between the ellipse's extruded face and the ellipsoid surface.
-         * @param {Number} [options.rotation=0.0] The angle from north (counter-clockwise) in radians.
-         * @param {Number} [options.granularity=0.02] The angular distance between points on the ellipse in radians.
-         * @param {Number} [options.numberOfVerticalLines=16] Number of lines to draw between the top and bottom surface of an extruded ellipse.
-         *
-         * @exception {DeveloperError} semiMajorAxis and semiMinorAxis must be greater than zero.
-         * @exception {DeveloperError} semiMajorAxis must be greater than or equal to the semiMinorAxis.
-         * @exception {DeveloperError} granularity must be greater than zero.
-         *
-         * @see EllipseOutlineGeometry.createGeometry
-         *
-         * @example
-         * var ellipse = new Cesium.EllipseOutlineGeometry({
-         *   center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
-         *   semiMajorAxis : 500000.0,
-         *   semiMinorAxis : 300000.0,
-         *   rotation : Cesium.Math.toRadians(60.0)
-         * });
-         * var geometry = Cesium.EllipseOutlineGeometry.createGeometry(ellipse);
-         */
-        function EllipseOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var center = options.center;
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var semiMajorAxis = options.semiMajorAxis;
-            var semiMinorAxis = options.semiMinorAxis;
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(center)) {
-                throw new Check.DeveloperError('center is required.');
-            }
-            if (!when.defined(semiMajorAxis)) {
-                throw new Check.DeveloperError('semiMajorAxis is required.');
-            }
-            if (!when.defined(semiMinorAxis)) {
-                throw new Check.DeveloperError('semiMinorAxis is required.');
-            }
-            if (semiMajorAxis < semiMinorAxis) {
-                throw new Check.DeveloperError('semiMajorAxis must be greater than or equal to the semiMinorAxis.');
-            }
-            if (granularity <= 0.0) {
-                throw new Check.DeveloperError('granularity must be greater than zero.');
-            }
-            //>>includeEnd('debug');
-
-            var height = when.defaultValue(options.height, 0.0);
-            var extrudedHeight = when.defaultValue(options.extrudedHeight, height);
-
-            this._center = Cartographic.Cartesian3.clone(center);
-            this._semiMajorAxis = semiMajorAxis;
-            this._semiMinorAxis = semiMinorAxis;
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid);
-            this._rotation = when.defaultValue(options.rotation, 0.0);
-            this._height = Math.max(extrudedHeight, height);
-            this._granularity = granularity;
-            this._extrudedHeight = Math.min(extrudedHeight, height);
-            this._numberOfVerticalLines = Math.max(when.defaultValue(options.numberOfVerticalLines, 16), 0);
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createEllipseOutlineGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        EllipseOutlineGeometry.packedLength = Cartographic.Cartesian3.packedLength + Cartesian2.Ellipsoid.packedLength + 8;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {EllipseOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        EllipseOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            Cartographic.Cartesian3.pack(value._center, array, startingIndex);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            array[startingIndex++] = value._semiMajorAxis;
-            array[startingIndex++] = value._semiMinorAxis;
-            array[startingIndex++] = value._rotation;
-            array[startingIndex++] = value._height;
-            array[startingIndex++] = value._granularity;
-            array[startingIndex++] = value._extrudedHeight;
-            array[startingIndex++]   = value._numberOfVerticalLines;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchCenter = new Cartographic.Cartesian3();
-        var scratchEllipsoid = new Cartesian2.Ellipsoid();
-        var scratchOptions = {
-            center : scratchCenter,
-            ellipsoid : scratchEllipsoid,
-            semiMajorAxis : undefined,
-            semiMinorAxis : undefined,
-            rotation : undefined,
-            height : undefined,
-            granularity : undefined,
-            extrudedHeight : undefined,
-            numberOfVerticalLines : undefined,
-            offsetAttribute: undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {EllipseOutlineGeometry} [result] The object into which to store the result.
-         * @returns {EllipseOutlineGeometry} The modified result parameter or a new EllipseOutlineGeometry instance if one was not provided.
-         */
-        EllipseOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var center = Cartographic.Cartesian3.unpack(array, startingIndex, scratchCenter);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var semiMajorAxis = array[startingIndex++];
-            var semiMinorAxis = array[startingIndex++];
-            var rotation = array[startingIndex++];
-            var height = array[startingIndex++];
-            var granularity = array[startingIndex++];
-            var extrudedHeight = array[startingIndex++];
-            var numberOfVerticalLines = array[startingIndex++];
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.height = height;
-                scratchOptions.extrudedHeight = extrudedHeight;
-                scratchOptions.granularity = granularity;
-                scratchOptions.rotation = rotation;
-                scratchOptions.semiMajorAxis = semiMajorAxis;
-                scratchOptions.semiMinorAxis = semiMinorAxis;
-                scratchOptions.numberOfVerticalLines = numberOfVerticalLines;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-                return new EllipseOutlineGeometry(scratchOptions);
-            }
-
-            result._center = Cartographic.Cartesian3.clone(center, result._center);
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._semiMajorAxis = semiMajorAxis;
-            result._semiMinorAxis = semiMinorAxis;
-            result._rotation = rotation;
-            result._height = height;
-            result._granularity = granularity;
-            result._extrudedHeight = extrudedHeight;
-            result._numberOfVerticalLines = numberOfVerticalLines;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of an outline of an ellipse on an ellipsoid, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {EllipseOutlineGeometry} ellipseGeometry A description of the ellipse.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        EllipseOutlineGeometry.createGeometry = function(ellipseGeometry) {
-            if ((ellipseGeometry._semiMajorAxis <= 0.0) || (ellipseGeometry._semiMinorAxis <= 0.0)) {
-                return;
-            }
-
-            var height = ellipseGeometry._height;
-            var extrudedHeight = ellipseGeometry._extrudedHeight;
-            var extrude = !_Math.CesiumMath.equalsEpsilon(height, extrudedHeight, 0, _Math.CesiumMath.EPSILON2);
-
-            ellipseGeometry._center = ellipseGeometry._ellipsoid.scaleToGeodeticSurface(ellipseGeometry._center, ellipseGeometry._center);
-            var options = {
-                center : ellipseGeometry._center,
-                semiMajorAxis : ellipseGeometry._semiMajorAxis,
-                semiMinorAxis : ellipseGeometry._semiMinorAxis,
-                ellipsoid : ellipseGeometry._ellipsoid,
-                rotation : ellipseGeometry._rotation,
-                height : height,
-                granularity : ellipseGeometry._granularity,
-                numberOfVerticalLines : ellipseGeometry._numberOfVerticalLines
-            };
-            var geometry;
-            if (extrude) {
-                options.extrudedHeight = extrudedHeight;
-                options.offsetAttribute = ellipseGeometry._offsetAttribute;
-                geometry = computeExtrudedEllipse(options);
-            } else {
-                geometry = computeEllipse(options);
-
-                if (when.defined(ellipseGeometry._offsetAttribute)) {
-                    var length = geometry.attributes.position.values.length;
-                    var applyOffset = new Uint8Array(length / 3);
-                    var offsetValue = ellipseGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    arrayFill.arrayFill(applyOffset, offsetValue);
-                    geometry.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        componentsPerAttribute : 1,
-                        values: applyOffset
-                    });
-                }
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : geometry.attributes,
-                indices : geometry.indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : geometry.boundingSphere,
-                offsetAttribute : ellipseGeometry._offsetAttribute
-            });
-        };
-
-    exports.EllipseOutlineGeometry = EllipseOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/EllipsoidGeodesic-84507801.js b/public/libs/Cesium/Workers/EllipsoidGeodesic-84507801.js
deleted file mode 100644
index 1d08c2f..0000000
--- a/public/libs/Cesium/Workers/EllipsoidGeodesic-84507801.js
+++ /dev/null
@@ -1,413 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09'], function (exports, when, Check, _Math, Cartographic, Cartesian2) { 'use strict';
-
-    function setConstants(ellipsoidGeodesic) {
-            var uSquared = ellipsoidGeodesic._uSquared;
-            var a = ellipsoidGeodesic._ellipsoid.maximumRadius;
-            var b = ellipsoidGeodesic._ellipsoid.minimumRadius;
-            var f = (a - b) / a;
-
-            var cosineHeading = Math.cos(ellipsoidGeodesic._startHeading);
-            var sineHeading = Math.sin(ellipsoidGeodesic._startHeading);
-
-            var tanU = (1 - f) * Math.tan(ellipsoidGeodesic._start.latitude);
-
-            var cosineU = 1.0 / Math.sqrt(1.0 + tanU * tanU);
-            var sineU = cosineU * tanU;
-
-            var sigma = Math.atan2(tanU, cosineHeading);
-
-            var sineAlpha = cosineU * sineHeading;
-            var sineSquaredAlpha = sineAlpha * sineAlpha;
-
-            var cosineSquaredAlpha = 1.0 - sineSquaredAlpha;
-            var cosineAlpha = Math.sqrt(cosineSquaredAlpha);
-
-            var u2Over4 = uSquared / 4.0;
-            var u4Over16 = u2Over4 * u2Over4;
-            var u6Over64 = u4Over16 * u2Over4;
-            var u8Over256 = u4Over16 * u4Over16;
-
-            var a0 = (1.0 + u2Over4 - 3.0 * u4Over16 / 4.0 + 5.0 * u6Over64 / 4.0 - 175.0 * u8Over256 / 64.0);
-            var a1 = (1.0 - u2Over4 + 15.0 * u4Over16 / 8.0 - 35.0 * u6Over64 / 8.0);
-            var a2 = (1.0 - 3.0 * u2Over4 + 35.0 * u4Over16 / 4.0);
-            var a3 = (1.0 - 5.0 * u2Over4);
-
-            var distanceRatio = a0 * sigma - a1 * Math.sin(2.0 * sigma) * u2Over4 / 2.0 - a2 * Math.sin(4.0 * sigma) * u4Over16 / 16.0 -
-                                a3 * Math.sin(6.0 * sigma) * u6Over64 / 48.0 - Math.sin(8.0 * sigma) * 5.0 * u8Over256 / 512;
-
-            var constants = ellipsoidGeodesic._constants;
-
-            constants.a = a;
-            constants.b = b;
-            constants.f = f;
-            constants.cosineHeading = cosineHeading;
-            constants.sineHeading = sineHeading;
-            constants.tanU = tanU;
-            constants.cosineU = cosineU;
-            constants.sineU = sineU;
-            constants.sigma = sigma;
-            constants.sineAlpha = sineAlpha;
-            constants.sineSquaredAlpha = sineSquaredAlpha;
-            constants.cosineSquaredAlpha = cosineSquaredAlpha;
-            constants.cosineAlpha = cosineAlpha;
-            constants.u2Over4 = u2Over4;
-            constants.u4Over16 = u4Over16;
-            constants.u6Over64 = u6Over64;
-            constants.u8Over256 = u8Over256;
-            constants.a0 = a0;
-            constants.a1 = a1;
-            constants.a2 = a2;
-            constants.a3 = a3;
-            constants.distanceRatio = distanceRatio;
-        }
-
-        function computeC(f, cosineSquaredAlpha) {
-            return f * cosineSquaredAlpha * (4.0 + f * (4.0 - 3.0 * cosineSquaredAlpha)) / 16.0;
-        }
-
-        function computeDeltaLambda(f, sineAlpha, cosineSquaredAlpha, sigma, sineSigma, cosineSigma, cosineTwiceSigmaMidpoint) {
-            var C = computeC(f, cosineSquaredAlpha);
-
-            return (1.0 - C) * f * sineAlpha * (sigma + C * sineSigma * (cosineTwiceSigmaMidpoint +
-                    C * cosineSigma * (2.0 * cosineTwiceSigmaMidpoint * cosineTwiceSigmaMidpoint - 1.0)));
-        }
-
-        function vincentyInverseFormula(ellipsoidGeodesic, major, minor, firstLongitude, firstLatitude, secondLongitude, secondLatitude) {
-            var eff = (major - minor) / major;
-            var l = secondLongitude - firstLongitude;
-
-            var u1 = Math.atan((1 - eff) * Math.tan(firstLatitude));
-            var u2 = Math.atan((1 - eff) * Math.tan(secondLatitude));
-
-            var cosineU1 = Math.cos(u1);
-            var sineU1 = Math.sin(u1);
-            var cosineU2 = Math.cos(u2);
-            var sineU2 = Math.sin(u2);
-
-            var cc = cosineU1 * cosineU2;
-            var cs = cosineU1 * sineU2;
-            var ss = sineU1 * sineU2;
-            var sc = sineU1 * cosineU2;
-
-            var lambda = l;
-            var lambdaDot = _Math.CesiumMath.TWO_PI;
-
-            var cosineLambda = Math.cos(lambda);
-            var sineLambda = Math.sin(lambda);
-
-            var sigma;
-            var cosineSigma;
-            var sineSigma;
-            var cosineSquaredAlpha;
-            var cosineTwiceSigmaMidpoint;
-
-            do {
-                cosineLambda = Math.cos(lambda);
-                sineLambda = Math.sin(lambda);
-
-                var temp = cs - sc * cosineLambda;
-                sineSigma = Math.sqrt(cosineU2 * cosineU2 * sineLambda * sineLambda + temp * temp);
-                cosineSigma = ss + cc * cosineLambda;
-
-                sigma = Math.atan2(sineSigma, cosineSigma);
-
-                var sineAlpha;
-
-                if (sineSigma === 0.0) {
-                    sineAlpha = 0.0;
-                    cosineSquaredAlpha = 1.0;
-                } else {
-                    sineAlpha = cc * sineLambda / sineSigma;
-                    cosineSquaredAlpha = 1.0 - sineAlpha * sineAlpha;
-                }
-
-                lambdaDot = lambda;
-
-                cosineTwiceSigmaMidpoint = cosineSigma - 2.0 * ss / cosineSquaredAlpha;
-
-                if (isNaN(cosineTwiceSigmaMidpoint)) {
-                    cosineTwiceSigmaMidpoint = 0.0;
-                }
-
-                lambda = l + computeDeltaLambda(eff, sineAlpha, cosineSquaredAlpha,
-                                                sigma, sineSigma, cosineSigma, cosineTwiceSigmaMidpoint);
-            } while (Math.abs(lambda - lambdaDot) > _Math.CesiumMath.EPSILON12);
-
-            var uSquared = cosineSquaredAlpha * (major * major - minor * minor) / (minor * minor);
-            var A = 1.0 + uSquared * (4096.0 + uSquared * (uSquared * (320.0 - 175.0 * uSquared) - 768.0)) / 16384.0;
-            var B = uSquared * (256.0 + uSquared * (uSquared * (74.0 - 47.0 * uSquared) - 128.0)) / 1024.0;
-
-            var cosineSquaredTwiceSigmaMidpoint = cosineTwiceSigmaMidpoint * cosineTwiceSigmaMidpoint;
-            var deltaSigma = B * sineSigma * (cosineTwiceSigmaMidpoint + B * (cosineSigma *
-                    (2.0 * cosineSquaredTwiceSigmaMidpoint - 1.0) - B * cosineTwiceSigmaMidpoint *
-                    (4.0 * sineSigma * sineSigma - 3.0) * (4.0 * cosineSquaredTwiceSigmaMidpoint - 3.0) / 6.0) / 4.0);
-
-            var distance = minor * A * (sigma - deltaSigma);
-
-            var startHeading = Math.atan2(cosineU2 * sineLambda, cs - sc * cosineLambda);
-            var endHeading = Math.atan2(cosineU1 * sineLambda, cs * cosineLambda - sc);
-
-            ellipsoidGeodesic._distance = distance;
-            ellipsoidGeodesic._startHeading = startHeading;
-            ellipsoidGeodesic._endHeading = endHeading;
-            ellipsoidGeodesic._uSquared = uSquared;
-        }
-
-        var scratchCart1 = new Cartographic.Cartesian3();
-        var scratchCart2 = new Cartographic.Cartesian3();
-        function computeProperties(ellipsoidGeodesic, start, end, ellipsoid) {
-            var firstCartesian = Cartographic.Cartesian3.normalize(ellipsoid.cartographicToCartesian(start, scratchCart2), scratchCart1);
-            var lastCartesian = Cartographic.Cartesian3.normalize(ellipsoid.cartographicToCartesian(end, scratchCart2), scratchCart2);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number.greaterThanOrEquals('value', Math.abs(Math.abs(Cartographic.Cartesian3.angleBetween(firstCartesian, lastCartesian)) - Math.PI), 0.0125);
-            //>>includeEnd('debug');
-
-            vincentyInverseFormula(ellipsoidGeodesic, ellipsoid.maximumRadius, ellipsoid.minimumRadius,
-                                   start.longitude, start.latitude, end.longitude, end.latitude);
-
-            ellipsoidGeodesic._start = Cartographic.Cartographic.clone(start, ellipsoidGeodesic._start);
-            ellipsoidGeodesic._end = Cartographic.Cartographic.clone(end, ellipsoidGeodesic._end);
-            ellipsoidGeodesic._start.height = 0;
-            ellipsoidGeodesic._end.height = 0;
-
-            setConstants(ellipsoidGeodesic);
-        }
-
-        /**
-         * Initializes a geodesic on the ellipsoid connecting the two provided planetodetic points.
-         *
-         * @alias EllipsoidGeodesic
-         * @constructor
-         *
-         * @param {Cartographic} [start] The initial planetodetic point on the path.
-         * @param {Cartographic} [end] The final planetodetic point on the path.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the geodesic lies.
-         */
-        function EllipsoidGeodesic(start, end, ellipsoid) {
-            var e = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            this._ellipsoid = e;
-            this._start = new Cartographic.Cartographic();
-            this._end = new Cartographic.Cartographic();
-
-            this._constants = {};
-            this._startHeading = undefined;
-            this._endHeading = undefined;
-            this._distance = undefined;
-            this._uSquared = undefined;
-
-            if (when.defined(start) && when.defined(end)) {
-                computeProperties(this, start, end, e);
-            }
-        }
-
-        Object.defineProperties(EllipsoidGeodesic.prototype, {
-            /**
-             * Gets the ellipsoid.
-             * @memberof EllipsoidGeodesic.prototype
-             * @type {Ellipsoid}
-             * @readonly
-             */
-            ellipsoid : {
-                get : function() {
-                    return this._ellipsoid;
-                }
-            },
-
-            /**
-             * Gets the surface distance between the start and end point
-             * @memberof EllipsoidGeodesic.prototype
-             * @type {Number}
-             * @readonly
-             */
-            surfaceDistance : {
-                get : function() {
-                    //>>includeStart('debug', pragmas.debug);
-                    Check.Check.defined('distance', this._distance);
-                    //>>includeEnd('debug');
-
-                    return this._distance;
-                }
-            },
-
-            /**
-             * Gets the initial planetodetic point on the path.
-             * @memberof EllipsoidGeodesic.prototype
-             * @type {Cartographic}
-             * @readonly
-             */
-            start : {
-                get : function() {
-                    return this._start;
-                }
-            },
-
-            /**
-             * Gets the final planetodetic point on the path.
-             * @memberof EllipsoidGeodesic.prototype
-             * @type {Cartographic}
-             * @readonly
-             */
-            end : {
-                get : function() {
-                    return this._end;
-                }
-            },
-
-            /**
-             * Gets the heading at the initial point.
-             * @memberof EllipsoidGeodesic.prototype
-             * @type {Number}
-             * @readonly
-             */
-            startHeading : {
-                get : function() {
-                    //>>includeStart('debug', pragmas.debug);
-                    Check.Check.defined('distance', this._distance);
-                    //>>includeEnd('debug');
-
-                    return this._startHeading;
-                }
-            },
-
-            /**
-             * Gets the heading at the final point.
-             * @memberof EllipsoidGeodesic.prototype
-             * @type {Number}
-             * @readonly
-             */
-            endHeading : {
-                get : function() {
-                    //>>includeStart('debug', pragmas.debug);
-                    Check.Check.defined('distance', this._distance);
-                    //>>includeEnd('debug');
-
-                    return this._endHeading;
-                }
-            }
-        });
-
-        /**
-         * Sets the start and end points of the geodesic
-         *
-         * @param {Cartographic} start The initial planetodetic point on the path.
-         * @param {Cartographic} end The final planetodetic point on the path.
-         */
-        EllipsoidGeodesic.prototype.setEndPoints = function(start, end) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('start', start);
-            Check.Check.defined('end', end);
-            //>>includeEnd('debug');
-
-            computeProperties(this, start, end, this._ellipsoid);
-        };
-
-        /**
-         * Provides the location of a point at the indicated portion along the geodesic.
-         *
-         * @param {Number} fraction The portion of the distance between the initial and final points.
-         * @param {Cartographic} result The object in which to store the result.
-         * @returns {Cartographic} The location of the point along the geodesic.
-         */
-        EllipsoidGeodesic.prototype.interpolateUsingFraction = function(fraction, result) {
-            return this.interpolateUsingSurfaceDistance(this._distance * fraction, result);
-        };
-
-        /**
-         * Provides the location of a point at the indicated distance along the geodesic.
-         *
-         * @param {Number} distance The distance from the inital point to the point of interest along the geodesic
-         * @param {Cartographic} result The object in which to store the result.
-         * @returns {Cartographic} The location of the point along the geodesic.
-         *
-         * @exception {DeveloperError} start and end must be set before calling function interpolateUsingSurfaceDistance
-         */
-        EllipsoidGeodesic.prototype.interpolateUsingSurfaceDistance = function(distance, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('distance', this._distance);
-            //>>includeEnd('debug');
-
-            var constants = this._constants;
-
-            var s = constants.distanceRatio + distance / constants.b;
-
-            var cosine2S = Math.cos(2.0 * s);
-            var cosine4S = Math.cos(4.0 * s);
-            var cosine6S = Math.cos(6.0 * s);
-            var sine2S = Math.sin(2.0 * s);
-            var sine4S = Math.sin(4.0 * s);
-            var sine6S = Math.sin(6.0 * s);
-            var sine8S = Math.sin(8.0 * s);
-
-            var s2 = s * s;
-            var s3 = s * s2;
-
-            var u8Over256 = constants.u8Over256;
-            var u2Over4 = constants.u2Over4;
-            var u6Over64 = constants.u6Over64;
-            var u4Over16 = constants.u4Over16;
-            var sigma = 2.0 * s3 * u8Over256 * cosine2S / 3.0 +
-                s * (1.0 - u2Over4 + 7.0 * u4Over16 / 4.0 - 15.0 * u6Over64 / 4.0 + 579.0 * u8Over256 / 64.0 -
-                (u4Over16 - 15.0 * u6Over64 / 4.0 + 187.0 * u8Over256 / 16.0) * cosine2S -
-                (5.0 * u6Over64 / 4.0 - 115.0 * u8Over256 / 16.0) * cosine4S -
-                29.0 * u8Over256 * cosine6S / 16.0) +
-                (u2Over4 / 2.0 - u4Over16 + 71.0 * u6Over64 / 32.0 - 85.0 * u8Over256 / 16.0) * sine2S +
-                (5.0 * u4Over16 / 16.0 - 5.0 * u6Over64 / 4.0 + 383.0 * u8Over256 / 96.0) * sine4S -
-                s2 * ((u6Over64 - 11.0 * u8Over256 / 2.0) * sine2S + 5.0 * u8Over256 * sine4S / 2.0) +
-                (29.0 * u6Over64 / 96.0 - 29.0 * u8Over256 / 16.0) * sine6S +
-                539.0 * u8Over256 * sine8S / 1536.0;
-
-            var theta = Math.asin(Math.sin(sigma) * constants.cosineAlpha);
-            var latitude = Math.atan(constants.a / constants.b * Math.tan(theta));
-
-            // Redefine in terms of relative argument of latitude.
-            sigma = sigma - constants.sigma;
-
-            var cosineTwiceSigmaMidpoint = Math.cos(2.0 * constants.sigma + sigma);
-
-            var sineSigma = Math.sin(sigma);
-            var cosineSigma = Math.cos(sigma);
-
-            var cc = constants.cosineU * cosineSigma;
-            var ss = constants.sineU * sineSigma;
-
-            var lambda = Math.atan2(sineSigma * constants.sineHeading, cc - ss * constants.cosineHeading);
-
-            var l = lambda - computeDeltaLambda(constants.f, constants.sineAlpha, constants.cosineSquaredAlpha,
-                                                sigma, sineSigma, cosineSigma, cosineTwiceSigmaMidpoint);
-
-            if (when.defined(result)) {
-                result.longitude = this._start.longitude + l;
-                result.latitude = latitude;
-                result.height = 0.0;
-                return result;
-            }
-
-            return new Cartographic.Cartographic(this._start.longitude + l, latitude, 0.0);
-        };
-
-    exports.EllipsoidGeodesic = EllipsoidGeodesic;
-
-});
diff --git a/public/libs/Cesium/Workers/EllipsoidGeometry-833b1e19.js b/public/libs/Cesium/Workers/EllipsoidGeometry-833b1e19.js
deleted file mode 100644
index 1e3942b..0000000
--- a/public/libs/Cesium/Workers/EllipsoidGeometry-833b1e19.js
+++ /dev/null
@@ -1,611 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, ComponentDatatype, GeometryAttribute, PrimitiveType, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, VertexFormat) { 'use strict';
-
-    var scratchPosition = new Cartographic.Cartesian3();
-        var scratchNormal = new Cartographic.Cartesian3();
-        var scratchTangent = new Cartographic.Cartesian3();
-        var scratchBitangent = new Cartographic.Cartesian3();
-        var scratchNormalST = new Cartographic.Cartesian3();
-        var defaultRadii = new Cartographic.Cartesian3(1.0, 1.0, 1.0);
-
-        var cos = Math.cos;
-        var sin = Math.sin;
-
-        /**
-         * A description of an ellipsoid centered at the origin.
-         *
-         * @alias EllipsoidGeometry
-         * @constructor
-         *
-         * @param {Object} [options] Object with the following properties:
-         * @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
-         * @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
-         * @param {Number} [options.minimumClock=0.0] The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
-         * @param {Number} [options.maximumClock=2*PI] The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
-         * @param {Number} [options.minimumCone=0.0] The minimum angle measured from the positive z-axis and toward the negative z-axis.
-         * @param {Number} [options.maximumCone=PI] The maximum angle measured from the positive z-axis and toward the negative z-axis.
-         * @param {Number} [options.stackPartitions=64] The number of times to partition the ellipsoid into stacks.
-         * @param {Number} [options.slicePartitions=64] The number of times to partition the ellipsoid into radial slices.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         *
-         * @exception {DeveloperError} options.slicePartitions cannot be less than three.
-         * @exception {DeveloperError} options.stackPartitions cannot be less than three.
-         *
-         * @see EllipsoidGeometry#createGeometry
-         *
-         * @example
-         * var ellipsoid = new Cesium.EllipsoidGeometry({
-         *   vertexFormat : Cesium.VertexFormat.POSITION_ONLY,
-         *   radii : new Cesium.Cartesian3(1000000.0, 500000.0, 500000.0)
-         * });
-         * var geometry = Cesium.EllipsoidGeometry.createGeometry(ellipsoid);
-         */
-        function EllipsoidGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var radii = when.defaultValue(options.radii, defaultRadii);
-            var innerRadii = when.defaultValue(options.innerRadii, radii);
-            var minimumClock = when.defaultValue(options.minimumClock, 0.0);
-            var maximumClock = when.defaultValue(options.maximumClock, _Math.CesiumMath.TWO_PI);
-            var minimumCone = when.defaultValue(options.minimumCone, 0.0);
-            var maximumCone = when.defaultValue(options.maximumCone, _Math.CesiumMath.PI);
-            var stackPartitions = Math.round(when.defaultValue(options.stackPartitions, 64));
-            var slicePartitions = Math.round(when.defaultValue(options.slicePartitions, 64));
-            var vertexFormat = when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (slicePartitions < 3) {
-                throw new Check.DeveloperError('options.slicePartitions cannot be less than three.');
-            }
-            if (stackPartitions < 3) {
-                throw new Check.DeveloperError('options.stackPartitions cannot be less than three.');
-            }
-            //>>includeEnd('debug');
-
-            this._radii = Cartographic.Cartesian3.clone(radii);
-            this._innerRadii = Cartographic.Cartesian3.clone(innerRadii);
-            this._minimumClock = minimumClock;
-            this._maximumClock = maximumClock;
-            this._minimumCone = minimumCone;
-            this._maximumCone = maximumCone;
-            this._stackPartitions = stackPartitions;
-            this._slicePartitions = slicePartitions;
-            this._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat);
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createEllipsoidGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        EllipsoidGeometry.packedLength = 2 * (Cartographic.Cartesian3.packedLength) + VertexFormat.VertexFormat.packedLength + 7;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {EllipsoidGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        EllipsoidGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            Cartographic.Cartesian3.pack(value._radii, array, startingIndex);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            Cartographic.Cartesian3.pack(value._innerRadii, array, startingIndex);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._minimumClock;
-            array[startingIndex++] = value._maximumClock;
-            array[startingIndex++] = value._minimumCone;
-            array[startingIndex++] = value._maximumCone;
-            array[startingIndex++] = value._stackPartitions;
-            array[startingIndex++] = value._slicePartitions;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchRadii = new Cartographic.Cartesian3();
-        var scratchInnerRadii = new Cartographic.Cartesian3();
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            radii : scratchRadii,
-            innerRadii : scratchInnerRadii,
-            vertexFormat : scratchVertexFormat,
-            minimumClock : undefined,
-            maximumClock : undefined,
-            minimumCone : undefined,
-            maximumCone : undefined,
-            stackPartitions : undefined,
-            slicePartitions : undefined,
-            offsetAttribute : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {EllipsoidGeometry} [result] The object into which to store the result.
-         * @returns {EllipsoidGeometry} The modified result parameter or a new EllipsoidGeometry instance if one was not provided.
-         */
-        EllipsoidGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var radii = Cartographic.Cartesian3.unpack(array, startingIndex, scratchRadii);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            var innerRadii = Cartographic.Cartesian3.unpack(array, startingIndex, scratchInnerRadii);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var minimumClock = array[startingIndex++];
-            var maximumClock = array[startingIndex++];
-            var minimumCone = array[startingIndex++];
-            var maximumCone = array[startingIndex++];
-            var stackPartitions = array[startingIndex++];
-            var slicePartitions = array[startingIndex++];
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.minimumClock = minimumClock;
-                scratchOptions.maximumClock = maximumClock;
-                scratchOptions.minimumCone = minimumCone;
-                scratchOptions.maximumCone = maximumCone;
-                scratchOptions.stackPartitions = stackPartitions;
-                scratchOptions.slicePartitions = slicePartitions;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-                return new EllipsoidGeometry(scratchOptions);
-            }
-
-            result._radii = Cartographic.Cartesian3.clone(radii, result._radii);
-            result._innerRadii = Cartographic.Cartesian3.clone(innerRadii, result._innerRadii);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._minimumClock = minimumClock;
-            result._maximumClock = maximumClock;
-            result._minimumCone = minimumCone;
-            result._maximumCone = maximumCone;
-            result._stackPartitions = stackPartitions;
-            result._slicePartitions = slicePartitions;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of an ellipsoid, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {EllipsoidGeometry} ellipsoidGeometry A description of the ellipsoid.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        EllipsoidGeometry.createGeometry = function(ellipsoidGeometry) {
-            var radii = ellipsoidGeometry._radii;
-            if ((radii.x <= 0) || (radii.y <= 0) || (radii.z <= 0)) {
-                return;
-            }
-
-            var innerRadii = ellipsoidGeometry._innerRadii;
-            if ((innerRadii.x <= 0) || (innerRadii.y <= 0) || innerRadii.z <= 0) {
-                return;
-            }
-
-            var minimumClock = ellipsoidGeometry._minimumClock;
-            var maximumClock = ellipsoidGeometry._maximumClock;
-            var minimumCone = ellipsoidGeometry._minimumCone;
-            var maximumCone = ellipsoidGeometry._maximumCone;
-            var vertexFormat = ellipsoidGeometry._vertexFormat;
-
-            // Add an extra slice and stack so that the number of partitions is the
-            // number of surfaces rather than the number of joints
-            var slicePartitions = ellipsoidGeometry._slicePartitions + 1;
-            var stackPartitions = ellipsoidGeometry._stackPartitions + 1;
-
-            slicePartitions = Math.round(slicePartitions * Math.abs(maximumClock - minimumClock) / _Math.CesiumMath.TWO_PI);
-            stackPartitions = Math.round(stackPartitions * Math.abs(maximumCone - minimumCone) / _Math.CesiumMath.PI);
-
-            if (slicePartitions < 2) {
-                slicePartitions = 2;
-            }
-            if (stackPartitions < 2) {
-                stackPartitions = 2;
-            }
-
-            var i;
-            var j;
-            var index = 0;
-
-            // Create arrays for theta and phi. Duplicate first and last angle to
-            // allow different normals at the intersections.
-            var phis = [minimumCone];
-            var thetas = [minimumClock];
-            for (i = 0; i < stackPartitions; i++) {
-                phis.push(minimumCone + i * (maximumCone - minimumCone) / (stackPartitions - 1));
-            }
-            phis.push(maximumCone);
-            for (j = 0; j < slicePartitions; j++) {
-                thetas.push(minimumClock + j * (maximumClock - minimumClock) / (slicePartitions - 1));
-            }
-            thetas.push(maximumClock);
-            var numPhis = phis.length;
-            var numThetas = thetas.length;
-
-            // Allow for extra indices if there is an inner surface and if we need
-            // to close the sides if the clock range is not a full circle
-            var extraIndices = 0;
-            var vertexMultiplier = 1.0;
-            var hasInnerSurface = ((innerRadii.x !== radii.x) || (innerRadii.y !== radii.y) || innerRadii.z !== radii.z);
-            var isTopOpen = false;
-            var isBotOpen = false;
-            var isClockOpen = false;
-            if (hasInnerSurface) {
-                vertexMultiplier = 2.0;
-                if (minimumCone > 0.0) {
-                    isTopOpen = true;
-                    extraIndices += (slicePartitions - 1);
-                }
-                if (maximumCone < Math.PI) {
-                    isBotOpen = true;
-                    extraIndices += (slicePartitions - 1);
-                }
-                if ((maximumClock - minimumClock) % _Math.CesiumMath.TWO_PI) {
-                    isClockOpen = true;
-                    extraIndices += ((stackPartitions - 1) * 2) + 1;
-                } else {
-                    extraIndices += 1;
-                }
-            }
-
-            var vertexCount = numThetas * numPhis * vertexMultiplier;
-            var positions = new Float64Array(vertexCount * 3);
-            var isInner = arrayFill.arrayFill(new Array(vertexCount), false);
-            var negateNormal = arrayFill.arrayFill(new Array(vertexCount), false);
-
-            // Multiply by 6 because there are two triangles per sector
-            var indexCount = slicePartitions * stackPartitions * vertexMultiplier;
-            var numIndices = 6 * (indexCount + extraIndices + 1 - (slicePartitions + stackPartitions) * vertexMultiplier);
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(indexCount, numIndices);
-
-            var normals = (vertexFormat.normal) ? new Float32Array(vertexCount * 3) : undefined;
-            var tangents = (vertexFormat.tangent) ? new Float32Array(vertexCount * 3) : undefined;
-            var bitangents = (vertexFormat.bitangent) ? new Float32Array(vertexCount * 3) : undefined;
-            var st = (vertexFormat.st) ? new Float32Array(vertexCount * 2) : undefined;
-
-            // Calculate sin/cos phi
-            var sinPhi = new Array(numPhis);
-            var cosPhi = new Array(numPhis);
-            for (i = 0; i < numPhis; i++) {
-                sinPhi[i] = sin(phis[i]);
-                cosPhi[i] = cos(phis[i]);
-            }
-
-            // Calculate sin/cos theta
-            var sinTheta = new Array(numThetas);
-            var cosTheta = new Array(numThetas);
-            for (j = 0; j < numThetas; j++) {
-                cosTheta[j] = cos(thetas[j]);
-                sinTheta[j] = sin(thetas[j]);
-            }
-
-            // Create outer surface
-            for (i = 0; i < numPhis; i++) {
-                for (j = 0; j < numThetas; j++) {
-                    positions[index++] = radii.x * sinPhi[i] * cosTheta[j];
-                    positions[index++] = radii.y * sinPhi[i] * sinTheta[j];
-                    positions[index++] = radii.z * cosPhi[i];
-                }
-            }
-
-            // Create inner surface
-            var vertexIndex = vertexCount / 2.0;
-            if (hasInnerSurface) {
-                for (i = 0; i < numPhis; i++) {
-                    for (j = 0; j < numThetas; j++) {
-                        positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j];
-                        positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j];
-                        positions[index++] = innerRadii.z * cosPhi[i];
-
-                        // Keep track of which vertices are the inner and which ones
-                        // need the normal to be negated
-                        isInner[vertexIndex] = true;
-                        if (i > 0 && i !== (numPhis - 1) && j !== 0 && j !== (numThetas - 1)) {
-                            negateNormal[vertexIndex] = true;
-                        }
-                        vertexIndex++;
-                    }
-                }
-            }
-
-            // Create indices for outer surface
-            index = 0;
-            var topOffset;
-            var bottomOffset;
-            for (i = 1; i < (numPhis - 2); i++) {
-                topOffset = i * numThetas;
-                bottomOffset = (i + 1) * numThetas;
-
-                for (j = 1; j < numThetas - 2; j++) {
-                    indices[index++] = bottomOffset + j;
-                    indices[index++] = bottomOffset + j + 1;
-                    indices[index++] = topOffset + j + 1;
-
-                    indices[index++] = bottomOffset + j;
-                    indices[index++] = topOffset + j + 1;
-                    indices[index++] = topOffset + j;
-                }
-            }
-
-            // Create indices for inner surface
-            if (hasInnerSurface) {
-                var offset = numPhis * numThetas;
-                for (i = 1; i < (numPhis - 2); i++) {
-                    topOffset = offset + i * numThetas;
-                    bottomOffset = offset + (i + 1) * numThetas;
-
-                    for (j = 1; j < numThetas - 2; j++) {
-                        indices[index++] = bottomOffset + j;
-                        indices[index++] = topOffset + j;
-                        indices[index++] = topOffset + j + 1;
-
-                        indices[index++] = bottomOffset + j;
-                        indices[index++] = topOffset + j + 1;
-                        indices[index++] = bottomOffset + j + 1;
-                    }
-                }
-            }
-
-            var outerOffset;
-            var innerOffset;
-            if (hasInnerSurface) {
-                if (isTopOpen) {
-                    // Connect the top of the inner surface to the top of the outer surface
-                    innerOffset = numPhis * numThetas;
-                    for (i = 1; i < numThetas - 2; i++) {
-                        indices[index++] = i;
-                        indices[index++] = i + 1;
-                        indices[index++] = innerOffset + i + 1;
-
-                        indices[index++] = i;
-                        indices[index++] = innerOffset + i + 1;
-                        indices[index++] = innerOffset + i;
-                    }
-                }
-
-                if (isBotOpen) {
-                    // Connect the bottom of the inner surface to the bottom of the outer surface
-                    outerOffset = numPhis * numThetas - numThetas;
-                    innerOffset = numPhis * numThetas * vertexMultiplier - numThetas;
-                    for (i = 1; i < numThetas - 2; i++) {
-                        indices[index++] = outerOffset + i + 1;
-                        indices[index++] = outerOffset + i;
-                        indices[index++] = innerOffset + i;
-
-                        indices[index++] = outerOffset + i + 1;
-                        indices[index++] = innerOffset + i;
-                        indices[index++] = innerOffset + i + 1;
-                    }
-                }
-            }
-
-            // Connect the edges if clock is not closed
-            if (isClockOpen) {
-                for (i = 1; i < numPhis - 2; i++) {
-                    innerOffset = numThetas * numPhis + (numThetas * i);
-                    outerOffset = numThetas * i;
-                    indices[index++] = innerOffset;
-                    indices[index++] = outerOffset + numThetas;
-                    indices[index++] = outerOffset;
-
-                    indices[index++] = innerOffset;
-                    indices[index++] = innerOffset + numThetas;
-                    indices[index++] = outerOffset + numThetas;
-                }
-
-                for (i = 1; i < numPhis - 2; i++) {
-                    innerOffset = numThetas * numPhis + (numThetas * (i + 1)) - 1;
-                    outerOffset = numThetas * (i + 1) - 1;
-                    indices[index++] = outerOffset + numThetas;
-                    indices[index++] = innerOffset;
-                    indices[index++] = outerOffset;
-
-                    indices[index++] = outerOffset + numThetas;
-                    indices[index++] = innerOffset + numThetas;
-                    indices[index++] = innerOffset;
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-
-            if (vertexFormat.position) {
-                attributes.position = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : positions
-                });
-            }
-
-            var stIndex = 0;
-            var normalIndex = 0;
-            var tangentIndex = 0;
-            var bitangentIndex = 0;
-            var vertexCountHalf = vertexCount / 2.0;
-
-            var ellipsoid;
-            var ellipsoidOuter = Cartesian2.Ellipsoid.fromCartesian3(radii);
-            var ellipsoidInner = Cartesian2.Ellipsoid.fromCartesian3(innerRadii);
-
-            if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
-                for (i = 0; i < vertexCount; i++) {
-                    ellipsoid = (isInner[i]) ? ellipsoidInner : ellipsoidOuter;
-                    var position = Cartographic.Cartesian3.fromArray(positions, i * 3, scratchPosition);
-                    var normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal);
-                    if (negateNormal[i]) {
-                        Cartographic.Cartesian3.negate(normal, normal);
-                    }
-
-                    if (vertexFormat.st) {
-                        var normalST = Cartesian2.Cartesian2.negate(normal, scratchNormalST);
-                        st[stIndex++] = (Math.atan2(normalST.y, normalST.x) / _Math.CesiumMath.TWO_PI) + 0.5;
-                        st[stIndex++] = (Math.asin(normal.z) / Math.PI) + 0.5;
-                    }
-
-                    if (vertexFormat.normal) {
-                        normals[normalIndex++] = normal.x;
-                        normals[normalIndex++] = normal.y;
-                        normals[normalIndex++] = normal.z;
-                    }
-
-                    if (vertexFormat.tangent || vertexFormat.bitangent) {
-                        var tangent = scratchTangent;
-
-                        // Use UNIT_X for the poles
-                        var tangetOffset = 0;
-                        var unit;
-                        if (isInner[i]) {
-                            tangetOffset = vertexCountHalf;
-                        }
-                        if ((!isTopOpen && (i >= tangetOffset && i < (tangetOffset + numThetas * 2)))) {
-                            unit = Cartographic.Cartesian3.UNIT_X;
-                        } else {
-                            unit = Cartographic.Cartesian3.UNIT_Z;
-                        }
-                        Cartographic.Cartesian3.cross(unit, normal, tangent);
-                        Cartographic.Cartesian3.normalize(tangent, tangent);
-
-                        if (vertexFormat.tangent) {
-                            tangents[tangentIndex++] = tangent.x;
-                            tangents[tangentIndex++] = tangent.y;
-                            tangents[tangentIndex++] = tangent.z;
-                        }
-
-                        if (vertexFormat.bitangent) {
-                            var bitangent = Cartographic.Cartesian3.cross(normal, tangent, scratchBitangent);
-                            Cartographic.Cartesian3.normalize(bitangent, bitangent);
-
-                            bitangents[bitangentIndex++] = bitangent.x;
-                            bitangents[bitangentIndex++] = bitangent.y;
-                            bitangents[bitangentIndex++] = bitangent.z;
-                        }
-                    }
-                }
-
-                if (vertexFormat.st) {
-                    attributes.st = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 2,
-                        values : st
-                    });
-                }
-
-                if (vertexFormat.normal) {
-                    attributes.normal = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : normals
-                    });
-                }
-
-                if (vertexFormat.tangent) {
-                    attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : tangents
-                    });
-                }
-
-                if (vertexFormat.bitangent) {
-                    attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : bitangents
-                    });
-                }
-            }
-
-            if (when.defined(ellipsoidGeometry._offsetAttribute)) {
-                var length = positions.length;
-                var applyOffset = new Uint8Array(length / 3);
-                var offsetValue = ellipsoidGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                arrayFill.arrayFill(applyOffset, offsetValue);
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values : applyOffset
-                });
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES,
-                boundingSphere : BoundingSphere.BoundingSphere.fromEllipsoid(ellipsoidOuter),
-                offsetAttribute : ellipsoidGeometry._offsetAttribute
-            });
-        };
-
-        var unitEllipsoidGeometry;
-
-        /**
-         * Returns the geometric representation of a unit ellipsoid, including its vertices, indices, and a bounding sphere.
-         * @returns {Geometry} The computed vertices and indices.
-         *
-         * @private
-         */
-        EllipsoidGeometry.getUnitEllipsoid = function() {
-            if (!when.defined(unitEllipsoidGeometry)) {
-                unitEllipsoidGeometry = EllipsoidGeometry.createGeometry((new EllipsoidGeometry({
-                    radii : new Cartographic.Cartesian3(1.0, 1.0, 1.0),
-                    vertexFormat : VertexFormat.VertexFormat.POSITION_ONLY
-                })));
-            }
-            return unitEllipsoidGeometry;
-        };
-
-    exports.EllipsoidGeometry = EllipsoidGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/EllipsoidOutlineGeometry-2ac32d7f.js b/public/libs/Cesium/Workers/EllipsoidOutlineGeometry-2ac32d7f.js
deleted file mode 100644
index bba8862..0000000
--- a/public/libs/Cesium/Workers/EllipsoidOutlineGeometry-2ac32d7f.js
+++ /dev/null
@@ -1,446 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, ComponentDatatype, GeometryAttribute, PrimitiveType, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute) { 'use strict';
-
-    var defaultRadii = new Cartographic.Cartesian3(1.0, 1.0, 1.0);
-        var cos = Math.cos;
-        var sin = Math.sin;
-
-        /**
-         * A description of the outline of an ellipsoid centered at the origin.
-         *
-         * @alias EllipsoidOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} [options] Object with the following properties:
-         * @param {Cartesian3} [options.radii=Cartesian3(1.0, 1.0, 1.0)] The radii of the ellipsoid in the x, y, and z directions.
-         * @param {Cartesian3} [options.innerRadii=options.radii] The inner radii of the ellipsoid in the x, y, and z directions.
-         * @param {Number} [options.minimumClock=0.0] The minimum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
-         * @param {Number} [options.maximumClock=2*PI] The maximum angle lying in the xy-plane measured from the positive x-axis and toward the positive y-axis.
-         * @param {Number} [options.minimumCone=0.0] The minimum angle measured from the positive z-axis and toward the negative z-axis.
-         * @param {Number} [options.maximumCone=PI] The maximum angle measured from the positive z-axis and toward the negative z-axis.
-         * @param {Number} [options.stackPartitions=10] The count of stacks for the ellipsoid (1 greater than the number of parallel lines).
-         * @param {Number} [options.slicePartitions=8] The count of slices for the ellipsoid (Equal to the number of radial lines).
-         * @param {Number} [options.subdivisions=128] The number of points per line, determining the granularity of the curvature.
-         *
-         * @exception {DeveloperError} options.stackPartitions must be greater than or equal to one.
-         * @exception {DeveloperError} options.slicePartitions must be greater than or equal to zero.
-         * @exception {DeveloperError} options.subdivisions must be greater than or equal to zero.
-         *
-         * @example
-         * var ellipsoid = new Cesium.EllipsoidOutlineGeometry({
-         *   radii : new Cesium.Cartesian3(1000000.0, 500000.0, 500000.0),
-         *   stackPartitions: 6,
-         *   slicePartitions: 5
-         * });
-         * var geometry = Cesium.EllipsoidOutlineGeometry.createGeometry(ellipsoid);
-         */
-        function EllipsoidOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var radii = when.defaultValue(options.radii, defaultRadii);
-            var innerRadii = when.defaultValue(options.innerRadii, radii);
-            var minimumClock = when.defaultValue(options.minimumClock, 0.0);
-            var maximumClock = when.defaultValue(options.maximumClock, _Math.CesiumMath.TWO_PI);
-            var minimumCone = when.defaultValue(options.minimumCone, 0.0);
-            var maximumCone = when.defaultValue(options.maximumCone, _Math.CesiumMath.PI);
-            var stackPartitions = Math.round(when.defaultValue(options.stackPartitions, 10));
-            var slicePartitions = Math.round(when.defaultValue(options.slicePartitions, 8));
-            var subdivisions = Math.round(when.defaultValue(options.subdivisions, 128));
-
-            //>>includeStart('debug', pragmas.debug);
-            if (stackPartitions < 1) {
-                throw new Check.DeveloperError('options.stackPartitions cannot be less than 1');
-            }
-            if (slicePartitions < 0) {
-                throw new Check.DeveloperError('options.slicePartitions cannot be less than 0');
-            }
-            if (subdivisions < 0) {
-                throw new Check.DeveloperError('options.subdivisions must be greater than or equal to zero.');
-            }
-            if (when.defined(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                throw new Check.DeveloperError('GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry.');
-            }
-            //>>includeEnd('debug');
-
-            this._radii = Cartographic.Cartesian3.clone(radii);
-            this._innerRadii = Cartographic.Cartesian3.clone(innerRadii);
-            this._minimumClock = minimumClock;
-            this._maximumClock = maximumClock;
-            this._minimumCone = minimumCone;
-            this._maximumCone = maximumCone;
-            this._stackPartitions = stackPartitions;
-            this._slicePartitions = slicePartitions;
-            this._subdivisions = subdivisions;
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createEllipsoidOutlineGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        EllipsoidOutlineGeometry.packedLength = 2 * (Cartographic.Cartesian3.packedLength) + 8;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {EllipsoidOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        EllipsoidOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            Cartographic.Cartesian3.pack(value._radii, array, startingIndex);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            Cartographic.Cartesian3.pack(value._innerRadii, array, startingIndex);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            array[startingIndex++] = value._minimumClock;
-            array[startingIndex++] = value._maximumClock;
-            array[startingIndex++] = value._minimumCone;
-            array[startingIndex++] = value._maximumCone;
-            array[startingIndex++] = value._stackPartitions;
-            array[startingIndex++] = value._slicePartitions;
-            array[startingIndex++] = value._subdivisions;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchRadii = new Cartographic.Cartesian3();
-        var scratchInnerRadii = new Cartographic.Cartesian3();
-        var scratchOptions = {
-            radii : scratchRadii,
-            innerRadii : scratchInnerRadii,
-            minimumClock : undefined,
-            maximumClock : undefined,
-            minimumCone : undefined,
-            maximumCone : undefined,
-            stackPartitions : undefined,
-            slicePartitions : undefined,
-            subdivisions : undefined,
-            offsetAttribute : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {EllipsoidOutlineGeometry} [result] The object into which to store the result.
-         * @returns {EllipsoidOutlineGeometry} The modified result parameter or a new EllipsoidOutlineGeometry instance if one was not provided.
-         */
-        EllipsoidOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var radii = Cartographic.Cartesian3.unpack(array, startingIndex, scratchRadii);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            var innerRadii = Cartographic.Cartesian3.unpack(array, startingIndex, scratchInnerRadii);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-
-            var minimumClock = array[startingIndex++];
-            var maximumClock = array[startingIndex++];
-            var minimumCone = array[startingIndex++];
-            var maximumCone = array[startingIndex++];
-            var stackPartitions = array[startingIndex++];
-            var slicePartitions = array[startingIndex++];
-            var subdivisions = array[startingIndex++];
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.minimumClock = minimumClock;
-                scratchOptions.maximumClock = maximumClock;
-                scratchOptions.minimumCone = minimumCone;
-                scratchOptions.maximumCone = maximumCone;
-                scratchOptions.stackPartitions = stackPartitions;
-                scratchOptions.slicePartitions = slicePartitions;
-                scratchOptions.subdivisions = subdivisions;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-                return new EllipsoidOutlineGeometry(scratchOptions);
-            }
-
-            result._radii = Cartographic.Cartesian3.clone(radii, result._radii);
-            result._innerRadii = Cartographic.Cartesian3.clone(innerRadii, result._innerRadii);
-            result._minimumClock = minimumClock;
-            result._maximumClock = maximumClock;
-            result._minimumCone = minimumCone;
-            result._maximumCone = maximumCone;
-            result._stackPartitions = stackPartitions;
-            result._slicePartitions = slicePartitions;
-            result._subdivisions = subdivisions;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of an outline of an ellipsoid, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {EllipsoidOutlineGeometry} ellipsoidGeometry A description of the ellipsoid outline.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        EllipsoidOutlineGeometry.createGeometry = function(ellipsoidGeometry) {
-            var radii = ellipsoidGeometry._radii;
-            if ((radii.x <= 0) || (radii.y <= 0) || (radii.z <= 0)) {
-                return;
-            }
-
-            var innerRadii = ellipsoidGeometry._innerRadii;
-            if ((innerRadii.x <= 0) || (innerRadii.y <= 0) || (innerRadii.z <= 0)) {
-                return;
-            }
-
-            var minimumClock = ellipsoidGeometry._minimumClock;
-            var maximumClock = ellipsoidGeometry._maximumClock;
-            var minimumCone = ellipsoidGeometry._minimumCone;
-            var maximumCone = ellipsoidGeometry._maximumCone;
-            var subdivisions = ellipsoidGeometry._subdivisions;
-            var ellipsoid = Cartesian2.Ellipsoid.fromCartesian3(radii);
-
-            // Add an extra slice and stack to remain consistent with EllipsoidGeometry
-            var slicePartitions = ellipsoidGeometry._slicePartitions + 1;
-            var stackPartitions = ellipsoidGeometry._stackPartitions + 1;
-
-            slicePartitions = Math.round(slicePartitions * Math.abs(maximumClock - minimumClock) / _Math.CesiumMath.TWO_PI);
-            stackPartitions = Math.round(stackPartitions * Math.abs(maximumCone - minimumCone) / _Math.CesiumMath.PI);
-
-            if (slicePartitions < 2) {
-                slicePartitions = 2;
-            }
-            if (stackPartitions < 2) {
-                stackPartitions = 2;
-            }
-
-            var extraIndices = 0;
-            var vertexMultiplier = 1.0;
-            var hasInnerSurface = ((innerRadii.x !== radii.x) || (innerRadii.y !== radii.y) || innerRadii.z !== radii.z);
-            var isTopOpen = false;
-            var isBotOpen = false;
-            if (hasInnerSurface) {
-                vertexMultiplier = 2.0;
-                // Add 2x slicePartitions to connect the top/bottom of the outer to
-                // the top/bottom of the inner
-                if (minimumCone > 0.0) {
-                    isTopOpen = true;
-                    extraIndices += slicePartitions;
-                }
-                if (maximumCone < Math.PI) {
-                    isBotOpen = true;
-                    extraIndices += slicePartitions;
-                }
-            }
-
-            var vertexCount = subdivisions * vertexMultiplier * (stackPartitions + slicePartitions);
-            var positions = new Float64Array(vertexCount * 3);
-
-            // Multiply by two because two points define each line segment
-            var numIndices = 2 * (vertexCount + extraIndices - (slicePartitions + stackPartitions) * vertexMultiplier);
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(vertexCount, numIndices);
-
-            var i;
-            var j;
-            var theta;
-            var phi;
-            var index = 0;
-
-            // Calculate sin/cos phi
-            var sinPhi = new Array(stackPartitions);
-            var cosPhi = new Array(stackPartitions);
-            for (i = 0; i < stackPartitions; i++) {
-                phi = minimumCone + i * (maximumCone - minimumCone) / (stackPartitions - 1);
-                sinPhi[i] = sin(phi);
-                cosPhi[i] = cos(phi);
-            }
-
-            // Calculate sin/cos theta
-            var sinTheta = new Array(subdivisions);
-            var cosTheta = new Array(subdivisions);
-            for (i = 0; i < subdivisions; i++) {
-                theta = minimumClock + i * (maximumClock - minimumClock) / (subdivisions - 1);
-                sinTheta[i] = sin(theta);
-                cosTheta[i] = cos(theta);
-            }
-
-            // Calculate the latitude lines on the outer surface
-            for (i = 0; i < stackPartitions; i++) {
-                for (j = 0; j < subdivisions; j++) {
-                    positions[index++] = radii.x * sinPhi[i] * cosTheta[j];
-                    positions[index++] = radii.y * sinPhi[i] * sinTheta[j];
-                    positions[index++] = radii.z * cosPhi[i];
-                }
-            }
-
-            // Calculate the latitude lines on the inner surface
-            if (hasInnerSurface) {
-                for (i = 0; i < stackPartitions; i++) {
-                    for (j = 0; j < subdivisions; j++) {
-                        positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j];
-                        positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j];
-                        positions[index++] = innerRadii.z * cosPhi[i];
-                    }
-                }
-            }
-
-            // Calculate sin/cos phi
-            sinPhi.length = subdivisions;
-            cosPhi.length = subdivisions;
-            for (i = 0; i < subdivisions; i++) {
-                phi = minimumCone + i * (maximumCone - minimumCone) / (subdivisions - 1);
-                sinPhi[i] = sin(phi);
-                cosPhi[i] = cos(phi);
-            }
-
-            // Calculate sin/cos theta for each slice partition
-            sinTheta.length = slicePartitions;
-            cosTheta.length = slicePartitions;
-            for (i = 0; i < slicePartitions; i++) {
-                theta = minimumClock + i * (maximumClock - minimumClock) / (slicePartitions - 1);
-                sinTheta[i] = sin(theta);
-                cosTheta[i] = cos(theta);
-            }
-
-            // Calculate the longitude lines on the outer surface
-            for (i = 0; i < subdivisions; i++) {
-                for (j = 0; j < slicePartitions; j++) {
-                    positions[index++] = radii.x * sinPhi[i] * cosTheta[j];
-                    positions[index++] = radii.y * sinPhi[i] * sinTheta[j];
-                    positions[index++] = radii.z * cosPhi[i];
-                }
-            }
-
-            // Calculate the longitude lines on the inner surface
-            if (hasInnerSurface) {
-                for (i = 0; i < subdivisions; i++) {
-                    for (j = 0; j < slicePartitions; j++) {
-                        positions[index++] = innerRadii.x * sinPhi[i] * cosTheta[j];
-                        positions[index++] = innerRadii.y * sinPhi[i] * sinTheta[j];
-                        positions[index++] = innerRadii.z * cosPhi[i];
-                    }
-                }
-            }
-
-            // Create indices for the latitude lines
-            index = 0;
-            for (i = 0; i < stackPartitions * vertexMultiplier; i++) {
-                var topOffset = i * subdivisions;
-                for (j = 0; j < subdivisions - 1; j++) {
-                    indices[index++] = topOffset + j;
-                    indices[index++] = topOffset + j + 1;
-                }
-            }
-
-            // Create indices for the outer longitude lines
-            var offset = stackPartitions * subdivisions * vertexMultiplier;
-            for (i = 0; i < slicePartitions; i++) {
-                for (j = 0; j < subdivisions - 1; j++) {
-                    indices[index++] = offset + i + (j * slicePartitions);
-                    indices[index++] = offset + i + (j + 1) * slicePartitions;
-                }
-            }
-
-            // Create indices for the inner longitude lines
-            if (hasInnerSurface) {
-                offset = stackPartitions * subdivisions * vertexMultiplier + slicePartitions * subdivisions;
-                for (i = 0; i < slicePartitions; i++) {
-                    for (j = 0; j < subdivisions - 1; j++) {
-                        indices[index++] = offset + i + (j * slicePartitions);
-                        indices[index++] = offset + i + (j + 1) * slicePartitions;
-                    }
-                }
-            }
-
-            if (hasInnerSurface) {
-                var outerOffset = stackPartitions * subdivisions * vertexMultiplier;
-                var innerOffset = outerOffset + (subdivisions * slicePartitions);
-                if (isTopOpen) {
-                    // Draw lines from the top of the inner surface to the top of the outer surface
-                    for (i = 0; i < slicePartitions; i++) {
-                        indices[index++] = outerOffset + i;
-                        indices[index++] = innerOffset + i;
-                    }
-                }
-
-                if (isBotOpen) {
-                    // Draw lines from the top of the inner surface to the top of the outer surface
-                    outerOffset += (subdivisions * slicePartitions) - slicePartitions;
-                    innerOffset += (subdivisions * slicePartitions) - slicePartitions;
-                    for (i = 0; i < slicePartitions; i++) {
-                        indices[index++] = outerOffset + i;
-                        indices[index++] = innerOffset + i;
-                    }
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes({
-                position : new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : positions
-                })
-            });
-
-            if (when.defined(ellipsoidGeometry._offsetAttribute)) {
-                var length = positions.length;
-                var applyOffset = new Uint8Array(length / 3);
-                var offsetValue = ellipsoidGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                arrayFill.arrayFill(applyOffset, offsetValue);
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values : applyOffset
-                });
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : BoundingSphere.BoundingSphere.fromEllipsoid(ellipsoid),
-                offsetAttribute : ellipsoidGeometry._offsetAttribute
-            });
-        };
-
-    exports.EllipsoidOutlineGeometry = EllipsoidOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/EllipsoidRhumbLine-f161e674.js b/public/libs/Cesium/Workers/EllipsoidRhumbLine-f161e674.js
deleted file mode 100644
index d213a94..0000000
--- a/public/libs/Cesium/Workers/EllipsoidRhumbLine-f161e674.js
+++ /dev/null
@@ -1,514 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09'], function (exports, when, Check, _Math, Cartographic, Cartesian2) { 'use strict';
-
-    function calculateM(ellipticity, major, latitude) {
-            if (ellipticity === 0.0) { // sphere
-                return major * latitude;
-            }
-
-            var e2 = ellipticity * ellipticity;
-            var e4 = e2 * e2;
-            var e6 = e4 * e2;
-            var e8 = e6 * e2;
-            var e10 = e8 * e2;
-            var e12 = e10 * e2;
-            var phi = latitude;
-            var sin2Phi = Math.sin(2 * phi);
-            var sin4Phi = Math.sin(4 * phi);
-            var sin6Phi = Math.sin(6 * phi);
-            var sin8Phi = Math.sin(8 * phi);
-            var sin10Phi = Math.sin(10 * phi);
-            var sin12Phi = Math.sin(12 * phi);
-
-            return major * ((1 - e2 / 4 - 3 * e4 / 64 - 5 * e6 / 256 - 175 * e8 / 16384 - 441 * e10 / 65536 - 4851 * e12 / 1048576) * phi
-                         - (3 * e2 / 8 + 3 * e4 / 32 + 45 * e6 / 1024 + 105 * e8 / 4096 + 2205 * e10 / 131072 + 6237 * e12 / 524288) * sin2Phi
-                         + (15 * e4 / 256 + 45 * e6 / 1024 + 525 * e8 / 16384 + 1575 * e10 / 65536 + 155925 * e12 / 8388608) * sin4Phi
-                         - (35 * e6 / 3072 + 175 * e8 / 12288 + 3675 * e10 / 262144 + 13475 * e12 / 1048576) * sin6Phi
-                         + (315 * e8 / 131072 + 2205 * e10 / 524288 + 43659 * e12 / 8388608) * sin8Phi
-                         - (693 * e10 / 1310720 + 6237 * e12 / 5242880) * sin10Phi
-                         + 1001 * e12 / 8388608 * sin12Phi);
-        }
-
-        function calculateInverseM(M, ellipticity, major) {
-            var d = M / major;
-
-            if (ellipticity === 0.0) { // sphere
-                return d;
-            }
-
-            var d2 = d * d;
-            var d3 = d2 * d;
-            var d4 = d3 * d;
-            var e = ellipticity;
-            var e2 = e * e;
-            var e4 = e2 * e2;
-            var e6 = e4 * e2;
-            var e8 = e6 * e2;
-            var e10 = e8 * e2;
-            var e12 = e10 * e2;
-            var sin2D = Math.sin(2 * d);
-            var cos2D = Math.cos(2 * d);
-            var sin4D = Math.sin(4 * d);
-            var cos4D = Math.cos(4 * d);
-            var sin6D = Math.sin(6 * d);
-            var cos6D = Math.cos(6 * d);
-            var sin8D = Math.sin(8 * d);
-            var cos8D = Math.cos(8 * d);
-            var sin10D = Math.sin(10 * d);
-            var cos10D = Math.cos(10 * d);
-            var sin12D = Math.sin(12 * d);
-
-            return d + d * e2 / 4 + 7 * d * e4 / 64 + 15 * d * e6 / 256 + 579 * d * e8 / 16384 + 1515 * d * e10 / 65536 + 16837 * d * e12 / 1048576
-                + (3 * d * e4 / 16 + 45 * d * e6 / 256 - d * (32 * d2 - 561) * e8 / 4096 - d * (232 * d2 - 1677) * e10 / 16384 + d * (399985 - 90560 * d2 + 512 * d4) * e12 / 5242880) * cos2D
-                + (21 * d * e6 / 256 + 483 * d * e8 / 4096 - d * (224 * d2 - 1969) * e10 / 16384 - d * (33152 * d2 - 112599) * e12 / 1048576) * cos4D
-                + (151 * d * e8 / 4096 + 4681 * d * e10 / 65536 + 1479 * d * e12 / 16384 - 453 * d3 * e12 / 32768) * cos6D
-                + (1097 * d * e10 / 65536 + 42783 * d * e12 / 1048576) * cos8D
-                + 8011 * d * e12 / 1048576 * cos10D
-                + (3 * e2 / 8 + 3 * e4 / 16 + 213 * e6 / 2048 - 3 * d2 * e6 / 64 + 255 * e8 / 4096 - 33 * d2 * e8 / 512 + 20861 * e10 / 524288 - 33 * d2 * e10 / 512 + d4 * e10 / 1024 + 28273 * e12 / 1048576 - 471 * d2 * e12 / 8192 + 9 * d4 * e12 / 4096) * sin2D
-                + (21 * e4 / 256 + 21 * e6 / 256 + 533 * e8 / 8192 - 21 * d2 * e8 / 512 + 197 * e10 / 4096 - 315 * d2 * e10 / 4096 + 584039 * e12 / 16777216 - 12517 * d2 * e12 / 131072 + 7 * d4 * e12 / 2048) * sin4D
-                + (151 * e6 / 6144 + 151 * e8 / 4096 + 5019 * e10 / 131072 - 453 * d2 * e10 / 16384 + 26965 * e12 / 786432 - 8607 * d2 * e12 / 131072) * sin6D
-                + (1097 * e8 / 131072 + 1097 * e10 / 65536 + 225797 * e12 / 10485760 - 1097 * d2 * e12 / 65536) * sin8D
-                + (8011 * e10 / 2621440 + 8011 * e12 / 1048576) * sin10D
-                + 293393 * e12 / 251658240 * sin12D;
-        }
-
-        function calculateSigma(ellipticity, latitude) {
-            if (ellipticity === 0.0) { // sphere
-                return Math.log(Math.tan(0.5 * (_Math.CesiumMath.PI_OVER_TWO + latitude)));
-            }
-
-            var eSinL = ellipticity * Math.sin(latitude);
-            return Math.log(Math.tan(0.5 * (_Math.CesiumMath.PI_OVER_TWO + latitude))) - (ellipticity / 2.0 * Math.log((1 + eSinL) / (1 - eSinL)));
-        }
-
-        function calculateHeading(ellipsoidRhumbLine, firstLongitude, firstLatitude, secondLongitude, secondLatitude) {
-            var sigma1 = calculateSigma(ellipsoidRhumbLine._ellipticity, firstLatitude);
-            var sigma2 = calculateSigma(ellipsoidRhumbLine._ellipticity, secondLatitude);
-            return Math.atan2(_Math.CesiumMath.negativePiToPi(secondLongitude - firstLongitude), sigma2 - sigma1);
-        }
-
-        function calculateArcLength(ellipsoidRhumbLine, major, minor, firstLongitude, firstLatitude, secondLongitude, secondLatitude) {
-            var heading = ellipsoidRhumbLine._heading;
-            var deltaLongitude = secondLongitude - firstLongitude;
-
-            var distance = 0.0;
-
-            //Check to see if the rhumb line has constant latitude
-            //This equation will diverge if heading gets close to 90 degrees
-            if (_Math.CesiumMath.equalsEpsilon(Math.abs(heading), _Math.CesiumMath.PI_OVER_TWO, _Math.CesiumMath.EPSILON8)) { //If heading is close to 90 degrees
-                if (major === minor) {
-                    distance = major * Math.cos(firstLatitude) * _Math.CesiumMath.negativePiToPi(deltaLongitude);
-                } else {
-                    var sinPhi = Math.sin(firstLatitude);
-                    distance = major * Math.cos(firstLatitude) * _Math.CesiumMath.negativePiToPi(deltaLongitude) / Math.sqrt(1 - ellipsoidRhumbLine._ellipticitySquared * sinPhi * sinPhi);
-                }
-            } else {
-                var M1 = calculateM(ellipsoidRhumbLine._ellipticity, major, firstLatitude);
-                var M2 = calculateM(ellipsoidRhumbLine._ellipticity, major, secondLatitude);
-
-                distance = (M2 - M1) / Math.cos(heading);
-            }
-            return Math.abs(distance);
-        }
-
-        var scratchCart1 = new Cartographic.Cartesian3();
-        var scratchCart2 = new Cartographic.Cartesian3();
-
-        function computeProperties(ellipsoidRhumbLine, start, end, ellipsoid) {
-            var firstCartesian = Cartographic.Cartesian3.normalize(ellipsoid.cartographicToCartesian(start, scratchCart2), scratchCart1);
-            var lastCartesian = Cartographic.Cartesian3.normalize(ellipsoid.cartographicToCartesian(end, scratchCart2), scratchCart2);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number.greaterThanOrEquals('value', Math.abs(Math.abs(Cartographic.Cartesian3.angleBetween(firstCartesian, lastCartesian)) - Math.PI), 0.0125);
-            //>>includeEnd('debug');
-
-            var major = ellipsoid.maximumRadius;
-            var minor = ellipsoid.minimumRadius;
-            var majorSquared = major * major;
-            var minorSquared = minor * minor;
-            ellipsoidRhumbLine._ellipticitySquared = (majorSquared - minorSquared) / majorSquared;
-            ellipsoidRhumbLine._ellipticity = Math.sqrt(ellipsoidRhumbLine._ellipticitySquared);
-
-            ellipsoidRhumbLine._start = Cartographic.Cartographic.clone(start, ellipsoidRhumbLine._start);
-            ellipsoidRhumbLine._start.height = 0;
-
-            ellipsoidRhumbLine._end = Cartographic.Cartographic.clone(end, ellipsoidRhumbLine._end);
-            ellipsoidRhumbLine._end.height = 0;
-
-            ellipsoidRhumbLine._heading = calculateHeading(ellipsoidRhumbLine, start.longitude, start.latitude, end.longitude, end.latitude);
-            ellipsoidRhumbLine._distance = calculateArcLength(ellipsoidRhumbLine, ellipsoid.maximumRadius, ellipsoid.minimumRadius,
-                                                              start.longitude, start.latitude, end.longitude, end.latitude);
-        }
-
-        function interpolateUsingSurfaceDistance(start, heading, distance, major, ellipticity, result)
-        {
-            var ellipticitySquared = ellipticity * ellipticity;
-
-            var longitude;
-            var latitude;
-            var deltaLongitude;
-
-            //Check to see if the rhumb line has constant latitude
-            //This won't converge if heading is close to 90 degrees
-            if (Math.abs(_Math.CesiumMath.PI_OVER_TWO - Math.abs(heading)) > _Math.CesiumMath.EPSILON8) {
-                //Calculate latitude of the second point
-                var M1 = calculateM(ellipticity, major, start.latitude);
-                var deltaM = distance * Math.cos(heading);
-                var M2 = M1 + deltaM;
-                latitude = calculateInverseM(M2, ellipticity, major);
-
-                //Now find the longitude of the second point
-                var sigma1 = calculateSigma(ellipticity, start.latitude);
-                var sigma2 = calculateSigma(ellipticity, latitude);
-                deltaLongitude = Math.tan(heading) * (sigma2 - sigma1);
-                longitude = _Math.CesiumMath.negativePiToPi(start.longitude + deltaLongitude);
-            } else { //If heading is close to 90 degrees
-                latitude = start.latitude;
-                var localRad;
-
-                if (ellipticity === 0.0) { // sphere
-                    localRad = major * Math.cos(start.latitude);
-                } else {
-                    var sinPhi = Math.sin(start.latitude);
-                    localRad = major * Math.cos(start.latitude) / Math.sqrt(1 - ellipticitySquared * sinPhi * sinPhi);
-                }
-
-                deltaLongitude = distance / localRad;
-                if (heading > 0.0) {
-                    longitude = _Math.CesiumMath.negativePiToPi(start.longitude + deltaLongitude);
-                } else {
-                    longitude = _Math.CesiumMath.negativePiToPi(start.longitude - deltaLongitude);
-                }
-            }
-
-            if (when.defined(result)) {
-                result.longitude = longitude;
-                result.latitude = latitude;
-                result.height = 0;
-
-                return result;
-            }
-
-            return new Cartographic.Cartographic(longitude, latitude, 0);
-        }
-
-        /**
-         * Initializes a rhumb line on the ellipsoid connecting the two provided planetodetic points.
-         *
-         * @alias EllipsoidRhumbLine
-         * @constructor
-         *
-         * @param {Cartographic} [start] The initial planetodetic point on the path.
-         * @param {Cartographic} [end] The final planetodetic point on the path.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the rhumb line lies.
-         *
-         * @exception {DeveloperError} angle between start and end must be at least 0.0125 radians.
-         */
-        function EllipsoidRhumbLine(start, end, ellipsoid) {
-            var e = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            this._ellipsoid = e;
-            this._start = new Cartographic.Cartographic();
-            this._end = new Cartographic.Cartographic();
-
-            this._heading = undefined;
-            this._distance = undefined;
-            this._ellipticity = undefined;
-            this._ellipticitySquared = undefined;
-
-            if (when.defined(start) && when.defined(end)) {
-                computeProperties(this, start, end, e);
-            }
-        }
-
-        Object.defineProperties(EllipsoidRhumbLine.prototype, {
-            /**
-             * Gets the ellipsoid.
-             * @memberof EllipsoidRhumbLine.prototype
-             * @type {Ellipsoid}
-             * @readonly
-             */
-            ellipsoid : {
-                get : function() {
-                    return this._ellipsoid;
-                }
-            },
-
-            /**
-             * Gets the surface distance between the start and end point
-             * @memberof EllipsoidRhumbLine.prototype
-             * @type {Number}
-             * @readonly
-             */
-            surfaceDistance : {
-                get : function() {
-                    //>>includeStart('debug', pragmas.debug);
-                    Check.Check.defined('distance', this._distance);
-                    //>>includeEnd('debug');
-
-                    return this._distance;
-                }
-            },
-
-            /**
-             * Gets the initial planetodetic point on the path.
-             * @memberof EllipsoidRhumbLine.prototype
-             * @type {Cartographic}
-             * @readonly
-             */
-            start : {
-                get : function() {
-                    return this._start;
-                }
-            },
-
-            /**
-             * Gets the final planetodetic point on the path.
-             * @memberof EllipsoidRhumbLine.prototype
-             * @type {Cartographic}
-             * @readonly
-             */
-            end : {
-                get : function() {
-                    return this._end;
-                }
-            },
-
-            /**
-             * Gets the heading from the start point to the end point.
-             * @memberof EllipsoidRhumbLine.prototype
-             * @type {Number}
-             * @readonly
-             */
-            heading : {
-                get : function() {
-                    //>>includeStart('debug', pragmas.debug);
-                    Check.Check.defined('distance', this._distance);
-                    //>>includeEnd('debug');
-
-                    return this._heading;
-                }
-            }
-        });
-
-        /**
-         * Create a rhumb line using an initial position with a heading and distance.
-         *
-         * @param {Cartographic} start The initial planetodetic point on the path.
-         * @param {Number} heading The heading in radians.
-         * @param {Number} distance The rhumb line distance between the start and end point.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the rhumb line lies.
-         * @param {EllipsoidRhumbLine} [result] The object in which to store the result.
-         * @returns {EllipsoidRhumbLine} The EllipsoidRhumbLine object.
-         */
-        EllipsoidRhumbLine.fromStartHeadingDistance = function(start, heading, distance, ellipsoid, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('start', start);
-            Check.Check.defined('heading', heading);
-            Check.Check.defined('distance', distance);
-            Check.Check.typeOf.number.greaterThan('distance', distance, 0.0);
-            //>>includeEnd('debug');
-
-            var e = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var major = e.maximumRadius;
-            var minor = e.minimumRadius;
-            var majorSquared = major * major;
-            var minorSquared = minor * minor;
-            var ellipticity = Math.sqrt((majorSquared - minorSquared) / majorSquared);
-
-            heading = _Math.CesiumMath.negativePiToPi(heading);
-            var end = interpolateUsingSurfaceDistance(start, heading, distance, e.maximumRadius, ellipticity);
-
-            if (!when.defined(result) || (when.defined(ellipsoid) && !ellipsoid.equals(result.ellipsoid))) {
-                return new EllipsoidRhumbLine(start, end, e);
-            }
-
-            result.setEndPoints(start, end);
-            return result;
-        };
-
-        /**
-         * Sets the start and end points of the rhumb line.
-         *
-         * @param {Cartographic} start The initial planetodetic point on the path.
-         * @param {Cartographic} end The final planetodetic point on the path.
-         */
-        EllipsoidRhumbLine.prototype.setEndPoints = function(start, end) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('start', start);
-            Check.Check.defined('end', end);
-            //>>includeEnd('debug');
-
-            computeProperties(this, start, end, this._ellipsoid);
-        };
-
-        /**
-         * Provides the location of a point at the indicated portion along the rhumb line.
-         *
-         * @param {Number} fraction The portion of the distance between the initial and final points.
-         * @param {Cartographic} [result] The object in which to store the result.
-         * @returns {Cartographic} The location of the point along the rhumb line.
-         */
-        EllipsoidRhumbLine.prototype.interpolateUsingFraction = function(fraction, result) {
-            return this.interpolateUsingSurfaceDistance(fraction * this._distance, result);
-        };
-
-        /**
-         * Provides the location of a point at the indicated distance along the rhumb line.
-         *
-         * @param {Number} distance The distance from the inital point to the point of interest along the rhumbLine.
-         * @param {Cartographic} [result] The object in which to store the result.
-         * @returns {Cartographic} The location of the point along the rhumb line.
-         *
-         * @exception {DeveloperError} start and end must be set before calling function interpolateUsingSurfaceDistance
-         */
-        EllipsoidRhumbLine.prototype.interpolateUsingSurfaceDistance = function(distance, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('distance', distance);
-            if (!when.defined(this._distance) || this._distance === 0.0) {
-                throw new Check.DeveloperError('EllipsoidRhumbLine must have distinct start and end set.');
-            }
-            //>>includeEnd('debug');
-
-            return interpolateUsingSurfaceDistance(this._start, this._heading, distance, this._ellipsoid.maximumRadius, this._ellipticity, result);
-        };
-
-        /**
-         * Provides the location of a point at the indicated longitude along the rhumb line.
-         * If the longitude is outside the range of start and end points, the first intersection with the longitude from the start point in the direction of the heading is returned. This follows the spiral property of a rhumb line.
-         *
-         * @param {Number} intersectionLongitude The longitude, in radians, at which to find the intersection point from the starting point using the heading.
-         * @param {Cartographic} [result] The object in which to store the result.
-         * @returns {Cartographic} The location of the intersection point along the rhumb line, undefined if there is no intersection or infinite intersections.
-         *
-         * @exception {DeveloperError} start and end must be set before calling function findIntersectionWithLongitude.
-         */
-        EllipsoidRhumbLine.prototype.findIntersectionWithLongitude = function(intersectionLongitude, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('intersectionLongitude', intersectionLongitude);
-            if (!when.defined(this._distance) || this._distance === 0.0) {
-                throw new Check.DeveloperError('EllipsoidRhumbLine must have distinct start and end set.');
-            }
-            //>>includeEnd('debug');
-
-            var ellipticity = this._ellipticity;
-            var heading = this._heading;
-            var absHeading = Math.abs(heading);
-            var start = this._start;
-
-            intersectionLongitude = _Math.CesiumMath.negativePiToPi(intersectionLongitude);
-
-            if (_Math.CesiumMath.equalsEpsilon(Math.abs(intersectionLongitude), Math.PI, _Math.CesiumMath.EPSILON14)) {
-                intersectionLongitude = _Math.CesiumMath.sign(start.longitude) * Math.PI;
-            }
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartographic();
-            }
-
-            // If heading is -PI/2 or PI/2, this is an E-W rhumb line
-            // If heading is 0 or PI, this is an N-S rhumb line
-            if (Math.abs(_Math.CesiumMath.PI_OVER_TWO - absHeading) <= _Math.CesiumMath.EPSILON8) {
-                result.longitude = intersectionLongitude;
-                result.latitude = start.latitude;
-                result.height = 0;
-                return result;
-            } else if (_Math.CesiumMath.equalsEpsilon(Math.abs(_Math.CesiumMath.PI_OVER_TWO - absHeading), _Math.CesiumMath.PI_OVER_TWO, _Math.CesiumMath.EPSILON8)) {
-                if (_Math.CesiumMath.equalsEpsilon(intersectionLongitude, start.longitude, _Math.CesiumMath.EPSILON12)) {
-                    return undefined;
-                }
-
-                result.longitude = intersectionLongitude;
-                result.latitude = _Math.CesiumMath.PI_OVER_TWO * _Math.CesiumMath.sign(_Math.CesiumMath.PI_OVER_TWO - heading);
-                result.height = 0;
-                return result;
-            }
-
-            // Use iterative solver from Equation 9 from http://edwilliams.org/ellipsoid/ellipsoid.pdf
-            var phi1 = start.latitude;
-            var eSinPhi1 = ellipticity * Math.sin(phi1);
-            var leftComponent = Math.tan(0.5 * (_Math.CesiumMath.PI_OVER_TWO + phi1)) * Math.exp((intersectionLongitude - start.longitude) / Math.tan(heading));
-            var denominator = (1 + eSinPhi1) / (1 - eSinPhi1);
-
-            var newPhi = start.latitude;
-            var phi;
-            do {
-                phi = newPhi;
-                var eSinPhi = ellipticity * Math.sin(phi);
-                var numerator = (1 + eSinPhi) / (1 - eSinPhi);
-                newPhi = 2 * Math.atan(leftComponent * Math.pow(numerator / denominator, ellipticity / 2)) - _Math.CesiumMath.PI_OVER_TWO;
-            } while (!_Math.CesiumMath.equalsEpsilon(newPhi, phi, _Math.CesiumMath.EPSILON12));
-
-            result.longitude = intersectionLongitude;
-            result.latitude = newPhi;
-            result.height = 0;
-            return result;
-        };
-
-        /**
-         * Provides the location of a point at the indicated latitude along the rhumb line.
-         * If the latitude is outside the range of start and end points, the first intersection with the latitude from that start point in the direction of the heading is returned. This follows the spiral property of a rhumb line.
-         *
-         * @param {Number} intersectionLatitude The latitude, in radians, at which to find the intersection point from the starting point using the heading.
-         * @param {Cartographic} [result] The object in which to store the result.
-         * @returns {Cartographic} The location of the intersection point along the rhumb line, undefined if there is no intersection or infinite intersections.
-         *
-         * @exception {DeveloperError} start and end must be set before calling function findIntersectionWithLongitude.
-         */
-        EllipsoidRhumbLine.prototype.findIntersectionWithLatitude = function(intersectionLatitude, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('intersectionLatitude', intersectionLatitude);
-            if (!when.defined(this._distance) || this._distance === 0.0) {
-                throw new Check.DeveloperError('EllipsoidRhumbLine must have distinct start and end set.');
-            }
-            //>>includeEnd('debug');
-
-            var ellipticity = this._ellipticity;
-            var heading = this._heading;
-            var start = this._start;
-
-            // If start and end have same latitude, return undefined since it's either no intersection or infinite intersections
-            if (_Math.CesiumMath.equalsEpsilon(Math.abs(heading), _Math.CesiumMath.PI_OVER_TWO, _Math.CesiumMath.EPSILON8)) {
-                return;
-            }
-
-            // Can be solved using the same equations from interpolateUsingSurfaceDistance
-            var sigma1 = calculateSigma(ellipticity, start.latitude);
-            var sigma2 = calculateSigma(ellipticity, intersectionLatitude);
-            var deltaLongitude = Math.tan(heading) * (sigma2 - sigma1);
-            var longitude = _Math.CesiumMath.negativePiToPi(start.longitude + deltaLongitude);
-
-            if (when.defined(result)) {
-                result.longitude = longitude;
-                result.latitude = intersectionLatitude;
-                result.height = 0;
-
-                return result;
-            }
-
-            return new Cartographic.Cartographic(longitude, intersectionLatitude, 0);
-        };
-
-    exports.EllipsoidRhumbLine = EllipsoidRhumbLine;
-
-});
diff --git a/public/libs/Cesium/Workers/EllipsoidTangentPlane-e324bfa4.js b/public/libs/Cesium/Workers/EllipsoidTangentPlane-e324bfa4.js
deleted file mode 100644
index c120704..0000000
--- a/public/libs/Cesium/Workers/EllipsoidTangentPlane-e324bfa4.js
+++ /dev/null
@@ -1,556 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './Transforms-a1cf7267', './IntersectionTests-397d9494', './Plane-8390418f'], function (exports, when, Check, Cartographic, Cartesian2, BoundingSphere, Cartesian4, Transforms, IntersectionTests, Plane) { 'use strict';
-
-    /**
-         * Creates an instance of an AxisAlignedBoundingBox from the minimum and maximum points along the x, y, and z axes.
-         * @alias AxisAlignedBoundingBox
-         * @constructor
-         *
-         * @param {Cartesian3} [minimum=Cartesian3.ZERO] The minimum point along the x, y, and z axes.
-         * @param {Cartesian3} [maximum=Cartesian3.ZERO] The maximum point along the x, y, and z axes.
-         * @param {Cartesian3} [center] The center of the box; automatically computed if not supplied.
-         *
-         * @see BoundingSphere
-         * @see BoundingRectangle
-         */
-        function AxisAlignedBoundingBox(minimum, maximum, center) {
-            /**
-             * The minimum point defining the bounding box.
-             * @type {Cartesian3}
-             * @default {@link Cartesian3.ZERO}
-             */
-            this.minimum = Cartographic.Cartesian3.clone(when.defaultValue(minimum, Cartographic.Cartesian3.ZERO));
-
-            /**
-             * The maximum point defining the bounding box.
-             * @type {Cartesian3}
-             * @default {@link Cartesian3.ZERO}
-             */
-            this.maximum = Cartographic.Cartesian3.clone(when.defaultValue(maximum, Cartographic.Cartesian3.ZERO));
-
-            //If center was not defined, compute it.
-            if (!when.defined(center)) {
-                center = Cartographic.Cartesian3.midpoint(this.minimum, this.maximum, new Cartographic.Cartesian3());
-            } else {
-                center = Cartographic.Cartesian3.clone(center);
-            }
-
-            /**
-             * The center point of the bounding box.
-             * @type {Cartesian3}
-             */
-            this.center = center;
-        }
-
-        /**
-         * Computes an instance of an AxisAlignedBoundingBox. The box is determined by
-         * finding the points spaced the farthest apart on the x, y, and z axes.
-         *
-         * @param {Cartesian3[]} positions List of points that the bounding box will enclose.  Each point must have a <code>x</code>, <code>y</code>, and <code>z</code> properties.
-         * @param {AxisAlignedBoundingBox} [result] The object onto which to store the result.
-         * @returns {AxisAlignedBoundingBox} The modified result parameter or a new AxisAlignedBoundingBox instance if one was not provided.
-         *
-         * @example
-         * // Compute an axis aligned bounding box enclosing two points.
-         * var box = Cesium.AxisAlignedBoundingBox.fromPoints([new Cesium.Cartesian3(2, 0, 0), new Cesium.Cartesian3(-2, 0, 0)]);
-         */
-        AxisAlignedBoundingBox.fromPoints = function(positions, result) {
-            if (!when.defined(result)) {
-                result = new AxisAlignedBoundingBox();
-            }
-
-            if (!when.defined(positions) || positions.length === 0) {
-                result.minimum = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.minimum);
-                result.maximum = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.maximum);
-                result.center = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, result.center);
-                return result;
-            }
-
-            var minimumX = positions[0].x;
-            var minimumY = positions[0].y;
-            var minimumZ = positions[0].z;
-
-            var maximumX = positions[0].x;
-            var maximumY = positions[0].y;
-            var maximumZ = positions[0].z;
-
-            var length = positions.length;
-            for ( var i = 1; i < length; i++) {
-                var p = positions[i];
-                var x = p.x;
-                var y = p.y;
-                var z = p.z;
-
-                minimumX = Math.min(x, minimumX);
-                maximumX = Math.max(x, maximumX);
-                minimumY = Math.min(y, minimumY);
-                maximumY = Math.max(y, maximumY);
-                minimumZ = Math.min(z, minimumZ);
-                maximumZ = Math.max(z, maximumZ);
-            }
-
-            var minimum = result.minimum;
-            minimum.x = minimumX;
-            minimum.y = minimumY;
-            minimum.z = minimumZ;
-
-            var maximum = result.maximum;
-            maximum.x = maximumX;
-            maximum.y = maximumY;
-            maximum.z = maximumZ;
-
-            result.center = Cartographic.Cartesian3.midpoint(minimum, maximum, result.center);
-
-            return result;
-        };
-
-        /**
-         * Duplicates a AxisAlignedBoundingBox instance.
-         *
-         * @param {AxisAlignedBoundingBox} box The bounding box to duplicate.
-         * @param {AxisAlignedBoundingBox} [result] The object onto which to store the result.
-         * @returns {AxisAlignedBoundingBox} The modified result parameter or a new AxisAlignedBoundingBox instance if none was provided. (Returns undefined if box is undefined)
-         */
-        AxisAlignedBoundingBox.clone = function(box, result) {
-            if (!when.defined(box)) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                return new AxisAlignedBoundingBox(box.minimum, box.maximum, box.center);
-            }
-
-            result.minimum = Cartographic.Cartesian3.clone(box.minimum, result.minimum);
-            result.maximum = Cartographic.Cartesian3.clone(box.maximum, result.maximum);
-            result.center = Cartographic.Cartesian3.clone(box.center, result.center);
-            return result;
-        };
-
-        /**
-         * Compares the provided AxisAlignedBoundingBox componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {AxisAlignedBoundingBox} [left] The first AxisAlignedBoundingBox.
-         * @param {AxisAlignedBoundingBox} [right] The second AxisAlignedBoundingBox.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        AxisAlignedBoundingBox.equals = function(left, right) {
-            return (left === right) ||
-                   ((when.defined(left)) &&
-                    (when.defined(right)) &&
-                    Cartographic.Cartesian3.equals(left.center, right.center) &&
-                    Cartographic.Cartesian3.equals(left.minimum, right.minimum) &&
-                    Cartographic.Cartesian3.equals(left.maximum, right.maximum));
-        };
-
-        var intersectScratch = new Cartographic.Cartesian3();
-        /**
-         * Determines which side of a plane a box is located.
-         *
-         * @param {AxisAlignedBoundingBox} box The bounding box to test.
-         * @param {Plane} plane The plane to test against.
-         * @returns {Intersect} {@link Intersect.INSIDE} if the entire box is on the side of the plane
-         *                      the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is
-         *                      on the opposite side, and {@link Intersect.INTERSECTING} if the box
-         *                      intersects the plane.
-         */
-        AxisAlignedBoundingBox.intersectPlane = function(box, plane) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('box', box);
-            Check.Check.defined('plane', plane);
-            //>>includeEnd('debug');
-
-            intersectScratch = Cartographic.Cartesian3.subtract(box.maximum, box.minimum, intersectScratch);
-            var h = Cartographic.Cartesian3.multiplyByScalar(intersectScratch, 0.5, intersectScratch); //The positive half diagonal
-            var normal = plane.normal;
-            var e = h.x * Math.abs(normal.x) + h.y * Math.abs(normal.y) + h.z * Math.abs(normal.z);
-            var s = Cartographic.Cartesian3.dot(box.center, normal) + plane.distance; //signed distance from center
-
-            if (s - e > 0) {
-                return BoundingSphere.Intersect.INSIDE;
-            }
-
-            if (s + e < 0) {
-                //Not in front because normals point inward
-                return BoundingSphere.Intersect.OUTSIDE;
-            }
-
-            return BoundingSphere.Intersect.INTERSECTING;
-        };
-
-        /**
-         * Duplicates this AxisAlignedBoundingBox instance.
-         *
-         * @param {AxisAlignedBoundingBox} [result] The object onto which to store the result.
-         * @returns {AxisAlignedBoundingBox} The modified result parameter or a new AxisAlignedBoundingBox instance if one was not provided.
-         */
-        AxisAlignedBoundingBox.prototype.clone = function(result) {
-            return AxisAlignedBoundingBox.clone(this, result);
-        };
-
-        /**
-         * Determines which side of a plane this box is located.
-         *
-         * @param {Plane} plane The plane to test against.
-         * @returns {Intersect} {@link Intersect.INSIDE} if the entire box is on the side of the plane
-         *                      the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is
-         *                      on the opposite side, and {@link Intersect.INTERSECTING} if the box
-         *                      intersects the plane.
-         */
-        AxisAlignedBoundingBox.prototype.intersectPlane = function(plane) {
-            return AxisAlignedBoundingBox.intersectPlane(this, plane);
-        };
-
-        /**
-         * Compares this AxisAlignedBoundingBox against the provided AxisAlignedBoundingBox componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {AxisAlignedBoundingBox} [right] The right hand side AxisAlignedBoundingBox.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        AxisAlignedBoundingBox.prototype.equals = function(right) {
-            return AxisAlignedBoundingBox.equals(this, right);
-        };
-
-    var scratchCart4 = new Cartesian4.Cartesian4();
-        /**
-         * A plane tangent to the provided ellipsoid at the provided origin.
-         * If origin is not on the surface of the ellipsoid, it's surface projection will be used.
-         * If origin is at the center of the ellipsoid, an exception will be thrown.
-         * @alias EllipsoidTangentPlane
-         * @constructor
-         *
-         * @param {Cartesian3} origin The point on the surface of the ellipsoid where the tangent plane touches.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid to use.
-         *
-         * @exception {DeveloperError} origin must not be at the center of the ellipsoid.
-         */
-        function EllipsoidTangentPlane(origin, ellipsoid) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('origin', origin);
-            //>>includeEnd('debug');
-
-            ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            origin = ellipsoid.scaleToGeodeticSurface(origin);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(origin)) {
-                throw new Check.DeveloperError('origin must not be at the center of the ellipsoid.');
-            }
-            //>>includeEnd('debug');
-
-            var eastNorthUp = Transforms.Transforms.eastNorthUpToFixedFrame(origin, ellipsoid);
-            this._ellipsoid = ellipsoid;
-            this._origin = origin;
-            this._xAxis = Cartographic.Cartesian3.fromCartesian4(BoundingSphere.Matrix4.getColumn(eastNorthUp, 0, scratchCart4));
-            this._yAxis = Cartographic.Cartesian3.fromCartesian4(BoundingSphere.Matrix4.getColumn(eastNorthUp, 1, scratchCart4));
-
-            var normal = Cartographic.Cartesian3.fromCartesian4(BoundingSphere.Matrix4.getColumn(eastNorthUp, 2, scratchCart4));
-            this._plane = Plane.Plane.fromPointNormal(origin, normal);
-        }
-
-        Object.defineProperties(EllipsoidTangentPlane.prototype, {
-            /**
-             * Gets the ellipsoid.
-             * @memberof EllipsoidTangentPlane.prototype
-             * @type {Ellipsoid}
-             */
-            ellipsoid : {
-                get : function() {
-                    return this._ellipsoid;
-                }
-            },
-
-            /**
-             * Gets the origin.
-             * @memberof EllipsoidTangentPlane.prototype
-             * @type {Cartesian3}
-             */
-            origin : {
-                get : function() {
-                    return this._origin;
-                }
-            },
-
-            /**
-             * Gets the plane which is tangent to the ellipsoid.
-             * @memberof EllipsoidTangentPlane.prototype
-             * @readonly
-             * @type {Plane}
-             */
-            plane : {
-                get : function() {
-                    return this._plane;
-                }
-            },
-
-            /**
-             * Gets the local X-axis (east) of the tangent plane.
-             * @memberof EllipsoidTangentPlane.prototype
-             * @readonly
-             * @type {Cartesian3}
-             */
-            xAxis : {
-                get : function() {
-                    return this._xAxis;
-                }
-            },
-
-            /**
-             * Gets the local Y-axis (north) of the tangent plane.
-             * @memberof EllipsoidTangentPlane.prototype
-             * @readonly
-             * @type {Cartesian3}
-             */
-            yAxis : {
-                get : function() {
-                    return this._yAxis;
-                }
-            },
-
-            /**
-             * Gets the local Z-axis (up) of the tangent plane.
-             * @member EllipsoidTangentPlane.prototype
-             * @readonly
-             * @type {Cartesian3}
-             */
-            zAxis : {
-                get : function() {
-                    return this._plane.normal;
-                }
-            }
-        });
-
-        var tmp = new AxisAlignedBoundingBox();
-        /**
-         * Creates a new instance from the provided ellipsoid and the center
-         * point of the provided Cartesians.
-         *
-         * @param {Cartesian3} cartesians The list of positions surrounding the center point.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid to use.
-         */
-        EllipsoidTangentPlane.fromPoints = function(cartesians, ellipsoid) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartesians', cartesians);
-            //>>includeEnd('debug');
-
-            var box = AxisAlignedBoundingBox.fromPoints(cartesians, tmp);
-            return new EllipsoidTangentPlane(box.center, ellipsoid);
-        };
-
-        var scratchProjectPointOntoPlaneRay = new IntersectionTests.Ray();
-        var scratchProjectPointOntoPlaneCartesian3 = new Cartographic.Cartesian3();
-
-        /**
-         * Computes the projection of the provided 3D position onto the 2D plane, radially outward from the {@link EllipsoidTangentPlane.ellipsoid} coordinate system origin.
-         *
-         * @param {Cartesian3} cartesian The point to project.
-         * @param {Cartesian2} [result] The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if none was provided. Undefined if there is no intersection point
-         */
-        EllipsoidTangentPlane.prototype.projectPointOntoPlane = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            var ray = scratchProjectPointOntoPlaneRay;
-            ray.origin = cartesian;
-            Cartographic.Cartesian3.normalize(cartesian, ray.direction);
-
-            var intersectionPoint = IntersectionTests.IntersectionTests.rayPlane(ray, this._plane, scratchProjectPointOntoPlaneCartesian3);
-            if (!when.defined(intersectionPoint)) {
-                Cartographic.Cartesian3.negate(ray.direction, ray.direction);
-                intersectionPoint = IntersectionTests.IntersectionTests.rayPlane(ray, this._plane, scratchProjectPointOntoPlaneCartesian3);
-            }
-
-            if (when.defined(intersectionPoint)) {
-                var v = Cartographic.Cartesian3.subtract(intersectionPoint, this._origin, intersectionPoint);
-                var x = Cartographic.Cartesian3.dot(this._xAxis, v);
-                var y = Cartographic.Cartesian3.dot(this._yAxis, v);
-
-                if (!when.defined(result)) {
-                    return new Cartesian2.Cartesian2(x, y);
-                }
-                result.x = x;
-                result.y = y;
-                return result;
-            }
-            return undefined;
-        };
-
-        /**
-         * Computes the projection of the provided 3D positions onto the 2D plane (where possible), radially outward from the global origin.
-         * The resulting array may be shorter than the input array - if a single projection is impossible it will not be included.
-         *
-         * @see EllipsoidTangentPlane.projectPointOntoPlane
-         *
-         * @param {Cartesian3[]} cartesians The array of points to project.
-         * @param {Cartesian2[]} [result] The array of Cartesian2 instances onto which to store results.
-         * @returns {Cartesian2[]} The modified result parameter or a new array of Cartesian2 instances if none was provided.
-         */
-        EllipsoidTangentPlane.prototype.projectPointsOntoPlane = function(cartesians, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartesians', cartesians);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = [];
-            }
-
-            var count = 0;
-            var length = cartesians.length;
-            for ( var i = 0; i < length; i++) {
-                var p = this.projectPointOntoPlane(cartesians[i], result[count]);
-                if (when.defined(p)) {
-                    result[count] = p;
-                    count++;
-                }
-            }
-            result.length = count;
-            return result;
-        };
-
-        /**
-         * Computes the projection of the provided 3D position onto the 2D plane, along the plane normal.
-         *
-         * @param {Cartesian3} cartesian The point to project.
-         * @param {Cartesian2} [result] The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if none was provided.
-         */
-        EllipsoidTangentPlane.prototype.projectPointToNearestOnPlane = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartesian2.Cartesian2();
-            }
-
-            var ray = scratchProjectPointOntoPlaneRay;
-            ray.origin = cartesian;
-            Cartographic.Cartesian3.clone(this._plane.normal, ray.direction);
-
-            var intersectionPoint = IntersectionTests.IntersectionTests.rayPlane(ray, this._plane, scratchProjectPointOntoPlaneCartesian3);
-            if (!when.defined(intersectionPoint)) {
-                Cartographic.Cartesian3.negate(ray.direction, ray.direction);
-                intersectionPoint = IntersectionTests.IntersectionTests.rayPlane(ray, this._plane, scratchProjectPointOntoPlaneCartesian3);
-            }
-
-            var v = Cartographic.Cartesian3.subtract(intersectionPoint, this._origin, intersectionPoint);
-            var x = Cartographic.Cartesian3.dot(this._xAxis, v);
-            var y = Cartographic.Cartesian3.dot(this._yAxis, v);
-
-            result.x = x;
-            result.y = y;
-            return result;
-        };
-
-        /**
-         * Computes the projection of the provided 3D positions onto the 2D plane, along the plane normal.
-         *
-         * @see EllipsoidTangentPlane.projectPointToNearestOnPlane
-         *
-         * @param {Cartesian3[]} cartesians The array of points to project.
-         * @param {Cartesian2[]} [result] The array of Cartesian2 instances onto which to store results.
-         * @returns {Cartesian2[]} The modified result parameter or a new array of Cartesian2 instances if none was provided. This will have the same length as <code>cartesians</code>.
-         */
-        EllipsoidTangentPlane.prototype.projectPointsToNearestOnPlane = function(cartesians, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartesians', cartesians);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = [];
-            }
-
-            var length = cartesians.length;
-            result.length = length;
-            for (var i = 0; i < length; i++) {
-                result[i] = this.projectPointToNearestOnPlane(cartesians[i], result[i]);
-            }
-            return result;
-        };
-
-        var projectPointsOntoEllipsoidScratch = new Cartographic.Cartesian3();
-        /**
-         * Computes the projection of the provided 2D position onto the 3D ellipsoid.
-         *
-         * @param {Cartesian2} cartesian The points to project.
-         * @param {Cartesian3} [result] The Cartesian3 instance to store result.
-         * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.
-         */
-        EllipsoidTangentPlane.prototype.projectPointOntoEllipsoid = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            var ellipsoid = this._ellipsoid;
-            var origin = this._origin;
-            var xAxis = this._xAxis;
-            var yAxis = this._yAxis;
-            var tmp = projectPointsOntoEllipsoidScratch;
-
-            Cartographic.Cartesian3.multiplyByScalar(xAxis, cartesian.x, tmp);
-            result = Cartographic.Cartesian3.add(origin, tmp, result);
-            Cartographic.Cartesian3.multiplyByScalar(yAxis, cartesian.y, tmp);
-            Cartographic.Cartesian3.add(result, tmp, result);
-            ellipsoid.scaleToGeocentricSurface(result, result);
-
-            return result;
-        };
-
-        /**
-         * Computes the projection of the provided 2D positions onto the 3D ellipsoid.
-         *
-         * @param {Cartesian2[]} cartesians The array of points to project.
-         * @param {Cartesian3[]} [result] The array of Cartesian3 instances onto which to store results.
-         * @returns {Cartesian3[]} The modified result parameter or a new array of Cartesian3 instances if none was provided.
-         */
-        EllipsoidTangentPlane.prototype.projectPointsOntoEllipsoid = function(cartesians, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartesians', cartesians);
-            //>>includeEnd('debug');
-
-            var length = cartesians.length;
-            if (!when.defined(result)) {
-                result = new Array(length);
-            } else {
-                result.length = length;
-            }
-
-            for ( var i = 0; i < length; ++i) {
-                result[i] = this.projectPointOntoEllipsoid(cartesians[i], result[i]);
-            }
-
-            return result;
-        };
-
-    exports.AxisAlignedBoundingBox = AxisAlignedBoundingBox;
-    exports.EllipsoidTangentPlane = EllipsoidTangentPlane;
-
-});
diff --git a/public/libs/Cesium/Workers/EncodedCartesian3-a569cba8.js b/public/libs/Cesium/Workers/EncodedCartesian3-a569cba8.js
deleted file mode 100644
index 8749999..0000000
--- a/public/libs/Cesium/Workers/EncodedCartesian3-a569cba8.js
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Cartographic-fe4be337'], function (exports, when, Check, Cartographic) { 'use strict';
-
-    /**
-         * A fixed-point encoding of a {@link Cartesian3} with 64-bit floating-point components, as two {@link Cartesian3}
-         * values that, when converted to 32-bit floating-point and added, approximate the original input.
-         * <p>
-         * This is used to encode positions in vertex buffers for rendering without jittering artifacts
-         * as described in {@link http://help.agi.com/AGIComponents/html/BlogPrecisionsPrecisions.htm|Precisions, Precisions}.
-         * </p>
-         *
-         * @alias EncodedCartesian3
-         * @constructor
-         *
-         * @private
-         */
-        function EncodedCartesian3() {
-            /**
-             * The high bits for each component.  Bits 0 to 22 store the whole value.  Bits 23 to 31 are not used.
-             *
-             * @type {Cartesian3}
-             * @default {@link Cartesian3.ZERO}
-             */
-            this.high = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO);
-
-            /**
-             * The low bits for each component.  Bits 7 to 22 store the whole value, and bits 0 to 6 store the fraction.  Bits 23 to 31 are not used.
-             *
-             * @type {Cartesian3}
-             * @default {@link Cartesian3.ZERO}
-             */
-            this.low = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO);
-        }
-
-        /**
-         * Encodes a 64-bit floating-point value as two floating-point values that, when converted to
-         * 32-bit floating-point and added, approximate the original input.  The returned object
-         * has <code>high</code> and <code>low</code> properties for the high and low bits, respectively.
-         * <p>
-         * The fixed-point encoding follows {@link http://help.agi.com/AGIComponents/html/BlogPrecisionsPrecisions.htm|Precisions, Precisions}.
-         * </p>
-         *
-         * @param {Number} value The floating-point value to encode.
-         * @param {Object} [result] The object onto which to store the result.
-         * @returns {Object} The modified result parameter or a new instance if one was not provided.
-         *
-         * @example
-         * var value = 1234567.1234567;
-         * var splitValue = Cesium.EncodedCartesian3.encode(value);
-         */
-        EncodedCartesian3.encode = function(value, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('value', value);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = {
-                    high : 0.0,
-                    low : 0.0
-                };
-            }
-
-            var doubleHigh;
-            if (value >= 0.0) {
-                doubleHigh = Math.floor(value / 65536.0) * 65536.0;
-                result.high = doubleHigh;
-                result.low = value - doubleHigh;
-            } else {
-                doubleHigh = Math.floor(-value / 65536.0) * 65536.0;
-                result.high = -doubleHigh;
-                result.low = value + doubleHigh;
-            }
-
-            return result;
-        };
-
-        var scratchEncode = {
-            high : 0.0,
-            low : 0.0
-        };
-
-        /**
-         * Encodes a {@link Cartesian3} with 64-bit floating-point components as two {@link Cartesian3}
-         * values that, when converted to 32-bit floating-point and added, approximate the original input.
-         * <p>
-         * The fixed-point encoding follows {@link http://blogs.agi.com/insight3d/index.php/2008/09/03/precisions-precisions/|Precisions, Precisions}.
-         * </p>
-         *
-         * @param {Cartesian3} cartesian The cartesian to encode.
-         * @param {EncodedCartesian3} [result] The object onto which to store the result.
-         * @returns {EncodedCartesian3} The modified result parameter or a new EncodedCartesian3 instance if one was not provided.
-         *
-         * @example
-         * var cart = new Cesium.Cartesian3(-10000000.0, 0.0, 10000000.0);
-         * var encoded = Cesium.EncodedCartesian3.fromCartesian(cart);
-         */
-        EncodedCartesian3.fromCartesian = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new EncodedCartesian3();
-            }
-
-            var high = result.high;
-            var low = result.low;
-
-            EncodedCartesian3.encode(cartesian.x, scratchEncode);
-            high.x = scratchEncode.high;
-            low.x = scratchEncode.low;
-
-            EncodedCartesian3.encode(cartesian.y, scratchEncode);
-            high.y = scratchEncode.high;
-            low.y = scratchEncode.low;
-
-            EncodedCartesian3.encode(cartesian.z, scratchEncode);
-            high.z = scratchEncode.high;
-            low.z = scratchEncode.low;
-
-            return result;
-        };
-
-        var encodedP = new EncodedCartesian3();
-
-        /**
-         * Encodes the provided <code>cartesian</code>, and writes it to an array with <code>high</code>
-         * components followed by <code>low</code> components, i.e. <code>[high.x, high.y, high.z, low.x, low.y, low.z]</code>.
-         * <p>
-         * This is used to create interleaved high-precision position vertex attributes.
-         * </p>
-         *
-         * @param {Cartesian3} cartesian The cartesian to encode.
-         * @param {Number[]} cartesianArray The array to write to.
-         * @param {Number} index The index into the array to start writing.  Six elements will be written.
-         *
-         * @exception {DeveloperError} index must be a number greater than or equal to 0.
-         *
-         * @example
-         * var positions = [
-         *    new Cesium.Cartesian3(),
-         *    // ...
-         * ];
-         * var encodedPositions = new Float32Array(2 * 3 * positions.length);
-         * var j = 0;
-         * for (var i = 0; i < positions.length; ++i) {
-         *   Cesium.EncodedCartesian3.writeElement(positions[i], encodedPositions, j);
-         *   j += 6;
-         * }
-         */
-        EncodedCartesian3.writeElements = function(cartesian, cartesianArray, index) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('cartesianArray', cartesianArray);
-            Check.Check.typeOf.number('index', index);
-            Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-            //>>includeEnd('debug');
-
-            EncodedCartesian3.fromCartesian(cartesian, encodedP);
-            var high = encodedP.high;
-            var low = encodedP.low;
-
-            cartesianArray[index] = high.x;
-            cartesianArray[index + 1] = high.y;
-            cartesianArray[index + 2] = high.z;
-            cartesianArray[index + 3] = low.x;
-            cartesianArray[index + 4] = low.y;
-            cartesianArray[index + 5] = low.z;
-        };
-
-    exports.EncodedCartesian3 = EncodedCartesian3;
-
-});
diff --git a/public/libs/Cesium/Workers/FeatureDetection-7bd32c34.js b/public/libs/Cesium/Workers/FeatureDetection-7bd32c34.js
deleted file mode 100644
index be5ccc2..0000000
--- a/public/libs/Cesium/Workers/FeatureDetection-7bd32c34.js
+++ /dev/null
@@ -1,626 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60'], function (exports, when) { 'use strict';
-
-    var _supportsFullscreen;
-        var _names = {
-            requestFullscreen : undefined,
-            exitFullscreen : undefined,
-            fullscreenEnabled : undefined,
-            fullscreenElement : undefined,
-            fullscreenchange : undefined,
-            fullscreenerror : undefined
-        };
-
-        /**
-         * Browser-independent functions for working with the standard fullscreen API.
-         *
-         * @exports Fullscreen
-         * @namespace
-         *
-         * @see {@link http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html|W3C Fullscreen Living Specification}
-         */
-        var Fullscreen = {};
-
-        Object.defineProperties(Fullscreen, {
-            /**
-             * The element that is currently fullscreen, if any.  To simply check if the
-             * browser is in fullscreen mode or not, use {@link Fullscreen#fullscreen}.
-             * @memberof Fullscreen
-             * @type {Object}
-             * @readonly
-             */
-            element : {
-                get : function() {
-                    if (!Fullscreen.supportsFullscreen()) {
-                        return undefined;
-                    }
-
-                    return document[_names.fullscreenElement];
-                }
-            },
-
-            /**
-             * The name of the event on the document that is fired when fullscreen is
-             * entered or exited.  This event name is intended for use with addEventListener.
-             * In your event handler, to determine if the browser is in fullscreen mode or not,
-             * use {@link Fullscreen#fullscreen}.
-             * @memberof Fullscreen
-             * @type {String}
-             * @readonly
-             */
-            changeEventName : {
-                get : function() {
-                    if (!Fullscreen.supportsFullscreen()) {
-                        return undefined;
-                    }
-
-                    return _names.fullscreenchange;
-                }
-            },
-
-            /**
-             * The name of the event that is fired when a fullscreen error
-             * occurs.  This event name is intended for use with addEventListener.
-             * @memberof Fullscreen
-             * @type {String}
-             * @readonly
-             */
-            errorEventName : {
-                get : function() {
-                    if (!Fullscreen.supportsFullscreen()) {
-                        return undefined;
-                    }
-
-                    return _names.fullscreenerror;
-                }
-            },
-
-            /**
-             * Determine whether the browser will allow an element to be made fullscreen, or not.
-             * For example, by default, iframes cannot go fullscreen unless the containing page
-             * adds an "allowfullscreen" attribute (or prefixed equivalent).
-             * @memberof Fullscreen
-             * @type {Boolean}
-             * @readonly
-             */
-            enabled : {
-                get : function() {
-                    if (!Fullscreen.supportsFullscreen()) {
-                        return undefined;
-                    }
-
-                    return document[_names.fullscreenEnabled];
-                }
-            },
-
-            /**
-             * Determines if the browser is currently in fullscreen mode.
-             * @memberof Fullscreen
-             * @type {Boolean}
-             * @readonly
-             */
-            fullscreen : {
-                get : function() {
-                    if (!Fullscreen.supportsFullscreen()) {
-                        return undefined;
-                    }
-
-                    return Fullscreen.element !== null;
-                }
-            }
-        });
-
-        /**
-         * Detects whether the browser supports the standard fullscreen API.
-         *
-         * @returns {Boolean} <code>true</code> if the browser supports the standard fullscreen API,
-         * <code>false</code> otherwise.
-         */
-        Fullscreen.supportsFullscreen = function() {
-            if (when.defined(_supportsFullscreen)) {
-                return _supportsFullscreen;
-            }
-
-            _supportsFullscreen = false;
-
-            var body = document.body;
-            if (typeof body.requestFullscreen === 'function') {
-                // go with the unprefixed, standard set of names
-                _names.requestFullscreen = 'requestFullscreen';
-                _names.exitFullscreen = 'exitFullscreen';
-                _names.fullscreenEnabled = 'fullscreenEnabled';
-                _names.fullscreenElement = 'fullscreenElement';
-                _names.fullscreenchange = 'fullscreenchange';
-                _names.fullscreenerror = 'fullscreenerror';
-                _supportsFullscreen = true;
-                return _supportsFullscreen;
-            }
-
-            //check for the correct combination of prefix plus the various names that browsers use
-            var prefixes = ['webkit', 'moz', 'o', 'ms', 'khtml'];
-            var name;
-            for (var i = 0, len = prefixes.length; i < len; ++i) {
-                var prefix = prefixes[i];
-
-                // casing of Fullscreen differs across browsers
-                name = prefix + 'RequestFullscreen';
-                if (typeof body[name] === 'function') {
-                    _names.requestFullscreen = name;
-                    _supportsFullscreen = true;
-                } else {
-                    name = prefix + 'RequestFullScreen';
-                    if (typeof body[name] === 'function') {
-                        _names.requestFullscreen = name;
-                        _supportsFullscreen = true;
-                    }
-                }
-
-                // disagreement about whether it's "exit" as per spec, or "cancel"
-                name = prefix + 'ExitFullscreen';
-                if (typeof document[name] === 'function') {
-                    _names.exitFullscreen = name;
-                } else {
-                    name = prefix + 'CancelFullScreen';
-                    if (typeof document[name] === 'function') {
-                        _names.exitFullscreen = name;
-                    }
-                }
-
-                // casing of Fullscreen differs across browsers
-                name = prefix + 'FullscreenEnabled';
-                if (document[name] !== undefined) {
-                    _names.fullscreenEnabled = name;
-                } else {
-                    name = prefix + 'FullScreenEnabled';
-                    if (document[name] !== undefined) {
-                        _names.fullscreenEnabled = name;
-                    }
-                }
-
-                // casing of Fullscreen differs across browsers
-                name = prefix + 'FullscreenElement';
-                if (document[name] !== undefined) {
-                    _names.fullscreenElement = name;
-                } else {
-                    name = prefix + 'FullScreenElement';
-                    if (document[name] !== undefined) {
-                        _names.fullscreenElement = name;
-                    }
-                }
-
-                // thankfully, event names are all lowercase per spec
-                name = prefix + 'fullscreenchange';
-                // event names do not have 'on' in the front, but the property on the document does
-                if (document['on' + name] !== undefined) {
-                    //except on IE
-                    if (prefix === 'ms') {
-                        name = 'MSFullscreenChange';
-                    }
-                    _names.fullscreenchange = name;
-                }
-
-                name = prefix + 'fullscreenerror';
-                if (document['on' + name] !== undefined) {
-                    //except on IE
-                    if (prefix === 'ms') {
-                        name = 'MSFullscreenError';
-                    }
-                    _names.fullscreenerror = name;
-                }
-            }
-
-            return _supportsFullscreen;
-        };
-
-        /**
-         * Asynchronously requests the browser to enter fullscreen mode on the given element.
-         * If fullscreen mode is not supported by the browser, does nothing.
-         *
-         * @param {Object} element The HTML element which will be placed into fullscreen mode.
-         * @param {HMDVRDevice} [vrDevice] The VR device.
-         *
-         * @example
-         * // Put the entire page into fullscreen.
-         * Cesium.Fullscreen.requestFullscreen(document.body)
-         *
-         * // Place only the Cesium canvas into fullscreen.
-         * Cesium.Fullscreen.requestFullscreen(scene.canvas)
-         */
-        Fullscreen.requestFullscreen = function(element, vrDevice) {
-            if (!Fullscreen.supportsFullscreen()) {
-                return;
-            }
-
-            element[_names.requestFullscreen]({ vrDisplay: vrDevice });
-        };
-
-        /**
-         * Asynchronously exits fullscreen mode.  If the browser is not currently
-         * in fullscreen, or if fullscreen mode is not supported by the browser, does nothing.
-         */
-        Fullscreen.exitFullscreen = function() {
-            if (!Fullscreen.supportsFullscreen()) {
-                return;
-            }
-
-            document[_names.exitFullscreen]();
-        };
-
-        //For unit tests
-        Fullscreen._names = _names;
-
-    var theNavigator;
-    if (typeof navigator !== 'undefined') {
-        theNavigator = navigator;
-    } else {
-        theNavigator = {};
-    }
-
-    function extractVersion(versionString) {
-        var parts = versionString.split('.');
-        for (var i = 0, len = parts.length; i < len; ++i) {
-            parts[i] = parseInt(parts[i], 10);
-        }
-        return parts;
-    }
-
-    var isChromeResult;
-    var chromeVersionResult;
-    function isChrome() {
-        if (!when.defined(isChromeResult)) {
-            isChromeResult = false;
-            // Edge contains Chrome in the user agent too
-            if (!isEdge()) {
-                var fields = (/ Chrome\/([\.0-9]+)/).exec(theNavigator.userAgent);
-                if (fields !== null) {
-                    isChromeResult = true;
-                    chromeVersionResult = extractVersion(fields[1]);
-                }
-            }
-        }
-
-        return isChromeResult;
-    }
-
-    function chromeVersion() {
-        return isChrome() && chromeVersionResult;
-    }
-
-    var isSafariResult;
-    var safariVersionResult;
-    function isSafari() {
-        if (!when.defined(isSafariResult)) {
-            isSafariResult = false;
-
-            // Chrome and Edge contain Safari in the user agent too
-            if (!isChrome() && !isEdge() && (/ Safari\/[\.0-9]+/).test(theNavigator.userAgent)) {
-                var fields = (/ Version\/([\.0-9]+)/).exec(theNavigator.userAgent);
-                if (fields !== null) {
-                    isSafariResult = true;
-                    safariVersionResult = extractVersion(fields[1]);
-                }
-            }
-        }
-
-        return isSafariResult;
-    }
-
-    function safariVersion() {
-        return isSafari() && safariVersionResult;
-    }
-
-    var isWebkitResult;
-    var webkitVersionResult;
-    function isWebkit() {
-        if (!when.defined(isWebkitResult)) {
-            isWebkitResult = false;
-
-            var fields = (/ AppleWebKit\/([\.0-9]+)(\+?)/).exec(theNavigator.userAgent);
-            if (fields !== null) {
-                isWebkitResult = true;
-                webkitVersionResult = extractVersion(fields[1]);
-                webkitVersionResult.isNightly = !!fields[2];
-            }
-        }
-
-        return isWebkitResult;
-    }
-
-    function webkitVersion() {
-        return isWebkit() && webkitVersionResult;
-    }
-
-    var isInternetExplorerResult;
-    var internetExplorerVersionResult;
-    function isInternetExplorer() {
-        if (!when.defined(isInternetExplorerResult)) {
-            isInternetExplorerResult = false;
-
-            var fields;
-            if (theNavigator.appName === 'Microsoft Internet Explorer') {
-                fields = /MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(theNavigator.userAgent);
-                if (fields !== null) {
-                    isInternetExplorerResult = true;
-                    internetExplorerVersionResult = extractVersion(fields[1]);
-                }
-            } else if (theNavigator.appName === 'Netscape') {
-                fields = /Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.exec(theNavigator.userAgent);
-                if (fields !== null) {
-                    isInternetExplorerResult = true;
-                    internetExplorerVersionResult = extractVersion(fields[1]);
-                }
-            }
-        }
-        return isInternetExplorerResult;
-    }
-
-    function internetExplorerVersion() {
-        return isInternetExplorer() && internetExplorerVersionResult;
-    }
-
-    var isEdgeResult;
-    var edgeVersionResult;
-    function isEdge() {
-        if (!when.defined(isEdgeResult)) {
-            isEdgeResult = false;
-            var fields = (/ Edge\/([\.0-9]+)/).exec(theNavigator.userAgent);
-            if (fields !== null) {
-                isEdgeResult = true;
-                edgeVersionResult = extractVersion(fields[1]);
-            }
-        }
-        return isEdgeResult;
-    }
-
-    function edgeVersion() {
-        return isEdge() && edgeVersionResult;
-    }
-
-    var isFirefoxResult;
-    var firefoxVersionResult;
-    function isFirefox() {
-        if (!when.defined(isFirefoxResult)) {
-            isFirefoxResult = false;
-
-            var fields = /Firefox\/([\.0-9]+)/.exec(theNavigator.userAgent);
-            if (fields !== null) {
-                isFirefoxResult = true;
-                firefoxVersionResult = extractVersion(fields[1]);
-            }
-        }
-        return isFirefoxResult;
-    }
-
-    var isWindowsResult;
-    function isWindows() {
-        if (!when.defined(isWindowsResult)) {
-            isWindowsResult = /Windows/i.test(theNavigator.appVersion);
-        }
-        return isWindowsResult;
-    }
-
-    function firefoxVersion() {
-        return isFirefox() && firefoxVersionResult;
-    }
-
-    var isNodeJsResult;
-    function isNodeJs() {
-        if (!when.defined(isNodeJsResult)) {
-            isNodeJsResult = typeof process === 'object' && Object.prototype.toString.call(process) === '[object process]'; // eslint-disable-line
-        }
-        return isNodeJsResult;
-    }
-
-    var hasPointerEvents;
-    function supportsPointerEvents() {
-        if (!when.defined(hasPointerEvents)) {
-            //While navigator.pointerEnabled is deprecated in the W3C specification
-            //we still need to use it if it exists in order to support browsers
-            //that rely on it, such as the Windows WebBrowser control which defines
-            //PointerEvent but sets navigator.pointerEnabled to false.
-
-            //Firefox disabled because of https://github.com/AnalyticalGraphicsInc/cesium/issues/6372
-            hasPointerEvents = !isFirefox() && typeof PointerEvent !== 'undefined' && (!when.defined(theNavigator.pointerEnabled) || theNavigator.pointerEnabled);
-        }
-        return hasPointerEvents;
-    }
-
-    var imageRenderingValueResult;
-    var supportsImageRenderingPixelatedResult;
-    function supportsImageRenderingPixelated() {
-        if (!when.defined(supportsImageRenderingPixelatedResult)) {
-            var canvas = document.createElement('canvas');
-            canvas.setAttribute('style',
-                'image-rendering: -moz-crisp-edges;' +
-                'image-rendering: pixelated;');
-            //canvas.style.imageRendering will be undefined, null or an empty string on unsupported browsers.
-            var tmp = canvas.style.imageRendering;
-            supportsImageRenderingPixelatedResult = when.defined(tmp) && tmp !== '';
-            if (supportsImageRenderingPixelatedResult) {
-                imageRenderingValueResult = tmp;
-            }
-        }
-        return supportsImageRenderingPixelatedResult;
-    }
-
-    function imageRenderingValue() {
-        return supportsImageRenderingPixelated() ? imageRenderingValueResult : undefined;
-    }
-
-    var supportsWebPResult;
-    var supportsWebPPromise;
-    function supportsWebP() {
-        // From https://developers.google.com/speed/webp/faq#how_can_i_detect_browser_support_for_webp
-        if (when.defined(supportsWebPPromise)) {
-            return supportsWebPPromise.promise;
-        }
-
-        supportsWebPPromise = when.when.defer();
-        if (isEdge()) {
-            // Edge's WebP support with WebGL is incomplete.
-            // See bug report: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/19221241/
-            supportsWebPResult = false;
-            supportsWebPPromise.resolve(supportsWebPResult);
-        }
-
-        var image = new Image();
-        image.onload = function () {
-            supportsWebPResult = (image.width > 0) && (image.height > 0);
-            supportsWebPPromise.resolve(supportsWebPResult);
-        };
-
-        image.onerror = function () {
-            supportsWebPResult = false;
-            supportsWebPPromise.resolve(supportsWebPResult);
-        };
-
-        image.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';
-
-        return supportsWebPPromise.promise;
-    }
-
-    function supportsWebPSync() {
-        if (!when.defined(supportsWebPPromise)) {
-            supportsWebP();
-        }
-        return supportsWebPResult;
-    }
-
-    var typedArrayTypes = [];
-    if (typeof ArrayBuffer !== 'undefined') {
-        typedArrayTypes.push(Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array);
-
-        if (typeof Uint8ClampedArray !== 'undefined') {
-            typedArrayTypes.push(Uint8ClampedArray);
-        }
-
-        if (typeof CanvasPixelArray !== 'undefined') {
-            typedArrayTypes.push(CanvasPixelArray);
-        }
-    }
-
-    /**
-     * A set of functions to detect whether the current browser supports
-     * various features.
-     *
-     * @exports FeatureDetection
-     */
-    var FeatureDetection = {
-        isChrome : isChrome,
-        chromeVersion : chromeVersion,
-        isSafari : isSafari,
-        safariVersion : safariVersion,
-        isWebkit : isWebkit,
-        webkitVersion : webkitVersion,
-        isInternetExplorer : isInternetExplorer,
-        internetExplorerVersion : internetExplorerVersion,
-        isEdge : isEdge,
-        edgeVersion : edgeVersion,
-        isFirefox : isFirefox,
-        firefoxVersion : firefoxVersion,
-        isWindows : isWindows,
-        isNodeJs : isNodeJs,
-        hardwareConcurrency : when.defaultValue(theNavigator.hardwareConcurrency, 3),
-        supportsPointerEvents : supportsPointerEvents,
-        supportsImageRenderingPixelated: supportsImageRenderingPixelated,
-        supportsWebP: supportsWebP,
-        supportsWebPSync: supportsWebPSync,
-        imageRenderingValue: imageRenderingValue,
-        typedArrayTypes: typedArrayTypes,
-        isPCBroswer : isPCBroswer
-    };
-
-    /**
-     * Detects whether the current browser supports the full screen standard.
-     *
-     * @returns {Boolean} true if the browser supports the full screen standard, false if not.
-     *
-     * @see Fullscreen
-     * @see {@link http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html|W3C Fullscreen Living Specification}
-     */
-    FeatureDetection.supportsFullscreen = function() {
-        return Fullscreen.supportsFullscreen();
-    };
-
-    /**
-     * Detects whether the current browser supports typed arrays.
-     *
-     * @returns {Boolean} true if the browser supports typed arrays, false if not.
-     *
-     * @see {@link http://www.khronos.org/registry/typedarray/specs/latest/|Typed Array Specification}
-     */
-    FeatureDetection.supportsTypedArrays = function() {
-        return typeof ArrayBuffer !== 'undefined';
-    };
-
-    /**
-     * Detects whether the current browser supports Web Workers.
-     *
-     * @returns {Boolean} true if the browsers supports Web Workers, false if not.
-     *
-     * @see {@link http://www.w3.org/TR/workers/}
-     */
-    FeatureDetection.supportsWebWorkers = function() {
-        return typeof Worker !== 'undefined';
-    };
-
-    /**
-     * Detects whether the current browser supports Web Assembly.
-     *
-     * @returns {Boolean} true if the browsers supports Web Assembly, false if not.
-     *
-     * @see {@link https://developer.mozilla.org/en-US/docs/WebAssembly}
-     */
-    FeatureDetection.supportsWebAssembly = function() {
-        return typeof WebAssembly !== 'undefined' && !FeatureDetection.isEdge();
-    };
-
-    /**
-     * Detects whether the current browser supports OffscreenCanvas.
-     * @returns {Boolean} true if the browsers supports OffscreenCanvas, false if not.
-     */
-    FeatureDetection.supportsOffscreenCanvas = function() {
-        return typeof OffscreenCanvas !== 'undefined' && !FeatureDetection.isEdge();
-    };
-
-    function isPCBroswer() {
-        var sUserAgent = window.navigator.userAgent.toLowerCase();
-        var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
-        var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
-        var bIsMidp = sUserAgent.match(/midp/i) == "midp";
-        var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
-        var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
-        var bIsAndroid = sUserAgent.match(/android/i) == "android";
-        var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
-        var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
-        if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) {
-            return false;
-        } else {
-            return true;
-        }
-    }
-
-    exports.FeatureDetection = FeatureDetection;
-
-});
diff --git a/public/libs/Cesium/Workers/FrustumGeometry-da141fc6.js b/public/libs/Cesium/Workers/FrustumGeometry-da141fc6.js
deleted file mode 100644
index 9811f08..0000000
--- a/public/libs/Cesium/Workers/FrustumGeometry-da141fc6.js
+++ /dev/null
@@ -1,2232 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './Transforms-a1cf7267', './GeometryAttributes-aacecde6', './Plane-8390418f', './VertexFormat-fe4db402'], function (exports, when, Check, _Math, Cartographic, BoundingSphere, Cartesian4, ComponentDatatype, GeometryAttribute, PrimitiveType, Transforms, GeometryAttributes, Plane, VertexFormat) { 'use strict';
-
-    /**
-         * The culling volume defined by planes.
-         *
-         * @alias CullingVolume
-         * @constructor
-         *
-         * @param {Cartesian4[]} [planes] An array of clipping planes.
-         */
-        function CullingVolume(planes) {
-            /**
-             * Each plane is represented by a Cartesian4 object, where the x, y, and z components
-             * define the unit vector normal to the plane, and the w component is the distance of the
-             * plane from the origin.
-             * @type {Cartesian4[]}
-             * @default []
-             */
-            this.planes = when.defaultValue(planes, []);
-        }
-
-        var faces = [new Cartographic.Cartesian3(), new Cartographic.Cartesian3(), new Cartographic.Cartesian3()];
-        Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_X, faces[0]);
-        Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_Y, faces[1]);
-        Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_Z, faces[2]);
-
-        var scratchPlaneCenter = new Cartographic.Cartesian3();
-        var scratchPlaneNormal = new Cartographic.Cartesian3();
-        var scratchPlane = new Plane.Plane(new Cartographic.Cartesian3(1.0, 0.0, 0.0), 0.0);
-
-        /**
-         * Constructs a culling volume from a bounding sphere. Creates six planes that create a box containing the sphere.
-         * The planes are aligned to the x, y, and z axes in world coordinates.
-         *
-         * @param {BoundingSphere} boundingSphere The bounding sphere used to create the culling volume.
-         * @param {CullingVolume} [result] The object onto which to store the result.
-         * @returns {CullingVolume} The culling volume created from the bounding sphere.
-         */
-        CullingVolume.fromBoundingSphere = function(boundingSphere, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(boundingSphere)) {
-                throw new Check.DeveloperError('boundingSphere is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new CullingVolume();
-            }
-
-            var length = faces.length;
-            var planes = result.planes;
-            planes.length = 2 * length;
-
-            var center = boundingSphere.center;
-            var radius = boundingSphere.radius;
-
-            var planeIndex = 0;
-
-            for (var i = 0; i < length; ++i) {
-                var faceNormal = faces[i];
-
-                var plane0 = planes[planeIndex];
-                var plane1 = planes[planeIndex + 1];
-
-                if (!when.defined(plane0)) {
-                    plane0 = planes[planeIndex] = new Cartesian4.Cartesian4();
-                }
-                if (!when.defined(plane1)) {
-                    plane1 = planes[planeIndex + 1] = new Cartesian4.Cartesian4();
-                }
-
-                Cartographic.Cartesian3.multiplyByScalar(faceNormal, -radius, scratchPlaneCenter);
-                Cartographic.Cartesian3.add(center, scratchPlaneCenter, scratchPlaneCenter);
-
-                plane0.x = faceNormal.x;
-                plane0.y = faceNormal.y;
-                plane0.z = faceNormal.z;
-                plane0.w = -Cartographic.Cartesian3.dot(faceNormal, scratchPlaneCenter);
-
-                Cartographic.Cartesian3.multiplyByScalar(faceNormal, radius, scratchPlaneCenter);
-                Cartographic.Cartesian3.add(center, scratchPlaneCenter, scratchPlaneCenter);
-
-                plane1.x = -faceNormal.x;
-                plane1.y = -faceNormal.y;
-                plane1.z = -faceNormal.z;
-                plane1.w = -Cartographic.Cartesian3.dot(Cartographic.Cartesian3.negate(faceNormal, scratchPlaneNormal), scratchPlaneCenter);
-
-                planeIndex += 2;
-            }
-
-            return result;
-        };
-
-        /**
-         * Determines whether a bounding volume intersects the culling volume.
-         *
-         * @param {Object} boundingVolume The bounding volume whose intersection with the culling volume is to be tested.
-         * @returns {Intersect}  Intersect.OUTSIDE, Intersect.INTERSECTING, or Intersect.INSIDE.
-         */
-        CullingVolume.prototype.computeVisibility = function(boundingVolume) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(boundingVolume)) {
-                throw new Check.DeveloperError('boundingVolume is required.');
-            }
-            //>>includeEnd('debug');
-
-            var planes = this.planes;
-            var intersecting = false;
-            for (var k = 0, len = planes.length; k < len; ++k) {
-                var result = boundingVolume.intersectPlane(Plane.Plane.fromCartesian4(planes[k], scratchPlane));
-                if (result === BoundingSphere.Intersect.OUTSIDE) {
-                    return BoundingSphere.Intersect.OUTSIDE;
-                } else if (result === BoundingSphere.Intersect.INTERSECTING) {
-                    intersecting = true;
-                }
-            }
-
-            return intersecting ? BoundingSphere.Intersect.INTERSECTING : BoundingSphere.Intersect.INSIDE;
-        };
-
-        /**
-         * Determines whether a bounding volume intersects the culling volume.
-         *
-         * @param {Object} boundingVolume The bounding volume whose intersection with the culling volume is to be tested.
-         * @param {Number} parentPlaneMask A bit mask from the boundingVolume's parent's check against the same culling
-         *                                 volume, such that if (planeMask & (1 << planeIndex) === 0), for k < 31, then
-         *                                 the parent (and therefore this) volume is completely inside plane[planeIndex]
-         *                                 and that plane check can be skipped.
-         * @returns {Number} A plane mask as described above (which can be applied to this boundingVolume's children).
-         *
-         * @private
-         */
-        CullingVolume.prototype.computeVisibilityWithPlaneMask = function(boundingVolume, parentPlaneMask) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(boundingVolume)) {
-                throw new Check.DeveloperError('boundingVolume is required.');
-            }
-            if (!when.defined(parentPlaneMask)) {
-                throw new Check.DeveloperError('parentPlaneMask is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (parentPlaneMask === CullingVolume.MASK_OUTSIDE || parentPlaneMask === CullingVolume.MASK_INSIDE) {
-                // parent is completely outside or completely inside, so this child is as well.
-                return parentPlaneMask;
-            }
-
-            // Start with MASK_INSIDE (all zeros) so that after the loop, the return value can be compared with MASK_INSIDE.
-            // (Because if there are fewer than 31 planes, the upper bits wont be changed.)
-            var mask = CullingVolume.MASK_INSIDE;
-
-            var planes = this.planes;
-            for (var k = 0, len = planes.length; k < len; ++k) {
-                // For k greater than 31 (since 31 is the maximum number of INSIDE/INTERSECTING bits we can store), skip the optimization.
-                var flag = (k < 31) ? (1 << k) : 0;
-                if (k < 31 && (parentPlaneMask & flag) === 0) {
-                    // boundingVolume is known to be INSIDE this plane.
-                    continue;
-                }
-
-                var result = boundingVolume.intersectPlane(Plane.Plane.fromCartesian4(planes[k], scratchPlane));
-                if (result === BoundingSphere.Intersect.OUTSIDE) {
-                    return CullingVolume.MASK_OUTSIDE;
-                } else if (result === BoundingSphere.Intersect.INTERSECTING) {
-                    mask |= flag;
-                }
-            }
-
-            return mask;
-        };
-
-        /**
-         * For plane masks (as used in {@link CullingVolume#computeVisibilityWithPlaneMask}), this special value
-         * represents the case where the object bounding volume is entirely outside the culling volume.
-         *
-         * @type {Number}
-         * @private
-         */
-        CullingVolume.MASK_OUTSIDE = 0xffffffff;
-
-        /**
-         * For plane masks (as used in {@link CullingVolume.prototype.computeVisibilityWithPlaneMask}), this value
-         * represents the case where the object bounding volume is entirely inside the culling volume.
-         *
-         * @type {Number}
-         * @private
-         */
-        CullingVolume.MASK_INSIDE = 0x00000000;
-
-        /**
-         * For plane masks (as used in {@link CullingVolume.prototype.computeVisibilityWithPlaneMask}), this value
-         * represents the case where the object bounding volume (may) intersect all planes of the culling volume.
-         *
-         * @type {Number}
-         * @private
-         */
-        CullingVolume.MASK_INDETERMINATE = 0x7fffffff;
-
-    /**
-         * The viewing frustum is defined by 6 planes.
-         * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components
-         * define the unit vector normal to the plane, and the w component is the distance of the
-         * plane from the origin/camera position.
-         *
-         * @alias OrthographicOffCenterFrustum
-         * @constructor
-         *
-         * @param {Object} [options] An object with the following properties:
-         * @param {Number} [options.left] The left clipping plane distance.
-         * @param {Number} [options.right] The right clipping plane distance.
-         * @param {Number} [options.top] The top clipping plane distance.
-         * @param {Number} [options.bottom] The bottom clipping plane distance.
-         * @param {Number} [options.near=1.0] The near clipping plane distance.
-         * @param {Number} [options.far=500000000.0] The far clipping plane distance.
-         *
-         * @example
-         * var maxRadii = ellipsoid.maximumRadius;
-         *
-         * var frustum = new Cesium.OrthographicOffCenterFrustum();
-         * frustum.right = maxRadii * Cesium.Math.PI;
-         * frustum.left = -c.frustum.right;
-         * frustum.top = c.frustum.right * (canvas.clientHeight / canvas.clientWidth);
-         * frustum.bottom = -c.frustum.top;
-         * frustum.near = 0.01 * maxRadii;
-         * frustum.far = 50.0 * maxRadii;
-         */
-        function OrthographicOffCenterFrustum(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            /**
-             * The left clipping plane.
-             * @type {Number}
-             * @default undefined
-             */
-            this.left = options.left;
-            this._left = undefined;
-
-            /**
-             * The right clipping plane.
-             * @type {Number}
-             * @default undefined
-             */
-            this.right = options.right;
-            this._right = undefined;
-
-            /**
-             * The top clipping plane.
-             * @type {Number}
-             * @default undefined
-             */
-            this.top = options.top;
-            this._top = undefined;
-
-            /**
-             * The bottom clipping plane.
-             * @type {Number}
-             * @default undefined
-             */
-            this.bottom = options.bottom;
-            this._bottom = undefined;
-
-            /**
-             * The distance of the near plane.
-             * @type {Number}
-             * @default 1.0
-             */
-            this.near = when.defaultValue(options.near, 1.0);
-            this._near = this.near;
-
-            /**
-             * The distance of the far plane.
-             * @type {Number}
-             * @default 500000000.0;
-             */
-            this.far = when.defaultValue(options.far, 500000000.0);
-            this._far = this.far;
-
-            this._cullingVolume = new CullingVolume();
-            this._orthographicMatrix = new BoundingSphere.Matrix4();
-        }
-
-        function update(frustum) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(frustum.right) || !when.defined(frustum.left) ||
-                !when.defined(frustum.top) || !when.defined(frustum.bottom) ||
-                !when.defined(frustum.near) || !when.defined(frustum.far)) {
-                throw new Check.DeveloperError('right, left, top, bottom, near, or far parameters are not set.');
-            }
-            //>>includeEnd('debug');
-
-            if (frustum.top !== frustum._top || frustum.bottom !== frustum._bottom ||
-                frustum.left !== frustum._left || frustum.right !== frustum._right ||
-                frustum.near !== frustum._near || frustum.far !== frustum._far) {
-
-                //>>includeStart('debug', pragmas.debug);
-                if (frustum.left > frustum.right) {
-                    throw new Check.DeveloperError('right must be greater than left.');
-                }
-                if (frustum.bottom > frustum.top) {
-                    throw new Check.DeveloperError('top must be greater than bottom.');
-                }
-                if (frustum.near <= 0 || frustum.near > frustum.far) {
-                    throw new Check.DeveloperError('near must be greater than zero and less than far.');
-                }
-                //>>includeEnd('debug');
-
-                frustum._left = frustum.left;
-                frustum._right = frustum.right;
-                frustum._top = frustum.top;
-                frustum._bottom = frustum.bottom;
-                frustum._near = frustum.near;
-                frustum._far = frustum.far;
-                frustum._orthographicMatrix = BoundingSphere.Matrix4.computeOrthographicOffCenter(frustum.left, frustum.right, frustum.bottom, frustum.top, frustum.near, frustum.far, frustum._orthographicMatrix);
-            }
-        }
-
-        Object.defineProperties(OrthographicOffCenterFrustum.prototype, {
-            /**
-             * Gets the orthographic projection matrix computed from the view frustum.
-             * @memberof OrthographicOffCenterFrustum.prototype
-             * @type {Matrix4}
-             * @readonly
-             */
-            projectionMatrix : {
-                get : function() {
-                    update(this);
-                    return this._orthographicMatrix;
-                }
-            }
-        });
-
-        var getPlanesRight = new Cartographic.Cartesian3();
-        var getPlanesNearCenter = new Cartographic.Cartesian3();
-        var getPlanesPoint = new Cartographic.Cartesian3();
-        var negateScratch = new Cartographic.Cartesian3();
-
-        /**
-         * Creates a culling volume for this frustum.
-         *
-         * @param {Cartesian3} position The eye position.
-         * @param {Cartesian3} direction The view direction.
-         * @param {Cartesian3} up The up direction.
-         * @returns {CullingVolume} A culling volume at the given position and orientation.
-         *
-         * @example
-         * // Check if a bounding volume intersects the frustum.
-         * var cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp);
-         * var intersect = cullingVolume.computeVisibility(boundingVolume);
-         */
-        OrthographicOffCenterFrustum.prototype.computeCullingVolume = function(position, direction, up) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(position)) {
-                throw new Check.DeveloperError('position is required.');
-            }
-            if (!when.defined(direction)) {
-                throw new Check.DeveloperError('direction is required.');
-            }
-            if (!when.defined(up)) {
-                throw new Check.DeveloperError('up is required.');
-            }
-            //>>includeEnd('debug');
-
-            var planes = this._cullingVolume.planes;
-            var t = this.top;
-            var b = this.bottom;
-            var r = this.right;
-            var l = this.left;
-            var n = this.near;
-            var f = this.far;
-
-            var right = Cartographic.Cartesian3.cross(direction, up, getPlanesRight);
-            Cartographic.Cartesian3.normalize(right, right);
-            var nearCenter = getPlanesNearCenter;
-            Cartographic.Cartesian3.multiplyByScalar(direction, n, nearCenter);
-            Cartographic.Cartesian3.add(position, nearCenter, nearCenter);
-
-            var point = getPlanesPoint;
-
-            // Left plane
-            Cartographic.Cartesian3.multiplyByScalar(right, l, point);
-            Cartographic.Cartesian3.add(nearCenter, point, point);
-
-            var plane = planes[0];
-            if (!when.defined(plane)) {
-                plane = planes[0] = new Cartesian4.Cartesian4();
-            }
-            plane.x = right.x;
-            plane.y = right.y;
-            plane.z = right.z;
-            plane.w = -Cartographic.Cartesian3.dot(right, point);
-
-            // Right plane
-            Cartographic.Cartesian3.multiplyByScalar(right, r, point);
-            Cartographic.Cartesian3.add(nearCenter, point, point);
-
-            plane = planes[1];
-            if (!when.defined(plane)) {
-                plane = planes[1] = new Cartesian4.Cartesian4();
-            }
-            plane.x = -right.x;
-            plane.y = -right.y;
-            plane.z = -right.z;
-            plane.w = -Cartographic.Cartesian3.dot(Cartographic.Cartesian3.negate(right, negateScratch), point);
-
-            // Bottom plane
-            Cartographic.Cartesian3.multiplyByScalar(up, b, point);
-            Cartographic.Cartesian3.add(nearCenter, point, point);
-
-            plane = planes[2];
-            if (!when.defined(plane)) {
-                plane = planes[2] = new Cartesian4.Cartesian4();
-            }
-            plane.x = up.x;
-            plane.y = up.y;
-            plane.z = up.z;
-            plane.w = -Cartographic.Cartesian3.dot(up, point);
-
-            // Top plane
-            Cartographic.Cartesian3.multiplyByScalar(up, t, point);
-            Cartographic.Cartesian3.add(nearCenter, point, point);
-
-            plane = planes[3];
-            if (!when.defined(plane)) {
-                plane = planes[3] = new Cartesian4.Cartesian4();
-            }
-            plane.x = -up.x;
-            plane.y = -up.y;
-            plane.z = -up.z;
-            plane.w = -Cartographic.Cartesian3.dot(Cartographic.Cartesian3.negate(up, negateScratch), point);
-
-            // Near plane
-            plane = planes[4];
-            if (!when.defined(plane)) {
-                plane = planes[4] = new Cartesian4.Cartesian4();
-            }
-            plane.x = direction.x;
-            plane.y = direction.y;
-            plane.z = direction.z;
-            plane.w = -Cartographic.Cartesian3.dot(direction, nearCenter);
-
-            // Far plane
-            Cartographic.Cartesian3.multiplyByScalar(direction, f, point);
-            Cartographic.Cartesian3.add(position, point, point);
-
-            plane = planes[5];
-            if (!when.defined(plane)) {
-                plane = planes[5] = new Cartesian4.Cartesian4();
-            }
-            plane.x = -direction.x;
-            plane.y = -direction.y;
-            plane.z = -direction.z;
-            plane.w = -Cartographic.Cartesian3.dot(Cartographic.Cartesian3.negate(direction, negateScratch), point);
-
-            return this._cullingVolume;
-        };
-
-        /**
-         * Returns the pixel's width and height in meters.
-         *
-         * @param {Number} drawingBufferWidth The width of the drawing buffer.
-         * @param {Number} drawingBufferHeight The height of the drawing buffer.
-         * @param {Number} distance The distance to the near plane in meters.
-         * @param {Number} pixelRatio The scaling factor from pixel space to coordinate space.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively.
-         *
-         * @exception {DeveloperError} drawingBufferWidth must be greater than zero.
-         * @exception {DeveloperError} drawingBufferHeight must be greater than zero.
-         * @exception {DeveloperError} pixelRatio must be greater than zero.
-         *
-         * @example
-         * // Example 1
-         * // Get the width and height of a pixel.
-         * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 0.0, scene.pixelRatio, new Cesium.Cartesian2());
-         */
-        OrthographicOffCenterFrustum.prototype.getPixelDimensions = function(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result) {
-            update(this);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(drawingBufferWidth) || !when.defined(drawingBufferHeight)) {
-                throw new Check.DeveloperError('Both drawingBufferWidth and drawingBufferHeight are required.');
-            }
-            if (drawingBufferWidth <= 0) {
-                throw new Check.DeveloperError('drawingBufferWidth must be greater than zero.');
-            }
-            if (drawingBufferHeight <= 0) {
-                throw new Check.DeveloperError('drawingBufferHeight must be greater than zero.');
-            }
-            if (!when.defined(distance)) {
-                throw new Check.DeveloperError('distance is required.');
-            }
-            if (!when.defined(pixelRatio)) {
-                throw new Check.DeveloperError('pixelRatio is required.');
-            }
-            if (pixelRatio <= 0) {
-                throw new Check.DeveloperError('pixelRatio must be greater than zero.');
-            }
-            if (!when.defined(result)) {
-                throw new Check.DeveloperError('A result object is required.');
-            }
-            //>>includeEnd('debug');
-
-            var frustumWidth = this.right - this.left;
-            var frustumHeight = this.top - this.bottom;
-            var pixelWidth = pixelRatio * frustumWidth / drawingBufferWidth;
-            var pixelHeight = pixelRatio * frustumHeight / drawingBufferHeight;
-
-            result.x = pixelWidth;
-            result.y = pixelHeight;
-            return result;
-        };
-
-        /**
-         * Returns a duplicate of a OrthographicOffCenterFrustum instance.
-         *
-         * @param {OrthographicOffCenterFrustum} [result] The object onto which to store the result.
-         * @returns {OrthographicOffCenterFrustum} The modified result parameter or a new OrthographicOffCenterFrustum instance if one was not provided.
-         */
-        OrthographicOffCenterFrustum.prototype.clone = function(result) {
-            if (!when.defined(result)) {
-                result = new OrthographicOffCenterFrustum();
-            }
-
-            result.left = this.left;
-            result.right = this.right;
-            result.top = this.top;
-            result.bottom = this.bottom;
-            result.near = this.near;
-            result.far = this.far;
-
-            // force update of clone to compute matrices
-            result._left = undefined;
-            result._right = undefined;
-            result._top = undefined;
-            result._bottom = undefined;
-            result._near = undefined;
-            result._far = undefined;
-
-            return result;
-        };
-
-        /**
-         * Compares the provided OrthographicOffCenterFrustum componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {OrthographicOffCenterFrustum} [other] The right hand side OrthographicOffCenterFrustum.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        OrthographicOffCenterFrustum.prototype.equals = function(other) {
-            return (when.defined(other) && other instanceof OrthographicOffCenterFrustum &&
-                    this.right === other.right &&
-                    this.left === other.left &&
-                    this.top === other.top &&
-                    this.bottom === other.bottom &&
-                    this.near === other.near &&
-                    this.far === other.far);
-        };
-
-        /**
-         * Compares the provided OrthographicOffCenterFrustum componentwise and returns
-         * <code>true</code> if they pass an absolute or relative tolerance test,
-         * <code>false</code> otherwise.
-         *
-         * @param {OrthographicOffCenterFrustum} other The right hand side OrthographicOffCenterFrustum.
-         * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-         * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-         * @returns {Boolean} <code>true</code> if this and other are within the provided epsilon, <code>false</code> otherwise.
-         */
-        OrthographicOffCenterFrustum.prototype.equalsEpsilon = function(other, relativeEpsilon, absoluteEpsilon) {
-            return (other === this) ||
-                   (when.defined(other) &&
-                    other instanceof OrthographicOffCenterFrustum &&
-                    _Math.CesiumMath.equalsEpsilon(this.right, other.right, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(this.left, other.left, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(this.top, other.top, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(this.bottom, other.bottom, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(this.near, other.near, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(this.far, other.far, relativeEpsilon, absoluteEpsilon));
-        };
-
-    /**
-         * The viewing frustum is defined by 6 planes.
-         * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components
-         * define the unit vector normal to the plane, and the w component is the distance of the
-         * plane from the origin/camera position.
-         *
-         * @alias OrthographicFrustum
-         * @constructor
-         *
-         * @param {Object} [options] An object with the following properties:
-         * @param {Number} [options.width] The width of the frustum in meters.
-         * @param {Number} [options.aspectRatio] The aspect ratio of the frustum's width to it's height.
-         * @param {Number} [options.near=1.0] The distance of the near plane.
-         * @param {Number} [options.far=500000000.0] The distance of the far plane.
-         *
-         * @example
-         * var maxRadii = ellipsoid.maximumRadius;
-         *
-         * var frustum = new Cesium.OrthographicFrustum();
-         * frustum.near = 0.01 * maxRadii;
-         * frustum.far = 50.0 * maxRadii;
-         */
-        function OrthographicFrustum(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            this._offCenterFrustum = new OrthographicOffCenterFrustum();
-
-            /**
-             * The horizontal width of the frustum in meters.
-             * @type {Number}
-             * @default undefined
-             */
-            this.width = options.width;
-            this._width = undefined;
-
-            /**
-             * The aspect ratio of the frustum's width to it's height.
-             * @type {Number}
-             * @default undefined
-             */
-            this.aspectRatio = options.aspectRatio;
-            this._aspectRatio = undefined;
-
-            /**
-             * The distance of the near plane.
-             * @type {Number}
-             * @default 1.0
-             */
-            this.near = when.defaultValue(options.near, 1.0);
-            this._near = this.near;
-
-            /**
-             * The distance of the far plane.
-             * @type {Number}
-             * @default 500000000.0;
-             */
-            this.far = when.defaultValue(options.far, 500000000.0);
-            this._far = this.far;
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        OrthographicFrustum.packedLength = 4;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {OrthographicFrustum} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        OrthographicFrustum.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value.width;
-            array[startingIndex++] = value.aspectRatio;
-            array[startingIndex++] = value.near;
-            array[startingIndex] = value.far;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {OrthographicFrustum} [result] The object into which to store the result.
-         * @returns {OrthographicFrustum} The modified result parameter or a new OrthographicFrustum instance if one was not provided.
-         */
-        OrthographicFrustum.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new OrthographicFrustum();
-            }
-
-            result.width = array[startingIndex++];
-            result.aspectRatio = array[startingIndex++];
-            result.near = array[startingIndex++];
-            result.far = array[startingIndex];
-
-            return result;
-        };
-
-        function update$1(frustum) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(frustum.width) || !when.defined(frustum.aspectRatio) || !when.defined(frustum.near) || !when.defined(frustum.far)) {
-                throw new Check.DeveloperError('width, aspectRatio, near, or far parameters are not set.');
-            }
-            //>>includeEnd('debug');
-
-            var f = frustum._offCenterFrustum;
-
-            if (frustum.width !== frustum._width || frustum.aspectRatio !== frustum._aspectRatio ||
-                frustum.near !== frustum._near || frustum.far !== frustum._far) {
-                //>>includeStart('debug', pragmas.debug);
-                if (frustum.aspectRatio < 0) {
-                    throw new Check.DeveloperError('aspectRatio must be positive.');
-                }
-                if (frustum.near < 0 || frustum.near > frustum.far) {
-                    throw new Check.DeveloperError('near must be greater than zero and less than far.');
-                }
-                //>>includeEnd('debug');
-
-                frustum._aspectRatio = frustum.aspectRatio;
-                frustum._width = frustum.width;
-                frustum._near = frustum.near;
-                frustum._far = frustum.far;
-
-                var ratio = 1.0 / frustum.aspectRatio;
-                f.right = frustum.width * 0.5;
-                f.left = -f.right;
-                f.top = ratio * f.right;
-                f.bottom = -f.top;
-                f.near = frustum.near;
-                f.far = frustum.far;
-
-            }
-        }
-
-        Object.defineProperties(OrthographicFrustum.prototype, {
-            /**
-             * Gets the orthographic projection matrix computed from the view frustum.
-             * @memberof OrthographicFrustum.prototype
-             * @type {Matrix4}
-             * @readonly
-             */
-            projectionMatrix : {
-                get : function() {
-                    update$1(this);
-                    return this._offCenterFrustum.projectionMatrix;
-                }
-            }
-
-        });
-
-        /**
-         * Creates a culling volume for this frustum.
-         *
-         * @param {Cartesian3} position The eye position.
-         * @param {Cartesian3} direction The view direction.
-         * @param {Cartesian3} up The up direction.
-         * @returns {CullingVolume} A culling volume at the given position and orientation.
-         *
-         * @example
-         * // Check if a bounding volume intersects the frustum.
-         * var cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp);
-         * var intersect = cullingVolume.computeVisibility(boundingVolume);
-         */
-        OrthographicFrustum.prototype.computeCullingVolume = function(position, direction, up) {
-            update$1(this);
-            return this._offCenterFrustum.computeCullingVolume(position, direction, up);
-        };
-
-        /**
-         * Returns the pixel's width and height in meters.
-         *
-         * @param {Number} drawingBufferWidth The width of the drawing buffer.
-         * @param {Number} drawingBufferHeight The height of the drawing buffer.
-         * @param {Number} distance The distance to the near plane in meters.
-         * @param {Number} pixelRatio The scaling factor from pixel space to coordinate space.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively.
-         *
-         * @exception {DeveloperError} drawingBufferWidth must be greater than zero.
-         * @exception {DeveloperError} drawingBufferHeight must be greater than zero.
-         * @exception {DeveloperError} pixelRatio must be greater than zero.
-         *
-         * @example
-         * // Example 1
-         * // Get the width and height of a pixel.
-         * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 0.0, scene.pixelRatio, new Cesium.Cartesian2());
-         */
-        OrthographicFrustum.prototype.getPixelDimensions = function(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result) {
-            update$1(this);
-            return this._offCenterFrustum.getPixelDimensions(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result);
-        };
-
-        /**
-         * Returns a duplicate of a OrthographicFrustum instance.
-         *
-         * @param {OrthographicFrustum} [result] The object onto which to store the result.
-         * @returns {OrthographicFrustum} The modified result parameter or a new OrthographicFrustum instance if one was not provided.
-         */
-        OrthographicFrustum.prototype.clone = function(result) {
-            if (!when.defined(result)) {
-                result = new OrthographicFrustum();
-            }
-
-            result.aspectRatio = this.aspectRatio;
-            result.width = this.width;
-            result.near = this.near;
-            result.far = this.far;
-
-            // force update of clone to compute matrices
-            result._aspectRatio = undefined;
-            result._width = undefined;
-            result._near = undefined;
-            result._far = undefined;
-
-            this._offCenterFrustum.clone(result._offCenterFrustum);
-
-            return result;
-        };
-
-        /**
-         * Compares the provided OrthographicFrustum componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {OrthographicFrustum} [other] The right hand side OrthographicFrustum.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        OrthographicFrustum.prototype.equals = function(other) {
-            if (!when.defined(other) || !(other instanceof OrthographicFrustum)) {
-                return false;
-            }
-
-            update$1(this);
-            update$1(other);
-
-            return (this.width === other.width &&
-                    this.aspectRatio === other.aspectRatio &&
-                    this._offCenterFrustum.equals(other._offCenterFrustum));
-        };
-
-        /**
-         * Compares the provided OrthographicFrustum componentwise and returns
-         * <code>true</code> if they pass an absolute or relative tolerance test,
-         * <code>false</code> otherwise.
-         *
-         * @param {OrthographicFrustum} other The right hand side OrthographicFrustum.
-         * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-         * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-         * @returns {Boolean} <code>true</code> if this and other are within the provided epsilon, <code>false</code> otherwise.
-         */
-        OrthographicFrustum.prototype.equalsEpsilon = function(other, relativeEpsilon, absoluteEpsilon) {
-            if (!when.defined(other) || !(other instanceof OrthographicFrustum)) {
-                return false;
-            }
-
-            update$1(this);
-            update$1(other);
-
-            return (_Math.CesiumMath.equalsEpsilon(this.width, other.width, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(this.aspectRatio, other.aspectRatio, relativeEpsilon, absoluteEpsilon) &&
-                    this._offCenterFrustum.equalsEpsilon(other._offCenterFrustum, relativeEpsilon, absoluteEpsilon));
-        };
-
-    /**
-     * The viewing frustum is defined by 6 planes.
-     * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components
-     * define the unit vector normal to the plane, and the w component is the distance of the
-     * plane from the origin/camera position.
-     *
-     * @alias PerspectiveOffCenterFrustum
-     * @constructor
-     *
-     * @param {Object} [options] An object with the following properties:
-     * @param {Number} [options.left] The left clipping plane distance.
-     * @param {Number} [options.right] The right clipping plane distance.
-     * @param {Number} [options.top] The top clipping plane distance.
-     * @param {Number} [options.bottom] The bottom clipping plane distance.
-     * @param {Number} [options.near=1.0] The near clipping plane distance.
-     * @param {Number} [options.far=500000000.0] The far clipping plane distance.
-     *
-     * @example
-     * var frustum = new Cesium.PerspectiveOffCenterFrustum({
-     *     left : -1.0,
-     *     right : 1.0,
-     *     top : 1.0,
-     *     bottom : -1.0,
-     *     near : 1.0,
-     *     far : 100.0
-     * });
-     *
-     * @see PerspectiveFrustum
-     */
-    function PerspectiveOffCenterFrustum(options) {
-        options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-        /**
-         * Defines the left clipping plane.
-         * @type {Number}
-         * @default undefined
-         */
-        this.left = options.left;
-        this._left = undefined;
-
-        /**
-         * Defines the right clipping plane.
-         * @type {Number}
-         * @default undefined
-         */
-        this.right = options.right;
-        this._right = undefined;
-
-        /**
-         * Defines the top clipping plane.
-         * @type {Number}
-         * @default undefined
-         */
-        this.top = options.top;
-        this._top = undefined;
-
-        /**
-         * Defines the bottom clipping plane.
-         * @type {Number}
-         * @default undefined
-         */
-        this.bottom = options.bottom;
-        this._bottom = undefined;
-
-        /**
-         * The distance of the near plane.
-         * @type {Number}
-         * @default 1.0
-         */
-        this.near = when.defaultValue(options.near, 1.0);
-        this._near = this.near;
-
-        /**
-         * The distance of the far plane.
-         * @type {Number}
-         * @default 500000000.0
-         */
-        this.far = when.defaultValue(options.far, 500000000.0);
-        this._far = this.far;
-
-        this._cullingVolume = new CullingVolume();
-        this._perspectiveMatrix = new BoundingSphere.Matrix4();
-        this._infinitePerspective = new BoundingSphere.Matrix4();
-    }
-
-    function update$2(frustum) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(frustum.right) || !when.defined(frustum.left) ||
-            !when.defined(frustum.top) || !when.defined(frustum.bottom) ||
-            !when.defined(frustum.near) || !when.defined(frustum.far)) {
-            throw new Check.DeveloperError('right, left, top, bottom, near, or far parameters are not set.');
-        }
-        //>>includeEnd('debug');
-
-        var t = frustum.top;
-        var b = frustum.bottom;
-        var r = frustum.right;
-        var l = frustum.left;
-        var n = frustum.near;
-        var f = frustum.far;
-
-        if (t !== frustum._top || b !== frustum._bottom ||
-            l !== frustum._left || r !== frustum._right ||
-            n !== frustum._near || f !== frustum._far) {
-
-            //>>includeStart('debug', pragmas.debug);
-            if (frustum.near <= 0 || frustum.near > frustum.far) {
-                throw new Check.DeveloperError('near must be greater than zero and less than far.');
-            }
-            //>>includeEnd('debug');
-
-            frustum._left = l;
-            frustum._right = r;
-            frustum._top = t;
-            frustum._bottom = b;
-            frustum._near = n;
-            frustum._far = f;
-            frustum._perspectiveMatrix = BoundingSphere.Matrix4.computePerspectiveOffCenter(l, r, b, t, n, f, frustum._perspectiveMatrix);
-            frustum._infinitePerspective = BoundingSphere.Matrix4.computeInfinitePerspectiveOffCenter(l, r, b, t, n, frustum._infinitePerspective);
-        }
-    }
-
-    Object.defineProperties(PerspectiveOffCenterFrustum.prototype, {
-        /**
-         * Gets the perspective projection matrix computed from the view frustum.
-         * @memberof PerspectiveOffCenterFrustum.prototype
-         * @type {Matrix4}
-         * @readonly
-         *
-         * @see PerspectiveOffCenterFrustum#infiniteProjectionMatrix
-         */
-        projectionMatrix : {
-            get : function() {
-                update$2(this);
-                return this._perspectiveMatrix;
-            }
-        },
-
-        /**
-         * Gets the perspective projection matrix computed from the view frustum with an infinite far plane.
-         * @memberof PerspectiveOffCenterFrustum.prototype
-         * @type {Matrix4}
-         * @readonly
-         *
-         * @see PerspectiveOffCenterFrustum#projectionMatrix
-         */
-        infiniteProjectionMatrix : {
-            get : function() {
-                update$2(this);
-                return this._infinitePerspective;
-            }
-        }
-    });
-
-    var getPlanesRight$1 = new Cartographic.Cartesian3();
-    var getPlanesNearCenter$1 = new Cartographic.Cartesian3();
-    var getPlanesFarCenter = new Cartographic.Cartesian3();
-    var getPlanesNormal = new Cartographic.Cartesian3();
-
-    PerspectiveOffCenterFrustum.prototype.resetProjectionMatrix = function() {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(this.right) || !when.defined(this.left) ||
-            !when.defined(this.top) || !when.defined(this.bottom) ||
-            !when.defined(this.near) || !when.defined(this.far)) {
-            throw new Check.DeveloperError('right, left, top, bottom, near, or far parameters are not set.');
-        }
-        //>>includeEnd('debug');
-
-        var t = this.top;
-        var b = this.bottom;
-        var r = this.right;
-        var l = this.left;
-        var n = this.near;
-        var f = this.far;
-
-        //>>includeStart('debug', pragmas.debug);
-        if (this.near <= 0 || this.near > this.far) {
-            throw new Check.DeveloperError('near must be greater than zero and less than far.');
-        }
-        //>>includeEnd('debug');
-        this._left = l;
-        this._right = r;
-        this._top = t;
-        this._bottom = b;
-        this._near = n;
-        this._far = f;
-        this._perspectiveMatrix = BoundingSphere.Matrix4.computePerspectiveOffCenter(l, r, b, t, n, f, this._perspectiveMatrix);
-        this._infinitePerspective = BoundingSphere.Matrix4.computeInfinitePerspectiveOffCenter(l, r, b, t, n, this._infinitePerspective);
-    };
-    /**
-     * Creates a culling volume for this frustum.
-     *
-     * @param {Cartesian3} position The eye position.
-     * @param {Cartesian3} direction The view direction.
-     * @param {Cartesian3} up The up direction.
-     * @returns {CullingVolume} A culling volume at the given position and orientation.
-     *
-     * @example
-     * // Check if a bounding volume intersects the frustum.
-     * var cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp);
-     * var intersect = cullingVolume.computeVisibility(boundingVolume);
-     */
-    PerspectiveOffCenterFrustum.prototype.computeCullingVolume = function(position, direction, up) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(position)) {
-            throw new Check.DeveloperError('position is required.');
-        }
-
-        if (!when.defined(direction)) {
-            throw new Check.DeveloperError('direction is required.');
-        }
-
-        if (!when.defined(up)) {
-            throw new Check.DeveloperError('up is required.');
-        }
-        //>>includeEnd('debug');
-
-        var planes = this._cullingVolume.planes;
-
-        var t = this.top;
-        var b = this.bottom;
-        var r = this.right;
-        var l = this.left;
-        var n = this.near;
-        var f = this.far;
-
-        var right = Cartographic.Cartesian3.cross(direction, up, getPlanesRight$1);
-
-        var nearCenter = getPlanesNearCenter$1;
-        Cartographic.Cartesian3.multiplyByScalar(direction, n, nearCenter);
-        Cartographic.Cartesian3.add(position, nearCenter, nearCenter);
-
-        var farCenter = getPlanesFarCenter;
-        Cartographic.Cartesian3.multiplyByScalar(direction, f, farCenter);
-        Cartographic.Cartesian3.add(position, farCenter, farCenter);
-
-        var normal = getPlanesNormal;
-
-        //Left plane computation
-        Cartographic.Cartesian3.multiplyByScalar(right, l, normal);
-        Cartographic.Cartesian3.add(nearCenter, normal, normal);
-        Cartographic.Cartesian3.subtract(normal, position, normal);
-        Cartographic.Cartesian3.normalize(normal, normal);
-        Cartographic.Cartesian3.cross(normal, up, normal);
-        Cartographic.Cartesian3.normalize(normal, normal);
-
-        var plane = planes[0];
-        if (!when.defined(plane)) {
-            plane = planes[0] = new Cartesian4.Cartesian4();
-        }
-        plane.x = normal.x;
-        plane.y = normal.y;
-        plane.z = normal.z;
-        plane.w = -Cartographic.Cartesian3.dot(normal, position);
-
-        //Right plane computation
-        Cartographic.Cartesian3.multiplyByScalar(right, r, normal);
-        Cartographic.Cartesian3.add(nearCenter, normal, normal);
-        Cartographic.Cartesian3.subtract(normal, position, normal);
-        Cartographic.Cartesian3.cross(up, normal, normal);
-        Cartographic.Cartesian3.normalize(normal, normal);
-
-        plane = planes[1];
-        if (!when.defined(plane)) {
-            plane = planes[1] = new Cartesian4.Cartesian4();
-        }
-        plane.x = normal.x;
-        plane.y = normal.y;
-        plane.z = normal.z;
-        plane.w = -Cartographic.Cartesian3.dot(normal, position);
-
-        //Bottom plane computation
-        Cartographic.Cartesian3.multiplyByScalar(up, b, normal);
-        Cartographic.Cartesian3.add(nearCenter, normal, normal);
-        Cartographic.Cartesian3.subtract(normal, position, normal);
-        Cartographic.Cartesian3.cross(right, normal, normal);
-        Cartographic.Cartesian3.normalize(normal, normal);
-
-        plane = planes[2];
-        if (!when.defined(plane)) {
-            plane = planes[2] = new Cartesian4.Cartesian4();
-        }
-        plane.x = normal.x;
-        plane.y = normal.y;
-        plane.z = normal.z;
-        plane.w = -Cartographic.Cartesian3.dot(normal, position);
-
-        //Top plane computation
-        Cartographic.Cartesian3.multiplyByScalar(up, t, normal);
-        Cartographic.Cartesian3.add(nearCenter, normal, normal);
-        Cartographic.Cartesian3.subtract(normal, position, normal);
-        Cartographic.Cartesian3.cross(normal, right, normal);
-        Cartographic.Cartesian3.normalize(normal, normal);
-
-        plane = planes[3];
-        if (!when.defined(plane)) {
-            plane = planes[3] = new Cartesian4.Cartesian4();
-        }
-        plane.x = normal.x;
-        plane.y = normal.y;
-        plane.z = normal.z;
-        plane.w = -Cartographic.Cartesian3.dot(normal, position);
-
-        //Near plane computation
-        plane = planes[4];
-        if (!when.defined(plane)) {
-            plane = planes[4] = new Cartesian4.Cartesian4();
-        }
-        plane.x = direction.x;
-        plane.y = direction.y;
-        plane.z = direction.z;
-        plane.w = -Cartographic.Cartesian3.dot(direction, nearCenter);
-
-        //Far plane computation
-        Cartographic.Cartesian3.negate(direction, normal);
-
-        plane = planes[5];
-        if (!when.defined(plane)) {
-            plane = planes[5] = new Cartesian4.Cartesian4();
-        }
-        plane.x = normal.x;
-        plane.y = normal.y;
-        plane.z = normal.z;
-        plane.w = -Cartographic.Cartesian3.dot(normal, farCenter);
-
-        return this._cullingVolume;
-    };
-
-    /**
-     * Returns the pixel's width and height in meters.
-     *
-     * @param {Number} drawingBufferWidth The width of the drawing buffer.
-     * @param {Number} drawingBufferHeight The height of the drawing buffer.
-     * @param {Number} distance The distance to the near plane in meters.
-     * @param {Number} pixelRatio The scaling factor from pixel space to coordinate space.
-     * @param {Cartesian2} result The object onto which to store the result.
-     * @returns {Cartesian2} The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively.
-     *
-     * @exception {DeveloperError} drawingBufferWidth must be greater than zero.
-     * @exception {DeveloperError} drawingBufferHeight must be greater than zero.
-     * @exception {DeveloperError} pixelRatio must be greater than zero.
-     *
-     * @example
-     * // Example 1
-     * // Get the width and height of a pixel.
-     * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 1.0, scene.pixelRatio, new Cesium.Cartesian2());
-     *
-     * @example
-     * // Example 2
-     * // Get the width and height of a pixel if the near plane was set to 'distance'.
-     * // For example, get the size of a pixel of an image on a billboard.
-     * var position = camera.position;
-     * var direction = camera.direction;
-     * var toCenter = Cesium.Cartesian3.subtract(primitive.boundingVolume.center, position, new Cesium.Cartesian3());      // vector from camera to a primitive
-     * var toCenterProj = Cesium.Cartesian3.multiplyByScalar(direction, Cesium.Cartesian3.dot(direction, toCenter), new Cesium.Cartesian3()); // project vector onto camera direction vector
-     * var distance = Cesium.Cartesian3.magnitude(toCenterProj);
-     * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, distance, scene.pixelRatio, new Cesium.Cartesian2());
-     */
-    PerspectiveOffCenterFrustum.prototype.getPixelDimensions = function(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result) {
-        update$2(this);
-
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(drawingBufferWidth) || !when.defined(drawingBufferHeight)) {
-            throw new Check.DeveloperError('Both drawingBufferWidth and drawingBufferHeight are required.');
-        }
-        if (drawingBufferWidth <= 0) {
-            throw new Check.DeveloperError('drawingBufferWidth must be greater than zero.');
-        }
-        if (drawingBufferHeight <= 0) {
-            throw new Check.DeveloperError('drawingBufferHeight must be greater than zero.');
-        }
-        if (!when.defined(distance)) {
-            throw new Check.DeveloperError('distance is required.');
-        }
-        if (!when.defined(pixelRatio)) {
-            throw new Check.DeveloperError('pixelRatio is required');
-        }
-        if (pixelRatio <= 0) {
-            throw new Check.DeveloperError('pixelRatio must be greater than zero.');
-        }
-        if (!when.defined(result)) {
-            throw new Check.DeveloperError('A result object is required.');
-        }
-        //>>includeEnd('debug');
-
-        var inverseNear = 1.0 / this.near;
-        var tanTheta = this.top * inverseNear;
-        var pixelHeight = 2.0 * pixelRatio * distance * tanTheta / drawingBufferHeight;
-        tanTheta = this.right * inverseNear;
-        var pixelWidth = 2.0 * pixelRatio * distance * tanTheta / drawingBufferWidth;
-
-        result.x = pixelWidth;
-        result.y = pixelHeight;
-        return result;
-    };
-
-    /**
-     * Returns a duplicate of a PerspectiveOffCenterFrustum instance.
-     *
-     * @param {PerspectiveOffCenterFrustum} [result] The object onto which to store the result.
-     * @returns {PerspectiveOffCenterFrustum} The modified result parameter or a new PerspectiveFrustum instance if one was not provided.
-     */
-    PerspectiveOffCenterFrustum.prototype.clone = function(result) {
-        if (!when.defined(result)) {
-            result = new PerspectiveOffCenterFrustum();
-        }
-
-        result.right = this.right;
-        result.left = this.left;
-        result.top = this.top;
-        result.bottom = this.bottom;
-        result.near = this.near;
-        result.far = this.far;
-
-        // force update of clone to compute matrices
-        result._left = undefined;
-        result._right = undefined;
-        result._top = undefined;
-        result._bottom = undefined;
-        result._near = undefined;
-        result._far = undefined;
-
-        return result;
-    };
-
-    /**
-     * Compares the provided PerspectiveOffCenterFrustum componentwise and returns
-     * <code>true</code> if they are equal, <code>false</code> otherwise.
-     *
-     * @param {PerspectiveOffCenterFrustum} [other] The right hand side PerspectiveOffCenterFrustum.
-     * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-     */
-    PerspectiveOffCenterFrustum.prototype.equals = function(other) {
-        return (when.defined(other) && other instanceof PerspectiveOffCenterFrustum &&
-                this.right === other.right &&
-                this.left === other.left &&
-                this.top === other.top &&
-                this.bottom === other.bottom &&
-                this.near === other.near &&
-                this.far === other.far);
-    };
-
-    /**
-     * Compares the provided PerspectiveOffCenterFrustum componentwise and returns
-     * <code>true</code> if they pass an absolute or relative tolerance test,
-     * <code>false</code> otherwise.
-     *
-     * @param {PerspectiveOffCenterFrustum} other The right hand side PerspectiveOffCenterFrustum.
-     * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-     * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-     * @returns {Boolean} <code>true</code> if this and other are within the provided epsilon, <code>false</code> otherwise.
-     */
-    PerspectiveOffCenterFrustum.prototype.equalsEpsilon = function(other, relativeEpsilon, absoluteEpsilon) {
-        return (other === this) ||
-               (when.defined(other) &&
-                other instanceof PerspectiveOffCenterFrustum &&
-                _Math.CesiumMath.equalsEpsilon(this.right, other.right, relativeEpsilon, absoluteEpsilon) &&
-                _Math.CesiumMath.equalsEpsilon(this.left, other.left, relativeEpsilon, absoluteEpsilon) &&
-                _Math.CesiumMath.equalsEpsilon(this.top, other.top, relativeEpsilon, absoluteEpsilon) &&
-                _Math.CesiumMath.equalsEpsilon(this.bottom, other.bottom, relativeEpsilon, absoluteEpsilon) &&
-                _Math.CesiumMath.equalsEpsilon(this.near, other.near, relativeEpsilon, absoluteEpsilon) &&
-                _Math.CesiumMath.equalsEpsilon(this.far, other.far, relativeEpsilon, absoluteEpsilon));
-    };
-
-    /**
-     * The viewing frustum is defined by 6 planes.
-     * Each plane is represented by a {@link Cartesian4} object, where the x, y, and z components
-     * define the unit vector normal to the plane, and the w component is the distance of the
-     * plane from the origin/camera position.
-     *
-     * @alias PerspectiveFrustum
-     * @constructor
-     *
-     * @param {Object} [options] An object with the following properties:
-     * @param {Number} [options.fov] The angle of the field of view (FOV), in radians.
-     * @param {Number} [options.aspectRatio] The aspect ratio of the frustum's width to it's height.
-     * @param {Number} [options.near=1.0] The distance of the near plane.
-     * @param {Number} [options.far=500000000.0] The distance of the far plane.
-     * @param {Number} [options.xOffset=0.0] The offset in the x direction.
-     * @param {Number} [options.yOffset=0.0] The offset in the y direction.
-     *
-     * @example
-     * var frustum = new Cesium.PerspectiveFrustum({
-     *     fov : Cesium.Math.PI_OVER_THREE,
-     *     aspectRatio : canvas.clientWidth / canvas.clientHeight
-     *     near : 1.0,
-     *     far : 1000.0
-     * });
-     *
-     * @see PerspectiveOffCenterFrustum
-     */
-    function PerspectiveFrustum(options) {
-        options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-        this._offCenterFrustum = new PerspectiveOffCenterFrustum();
-
-        /**
-         * The angle of the field of view (FOV), in radians.  This angle will be used
-         * as the horizontal FOV if the width is greater than the height, otherwise
-         * it will be the vertical FOV.
-         * @type {Number}
-         * @default undefined
-         */
-        this.fov = options.fov;
-        this._fov = undefined;
-        this._fovy = undefined;
-
-        this._sseDenominator = undefined;
-
-        /**
-         * The aspect ratio of the frustum's width to it's height.
-         * @type {Number}
-         * @default undefined
-         */
-        this.aspectRatio = options.aspectRatio;
-        this._aspectRatio = undefined;
-
-        /**
-         * The distance of the near plane.
-         * @type {Number}
-         * @default 1.0
-         */
-        this.near = when.defaultValue(options.near, 1.0);
-        this._near = this.near;
-
-        /**
-         * The distance of the far plane.
-         * @type {Number}
-         * @default 500000000.0
-         */
-        this.far = when.defaultValue(options.far, 500000000.0);
-        this._far = this.far;
-
-        /**
-         * Offsets the frustum in the x direction.
-         * @type {Number}
-         * @default 0.0
-         */
-        this.xOffset = when.defaultValue(options.xOffset, 0.0);
-        this._xOffset = this.xOffset;
-
-        /**
-         * Offsets the frustum in the y direction.
-         * @type {Number}
-         * @default 0.0
-         */
-        this.yOffset = when.defaultValue(options.yOffset, 0.0);
-        this._yOffset = this.yOffset;
-        this.reflect = false;
-    }
-
-    /**
-     * The number of elements used to pack the object into an array.
-     * @type {Number}
-     */
-    PerspectiveFrustum.packedLength = 6;
-
-    /**
-     * Stores the provided instance into the provided array.
-     *
-     * @param {PerspectiveFrustum} value The value to pack.
-     * @param {Number[]} array The array to pack into.
-     * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-     *
-     * @returns {Number[]} The array that was packed into
-     */
-    PerspectiveFrustum.pack = function(value, array, startingIndex) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('value', value);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        startingIndex = when.defaultValue(startingIndex, 0);
-
-        array[startingIndex++] = value.fov;
-        array[startingIndex++] = value.aspectRatio;
-        array[startingIndex++] = value.near;
-        array[startingIndex++] = value.far;
-        array[startingIndex++] = value.xOffset;
-        array[startingIndex] = value.yOffset;
-
-        return array;
-    };
-
-    /**
-     * Retrieves an instance from a packed array.
-     *
-     * @param {Number[]} array The packed array.
-     * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-     * @param {PerspectiveFrustum} [result] The object into which to store the result.
-     * @returns {PerspectiveFrustum} The modified result parameter or a new PerspectiveFrustum instance if one was not provided.
-     */
-    PerspectiveFrustum.unpack = function(array, startingIndex, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        startingIndex = when.defaultValue(startingIndex, 0);
-
-        if (!when.defined(result)) {
-            result = new PerspectiveFrustum();
-        }
-
-        result.fov = array[startingIndex++];
-        result.aspectRatio = array[startingIndex++];
-        result.near = array[startingIndex++];
-        result.far = array[startingIndex++];
-        result.xOffset = array[startingIndex++];
-        result.yOffset = array[startingIndex];
-
-        return result;
-    };
-
-    function update$3(frustum) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(frustum.fov) || !when.defined(frustum.aspectRatio) || !when.defined(frustum.near) || !when.defined(frustum.far)) {
-            throw new Check.DeveloperError('fov, aspectRatio, near, or far parameters are not set.');
-        }
-        //>>includeEnd('debug');
-
-        var f = frustum._offCenterFrustum;
-
-        if (frustum.fov !== frustum._fov || frustum.aspectRatio !== frustum._aspectRatio ||
-            frustum.near !== frustum._near || frustum.far !== frustum._far ||
-            frustum.xOffset !== frustum._xOffset || frustum.yOffset !== frustum._yOffset) {
-            //>>includeStart('debug', pragmas.debug);
-            if (frustum.fov < 0 || frustum.fov >= Math.PI) {
-                throw new Check.DeveloperError('fov must be in the range [0, PI).');
-            }
-
-            if (frustum.aspectRatio < 0) {
-                throw new Check.DeveloperError('aspectRatio must be positive.');
-            }
-
-            if (frustum.near < 0 || frustum.near > frustum.far) {
-                throw new Check.DeveloperError('near must be greater than zero and less than far.');
-            }
-            //>>includeEnd('debug');
-
-            frustum._aspectRatio = frustum.aspectRatio;
-            frustum._fov = frustum.fov;
-            frustum._fovy = (frustum.aspectRatio <= 1) ? frustum.fov : Math.atan(Math.tan(frustum.fov * 0.5) / frustum.aspectRatio) * 2.0;
-            frustum._near = frustum.near;
-            frustum._far = frustum.far;
-            frustum._sseDenominator = 2.0 * Math.tan(0.5 * frustum._fovy);
-            frustum._xOffset = frustum.xOffset;
-            frustum._yOffset = frustum.yOffset;
-
-            f.top = frustum.near * Math.tan(0.5 * frustum._fovy);
-            f.bottom = -f.top;
-            f.right = frustum.aspectRatio * f.top;
-            f.left = -f.right;
-            f.near = frustum.near;
-            f.far = frustum.far;
-
-            f.right += frustum.xOffset;
-            f.left += frustum.xOffset;
-            f.top += frustum.yOffset;
-            f.bottom += frustum.yOffset;
-        }
-    }
-
-    Object.defineProperties(PerspectiveFrustum.prototype, {
-        /**
-         * Gets the perspective projection matrix computed from the view frustum.
-         * @memberof PerspectiveFrustum.prototype
-         * @type {Matrix4}
-         * @readonly
-         *
-         * @see PerspectiveFrustum#infiniteProjectionMatrix
-         */
-        projectionMatrix : {
-            get : function() {
-                update$3(this);
-                if(this.reflect){
-                    modifyProjectionMatrix(this);
-                }
-                return this._offCenterFrustum.projectionMatrix;
-            }
-        },
-
-        /**
-         * The perspective projection matrix computed from the view frustum with an infinite far plane.
-         * @memberof PerspectiveFrustum.prototype
-         * @type {Matrix4}
-         * @readonly
-         *
-         * @see PerspectiveFrustum#projectionMatrix
-         */
-        infiniteProjectionMatrix : {
-            get : function() {
-                update$3(this);
-                return this._offCenterFrustum.infiniteProjectionMatrix;
-            }
-        },
-
-        /**
-         * Gets the angle of the vertical field of view, in radians.
-         * @memberof PerspectiveFrustum.prototype
-         * @type {Number}
-         * @readonly
-         * @default undefined
-         */
-        fovy : {
-            get : function() {
-                update$3(this);
-                return this._fovy;
-            }
-        },
-
-        /**
-         * @readonly
-         * @private
-         */
-        sseDenominator : {
-            get : function () {
-                update$3(this);
-                return this._sseDenominator;
-            }
-        }
-    });
-
-    PerspectiveFrustum.prototype.resetProjectionMatrix = function() {
-        return this._offCenterFrustum.resetProjectionMatrix();
-    };
-
-    /**
-     * Creates a culling volume for this frustum.
-     *
-     * @param {Cartesian3} position The eye position.
-     * @param {Cartesian3} direction The view direction.
-     * @param {Cartesian3} up The up direction.
-     * @returns {CullingVolume} A culling volume at the given position and orientation.
-     *
-     * @example
-     * // Check if a bounding volume intersects the frustum.
-     * var cullingVolume = frustum.computeCullingVolume(cameraPosition, cameraDirection, cameraUp);
-     * var intersect = cullingVolume.computeVisibility(boundingVolume);
-     */
-    PerspectiveFrustum.prototype.computeCullingVolume = function(position, direction, up) {
-        update$3(this);
-        return this._offCenterFrustum.computeCullingVolume(position, direction, up);
-    };
-
-    /**
-     * Returns the pixel's width and height in meters.
-     *
-     * @param {Number} drawingBufferWidth The width of the drawing buffer.
-     * @param {Number} drawingBufferHeight The height of the drawing buffer.
-     * @param {Number} distance The distance to the near plane in meters.
-     * @param {Number} pixelRatio The scaling factor from pixel space to coordinate space.
-     * @param {Cartesian2} result The object onto which to store the result.
-     * @returns {Cartesian2} The modified result parameter or a new instance of {@link Cartesian2} with the pixel's width and height in the x and y properties, respectively.
-     *
-     * @exception {DeveloperError} drawingBufferWidth must be greater than zero.
-     * @exception {DeveloperError} drawingBufferHeight must be greater than zero.
-     * @exception {DeveloperError} pixelRatio must be greater than zero.
-     *
-     * @example
-     * // Example 1
-     * // Get the width and height of a pixel.
-     * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, 1.0, scene.pixelRatio, new Cesium.Cartesian2());
-     *
-     * @example
-     * // Example 2
-     * // Get the width and height of a pixel if the near plane was set to 'distance'.
-     * // For example, get the size of a pixel of an image on a billboard.
-     * var position = camera.position;
-     * var direction = camera.direction;
-     * var toCenter = Cesium.Cartesian3.subtract(primitive.boundingVolume.center, position, new Cesium.Cartesian3());      // vector from camera to a primitive
-     * var toCenterProj = Cesium.Cartesian3.multiplyByScalar(direction, Cesium.Cartesian3.dot(direction, toCenter), new Cesium.Cartesian3()); // project vector onto camera direction vector
-     * var distance = Cesium.Cartesian3.magnitude(toCenterProj);
-     * var pixelSize = camera.frustum.getPixelDimensions(scene.drawingBufferWidth, scene.drawingBufferHeight, distance, scene.pixelRatio, new Cesium.Cartesian2());
-     */
-    PerspectiveFrustum.prototype.getPixelDimensions = function(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result) {
-        update$3(this);
-        return this._offCenterFrustum.getPixelDimensions(drawingBufferWidth, drawingBufferHeight, distance, pixelRatio, result);
-    };
-
-    /**
-     * Returns a duplicate of a PerspectiveFrustum instance.
-     *
-     * @param {PerspectiveFrustum} [result] The object onto which to store the result.
-     * @returns {PerspectiveFrustum} The modified result parameter or a new PerspectiveFrustum instance if one was not provided.
-     */
-    PerspectiveFrustum.prototype.clone = function(result) {
-        if (!when.defined(result)) {
-            result = new PerspectiveFrustum();
-        }
-
-        result.aspectRatio = this.aspectRatio;
-        result.fov = this.fov;
-        result.near = this.near;
-        result.far = this.far;
-        result.reflect = this.reflect;
-        result.clipPlane = this.clipPlane;
-        result.currentViewMatrix = this.currentViewMatrix;
-        // force update of clone to compute matrices
-        result._aspectRatio = undefined;
-        result._fov = undefined;
-        result._near = undefined;
-        result._far = undefined;
-
-        this._offCenterFrustum.clone(result._offCenterFrustum);
-
-        return result;
-    };
-
-    /**
-     * Compares the provided PerspectiveFrustum componentwise and returns
-     * <code>true</code> if they are equal, <code>false</code> otherwise.
-     *
-     * @param {PerspectiveFrustum} [other] The right hand side PerspectiveFrustum.
-     * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-     */
-    PerspectiveFrustum.prototype.equals = function(other) {
-        if (!when.defined(other) || !(other instanceof PerspectiveFrustum)) {
-            return false;
-        }
-
-        update$3(this);
-        update$3(other);
-
-        return (this.fov === other.fov &&
-                this.aspectRatio === other.aspectRatio &&
-                this._offCenterFrustum.equals(other._offCenterFrustum));
-    };
-
-    /**
-     * Compares the provided PerspectiveFrustum componentwise and returns
-     * <code>true</code> if they pass an absolute or relative tolerance test,
-     * <code>false</code> otherwise.
-     *
-     * @param {PerspectiveFrustum} other The right hand side PerspectiveFrustum.
-     * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-     * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-     * @returns {Boolean} <code>true</code> if this and other are within the provided epsilon, <code>false</code> otherwise.
-     */
-    PerspectiveFrustum.prototype.equalsEpsilon = function(other, relativeEpsilon, absoluteEpsilon) {
-        if (!when.defined(other) || !(other instanceof PerspectiveFrustum)) {
-            return false;
-        }
-
-        update$3(this);
-        update$3(other);
-
-        return (_Math.CesiumMath.equalsEpsilon(this.fov, other.fov, relativeEpsilon, absoluteEpsilon) &&
-                _Math.CesiumMath.equalsEpsilon(this.aspectRatio, other.aspectRatio, relativeEpsilon, absoluteEpsilon) &&
-                this._offCenterFrustum.equalsEpsilon(other._offCenterFrustum, relativeEpsilon, absoluteEpsilon));
-    };
-
-    var scratchViewPlane = new Plane.Plane(Cartographic.Cartesian3.UNIT_Z, 1.0);
-    var scratchQVec = new Cartesian4.Cartesian4();
-    var scratchClipPlane4d = new Cartesian4.Cartesian4();
-    var scratchResult4 = new Cartesian4.Cartesian4();
-    /**
-     * modify the near clip plane for reflection
-     */
-    function modifyProjectionMatrix(frustum) {
-        if(!when.defined(frustum.clipPlane) || !when.defined(frustum.currentViewMatrix)){
-            return;
-        }
-        var viewMatrix = frustum.currentViewMatrix;
-        var projectionMatrix = frustum._offCenterFrustum.projectionMatrix;
-        BoundingSphere.Matrix4.multiplyByPlane(viewMatrix, frustum.clipPlane, scratchViewPlane);
-        scratchQVec.x = (_Math.CesiumMath.sign(scratchViewPlane.normal.x) + projectionMatrix[8]) / projectionMatrix[0];
-        scratchQVec.y = (_Math.CesiumMath.sign(scratchViewPlane.normal.y) + projectionMatrix[9]) / projectionMatrix[5];
-        scratchQVec.z = -1.0;
-        scratchQVec.w = (1 + projectionMatrix[10]) / projectionMatrix[14];
-        scratchClipPlane4d.x = scratchViewPlane.normal.x;
-        scratchClipPlane4d.y = scratchViewPlane.normal.y;
-        scratchClipPlane4d.z = scratchViewPlane.normal.z;
-        scratchClipPlane4d.w = scratchViewPlane.distance;
-        Cartesian4.Cartesian4.multiplyByScalar(scratchClipPlane4d, 2.0 / Cartesian4.Cartesian4.dot(scratchClipPlane4d, scratchQVec), scratchResult4);
-        projectionMatrix[2] = scratchResult4.x;
-        projectionMatrix[6] = scratchResult4.y;
-        projectionMatrix[10] = scratchResult4.z + 1.0;
-        projectionMatrix[14] = scratchResult4.w;
-    }
-
-    var PERSPECTIVE = 0;
-        var ORTHOGRAPHIC = 1;
-
-        /**
-         * Describes a frustum at the given the origin and orientation.
-         *
-         * @alias FrustumGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {PerspectiveFrustum|OrthographicFrustum} options.frustum The frustum.
-         * @param {Cartesian3} options.origin The origin of the frustum.
-         * @param {Quaternion} options.orientation The orientation of the frustum.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         */
-        function FrustumGeometry(options) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('options', options);
-            Check.Check.typeOf.object('options.frustum', options.frustum);
-            Check.Check.typeOf.object('options.origin', options.origin);
-            Check.Check.typeOf.object('options.orientation', options.orientation);
-            //>>includeEnd('debug');
-
-            var frustum = options.frustum;
-            var orientation = options.orientation;
-            var origin = options.origin;
-            var vertexFormat = when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT);
-
-            // This is private because it is used by DebugCameraPrimitive to draw a multi-frustum by
-            // creating multiple FrustumGeometrys. This way the near plane of one frustum doesn't overlap
-            // the far plane of another.
-            var drawNearPlane = when.defaultValue(options._drawNearPlane, true);
-
-            var frustumType;
-            var frustumPackedLength;
-            if (frustum instanceof PerspectiveFrustum) {
-                frustumType = PERSPECTIVE;
-                frustumPackedLength = PerspectiveFrustum.packedLength;
-            } else if (frustum instanceof OrthographicFrustum) {
-                frustumType = ORTHOGRAPHIC;
-                frustumPackedLength = OrthographicFrustum.packedLength;
-            }
-
-            this._frustumType = frustumType;
-            this._frustum = frustum.clone();
-            this._origin = Cartographic.Cartesian3.clone(origin);
-            this._orientation = Transforms.Quaternion.clone(orientation);
-            this._drawNearPlane = drawNearPlane;
-            this._vertexFormat = vertexFormat;
-            this._workerName = 'createFrustumGeometry';
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = 2 + frustumPackedLength + Cartographic.Cartesian3.packedLength + Transforms.Quaternion.packedLength + VertexFormat.VertexFormat.packedLength;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {FrustumGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        FrustumGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var frustumType = value._frustumType;
-            var frustum = value._frustum;
-
-            array[startingIndex++] = frustumType;
-
-            if (frustumType === PERSPECTIVE) {
-                PerspectiveFrustum.pack(frustum, array, startingIndex);
-                startingIndex += PerspectiveFrustum.packedLength;
-            } else {
-                OrthographicFrustum.pack(frustum, array, startingIndex);
-                startingIndex += OrthographicFrustum.packedLength;
-            }
-
-            Cartographic.Cartesian3.pack(value._origin, array, startingIndex);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-            Transforms.Quaternion.pack(value._orientation, array, startingIndex);
-            startingIndex += Transforms.Quaternion.packedLength;
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-            array[startingIndex] = value._drawNearPlane ? 1.0 : 0.0;
-
-            return array;
-        };
-
-        var scratchPackPerspective = new PerspectiveFrustum();
-        var scratchPackOrthographic = new OrthographicFrustum();
-        var scratchPackQuaternion = new Transforms.Quaternion();
-        var scratchPackorigin = new Cartographic.Cartesian3();
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {FrustumGeometry} [result] The object into which to store the result.
-         */
-        FrustumGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var frustumType = array[startingIndex++];
-
-            var frustum;
-            if (frustumType === PERSPECTIVE) {
-                frustum = PerspectiveFrustum.unpack(array, startingIndex, scratchPackPerspective);
-                startingIndex += PerspectiveFrustum.packedLength;
-            } else {
-                frustum = OrthographicFrustum.unpack(array, startingIndex, scratchPackOrthographic);
-                startingIndex += OrthographicFrustum.packedLength;
-            }
-
-            var origin = Cartographic.Cartesian3.unpack(array, startingIndex, scratchPackorigin);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-            var orientation = Transforms.Quaternion.unpack(array, startingIndex, scratchPackQuaternion);
-            startingIndex += Transforms.Quaternion.packedLength;
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-            var drawNearPlane = array[startingIndex] === 1.0;
-
-            if (!when.defined(result)) {
-                return new FrustumGeometry({
-                    frustum : frustum,
-                    origin : origin,
-                    orientation : orientation,
-                    vertexFormat : vertexFormat,
-                    _drawNearPlane : drawNearPlane
-                });
-            }
-
-            var frustumResult = frustumType === result._frustumType ? result._frustum : undefined;
-            result._frustum = frustum.clone(frustumResult);
-
-            result._frustumType = frustumType;
-            result._origin = Cartographic.Cartesian3.clone(origin, result._origin);
-            result._orientation = Transforms.Quaternion.clone(orientation, result._orientation);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._drawNearPlane = drawNearPlane;
-
-            return result;
-        };
-
-        function getAttributes(offset, normals, tangents, bitangents, st, normal, tangent, bitangent) {
-            var stOffset = offset / 3 * 2;
-
-            for (var i = 0; i < 4; ++i) {
-                if (when.defined(normals)) {
-                    normals[offset] = normal.x;
-                    normals[offset + 1] = normal.y;
-                    normals[offset + 2] = normal.z;
-                }
-                if (when.defined(tangents)) {
-                    tangents[offset] = tangent.x;
-                    tangents[offset + 1] = tangent.y;
-                    tangents[offset + 2] = tangent.z;
-                }
-                if (when.defined(bitangents)) {
-                    bitangents[offset] = bitangent.x;
-                    bitangents[offset + 1] = bitangent.y;
-                    bitangents[offset + 2] = bitangent.z;
-                }
-                offset += 3;
-            }
-
-            st[stOffset] = 0.0;
-            st[stOffset + 1] = 0.0;
-            st[stOffset + 2] = 1.0;
-            st[stOffset + 3] = 0.0;
-            st[stOffset + 4] = 1.0;
-            st[stOffset + 5] = 1.0;
-            st[stOffset + 6] = 0.0;
-            st[stOffset + 7] = 1.0;
-        }
-
-        var scratchRotationMatrix = new BoundingSphere.Matrix3();
-        var scratchViewMatrix = new BoundingSphere.Matrix4();
-        var scratchInverseMatrix = new BoundingSphere.Matrix4();
-
-        var scratchXDirection = new Cartographic.Cartesian3();
-        var scratchYDirection = new Cartographic.Cartesian3();
-        var scratchZDirection = new Cartographic.Cartesian3();
-        var scratchNegativeX = new Cartographic.Cartesian3();
-        var scratchNegativeY = new Cartographic.Cartesian3();
-        var scratchNegativeZ = new Cartographic.Cartesian3();
-
-        var frustumSplits = new Array(3);
-
-        var frustumCornersNDC = new Array(4);
-        frustumCornersNDC[0] = new Cartesian4.Cartesian4(-1.0, -1.0, 1.0, 1.0);
-        frustumCornersNDC[1] = new Cartesian4.Cartesian4(1.0, -1.0, 1.0, 1.0);
-        frustumCornersNDC[2] = new Cartesian4.Cartesian4(1.0, 1.0, 1.0, 1.0);
-        frustumCornersNDC[3] = new Cartesian4.Cartesian4(-1.0, 1.0, 1.0, 1.0);
-
-        var scratchFrustumCorners = new Array(4);
-        for (var i = 0; i < 4; ++i) {
-            scratchFrustumCorners[i] = new Cartesian4.Cartesian4();
-        }
-
-        FrustumGeometry._computeNearFarPlanes = function(origin, orientation, frustumType, frustum, positions, xDirection, yDirection, zDirection) {
-            var rotationMatrix = BoundingSphere.Matrix3.fromQuaternion(orientation, scratchRotationMatrix);
-            var x = when.defaultValue(xDirection, scratchXDirection);
-            var y = when.defaultValue(yDirection, scratchYDirection);
-            var z = when.defaultValue(zDirection, scratchZDirection);
-
-            x = BoundingSphere.Matrix3.getColumn(rotationMatrix, 0, x);
-            y = BoundingSphere.Matrix3.getColumn(rotationMatrix, 1, y);
-            z = BoundingSphere.Matrix3.getColumn(rotationMatrix, 2, z);
-
-            Cartographic.Cartesian3.normalize(x, x);
-            Cartographic.Cartesian3.normalize(y, y);
-            Cartographic.Cartesian3.normalize(z, z);
-
-            Cartographic.Cartesian3.negate(x, x);
-
-            var view = BoundingSphere.Matrix4.computeView(origin, z, y, x, scratchViewMatrix);
-
-            var inverseView;
-            var inverseViewProjection;
-            if (frustumType === PERSPECTIVE) {
-                var projection = frustum.projectionMatrix;
-                var viewProjection = BoundingSphere.Matrix4.multiply(projection, view, scratchInverseMatrix);
-                inverseViewProjection = BoundingSphere.Matrix4.inverse(viewProjection, scratchInverseMatrix);
-            } else {
-                inverseView = BoundingSphere.Matrix4.inverseTransformation(view, scratchInverseMatrix);
-            }
-
-            if (when.defined(inverseViewProjection)) {
-                frustumSplits[0] = frustum.near;
-                frustumSplits[1] = frustum.far;
-            } else {
-                frustumSplits[0] = 0.0;
-                frustumSplits[1] = frustum.near;
-                frustumSplits[2] = frustum.far;
-            }
-
-            for (var i = 0; i < 2; ++i) {
-                for (var j = 0; j < 4; ++j) {
-                    var corner = Cartesian4.Cartesian4.clone(frustumCornersNDC[j], scratchFrustumCorners[j]);
-
-                    if (!when.defined(inverseViewProjection)) {
-                        if (when.defined(frustum._offCenterFrustum)) {
-                            frustum = frustum._offCenterFrustum;
-                        }
-
-                        var near = frustumSplits[i];
-                        var far = frustumSplits[i + 1];
-
-                        corner.x = (corner.x * (frustum.right - frustum.left) + frustum.left + frustum.right) * 0.5;
-                        corner.y = (corner.y * (frustum.top - frustum.bottom) + frustum.bottom + frustum.top) * 0.5;
-                        corner.z = (corner.z * (near - far) - near - far) * 0.5;
-                        corner.w = 1.0;
-
-                        BoundingSphere.Matrix4.multiplyByVector(inverseView, corner, corner);
-                    } else {
-                        corner = BoundingSphere.Matrix4.multiplyByVector(inverseViewProjection, corner, corner);
-
-                        // Reverse perspective divide
-                        var w = 1.0 / corner.w;
-                        Cartographic.Cartesian3.multiplyByScalar(corner, w, corner);
-
-                        Cartographic.Cartesian3.subtract(corner, origin, corner);
-                        Cartographic.Cartesian3.normalize(corner, corner);
-
-                        var fac = Cartographic.Cartesian3.dot(z, corner);
-                        Cartographic.Cartesian3.multiplyByScalar(corner, frustumSplits[i] / fac, corner);
-                        Cartographic.Cartesian3.add(corner, origin, corner);
-                    }
-
-                    positions[12 * i + j * 3] = corner.x;
-                    positions[12 * i + j * 3 + 1] = corner.y;
-                    positions[12 * i + j * 3 + 2] = corner.z;
-                }
-            }
-        };
-
-        /**
-         * Computes the geometric representation of a frustum, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {FrustumGeometry} frustumGeometry A description of the frustum.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        FrustumGeometry.createGeometry = function(frustumGeometry) {
-            var frustumType = frustumGeometry._frustumType;
-            var frustum = frustumGeometry._frustum;
-            var origin = frustumGeometry._origin;
-            var orientation = frustumGeometry._orientation;
-            var drawNearPlane = frustumGeometry._drawNearPlane;
-            var vertexFormat = frustumGeometry._vertexFormat;
-
-            var numberOfPlanes = drawNearPlane ? 6 : 5;
-            var positions = new Float64Array(3 * 4 * 6);
-            FrustumGeometry._computeNearFarPlanes(origin, orientation, frustumType, frustum, positions);
-
-            // -x plane
-            var offset = 3 * 4 * 2;
-            positions[offset]      = positions[3 * 4];
-            positions[offset + 1]  = positions[3 * 4 + 1];
-            positions[offset + 2]  = positions[3 * 4 + 2];
-            positions[offset + 3]  = positions[0];
-            positions[offset + 4]  = positions[1];
-            positions[offset + 5]  = positions[2];
-            positions[offset + 6]  = positions[3 * 3];
-            positions[offset + 7]  = positions[3 * 3 + 1];
-            positions[offset + 8]  = positions[3 * 3 + 2];
-            positions[offset + 9]  = positions[3 * 7];
-            positions[offset + 10] = positions[3 * 7 + 1];
-            positions[offset + 11] = positions[3 * 7 + 2];
-
-            // -y plane
-            offset += 3 * 4;
-            positions[offset]      = positions[3 * 5];
-            positions[offset + 1]  = positions[3 * 5 + 1];
-            positions[offset + 2]  = positions[3 * 5 + 2];
-            positions[offset + 3]  = positions[3];
-            positions[offset + 4]  = positions[3 + 1];
-            positions[offset + 5]  = positions[3 + 2];
-            positions[offset + 6]  = positions[0];
-            positions[offset + 7]  = positions[1];
-            positions[offset + 8]  = positions[2];
-            positions[offset + 9]  = positions[3 * 4];
-            positions[offset + 10] = positions[3 * 4 + 1];
-            positions[offset + 11] = positions[3 * 4 + 2];
-
-            // +x plane
-            offset += 3 * 4;
-            positions[offset]      = positions[3];
-            positions[offset + 1]  = positions[3 + 1];
-            positions[offset + 2]  = positions[3 + 2];
-            positions[offset + 3]  = positions[3 * 5];
-            positions[offset + 4]  = positions[3 * 5 + 1];
-            positions[offset + 5]  = positions[3 * 5 + 2];
-            positions[offset + 6]  = positions[3 * 6];
-            positions[offset + 7]  = positions[3 * 6 + 1];
-            positions[offset + 8]  = positions[3 * 6 + 2];
-            positions[offset + 9]  = positions[3 * 2];
-            positions[offset + 10] = positions[3 * 2 + 1];
-            positions[offset + 11] = positions[3 * 2 + 2];
-
-            // +y plane
-            offset += 3 * 4;
-            positions[offset]      = positions[3 * 2];
-            positions[offset + 1]  = positions[3 * 2 + 1];
-            positions[offset + 2]  = positions[3 * 2 + 2];
-            positions[offset + 3]  = positions[3 * 6];
-            positions[offset + 4]  = positions[3 * 6 + 1];
-            positions[offset + 5]  = positions[3 * 6 + 2];
-            positions[offset + 6]  = positions[3 * 7];
-            positions[offset + 7]  = positions[3 * 7 + 1];
-            positions[offset + 8]  = positions[3 * 7 + 2];
-            positions[offset + 9]  = positions[3 * 3];
-            positions[offset + 10] = positions[3 * 3 + 1];
-            positions[offset + 11] = positions[3 * 3 + 2];
-
-            if (!drawNearPlane) {
-                positions = positions.subarray(3 * 4);
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes({
-                position : new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : positions
-                })
-            });
-
-            if (when.defined(vertexFormat.normal) || when.defined(vertexFormat.tangent) || when.defined(vertexFormat.bitangent) || when.defined(vertexFormat.st)) {
-                var normals = when.defined(vertexFormat.normal) ? new Float32Array(3 * 4 * numberOfPlanes) : undefined;
-                var tangents = when.defined(vertexFormat.tangent) ? new Float32Array(3 * 4 * numberOfPlanes) : undefined;
-                var bitangents = when.defined(vertexFormat.bitangent) ? new Float32Array(3 * 4 * numberOfPlanes) : undefined;
-                var st = when.defined(vertexFormat.st) ? new Float32Array(2 * 4 * numberOfPlanes) : undefined;
-
-                var x = scratchXDirection;
-                var y = scratchYDirection;
-                var z = scratchZDirection;
-
-                var negativeX = Cartographic.Cartesian3.negate(x, scratchNegativeX);
-                var negativeY = Cartographic.Cartesian3.negate(y, scratchNegativeY);
-                var negativeZ = Cartographic.Cartesian3.negate(z, scratchNegativeZ);
-
-                offset = 0;
-                if (drawNearPlane) {
-                    getAttributes(offset, normals, tangents, bitangents, st, negativeZ, x, y); // near
-                    offset += 3 * 4;
-                }
-                getAttributes(offset, normals, tangents, bitangents, st, z, negativeX, y); // far
-                offset += 3 * 4;
-                getAttributes(offset, normals, tangents, bitangents, st, negativeX, negativeZ, y); // -x
-                offset += 3 * 4;
-                getAttributes(offset, normals, tangents, bitangents, st, negativeY, negativeZ, negativeX); // -y
-                offset += 3 * 4;
-                getAttributes(offset, normals, tangents, bitangents, st, x, z, y); // +x
-                offset += 3 * 4;
-                getAttributes(offset, normals, tangents, bitangents, st, y, z, negativeX); // +y
-
-                if (when.defined(normals)) {
-                    attributes.normal = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : normals
-                    });
-                }
-                if (when.defined(tangents)) {
-                    attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : tangents
-                    });
-                }
-                if (when.defined(bitangents)) {
-                    attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : bitangents
-                    });
-                }
-                if (when.defined(st)) {
-                    attributes.st = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 2,
-                        values : st
-                    });
-                }
-            }
-
-            var indices = new Uint16Array(6 * numberOfPlanes);
-            for (var i = 0; i < numberOfPlanes; ++i) {
-                var indexOffset = i * 6;
-                var index = i * 4;
-
-                indices[indexOffset] = index;
-                indices[indexOffset + 1] = index + 1;
-                indices[indexOffset + 2] = index + 2;
-                indices[indexOffset + 3] = index;
-                indices[indexOffset + 4] = index + 2;
-                indices[indexOffset + 5] = index + 3;
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES,
-                boundingSphere : BoundingSphere.BoundingSphere.fromVertices(positions)
-            });
-        };
-
-    exports.FrustumGeometry = FrustumGeometry;
-    exports.OrthographicFrustum = OrthographicFrustum;
-    exports.PerspectiveFrustum = PerspectiveFrustum;
-
-});
diff --git a/public/libs/Cesium/Workers/GeometryAttribute-ed9d707f.js b/public/libs/Cesium/Workers/GeometryAttribute-ed9d707f.js
deleted file mode 100644
index e7a2af6..0000000
--- a/public/libs/Cesium/Workers/GeometryAttribute-ed9d707f.js
+++ /dev/null
@@ -1,1347 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './PrimitiveType-97893bc7', './Transforms-a1cf7267'], function (exports, when, Check, Cartographic, Cartesian2, BoundingSphere, PrimitiveType, Transforms) { 'use strict';
-
-    /**
-         * @private
-         */
-        var GeometryType = {
-            NONE : 0,
-            TRIANGLES : 1,
-            LINES : 2,
-            POLYLINES : 3
-        };
-    var GeometryType$1 = Object.freeze(GeometryType);
-
-    /**
-         * A 2x2 matrix, indexable as a column-major order array.
-         * Constructor parameters are in row-major order for code readability.
-         * @alias Matrix2
-         * @constructor
-         *
-         * @param {Number} [column0Row0=0.0] The value for column 0, row 0.
-         * @param {Number} [column1Row0=0.0] The value for column 1, row 0.
-         * @param {Number} [column0Row1=0.0] The value for column 0, row 1.
-         * @param {Number} [column1Row1=0.0] The value for column 1, row 1.
-         *
-         * @see Matrix2.fromColumnMajorArray
-         * @see Matrix2.fromRowMajorArray
-         * @see Matrix2.fromScale
-         * @see Matrix2.fromUniformScale
-         * @see Matrix3
-         * @see Matrix4
-         */
-        function Matrix2(column0Row0, column1Row0, column0Row1, column1Row1) {
-            this[0] = when.defaultValue(column0Row0, 0.0);
-            this[1] = when.defaultValue(column0Row1, 0.0);
-            this[2] = when.defaultValue(column1Row0, 0.0);
-            this[3] = when.defaultValue(column1Row1, 0.0);
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        Matrix2.packedLength = 4;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {Matrix2} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        Matrix2.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value[0];
-            array[startingIndex++] = value[1];
-            array[startingIndex++] = value[2];
-            array[startingIndex++] = value[3];
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {Matrix2} [result] The object into which to store the result.
-         * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided.
-         */
-        Matrix2.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new Matrix2();
-            }
-
-            result[0] = array[startingIndex++];
-            result[1] = array[startingIndex++];
-            result[2] = array[startingIndex++];
-            result[3] = array[startingIndex++];
-            return result;
-        };
-
-        /**
-         * Duplicates a Matrix2 instance.
-         *
-         * @param {Matrix2} matrix The matrix to duplicate.
-         * @param {Matrix2} [result] The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided. (Returns undefined if matrix is undefined)
-         */
-        Matrix2.clone = function(matrix, result) {
-            if (!when.defined(matrix)) {
-                return undefined;
-            }
-            if (!when.defined(result)) {
-                return new Matrix2(matrix[0], matrix[2],
-                                   matrix[1], matrix[3]);
-            }
-            result[0] = matrix[0];
-            result[1] = matrix[1];
-            result[2] = matrix[2];
-            result[3] = matrix[3];
-            return result;
-        };
-
-        /**
-         * Creates a Matrix2 from 4 consecutive elements in an array.
-         *
-         * @param {Number[]} array The array whose 4 consecutive elements correspond to the positions of the matrix.  Assumes column-major order.
-         * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to first column first row position in the matrix.
-         * @param {Matrix2} [result] The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided.
-         *
-         * @example
-         * // Create the Matrix2:
-         * // [1.0, 2.0]
-         * // [1.0, 2.0]
-         *
-         * var v = [1.0, 1.0, 2.0, 2.0];
-         * var m = Cesium.Matrix2.fromArray(v);
-         *
-         * // Create same Matrix2 with using an offset into an array
-         * var v2 = [0.0, 0.0, 1.0, 1.0, 2.0, 2.0];
-         * var m2 = Cesium.Matrix2.fromArray(v2, 2);
-         */
-        Matrix2.fromArray = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new Matrix2();
-            }
-
-            result[0] = array[startingIndex];
-            result[1] = array[startingIndex + 1];
-            result[2] = array[startingIndex + 2];
-            result[3] = array[startingIndex + 3];
-            return result;
-        };
-
-        /**
-         * Creates a Matrix2 instance from a column-major order array.
-         *
-         * @param {Number[]} values The column-major order array.
-         * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.
-         */
-        Matrix2.fromColumnMajorArray = function(values, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('values', values);
-            //>>includeEnd('debug');
-
-            return Matrix2.clone(values, result);
-        };
-
-        /**
-         * Creates a Matrix2 instance from a row-major order array.
-         * The resulting matrix will be in column-major order.
-         *
-         * @param {Number[]} values The row-major order array.
-         * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.
-         */
-        Matrix2.fromRowMajorArray = function(values, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('values', values);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Matrix2(values[0], values[1],
-                                   values[2], values[3]);
-            }
-            result[0] = values[0];
-            result[1] = values[2];
-            result[2] = values[1];
-            result[3] = values[3];
-            return result;
-        };
-
-        /**
-         * Computes a Matrix2 instance representing a non-uniform scale.
-         *
-         * @param {Cartesian2} scale The x and y scale factors.
-         * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.
-         *
-         * @example
-         * // Creates
-         * //   [7.0, 0.0]
-         * //   [0.0, 8.0]
-         * var m = Cesium.Matrix2.fromScale(new Cesium.Cartesian2(7.0, 8.0));
-         */
-        Matrix2.fromScale = function(scale, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('scale', scale);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Matrix2(
-                    scale.x, 0.0,
-                    0.0,     scale.y);
-            }
-
-            result[0] = scale.x;
-            result[1] = 0.0;
-            result[2] = 0.0;
-            result[3] = scale.y;
-            return result;
-        };
-
-        /**
-         * Computes a Matrix2 instance representing a uniform scale.
-         *
-         * @param {Number} scale The uniform scale factor.
-         * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.
-         *
-         * @example
-         * // Creates
-         * //   [2.0, 0.0]
-         * //   [0.0, 2.0]
-         * var m = Cesium.Matrix2.fromUniformScale(2.0);
-         */
-        Matrix2.fromUniformScale = function(scale, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('scale', scale);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Matrix2(
-                    scale, 0.0,
-                    0.0,   scale);
-            }
-
-            result[0] = scale;
-            result[1] = 0.0;
-            result[2] = 0.0;
-            result[3] = scale;
-            return result;
-        };
-
-        /**
-         * Creates a rotation matrix.
-         *
-         * @param {Number} angle The angle, in radians, of the rotation.  Positive angles are counterclockwise.
-         * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.
-         * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.
-         *
-         * @example
-         * // Rotate a point 45 degrees counterclockwise.
-         * var p = new Cesium.Cartesian2(5, 6);
-         * var m = Cesium.Matrix2.fromRotation(Cesium.Math.toRadians(45.0));
-         * var rotated = Cesium.Matrix2.multiplyByVector(m, p, new Cesium.Cartesian2());
-         */
-        Matrix2.fromRotation = function(angle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('angle', angle);
-            //>>includeEnd('debug');
-
-            var cosAngle = Math.cos(angle);
-            var sinAngle = Math.sin(angle);
-
-            if (!when.defined(result)) {
-                return new Matrix2(
-                    cosAngle, -sinAngle,
-                    sinAngle, cosAngle);
-            }
-            result[0] = cosAngle;
-            result[1] = sinAngle;
-            result[2] = -sinAngle;
-            result[3] = cosAngle;
-            return result;
-        };
-
-        /**
-         * Creates an Array from the provided Matrix2 instance.
-         * The array will be in column-major order.
-         *
-         * @param {Matrix2} matrix The matrix to use..
-         * @param {Number[]} [result] The Array onto which to store the result.
-         * @returns {Number[]} The modified Array parameter or a new Array instance if one was not provided.
-         */
-        Matrix2.toArray = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return [matrix[0], matrix[1], matrix[2], matrix[3]];
-            }
-            result[0] = matrix[0];
-            result[1] = matrix[1];
-            result[2] = matrix[2];
-            result[3] = matrix[3];
-            return result;
-        };
-
-        /**
-         * Computes the array index of the element at the provided row and column.
-         *
-         * @param {Number} row The zero-based index of the row.
-         * @param {Number} column The zero-based index of the column.
-         * @returns {Number} The index of the element at the provided row and column.
-         *
-         * @exception {DeveloperError} row must be 0 or 1.
-         * @exception {DeveloperError} column must be 0 or 1.
-         *
-         * @example
-         * var myMatrix = new Cesium.Matrix2();
-         * var column1Row0Index = Cesium.Matrix2.getElementIndex(1, 0);
-         * var column1Row0 = myMatrix[column1Row0Index]
-         * myMatrix[column1Row0Index] = 10.0;
-         */
-        Matrix2.getElementIndex = function(column, row) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number.greaterThanOrEquals('row', row, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('row', row, 1);
-
-            Check.Check.typeOf.number.greaterThanOrEquals('column', column, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('column', column, 1);
-            //>>includeEnd('debug');
-
-            return column * 2 + row;
-        };
-
-        /**
-         * Retrieves a copy of the matrix column at the provided index as a Cartesian2 instance.
-         *
-         * @param {Matrix2} matrix The matrix to use.
-         * @param {Number} index The zero-based index of the column to retrieve.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         *
-         * @exception {DeveloperError} index must be 0 or 1.
-         */
-        Matrix2.getColumn = function(matrix, index, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-
-            Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('index', index, 1);
-
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var startIndex = index * 2;
-            var x = matrix[startIndex];
-            var y = matrix[startIndex + 1];
-
-            result.x = x;
-            result.y = y;
-            return result;
-        };
-
-        /**
-         * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian2 instance.
-         *
-         * @param {Matrix2} matrix The matrix to use.
-         * @param {Number} index The zero-based index of the column to set.
-         * @param {Cartesian2} cartesian The Cartesian whose values will be assigned to the specified column.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         *
-         * @exception {DeveloperError} index must be 0 or 1.
-         */
-        Matrix2.setColumn = function(matrix, index, cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-
-            Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('index', index, 1);
-
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result = Matrix2.clone(matrix, result);
-            var startIndex = index * 2;
-            result[startIndex] = cartesian.x;
-            result[startIndex + 1] = cartesian.y;
-            return result;
-        };
-
-        /**
-         * Retrieves a copy of the matrix row at the provided index as a Cartesian2 instance.
-         *
-         * @param {Matrix2} matrix The matrix to use.
-         * @param {Number} index The zero-based index of the row to retrieve.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         *
-         * @exception {DeveloperError} index must be 0 or 1.
-         */
-        Matrix2.getRow = function(matrix, index, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-
-            Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('index', index, 1);
-
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var x = matrix[index];
-            var y = matrix[index + 2];
-
-            result.x = x;
-            result.y = y;
-            return result;
-        };
-
-        /**
-         * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian2 instance.
-         *
-         * @param {Matrix2} matrix The matrix to use.
-         * @param {Number} index The zero-based index of the row to set.
-         * @param {Cartesian2} cartesian The Cartesian whose values will be assigned to the specified row.
-         * @param {Matrix2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         *
-         * @exception {DeveloperError} index must be 0 or 1.
-         */
-        Matrix2.setRow = function(matrix, index, cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-
-            Check.Check.typeOf.number.greaterThanOrEquals('index', index, 0);
-            Check.Check.typeOf.number.lessThanOrEquals('index', index, 1);
-
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result = Matrix2.clone(matrix, result);
-            result[index] = cartesian.x;
-            result[index + 2] = cartesian.y;
-            return result;
-        };
-
-        var scratchColumn = new Cartesian2.Cartesian2();
-
-        /**
-         * Extracts the non-uniform scale assuming the matrix is an affine transformation.
-         *
-         * @param {Matrix2} matrix The matrix.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Matrix2.getScale = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = Cartesian2.Cartesian2.magnitude(Cartesian2.Cartesian2.fromElements(matrix[0], matrix[1], scratchColumn));
-            result.y = Cartesian2.Cartesian2.magnitude(Cartesian2.Cartesian2.fromElements(matrix[2], matrix[3], scratchColumn));
-            return result;
-        };
-
-        var scratchScale = new Cartesian2.Cartesian2();
-
-        /**
-         * Computes the maximum scale assuming the matrix is an affine transformation.
-         * The maximum scale is the maximum length of the column vectors.
-         *
-         * @param {Matrix2} matrix The matrix.
-         * @returns {Number} The maximum scale.
-         */
-        Matrix2.getMaximumScale = function(matrix) {
-            Matrix2.getScale(matrix, scratchScale);
-            return Cartesian2.Cartesian2.maximumComponent(scratchScale);
-        };
-
-        /**
-         * Computes the product of two matrices.
-         *
-         * @param {Matrix2} left The first matrix.
-         * @param {Matrix2} right The second matrix.
-         * @param {Matrix2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         */
-        Matrix2.multiply = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var column0Row0 = left[0] * right[0] + left[2] * right[1];
-            var column1Row0 = left[0] * right[2] + left[2] * right[3];
-            var column0Row1 = left[1] * right[0] + left[3] * right[1];
-            var column1Row1 = left[1] * right[2] + left[3] * right[3];
-
-            result[0] = column0Row0;
-            result[1] = column0Row1;
-            result[2] = column1Row0;
-            result[3] = column1Row1;
-            return result;
-        };
-
-        /**
-         * Computes the sum of two matrices.
-         *
-         * @param {Matrix2} left The first matrix.
-         * @param {Matrix2} right The second matrix.
-         * @param {Matrix2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         */
-        Matrix2.add = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = left[0] + right[0];
-            result[1] = left[1] + right[1];
-            result[2] = left[2] + right[2];
-            result[3] = left[3] + right[3];
-            return result;
-        };
-
-        /**
-         * Computes the difference of two matrices.
-         *
-         * @param {Matrix2} left The first matrix.
-         * @param {Matrix2} right The second matrix.
-         * @param {Matrix2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         */
-        Matrix2.subtract = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = left[0] - right[0];
-            result[1] = left[1] - right[1];
-            result[2] = left[2] - right[2];
-            result[3] = left[3] - right[3];
-            return result;
-        };
-
-        /**
-         * Computes the product of a matrix and a column vector.
-         *
-         * @param {Matrix2} matrix The matrix.
-         * @param {Cartesian2} cartesian The column.
-         * @param {Cartesian2} result The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter.
-         */
-        Matrix2.multiplyByVector = function(matrix, cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var x = matrix[0] * cartesian.x + matrix[2] * cartesian.y;
-            var y = matrix[1] * cartesian.x + matrix[3] * cartesian.y;
-
-            result.x = x;
-            result.y = y;
-            return result;
-        };
-
-        /**
-         * Computes the product of a matrix and a scalar.
-         *
-         * @param {Matrix2} matrix The matrix.
-         * @param {Number} scalar The number to multiply by.
-         * @param {Matrix2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         */
-        Matrix2.multiplyByScalar = function(matrix, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = matrix[0] * scalar;
-            result[1] = matrix[1] * scalar;
-            result[2] = matrix[2] * scalar;
-            result[3] = matrix[3] * scalar;
-            return result;
-        };
-
-        /**
-         * Computes the product of a matrix times a (non-uniform) scale, as if the scale were a scale matrix.
-         *
-         * @param {Matrix2} matrix The matrix on the left-hand side.
-         * @param {Cartesian2} scale The non-uniform scale on the right-hand side.
-         * @param {Matrix2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         *
-         *
-         * @example
-         * // Instead of Cesium.Matrix2.multiply(m, Cesium.Matrix2.fromScale(scale), m);
-         * Cesium.Matrix2.multiplyByScale(m, scale, m);
-         *
-         * @see Matrix2.fromScale
-         * @see Matrix2.multiplyByUniformScale
-         */
-        Matrix2.multiplyByScale = function(matrix, scale, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('scale', scale);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = matrix[0] * scale.x;
-            result[1] = matrix[1] * scale.x;
-            result[2] = matrix[2] * scale.y;
-            result[3] = matrix[3] * scale.y;
-            return result;
-        };
-
-        /**
-         * Creates a negated copy of the provided matrix.
-         *
-         * @param {Matrix2} matrix The matrix to negate.
-         * @param {Matrix2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         */
-        Matrix2.negate = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = -matrix[0];
-            result[1] = -matrix[1];
-            result[2] = -matrix[2];
-            result[3] = -matrix[3];
-            return result;
-        };
-
-        /**
-         * Computes the transpose of the provided matrix.
-         *
-         * @param {Matrix2} matrix The matrix to transpose.
-         * @param {Matrix2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         */
-        Matrix2.transpose = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var column0Row0 = matrix[0];
-            var column0Row1 = matrix[2];
-            var column1Row0 = matrix[1];
-            var column1Row1 = matrix[3];
-
-            result[0] = column0Row0;
-            result[1] = column0Row1;
-            result[2] = column1Row0;
-            result[3] = column1Row1;
-            return result;
-        };
-
-        /**
-         * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements.
-         *
-         * @param {Matrix2} matrix The matrix with signed elements.
-         * @param {Matrix2} result The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter.
-         */
-        Matrix2.abs = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result[0] = Math.abs(matrix[0]);
-            result[1] = Math.abs(matrix[1]);
-            result[2] = Math.abs(matrix[2]);
-            result[3] = Math.abs(matrix[3]);
-
-            return result;
-        };
-
-        /**
-         * Compares the provided matrices componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Matrix2} [left] The first matrix.
-         * @param {Matrix2} [right] The second matrix.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        Matrix2.equals = function(left, right) {
-            return (left === right) ||
-                   (when.defined(left) &&
-                    when.defined(right) &&
-                    left[0] === right[0] &&
-                    left[1] === right[1] &&
-                    left[2] === right[2] &&
-                    left[3] === right[3]);
-        };
-
-        /**
-         * @private
-         */
-        Matrix2.equalsArray = function(matrix, array, offset) {
-            return matrix[0] === array[offset] &&
-                   matrix[1] === array[offset + 1] &&
-                   matrix[2] === array[offset + 2] &&
-                   matrix[3] === array[offset + 3];
-        };
-
-        /**
-         * Compares the provided matrices componentwise and returns
-         * <code>true</code> if they are within the provided epsilon,
-         * <code>false</code> otherwise.
-         *
-         * @param {Matrix2} [left] The first matrix.
-         * @param {Matrix2} [right] The second matrix.
-         * @param {Number} epsilon The epsilon to use for equality testing.
-         * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Matrix2.equalsEpsilon = function(left, right, epsilon) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('epsilon', epsilon);
-            //>>includeEnd('debug');
-
-            return (left === right) ||
-                    (when.defined(left) &&
-                    when.defined(right) &&
-                    Math.abs(left[0] - right[0]) <= epsilon &&
-                    Math.abs(left[1] - right[1]) <= epsilon &&
-                    Math.abs(left[2] - right[2]) <= epsilon &&
-                    Math.abs(left[3] - right[3]) <= epsilon);
-        };
-
-        /**
-         * An immutable Matrix2 instance initialized to the identity matrix.
-         *
-         * @type {Matrix2}
-         * @constant
-         */
-        Matrix2.IDENTITY = Object.freeze(new Matrix2(1.0, 0.0,
-                                                    0.0, 1.0));
-
-        /**
-         * An immutable Matrix2 instance initialized to the zero matrix.
-         *
-         * @type {Matrix2}
-         * @constant
-         */
-        Matrix2.ZERO = Object.freeze(new Matrix2(0.0, 0.0,
-                                                0.0, 0.0));
-
-        /**
-         * The index into Matrix2 for column 0, row 0.
-         *
-         * @type {Number}
-         * @constant
-         *
-         * @example
-         * var matrix = new Cesium.Matrix2();
-         * matrix[Cesium.Matrix2.COLUMN0ROW0] = 5.0; // set column 0, row 0 to 5.0
-         */
-        Matrix2.COLUMN0ROW0 = 0;
-
-        /**
-         * The index into Matrix2 for column 0, row 1.
-         *
-         * @type {Number}
-         * @constant
-         *
-         * @example
-         * var matrix = new Cesium.Matrix2();
-         * matrix[Cesium.Matrix2.COLUMN0ROW1] = 5.0; // set column 0, row 1 to 5.0
-         */
-        Matrix2.COLUMN0ROW1 = 1;
-
-        /**
-         * The index into Matrix2 for column 1, row 0.
-         *
-         * @type {Number}
-         * @constant
-         *
-         * @example
-         * var matrix = new Cesium.Matrix2();
-         * matrix[Cesium.Matrix2.COLUMN1ROW0] = 5.0; // set column 1, row 0 to 5.0
-         */
-        Matrix2.COLUMN1ROW0 = 2;
-
-        /**
-         * The index into Matrix2 for column 1, row 1.
-         *
-         * @type {Number}
-         * @constant
-         *
-         * @example
-         * var matrix = new Cesium.Matrix2();
-         * matrix[Cesium.Matrix2.COLUMN1ROW1] = 5.0; // set column 1, row 1 to 5.0
-         */
-        Matrix2.COLUMN1ROW1 = 3;
-
-        Object.defineProperties(Matrix2.prototype, {
-            /**
-             * Gets the number of items in the collection.
-             * @memberof Matrix2.prototype
-             *
-             * @type {Number}
-             */
-            length : {
-                get : function() {
-                    return Matrix2.packedLength;
-                }
-            }
-        });
-
-        /**
-         * Duplicates the provided Matrix2 instance.
-         *
-         * @param {Matrix2} [result] The object onto which to store the result.
-         * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided.
-         */
-        Matrix2.prototype.clone = function(result) {
-            return Matrix2.clone(this, result);
-        };
-
-        /**
-         * Compares this matrix to the provided matrix componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Matrix2} [right] The right hand side matrix.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        Matrix2.prototype.equals = function(right) {
-            return Matrix2.equals(this, right);
-        };
-
-        /**
-         * Compares this matrix to the provided matrix componentwise and returns
-         * <code>true</code> if they are within the provided epsilon,
-         * <code>false</code> otherwise.
-         *
-         * @param {Matrix2} [right] The right hand side matrix.
-         * @param {Number} epsilon The epsilon to use for equality testing.
-         * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Matrix2.prototype.equalsEpsilon = function(right, epsilon) {
-            return Matrix2.equalsEpsilon(this, right, epsilon);
-        };
-
-        /**
-         * Creates a string representing this Matrix with each row being
-         * on a separate line and in the format '(column0, column1)'.
-         *
-         * @returns {String} A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1)'.
-         */
-        Matrix2.prototype.toString = function() {
-            return '(' + this[0] + ', ' + this[2] + ')\n' +
-                   '(' + this[1] + ', ' + this[3] + ')';
-        };
-
-    /**
-         * A geometry representation with attributes forming vertices and optional index data
-         * defining primitives.  Geometries and an {@link Appearance}, which describes the shading,
-         * can be assigned to a {@link Primitive} for visualization.  A <code>Primitive</code> can
-         * be created from many heterogeneous - in many cases - geometries for performance.
-         * <p>
-         * Geometries can be transformed and optimized using functions in {@link GeometryPipeline}.
-         * </p>
-         *
-         * @alias Geometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {GeometryAttributes} options.attributes Attributes, which make up the geometry's vertices.
-         * @param {PrimitiveType} [options.primitiveType=PrimitiveType.TRIANGLES] The type of primitives in the geometry.
-         * @param {Uint16Array|Uint32Array} [options.indices] Optional index data that determines the primitives in the geometry.
-         * @param {BoundingSphere} [options.boundingSphere] An optional bounding sphere that fully enclosed the geometry.
-         *
-         * @see PolygonGeometry
-         * @see RectangleGeometry
-         * @see EllipseGeometry
-         * @see CircleGeometry
-         * @see WallGeometry
-         * @see SimplePolylineGeometry
-         * @see BoxGeometry
-         * @see EllipsoidGeometry
-         *
-         * @demo {@link https://sandcastle.cesium.com/index.html?src=Geometry%20and%20Appearances.html|Geometry and Appearances Demo}
-         *
-         * @example
-         * // Create geometry with a position attribute and indexed lines.
-         * var positions = new Float64Array([
-         *   0.0, 0.0, 0.0,
-         *   7500000.0, 0.0, 0.0,
-         *   0.0, 7500000.0, 0.0
-         * ]);
-         *
-         * var geometry = new Cesium.Geometry({
-         *   attributes : {
-         *     position : new Cesium.GeometryAttribute({
-         *       componentDatatype : Cesium.ComponentDatatype.DOUBLE,
-         *       componentsPerAttribute : 3,
-         *       values : positions
-         *     })
-         *   },
-         *   indices : new Uint16Array([0, 1, 1, 2, 2, 0]),
-         *   primitiveType : Cesium.PrimitiveType.LINES,
-         *   boundingSphere : Cesium.BoundingSphere.fromVertices(positions)
-         * });
-         */
-        function Geometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('options.attributes', options.attributes);
-            //>>includeEnd('debug');
-
-            /**
-             * Attributes, which make up the geometry's vertices.  Each property in this object corresponds to a
-             * {@link GeometryAttribute} containing the attribute's data.
-             * <p>
-             * Attributes are always stored non-interleaved in a Geometry.
-             * </p>
-             * <p>
-             * There are reserved attribute names with well-known semantics.  The following attributes
-             * are created by a Geometry (depending on the provided {@link VertexFormat}.
-             * <ul>
-             *    <li><code>position</code> - 3D vertex position.  64-bit floating-point (for precision).  3 components per attribute.  See {@link VertexFormat#position}.</li>
-             *    <li><code>normal</code> - Normal (normalized), commonly used for lighting.  32-bit floating-point.  3 components per attribute.  See {@link VertexFormat#normal}.</li>
-             *    <li><code>st</code> - 2D texture coordinate.  32-bit floating-point.  2 components per attribute.  See {@link VertexFormat#st}.</li>
-             *    <li><code>bitangent</code> - Bitangent (normalized), used for tangent-space effects like bump mapping.  32-bit floating-point.  3 components per attribute.  See {@link VertexFormat#bitangent}.</li>
-             *    <li><code>tangent</code> - Tangent (normalized), used for tangent-space effects like bump mapping.  32-bit floating-point.  3 components per attribute.  See {@link VertexFormat#tangent}.</li>
-             * </ul>
-             * </p>
-             * <p>
-             * The following attribute names are generally not created by a Geometry, but are added
-             * to a Geometry by a {@link Primitive} or {@link GeometryPipeline} functions to prepare
-             * the geometry for rendering.
-             * <ul>
-             *    <li><code>position3DHigh</code> - High 32 bits for encoded 64-bit position computed with {@link GeometryPipeline.encodeAttribute}.  32-bit floating-point.  4 components per attribute.</li>
-             *    <li><code>position3DLow</code> - Low 32 bits for encoded 64-bit position computed with {@link GeometryPipeline.encodeAttribute}.  32-bit floating-point.  4 components per attribute.</li>
-             *    <li><code>position3DHigh</code> - High 32 bits for encoded 64-bit 2D (Columbus view) position computed with {@link GeometryPipeline.encodeAttribute}.  32-bit floating-point.  4 components per attribute.</li>
-             *    <li><code>position2DLow</code> - Low 32 bits for encoded 64-bit 2D (Columbus view) position computed with {@link GeometryPipeline.encodeAttribute}.  32-bit floating-point.  4 components per attribute.</li>
-             *    <li><code>color</code> - RGBA color (normalized) usually from {@link GeometryInstance#color}.  32-bit floating-point.  4 components per attribute.</li>
-             *    <li><code>pickColor</code> - RGBA color used for picking.  32-bit floating-point.  4 components per attribute.</li>
-             * </ul>
-             * </p>
-             *
-             * @type GeometryAttributes
-             *
-             * @default undefined
-             *
-             *
-             * @example
-             * geometry.attributes.position = new Cesium.GeometryAttribute({
-             *   componentDatatype : Cesium.ComponentDatatype.FLOAT,
-             *   componentsPerAttribute : 3,
-             *   values : new Float32Array(0)
-             * });
-             *
-             * @see GeometryAttribute
-             * @see VertexFormat
-             */
-            this.attributes = options.attributes;
-
-            /**
-             * Optional index data that - along with {@link Geometry#primitiveType} -
-             * determines the primitives in the geometry.
-             *
-             * @type Array
-             *
-             * @default undefined
-             */
-            this.indices = options.indices;
-
-            /**
-             * The type of primitives in the geometry.  This is most often {@link PrimitiveType.TRIANGLES},
-             * but can varying based on the specific geometry.
-             *
-             * @type PrimitiveType
-             *
-             * @default undefined
-             */
-            this.primitiveType = when.defaultValue(options.primitiveType, PrimitiveType.PrimitiveType.TRIANGLES);
-
-            /**
-             * An optional bounding sphere that fully encloses the geometry.  This is
-             * commonly used for culling.
-             *
-             * @type BoundingSphere
-             *
-             * @default undefined
-             */
-            this.boundingSphere = options.boundingSphere;
-
-            /**
-             * @private
-             */
-            this.geometryType = when.defaultValue(options.geometryType, GeometryType$1.NONE);
-
-            /**
-             * @private
-             */
-            this.boundingSphereCV = options.boundingSphereCV;
-
-            /**
-             * @private
-             * Used for computing the bounding sphere for geometry using the applyOffset vertex attribute
-             */
-            this.offsetAttribute = options.offsetAttribute;
-        }
-
-        /**
-         * Computes the number of vertices in a geometry.  The runtime is linear with
-         * respect to the number of attributes in a vertex, not the number of vertices.
-         *
-         * @param {Geometry} geometry The geometry.
-         * @returns {Number} The number of vertices in the geometry.
-         *
-         * @example
-         * var numVertices = Cesium.Geometry.computeNumberOfVertices(geometry);
-         */
-        Geometry.computeNumberOfVertices = function(geometry) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('geometry', geometry);
-            //>>includeEnd('debug');
-
-            var numberOfVertices = -1;
-            for ( var property in geometry.attributes) {
-                if (geometry.attributes.hasOwnProperty(property) &&
-                        when.defined(geometry.attributes[property]) &&
-                        when.defined(geometry.attributes[property].values)) {
-
-                    var attribute = geometry.attributes[property];
-                    var num = attribute.values.length / attribute.componentsPerAttribute;
-                    //>>includeStart('debug', pragmas.debug);
-                    if ((numberOfVertices !== num) && (numberOfVertices !== -1)) {
-                        throw new Check.DeveloperError('All attribute lists must have the same number of attributes.');
-                    }
-                    //>>includeEnd('debug');
-                    numberOfVertices = num;
-                }
-            }
-
-            return numberOfVertices;
-        };
-
-        var rectangleCenterScratch = new Cartographic.Cartographic();
-        var enuCenterScratch = new Cartographic.Cartesian3();
-        var fixedFrameToEnuScratch = new BoundingSphere.Matrix4();
-        var boundingRectanglePointsCartographicScratch = [new Cartographic.Cartographic(), new Cartographic.Cartographic(), new Cartographic.Cartographic()];
-        var boundingRectanglePointsEnuScratch = [new Cartesian2.Cartesian2(), new Cartesian2.Cartesian2(), new Cartesian2.Cartesian2()];
-        var points2DScratch = [new Cartesian2.Cartesian2(), new Cartesian2.Cartesian2(), new Cartesian2.Cartesian2()];
-        var pointEnuScratch = new Cartographic.Cartesian3();
-        var enuRotationScratch = new Transforms.Quaternion();
-        var enuRotationMatrixScratch = new BoundingSphere.Matrix4();
-        var rotation2DScratch = new Matrix2();
-
-        /**
-         * For remapping texture coordinates when rendering GroundPrimitives with materials.
-         * GroundPrimitive texture coordinates are computed to align with the cartographic coordinate system on the globe.
-         * However, EllipseGeometry, RectangleGeometry, and PolygonGeometry all bake rotations to per-vertex texture coordinates
-         * using different strategies.
-         *
-         * This method is used by EllipseGeometry and PolygonGeometry to approximate the same visual effect.
-         * We encapsulate rotation and scale by computing a "transformed" texture coordinate system and computing
-         * a set of reference points from which "cartographic" texture coordinates can be remapped to the "transformed"
-         * system using distances to lines in 2D.
-         *
-         * This approximation becomes less accurate as the covered area increases, especially for GroundPrimitives near the poles,
-         * but is generally reasonable for polygons and ellipses around the size of USA states.
-         *
-         * RectangleGeometry has its own version of this method that computes remapping coordinates using cartographic space
-         * as an intermediary instead of local ENU, which is more accurate for large-area rectangles.
-         *
-         * @param {Cartesian3[]} positions Array of positions outlining the geometry
-         * @param {Number} stRotation Texture coordinate rotation.
-         * @param {Ellipsoid} ellipsoid Ellipsoid for projecting and generating local vectors.
-         * @param {Rectangle} boundingRectangle Bounding rectangle around the positions.
-         * @returns {Number[]} An array of 6 numbers specifying [minimum point, u extent, v extent] as points in the "cartographic" system.
-         * @private
-         */
-        Geometry._textureCoordinateRotationPoints = function(positions, stRotation, ellipsoid, boundingRectangle) {
-            var i;
-
-            // Create a local east-north-up coordinate system centered on the polygon's bounding rectangle.
-            // Project the southwest, northwest, and southeast corners of the bounding rectangle into the plane of ENU as 2D points.
-            // These are the equivalents of (0,0), (0,1), and (1,0) in the texture coordiante system computed in ShadowVolumeAppearanceFS,
-            // aka "ENU texture space."
-            var rectangleCenter = Cartesian2.Rectangle.center(boundingRectangle, rectangleCenterScratch);
-            var enuCenter = Cartographic.Cartographic.toCartesian(rectangleCenter, ellipsoid, enuCenterScratch);
-            var enuToFixedFrame = Transforms.Transforms.eastNorthUpToFixedFrame(enuCenter, ellipsoid, fixedFrameToEnuScratch);
-            var fixedFrameToEnu = BoundingSphere.Matrix4.inverse(enuToFixedFrame, fixedFrameToEnuScratch);
-
-            var boundingPointsEnu = boundingRectanglePointsEnuScratch;
-            var boundingPointsCarto = boundingRectanglePointsCartographicScratch;
-
-            boundingPointsCarto[0].longitude = boundingRectangle.west;
-            boundingPointsCarto[0].latitude = boundingRectangle.south;
-
-            boundingPointsCarto[1].longitude = boundingRectangle.west;
-            boundingPointsCarto[1].latitude = boundingRectangle.north;
-
-            boundingPointsCarto[2].longitude = boundingRectangle.east;
-            boundingPointsCarto[2].latitude = boundingRectangle.south;
-
-            var posEnu = pointEnuScratch;
-
-            for (i = 0; i < 3; i++) {
-                Cartographic.Cartographic.toCartesian(boundingPointsCarto[i], ellipsoid, posEnu);
-                posEnu = BoundingSphere.Matrix4.multiplyByPointAsVector(fixedFrameToEnu, posEnu, posEnu);
-                boundingPointsEnu[i].x = posEnu.x;
-                boundingPointsEnu[i].y = posEnu.y;
-            }
-
-            // Rotate each point in the polygon around the up vector in the ENU by -stRotation and project into ENU as 2D.
-            // Compute the bounding box of these rotated points in the 2D ENU plane.
-            // Rotate the corners back by stRotation, then compute their equivalents in the ENU texture space using the corners computed earlier.
-            var rotation = Transforms.Quaternion.fromAxisAngle(Cartographic.Cartesian3.UNIT_Z, -stRotation, enuRotationScratch);
-            var textureMatrix = BoundingSphere.Matrix3.fromQuaternion(rotation, enuRotationMatrixScratch);
-
-            var positionsLength = positions.length;
-            var enuMinX = Number.POSITIVE_INFINITY;
-            var enuMinY = Number.POSITIVE_INFINITY;
-            var enuMaxX = Number.NEGATIVE_INFINITY;
-            var enuMaxY = Number.NEGATIVE_INFINITY;
-            for (i = 0; i < positionsLength; i++) {
-                posEnu = BoundingSphere.Matrix4.multiplyByPointAsVector(fixedFrameToEnu, positions[i], posEnu);
-                posEnu = BoundingSphere.Matrix3.multiplyByVector(textureMatrix, posEnu, posEnu);
-
-                enuMinX = Math.min(enuMinX, posEnu.x);
-                enuMinY = Math.min(enuMinY, posEnu.y);
-                enuMaxX = Math.max(enuMaxX, posEnu.x);
-                enuMaxY = Math.max(enuMaxY, posEnu.y);
-            }
-
-            var toDesiredInComputed = Matrix2.fromRotation(stRotation, rotation2DScratch);
-
-            var points2D = points2DScratch;
-            points2D[0].x = enuMinX;
-            points2D[0].y = enuMinY;
-
-            points2D[1].x = enuMinX;
-            points2D[1].y = enuMaxY;
-
-            points2D[2].x = enuMaxX;
-            points2D[2].y = enuMinY;
-
-            var boundingEnuMin = boundingPointsEnu[0];
-            var boundingPointsWidth = boundingPointsEnu[2].x - boundingEnuMin.x;
-            var boundingPointsHeight = boundingPointsEnu[1].y - boundingEnuMin.y;
-
-            for (i = 0; i < 3; i++) {
-                var point2D = points2D[i];
-                // rotate back
-                Matrix2.multiplyByVector(toDesiredInComputed, point2D, point2D);
-
-                // Convert point into east-north texture coordinate space
-                point2D.x = (point2D.x - boundingEnuMin.x) / boundingPointsWidth;
-                point2D.y = (point2D.y - boundingEnuMin.y) / boundingPointsHeight;
-            }
-
-            var minXYCorner = points2D[0];
-            var maxYCorner = points2D[1];
-            var maxXCorner = points2D[2];
-            var result = new Array(6);
-            Cartesian2.Cartesian2.pack(minXYCorner, result);
-            Cartesian2.Cartesian2.pack(maxYCorner, result, 2);
-            Cartesian2.Cartesian2.pack(maxXCorner, result, 4);
-
-            return result;
-        };
-
-    /**
-         * Values and type information for geometry attributes.  A {@link Geometry}
-         * generally contains one or more attributes.  All attributes together form
-         * the geometry's vertices.
-         *
-         * @alias GeometryAttribute
-         * @constructor
-         *
-         * @param {Object} [options] Object with the following properties:
-         * @param {ComponentDatatype} [options.componentDatatype] The datatype of each component in the attribute, e.g., individual elements in values.
-         * @param {Number} [options.componentsPerAttribute] A number between 1 and 4 that defines the number of components in an attributes.
-         * @param {Boolean} [options.normalize=false] When <code>true</code> and <code>componentDatatype</code> is an integer format, indicate that the components should be mapped to the range [0, 1] (unsigned) or [-1, 1] (signed) when they are accessed as floating-point for rendering.
-         * @param {TypedArray} [options.values] The values for the attributes stored in a typed array.
-         *
-         * @exception {DeveloperError} options.componentsPerAttribute must be between 1 and 4.
-         *
-         *
-         * @example
-         * var geometry = new Cesium.Geometry({
-         *   attributes : {
-         *     position : new Cesium.GeometryAttribute({
-         *       componentDatatype : Cesium.ComponentDatatype.FLOAT,
-         *       componentsPerAttribute : 3,
-         *       values : new Float32Array([
-         *         0.0, 0.0, 0.0,
-         *         7500000.0, 0.0, 0.0,
-         *         0.0, 7500000.0, 0.0
-         *       ])
-         *     })
-         *   },
-         *   primitiveType : Cesium.PrimitiveType.LINE_LOOP
-         * });
-         *
-         * @see Geometry
-         */
-        function GeometryAttribute(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(options.componentDatatype)) {
-                throw new Check.DeveloperError('options.componentDatatype is required.');
-            }
-            if (!when.defined(options.componentsPerAttribute)) {
-                throw new Check.DeveloperError('options.componentsPerAttribute is required.');
-            }
-            if (options.componentsPerAttribute < 1 || options.componentsPerAttribute > 4) {
-                throw new Check.DeveloperError('options.componentsPerAttribute must be between 1 and 4.');
-            }
-            if (!when.defined(options.values)) {
-                throw new Check.DeveloperError('options.values is required.');
-            }
-            //>>includeEnd('debug');
-
-            /**
-             * The datatype of each component in the attribute, e.g., individual elements in
-             * {@link GeometryAttribute#values}.
-             *
-             * @type ComponentDatatype
-             *
-             * @default undefined
-             */
-            this.componentDatatype = options.componentDatatype;
-
-            /**
-             * A number between 1 and 4 that defines the number of components in an attributes.
-             * For example, a position attribute with x, y, and z components would have 3 as
-             * shown in the code example.
-             *
-             * @type Number
-             *
-             * @default undefined
-             *
-             * @example
-             * attribute.componentDatatype = Cesium.ComponentDatatype.FLOAT;
-             * attribute.componentsPerAttribute = 3;
-             * attribute.values = new Float32Array([
-             *   0.0, 0.0, 0.0,
-             *   7500000.0, 0.0, 0.0,
-             *   0.0, 7500000.0, 0.0
-             * ]);
-             */
-            this.componentsPerAttribute = options.componentsPerAttribute;
-
-            /**
-             * When <code>true</code> and <code>componentDatatype</code> is an integer format,
-             * indicate that the components should be mapped to the range [0, 1] (unsigned)
-             * or [-1, 1] (signed) when they are accessed as floating-point for rendering.
-             * <p>
-             * This is commonly used when storing colors using {@link ComponentDatatype.UNSIGNED_BYTE}.
-             * </p>
-             *
-             * @type Boolean
-             *
-             * @default false
-             *
-             * @example
-             * attribute.componentDatatype = Cesium.ComponentDatatype.UNSIGNED_BYTE;
-             * attribute.componentsPerAttribute = 4;
-             * attribute.normalize = true;
-             * attribute.values = new Uint8Array([
-             *   Cesium.Color.floatToByte(color.red),
-             *   Cesium.Color.floatToByte(color.green),
-             *   Cesium.Color.floatToByte(color.blue),
-             *   Cesium.Color.floatToByte(color.alpha)
-             * ]);
-             */
-            this.normalize = when.defaultValue(options.normalize, false);
-
-            /**
-             * The values for the attributes stored in a typed array.  In the code example,
-             * every three elements in <code>values</code> defines one attributes since
-             * <code>componentsPerAttribute</code> is 3.
-             *
-             * @type TypedArray
-             *
-             * @default undefined
-             *
-             * @example
-             * attribute.componentDatatype = Cesium.ComponentDatatype.FLOAT;
-             * attribute.componentsPerAttribute = 3;
-             * attribute.values = new Float32Array([
-             *   0.0, 0.0, 0.0,
-             *   7500000.0, 0.0, 0.0,
-             *   0.0, 7500000.0, 0.0
-             * ]);
-             */
-            this.values = options.values;
-        }
-
-    exports.Geometry = Geometry;
-    exports.GeometryAttribute = GeometryAttribute;
-    exports.GeometryType = GeometryType$1;
-    exports.Matrix2 = Matrix2;
-
-});
diff --git a/public/libs/Cesium/Workers/GeometryAttributes-aacecde6.js b/public/libs/Cesium/Workers/GeometryAttributes-aacecde6.js
deleted file mode 100644
index b706124..0000000
--- a/public/libs/Cesium/Workers/GeometryAttributes-aacecde6.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60'], function (exports, when) { 'use strict';
-
-    /**
-         * Attributes, which make up a geometry's vertices.  Each property in this object corresponds to a
-         * {@link GeometryAttribute} containing the attribute's data.
-         * <p>
-         * Attributes are always stored non-interleaved in a Geometry.
-         * </p>
-         *
-         * @alias GeometryAttributes
-         * @constructor
-         */
-        function GeometryAttributes(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            /**
-             * The 3D position attribute.
-             * <p>
-             * 64-bit floating-point (for precision).  3 components per attribute.
-             * </p>
-             *
-             * @type GeometryAttribute
-             *
-             * @default undefined
-             */
-            this.position = options.position;
-
-            /**
-             * The normal attribute (normalized), which is commonly used for lighting.
-             * <p>
-             * 32-bit floating-point.  3 components per attribute.
-             * </p>
-             *
-             * @type GeometryAttribute
-             *
-             * @default undefined
-             */
-            this.normal = options.normal;
-
-            /**
-             * The 2D texture coordinate attribute.
-             * <p>
-             * 32-bit floating-point.  2 components per attribute
-             * </p>
-             *
-             * @type GeometryAttribute
-             *
-             * @default undefined
-             */
-            this.st = options.st;
-
-            /**
-             * The bitangent attribute (normalized), which is used for tangent-space effects like bump mapping.
-             * <p>
-             * 32-bit floating-point.  3 components per attribute.
-             * </p>
-             *
-             * @type GeometryAttribute
-             *
-             * @default undefined
-             */
-            this.bitangent = options.bitangent;
-
-            /**
-             * The tangent attribute (normalized), which is used for tangent-space effects like bump mapping.
-             * <p>
-             * 32-bit floating-point.  3 components per attribute.
-             * </p>
-             *
-             * @type GeometryAttribute
-             *
-             * @default undefined
-             */
-            this.tangent = options.tangent;
-
-            /**
-             * The color attribute.
-             * <p>
-             * 8-bit unsigned integer. 4 components per attribute.
-             * </p>
-             *
-             * @type GeometryAttribute
-             *
-             * @default undefined
-             */
-            this.color = options.color;
-        }
-
-    exports.GeometryAttributes = GeometryAttributes;
-
-});
diff --git a/public/libs/Cesium/Workers/GeometryInstance-93a01b5d.js b/public/libs/Cesium/Workers/GeometryInstance-93a01b5d.js
deleted file mode 100644
index 269cbd8..0000000
--- a/public/libs/Cesium/Workers/GeometryInstance-93a01b5d.js
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './BoundingSphere-775c5788'], function (exports, when, Check, BoundingSphere) { 'use strict';
-
-    /**
-         * Geometry instancing allows one {@link Geometry} object to be positions in several
-         * different locations and colored uniquely.  For example, one {@link BoxGeometry} can
-         * be instanced several times, each with a different <code>modelMatrix</code> to change
-         * its position, rotation, and scale.
-         *
-         * @alias GeometryInstance
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Geometry} options.geometry The geometry to instance.
-         * @param {Matrix4} [options.modelMatrix=Matrix4.IDENTITY] The model matrix that transforms to transform the geometry from model to world coordinates.
-         * @param {Object} [options.id] A user-defined object to return when the instance is picked with {@link Scene#pick} or get/set per-instance attributes with {@link Primitive#getGeometryInstanceAttributes}.
-         * @param {Object} [options.attributes] Per-instance attributes like a show or color attribute shown in the example below.
-         *
-         *
-         * @example
-         * // Create geometry for a box, and two instances that refer to it.
-         * // One instance positions the box on the bottom and colored aqua.
-         * // The other instance positions the box on the top and color white.
-         * var geometry = Cesium.BoxGeometry.fromDimensions({
-         *   vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL,
-         *   dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 500000.0)
-         * });
-         * var instanceBottom = new Cesium.GeometryInstance({
-         *   geometry : geometry,
-         *   modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame(
-         *     Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()),
-         *   attributes : {
-         *     color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA)
-         *   },
-         *   id : 'bottom'
-         * });
-         * var instanceTop = new Cesium.GeometryInstance({
-         *   geometry : geometry,
-         *   modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame(
-         *     Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 3000000.0), new Cesium.Matrix4()),
-         *   attributes : {
-         *     color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA)
-         *   },
-         *   id : 'top'
-         * });
-         *
-         * @see Geometry
-         */
-        function GeometryInstance(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(options.geometry)) {
-                throw new Check.DeveloperError('options.geometry is required.');
-            }
-            //>>includeEnd('debug');
-
-            /**
-             * The geometry being instanced.
-             *
-             * @type Geometry
-             *
-             * @default undefined
-             */
-            this.geometry = options.geometry;
-
-            /**
-             * The 4x4 transformation matrix that transforms the geometry from model to world coordinates.
-             * When this is the identity matrix, the geometry is drawn in world coordinates, i.e., Earth's WGS84 coordinates.
-             * Local reference frames can be used by providing a different transformation matrix, like that returned
-             * by {@link Transforms.eastNorthUpToFixedFrame}.
-             *
-             * @type Matrix4
-             *
-             * @default Matrix4.IDENTITY
-             */
-            this.modelMatrix = BoundingSphere.Matrix4.clone(when.defaultValue(options.modelMatrix, BoundingSphere.Matrix4.IDENTITY));
-
-            /**
-             * User-defined object returned when the instance is picked or used to get/set per-instance attributes.
-             *
-             * @type Object
-             *
-             * @default undefined
-             *
-             * @see Scene#pick
-             * @see Primitive#getGeometryInstanceAttributes
-             */
-            this.id = options.id;
-
-            /**
-             * Used for picking primitives that wrap geometry instances.
-             *
-             * @private
-             */
-            this.pickPrimitive = options.pickPrimitive;
-
-            /**
-             * Per-instance attributes like {@link ColorGeometryInstanceAttribute} or {@link ShowGeometryInstanceAttribute}.
-             * {@link Geometry} attributes varying per vertex; these attributes are constant for the entire instance.
-             *
-             * @type Object
-             *
-             * @default undefined
-             */
-            this.attributes = when.defaultValue(options.attributes, {});
-
-            /**
-             * @private
-             */
-            this.westHemisphereGeometry = undefined;
-            /**
-             * @private
-             */
-            this.eastHemisphereGeometry = undefined;
-        }
-
-    exports.GeometryInstance = GeometryInstance;
-
-});
diff --git a/public/libs/Cesium/Workers/GeometryOffsetAttribute-999fc023.js b/public/libs/Cesium/Workers/GeometryOffsetAttribute-999fc023.js
deleted file mode 100644
index 12bd7b0..0000000
--- a/public/libs/Cesium/Workers/GeometryOffsetAttribute-999fc023.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports'], function (exports) { 'use strict';
-
-    /**
-         * Represents which vertices should have a value of `true` for the `applyOffset` attribute
-         * @private
-         */
-        var GeometryOffsetAttribute = {
-            NONE : 0,
-            TOP : 1,
-            ALL : 2
-        };
-    var GeometryOffsetAttribute$1 = Object.freeze(GeometryOffsetAttribute);
-
-    exports.GeometryOffsetAttribute = GeometryOffsetAttribute$1;
-
-});
diff --git a/public/libs/Cesium/Workers/GeometryPipeline-245a05d7.js b/public/libs/Cesium/Workers/GeometryPipeline-245a05d7.js
deleted file mode 100644
index add727d..0000000
--- a/public/libs/Cesium/Workers/GeometryPipeline-245a05d7.js
+++ /dev/null
@@ -1,3012 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './AttributeCompression-84a90a13', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, ComponentDatatype, GeometryAttribute, PrimitiveType, AttributeCompression, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane) { 'use strict';
-
-    var scratchCartesian1 = new Cartographic.Cartesian3();
-        var scratchCartesian2 = new Cartographic.Cartesian3();
-        var scratchCartesian3 = new Cartographic.Cartesian3();
-
-        /**
-         * Computes the barycentric coordinates for a point with respect to a triangle.
-         *
-         * @exports barycentricCoordinates
-         *
-         * @param {Cartesian2|Cartesian3} point The point to test.
-         * @param {Cartesian2|Cartesian3} p0 The first point of the triangle, corresponding to the barycentric x-axis.
-         * @param {Cartesian2|Cartesian3} p1 The second point of the triangle, corresponding to the barycentric y-axis.
-         * @param {Cartesian2|Cartesian3} p2 The third point of the triangle, corresponding to the barycentric z-axis.
-         * @param {Cartesian3} [result] The object onto which to store the result.
-         * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
-         *
-         * @example
-         * // Returns Cartesian3.UNIT_X
-         * var p = new Cesium.Cartesian3(-1.0, 0.0, 0.0);
-         * var b = Cesium.barycentricCoordinates(p,
-         *   new Cesium.Cartesian3(-1.0, 0.0, 0.0),
-         *   new Cesium.Cartesian3( 1.0, 0.0, 0.0),
-         *   new Cesium.Cartesian3( 0.0, 1.0, 1.0));
-         */
-        function barycentricCoordinates(point, p0, p1, p2, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('point', point);
-            Check.Check.defined('p0', p0);
-            Check.Check.defined('p1', p1);
-            Check.Check.defined('p2', p2);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            // Implementation based on http://www.blackpawn.com/texts/pointinpoly/default.html.
-            var v0;
-            var v1;
-            var v2;
-            var dot00;
-            var dot01;
-            var dot02;
-            var dot11;
-            var dot12;
-
-            if(!when.defined(p0.z)) {
-                if (Cartesian2.Cartesian2.equalsEpsilon(point, p0, _Math.CesiumMath.EPSILON14)) {
-                    return Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_X, result);
-                }
-                if (Cartesian2.Cartesian2.equalsEpsilon(point, p1, _Math.CesiumMath.EPSILON14)) {
-                    return Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_Y, result);
-                }
-                if (Cartesian2.Cartesian2.equalsEpsilon(point, p2, _Math.CesiumMath.EPSILON14)) {
-                    return Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_Z, result);
-                }
-
-                v0 = Cartesian2.Cartesian2.subtract(p1, p0, scratchCartesian1);
-                v1 = Cartesian2.Cartesian2.subtract(p2, p0, scratchCartesian2);
-                v2 = Cartesian2.Cartesian2.subtract(point, p0, scratchCartesian3);
-
-                dot00 = Cartesian2.Cartesian2.dot(v0, v0);
-                dot01 = Cartesian2.Cartesian2.dot(v0, v1);
-                dot02 = Cartesian2.Cartesian2.dot(v0, v2);
-                dot11 = Cartesian2.Cartesian2.dot(v1, v1);
-                dot12 = Cartesian2.Cartesian2.dot(v1, v2);
-            } else {
-                if (Cartographic.Cartesian3.equalsEpsilon(point, p0, _Math.CesiumMath.EPSILON14)) {
-                    return Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_X, result);
-                }
-                if (Cartographic.Cartesian3.equalsEpsilon(point, p1, _Math.CesiumMath.EPSILON14)) {
-                    return Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_Y, result);
-                }
-                if (Cartographic.Cartesian3.equalsEpsilon(point, p2, _Math.CesiumMath.EPSILON14)) {
-                    return Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_Z, result);
-                }
-
-                v0 = Cartographic.Cartesian3.subtract(p1, p0, scratchCartesian1);
-                v1 = Cartographic.Cartesian3.subtract(p2, p0, scratchCartesian2);
-                v2 = Cartographic.Cartesian3.subtract(point, p0, scratchCartesian3);
-
-                dot00 = Cartographic.Cartesian3.dot(v0, v0);
-                dot01 = Cartographic.Cartesian3.dot(v0, v1);
-                dot02 = Cartographic.Cartesian3.dot(v0, v2);
-                dot11 = Cartographic.Cartesian3.dot(v1, v1);
-                dot12 = Cartographic.Cartesian3.dot(v1, v2);
-            }
-
-            result.y = (dot11 * dot02 - dot01 * dot12);
-            result.z = (dot00 * dot12 - dot01 * dot02);
-            var q = dot00 * dot11 - dot01 * dot01;
-
-            // This is done to avoid dividing by infinity causing a NaN
-            if (result.y !== 0) {
-                result.y /= q;
-            }
-            if (result.z !== 0) {
-                result.z /= q;
-            }
-
-            result.x = 1.0 - result.y - result.z;
-            return result;
-        }
-
-    /**
-         * Encapsulates an algorithm to optimize triangles for the post
-         * vertex-shader cache.  This is based on the 2007 SIGGRAPH paper
-         * 'Fast Triangle Reordering for Vertex Locality and Reduced Overdraw.'
-         * The runtime is linear but several passes are made.
-         *
-         * @exports Tipsify
-         *
-         * @see <a href='http://gfx.cs.princeton.edu/pubs/Sander_2007_%3ETR/tipsy.pdf'>
-         * Fast Triangle Reordering for Vertex Locality and Reduced Overdraw</a>
-         * by Sander, Nehab, and Barczak
-         *
-         * @private
-         */
-        var Tipsify = {};
-
-        /**
-         * Calculates the average cache miss ratio (ACMR) for a given set of indices.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Number[]} options.indices Lists triads of numbers corresponding to the indices of the vertices
-         *                        in the vertex buffer that define the geometry's triangles.
-         * @param {Number} [options.maximumIndex] The maximum value of the elements in <code>args.indices</code>.
-         *                                     If not supplied, this value will be computed.
-         * @param {Number} [options.cacheSize=24] The number of vertices that can be stored in the cache at any one time.
-         * @returns {Number} The average cache miss ratio (ACMR).
-         *
-         * @exception {DeveloperError} indices length must be a multiple of three.
-         * @exception {DeveloperError} cacheSize must be greater than two.
-         *
-         * @example
-         * var indices = [0, 1, 2, 3, 4, 5];
-         * var maxIndex = 5;
-         * var cacheSize = 3;
-         * var acmr = Cesium.Tipsify.calculateACMR({indices : indices, maxIndex : maxIndex, cacheSize : cacheSize});
-         */
-        Tipsify.calculateACMR = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var indices = options.indices;
-            var maximumIndex = options.maximumIndex;
-            var cacheSize = when.defaultValue(options.cacheSize, 24);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(indices)) {
-                throw new Check.DeveloperError('indices is required.');
-            }
-            //>>includeEnd('debug');
-
-            var numIndices = indices.length;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (numIndices < 3 || numIndices % 3 !== 0) {
-                throw new Check.DeveloperError('indices length must be a multiple of three.');
-            }
-            if (maximumIndex <= 0) {
-                throw new Check.DeveloperError('maximumIndex must be greater than zero.');
-            }
-            if (cacheSize < 3) {
-                throw new Check.DeveloperError('cacheSize must be greater than two.');
-            }
-            //>>includeEnd('debug');
-
-            // Compute the maximumIndex if not given
-            if (!when.defined(maximumIndex)) {
-                maximumIndex = 0;
-                var currentIndex = 0;
-                var intoIndices = indices[currentIndex];
-                while (currentIndex < numIndices) {
-                    if (intoIndices > maximumIndex) {
-                        maximumIndex = intoIndices;
-                    }
-                    ++currentIndex;
-                    intoIndices = indices[currentIndex];
-                }
-            }
-
-            // Vertex time stamps
-            var vertexTimeStamps = [];
-            for ( var i = 0; i < maximumIndex + 1; i++) {
-                vertexTimeStamps[i] = 0;
-            }
-
-            // Cache processing
-            var s = cacheSize + 1;
-            for ( var j = 0; j < numIndices; ++j) {
-                if ((s - vertexTimeStamps[indices[j]]) > cacheSize) {
-                    vertexTimeStamps[indices[j]] = s;
-                    ++s;
-                }
-            }
-
-            return (s - cacheSize + 1) / (numIndices / 3);
-        };
-
-        /**
-         * Optimizes triangles for the post-vertex shader cache.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Number[]} options.indices Lists triads of numbers corresponding to the indices of the vertices
-         *                        in the vertex buffer that define the geometry's triangles.
-         * @param {Number} [options.maximumIndex] The maximum value of the elements in <code>args.indices</code>.
-         *                                     If not supplied, this value will be computed.
-         * @param {Number} [options.cacheSize=24] The number of vertices that can be stored in the cache at any one time.
-         * @returns {Number[]} A list of the input indices in an optimized order.
-         *
-         * @exception {DeveloperError} indices length must be a multiple of three.
-         * @exception {DeveloperError} cacheSize must be greater than two.
-         *
-         * @example
-         * var indices = [0, 1, 2, 3, 4, 5];
-         * var maxIndex = 5;
-         * var cacheSize = 3;
-         * var reorderedIndices = Cesium.Tipsify.tipsify({indices : indices, maxIndex : maxIndex, cacheSize : cacheSize});
-         */
-        Tipsify.tipsify = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var indices = options.indices;
-            var maximumIndex = options.maximumIndex;
-            var cacheSize = when.defaultValue(options.cacheSize, 24);
-
-            var cursor;
-
-            function skipDeadEnd(vertices, deadEnd, indices, maximumIndexPlusOne) {
-                while (deadEnd.length >= 1) {
-                    // while the stack is not empty
-                    var d = deadEnd[deadEnd.length - 1]; // top of the stack
-                    deadEnd.splice(deadEnd.length - 1, 1); // pop the stack
-
-                    if (vertices[d].numLiveTriangles > 0) {
-                        return d;
-                    }
-                }
-
-                while (cursor < maximumIndexPlusOne) {
-                    if (vertices[cursor].numLiveTriangles > 0) {
-                        ++cursor;
-                        return cursor - 1;
-                    }
-                    ++cursor;
-                }
-                return -1;
-            }
-
-            function getNextVertex(indices, cacheSize, oneRing, vertices, s, deadEnd, maximumIndexPlusOne) {
-                var n = -1;
-                var p;
-                var m = -1;
-                var itOneRing = 0;
-                while (itOneRing < oneRing.length) {
-                    var index = oneRing[itOneRing];
-                    if (vertices[index].numLiveTriangles) {
-                        p = 0;
-                        if ((s - vertices[index].timeStamp + (2 * vertices[index].numLiveTriangles)) <= cacheSize) {
-                            p = s - vertices[index].timeStamp;
-                        }
-                        if ((p > m) || (m === -1)) {
-                            m = p;
-                            n = index;
-                        }
-                    }
-                    ++itOneRing;
-                }
-                if (n === -1) {
-                    return skipDeadEnd(vertices, deadEnd, indices, maximumIndexPlusOne);
-                }
-                return n;
-            }
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(indices)) {
-                throw new Check.DeveloperError('indices is required.');
-            }
-            //>>includeEnd('debug');
-
-            var numIndices = indices.length;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (numIndices < 3 || numIndices % 3 !== 0) {
-                throw new Check.DeveloperError('indices length must be a multiple of three.');
-            }
-            if (maximumIndex <= 0) {
-                throw new Check.DeveloperError('maximumIndex must be greater than zero.');
-            }
-            if (cacheSize < 3) {
-                throw new Check.DeveloperError('cacheSize must be greater than two.');
-            }
-            //>>includeEnd('debug');
-
-            // Determine maximum index
-            var maximumIndexPlusOne = 0;
-            var currentIndex = 0;
-            var intoIndices = indices[currentIndex];
-            var endIndex = numIndices;
-            if (when.defined(maximumIndex)) {
-                maximumIndexPlusOne = maximumIndex + 1;
-            } else {
-                while (currentIndex < endIndex) {
-                    if (intoIndices > maximumIndexPlusOne) {
-                        maximumIndexPlusOne = intoIndices;
-                    }
-                    ++currentIndex;
-                    intoIndices = indices[currentIndex];
-                }
-                if (maximumIndexPlusOne === -1) {
-                    return 0;
-                }
-                ++maximumIndexPlusOne;
-            }
-
-            // Vertices
-            var vertices = [];
-            var i;
-            for (i = 0; i < maximumIndexPlusOne; i++) {
-                vertices[i] = {
-                    numLiveTriangles : 0,
-                    timeStamp : 0,
-                    vertexTriangles : []
-                };
-            }
-            currentIndex = 0;
-            var triangle = 0;
-            while (currentIndex < endIndex) {
-                vertices[indices[currentIndex]].vertexTriangles.push(triangle);
-                ++(vertices[indices[currentIndex]]).numLiveTriangles;
-                vertices[indices[currentIndex + 1]].vertexTriangles.push(triangle);
-                ++(vertices[indices[currentIndex + 1]]).numLiveTriangles;
-                vertices[indices[currentIndex + 2]].vertexTriangles.push(triangle);
-                ++(vertices[indices[currentIndex + 2]]).numLiveTriangles;
-                ++triangle;
-                currentIndex += 3;
-            }
-
-            // Starting index
-            var f = 0;
-
-            // Time Stamp
-            var s = cacheSize + 1;
-            cursor = 1;
-
-            // Process
-            var oneRing = [];
-            var deadEnd = []; //Stack
-            var vertex;
-            var intoVertices;
-            var currentOutputIndex = 0;
-            var outputIndices = [];
-            var numTriangles = numIndices / 3;
-            var triangleEmitted = [];
-            for (i = 0; i < numTriangles; i++) {
-                triangleEmitted[i] = false;
-            }
-            var index;
-            var limit;
-            while (f !== -1) {
-                oneRing = [];
-                intoVertices = vertices[f];
-                limit = intoVertices.vertexTriangles.length;
-                for ( var k = 0; k < limit; ++k) {
-                    triangle = intoVertices.vertexTriangles[k];
-                    if (!triangleEmitted[triangle]) {
-                        triangleEmitted[triangle] = true;
-                        currentIndex = triangle + triangle + triangle;
-                        for ( var j = 0; j < 3; ++j) {
-                            // Set this index as a possible next index
-                            index = indices[currentIndex];
-                            oneRing.push(index);
-                            deadEnd.push(index);
-
-                            // Output index
-                            outputIndices[currentOutputIndex] = index;
-                            ++currentOutputIndex;
-
-                            // Cache processing
-                            vertex = vertices[index];
-                            --vertex.numLiveTriangles;
-                            if ((s - vertex.timeStamp) > cacheSize) {
-                                vertex.timeStamp = s;
-                                ++s;
-                            }
-                            ++currentIndex;
-                        }
-                    }
-                }
-                f = getNextVertex(indices, cacheSize, oneRing, vertices, s, deadEnd, maximumIndexPlusOne);
-            }
-
-            return outputIndices;
-        };
-
-    /**
-     * Content pipeline functions for geometries.
-     *
-     * @exports GeometryPipeline
-     *
-     * @see Geometry
-     */
-    var GeometryPipeline = {};
-
-    function addTriangle(lines, index, i0, i1, i2) {
-        lines[index++] = i0;
-        lines[index++] = i1;
-
-        lines[index++] = i1;
-        lines[index++] = i2;
-
-        lines[index++] = i2;
-        lines[index] = i0;
-    }
-
-    function trianglesToLines(triangles) {
-        var count = triangles.length;
-        var size = (count / 3) * 6;
-        var lines = IndexDatatype.IndexDatatype.createTypedArray(count, size);
-
-        var index = 0;
-        for ( var i = 0; i < count; i += 3, index += 6) {
-            addTriangle(lines, index, triangles[i], triangles[i + 1], triangles[i + 2]);
-        }
-
-        return lines;
-    }
-
-    function triangleStripToLines(triangles) {
-        var count = triangles.length;
-        if (count >= 3) {
-            var size = (count - 2) * 6;
-            var lines = IndexDatatype.IndexDatatype.createTypedArray(count, size);
-
-            addTriangle(lines, 0, triangles[0], triangles[1], triangles[2]);
-            var index = 6;
-
-            for ( var i = 3; i < count; ++i, index += 6) {
-                addTriangle(lines, index, triangles[i - 1], triangles[i], triangles[i - 2]);
-            }
-
-            return lines;
-        }
-
-        return new Uint16Array();
-    }
-
-    function triangleFanToLines(triangles) {
-        if (triangles.length > 0) {
-            var count = triangles.length - 1;
-            var size = (count - 1) * 6;
-            var lines = IndexDatatype.IndexDatatype.createTypedArray(count, size);
-
-            var base = triangles[0];
-            var index = 0;
-            for ( var i = 1; i < count; ++i, index += 6) {
-                addTriangle(lines, index, base, triangles[i], triangles[i + 1]);
-            }
-
-            return lines;
-        }
-
-        return new Uint16Array();
-    }
-
-    /**
-     * Converts a geometry's triangle indices to line indices.  If the geometry has an <code>indices</code>
-     * and its <code>primitiveType</code> is <code>TRIANGLES</code>, <code>TRIANGLE_STRIP</code>,
-     * <code>TRIANGLE_FAN</code>, it is converted to <code>LINES</code>; otherwise, the geometry is not changed.
-     * <p>
-     * This is commonly used to create a wireframe geometry for visual debugging.
-     * </p>
-     *
-     * @param {Geometry} geometry The geometry to modify.
-     * @returns {Geometry} The modified <code>geometry</code> argument, with its triangle indices converted to lines.
-     *
-     * @exception {DeveloperError} geometry.primitiveType must be TRIANGLES, TRIANGLE_STRIP, or TRIANGLE_FAN.
-     *
-     * @example
-     * geometry = Cesium.GeometryPipeline.toWireframe(geometry);
-     */
-    GeometryPipeline.toWireframe = function(geometry) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        //>>includeEnd('debug');
-
-        var indices = geometry.indices;
-        if (when.defined(indices)) {
-            switch (geometry.primitiveType) {
-                case PrimitiveType.PrimitiveType.TRIANGLES:
-                    geometry.indices = trianglesToLines(indices);
-                    break;
-                case PrimitiveType.PrimitiveType.TRIANGLE_STRIP:
-                    geometry.indices = triangleStripToLines(indices);
-                    break;
-                case PrimitiveType.PrimitiveType.TRIANGLE_FAN:
-                    geometry.indices = triangleFanToLines(indices);
-                    break;
-                //>>includeStart('debug', pragmas.debug);
-                default:
-                    throw new Check.DeveloperError('geometry.primitiveType must be TRIANGLES, TRIANGLE_STRIP, or TRIANGLE_FAN.');
-                //>>includeEnd('debug');
-            }
-
-            geometry.primitiveType = PrimitiveType.PrimitiveType.LINES;
-        }
-
-        return geometry;
-    };
-
-    /**
-     * Creates a new {@link Geometry} with <code>LINES</code> representing the provided
-     * attribute (<code>attributeName</code>) for the provided geometry.  This is used to
-     * visualize vector attributes like normals, tangents, and bitangents.
-     *
-     * @param {Geometry} geometry The <code>Geometry</code> instance with the attribute.
-     * @param {String} [attributeName='normal'] The name of the attribute.
-     * @param {Number} [length=10000.0] The length of each line segment in meters.  This can be negative to point the vector in the opposite direction.
-     * @returns {Geometry} A new <code>Geometry</code> instance with line segments for the vector.
-     *
-     * @exception {DeveloperError} geometry.attributes must have an attribute with the same name as the attributeName parameter.
-     *
-     * @example
-     * var geometry = Cesium.GeometryPipeline.createLineSegmentsForVectors(instance.geometry, 'bitangent', 100000.0);
-     */
-    GeometryPipeline.createLineSegmentsForVectors = function(geometry, attributeName, length) {
-        attributeName = when.defaultValue(attributeName, 'normal');
-
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        if (!when.defined(geometry.attributes.position)) {
-            throw new Check.DeveloperError('geometry.attributes.position is required.');
-        }
-        if (!when.defined(geometry.attributes[attributeName])) {
-            throw new Check.DeveloperError('geometry.attributes must have an attribute with the same name as the attributeName parameter, ' + attributeName + '.');
-        }
-        //>>includeEnd('debug');
-
-        length = when.defaultValue(length, 10000.0);
-
-        var positions = geometry.attributes.position.values;
-        var vectors = geometry.attributes[attributeName].values;
-        var positionsLength = positions.length;
-
-        var newPositions = new Float64Array(2 * positionsLength);
-
-        var j = 0;
-        for (var i = 0; i < positionsLength; i += 3) {
-            newPositions[j++] = positions[i];
-            newPositions[j++] = positions[i + 1];
-            newPositions[j++] = positions[i + 2];
-
-            newPositions[j++] = positions[i] + (vectors[i] * length);
-            newPositions[j++] = positions[i + 1] + (vectors[i + 1] * length);
-            newPositions[j++] = positions[i + 2] + (vectors[i + 2] * length);
-        }
-
-        var newBoundingSphere;
-        var bs = geometry.boundingSphere;
-        if (when.defined(bs)) {
-            newBoundingSphere = new BoundingSphere.BoundingSphere(bs.center, bs.radius + length);
-        }
-
-        return new GeometryAttribute.Geometry({
-            attributes : {
-                position : new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : newPositions
-                })
-            },
-            primitiveType : PrimitiveType.PrimitiveType.LINES,
-            boundingSphere : newBoundingSphere
-        });
-    };
-
-    /**
-     * Creates an object that maps attribute names to unique locations (indices)
-     * for matching vertex attributes and shader programs.
-     *
-     * @param {Geometry} geometry The geometry, which is not modified, to create the object for.
-     * @returns {Object} An object with attribute name / index pairs.
-     *
-     * @example
-     * var attributeLocations = Cesium.GeometryPipeline.createAttributeLocations(geometry);
-     * // Example output
-     * // {
-     * //   'position' : 0,
-     * //   'normal' : 1
-     * // }
-     */
-    GeometryPipeline.createAttributeLocations = function(geometry) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        //>>includeEnd('debug')
-
-        // There can be a WebGL performance hit when attribute 0 is disabled, so
-        // assign attribute locations to well-known attributes.
-        var semantics = [
-            'position',
-            'positionHigh',
-            'positionLow',
-
-            // From VertexFormat.position - after 2D projection and high-precision encoding
-            'position3DHigh',
-            'position3DLow',
-            'position2DHigh',
-            'position2DLow',
-
-            // From Primitive
-            'pickColor',
-
-            // From VertexFormat
-            'normal',
-            'st',
-            'tangent',
-            'bitangent',
-
-            // For shadow volumes
-            'extrudeDirection',
-
-            // From compressing texture coordinates and normals
-            'compressedAttributes'
-        ];
-
-        var attributes = geometry.attributes;
-        var indices = {};
-        var j = 0;
-        var i;
-        var len = semantics.length;
-
-        // Attribute locations for well-known attributes
-        for (i = 0; i < len; ++i) {
-            var semantic = semantics[i];
-
-            if (when.defined(attributes[semantic])) {
-                indices[semantic] = j++;
-            }
-        }
-
-        // Locations for custom attributes
-        for (var name in attributes) {
-            if (attributes.hasOwnProperty(name) && (!when.defined(indices[name]))) {
-                indices[name] = j++;
-            }
-        }
-
-        return indices;
-    };
-
-    /**
-     * Reorders a geometry's attributes and <code>indices</code> to achieve better performance from the GPU's pre-vertex-shader cache.
-     *
-     * @param {Geometry} geometry The geometry to modify.
-     * @returns {Geometry} The modified <code>geometry</code> argument, with its attributes and indices reordered for the GPU's pre-vertex-shader cache.
-     *
-     * @exception {DeveloperError} Each attribute array in geometry.attributes must have the same number of attributes.
-     *
-     *
-     * @example
-     * geometry = Cesium.GeometryPipeline.reorderForPreVertexCache(geometry);
-     *
-     * @see GeometryPipeline.reorderForPostVertexCache
-     */
-    GeometryPipeline.reorderForPreVertexCache = function(geometry) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        //>>includeEnd('debug');
-
-        var numVertices = GeometryAttribute.Geometry.computeNumberOfVertices(geometry);
-
-        var indices = geometry.indices;
-        if (when.defined(indices)) {
-            var indexCrossReferenceOldToNew = new Int32Array(numVertices);
-            for ( var i = 0; i < numVertices; i++) {
-                indexCrossReferenceOldToNew[i] = -1;
-            }
-
-            // Construct cross reference and reorder indices
-            var indicesIn = indices;
-            var numIndices = indicesIn.length;
-            var indicesOut = IndexDatatype.IndexDatatype.createTypedArray(numVertices, numIndices);
-
-            var intoIndicesIn = 0;
-            var intoIndicesOut = 0;
-            var nextIndex = 0;
-            var tempIndex;
-            while (intoIndicesIn < numIndices) {
-                tempIndex = indexCrossReferenceOldToNew[indicesIn[intoIndicesIn]];
-                if (tempIndex !== -1) {
-                    indicesOut[intoIndicesOut] = tempIndex;
-                } else {
-                    tempIndex = indicesIn[intoIndicesIn];
-                    indexCrossReferenceOldToNew[tempIndex] = nextIndex;
-
-                    indicesOut[intoIndicesOut] = nextIndex;
-                    ++nextIndex;
-                }
-                ++intoIndicesIn;
-                ++intoIndicesOut;
-            }
-            geometry.indices = indicesOut;
-
-            // Reorder attributes
-            var attributes = geometry.attributes;
-            for ( var property in attributes) {
-                if (attributes.hasOwnProperty(property) &&
-                        when.defined(attributes[property]) &&
-                        when.defined(attributes[property].values)) {
-
-                    var attribute = attributes[property];
-                    var elementsIn = attribute.values;
-                    var intoElementsIn = 0;
-                    var numComponents = attribute.componentsPerAttribute;
-                    var elementsOut = ComponentDatatype.ComponentDatatype.createTypedArray(attribute.componentDatatype, nextIndex * numComponents);
-                    while (intoElementsIn < numVertices) {
-                        var temp = indexCrossReferenceOldToNew[intoElementsIn];
-                        if (temp !== -1) {
-                            for (var j = 0; j < numComponents; j++) {
-                                elementsOut[numComponents * temp + j] = elementsIn[numComponents * intoElementsIn + j];
-                            }
-                        }
-                        ++intoElementsIn;
-                    }
-                    attribute.values = elementsOut;
-                }
-            }
-        }
-
-        return geometry;
-    };
-
-    /**
-     * Reorders a geometry's <code>indices</code> to achieve better performance from the GPU's
-     * post vertex-shader cache by using the Tipsify algorithm.  If the geometry <code>primitiveType</code>
-     * is not <code>TRIANGLES</code> or the geometry does not have an <code>indices</code>, this function has no effect.
-     *
-     * @param {Geometry} geometry The geometry to modify.
-     * @param {Number} [cacheCapacity=24] The number of vertices that can be held in the GPU's vertex cache.
-     * @returns {Geometry} The modified <code>geometry</code> argument, with its indices reordered for the post-vertex-shader cache.
-     *
-     * @exception {DeveloperError} cacheCapacity must be greater than two.
-     *
-     *
-     * @example
-     * geometry = Cesium.GeometryPipeline.reorderForPostVertexCache(geometry);
-     *
-     * @see GeometryPipeline.reorderForPreVertexCache
-     * @see {@link http://gfx.cs.princ0eton.edu/pubs/Sander_2007_%3ETR/tipsy.pdf|Fast Triangle Reordering for Vertex Locality and Reduced Overdraw}
-     * by Sander, Nehab, and Barczak
-     */
-    GeometryPipeline.reorderForPostVertexCache = function(geometry, cacheCapacity) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        //>>includeEnd('debug');
-
-        var indices = geometry.indices;
-        if ((geometry.primitiveType === PrimitiveType.PrimitiveType.TRIANGLES) && (when.defined(indices))) {
-            var numIndices = indices.length;
-            var maximumIndex = 0;
-            for ( var j = 0; j < numIndices; j++) {
-                if (indices[j] > maximumIndex) {
-                    maximumIndex = indices[j];
-                }
-            }
-            geometry.indices = Tipsify.tipsify({
-                indices : indices,
-                maximumIndex : maximumIndex,
-                cacheSize : cacheCapacity
-            });
-        }
-
-        return geometry;
-    };
-
-    function copyAttributesDescriptions(attributes) {
-        var newAttributes = {};
-
-        for ( var attribute in attributes) {
-            if (attributes.hasOwnProperty(attribute) &&
-                    when.defined(attributes[attribute]) &&
-                    when.defined(attributes[attribute].values)) {
-
-                var attr = attributes[attribute];
-                newAttributes[attribute] = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : attr.componentDatatype,
-                    componentsPerAttribute : attr.componentsPerAttribute,
-                    normalize : attr.normalize,
-                    values : []
-                });
-            }
-        }
-
-        return newAttributes;
-    }
-
-    function copyVertex(destinationAttributes, sourceAttributes, index) {
-        for ( var attribute in sourceAttributes) {
-            if (sourceAttributes.hasOwnProperty(attribute) &&
-                    when.defined(sourceAttributes[attribute]) &&
-                    when.defined(sourceAttributes[attribute].values)) {
-
-                var attr = sourceAttributes[attribute];
-
-                for ( var k = 0; k < attr.componentsPerAttribute; ++k) {
-                    destinationAttributes[attribute].values.push(attr.values[(index * attr.componentsPerAttribute) + k]);
-                }
-            }
-        }
-    }
-
-    /**
-     * Splits a geometry into multiple geometries, if necessary, to ensure that indices in the
-     * <code>indices</code> fit into unsigned shorts.  This is used to meet the WebGL requirements
-     * when unsigned int indices are not supported.
-     * <p>
-     * If the geometry does not have any <code>indices</code>, this function has no effect.
-     * </p>
-     *
-     * @param {Geometry} geometry The geometry to be split into multiple geometries.
-     * @returns {Geometry[]} An array of geometries, each with indices that fit into unsigned shorts.
-     *
-     * @exception {DeveloperError} geometry.primitiveType must equal to PrimitiveType.TRIANGLES, PrimitiveType.LINES, or PrimitiveType.POINTS
-     * @exception {DeveloperError} All geometry attribute lists must have the same number of attributes.
-     *
-     * @example
-     * var geometries = Cesium.GeometryPipeline.fitToUnsignedShortIndices(geometry);
-     */
-    GeometryPipeline.fitToUnsignedShortIndices = function(geometry) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        if ((when.defined(geometry.indices)) &&
-            ((geometry.primitiveType !== PrimitiveType.PrimitiveType.TRIANGLES) &&
-             (geometry.primitiveType !== PrimitiveType.PrimitiveType.LINES) &&
-             (geometry.primitiveType !== PrimitiveType.PrimitiveType.POINTS))) {
-            throw new Check.DeveloperError('geometry.primitiveType must equal to PrimitiveType.TRIANGLES, PrimitiveType.LINES, or PrimitiveType.POINTS.');
-        }
-        //>>includeEnd('debug');
-
-        var geometries = [];
-
-        // If there's an index list and more than 64K attributes, it is possible that
-        // some indices are outside the range of unsigned short [0, 64K - 1]
-        var numberOfVertices = GeometryAttribute.Geometry.computeNumberOfVertices(geometry);
-        if (when.defined(geometry.indices) && (numberOfVertices >= _Math.CesiumMath.SIXTY_FOUR_KILOBYTES)) {
-            var oldToNewIndex = [];
-            var newIndices = [];
-            var currentIndex = 0;
-            var newAttributes = copyAttributesDescriptions(geometry.attributes);
-
-            var originalIndices = geometry.indices;
-            var numberOfIndices = originalIndices.length;
-
-            var indicesPerPrimitive;
-
-            if (geometry.primitiveType === PrimitiveType.PrimitiveType.TRIANGLES) {
-                indicesPerPrimitive = 3;
-            } else if (geometry.primitiveType === PrimitiveType.PrimitiveType.LINES) {
-                indicesPerPrimitive = 2;
-            } else if (geometry.primitiveType === PrimitiveType.PrimitiveType.POINTS) {
-                indicesPerPrimitive = 1;
-            }
-
-            for ( var j = 0; j < numberOfIndices; j += indicesPerPrimitive) {
-                for (var k = 0; k < indicesPerPrimitive; ++k) {
-                    var x = originalIndices[j + k];
-                    var i = oldToNewIndex[x];
-                    if (!when.defined(i)) {
-                        i = currentIndex++;
-                        oldToNewIndex[x] = i;
-                        copyVertex(newAttributes, geometry.attributes, x);
-                    }
-                    newIndices.push(i);
-                }
-
-                if (currentIndex + indicesPerPrimitive >= _Math.CesiumMath.SIXTY_FOUR_KILOBYTES) {
-                    geometries.push(new GeometryAttribute.Geometry({
-                        attributes : newAttributes,
-                        indices : newIndices,
-                        primitiveType : geometry.primitiveType,
-                        boundingSphere : geometry.boundingSphere,
-                        boundingSphereCV : geometry.boundingSphereCV
-                    }));
-
-                    // Reset for next vertex-array
-                    oldToNewIndex = [];
-                    newIndices = [];
-                    currentIndex = 0;
-                    newAttributes = copyAttributesDescriptions(geometry.attributes);
-                }
-            }
-
-            if (newIndices.length !== 0) {
-                geometries.push(new GeometryAttribute.Geometry({
-                    attributes : newAttributes,
-                    indices : newIndices,
-                    primitiveType : geometry.primitiveType,
-                    boundingSphere : geometry.boundingSphere,
-                    boundingSphereCV : geometry.boundingSphereCV
-                }));
-            }
-        } else {
-            // No need to split into multiple geometries
-            geometries.push(geometry);
-        }
-
-        return geometries;
-    };
-
-    var scratchProjectTo2DCartesian3 = new Cartographic.Cartesian3();
-    var scratchProjectTo2DCartographic = new Cartographic.Cartographic();
-
-    /**
-     * Projects a geometry's 3D <code>position</code> attribute to 2D, replacing the <code>position</code>
-     * attribute with separate <code>position3D</code> and <code>position2D</code> attributes.
-     * <p>
-     * If the geometry does not have a <code>position</code>, this function has no effect.
-     * </p>
-     *
-     * @param {Geometry} geometry The geometry to modify.
-     * @param {String} attributeName The name of the attribute.
-     * @param {String} attributeName3D The name of the attribute in 3D.
-     * @param {String} attributeName2D The name of the attribute in 2D.
-     * @param {Object} [projection=new GeographicProjection()] The projection to use.
-     * @returns {Geometry} The modified <code>geometry</code> argument with <code>position3D</code> and <code>position2D</code> attributes.
-     *
-     * @exception {DeveloperError} geometry must have attribute matching the attributeName argument.
-     * @exception {DeveloperError} The attribute componentDatatype must be ComponentDatatype.DOUBLE.
-     * @exception {DeveloperError} Could not project a point to 2D.
-     *
-     * @example
-     * geometry = Cesium.GeometryPipeline.projectTo2D(geometry, 'position', 'position3D', 'position2D');
-     */
-    GeometryPipeline.projectTo2D = function(geometry, attributeName, attributeName3D, attributeName2D, projection) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        if (!when.defined(attributeName)) {
-            throw new Check.DeveloperError('attributeName is required.');
-        }
-        if (!when.defined(attributeName3D)) {
-            throw new Check.DeveloperError('attributeName3D is required.');
-        }
-        if (!when.defined(attributeName2D)) {
-            throw new Check.DeveloperError('attributeName2D is required.');
-        }
-        if (!when.defined(geometry.attributes[attributeName])) {
-            throw new Check.DeveloperError('geometry must have attribute matching the attributeName argument: ' + attributeName + '.');
-        }
-        if (geometry.attributes[attributeName].componentDatatype !== ComponentDatatype.ComponentDatatype.DOUBLE) {
-            throw new Check.DeveloperError('The attribute componentDatatype must be ComponentDatatype.DOUBLE.');
-        }
-        //>>includeEnd('debug');
-
-        var attribute = geometry.attributes[attributeName];
-        projection = (when.defined(projection)) ? projection : new BoundingSphere.GeographicProjection();
-        var ellipsoid = projection.ellipsoid;
-
-        // Project original values to 2D.
-        var values3D = attribute.values;
-        var projectedValues = new Float64Array(values3D.length);
-        var index = 0;
-
-        for ( var i = 0; i < values3D.length; i += 3) {
-            var value = Cartographic.Cartesian3.fromArray(values3D, i, scratchProjectTo2DCartesian3);
-
-            var lonLat = ellipsoid.cartesianToCartographic(value, scratchProjectTo2DCartographic);
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(lonLat)) {
-                throw new Check.DeveloperError('Could not project point (' + value.x + ', ' + value.y + ', ' + value.z + ') to 2D.');
-            }
-            //>>includeEnd('debug');
-
-            var projectedLonLat = projection.project(lonLat, scratchProjectTo2DCartesian3);
-
-            projectedValues[index++] = projectedLonLat.x;
-            projectedValues[index++] = projectedLonLat.y;
-            projectedValues[index++] = projectedLonLat.z;
-        }
-
-        // Rename original cartesians to WGS84 cartesians.
-        geometry.attributes[attributeName3D] = attribute;
-
-        // Replace original cartesians with 2D projected cartesians
-        geometry.attributes[attributeName2D] = new GeometryAttribute.GeometryAttribute({
-            componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-            componentsPerAttribute : 3,
-            values : projectedValues
-        });
-        delete geometry.attributes[attributeName];
-
-        return geometry;
-    };
-
-    var encodedResult = {
-        high : 0.0,
-        low : 0.0
-    };
-
-    /**
-     * Encodes floating-point geometry attribute values as two separate attributes to improve
-     * rendering precision.
-     * <p>
-     * This is commonly used to create high-precision position vertex attributes.
-     * </p>
-     *
-     * @param {Geometry} geometry The geometry to modify.
-     * @param {String} attributeName The name of the attribute.
-     * @param {String} attributeHighName The name of the attribute for the encoded high bits.
-     * @param {String} attributeLowName The name of the attribute for the encoded low bits.
-     * @returns {Geometry} The modified <code>geometry</code> argument, with its encoded attribute.
-     *
-     * @exception {DeveloperError} geometry must have attribute matching the attributeName argument.
-     * @exception {DeveloperError} The attribute componentDatatype must be ComponentDatatype.DOUBLE.
-     *
-     * @example
-     * geometry = Cesium.GeometryPipeline.encodeAttribute(geometry, 'position3D', 'position3DHigh', 'position3DLow');
-     */
-    GeometryPipeline.encodeAttribute = function(geometry, attributeName, attributeHighName, attributeLowName) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        if (!when.defined(attributeName)) {
-            throw new Check.DeveloperError('attributeName is required.');
-        }
-        if (!when.defined(attributeHighName)) {
-            throw new Check.DeveloperError('attributeHighName is required.');
-        }
-        if (!when.defined(attributeLowName)) {
-            throw new Check.DeveloperError('attributeLowName is required.');
-        }
-        if (!when.defined(geometry.attributes[attributeName])) {
-            throw new Check.DeveloperError('geometry must have attribute matching the attributeName argument: ' + attributeName + '.');
-        }
-        if (geometry.attributes[attributeName].componentDatatype !== ComponentDatatype.ComponentDatatype.DOUBLE) {
-            throw new Check.DeveloperError('The attribute componentDatatype must be ComponentDatatype.DOUBLE.');
-        }
-        //>>includeEnd('debug');
-
-        var attribute = geometry.attributes[attributeName];
-        var values = attribute.values;
-        var length = values.length;
-        var highValues = new Float32Array(length);
-        var lowValues = new Float32Array(length);
-
-        for (var i = 0; i < length; ++i) {
-            EncodedCartesian3.EncodedCartesian3.encode(values[i], encodedResult);
-            highValues[i] = encodedResult.high;
-            lowValues[i] = encodedResult.low;
-        }
-
-        var componentsPerAttribute = attribute.componentsPerAttribute;
-
-        geometry.attributes[attributeHighName] = new GeometryAttribute.GeometryAttribute({
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            componentsPerAttribute : componentsPerAttribute,
-            values : highValues
-        });
-        geometry.attributes[attributeLowName] = new GeometryAttribute.GeometryAttribute({
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            componentsPerAttribute : componentsPerAttribute,
-            values : lowValues
-        });
-        delete geometry.attributes[attributeName];
-
-        return geometry;
-    };
-
-    var scratchCartesian3$1 = new Cartographic.Cartesian3();
-
-    function transformPoint(matrix, attribute) {
-        if (when.defined(attribute)) {
-            var values = attribute.values;
-            var length = values.length;
-            for (var i = 0; i < length; i += 3) {
-                Cartographic.Cartesian3.unpack(values, i, scratchCartesian3$1);
-                BoundingSphere.Matrix4.multiplyByPoint(matrix, scratchCartesian3$1, scratchCartesian3$1);
-                Cartographic.Cartesian3.pack(scratchCartesian3$1, values, i);
-            }
-        }
-    }
-
-    function transformVector(matrix, attribute) {
-        if (when.defined(attribute)) {
-            var values = attribute.values;
-            var length = values.length;
-            for (var i = 0; i < length; i += 3) {
-                Cartographic.Cartesian3.unpack(values, i, scratchCartesian3$1);
-                BoundingSphere.Matrix3.multiplyByVector(matrix, scratchCartesian3$1, scratchCartesian3$1);
-                scratchCartesian3$1 = Cartographic.Cartesian3.normalize(scratchCartesian3$1, scratchCartesian3$1);
-                Cartographic.Cartesian3.pack(scratchCartesian3$1, values, i);
-            }
-        }
-    }
-
-    var inverseTranspose = new BoundingSphere.Matrix4();
-    var normalMatrix = new BoundingSphere.Matrix3();
-
-    /**
-     * Transforms a geometry instance to world coordinates.  This changes
-     * the instance's <code>modelMatrix</code> to {@link Matrix4.IDENTITY} and transforms the
-     * following attributes if they are present: <code>position</code>, <code>normal</code>,
-     * <code>tangent</code>, and <code>bitangent</code>.
-     *
-     * @param {GeometryInstance} instance The geometry instance to modify.
-     * @returns {GeometryInstance} The modified <code>instance</code> argument, with its attributes transforms to world coordinates.
-     *
-     * @example
-     * Cesium.GeometryPipeline.transformToWorldCoordinates(instance);
-     */
-    GeometryPipeline.transformToWorldCoordinates = function(instance) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(instance)) {
-            throw new Check.DeveloperError('instance is required.');
-        }
-        //>>includeEnd('debug');
-
-        var modelMatrix = instance.modelMatrix;
-
-        if (BoundingSphere.Matrix4.equals(modelMatrix, BoundingSphere.Matrix4.IDENTITY)) {
-            // Already in world coordinates
-            return instance;
-        }
-
-        var attributes = instance.geometry.attributes;
-
-        // Transform attributes in known vertex formats
-        transformPoint(modelMatrix, attributes.position);
-        transformPoint(modelMatrix, attributes.prevPosition);
-        transformPoint(modelMatrix, attributes.nextPosition);
-
-        if ((when.defined(attributes.normal)) ||
-            (when.defined(attributes.tangent)) ||
-            (when.defined(attributes.bitangent))) {
-
-            BoundingSphere.Matrix4.inverse(modelMatrix, inverseTranspose);
-            BoundingSphere.Matrix4.transpose(inverseTranspose, inverseTranspose);
-            BoundingSphere.Matrix4.getRotation(inverseTranspose, normalMatrix);
-
-            transformVector(normalMatrix, attributes.normal);
-            transformVector(normalMatrix, attributes.tangent);
-            transformVector(normalMatrix, attributes.bitangent);
-        }
-
-        var boundingSphere = instance.geometry.boundingSphere;
-        if (when.defined(boundingSphere)) {
-            instance.geometry.boundingSphere = BoundingSphere.BoundingSphere.transform(boundingSphere, modelMatrix, boundingSphere);
-        }
-
-        instance.modelMatrix = BoundingSphere.Matrix4.clone(BoundingSphere.Matrix4.IDENTITY);
-
-        return instance;
-    };
-
-    function findAttributesInAllGeometries(instances, propertyName) {
-        var length = instances.length;
-
-        var attributesInAllGeometries = {};
-
-        var attributes0 = instances[0][propertyName].attributes;
-        var name;
-
-        for (name in attributes0) {
-            if (attributes0.hasOwnProperty(name) &&
-                    when.defined(attributes0[name]) &&
-                    when.defined(attributes0[name].values)) {
-
-                var attribute = attributes0[name];
-                var numberOfComponents = attribute.values.length;
-                var inAllGeometries = true;
-
-                // Does this same attribute exist in all geometries?
-                for (var i = 1; i < length; ++i) {
-                    var otherAttribute = instances[i][propertyName].attributes[name];
-
-                    if ((!when.defined(otherAttribute)) ||
-                        (attribute.componentDatatype !== otherAttribute.componentDatatype) ||
-                        (attribute.componentsPerAttribute !== otherAttribute.componentsPerAttribute) ||
-                        (attribute.normalize !== otherAttribute.normalize)) {
-
-                        inAllGeometries = false;
-                        break;
-                    }
-
-                    numberOfComponents += otherAttribute.values.length;
-                }
-
-                if (inAllGeometries) {
-                    attributesInAllGeometries[name] = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : attribute.componentDatatype,
-                        componentsPerAttribute : attribute.componentsPerAttribute,
-                        normalize : attribute.normalize,
-                        values : ComponentDatatype.ComponentDatatype.createTypedArray(attribute.componentDatatype, numberOfComponents)
-                    });
-                }
-            }
-        }
-
-        return attributesInAllGeometries;
-    }
-
-    var tempScratch = new Cartographic.Cartesian3();
-
-    function combineGeometries(instances, propertyName) {
-        var length = instances.length;
-
-        var name;
-        var i;
-        var j;
-        var k;
-
-        var m = instances[0].modelMatrix;
-        var haveIndices = (when.defined(instances[0][propertyName].indices));
-        var primitiveType = instances[0][propertyName].primitiveType;
-
-        //>>includeStart('debug', pragmas.debug);
-        for (i = 1; i < length; ++i) {
-            if (!BoundingSphere.Matrix4.equals(instances[i].modelMatrix, m)) {
-                throw new Check.DeveloperError('All instances must have the same modelMatrix.');
-            }
-            if ((when.defined(instances[i][propertyName].indices)) !== haveIndices) {
-                throw new Check.DeveloperError('All instance geometries must have an indices or not have one.');
-            }
-            if (instances[i][propertyName].primitiveType !== primitiveType) {
-                throw new Check.DeveloperError('All instance geometries must have the same primitiveType.');
-            }
-        }
-        //>>includeEnd('debug');
-
-        // Find subset of attributes in all geometries
-        var attributes = findAttributesInAllGeometries(instances, propertyName);
-        var values;
-        var sourceValues;
-        var sourceValuesLength;
-
-        // Combine attributes from each geometry into a single typed array
-        for (name in attributes) {
-            if (attributes.hasOwnProperty(name)) {
-                values = attributes[name].values;
-
-                k = 0;
-                for (i = 0; i < length; ++i) {
-                    sourceValues = instances[i][propertyName].attributes[name].values;
-                    sourceValuesLength = sourceValues.length;
-
-                    for (j = 0; j < sourceValuesLength; ++j) {
-                        values[k++] = sourceValues[j];
-                    }
-                }
-            }
-        }
-
-        // Combine index lists
-        var indices;
-
-        if (haveIndices) {
-            var numberOfIndices = 0;
-            for (i = 0; i < length; ++i) {
-                numberOfIndices += instances[i][propertyName].indices.length;
-            }
-
-            var numberOfVertices = GeometryAttribute.Geometry.computeNumberOfVertices(new GeometryAttribute.Geometry({
-                attributes : attributes,
-                primitiveType : PrimitiveType.PrimitiveType.POINTS
-            }));
-            var destIndices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, numberOfIndices);
-
-            var destOffset = 0;
-            var offset = 0;
-
-            for (i = 0; i < length; ++i) {
-                var sourceIndices = instances[i][propertyName].indices;
-                var sourceIndicesLen = sourceIndices.length;
-
-                for (k = 0; k < sourceIndicesLen; ++k) {
-                    destIndices[destOffset++] = offset + sourceIndices[k];
-                }
-
-                offset += GeometryAttribute.Geometry.computeNumberOfVertices(instances[i][propertyName]);
-            }
-
-            indices = destIndices;
-        }
-
-        // Create bounding sphere that includes all instances
-        var center = new Cartographic.Cartesian3();
-        var radius = 0.0;
-        var bs;
-
-        for (i = 0; i < length; ++i) {
-            bs = instances[i][propertyName].boundingSphere;
-            if (!when.defined(bs)) {
-                // If any geometries have an undefined bounding sphere, then so does the combined geometry
-                center = undefined;
-                break;
-            }
-
-            Cartographic.Cartesian3.add(bs.center, center, center);
-        }
-
-        if (when.defined(center)) {
-            Cartographic.Cartesian3.divideByScalar(center, length, center);
-
-            for (i = 0; i < length; ++i) {
-                bs = instances[i][propertyName].boundingSphere;
-                var tempRadius = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.subtract(bs.center, center, tempScratch)) + bs.radius;
-
-                if (tempRadius > radius) {
-                    radius = tempRadius;
-                }
-            }
-        }
-
-        return new GeometryAttribute.Geometry({
-            attributes : attributes,
-            indices : indices,
-            primitiveType : primitiveType,
-            boundingSphere : (when.defined(center)) ? new BoundingSphere.BoundingSphere(center, radius) : undefined
-        });
-    }
-
-    /**
-     * Combines geometry from several {@link GeometryInstance} objects into one geometry.
-     * This concatenates the attributes, concatenates and adjusts the indices, and creates
-     * a bounding sphere encompassing all instances.
-     * <p>
-     * If the instances do not have the same attributes, a subset of attributes common
-     * to all instances is used, and the others are ignored.
-     * </p>
-     * <p>
-     * This is used by {@link Primitive} to efficiently render a large amount of static data.
-     * </p>
-     *
-     * @private
-     *
-     * @param {GeometryInstance[]} [instances] The array of {@link GeometryInstance} objects whose geometry will be combined.
-     * @returns {Geometry} A single geometry created from the provided geometry instances.
-     *
-     * @exception {DeveloperError} All instances must have the same modelMatrix.
-     * @exception {DeveloperError} All instance geometries must have an indices or not have one.
-     * @exception {DeveloperError} All instance geometries must have the same primitiveType.
-     *
-     *
-     * @example
-     * for (var i = 0; i < instances.length; ++i) {
-     *   Cesium.GeometryPipeline.transformToWorldCoordinates(instances[i]);
-     * }
-     * var geometries = Cesium.GeometryPipeline.combineInstances(instances);
-     *
-     * @see GeometryPipeline.transformToWorldCoordinates
-     */
-    GeometryPipeline.combineInstances = function(instances) {
-        //>>includeStart('debug', pragmas.debug);
-        if ((!when.defined(instances)) || (instances.length < 1)) {
-            throw new Check.DeveloperError('instances is required and must have length greater than zero.');
-        }
-        //>>includeEnd('debug');
-
-        var instanceGeometry = [];
-        var instanceSplitGeometry = [];
-        var length = instances.length;
-        for (var i = 0; i < length; ++i) {
-            var instance = instances[i];
-
-            if (when.defined(instance.geometry)) {
-                instanceGeometry.push(instance);
-            } else if (when.defined(instance.westHemisphereGeometry) && when.defined(instance.eastHemisphereGeometry)) {
-                instanceSplitGeometry.push(instance);
-            }
-        }
-
-        var geometries = [];
-        if (instanceGeometry.length > 0) {
-            geometries.push(combineGeometries(instanceGeometry, 'geometry'));
-        }
-
-        if (instanceSplitGeometry.length > 0) {
-            geometries.push(combineGeometries(instanceSplitGeometry, 'westHemisphereGeometry'));
-            geometries.push(combineGeometries(instanceSplitGeometry, 'eastHemisphereGeometry'));
-        }
-
-        return geometries;
-    };
-
-    var normal = new Cartographic.Cartesian3();
-    var v0 = new Cartographic.Cartesian3();
-    var v1 = new Cartographic.Cartesian3();
-    var v2 = new Cartographic.Cartesian3();
-
-    /**
-     * Computes per-vertex normals for a geometry containing <code>TRIANGLES</code> by averaging the normals of
-     * all triangles incident to the vertex.  The result is a new <code>normal</code> attribute added to the geometry.
-     * This assumes a counter-clockwise winding order.
-     *
-     * @param {Geometry} geometry The geometry to modify.
-     * @returns {Geometry} The modified <code>geometry</code> argument with the computed <code>normal</code> attribute.
-     *
-     * @exception {DeveloperError} geometry.indices length must be greater than 0 and be a multiple of 3.
-     * @exception {DeveloperError} geometry.primitiveType must be {@link PrimitiveType.TRIANGLES}.
-     *
-     * @example
-     * Cesium.GeometryPipeline.computeNormal(geometry);
-     */
-    GeometryPipeline.computeNormal = function(geometry) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        if (!when.defined(geometry.attributes.position) || !when.defined(geometry.attributes.position.values)) {
-            throw new Check.DeveloperError('geometry.attributes.position.values is required.');
-        }
-        if (!when.defined(geometry.indices)) {
-            throw new Check.DeveloperError('geometry.indices is required.');
-        }
-        if (geometry.indices.length < 2 || geometry.indices.length % 3 !== 0) {
-            throw new Check.DeveloperError('geometry.indices length must be greater than 0 and be a multiple of 3.');
-        }
-        if (geometry.primitiveType !== PrimitiveType.PrimitiveType.TRIANGLES) {
-            throw new Check.DeveloperError('geometry.primitiveType must be PrimitiveType.TRIANGLES.');
-        }
-        //>>includeEnd('debug');
-
-        var indices = geometry.indices;
-        var attributes = geometry.attributes;
-        var vertices = attributes.position.values;
-        var numVertices = attributes.position.values.length / 3;
-        var numIndices = indices.length;
-        var normalsPerVertex = new Array(numVertices);
-        var normalsPerTriangle = new Array(numIndices / 3);
-        var normalIndices = new Array(numIndices);
-        var i;
-        for ( i = 0; i < numVertices; i++) {
-            normalsPerVertex[i] = {
-                indexOffset : 0,
-                count : 0,
-                currentCount : 0
-            };
-        }
-
-        var j = 0;
-        for (i = 0; i < numIndices; i += 3) {
-            var i0 = indices[i];
-            var i1 = indices[i + 1];
-            var i2 = indices[i + 2];
-            var i03 = i0 * 3;
-            var i13 = i1 * 3;
-            var i23 = i2 * 3;
-
-            v0.x = vertices[i03];
-            v0.y = vertices[i03 + 1];
-            v0.z = vertices[i03 + 2];
-            v1.x = vertices[i13];
-            v1.y = vertices[i13 + 1];
-            v1.z = vertices[i13 + 2];
-            v2.x = vertices[i23];
-            v2.y = vertices[i23 + 1];
-            v2.z = vertices[i23 + 2];
-
-            normalsPerVertex[i0].count++;
-            normalsPerVertex[i1].count++;
-            normalsPerVertex[i2].count++;
-
-            Cartographic.Cartesian3.subtract(v1, v0, v1);
-            Cartographic.Cartesian3.subtract(v2, v0, v2);
-            normalsPerTriangle[j] = Cartographic.Cartesian3.cross(v1, v2, new Cartographic.Cartesian3());
-            j++;
-        }
-
-        var indexOffset = 0;
-        for (i = 0; i < numVertices; i++) {
-            normalsPerVertex[i].indexOffset += indexOffset;
-            indexOffset += normalsPerVertex[i].count;
-        }
-
-        j = 0;
-        var vertexNormalData;
-        for (i = 0; i < numIndices; i += 3) {
-            vertexNormalData = normalsPerVertex[indices[i]];
-            var index = vertexNormalData.indexOffset + vertexNormalData.currentCount;
-            normalIndices[index] = j;
-            vertexNormalData.currentCount++;
-
-            vertexNormalData = normalsPerVertex[indices[i + 1]];
-            index = vertexNormalData.indexOffset + vertexNormalData.currentCount;
-            normalIndices[index] = j;
-            vertexNormalData.currentCount++;
-
-            vertexNormalData = normalsPerVertex[indices[i + 2]];
-            index = vertexNormalData.indexOffset + vertexNormalData.currentCount;
-            normalIndices[index] = j;
-            vertexNormalData.currentCount++;
-
-            j++;
-        }
-
-        var normalValues = new Float32Array(numVertices * 3);
-        for (i = 0; i < numVertices; i++) {
-            var i3 = i * 3;
-            vertexNormalData = normalsPerVertex[i];
-            Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, normal);
-            if (vertexNormalData.count > 0) {
-                for (j = 0; j < vertexNormalData.count; j++) {
-                    Cartographic.Cartesian3.add(normal, normalsPerTriangle[normalIndices[vertexNormalData.indexOffset + j]], normal);
-                }
-
-                // We can run into an issue where a vertex is used with 2 primitives that have opposite winding order.
-                if (Cartographic.Cartesian3.equalsEpsilon(Cartographic.Cartesian3.ZERO, normal, _Math.CesiumMath.EPSILON10)) {
-                    Cartographic.Cartesian3.clone(normalsPerTriangle[normalIndices[vertexNormalData.indexOffset]], normal);
-                }
-            }
-
-            // We end up with a zero vector probably because of a degenerate triangle
-            if (Cartographic.Cartesian3.equalsEpsilon(Cartographic.Cartesian3.ZERO, normal, _Math.CesiumMath.EPSILON10)) {
-                // Default to (0,0,1)
-                normal.z = 1.0;
-            }
-
-            Cartographic.Cartesian3.normalize(normal, normal);
-            normalValues[i3] = normal.x;
-            normalValues[i3 + 1] = normal.y;
-            normalValues[i3 + 2] = normal.z;
-        }
-
-        geometry.attributes.normal = new GeometryAttribute.GeometryAttribute({
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            componentsPerAttribute : 3,
-            values : normalValues
-        });
-
-        return geometry;
-    };
-
-    var normalScratch = new Cartographic.Cartesian3();
-    var normalScale = new Cartographic.Cartesian3();
-    var tScratch = new Cartographic.Cartesian3();
-
-    /**
-     * Computes per-vertex tangents and bitangents for a geometry containing <code>TRIANGLES</code>.
-     * The result is new <code>tangent</code> and <code>bitangent</code> attributes added to the geometry.
-     * This assumes a counter-clockwise winding order.
-     * <p>
-     * Based on <a href="http://www.terathon.com/code/tangent.html">Computing Tangent Space Basis Vectors
-     * for an Arbitrary Mesh</a> by Eric Lengyel.
-     * </p>
-     *
-     * @param {Geometry} geometry The geometry to modify.
-     * @returns {Geometry} The modified <code>geometry</code> argument with the computed <code>tangent</code> and <code>bitangent</code> attributes.
-     *
-     * @exception {DeveloperError} geometry.indices length must be greater than 0 and be a multiple of 3.
-     * @exception {DeveloperError} geometry.primitiveType must be {@link PrimitiveType.TRIANGLES}.
-     *
-     * @example
-     * Cesium.GeometryPipeline.computeTangentAndBiTangent(geometry);
-     */
-    GeometryPipeline.computeTangentAndBitangent = function(geometry) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        //>>includeEnd('debug');
-
-        var attributes = geometry.attributes;
-        var indices = geometry.indices;
-
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(attributes.position) || !when.defined(attributes.position.values)) {
-            throw new Check.DeveloperError('geometry.attributes.position.values is required.');
-        }
-        if (!when.defined(attributes.normal) || !when.defined(attributes.normal.values)) {
-            throw new Check.DeveloperError('geometry.attributes.normal.values is required.');
-        }
-        if (!when.defined(attributes.st) || !when.defined(attributes.st.values)) {
-            throw new Check.DeveloperError('geometry.attributes.st.values is required.');
-        }
-        if (!when.defined(indices)) {
-            throw new Check.DeveloperError('geometry.indices is required.');
-        }
-        if (indices.length < 2 || indices.length % 3 !== 0) {
-            throw new Check.DeveloperError('geometry.indices length must be greater than 0 and be a multiple of 3.');
-        }
-        if (geometry.primitiveType !== PrimitiveType.PrimitiveType.TRIANGLES) {
-            throw new Check.DeveloperError('geometry.primitiveType must be PrimitiveType.TRIANGLES.');
-        }
-        //>>includeEnd('debug');
-
-        var vertices = geometry.attributes.position.values;
-        var normals = geometry.attributes.normal.values;
-        var st = geometry.attributes.st.values;
-
-        var numVertices = geometry.attributes.position.values.length / 3;
-        var numIndices = indices.length;
-        var tan1 = new Array(numVertices * 3);
-
-        var i;
-        for ( i = 0; i < tan1.length; i++) {
-            tan1[i] = 0;
-        }
-
-        var i03;
-        var i13;
-        var i23;
-        for (i = 0; i < numIndices; i += 3) {
-            var i0 = indices[i];
-            var i1 = indices[i + 1];
-            var i2 = indices[i + 2];
-            i03 = i0 * 3;
-            i13 = i1 * 3;
-            i23 = i2 * 3;
-            var i02 = i0 * 2;
-            var i12 = i1 * 2;
-            var i22 = i2 * 2;
-
-            var ux = vertices[i03];
-            var uy = vertices[i03 + 1];
-            var uz = vertices[i03 + 2];
-
-            var wx = st[i02];
-            var wy = st[i02 + 1];
-            var t1 = st[i12 + 1] - wy;
-            var t2 = st[i22 + 1] - wy;
-
-            var r = 1.0 / ((st[i12] - wx) * t2 - (st[i22] - wx) * t1);
-            var sdirx = (t2 * (vertices[i13] - ux) - t1 * (vertices[i23] - ux)) * r;
-            var sdiry = (t2 * (vertices[i13 + 1] - uy) - t1 * (vertices[i23 + 1] - uy)) * r;
-            var sdirz = (t2 * (vertices[i13 + 2] - uz) - t1 * (vertices[i23 + 2] - uz)) * r;
-
-            tan1[i03] += sdirx;
-            tan1[i03 + 1] += sdiry;
-            tan1[i03 + 2] += sdirz;
-
-            tan1[i13] += sdirx;
-            tan1[i13 + 1] += sdiry;
-            tan1[i13 + 2] += sdirz;
-
-            tan1[i23] += sdirx;
-            tan1[i23 + 1] += sdiry;
-            tan1[i23 + 2] += sdirz;
-        }
-
-        var tangentValues = new Float32Array(numVertices * 3);
-        var bitangentValues = new Float32Array(numVertices * 3);
-
-        for (i = 0; i < numVertices; i++) {
-            i03 = i * 3;
-            i13 = i03 + 1;
-            i23 = i03 + 2;
-
-            var n = Cartographic.Cartesian3.fromArray(normals, i03, normalScratch);
-            var t = Cartographic.Cartesian3.fromArray(tan1, i03, tScratch);
-            var scalar = Cartographic.Cartesian3.dot(n, t);
-            Cartographic.Cartesian3.multiplyByScalar(n, scalar, normalScale);
-            Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.subtract(t, normalScale, t), t);
-
-            tangentValues[i03] = t.x;
-            tangentValues[i13] = t.y;
-            tangentValues[i23] = t.z;
-
-            Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(n, t, t), t);
-
-            bitangentValues[i03] = t.x;
-            bitangentValues[i13] = t.y;
-            bitangentValues[i23] = t.z;
-        }
-
-        geometry.attributes.tangent = new GeometryAttribute.GeometryAttribute({
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            componentsPerAttribute : 3,
-            values : tangentValues
-        });
-
-        geometry.attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            componentsPerAttribute : 3,
-            values : bitangentValues
-        });
-
-        return geometry;
-    };
-
-    var scratchCartesian2$1 = new Cartesian2.Cartesian2();
-    var toEncode1 = new Cartographic.Cartesian3();
-    var toEncode2 = new Cartographic.Cartesian3();
-    var toEncode3 = new Cartographic.Cartesian3();
-    var encodeResult2 = new Cartesian2.Cartesian2();
-    /**
-     * Compresses and packs geometry normal attribute values to save memory.
-     *
-     * @param {Geometry} geometry The geometry to modify.
-     * @returns {Geometry} The modified <code>geometry</code> argument, with its normals compressed and packed.
-     *
-     * @example
-     * geometry = Cesium.GeometryPipeline.compressVertices(geometry);
-     */
-    GeometryPipeline.compressVertices = function(geometry) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(geometry)) {
-            throw new Check.DeveloperError('geometry is required.');
-        }
-        //>>includeEnd('debug');
-
-        var extrudeAttribute = geometry.attributes.extrudeDirection;
-        var i;
-        var numVertices;
-        if (when.defined(extrudeAttribute)) {
-            //only shadow volumes use extrudeDirection, and shadow volumes use vertexFormat: POSITION_ONLY so we don't need to check other attributes
-            var extrudeDirections = extrudeAttribute.values;
-            numVertices = extrudeDirections.length / 3.0;
-            var compressedDirections = new Float32Array(numVertices * 2);
-
-            var i2 = 0;
-            for (i = 0; i < numVertices; ++i) {
-                Cartographic.Cartesian3.fromArray(extrudeDirections, i * 3.0, toEncode1);
-                if (Cartographic.Cartesian3.equals(toEncode1, Cartographic.Cartesian3.ZERO)) {
-                    i2 += 2;
-                    continue;
-                }
-                encodeResult2 = AttributeCompression.AttributeCompression.octEncodeInRange(toEncode1, 65535, encodeResult2);
-                compressedDirections[i2++] = encodeResult2.x;
-                compressedDirections[i2++] = encodeResult2.y;
-            }
-
-            geometry.attributes.compressedAttributes = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                componentsPerAttribute : 2,
-                values : compressedDirections
-            });
-            delete geometry.attributes.extrudeDirection;
-            return geometry;
-        }
-
-        var normalAttribute = geometry.attributes.normal;
-        var stAttribute = geometry.attributes.st;
-
-        var hasNormal = when.defined(normalAttribute);
-        var hasSt = when.defined(stAttribute);
-        if (!hasNormal && !hasSt) {
-            return geometry;
-        }
-
-        var tangentAttribute = geometry.attributes.tangent;
-        var bitangentAttribute = geometry.attributes.bitangent;
-
-        var hasTangent = when.defined(tangentAttribute);
-        var hasBitangent = when.defined(bitangentAttribute);
-
-        var normals;
-        var st;
-        var tangents;
-        var bitangents;
-
-        if (hasNormal) {
-            normals = normalAttribute.values;
-        }
-        if (hasSt) {
-            st = stAttribute.values;
-        }
-        if (hasTangent) {
-            tangents = tangentAttribute.values;
-        }
-        if (hasBitangent) {
-            bitangents = bitangentAttribute.values;
-        }
-
-        var length = hasNormal ? normals.length : st.length;
-        var numComponents = hasNormal ? 3.0 : 2.0;
-        numVertices = length / numComponents;
-
-        var compressedLength = numVertices;
-        var numCompressedComponents = hasSt && hasNormal ? 2.0 : 1.0;
-        numCompressedComponents += hasTangent || hasBitangent ? 1.0 : 0.0;
-        compressedLength *= numCompressedComponents;
-
-        var compressedAttributes = new Float32Array(compressedLength);
-
-        var normalIndex = 0;
-        for (i = 0; i < numVertices; ++i) {
-            if (hasSt) {
-                Cartesian2.Cartesian2.fromArray(st, i * 2.0, scratchCartesian2$1);
-                compressedAttributes[normalIndex++] = AttributeCompression.AttributeCompression.compressTextureCoordinates(scratchCartesian2$1);
-            }
-
-            var index = i * 3.0;
-            if (hasNormal && when.defined(tangents) && when.defined(bitangents)) {
-                Cartographic.Cartesian3.fromArray(normals, index, toEncode1);
-                Cartographic.Cartesian3.fromArray(tangents, index, toEncode2);
-                Cartographic.Cartesian3.fromArray(bitangents, index, toEncode3);
-
-                AttributeCompression.AttributeCompression.octPack(toEncode1, toEncode2, toEncode3, scratchCartesian2$1);
-                compressedAttributes[normalIndex++] = scratchCartesian2$1.x;
-                compressedAttributes[normalIndex++] = scratchCartesian2$1.y;
-            } else {
-                if (hasNormal) {
-                    Cartographic.Cartesian3.fromArray(normals, index, toEncode1);
-                    compressedAttributes[normalIndex++] = AttributeCompression.AttributeCompression.octEncodeFloat(toEncode1);
-                }
-
-                if (hasTangent) {
-                    Cartographic.Cartesian3.fromArray(tangents, index, toEncode1);
-                    compressedAttributes[normalIndex++] = AttributeCompression.AttributeCompression.octEncodeFloat(toEncode1);
-                }
-
-                if (hasBitangent) {
-                    Cartographic.Cartesian3.fromArray(bitangents, index, toEncode1);
-                    compressedAttributes[normalIndex++] = AttributeCompression.AttributeCompression.octEncodeFloat(toEncode1);
-                }
-            }
-        }
-
-        geometry.attributes.compressedAttributes = new GeometryAttribute.GeometryAttribute({
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            componentsPerAttribute : numCompressedComponents,
-            values : compressedAttributes
-        });
-
-        if (hasNormal) {
-            delete geometry.attributes.normal;
-        }
-        if (hasSt) {
-            delete geometry.attributes.st;
-        }
-        if (hasBitangent) {
-            delete geometry.attributes.bitangent;
-        }
-        if (hasTangent) {
-            delete geometry.attributes.tangent;
-        }
-
-        return geometry;
-    };
-
-    function indexTriangles(geometry) {
-        if (when.defined(geometry.indices)) {
-            return geometry;
-        }
-        var numberOfVertices = GeometryAttribute.Geometry.computeNumberOfVertices(geometry);
-
-        //>>includeStart('debug', pragmas.debug);
-        if (numberOfVertices < 3) {
-            throw new Check.DeveloperError('The number of vertices must be at least three.');
-        }
-        if (numberOfVertices % 3 !== 0) {
-            throw new Check.DeveloperError('The number of vertices must be a multiple of three.');
-        }
-        //>>includeEnd('debug');
-
-        var indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, numberOfVertices);
-        for (var i = 0; i < numberOfVertices; ++i) {
-            indices[i] = i;
-        }
-
-        geometry.indices = indices;
-        return geometry;
-    }
-
-    function indexTriangleFan(geometry) {
-        var numberOfVertices = GeometryAttribute.Geometry.computeNumberOfVertices(geometry);
-
-        //>>includeStart('debug', pragmas.debug);
-        if (numberOfVertices < 3) {
-            throw new Check.DeveloperError('The number of vertices must be at least three.');
-        }
-        //>>includeEnd('debug');
-
-        var indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, (numberOfVertices - 2) * 3);
-        indices[0] = 1;
-        indices[1] = 0;
-        indices[2] = 2;
-
-        var indicesIndex = 3;
-        for (var i = 3; i < numberOfVertices; ++i) {
-            indices[indicesIndex++] = i - 1;
-            indices[indicesIndex++] = 0;
-            indices[indicesIndex++] = i;
-        }
-
-        geometry.indices = indices;
-        geometry.primitiveType = PrimitiveType.PrimitiveType.TRIANGLES;
-        return geometry;
-    }
-
-    function indexTriangleStrip(geometry) {
-        var numberOfVertices = GeometryAttribute.Geometry.computeNumberOfVertices(geometry);
-
-        //>>includeStart('debug', pragmas.debug);
-        if (numberOfVertices < 3) {
-            throw new Check.DeveloperError('The number of vertices must be at least 3.');
-        }
-        //>>includeEnd('debug');
-
-        var indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, (numberOfVertices - 2) * 3);
-        indices[0] = 0;
-        indices[1] = 1;
-        indices[2] = 2;
-
-        if (numberOfVertices > 3) {
-            indices[3] = 0;
-            indices[4] = 2;
-            indices[5] = 3;
-        }
-
-        var indicesIndex = 6;
-        for (var i = 3; i < numberOfVertices - 1; i += 2) {
-            indices[indicesIndex++] = i;
-            indices[indicesIndex++] = i - 1;
-            indices[indicesIndex++] = i + 1;
-
-            if (i + 2 < numberOfVertices) {
-                indices[indicesIndex++] = i;
-                indices[indicesIndex++] = i + 1;
-                indices[indicesIndex++] = i + 2;
-            }
-        }
-
-        geometry.indices = indices;
-        geometry.primitiveType = PrimitiveType.PrimitiveType.TRIANGLES;
-        return geometry;
-    }
-
-    function indexLines(geometry) {
-        if (when.defined(geometry.indices)) {
-            return geometry;
-        }
-        var numberOfVertices = GeometryAttribute.Geometry.computeNumberOfVertices(geometry);
-
-        //>>includeStart('debug', pragmas.debug);
-        if (numberOfVertices < 2) {
-            throw new Check.DeveloperError('The number of vertices must be at least two.');
-        }
-        if (numberOfVertices % 2 !== 0) {
-            throw new Check.DeveloperError('The number of vertices must be a multiple of 2.');
-        }
-        //>>includeEnd('debug');
-
-        var indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, numberOfVertices);
-        for (var i = 0; i < numberOfVertices; ++i) {
-            indices[i] = i;
-        }
-
-        geometry.indices = indices;
-        return geometry;
-    }
-
-    function indexLineStrip(geometry) {
-        var numberOfVertices = GeometryAttribute.Geometry.computeNumberOfVertices(geometry);
-
-        //>>includeStart('debug', pragmas.debug);
-        if (numberOfVertices < 2) {
-            throw new Check.DeveloperError('The number of vertices must be at least two.');
-        }
-        //>>includeEnd('debug');
-
-        var indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, (numberOfVertices - 1) * 2);
-        indices[0] = 0;
-        indices[1] = 1;
-        var indicesIndex = 2;
-        for (var i = 2; i < numberOfVertices; ++i) {
-            indices[indicesIndex++] = i - 1;
-            indices[indicesIndex++] = i;
-        }
-
-        geometry.indices = indices;
-        geometry.primitiveType = PrimitiveType.PrimitiveType.LINES;
-        return geometry;
-    }
-
-    function indexLineLoop(geometry) {
-        var numberOfVertices = GeometryAttribute.Geometry.computeNumberOfVertices(geometry);
-
-        //>>includeStart('debug', pragmas.debug);
-        if (numberOfVertices < 2) {
-            throw new Check.DeveloperError('The number of vertices must be at least two.');
-        }
-        //>>includeEnd('debug');
-
-        var indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, numberOfVertices * 2);
-
-        indices[0] = 0;
-        indices[1] = 1;
-
-        var indicesIndex = 2;
-        for (var i = 2; i < numberOfVertices; ++i) {
-            indices[indicesIndex++] = i - 1;
-            indices[indicesIndex++] = i;
-        }
-
-        indices[indicesIndex++] = numberOfVertices - 1;
-        indices[indicesIndex] = 0;
-
-        geometry.indices = indices;
-        geometry.primitiveType = PrimitiveType.PrimitiveType.LINES;
-        return geometry;
-    }
-
-    function indexPrimitive(geometry) {
-        switch (geometry.primitiveType) {
-        case PrimitiveType.PrimitiveType.TRIANGLE_FAN:
-            return indexTriangleFan(geometry);
-        case PrimitiveType.PrimitiveType.TRIANGLE_STRIP:
-            return indexTriangleStrip(geometry);
-        case PrimitiveType.PrimitiveType.TRIANGLES:
-            return indexTriangles(geometry);
-        case PrimitiveType.PrimitiveType.LINE_STRIP:
-            return indexLineStrip(geometry);
-        case PrimitiveType.PrimitiveType.LINE_LOOP:
-            return indexLineLoop(geometry);
-        case PrimitiveType.PrimitiveType.LINES:
-            return indexLines(geometry);
-        }
-
-        return geometry;
-    }
-
-    function offsetPointFromXZPlane(p, isBehind) {
-        if (Math.abs(p.y) < _Math.CesiumMath.EPSILON6){
-            if (isBehind) {
-                p.y = -_Math.CesiumMath.EPSILON6;
-            } else {
-                p.y = _Math.CesiumMath.EPSILON6;
-            }
-        }
-    }
-
-    function offsetTriangleFromXZPlane(p0, p1, p2) {
-        if (p0.y !== 0.0 && p1.y !== 0.0 && p2.y !== 0.0) {
-            offsetPointFromXZPlane(p0, p0.y < 0.0);
-            offsetPointFromXZPlane(p1, p1.y < 0.0);
-            offsetPointFromXZPlane(p2, p2.y < 0.0);
-            return;
-        }
-
-        var p0y = Math.abs(p0.y);
-        var p1y = Math.abs(p1.y);
-        var p2y = Math.abs(p2.y);
-
-        var sign;
-        if (p0y > p1y) {
-            if (p0y > p2y) {
-                sign = _Math.CesiumMath.sign(p0.y);
-            } else {
-                sign = _Math.CesiumMath.sign(p2.y);
-            }
-        } else if (p1y > p2y) {
-            sign = _Math.CesiumMath.sign(p1.y);
-        } else {
-            sign = _Math.CesiumMath.sign(p2.y);
-        }
-
-        var isBehind = sign < 0.0;
-        offsetPointFromXZPlane(p0, isBehind);
-        offsetPointFromXZPlane(p1, isBehind);
-        offsetPointFromXZPlane(p2, isBehind);
-    }
-
-    var c3 = new Cartographic.Cartesian3();
-    function getXZIntersectionOffsetPoints(p, p1, u1, v1) {
-        Cartographic.Cartesian3.add(p, Cartographic.Cartesian3.multiplyByScalar(Cartographic.Cartesian3.subtract(p1, p, c3), p.y/(p.y-p1.y), c3), u1);
-        Cartographic.Cartesian3.clone(u1, v1);
-        offsetPointFromXZPlane(u1, true);
-        offsetPointFromXZPlane(v1, false);
-    }
-
-    var u1 = new Cartographic.Cartesian3();
-    var u2 = new Cartographic.Cartesian3();
-    var q1 = new Cartographic.Cartesian3();
-    var q2 = new Cartographic.Cartesian3();
-
-    var splitTriangleResult = {
-        positions : new Array(7),
-        indices : new Array(3 * 3)
-    };
-
-    function splitTriangle(p0, p1, p2) {
-        // In WGS84 coordinates, for a triangle approximately on the
-        // ellipsoid to cross the IDL, first it needs to be on the
-        // negative side of the plane x = 0.
-        if ((p0.x >= 0.0) || (p1.x >= 0.0) || (p2.x >= 0.0)) {
-            return undefined;
-        }
-
-        offsetTriangleFromXZPlane(p0, p1, p2);
-
-        var p0Behind = p0.y < 0.0;
-        var p1Behind = p1.y < 0.0;
-        var p2Behind = p2.y < 0.0;
-
-        var numBehind = 0;
-        numBehind += p0Behind ? 1 : 0;
-        numBehind += p1Behind ? 1 : 0;
-        numBehind += p2Behind ? 1 : 0;
-
-        var indices = splitTriangleResult.indices;
-
-        if (numBehind === 1) {
-            indices[1] = 3;
-            indices[2] = 4;
-            indices[5] = 6;
-            indices[7] = 6;
-            indices[8] = 5;
-
-            if (p0Behind) {
-                getXZIntersectionOffsetPoints(p0, p1, u1, q1);
-                getXZIntersectionOffsetPoints(p0, p2, u2, q2);
-
-                indices[0] = 0;
-                indices[3] = 1;
-                indices[4] = 2;
-                indices[6] = 1;
-            } else if (p1Behind) {
-                getXZIntersectionOffsetPoints(p1, p2, u1, q1);
-                getXZIntersectionOffsetPoints(p1, p0, u2, q2);
-
-                indices[0] = 1;
-                indices[3] = 2;
-                indices[4] = 0;
-                indices[6] = 2;
-            } else if (p2Behind) {
-                getXZIntersectionOffsetPoints(p2, p0, u1, q1);
-                getXZIntersectionOffsetPoints(p2, p1, u2, q2);
-
-                indices[0] = 2;
-                indices[3] = 0;
-                indices[4] = 1;
-                indices[6] = 0;
-            }
-        } else if (numBehind === 2) {
-            indices[2] = 4;
-            indices[4] = 4;
-            indices[5] = 3;
-            indices[7] = 5;
-            indices[8] = 6;
-
-            if (!p0Behind) {
-                getXZIntersectionOffsetPoints(p0, p1, u1, q1);
-                getXZIntersectionOffsetPoints(p0, p2, u2, q2);
-
-                indices[0] = 1;
-                indices[1] = 2;
-                indices[3] = 1;
-                indices[6] = 0;
-            } else if (!p1Behind) {
-                getXZIntersectionOffsetPoints(p1, p2, u1, q1);
-                getXZIntersectionOffsetPoints(p1, p0, u2, q2);
-
-                indices[0] = 2;
-                indices[1] = 0;
-                indices[3] = 2;
-                indices[6] = 1;
-            } else if (!p2Behind) {
-                getXZIntersectionOffsetPoints(p2, p0, u1, q1);
-                getXZIntersectionOffsetPoints(p2, p1, u2, q2);
-
-                indices[0] = 0;
-                indices[1] = 1;
-                indices[3] = 0;
-                indices[6] = 2;
-            }
-        }
-
-        var positions = splitTriangleResult.positions;
-        positions[0] = p0;
-        positions[1] = p1;
-        positions[2] = p2;
-        positions.length = 3;
-
-        if (numBehind === 1 || numBehind === 2) {
-            positions[3] = u1;
-            positions[4] = u2;
-            positions[5] = q1;
-            positions[6] = q2;
-            positions.length = 7;
-        }
-
-        return splitTriangleResult;
-    }
-
-    function updateGeometryAfterSplit(geometry, computeBoundingSphere) {
-        var attributes = geometry.attributes;
-
-        if (attributes.position.values.length === 0) {
-            return undefined;
-        }
-
-        for (var property in attributes) {
-            if (attributes.hasOwnProperty(property) &&
-                    when.defined(attributes[property]) &&
-                    when.defined(attributes[property].values)) {
-
-                var attribute = attributes[property];
-                attribute.values = ComponentDatatype.ComponentDatatype.createTypedArray(attribute.componentDatatype, attribute.values);
-            }
-        }
-
-        var numberOfVertices = GeometryAttribute.Geometry.computeNumberOfVertices(geometry);
-        geometry.indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, geometry.indices);
-
-        if (computeBoundingSphere) {
-            geometry.boundingSphere = BoundingSphere.BoundingSphere.fromVertices(attributes.position.values);
-        }
-
-        return geometry;
-    }
-
-    function copyGeometryForSplit(geometry) {
-        var attributes = geometry.attributes;
-        var copiedAttributes = {};
-
-        for (var property in attributes) {
-            if (attributes.hasOwnProperty(property) &&
-                    when.defined(attributes[property]) &&
-                    when.defined(attributes[property].values)) {
-
-                var attribute = attributes[property];
-                copiedAttributes[property] = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : attribute.componentDatatype,
-                    componentsPerAttribute : attribute.componentsPerAttribute,
-                    normalize : attribute.normalize,
-                    values : []
-                });
-            }
-        }
-
-        return new GeometryAttribute.Geometry({
-            attributes : copiedAttributes,
-            indices : [],
-            primitiveType : geometry.primitiveType
-        });
-    }
-
-    function updateInstanceAfterSplit(instance, westGeometry, eastGeometry) {
-        var computeBoundingSphere = when.defined(instance.geometry.boundingSphere);
-
-        westGeometry = updateGeometryAfterSplit(westGeometry, computeBoundingSphere);
-        eastGeometry = updateGeometryAfterSplit(eastGeometry, computeBoundingSphere);
-
-        if (when.defined(eastGeometry) && !when.defined(westGeometry)) {
-            instance.geometry = eastGeometry;
-        } else if (!when.defined(eastGeometry) && when.defined(westGeometry)) {
-            instance.geometry = westGeometry;
-        } else {
-            instance.westHemisphereGeometry = westGeometry;
-            instance.eastHemisphereGeometry = eastGeometry;
-            instance.geometry = undefined;
-        }
-    }
-
-    function generateBarycentricInterpolateFunction(CartesianType, numberOfComponents) {
-        var v0Scratch = new CartesianType();
-        var v1Scratch = new CartesianType();
-        var v2Scratch = new CartesianType();
-
-        return function(i0, i1, i2, coords, sourceValues, currentValues, insertedIndex, normalize) {
-            var v0 = CartesianType.fromArray(sourceValues, i0 * numberOfComponents, v0Scratch);
-            var v1 = CartesianType.fromArray(sourceValues, i1 * numberOfComponents, v1Scratch);
-            var v2 = CartesianType.fromArray(sourceValues, i2 * numberOfComponents, v2Scratch);
-
-            CartesianType.multiplyByScalar(v0, coords.x, v0);
-            CartesianType.multiplyByScalar(v1, coords.y, v1);
-            CartesianType.multiplyByScalar(v2, coords.z, v2);
-
-            var value = CartesianType.add(v0, v1, v0);
-            CartesianType.add(value, v2, value);
-
-            if (normalize) {
-                CartesianType.normalize(value, value);
-            }
-
-            CartesianType.pack(value, currentValues, insertedIndex * numberOfComponents);
-        };
-    }
-
-    var interpolateAndPackCartesian4 = generateBarycentricInterpolateFunction(Cartesian4.Cartesian4, 4);
-    var interpolateAndPackCartesian3 = generateBarycentricInterpolateFunction(Cartographic.Cartesian3, 3);
-    var interpolateAndPackCartesian2 = generateBarycentricInterpolateFunction(Cartesian2.Cartesian2, 2);
-    var interpolateAndPackBoolean = function(i0, i1, i2, coords, sourceValues, currentValues, insertedIndex) {
-        var v1 = sourceValues[i0] * coords.x;
-        var v2 = sourceValues[i1] * coords.y;
-        var v3 = sourceValues[i2] * coords.z;
-        currentValues[insertedIndex] = (v1 + v2 + v3) > _Math.CesiumMath.EPSILON6 ? 1 : 0;
-    };
-
-    var p0Scratch = new Cartographic.Cartesian3();
-    var p1Scratch = new Cartographic.Cartesian3();
-    var p2Scratch = new Cartographic.Cartesian3();
-    var barycentricScratch = new Cartographic.Cartesian3();
-
-    function computeTriangleAttributes(i0, i1, i2, point, positions, normals, tangents, bitangents, texCoords, extrudeDirections, applyOffset, currentAttributes, customAttributeNames, customAttributesLength, allAttributes, insertedIndex) {
-        if (!when.defined(normals) && !when.defined(tangents) && !when.defined(bitangents) && !when.defined(texCoords) && !when.defined(extrudeDirections) && customAttributesLength === 0) {
-            return;
-        }
-
-        var p0 = Cartographic.Cartesian3.fromArray(positions, i0 * 3, p0Scratch);
-        var p1 = Cartographic.Cartesian3.fromArray(positions, i1 * 3, p1Scratch);
-        var p2 = Cartographic.Cartesian3.fromArray(positions, i2 * 3, p2Scratch);
-        var coords = barycentricCoordinates(point, p0, p1, p2, barycentricScratch);
-
-        if (when.defined(normals)) {
-            interpolateAndPackCartesian3(i0, i1, i2, coords, normals, currentAttributes.normal.values, insertedIndex, true);
-        }
-
-        if (when.defined(extrudeDirections)) {
-            var d0 = Cartographic.Cartesian3.fromArray(extrudeDirections, i0 * 3, p0Scratch);
-            var d1 = Cartographic.Cartesian3.fromArray(extrudeDirections, i1 * 3, p1Scratch);
-            var d2 = Cartographic.Cartesian3.fromArray(extrudeDirections, i2 * 3, p2Scratch);
-
-            Cartographic.Cartesian3.multiplyByScalar(d0, coords.x, d0);
-            Cartographic.Cartesian3.multiplyByScalar(d1, coords.y, d1);
-            Cartographic.Cartesian3.multiplyByScalar(d2, coords.z, d2);
-
-            var direction;
-            if (!Cartographic.Cartesian3.equals(d0, Cartographic.Cartesian3.ZERO) || !Cartographic.Cartesian3.equals(d1, Cartographic.Cartesian3.ZERO) || !Cartographic.Cartesian3.equals(d2, Cartographic.Cartesian3.ZERO)) {
-                direction = Cartographic.Cartesian3.add(d0, d1, d0);
-                Cartographic.Cartesian3.add(direction, d2, direction);
-                Cartographic.Cartesian3.normalize(direction, direction);
-            } else {
-                direction = p0Scratch;
-                direction.x = 0;
-                direction.y = 0;
-                direction.z = 0;
-            }
-            Cartographic.Cartesian3.pack(direction, currentAttributes.extrudeDirection.values, insertedIndex * 3);
-        }
-
-        if (when.defined(applyOffset)) {
-            interpolateAndPackBoolean(i0, i1, i2, coords, applyOffset, currentAttributes.applyOffset.values, insertedIndex);
-        }
-
-        if (when.defined(tangents)) {
-            interpolateAndPackCartesian3(i0, i1, i2, coords, tangents, currentAttributes.tangent.values, insertedIndex, true);
-        }
-
-        if (when.defined(bitangents)) {
-            interpolateAndPackCartesian3(i0, i1, i2, coords, bitangents, currentAttributes.bitangent.values, insertedIndex, true);
-        }
-
-        if (when.defined(texCoords)) {
-            interpolateAndPackCartesian2(i0, i1, i2, coords, texCoords, currentAttributes.st.values, insertedIndex);
-        }
-
-        if (customAttributesLength > 0) {
-            for (var i = 0; i < customAttributesLength; i++) {
-                var attributeName = customAttributeNames[i];
-                genericInterpolate(i0, i1, i2, coords, insertedIndex, allAttributes[attributeName], currentAttributes[attributeName]);
-            }
-        }
-    }
-
-    function genericInterpolate(i0, i1, i2, coords, insertedIndex, sourceAttribute, currentAttribute) {
-        var componentsPerAttribute = sourceAttribute.componentsPerAttribute;
-        var sourceValues = sourceAttribute.values;
-        var currentValues = currentAttribute.values;
-        switch(componentsPerAttribute) {
-            case 4:
-                interpolateAndPackCartesian4(i0, i1, i2, coords, sourceValues, currentValues, insertedIndex, false);
-                break;
-            case 3:
-                interpolateAndPackCartesian3(i0, i1, i2, coords, sourceValues, currentValues, insertedIndex, false);
-                break;
-            case 2:
-                interpolateAndPackCartesian2(i0, i1, i2, coords, sourceValues, currentValues, insertedIndex, false);
-                break;
-            default:
-                currentValues[insertedIndex] = sourceValues[i0] * coords.x + sourceValues[i1] * coords.y + sourceValues[i2] * coords.z;
-        }
-    }
-
-    function insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, currentIndex, point) {
-        var insertIndex = currentAttributes.position.values.length / 3;
-
-        if (currentIndex !== -1) {
-            var prevIndex = indices[currentIndex];
-            var newIndex = currentIndexMap[prevIndex];
-
-            if (newIndex === -1) {
-                currentIndexMap[prevIndex] = insertIndex;
-                currentAttributes.position.values.push(point.x, point.y, point.z);
-                currentIndices.push(insertIndex);
-                return insertIndex;
-            }
-
-            currentIndices.push(newIndex);
-            return newIndex;
-        }
-
-        currentAttributes.position.values.push(point.x, point.y, point.z);
-        currentIndices.push(insertIndex);
-        return insertIndex;
-    }
-
-    var NAMED_ATTRIBUTES = {
-        position : true,
-        normal : true,
-        bitangent : true,
-        tangent : true,
-        st : true,
-        extrudeDirection : true,
-        applyOffset: true
-    };
-    function splitLongitudeTriangles(instance) {
-        var geometry = instance.geometry;
-        var attributes = geometry.attributes;
-        var positions = attributes.position.values;
-        var normals = (when.defined(attributes.normal)) ? attributes.normal.values : undefined;
-        var bitangents = (when.defined(attributes.bitangent)) ? attributes.bitangent.values : undefined;
-        var tangents = (when.defined(attributes.tangent)) ? attributes.tangent.values : undefined;
-        var texCoords = (when.defined(attributes.st)) ? attributes.st.values : undefined;
-        var extrudeDirections = (when.defined(attributes.extrudeDirection)) ? attributes.extrudeDirection.values : undefined;
-        var applyOffset = when.defined(attributes.applyOffset) ? attributes.applyOffset.values : undefined;
-        var indices = geometry.indices;
-
-        var customAttributeNames = [];
-        for (var attributeName in attributes) {
-            if (attributes.hasOwnProperty(attributeName) && !NAMED_ATTRIBUTES[attributeName] && when.defined(attributes[attributeName])) {
-                customAttributeNames.push(attributeName);
-            }
-        }
-        var customAttributesLength = customAttributeNames.length;
-
-        var eastGeometry = copyGeometryForSplit(geometry);
-        var westGeometry = copyGeometryForSplit(geometry);
-
-        var currentAttributes;
-        var currentIndices;
-        var currentIndexMap;
-        var insertedIndex;
-        var i;
-
-        var westGeometryIndexMap = [];
-        westGeometryIndexMap.length = positions.length / 3;
-
-        var eastGeometryIndexMap = [];
-        eastGeometryIndexMap.length = positions.length / 3;
-
-        for (i = 0; i < westGeometryIndexMap.length; ++i) {
-            westGeometryIndexMap[i] = -1;
-            eastGeometryIndexMap[i] = -1;
-        }
-
-        var len = indices.length;
-        for (i = 0; i < len; i += 3) {
-            var i0 = indices[i];
-            var i1 = indices[i + 1];
-            var i2 = indices[i + 2];
-
-            var p0 = Cartographic.Cartesian3.fromArray(positions, i0 * 3);
-            var p1 = Cartographic.Cartesian3.fromArray(positions, i1 * 3);
-            var p2 = Cartographic.Cartesian3.fromArray(positions, i2 * 3);
-
-            var result = splitTriangle(p0, p1, p2);
-            if (when.defined(result) && result.positions.length > 3) {
-                var resultPositions = result.positions;
-                var resultIndices = result.indices;
-                var resultLength = resultIndices.length;
-
-                for (var j = 0; j < resultLength; ++j) {
-                    var resultIndex = resultIndices[j];
-                    var point = resultPositions[resultIndex];
-
-                    if (point.y < 0.0) {
-                        currentAttributes = westGeometry.attributes;
-                        currentIndices = westGeometry.indices;
-                        currentIndexMap = westGeometryIndexMap;
-                    } else {
-                        currentAttributes = eastGeometry.attributes;
-                        currentIndices = eastGeometry.indices;
-                        currentIndexMap = eastGeometryIndexMap;
-                    }
-
-                    insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, resultIndex < 3 ? i + resultIndex : -1, point);
-                    computeTriangleAttributes(i0, i1, i2, point, positions, normals, tangents, bitangents, texCoords, extrudeDirections, applyOffset, currentAttributes, customAttributeNames, customAttributesLength, attributes, insertedIndex);
-                }
-            } else {
-                if (when.defined(result)) {
-                    p0 = result.positions[0];
-                    p1 = result.positions[1];
-                    p2 = result.positions[2];
-                }
-
-                if (p0.y < 0.0) {
-                    currentAttributes = westGeometry.attributes;
-                    currentIndices = westGeometry.indices;
-                    currentIndexMap = westGeometryIndexMap;
-                } else {
-                    currentAttributes = eastGeometry.attributes;
-                    currentIndices = eastGeometry.indices;
-                    currentIndexMap = eastGeometryIndexMap;
-                }
-
-                insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i, p0);
-                computeTriangleAttributes(i0, i1, i2, p0, positions, normals, tangents, bitangents, texCoords, extrudeDirections, applyOffset, currentAttributes, customAttributeNames, customAttributesLength, attributes, insertedIndex);
-
-                insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i + 1, p1);
-                computeTriangleAttributes(i0, i1, i2, p1, positions, normals, tangents, bitangents, texCoords, extrudeDirections, applyOffset, currentAttributes, customAttributeNames, customAttributesLength, attributes, insertedIndex);
-
-                insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i + 2, p2);
-                computeTriangleAttributes(i0, i1, i2, p2, positions, normals, tangents, bitangents, texCoords, extrudeDirections, applyOffset, currentAttributes, customAttributeNames, customAttributesLength, attributes, insertedIndex);
-            }
-        }
-
-        updateInstanceAfterSplit(instance, westGeometry, eastGeometry);
-    }
-
-    var xzPlane = Plane.Plane.fromPointNormal(Cartographic.Cartesian3.ZERO, Cartographic.Cartesian3.UNIT_Y);
-
-    var offsetScratch = new Cartographic.Cartesian3();
-    var offsetPointScratch = new Cartographic.Cartesian3();
-
-    function computeLineAttributes(i0, i1, point, positions, insertIndex, currentAttributes, applyOffset) {
-        if (!when.defined(applyOffset)) {
-            return;
-        }
-
-        var p0 = Cartographic.Cartesian3.fromArray(positions, i0 * 3, p0Scratch);
-        if (Cartographic.Cartesian3.equalsEpsilon(p0, point, _Math.CesiumMath.EPSILON10)) {
-            currentAttributes.applyOffset.values[insertIndex] = applyOffset[i0];
-        } else {
-            currentAttributes.applyOffset.values[insertIndex] = applyOffset[i1];
-        }
-
-    }
-
-    function splitLongitudeLines(instance) {
-        var geometry = instance.geometry;
-        var attributes = geometry.attributes;
-        var positions = attributes.position.values;
-        var applyOffset = when.defined(attributes.applyOffset) ? attributes.applyOffset.values : undefined;
-        var indices = geometry.indices;
-
-        var eastGeometry = copyGeometryForSplit(geometry);
-        var westGeometry = copyGeometryForSplit(geometry);
-
-        var i;
-        var length = indices.length;
-
-        var westGeometryIndexMap = [];
-        westGeometryIndexMap.length = positions.length / 3;
-
-        var eastGeometryIndexMap = [];
-        eastGeometryIndexMap.length = positions.length / 3;
-
-        for (i = 0; i < westGeometryIndexMap.length; ++i) {
-            westGeometryIndexMap[i] = -1;
-            eastGeometryIndexMap[i] = -1;
-        }
-
-        for (i = 0; i < length; i += 2) {
-            var i0 = indices[i];
-            var i1 = indices[i + 1];
-
-            var p0 = Cartographic.Cartesian3.fromArray(positions, i0 * 3, p0Scratch);
-            var p1 = Cartographic.Cartesian3.fromArray(positions, i1 * 3, p1Scratch);
-            var insertIndex;
-
-            if (Math.abs(p0.y) < _Math.CesiumMath.EPSILON6){
-                if (p0.y < 0.0) {
-                    p0.y = -_Math.CesiumMath.EPSILON6;
-                } else {
-                    p0.y = _Math.CesiumMath.EPSILON6;
-                }
-            }
-
-            if (Math.abs(p1.y) < _Math.CesiumMath.EPSILON6){
-                if (p1.y < 0.0) {
-                    p1.y = -_Math.CesiumMath.EPSILON6;
-                } else {
-                    p1.y = _Math.CesiumMath.EPSILON6;
-                }
-            }
-
-            var p0Attributes = eastGeometry.attributes;
-            var p0Indices = eastGeometry.indices;
-            var p0IndexMap = eastGeometryIndexMap;
-            var p1Attributes = westGeometry.attributes;
-            var p1Indices = westGeometry.indices;
-            var p1IndexMap = westGeometryIndexMap;
-
-            var intersection = IntersectionTests.IntersectionTests.lineSegmentPlane(p0, p1, xzPlane, p2Scratch);
-            if (when.defined(intersection)) {
-                // move point on the xz-plane slightly away from the plane
-                var offset = Cartographic.Cartesian3.multiplyByScalar(Cartographic.Cartesian3.UNIT_Y, 5.0 * _Math.CesiumMath.EPSILON9, offsetScratch);
-                if (p0.y < 0.0) {
-                    Cartographic.Cartesian3.negate(offset, offset);
-
-                    p0Attributes = westGeometry.attributes;
-                    p0Indices = westGeometry.indices;
-                    p0IndexMap = westGeometryIndexMap;
-                    p1Attributes = eastGeometry.attributes;
-                    p1Indices = eastGeometry.indices;
-                    p1IndexMap = eastGeometryIndexMap;
-                }
-
-                var offsetPoint = Cartographic.Cartesian3.add(intersection, offset, offsetPointScratch);
-
-                insertIndex = insertSplitPoint(p0Attributes, p0Indices, p0IndexMap, indices, i, p0);
-                computeLineAttributes(i0, i1, p0, positions, insertIndex, p0Attributes, applyOffset);
-
-                insertIndex = insertSplitPoint(p0Attributes, p0Indices, p0IndexMap, indices, -1, offsetPoint);
-                computeLineAttributes(i0, i1, offsetPoint, positions, insertIndex, p0Attributes, applyOffset);
-
-                Cartographic.Cartesian3.negate(offset, offset);
-                Cartographic.Cartesian3.add(intersection, offset, offsetPoint);
-                insertIndex = insertSplitPoint(p1Attributes, p1Indices, p1IndexMap, indices, -1, offsetPoint);
-                computeLineAttributes(i0, i1, offsetPoint, positions, insertIndex, p1Attributes, applyOffset);
-
-                insertIndex = insertSplitPoint(p1Attributes, p1Indices, p1IndexMap, indices, i + 1, p1);
-                computeLineAttributes(i0, i1, p1, positions, insertIndex, p1Attributes, applyOffset);
-            } else {
-                var currentAttributes;
-                var currentIndices;
-                var currentIndexMap;
-
-                if (p0.y < 0.0) {
-                    currentAttributes = westGeometry.attributes;
-                    currentIndices = westGeometry.indices;
-                    currentIndexMap = westGeometryIndexMap;
-                } else {
-                    currentAttributes = eastGeometry.attributes;
-                    currentIndices = eastGeometry.indices;
-                    currentIndexMap = eastGeometryIndexMap;
-                }
-
-                insertIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i, p0);
-                computeLineAttributes(i0, i1, p0, positions, insertIndex, currentAttributes, applyOffset);
-
-                insertIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i + 1, p1);
-                computeLineAttributes(i0, i1, p1, positions, insertIndex, currentAttributes, applyOffset);
-            }
-        }
-
-        updateInstanceAfterSplit(instance, westGeometry, eastGeometry);
-    }
-
-    var cartesian2Scratch0 = new Cartesian2.Cartesian2();
-    var cartesian2Scratch1 = new Cartesian2.Cartesian2();
-
-    var cartesian3Scratch0 = new Cartographic.Cartesian3();
-    var cartesian3Scratch2 = new Cartographic.Cartesian3();
-    var cartesian3Scratch3 = new Cartographic.Cartesian3();
-    var cartesian3Scratch4 = new Cartographic.Cartesian3();
-    var cartesian3Scratch5 = new Cartographic.Cartesian3();
-    var cartesian3Scratch6 = new Cartographic.Cartesian3();
-    var cartesian3Scratch7 = new Cartographic.Cartesian3();
-
-    var cartesian4Scratch0 = new Cartesian4.Cartesian4();
-
-    function updateAdjacencyAfterSplit(geometry) {
-        var attributes = geometry.attributes;
-        var positions = attributes.position.values;
-        var prevPositions = attributes.prevPosition.values;
-        var nextPositions = attributes.nextPosition.values;
-
-        var length = positions.length;
-        for (var j = 0; j < length; j += 3) {
-            var position = Cartographic.Cartesian3.unpack(positions, j, cartesian3Scratch0);
-            if (position.x > 0.0) {
-                continue;
-            }
-
-            var prevPosition = Cartographic.Cartesian3.unpack(prevPositions, j, cartesian3Scratch2);
-            if ((position.y < 0.0 && prevPosition.y > 0.0) || (position.y > 0.0 && prevPosition.y < 0.0)) {
-                if (j - 3 > 0) {
-                    prevPositions[j] = positions[j - 3];
-                    prevPositions[j + 1] = positions[j - 2];
-                    prevPositions[j + 2] = positions[j - 1];
-                } else {
-                    Cartographic.Cartesian3.pack(position, prevPositions, j);
-                }
-            }
-
-            var nextPosition = Cartographic.Cartesian3.unpack(nextPositions, j, cartesian3Scratch3);
-            if ((position.y < 0.0 && nextPosition.y > 0.0) || (position.y > 0.0 && nextPosition.y < 0.0)) {
-                if (j + 3 < length) {
-                    nextPositions[j] = positions[j + 3];
-                    nextPositions[j + 1] = positions[j + 4];
-                    nextPositions[j + 2] = positions[j + 5];
-                } else {
-                    Cartographic.Cartesian3.pack(position, nextPositions, j);
-                }
-            }
-        }
-    }
-
-    var offsetScalar = 5.0 * _Math.CesiumMath.EPSILON9;
-    var coplanarOffset = _Math.CesiumMath.EPSILON6;
-
-    function splitLongitudePolyline(instance) {
-        var geometry = instance.geometry;
-        var attributes = geometry.attributes;
-        var positions = attributes.position.values;
-        var prevPositions = attributes.prevPosition.values;
-        var nextPositions = attributes.nextPosition.values;
-        var expandAndWidths = attributes.expandAndWidth.values;
-
-        var texCoords = (when.defined(attributes.st)) ? attributes.st.values : undefined;
-        var colors = (when.defined(attributes.color)) ? attributes.color.values : undefined;
-        var dist = (when.defined(attributes.dist)) ? attributes.dist.values : undefined;
-
-        var eastGeometry = copyGeometryForSplit(geometry);
-        var westGeometry = copyGeometryForSplit(geometry);
-
-        var i;
-        var j;
-        var index;
-
-        var intersectionFound = false;
-
-        var length = positions.length / 3;
-        for (i = 0; i < length; i += 4) {
-            var i0 = i;
-            var i2 = i + 2;
-
-            var p0 = Cartographic.Cartesian3.fromArray(positions, i0 * 3, cartesian3Scratch0);
-            var p2 = Cartographic.Cartesian3.fromArray(positions, i2 * 3, cartesian3Scratch2);
-
-            // Offset points that are close to the 180 longitude and change the previous/next point
-            // to be the same offset point so it can be projected to 2D. There is special handling in the
-            // shader for when position == prevPosition || position == nextPosition.
-            if (Math.abs(p0.y) < coplanarOffset) {
-                p0.y = coplanarOffset * (p2.y < 0.0 ? -1.0 : 1.0);
-                positions[i * 3 + 1] = p0.y;
-                positions[(i + 1) * 3 + 1] = p0.y;
-
-                for (j = i0 * 3; j < i0 * 3 + 4 * 3; j += 3) {
-                    prevPositions[j] = positions[i * 3];
-                    prevPositions[j + 1] = positions[i * 3 + 1];
-                    prevPositions[j + 2] = positions[i * 3 + 2];
-                }
-            }
-
-            // Do the same but for when the line crosses 180 longitude in the opposite direction.
-            if (Math.abs(p2.y) < coplanarOffset) {
-                p2.y = coplanarOffset * (p0.y < 0.0 ? -1.0 : 1.0);
-                positions[(i + 2) * 3 + 1] = p2.y;
-                positions[(i + 3) * 3 + 1] = p2.y;
-
-                for (j = i0 * 3; j < i0 * 3 + 4 * 3; j += 3) {
-                    nextPositions[j] = positions[(i + 2) * 3];
-                    nextPositions[j + 1] = positions[(i + 2) * 3 + 1];
-                    nextPositions[j + 2] = positions[(i + 2) * 3 + 2];
-                }
-            }
-
-            var p0Attributes = eastGeometry.attributes;
-            var p0Indices = eastGeometry.indices;
-            var p2Attributes = westGeometry.attributes;
-            var p2Indices = westGeometry.indices;
-
-            var intersection = IntersectionTests.IntersectionTests.lineSegmentPlane(p0, p2, xzPlane, cartesian3Scratch4);
-            if (when.defined(intersection)) {
-                intersectionFound = true;
-
-                // move point on the xz-plane slightly away from the plane
-                var offset = Cartographic.Cartesian3.multiplyByScalar(Cartographic.Cartesian3.UNIT_Y, offsetScalar, cartesian3Scratch5);
-                if (p0.y < 0.0) {
-                    Cartographic.Cartesian3.negate(offset, offset);
-                    p0Attributes = westGeometry.attributes;
-                    p0Indices = westGeometry.indices;
-                    p2Attributes = eastGeometry.attributes;
-                    p2Indices = eastGeometry.indices;
-                }
-
-                var offsetPoint = Cartographic.Cartesian3.add(intersection, offset, cartesian3Scratch6);
-                p0Attributes.position.values.push(p0.x, p0.y, p0.z, p0.x, p0.y, p0.z);
-                p0Attributes.position.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-                p0Attributes.position.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-
-                p0Attributes.prevPosition.values.push(prevPositions[i0 * 3], prevPositions[i0 * 3 + 1], prevPositions[i0 * 3 + 2]);
-                p0Attributes.prevPosition.values.push(prevPositions[i0 * 3 + 3], prevPositions[i0 * 3 + 4], prevPositions[i0 * 3 + 5]);
-                p0Attributes.prevPosition.values.push(p0.x, p0.y, p0.z, p0.x, p0.y, p0.z);
-
-                p0Attributes.nextPosition.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-                p0Attributes.nextPosition.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-                p0Attributes.nextPosition.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-                p0Attributes.nextPosition.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-
-                Cartographic.Cartesian3.negate(offset, offset);
-                Cartographic.Cartesian3.add(intersection, offset, offsetPoint);
-                p2Attributes.position.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-                p2Attributes.position.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-                p2Attributes.position.values.push(p2.x, p2.y, p2.z, p2.x, p2.y, p2.z);
-
-                p2Attributes.prevPosition.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-                p2Attributes.prevPosition.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-                p2Attributes.prevPosition.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-                p2Attributes.prevPosition.values.push(offsetPoint.x, offsetPoint.y, offsetPoint.z);
-
-                p2Attributes.nextPosition.values.push(p2.x, p2.y, p2.z, p2.x, p2.y, p2.z);
-                p2Attributes.nextPosition.values.push(nextPositions[i2 * 3], nextPositions[i2 * 3 + 1], nextPositions[i2 * 3 + 2]);
-                p2Attributes.nextPosition.values.push(nextPositions[i2 * 3 + 3], nextPositions[i2 * 3 + 4], nextPositions[i2 * 3 + 5]);
-
-                var ew0 = Cartesian2.Cartesian2.fromArray(expandAndWidths, i0 * 2, cartesian2Scratch0);
-                var width = Math.abs(ew0.y);
-
-                p0Attributes.expandAndWidth.values.push(-1,  width, 1,  width);
-                p0Attributes.expandAndWidth.values.push(-1, -width, 1, -width);
-                p2Attributes.expandAndWidth.values.push(-1,  width, 1,  width);
-                p2Attributes.expandAndWidth.values.push(-1, -width, 1, -width);
-
-                var t = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(intersection, p0, cartesian3Scratch3));
-                t /= Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(p2, p0, cartesian3Scratch3));
-
-                if (when.defined(colors)) {
-                    var c0 = Cartesian4.Cartesian4.fromArray(colors, i0 * 4, cartesian4Scratch0);
-                    var c2 = Cartesian4.Cartesian4.fromArray(colors, i2 * 4, cartesian4Scratch0);
-
-                    var r = _Math.CesiumMath.lerp(c0.x, c2.x, t);
-                    var g = _Math.CesiumMath.lerp(c0.y, c2.y, t);
-                    var b = _Math.CesiumMath.lerp(c0.z, c2.z, t);
-                    var a = _Math.CesiumMath.lerp(c0.w, c2.w, t);
-
-                    for (j = i0 * 4; j < i0 * 4 + 2 * 4; ++j) {
-                        p0Attributes.color.values.push(colors[j]);
-                    }
-                    p0Attributes.color.values.push(r, g, b, a);
-                    p0Attributes.color.values.push(r, g, b, a);
-                    p2Attributes.color.values.push(r, g, b, a);
-                    p2Attributes.color.values.push(r, g, b, a);
-                    for (j = i2 * 4; j < i2 * 4 + 2 * 4; ++j) {
-                        p2Attributes.color.values.push(colors[j]);
-                    }
-                }
-
-                if (when.defined(texCoords)) {
-                    var s0 = Cartesian2.Cartesian2.fromArray(texCoords, i0 * 2, cartesian2Scratch0);
-                    var s3 = Cartesian2.Cartesian2.fromArray(texCoords, (i + 3) * 2, cartesian2Scratch1);
-
-                    var sx = _Math.CesiumMath.lerp(s0.x, s3.x, t);
-
-                    for (j = i0 * 2; j < i0 * 2 + 2 * 2; ++j) {
-                        p0Attributes.st.values.push(texCoords[j]);
-                    }
-                    p0Attributes.st.values.push(sx, s0.y);
-                    p0Attributes.st.values.push(sx, s3.y);
-                    p2Attributes.st.values.push(sx, s0.y);
-                    p2Attributes.st.values.push(sx, s3.y);
-                    for (j = i2 * 2; j < i2 * 2 + 2 * 2; ++j) {
-                        p2Attributes.st.values.push(texCoords[j]);
-                    }
-                }
-
-                if (when.defined(dist)) {
-                    var d0 = Cartographic.Cartesian3.fromArray(dist, i0 * 3, cartesian3Scratch7);
-                    var d1 = Cartographic.Cartesian3.fromArray(dist, i2 * 3, cartesian3Scratch7);
-
-                    var disFrom = _Math.CesiumMath.lerp(d0.x, d1.x, t);
-
-                    for (j = i0 * 3; j < i0 * 3 + 2 * 3; ++j) {
-                        p0Attributes.dist.values.push(dist[j]);
-                    }
-                    p0Attributes.dist.values.push(disFrom, d0.y, d0.z);
-                    p0Attributes.dist.values.push(disFrom, d0.y, d0.z);
-                    p2Attributes.dist.values.push(disFrom, d1.y, d1.z);
-                    p2Attributes.dist.values.push(disFrom, d1.y, d1.z);
-                    for (j = i2 * 3; j < i2 * 3 + 2 * 3; ++j) {
-                        p2Attributes.dist.values.push(dist[j]);
-                    }
-                }
-
-                index = p0Attributes.position.values.length / 3 - 4;
-                p0Indices.push(index, index + 2, index + 1);
-                p0Indices.push(index + 1, index + 2, index + 3);
-
-                index = p2Attributes.position.values.length / 3 - 4;
-                p2Indices.push(index, index + 2, index + 1);
-                p2Indices.push(index + 1, index + 2, index + 3);
-            } else {
-                var currentAttributes;
-                var currentIndices;
-
-                if (p0.y < 0.0) {
-                    currentAttributes = westGeometry.attributes;
-                    currentIndices = westGeometry.indices;
-                } else {
-                    currentAttributes = eastGeometry.attributes;
-                    currentIndices = eastGeometry.indices;
-                }
-
-                currentAttributes.position.values.push(p0.x, p0.y, p0.z);
-                currentAttributes.position.values.push(p0.x, p0.y, p0.z);
-                currentAttributes.position.values.push(p2.x, p2.y, p2.z);
-                currentAttributes.position.values.push(p2.x, p2.y, p2.z);
-
-                for (j = i * 3; j < i * 3 + 4 * 3; ++j) {
-                    currentAttributes.prevPosition.values.push(prevPositions[j]);
-                    currentAttributes.nextPosition.values.push(nextPositions[j]);
-                }
-
-                for (j = i * 2; j < i * 2 + 4 * 2; ++j) {
-                    currentAttributes.expandAndWidth.values.push(expandAndWidths[j]);
-                    if (when.defined(texCoords)) {
-                        currentAttributes.st.values.push(texCoords[j]);
-                    }
-                }
-
-                if (when.defined(colors)) {
-                    for (j = i * 4; j < i * 4 + 4 * 4; ++j) {
-                        currentAttributes.color.values.push(colors[j]);
-                    }
-                }
-
-                if (when.defined(dist)) {
-                    for (j = i * 3; j < i * 3 + 4 * 3; ++j) {
-                        currentAttributes.dist.values.push(dist[j]);
-                    }
-                }
-
-                index = currentAttributes.position.values.length / 3 - 4;
-                currentIndices.push(index, index + 2, index + 1);
-                currentIndices.push(index + 1, index + 2, index + 3);
-            }
-        }
-
-        if (intersectionFound) {
-            updateAdjacencyAfterSplit(westGeometry);
-            updateAdjacencyAfterSplit(eastGeometry);
-        }
-
-        updateInstanceAfterSplit(instance, westGeometry, eastGeometry);
-    }
-
-    /**
-     * Splits the instances's geometry, by introducing new vertices and indices,that
-     * intersect the International Date Line and Prime Meridian so that no primitives cross longitude
-     * -180/180 degrees.  This is not required for 3D drawing, but is required for
-     * correcting drawing in 2D and Columbus view.
-     *
-     * @private
-     *
-     * @param {GeometryInstance} instance The instance to modify.
-     * @returns {GeometryInstance} The modified <code>instance</code> argument, with it's geometry split at the International Date Line.
-     *
-     * @example
-     * instance = Cesium.GeometryPipeline.splitLongitude(instance);
-     */
-    GeometryPipeline.splitLongitude = function(instance) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!when.defined(instance)) {
-            throw new Check.DeveloperError('instance is required.');
-        }
-        //>>includeEnd('debug');
-
-        var geometry = instance.geometry;
-        var boundingSphere = geometry.boundingSphere;
-        if (when.defined(boundingSphere)) {
-            var minX = boundingSphere.center.x - boundingSphere.radius;
-            if (minX > 0 || BoundingSphere.BoundingSphere.intersectPlane(boundingSphere, Plane.Plane.ORIGIN_ZX_PLANE) !== BoundingSphere.Intersect.INTERSECTING) {
-                return instance;
-            }
-        }
-
-        if (geometry.geometryType !== GeometryAttribute.GeometryType.NONE) {
-            switch (geometry.geometryType) {
-            case GeometryAttribute.GeometryType.POLYLINES:
-                splitLongitudePolyline(instance);
-                break;
-            case GeometryAttribute.GeometryType.TRIANGLES:
-                splitLongitudeTriangles(instance);
-                break;
-            case GeometryAttribute.GeometryType.LINES:
-                splitLongitudeLines(instance);
-                break;
-            }
-        } else {
-            indexPrimitive(geometry);
-            if (geometry.primitiveType === PrimitiveType.PrimitiveType.TRIANGLES) {
-                splitLongitudeTriangles(instance);
-            } else if (geometry.primitiveType === PrimitiveType.PrimitiveType.LINES) {
-                splitLongitudeLines(instance);
-            }
-        }
-
-        return instance;
-    };
-
-    exports.GeometryPipeline = GeometryPipeline;
-
-});
diff --git a/public/libs/Cesium/Workers/IndexDatatype-9435b55f.js b/public/libs/Cesium/Workers/IndexDatatype-9435b55f.js
deleted file mode 100644
index c6740ae..0000000
--- a/public/libs/Cesium/Workers/IndexDatatype-9435b55f.js
+++ /dev/null
@@ -1,183 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './WebGLConstants-4c11ee5f'], function (exports, when, Check, _Math, WebGLConstants) { 'use strict';
-
-    /**
-         * Constants for WebGL index datatypes.  These corresponds to the
-         * <code>type</code> parameter of {@link http://www.khronos.org/opengles/sdk/docs/man/xhtml/glDrawElements.xml|drawElements}.
-         *
-         * @exports IndexDatatype
-         */
-        var IndexDatatype = {
-            /**
-             * 8-bit unsigned byte corresponding to <code>UNSIGNED_BYTE</code> and the type
-             * of an element in <code>Uint8Array</code>.
-             *
-             * @type {Number}
-             * @constant
-             */
-            UNSIGNED_BYTE : WebGLConstants.WebGLConstants.UNSIGNED_BYTE,
-
-            /**
-             * 16-bit unsigned short corresponding to <code>UNSIGNED_SHORT</code> and the type
-             * of an element in <code>Uint16Array</code>.
-             *
-             * @type {Number}
-             * @constant
-             */
-            UNSIGNED_SHORT : WebGLConstants.WebGLConstants.UNSIGNED_SHORT,
-
-            /**
-             * 32-bit unsigned int corresponding to <code>UNSIGNED_INT</code> and the type
-             * of an element in <code>Uint32Array</code>.
-             *
-             * @type {Number}
-             * @constant
-             */
-            UNSIGNED_INT : WebGLConstants.WebGLConstants.UNSIGNED_INT
-        };
-
-        /**
-         * Returns the size, in bytes, of the corresponding datatype.
-         *
-         * @param {IndexDatatype} indexDatatype The index datatype to get the size of.
-         * @returns {Number} The size in bytes.
-         *
-         * @example
-         * // Returns 2
-         * var size = Cesium.IndexDatatype.getSizeInBytes(Cesium.IndexDatatype.UNSIGNED_SHORT);
-         */
-        IndexDatatype.getSizeInBytes = function(indexDatatype) {
-            switch(indexDatatype) {
-                case IndexDatatype.UNSIGNED_BYTE:
-                    return Uint8Array.BYTES_PER_ELEMENT;
-                case IndexDatatype.UNSIGNED_SHORT:
-                    return Uint16Array.BYTES_PER_ELEMENT;
-                case IndexDatatype.UNSIGNED_INT:
-                    return Uint32Array.BYTES_PER_ELEMENT;
-            }
-
-            //>>includeStart('debug', pragmas.debug);
-            throw new Check.DeveloperError('indexDatatype is required and must be a valid IndexDatatype constant.');
-            //>>includeEnd('debug');
-        };
-
-        /**
-         * Gets the datatype with a given size in bytes.
-         *
-         * @param {Number} sizeInBytes The size of a single index in bytes.
-         * @returns {IndexDatatype} The index datatype with the given size.
-         */
-        IndexDatatype.fromSizeInBytes = function(sizeInBytes) {
-            switch (sizeInBytes) {
-                case 2:
-                    return IndexDatatype.UNSIGNED_SHORT;
-                case 4:
-                    return IndexDatatype.UNSIGNED_INT;
-                case 1:
-                    return IndexDatatype.UNSIGNED_BYTE;
-                //>>includeStart('debug', pragmas.debug);
-                default:
-                    throw new Check.DeveloperError('Size in bytes cannot be mapped to an IndexDatatype');
-                //>>includeEnd('debug');
-            }
-        };
-
-        /**
-         * Validates that the provided index datatype is a valid {@link IndexDatatype}.
-         *
-         * @param {IndexDatatype} indexDatatype The index datatype to validate.
-         * @returns {Boolean} <code>true</code> if the provided index datatype is a valid value; otherwise, <code>false</code>.
-         *
-         * @example
-         * if (!Cesium.IndexDatatype.validate(indexDatatype)) {
-         *   throw new Cesium.DeveloperError('indexDatatype must be a valid value.');
-         * }
-         */
-        IndexDatatype.validate = function(indexDatatype) {
-            return when.defined(indexDatatype) &&
-                   (indexDatatype === IndexDatatype.UNSIGNED_BYTE ||
-                    indexDatatype === IndexDatatype.UNSIGNED_SHORT ||
-                    indexDatatype === IndexDatatype.UNSIGNED_INT);
-        };
-
-        /**
-         * Creates a typed array that will store indices, using either <code><Uint16Array</code>
-         * or <code>Uint32Array</code> depending on the number of vertices.
-         *
-         * @param {Number} numberOfVertices Number of vertices that the indices will reference.
-         * @param {Number|Array} indicesLengthOrArray Passed through to the typed array constructor.
-         * @returns {Uint16Array|Uint32Array} A <code>Uint16Array</code> or <code>Uint32Array</code> constructed with <code>indicesLengthOrArray</code>.
-         *
-         * @example
-         * this.indices = Cesium.IndexDatatype.createTypedArray(positions.length / 3, numberOfIndices);
-         */
-        IndexDatatype.createTypedArray = function(numberOfVertices, indicesLengthOrArray) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(numberOfVertices)) {
-                throw new Check.DeveloperError('numberOfVertices is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (numberOfVertices >= _Math.CesiumMath.SIXTY_FOUR_KILOBYTES) {
-                return new Uint32Array(indicesLengthOrArray);
-            }
-
-            return new Uint16Array(indicesLengthOrArray);
-        };
-
-        /**
-         * Creates a typed array from a source array buffer.  The resulting typed array will store indices, using either <code><Uint16Array</code>
-         * or <code>Uint32Array</code> depending on the number of vertices.
-         *
-         * @param {Number} numberOfVertices Number of vertices that the indices will reference.
-         * @param {ArrayBuffer} sourceArray Passed through to the typed array constructor.
-         * @param {Number} byteOffset Passed through to the typed array constructor.
-         * @param {Number} length Passed through to the typed array constructor.
-         * @returns {Uint16Array|Uint32Array} A <code>Uint16Array</code> or <code>Uint32Array</code> constructed with <code>sourceArray</code>, <code>byteOffset</code>, and <code>length</code>.
-         *
-         */
-        IndexDatatype.createTypedArrayFromArrayBuffer = function(numberOfVertices, sourceArray, byteOffset, length) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(numberOfVertices)) {
-                throw new Check.DeveloperError('numberOfVertices is required.');
-            }
-            if (!when.defined(sourceArray)) {
-                throw new Check.DeveloperError('sourceArray is required.');
-            }
-            if (!when.defined(byteOffset)) {
-                throw new Check.DeveloperError('byteOffset is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (numberOfVertices >= _Math.CesiumMath.SIXTY_FOUR_KILOBYTES) {
-                return new Uint32Array(sourceArray, byteOffset, length);
-            }
-
-            return new Uint16Array(sourceArray, byteOffset, length);
-        };
-    var IndexDatatype$1 = Object.freeze(IndexDatatype);
-
-    exports.IndexDatatype = IndexDatatype$1;
-
-});
diff --git a/public/libs/Cesium/Workers/IntersectionTests-397d9494.js b/public/libs/Cesium/Workers/IntersectionTests-397d9494.js
deleted file mode 100644
index bbb0785..0000000
--- a/public/libs/Cesium/Workers/IntersectionTests-397d9494.js
+++ /dev/null
@@ -1,1652 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './BoundingSphere-775c5788'], function (exports, when, Check, _Math, Cartographic, BoundingSphere) { 'use strict';
-
-    /**
-         * Defines functions for 2nd order polynomial functions of one variable with only real coefficients.
-         *
-         * @exports QuadraticRealPolynomial
-         */
-        var QuadraticRealPolynomial = {};
-
-        /**
-         * Provides the discriminant of the quadratic equation from the supplied coefficients.
-         *
-         * @param {Number} a The coefficient of the 2nd order monomial.
-         * @param {Number} b The coefficient of the 1st order monomial.
-         * @param {Number} c The coefficient of the 0th order monomial.
-         * @returns {Number} The value of the discriminant.
-         */
-        QuadraticRealPolynomial.computeDiscriminant = function(a, b, c) {
-            //>>includeStart('debug', pragmas.debug);
-            if (typeof a !== 'number') {
-                throw new Check.DeveloperError('a is a required number.');
-            }
-            if (typeof b !== 'number') {
-                throw new Check.DeveloperError('b is a required number.');
-            }
-            if (typeof c !== 'number') {
-                throw new Check.DeveloperError('c is a required number.');
-            }
-            //>>includeEnd('debug');
-
-            var discriminant = b * b - 4.0 * a * c;
-            return discriminant;
-        };
-
-        function addWithCancellationCheck(left, right, tolerance) {
-            var difference = left + right;
-            if ((_Math.CesiumMath.sign(left) !== _Math.CesiumMath.sign(right)) &&
-                    Math.abs(difference / Math.max(Math.abs(left), Math.abs(right))) < tolerance) {
-                return 0.0;
-            }
-
-            return difference;
-        }
-
-        /**
-         * Provides the real valued roots of the quadratic polynomial with the provided coefficients.
-         *
-         * @param {Number} a The coefficient of the 2nd order monomial.
-         * @param {Number} b The coefficient of the 1st order monomial.
-         * @param {Number} c The coefficient of the 0th order monomial.
-         * @returns {Number[]} The real valued roots.
-         */
-        QuadraticRealPolynomial.computeRealRoots = function(a, b, c) {
-            //>>includeStart('debug', pragmas.debug);
-            if (typeof a !== 'number') {
-                throw new Check.DeveloperError('a is a required number.');
-            }
-            if (typeof b !== 'number') {
-                throw new Check.DeveloperError('b is a required number.');
-            }
-            if (typeof c !== 'number') {
-                throw new Check.DeveloperError('c is a required number.');
-            }
-            //>>includeEnd('debug');
-
-            var ratio;
-            if (a === 0.0) {
-                if (b === 0.0) {
-                    // Constant function: c = 0.
-                    return [];
-                }
-
-                // Linear function: b * x + c = 0.
-                return [-c / b];
-            } else if (b === 0.0) {
-                if (c === 0.0) {
-                    // 2nd order monomial: a * x^2 = 0.
-                    return [0.0, 0.0];
-                }
-
-                var cMagnitude = Math.abs(c);
-                var aMagnitude = Math.abs(a);
-
-                if ((cMagnitude < aMagnitude) && (cMagnitude / aMagnitude < _Math.CesiumMath.EPSILON14)) { // c ~= 0.0.
-                    // 2nd order monomial: a * x^2 = 0.
-                    return [0.0, 0.0];
-                } else if ((cMagnitude > aMagnitude) && (aMagnitude / cMagnitude < _Math.CesiumMath.EPSILON14)) { // a ~= 0.0.
-                    // Constant function: c = 0.
-                    return [];
-                }
-
-                // a * x^2 + c = 0
-                ratio = -c / a;
-
-                if (ratio < 0.0) {
-                    // Both roots are complex.
-                    return [];
-                }
-
-                // Both roots are real.
-                var root = Math.sqrt(ratio);
-                return [-root, root];
-            } else if (c === 0.0) {
-                // a * x^2 + b * x = 0
-                ratio = -b / a;
-                if (ratio < 0.0) {
-                    return [ratio, 0.0];
-                }
-
-                return [0.0, ratio];
-            }
-
-            // a * x^2 + b * x + c = 0
-            var b2 = b * b;
-            var four_ac = 4.0 * a * c;
-            var radicand = addWithCancellationCheck(b2, -four_ac, _Math.CesiumMath.EPSILON14);
-
-            if (radicand < 0.0) {
-                // Both roots are complex.
-                return [];
-            }
-
-            var q = -0.5 * addWithCancellationCheck(b, _Math.CesiumMath.sign(b) * Math.sqrt(radicand), _Math.CesiumMath.EPSILON14);
-            if (b > 0.0) {
-                return [q / a, c / q];
-            }
-
-            return [c / q, q / a];
-        };
-
-    /**
-         * Defines functions for 3rd order polynomial functions of one variable with only real coefficients.
-         *
-         * @exports CubicRealPolynomial
-         */
-        var CubicRealPolynomial = {};
-
-        /**
-         * Provides the discriminant of the cubic equation from the supplied coefficients.
-         *
-         * @param {Number} a The coefficient of the 3rd order monomial.
-         * @param {Number} b The coefficient of the 2nd order monomial.
-         * @param {Number} c The coefficient of the 1st order monomial.
-         * @param {Number} d The coefficient of the 0th order monomial.
-         * @returns {Number} The value of the discriminant.
-         */
-        CubicRealPolynomial.computeDiscriminant = function(a, b, c, d) {
-            //>>includeStart('debug', pragmas.debug);
-            if (typeof a !== 'number') {
-                throw new Check.DeveloperError('a is a required number.');
-            }
-            if (typeof b !== 'number') {
-                throw new Check.DeveloperError('b is a required number.');
-            }
-            if (typeof c !== 'number') {
-                throw new Check.DeveloperError('c is a required number.');
-            }
-            if (typeof d !== 'number') {
-                throw new Check.DeveloperError('d is a required number.');
-            }
-            //>>includeEnd('debug');
-
-            var a2 = a * a;
-            var b2 = b * b;
-            var c2 = c * c;
-            var d2 = d * d;
-
-            var discriminant = 18.0 * a * b * c * d + b2 * c2 - 27.0 * a2 * d2 - 4.0 * (a * c2 * c + b2 * b * d);
-            return discriminant;
-        };
-
-        function computeRealRoots(a, b, c, d) {
-            var A = a;
-            var B = b / 3.0;
-            var C = c / 3.0;
-            var D = d;
-
-            var AC = A * C;
-            var BD = B * D;
-            var B2 = B * B;
-            var C2 = C * C;
-            var delta1 = A * C - B2;
-            var delta2 = A * D - B * C;
-            var delta3 = B * D - C2;
-
-            var discriminant = 4.0 * delta1 * delta3 - delta2 * delta2;
-            var temp;
-            var temp1;
-
-            if (discriminant < 0.0) {
-                var ABar;
-                var CBar;
-                var DBar;
-
-                if (B2 * BD >= AC * C2) {
-                    ABar = A;
-                    CBar = delta1;
-                    DBar = -2.0 * B * delta1 + A * delta2;
-                } else {
-                    ABar = D;
-                    CBar = delta3;
-                    DBar = -D * delta2 + 2.0 * C * delta3;
-                }
-
-                var s = (DBar < 0.0) ? -1.0 : 1.0; // This is not Math.Sign()!
-                var temp0 = -s * Math.abs(ABar) * Math.sqrt(-discriminant);
-                temp1 = -DBar + temp0;
-
-                var x = temp1 / 2.0;
-                var p = x < 0.0 ? -Math.pow(-x, 1.0 / 3.0) : Math.pow(x, 1.0 / 3.0);
-                var q = (temp1 === temp0) ? -p : -CBar / p;
-
-                temp = (CBar <= 0.0) ? p + q : -DBar / (p * p + q * q + CBar);
-
-                if (B2 * BD >= AC * C2) {
-                    return [(temp - B) / A];
-                }
-
-                return [-D / (temp + C)];
-            }
-
-            var CBarA = delta1;
-            var DBarA = -2.0 * B * delta1 + A * delta2;
-
-            var CBarD = delta3;
-            var DBarD = -D * delta2 + 2.0 * C * delta3;
-
-            var squareRootOfDiscriminant = Math.sqrt(discriminant);
-            var halfSquareRootOf3 = Math.sqrt(3.0) / 2.0;
-
-            var theta = Math.abs(Math.atan2(A * squareRootOfDiscriminant, -DBarA) / 3.0);
-            temp = 2.0 * Math.sqrt(-CBarA);
-            var cosine = Math.cos(theta);
-            temp1 = temp * cosine;
-            var temp3 = temp * (-cosine / 2.0 - halfSquareRootOf3 * Math.sin(theta));
-
-            var numeratorLarge = (temp1 + temp3 > 2.0 * B) ? temp1 - B : temp3 - B;
-            var denominatorLarge = A;
-
-            var root1 = numeratorLarge / denominatorLarge;
-
-            theta = Math.abs(Math.atan2(D * squareRootOfDiscriminant, -DBarD) / 3.0);
-            temp = 2.0 * Math.sqrt(-CBarD);
-            cosine = Math.cos(theta);
-            temp1 = temp * cosine;
-            temp3 = temp * (-cosine / 2.0 - halfSquareRootOf3 * Math.sin(theta));
-
-            var numeratorSmall = -D;
-            var denominatorSmall = (temp1 + temp3 < 2.0 * C) ? temp1 + C : temp3 + C;
-
-            var root3 = numeratorSmall / denominatorSmall;
-
-            var E = denominatorLarge * denominatorSmall;
-            var F = -numeratorLarge * denominatorSmall - denominatorLarge * numeratorSmall;
-            var G = numeratorLarge * numeratorSmall;
-
-            var root2 = (C * F - B * G) / (-B * F + C * E);
-
-            if (root1 <= root2) {
-                if (root1 <= root3) {
-                    if (root2 <= root3) {
-                        return [root1, root2, root3];
-                    }
-                    return [root1, root3, root2];
-                }
-                return [root3, root1, root2];
-            }
-            if (root1 <= root3) {
-                return [root2, root1, root3];
-            }
-            if (root2 <= root3) {
-                return [root2, root3, root1];
-            }
-            return [root3, root2, root1];
-        }
-
-        /**
-         * Provides the real valued roots of the cubic polynomial with the provided coefficients.
-         *
-         * @param {Number} a The coefficient of the 3rd order monomial.
-         * @param {Number} b The coefficient of the 2nd order monomial.
-         * @param {Number} c The coefficient of the 1st order monomial.
-         * @param {Number} d The coefficient of the 0th order monomial.
-         * @returns {Number[]} The real valued roots.
-         */
-        CubicRealPolynomial.computeRealRoots = function(a, b, c, d) {
-            //>>includeStart('debug', pragmas.debug);
-            if (typeof a !== 'number') {
-                throw new Check.DeveloperError('a is a required number.');
-            }
-            if (typeof b !== 'number') {
-                throw new Check.DeveloperError('b is a required number.');
-            }
-            if (typeof c !== 'number') {
-                throw new Check.DeveloperError('c is a required number.');
-            }
-            if (typeof d !== 'number') {
-                throw new Check.DeveloperError('d is a required number.');
-            }
-            //>>includeEnd('debug');
-
-            var roots;
-            var ratio;
-            if (a === 0.0) {
-                // Quadratic function: b * x^2 + c * x + d = 0.
-                return QuadraticRealPolynomial.computeRealRoots(b, c, d);
-            } else if (b === 0.0) {
-                if (c === 0.0) {
-                    if (d === 0.0) {
-                        // 3rd order monomial: a * x^3 = 0.
-                        return [0.0, 0.0, 0.0];
-                    }
-
-                    // a * x^3 + d = 0
-                    ratio = -d / a;
-                    var root = (ratio < 0.0) ? -Math.pow(-ratio, 1.0 / 3.0) : Math.pow(ratio, 1.0 / 3.0);
-                    return [root, root, root];
-                } else if (d === 0.0) {
-                    // x * (a * x^2 + c) = 0.
-                    roots = QuadraticRealPolynomial.computeRealRoots(a, 0, c);
-
-                    // Return the roots in ascending order.
-                    if (roots.Length === 0) {
-                        return [0.0];
-                    }
-                    return [roots[0], 0.0, roots[1]];
-                }
-
-                // Deflated cubic polynomial: a * x^3 + c * x + d= 0.
-                return computeRealRoots(a, 0, c, d);
-            } else if (c === 0.0) {
-                if (d === 0.0) {
-                    // x^2 * (a * x + b) = 0.
-                    ratio = -b / a;
-                    if (ratio < 0.0) {
-                        return [ratio, 0.0, 0.0];
-                    }
-                    return [0.0, 0.0, ratio];
-                }
-                // a * x^3 + b * x^2 + d = 0.
-                return computeRealRoots(a, b, 0, d);
-            } else if (d === 0.0) {
-                // x * (a * x^2 + b * x + c) = 0
-                roots = QuadraticRealPolynomial.computeRealRoots(a, b, c);
-
-                // Return the roots in ascending order.
-                if (roots.length === 0) {
-                    return [0.0];
-                } else if (roots[1] <= 0.0) {
-                    return [roots[0], roots[1], 0.0];
-                } else if (roots[0] >= 0.0) {
-                    return [0.0, roots[0], roots[1]];
-                }
-                return [roots[0], 0.0, roots[1]];
-            }
-
-            return computeRealRoots(a, b, c, d);
-        };
-
-    /**
-         * Defines functions for 4th order polynomial functions of one variable with only real coefficients.
-         *
-         * @exports QuarticRealPolynomial
-         */
-        var QuarticRealPolynomial = {};
-
-        /**
-         * Provides the discriminant of the quartic equation from the supplied coefficients.
-         *
-         * @param {Number} a The coefficient of the 4th order monomial.
-         * @param {Number} b The coefficient of the 3rd order monomial.
-         * @param {Number} c The coefficient of the 2nd order monomial.
-         * @param {Number} d The coefficient of the 1st order monomial.
-         * @param {Number} e The coefficient of the 0th order monomial.
-         * @returns {Number} The value of the discriminant.
-         */
-        QuarticRealPolynomial.computeDiscriminant = function(a, b, c, d, e) {
-            //>>includeStart('debug', pragmas.debug);
-            if (typeof a !== 'number') {
-                throw new Check.DeveloperError('a is a required number.');
-            }
-            if (typeof b !== 'number') {
-                throw new Check.DeveloperError('b is a required number.');
-            }
-            if (typeof c !== 'number') {
-                throw new Check.DeveloperError('c is a required number.');
-            }
-            if (typeof d !== 'number') {
-                throw new Check.DeveloperError('d is a required number.');
-            }
-            if (typeof e !== 'number') {
-                throw new Check.DeveloperError('e is a required number.');
-            }
-            //>>includeEnd('debug');
-
-            var a2 = a * a;
-            var a3 = a2 * a;
-            var b2 = b * b;
-            var b3 = b2 * b;
-            var c2 = c * c;
-            var c3 = c2 * c;
-            var d2 = d * d;
-            var d3 = d2 * d;
-            var e2 = e * e;
-            var e3 = e2 * e;
-
-            var discriminant = (b2 * c2 * d2 - 4.0 * b3 * d3 - 4.0 * a * c3 * d2 + 18 * a * b * c * d3 - 27.0 * a2 * d2 * d2 + 256.0 * a3 * e3) +
-                e * (18.0 * b3 * c * d - 4.0 * b2 * c3 + 16.0 * a * c2 * c2 - 80.0 * a * b * c2 * d - 6.0 * a * b2 * d2 + 144.0 * a2 * c * d2) +
-                e2 * (144.0 * a * b2 * c - 27.0 * b2 * b2 - 128.0 * a2 * c2 - 192.0 * a2 * b * d);
-            return discriminant;
-        };
-
-        function original(a3, a2, a1, a0) {
-            var a3Squared = a3 * a3;
-
-            var p = a2 - 3.0 * a3Squared / 8.0;
-            var q = a1 - a2 * a3 / 2.0 + a3Squared * a3 / 8.0;
-            var r = a0 - a1 * a3 / 4.0 + a2 * a3Squared / 16.0 - 3.0 * a3Squared * a3Squared / 256.0;
-
-            // Find the roots of the cubic equations:  h^6 + 2 p h^4 + (p^2 - 4 r) h^2 - q^2 = 0.
-            var cubicRoots = CubicRealPolynomial.computeRealRoots(1.0, 2.0 * p, p * p - 4.0 * r, -q * q);
-
-            if (cubicRoots.length > 0) {
-                var temp = -a3 / 4.0;
-
-                // Use the largest positive root.
-                var hSquared = cubicRoots[cubicRoots.length - 1];
-
-                if (Math.abs(hSquared) < _Math.CesiumMath.EPSILON14) {
-                    // y^4 + p y^2 + r = 0.
-                    var roots = QuadraticRealPolynomial.computeRealRoots(1.0, p, r);
-
-                    if (roots.length === 2) {
-                        var root0 = roots[0];
-                        var root1 = roots[1];
-
-                        var y;
-                        if (root0 >= 0.0 && root1 >= 0.0) {
-                            var y0 = Math.sqrt(root0);
-                            var y1 = Math.sqrt(root1);
-
-                            return [temp - y1, temp - y0, temp + y0, temp + y1];
-                        } else if (root0 >= 0.0 && root1 < 0.0) {
-                            y = Math.sqrt(root0);
-                            return [temp - y, temp + y];
-                        } else if (root0 < 0.0 && root1 >= 0.0) {
-                            y = Math.sqrt(root1);
-                            return [temp - y, temp + y];
-                        }
-                    }
-                    return [];
-                } else if (hSquared > 0.0) {
-                    var h = Math.sqrt(hSquared);
-
-                    var m = (p + hSquared - q / h) / 2.0;
-                    var n = (p + hSquared + q / h) / 2.0;
-
-                    // Now solve the two quadratic factors:  (y^2 + h y + m)(y^2 - h y + n);
-                    var roots1 = QuadraticRealPolynomial.computeRealRoots(1.0, h, m);
-                    var roots2 = QuadraticRealPolynomial.computeRealRoots(1.0, -h, n);
-
-                    if (roots1.length !== 0) {
-                        roots1[0] += temp;
-                        roots1[1] += temp;
-
-                        if (roots2.length !== 0) {
-                            roots2[0] += temp;
-                            roots2[1] += temp;
-
-                            if (roots1[1] <= roots2[0]) {
-                                return [roots1[0], roots1[1], roots2[0], roots2[1]];
-                            } else if (roots2[1] <= roots1[0]) {
-                                return [roots2[0], roots2[1], roots1[0], roots1[1]];
-                            } else if (roots1[0] >= roots2[0] && roots1[1] <= roots2[1]) {
-                                return [roots2[0], roots1[0], roots1[1], roots2[1]];
-                            } else if (roots2[0] >= roots1[0] && roots2[1] <= roots1[1]) {
-                                return [roots1[0], roots2[0], roots2[1], roots1[1]];
-                            } else if (roots1[0] > roots2[0] && roots1[0] < roots2[1]) {
-                                return [roots2[0], roots1[0], roots2[1], roots1[1]];
-                            }
-                            return [roots1[0], roots2[0], roots1[1], roots2[1]];
-                        }
-                        return roots1;
-                    }
-
-                    if (roots2.length !== 0) {
-                        roots2[0] += temp;
-                        roots2[1] += temp;
-
-                        return roots2;
-                    }
-                    return [];
-                }
-            }
-            return [];
-        }
-
-        function neumark(a3, a2, a1, a0) {
-            var a1Squared = a1 * a1;
-            var a2Squared = a2 * a2;
-            var a3Squared = a3 * a3;
-
-            var p = -2.0 * a2;
-            var q = a1 * a3 + a2Squared - 4.0 * a0;
-            var r = a3Squared * a0 - a1 * a2 * a3 + a1Squared;
-
-            var cubicRoots = CubicRealPolynomial.computeRealRoots(1.0, p, q, r);
-
-            if (cubicRoots.length > 0) {
-                // Use the most positive root
-                var y = cubicRoots[0];
-
-                var temp = (a2 - y);
-                var tempSquared = temp * temp;
-
-                var g1 = a3 / 2.0;
-                var h1 = temp / 2.0;
-
-                var m = tempSquared - 4.0 * a0;
-                var mError = tempSquared + 4.0 * Math.abs(a0);
-
-                var n = a3Squared - 4.0 * y;
-                var nError = a3Squared + 4.0 * Math.abs(y);
-
-                var g2;
-                var h2;
-
-                if (y < 0.0 || (m * nError < n * mError)) {
-                    var squareRootOfN = Math.sqrt(n);
-                    g2 = squareRootOfN / 2.0;
-                    h2 = squareRootOfN === 0.0 ? 0.0 : (a3 * h1 - a1) / squareRootOfN;
-                } else {
-                    var squareRootOfM = Math.sqrt(m);
-                    g2 = squareRootOfM === 0.0 ? 0.0 : (a3 * h1 - a1) / squareRootOfM;
-                    h2 = squareRootOfM / 2.0;
-                }
-
-                var G;
-                var g;
-                if (g1 === 0.0 && g2 === 0.0) {
-                    G = 0.0;
-                    g = 0.0;
-                } else if (_Math.CesiumMath.sign(g1) === _Math.CesiumMath.sign(g2)) {
-                    G = g1 + g2;
-                    g = y / G;
-                } else {
-                    g = g1 - g2;
-                    G = y / g;
-                }
-
-                var H;
-                var h;
-                if (h1 === 0.0 && h2 === 0.0) {
-                    H = 0.0;
-                    h = 0.0;
-                } else if (_Math.CesiumMath.sign(h1) === _Math.CesiumMath.sign(h2)) {
-                    H = h1 + h2;
-                    h = a0 / H;
-                } else {
-                    h = h1 - h2;
-                    H = a0 / h;
-                }
-
-                // Now solve the two quadratic factors:  (y^2 + G y + H)(y^2 + g y + h);
-                var roots1 = QuadraticRealPolynomial.computeRealRoots(1.0, G, H);
-                var roots2 = QuadraticRealPolynomial.computeRealRoots(1.0, g, h);
-
-                if (roots1.length !== 0) {
-                    if (roots2.length !== 0) {
-                        if (roots1[1] <= roots2[0]) {
-                            return [roots1[0], roots1[1], roots2[0], roots2[1]];
-                        } else if (roots2[1] <= roots1[0]) {
-                            return [roots2[0], roots2[1], roots1[0], roots1[1]];
-                        } else if (roots1[0] >= roots2[0] && roots1[1] <= roots2[1]) {
-                            return [roots2[0], roots1[0], roots1[1], roots2[1]];
-                        } else if (roots2[0] >= roots1[0] && roots2[1] <= roots1[1]) {
-                            return [roots1[0], roots2[0], roots2[1], roots1[1]];
-                        } else if (roots1[0] > roots2[0] && roots1[0] < roots2[1]) {
-                            return [roots2[0], roots1[0], roots2[1], roots1[1]];
-                        }
-                        return [roots1[0], roots2[0], roots1[1], roots2[1]];
-                    }
-                    return roots1;
-                }
-                if (roots2.length !== 0) {
-                    return roots2;
-                }
-            }
-            return [];
-        }
-
-        /**
-         * Provides the real valued roots of the quartic polynomial with the provided coefficients.
-         *
-         * @param {Number} a The coefficient of the 4th order monomial.
-         * @param {Number} b The coefficient of the 3rd order monomial.
-         * @param {Number} c The coefficient of the 2nd order monomial.
-         * @param {Number} d The coefficient of the 1st order monomial.
-         * @param {Number} e The coefficient of the 0th order monomial.
-         * @returns {Number[]} The real valued roots.
-         */
-        QuarticRealPolynomial.computeRealRoots = function(a, b, c, d, e) {
-            //>>includeStart('debug', pragmas.debug);
-            if (typeof a !== 'number') {
-                throw new Check.DeveloperError('a is a required number.');
-            }
-            if (typeof b !== 'number') {
-                throw new Check.DeveloperError('b is a required number.');
-            }
-            if (typeof c !== 'number') {
-                throw new Check.DeveloperError('c is a required number.');
-            }
-            if (typeof d !== 'number') {
-                throw new Check.DeveloperError('d is a required number.');
-            }
-            if (typeof e !== 'number') {
-                throw new Check.DeveloperError('e is a required number.');
-            }
-            //>>includeEnd('debug');
-
-            if (Math.abs(a) < _Math.CesiumMath.EPSILON15) {
-                return CubicRealPolynomial.computeRealRoots(b, c, d, e);
-            }
-            var a3 = b / a;
-            var a2 = c / a;
-            var a1 = d / a;
-            var a0 = e / a;
-
-            var k = (a3 < 0.0) ? 1 : 0;
-            k += (a2 < 0.0) ? k + 1 : k;
-            k += (a1 < 0.0) ? k + 1 : k;
-            k += (a0 < 0.0) ? k + 1 : k;
-
-            switch (k) {
-            case 0:
-                return original(a3, a2, a1, a0);
-            case 1:
-                return neumark(a3, a2, a1, a0);
-            case 2:
-                return neumark(a3, a2, a1, a0);
-            case 3:
-                return original(a3, a2, a1, a0);
-            case 4:
-                return original(a3, a2, a1, a0);
-            case 5:
-                return neumark(a3, a2, a1, a0);
-            case 6:
-                return original(a3, a2, a1, a0);
-            case 7:
-                return original(a3, a2, a1, a0);
-            case 8:
-                return neumark(a3, a2, a1, a0);
-            case 9:
-                return original(a3, a2, a1, a0);
-            case 10:
-                return original(a3, a2, a1, a0);
-            case 11:
-                return neumark(a3, a2, a1, a0);
-            case 12:
-                return original(a3, a2, a1, a0);
-            case 13:
-                return original(a3, a2, a1, a0);
-            case 14:
-                return original(a3, a2, a1, a0);
-            case 15:
-                return original(a3, a2, a1, a0);
-            default:
-                return undefined;
-            }
-        };
-
-    /**
-         * Represents a ray that extends infinitely from the provided origin in the provided direction.
-         * @alias Ray
-         * @constructor
-         *
-         * @param {Cartesian3} [origin=Cartesian3.ZERO] The origin of the ray.
-         * @param {Cartesian3} [direction=Cartesian3.ZERO] The direction of the ray.
-         */
-        function Ray(origin, direction) {
-            direction = Cartographic.Cartesian3.clone(when.defaultValue(direction, Cartographic.Cartesian3.ZERO));
-            if (!Cartographic.Cartesian3.equals(direction, Cartographic.Cartesian3.ZERO)) {
-                Cartographic.Cartesian3.normalize(direction, direction);
-            }
-
-            /**
-             * The origin of the ray.
-             * @type {Cartesian3}
-             * @default {@link Cartesian3.ZERO}
-             */
-            this.origin = Cartographic.Cartesian3.clone(when.defaultValue(origin, Cartographic.Cartesian3.ZERO));
-
-            /**
-             * The direction of the ray.
-             * @type {Cartesian3}
-             */
-            this.direction = direction;
-        }
-
-        /**
-         * Duplicates a Ray instance.
-         *
-         * @param {Ray} ray The ray to duplicate.
-         * @param {Ray} [result] The object onto which to store the result.
-         * @returns {Ray} The modified result parameter or a new Ray instance if one was not provided. (Returns undefined if ray is undefined)
-         */
-        Ray.clone = function(ray, result) {
-            if (!when.defined(ray)) {
-                return undefined;
-            }
-            if (!when.defined(result)) {
-                return new Ray(ray.origin, ray.direction);
-            }
-            result.origin = Cartographic.Cartesian3.clone(ray.origin);
-            result.direction = Cartographic.Cartesian3.clone(ray.direction);
-            return result;
-        };
-
-        /**
-         * Computes the point along the ray given by r(t) = o + t*d,
-         * where o is the origin of the ray and d is the direction.
-         *
-         * @param {Ray} ray The ray.
-         * @param {Number} t A scalar value.
-         * @param {Cartesian3} [result] The object in which the result will be stored.
-         * @returns {Cartesian3} The modified result parameter, or a new instance if none was provided.
-         *
-         * @example
-         * //Get the first intersection point of a ray and an ellipsoid.
-         * var intersection = Cesium.IntersectionTests.rayEllipsoid(ray, ellipsoid);
-         * var point = Cesium.Ray.getPoint(ray, intersection.start);
-         */
-        Ray.getPoint = function(ray, t, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('ray', ray);
-            Check.Check.typeOf.number('t', t);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            result = Cartographic.Cartesian3.multiplyByScalar(ray.direction, t, result);
-            return Cartographic.Cartesian3.add(ray.origin, result, result);
-        };
-
-    /**
-         * Functions for computing the intersection between geometries such as rays, planes, triangles, and ellipsoids.
-         *
-         * @exports IntersectionTests
-         * @namespace
-         */
-        var IntersectionTests = {};
-
-        /**
-         * Computes the intersection of a ray and a plane.
-         *
-         * @param {Ray} ray The ray.
-         * @param {Plane} plane The plane.
-         * @param {Cartesian3} [result] The object onto which to store the result.
-         * @returns {Cartesian3} The intersection point or undefined if there is no intersections.
-         */
-        IntersectionTests.rayPlane = function(ray, plane, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(ray)) {
-                throw new Check.DeveloperError('ray is required.');
-            }
-            if (!when.defined(plane)) {
-                throw new Check.DeveloperError('plane is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            var origin = ray.origin;
-            var direction = ray.direction;
-            var normal = plane.normal;
-            var denominator = Cartographic.Cartesian3.dot(normal, direction);
-
-            if (Math.abs(denominator) < _Math.CesiumMath.EPSILON15) {
-                // Ray is parallel to plane.  The ray may be in the polygon's plane.
-                return undefined;
-            }
-
-            var t = (-plane.distance - Cartographic.Cartesian3.dot(normal, origin)) / denominator;
-
-            if (t < 0) {
-                return undefined;
-            }
-
-            result = Cartographic.Cartesian3.multiplyByScalar(direction, t, result);
-            return Cartographic.Cartesian3.add(origin, result, result);
-        };
-
-        var scratchEdge0 = new Cartographic.Cartesian3();
-        var scratchEdge1 = new Cartographic.Cartesian3();
-        var scratchPVec = new Cartographic.Cartesian3();
-        var scratchTVec = new Cartographic.Cartesian3();
-        var scratchQVec = new Cartographic.Cartesian3();
-
-        /**
-         * Computes the intersection of a ray and a triangle as a parametric distance along the input ray. The result is negative when the triangle is behind the ray.
-         *
-         * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf|
-         * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore.
-         *
-         * @memberof IntersectionTests
-         *
-         * @param {Ray} ray The ray.
-         * @param {Cartesian3} p0 The first vertex of the triangle.
-         * @param {Cartesian3} p1 The second vertex of the triangle.
-         * @param {Cartesian3} p2 The third vertex of the triangle.
-         * @param {Boolean} [cullBackFaces=false] If <code>true</code>, will only compute an intersection with the front face of the triangle
-         *                  and return undefined for intersections with the back face.
-         * @returns {Number} The intersection as a parametric distance along the ray, or undefined if there is no intersection.
-         */
-        IntersectionTests.rayTriangleParametric  = function(ray, p0, p1, p2, cullBackFaces) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(ray)) {
-                throw new Check.DeveloperError('ray is required.');
-            }
-            if (!when.defined(p0)) {
-                throw new Check.DeveloperError('p0 is required.');
-            }
-            if (!when.defined(p1)) {
-                throw new Check.DeveloperError('p1 is required.');
-            }
-            if (!when.defined(p2)) {
-                throw new Check.DeveloperError('p2 is required.');
-            }
-            //>>includeEnd('debug');
-
-            cullBackFaces = when.defaultValue(cullBackFaces, false);
-
-            var origin = ray.origin;
-            var direction = ray.direction;
-
-            var edge0 = Cartographic.Cartesian3.subtract(p1, p0, scratchEdge0);
-            var edge1 = Cartographic.Cartesian3.subtract(p2, p0, scratchEdge1);
-
-            var p = Cartographic.Cartesian3.cross(direction, edge1, scratchPVec);
-            var det = Cartographic.Cartesian3.dot(edge0, p);
-
-            var tvec;
-            var q;
-
-            var u;
-            var v;
-            var t;
-
-            if (cullBackFaces) {
-                if (det < _Math.CesiumMath.EPSILON6) {
-                    return undefined;
-                }
-
-                tvec = Cartographic.Cartesian3.subtract(origin, p0, scratchTVec);
-                u = Cartographic.Cartesian3.dot(tvec, p);
-                if (u < 0.0 || u > det) {
-                    return undefined;
-                }
-
-                q = Cartographic.Cartesian3.cross(tvec, edge0, scratchQVec);
-
-                v = Cartographic.Cartesian3.dot(direction, q);
-                if (v < 0.0 || u + v > det) {
-                    return undefined;
-                }
-
-                t = Cartographic.Cartesian3.dot(edge1, q) / det;
-            } else {
-                if (Math.abs(det) < _Math.CesiumMath.EPSILON6) {
-                    return undefined;
-                }
-                var invDet = 1.0 / det;
-
-                tvec = Cartographic.Cartesian3.subtract(origin, p0, scratchTVec);
-                u = Cartographic.Cartesian3.dot(tvec, p) * invDet;
-                if (u < 0.0 || u > 1.0) {
-                    return undefined;
-                }
-
-                q = Cartographic.Cartesian3.cross(tvec, edge0, scratchQVec);
-
-                v = Cartographic.Cartesian3.dot(direction, q) * invDet;
-                if (v < 0.0 || u + v > 1.0) {
-                    return undefined;
-                }
-
-                t = Cartographic.Cartesian3.dot(edge1, q) * invDet;
-            }
-
-            return t;
-        };
-
-        /**
-         * Computes the intersection of a ray and a triangle as a Cartesian3 coordinate.
-         *
-         * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf|
-         * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore.
-         *
-         * @memberof IntersectionTests
-         *
-         * @param {Ray} ray The ray.
-         * @param {Cartesian3} p0 The first vertex of the triangle.
-         * @param {Cartesian3} p1 The second vertex of the triangle.
-         * @param {Cartesian3} p2 The third vertex of the triangle.
-         * @param {Boolean} [cullBackFaces=false] If <code>true</code>, will only compute an intersection with the front face of the triangle
-         *                  and return undefined for intersections with the back face.
-         * @param {Cartesian3} [result] The <code>Cartesian3</code> onto which to store the result.
-         * @returns {Cartesian3} The intersection point or undefined if there is no intersections.
-         */
-        IntersectionTests.rayTriangle = function(ray, p0, p1, p2, cullBackFaces, result) {
-            var t = IntersectionTests.rayTriangleParametric(ray, p0, p1, p2, cullBackFaces);
-            if (!when.defined(t) || t < 0.0) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            Cartographic.Cartesian3.multiplyByScalar(ray.direction, t, result);
-            return Cartographic.Cartesian3.add(ray.origin, result, result);
-        };
-
-        var scratchLineSegmentTriangleRay = new Ray();
-
-        /**
-         * Computes the intersection of a line segment and a triangle.
-         * @memberof IntersectionTests
-         *
-         * @param {Cartesian3} v0 The an end point of the line segment.
-         * @param {Cartesian3} v1 The other end point of the line segment.
-         * @param {Cartesian3} p0 The first vertex of the triangle.
-         * @param {Cartesian3} p1 The second vertex of the triangle.
-         * @param {Cartesian3} p2 The third vertex of the triangle.
-         * @param {Boolean} [cullBackFaces=false] If <code>true</code>, will only compute an intersection with the front face of the triangle
-         *                  and return undefined for intersections with the back face.
-         * @param {Cartesian3} [result] The <code>Cartesian3</code> onto which to store the result.
-         * @returns {Cartesian3} The intersection point or undefined if there is no intersections.
-         */
-        IntersectionTests.lineSegmentTriangle = function(v0, v1, p0, p1, p2, cullBackFaces, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(v0)) {
-                throw new Check.DeveloperError('v0 is required.');
-            }
-            if (!when.defined(v1)) {
-                throw new Check.DeveloperError('v1 is required.');
-            }
-            if (!when.defined(p0)) {
-                throw new Check.DeveloperError('p0 is required.');
-            }
-            if (!when.defined(p1)) {
-                throw new Check.DeveloperError('p1 is required.');
-            }
-            if (!when.defined(p2)) {
-                throw new Check.DeveloperError('p2 is required.');
-            }
-            //>>includeEnd('debug');
-
-            var ray = scratchLineSegmentTriangleRay;
-            Cartographic.Cartesian3.clone(v0, ray.origin);
-            Cartographic.Cartesian3.subtract(v1, v0, ray.direction);
-            Cartographic.Cartesian3.normalize(ray.direction, ray.direction);
-
-            var t = IntersectionTests.rayTriangleParametric(ray, p0, p1, p2, cullBackFaces);
-            if (!when.defined(t) || t < 0.0 || t > Cartographic.Cartesian3.distance(v0, v1)) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            Cartographic.Cartesian3.multiplyByScalar(ray.direction, t, result);
-            return Cartographic.Cartesian3.add(ray.origin, result, result);
-        };
-
-        function solveQuadratic(a, b, c, result) {
-            var det = b * b - 4.0 * a * c;
-            if (det < 0.0) {
-                return undefined;
-            } else if (det > 0.0) {
-                var denom = 1.0 / (2.0 * a);
-                var disc = Math.sqrt(det);
-                var root0 = (-b + disc) * denom;
-                var root1 = (-b - disc) * denom;
-
-                if (root0 < root1) {
-                    result.root0 = root0;
-                    result.root1 = root1;
-                } else {
-                    result.root0 = root1;
-                    result.root1 = root0;
-                }
-
-                return result;
-            }
-
-            var root = -b / (2.0 * a);
-            if (root === 0.0) {
-                return undefined;
-            }
-
-            result.root0 = result.root1 = root;
-            return result;
-        }
-
-        var raySphereRoots = {
-            root0 : 0.0,
-            root1 : 0.0
-        };
-
-        function raySphere(ray, sphere, result) {
-            if (!when.defined(result)) {
-                result = new BoundingSphere.Interval();
-            }
-
-            var origin = ray.origin;
-            var direction = ray.direction;
-
-            var center = sphere.center;
-            var radiusSquared = sphere.radius * sphere.radius;
-
-            var diff = Cartographic.Cartesian3.subtract(origin, center, scratchPVec);
-
-            var a = Cartographic.Cartesian3.dot(direction, direction);
-            var b = 2.0 * Cartographic.Cartesian3.dot(direction, diff);
-            var c = Cartographic.Cartesian3.magnitudeSquared(diff) - radiusSquared;
-
-            var roots = solveQuadratic(a, b, c, raySphereRoots);
-            if (!when.defined(roots)) {
-                return undefined;
-            }
-
-            result.start = roots.root0;
-            result.stop = roots.root1;
-            return result;
-        }
-
-        /**
-         * Computes the intersection points of a ray with a sphere.
-         * @memberof IntersectionTests
-         *
-         * @param {Ray} ray The ray.
-         * @param {BoundingSphere} sphere The sphere.
-         * @param {Interval} [result] The result onto which to store the result.
-         * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections.
-         */
-        IntersectionTests.raySphere = function(ray, sphere, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(ray)) {
-                throw new Check.DeveloperError('ray is required.');
-            }
-            if (!when.defined(sphere)) {
-                throw new Check.DeveloperError('sphere is required.');
-            }
-            //>>includeEnd('debug');
-
-            result = raySphere(ray, sphere, result);
-            if (!when.defined(result) || result.stop < 0.0) {
-                return undefined;
-            }
-
-            result.start = Math.max(result.start, 0.0);
-            return result;
-        };
-
-        var scratchLineSegmentRay = new Ray();
-
-        /**
-         * Computes the intersection points of a line segment with a sphere.
-         * @memberof IntersectionTests
-         *
-         * @param {Cartesian3} p0 An end point of the line segment.
-         * @param {Cartesian3} p1 The other end point of the line segment.
-         * @param {BoundingSphere} sphere The sphere.
-         * @param {Interval} [result] The result onto which to store the result.
-         * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections.
-         */
-        IntersectionTests.lineSegmentSphere = function(p0, p1, sphere, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(p0)) {
-                throw new Check.DeveloperError('p0 is required.');
-            }
-            if (!when.defined(p1)) {
-                throw new Check.DeveloperError('p1 is required.');
-            }
-            if (!when.defined(sphere)) {
-                throw new Check.DeveloperError('sphere is required.');
-            }
-            //>>includeEnd('debug');
-
-            var ray = scratchLineSegmentRay;
-            Cartographic.Cartesian3.clone(p0, ray.origin);
-            var direction = Cartographic.Cartesian3.subtract(p1, p0, ray.direction);
-
-            var maxT = Cartographic.Cartesian3.magnitude(direction);
-            Cartographic.Cartesian3.normalize(direction, direction);
-
-            result = raySphere(ray, sphere, result);
-            if (!when.defined(result) || result.stop < 0.0 || result.start > maxT) {
-                return undefined;
-            }
-
-            result.start = Math.max(result.start, 0.0);
-            result.stop = Math.min(result.stop, maxT);
-            return result;
-        };
-
-        var scratchQ = new Cartographic.Cartesian3();
-        var scratchW = new Cartographic.Cartesian3();
-
-        /**
-         * Computes the intersection points of a ray with an ellipsoid.
-         *
-         * @param {Ray} ray The ray.
-         * @param {Ellipsoid} ellipsoid The ellipsoid.
-         * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections.
-         */
-        IntersectionTests.rayEllipsoid = function(ray, ellipsoid) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(ray)) {
-                throw new Check.DeveloperError('ray is required.');
-            }
-            if (!when.defined(ellipsoid)) {
-                throw new Check.DeveloperError('ellipsoid is required.');
-            }
-            //>>includeEnd('debug');
-
-            var inverseRadii = ellipsoid.oneOverRadii;
-            var q = Cartographic.Cartesian3.multiplyComponents(inverseRadii, ray.origin, scratchQ);
-            var w = Cartographic.Cartesian3.multiplyComponents(inverseRadii, ray.direction, scratchW);
-
-            var q2 = Cartographic.Cartesian3.magnitudeSquared(q);
-            var qw = Cartographic.Cartesian3.dot(q, w);
-
-            var difference, w2, product, discriminant, temp;
-
-            if (q2 > 1.0) {
-                // Outside ellipsoid.
-                if (qw >= 0.0) {
-                    // Looking outward or tangent (0 intersections).
-                    return undefined;
-                }
-
-                // qw < 0.0.
-                var qw2 = qw * qw;
-                difference = q2 - 1.0; // Positively valued.
-                w2 = Cartographic.Cartesian3.magnitudeSquared(w);
-                product = w2 * difference;
-
-                if (qw2 < product) {
-                    // Imaginary roots (0 intersections).
-                    return undefined;
-                } else if (qw2 > product) {
-                    // Distinct roots (2 intersections).
-                    discriminant = qw * qw - product;
-                    temp = -qw + Math.sqrt(discriminant); // Avoid cancellation.
-                    var root0 = temp / w2;
-                    var root1 = difference / temp;
-                    if (root0 < root1) {
-                        return new BoundingSphere.Interval(root0, root1);
-                    }
-
-                    return {
-                        start : root1,
-                        stop : root0
-                    };
-                }
-                // qw2 == product.  Repeated roots (2 intersections).
-                var root = Math.sqrt(difference / w2);
-                return new BoundingSphere.Interval(root, root);
-            } else if (q2 < 1.0) {
-                // Inside ellipsoid (2 intersections).
-                difference = q2 - 1.0; // Negatively valued.
-                w2 = Cartographic.Cartesian3.magnitudeSquared(w);
-                product = w2 * difference; // Negatively valued.
-
-                discriminant = qw * qw - product;
-                temp = -qw + Math.sqrt(discriminant); // Positively valued.
-                return new BoundingSphere.Interval(0.0, temp / w2);
-            }
-            // q2 == 1.0. On ellipsoid.
-            if (qw < 0.0) {
-                // Looking inward.
-                w2 = Cartographic.Cartesian3.magnitudeSquared(w);
-                return new BoundingSphere.Interval(0.0, -qw / w2);
-            }
-
-            // qw >= 0.0.  Looking outward or tangent.
-            return undefined;
-        };
-
-        function addWithCancellationCheck$1(left, right, tolerance) {
-            var difference = left + right;
-            if ((_Math.CesiumMath.sign(left) !== _Math.CesiumMath.sign(right)) &&
-                    Math.abs(difference / Math.max(Math.abs(left), Math.abs(right))) < tolerance) {
-                return 0.0;
-            }
-
-            return difference;
-        }
-
-        function quadraticVectorExpression(A, b, c, x, w) {
-            var xSquared = x * x;
-            var wSquared = w * w;
-
-            var l2 = (A[BoundingSphere.Matrix3.COLUMN1ROW1] - A[BoundingSphere.Matrix3.COLUMN2ROW2]) * wSquared;
-            var l1 = w * (x * addWithCancellationCheck$1(A[BoundingSphere.Matrix3.COLUMN1ROW0], A[BoundingSphere.Matrix3.COLUMN0ROW1], _Math.CesiumMath.EPSILON15) + b.y);
-            var l0 = (A[BoundingSphere.Matrix3.COLUMN0ROW0] * xSquared + A[BoundingSphere.Matrix3.COLUMN2ROW2] * wSquared) + x * b.x + c;
-
-            var r1 = wSquared * addWithCancellationCheck$1(A[BoundingSphere.Matrix3.COLUMN2ROW1], A[BoundingSphere.Matrix3.COLUMN1ROW2], _Math.CesiumMath.EPSILON15);
-            var r0 = w * (x * addWithCancellationCheck$1(A[BoundingSphere.Matrix3.COLUMN2ROW0], A[BoundingSphere.Matrix3.COLUMN0ROW2]) + b.z);
-
-            var cosines;
-            var solutions = [];
-            if (r0 === 0.0 && r1 === 0.0) {
-                cosines = QuadraticRealPolynomial.computeRealRoots(l2, l1, l0);
-                if (cosines.length === 0) {
-                    return solutions;
-                }
-
-                var cosine0 = cosines[0];
-                var sine0 = Math.sqrt(Math.max(1.0 - cosine0 * cosine0, 0.0));
-                solutions.push(new Cartographic.Cartesian3(x, w * cosine0, w * -sine0));
-                solutions.push(new Cartographic.Cartesian3(x, w * cosine0, w * sine0));
-
-                if (cosines.length === 2) {
-                    var cosine1 = cosines[1];
-                    var sine1 = Math.sqrt(Math.max(1.0 - cosine1 * cosine1, 0.0));
-                    solutions.push(new Cartographic.Cartesian3(x, w * cosine1, w * -sine1));
-                    solutions.push(new Cartographic.Cartesian3(x, w * cosine1, w * sine1));
-                }
-
-                return solutions;
-            }
-
-            var r0Squared = r0 * r0;
-            var r1Squared = r1 * r1;
-            var l2Squared = l2 * l2;
-            var r0r1 = r0 * r1;
-
-            var c4 = l2Squared + r1Squared;
-            var c3 = 2.0 * (l1 * l2 + r0r1);
-            var c2 = 2.0 * l0 * l2 + l1 * l1 - r1Squared + r0Squared;
-            var c1 = 2.0 * (l0 * l1 - r0r1);
-            var c0 = l0 * l0 - r0Squared;
-
-            if (c4 === 0.0 && c3 === 0.0 && c2 === 0.0 && c1 === 0.0) {
-                return solutions;
-            }
-
-            cosines = QuarticRealPolynomial.computeRealRoots(c4, c3, c2, c1, c0);
-            var length = cosines.length;
-            if (length === 0) {
-                return solutions;
-            }
-
-            for ( var i = 0; i < length; ++i) {
-                var cosine = cosines[i];
-                var cosineSquared = cosine * cosine;
-                var sineSquared = Math.max(1.0 - cosineSquared, 0.0);
-                var sine = Math.sqrt(sineSquared);
-
-                //var left = l2 * cosineSquared + l1 * cosine + l0;
-                var left;
-                if (_Math.CesiumMath.sign(l2) === _Math.CesiumMath.sign(l0)) {
-                    left = addWithCancellationCheck$1(l2 * cosineSquared + l0, l1 * cosine, _Math.CesiumMath.EPSILON12);
-                } else if (_Math.CesiumMath.sign(l0) === _Math.CesiumMath.sign(l1 * cosine)) {
-                    left = addWithCancellationCheck$1(l2 * cosineSquared, l1 * cosine + l0, _Math.CesiumMath.EPSILON12);
-                } else {
-                    left = addWithCancellationCheck$1(l2 * cosineSquared + l1 * cosine, l0, _Math.CesiumMath.EPSILON12);
-                }
-
-                var right = addWithCancellationCheck$1(r1 * cosine, r0, _Math.CesiumMath.EPSILON15);
-                var product = left * right;
-
-                if (product < 0.0) {
-                    solutions.push(new Cartographic.Cartesian3(x, w * cosine, w * sine));
-                } else if (product > 0.0) {
-                    solutions.push(new Cartographic.Cartesian3(x, w * cosine, w * -sine));
-                } else if (sine !== 0.0) {
-                    solutions.push(new Cartographic.Cartesian3(x, w * cosine, w * -sine));
-                    solutions.push(new Cartographic.Cartesian3(x, w * cosine, w * sine));
-                    ++i;
-                } else {
-                    solutions.push(new Cartographic.Cartesian3(x, w * cosine, w * sine));
-                }
-            }
-
-            return solutions;
-        }
-
-        var firstAxisScratch = new Cartographic.Cartesian3();
-        var secondAxisScratch = new Cartographic.Cartesian3();
-        var thirdAxisScratch = new Cartographic.Cartesian3();
-        var referenceScratch = new Cartographic.Cartesian3();
-        var bCart = new Cartographic.Cartesian3();
-        var bScratch = new BoundingSphere.Matrix3();
-        var btScratch = new BoundingSphere.Matrix3();
-        var diScratch = new BoundingSphere.Matrix3();
-        var dScratch = new BoundingSphere.Matrix3();
-        var cScratch = new BoundingSphere.Matrix3();
-        var tempMatrix = new BoundingSphere.Matrix3();
-        var aScratch = new BoundingSphere.Matrix3();
-        var sScratch = new Cartographic.Cartesian3();
-        var closestScratch = new Cartographic.Cartesian3();
-        var surfPointScratch = new Cartographic.Cartographic();
-
-        /**
-         * Provides the point along the ray which is nearest to the ellipsoid.
-         *
-         * @param {Ray} ray The ray.
-         * @param {Ellipsoid} ellipsoid The ellipsoid.
-         * @returns {Cartesian3} The nearest planetodetic point on the ray.
-         */
-        IntersectionTests.grazingAltitudeLocation = function(ray, ellipsoid) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(ray)) {
-                throw new Check.DeveloperError('ray is required.');
-            }
-            if (!when.defined(ellipsoid)) {
-                throw new Check.DeveloperError('ellipsoid is required.');
-            }
-            //>>includeEnd('debug');
-
-            var position = ray.origin;
-            var direction = ray.direction;
-
-            if (!Cartographic.Cartesian3.equals(position, Cartographic.Cartesian3.ZERO)) {
-                var normal = ellipsoid.geodeticSurfaceNormal(position, firstAxisScratch);
-                if (Cartographic.Cartesian3.dot(direction, normal) >= 0.0) { // The location provided is the closest point in altitude
-                    return position;
-                }
-            }
-
-            var intersects = when.defined(this.rayEllipsoid(ray, ellipsoid));
-
-            // Compute the scaled direction vector.
-            var f = ellipsoid.transformPositionToScaledSpace(direction, firstAxisScratch);
-
-            // Constructs a basis from the unit scaled direction vector. Construct its rotation and transpose.
-            var firstAxis = Cartographic.Cartesian3.normalize(f, f);
-            var reference = Cartographic.Cartesian3.mostOrthogonalAxis(f, referenceScratch);
-            var secondAxis = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(reference, firstAxis, secondAxisScratch), secondAxisScratch);
-            var thirdAxis  = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(firstAxis, secondAxis, thirdAxisScratch), thirdAxisScratch);
-            var B = bScratch;
-            B[0] = firstAxis.x;
-            B[1] = firstAxis.y;
-            B[2] = firstAxis.z;
-            B[3] = secondAxis.x;
-            B[4] = secondAxis.y;
-            B[5] = secondAxis.z;
-            B[6] = thirdAxis.x;
-            B[7] = thirdAxis.y;
-            B[8] = thirdAxis.z;
-
-            var B_T = BoundingSphere.Matrix3.transpose(B, btScratch);
-
-            // Get the scaling matrix and its inverse.
-            var D_I = BoundingSphere.Matrix3.fromScale(ellipsoid.radii, diScratch);
-            var D = BoundingSphere.Matrix3.fromScale(ellipsoid.oneOverRadii, dScratch);
-
-            var C = cScratch;
-            C[0] = 0.0;
-            C[1] = -direction.z;
-            C[2] = direction.y;
-            C[3] = direction.z;
-            C[4] = 0.0;
-            C[5] = -direction.x;
-            C[6] = -direction.y;
-            C[7] = direction.x;
-            C[8] = 0.0;
-
-            var temp = BoundingSphere.Matrix3.multiply(BoundingSphere.Matrix3.multiply(B_T, D, tempMatrix), C, tempMatrix);
-            var A = BoundingSphere.Matrix3.multiply(BoundingSphere.Matrix3.multiply(temp, D_I, aScratch), B, aScratch);
-            var b = BoundingSphere.Matrix3.multiplyByVector(temp, position, bCart);
-
-            // Solve for the solutions to the expression in standard form:
-            var solutions = quadraticVectorExpression(A, Cartographic.Cartesian3.negate(b, firstAxisScratch), 0.0, 0.0, 1.0);
-
-            var s;
-            var altitude;
-            var length = solutions.length;
-            if (length > 0) {
-                var closest = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, closestScratch);
-                var maximumValue = Number.NEGATIVE_INFINITY;
-
-                for ( var i = 0; i < length; ++i) {
-                    s = BoundingSphere.Matrix3.multiplyByVector(D_I, BoundingSphere.Matrix3.multiplyByVector(B, solutions[i], sScratch), sScratch);
-                    var v = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.subtract(s, position, referenceScratch), referenceScratch);
-                    var dotProduct = Cartographic.Cartesian3.dot(v, direction);
-
-                    if (dotProduct > maximumValue) {
-                        maximumValue = dotProduct;
-                        closest = Cartographic.Cartesian3.clone(s, closest);
-                    }
-                }
-
-                var surfacePoint = ellipsoid.cartesianToCartographic(closest, surfPointScratch);
-                maximumValue = _Math.CesiumMath.clamp(maximumValue, 0.0, 1.0);
-                altitude = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.subtract(closest, position, referenceScratch)) * Math.sqrt(1.0 - maximumValue * maximumValue);
-                altitude = intersects ? -altitude : altitude;
-                surfacePoint.height = altitude;
-                return ellipsoid.cartographicToCartesian(surfacePoint, new Cartographic.Cartesian3());
-            }
-
-            return undefined;
-        };
-
-        var lineSegmentPlaneDifference = new Cartographic.Cartesian3();
-
-        /**
-         * Computes the intersection of a line segment and a plane.
-         *
-         * @param {Cartesian3} endPoint0 An end point of the line segment.
-         * @param {Cartesian3} endPoint1 The other end point of the line segment.
-         * @param {Plane} plane The plane.
-         * @param {Cartesian3} [result] The object onto which to store the result.
-         * @returns {Cartesian3} The intersection point or undefined if there is no intersection.
-         *
-         * @example
-         * var origin = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);
-         * var normal = ellipsoid.geodeticSurfaceNormal(origin);
-         * var plane = Cesium.Plane.fromPointNormal(origin, normal);
-         *
-         * var p0 = new Cesium.Cartesian3(...);
-         * var p1 = new Cesium.Cartesian3(...);
-         *
-         * // find the intersection of the line segment from p0 to p1 and the tangent plane at origin.
-         * var intersection = Cesium.IntersectionTests.lineSegmentPlane(p0, p1, plane);
-         */
-        IntersectionTests.lineSegmentPlane = function(endPoint0, endPoint1, plane, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(endPoint0)) {
-                throw new Check.DeveloperError('endPoint0 is required.');
-            }
-            if (!when.defined(endPoint1)) {
-                throw new Check.DeveloperError('endPoint1 is required.');
-            }
-            if (!when.defined(plane)) {
-                throw new Check.DeveloperError('plane is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            var difference = Cartographic.Cartesian3.subtract(endPoint1, endPoint0, lineSegmentPlaneDifference);
-            var normal = plane.normal;
-            var nDotDiff = Cartographic.Cartesian3.dot(normal, difference);
-
-            // check if the segment and plane are parallel
-            if (Math.abs(nDotDiff) < _Math.CesiumMath.EPSILON6) {
-                return undefined;
-            }
-
-            var nDotP0 = Cartographic.Cartesian3.dot(normal, endPoint0);
-            var t = -(plane.distance + nDotP0) / nDotDiff;
-
-            // intersection only if t is in [0, 1]
-            if (t < 0.0 || t > 1.0) {
-                return undefined;
-            }
-
-            // intersection is endPoint0 + t * (endPoint1 - endPoint0)
-            Cartographic.Cartesian3.multiplyByScalar(difference, t, result);
-            Cartographic.Cartesian3.add(endPoint0, result, result);
-            return result;
-        };
-
-        /**
-         * Computes the intersection of a triangle and a plane
-         *
-         * @param {Cartesian3} p0 First point of the triangle
-         * @param {Cartesian3} p1 Second point of the triangle
-         * @param {Cartesian3} p2 Third point of the triangle
-         * @param {Plane} plane Intersection plane
-         * @returns {Object} An object with properties <code>positions</code> and <code>indices</code>, which are arrays that represent three triangles that do not cross the plane. (Undefined if no intersection exists)
-         *
-         * @example
-         * var origin = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);
-         * var normal = ellipsoid.geodeticSurfaceNormal(origin);
-         * var plane = Cesium.Plane.fromPointNormal(origin, normal);
-         *
-         * var p0 = new Cesium.Cartesian3(...);
-         * var p1 = new Cesium.Cartesian3(...);
-         * var p2 = new Cesium.Cartesian3(...);
-         *
-         * // convert the triangle composed of points (p0, p1, p2) to three triangles that don't cross the plane
-         * var triangles = Cesium.IntersectionTests.trianglePlaneIntersection(p0, p1, p2, plane);
-         */
-        IntersectionTests.trianglePlaneIntersection = function(p0, p1, p2, plane) {
-            //>>includeStart('debug', pragmas.debug);
-            if ((!when.defined(p0)) ||
-                (!when.defined(p1)) ||
-                (!when.defined(p2)) ||
-                (!when.defined(plane))) {
-                throw new Check.DeveloperError('p0, p1, p2, and plane are required.');
-            }
-            //>>includeEnd('debug');
-
-            var planeNormal = plane.normal;
-            var planeD = plane.distance;
-            var p0Behind = (Cartographic.Cartesian3.dot(planeNormal, p0) + planeD) < 0.0;
-            var p1Behind = (Cartographic.Cartesian3.dot(planeNormal, p1) + planeD) < 0.0;
-            var p2Behind = (Cartographic.Cartesian3.dot(planeNormal, p2) + planeD) < 0.0;
-            // Given these dots products, the calls to lineSegmentPlaneIntersection
-            // always have defined results.
-
-            var numBehind = 0;
-            numBehind += p0Behind ? 1 : 0;
-            numBehind += p1Behind ? 1 : 0;
-            numBehind += p2Behind ? 1 : 0;
-
-            var u1, u2;
-            if (numBehind === 1 || numBehind === 2) {
-                u1 = new Cartographic.Cartesian3();
-                u2 = new Cartographic.Cartesian3();
-            }
-
-            if (numBehind === 1) {
-                if (p0Behind) {
-                    IntersectionTests.lineSegmentPlane(p0, p1, plane, u1);
-                    IntersectionTests.lineSegmentPlane(p0, p2, plane, u2);
-
-                    return {
-                        positions : [p0, p1, p2, u1, u2 ],
-                        indices : [
-                            // Behind
-                            0, 3, 4,
-
-                            // In front
-                            1, 2, 4,
-                            1, 4, 3
-                        ]
-                    };
-                } else if (p1Behind) {
-                    IntersectionTests.lineSegmentPlane(p1, p2, plane, u1);
-                    IntersectionTests.lineSegmentPlane(p1, p0, plane, u2);
-
-                    return {
-                        positions : [p0, p1, p2, u1, u2 ],
-                        indices : [
-                            // Behind
-                            1, 3, 4,
-
-                            // In front
-                            2, 0, 4,
-                            2, 4, 3
-                        ]
-                    };
-                } else if (p2Behind) {
-                    IntersectionTests.lineSegmentPlane(p2, p0, plane, u1);
-                    IntersectionTests.lineSegmentPlane(p2, p1, plane, u2);
-
-                    return {
-                        positions : [p0, p1, p2, u1, u2 ],
-                        indices : [
-                            // Behind
-                            2, 3, 4,
-
-                            // In front
-                            0, 1, 4,
-                            0, 4, 3
-                        ]
-                    };
-                }
-            } else if (numBehind === 2) {
-                if (!p0Behind) {
-                    IntersectionTests.lineSegmentPlane(p1, p0, plane, u1);
-                    IntersectionTests.lineSegmentPlane(p2, p0, plane, u2);
-
-                    return {
-                        positions : [p0, p1, p2, u1, u2 ],
-                        indices : [
-                            // Behind
-                            1, 2, 4,
-                            1, 4, 3,
-
-                            // In front
-                            0, 3, 4
-                        ]
-                    };
-                } else if (!p1Behind) {
-                    IntersectionTests.lineSegmentPlane(p2, p1, plane, u1);
-                    IntersectionTests.lineSegmentPlane(p0, p1, plane, u2);
-
-                    return {
-                        positions : [p0, p1, p2, u1, u2 ],
-                        indices : [
-                            // Behind
-                            2, 0, 4,
-                            2, 4, 3,
-
-                            // In front
-                            1, 3, 4
-                        ]
-                    };
-                } else if (!p2Behind) {
-                    IntersectionTests.lineSegmentPlane(p0, p2, plane, u1);
-                    IntersectionTests.lineSegmentPlane(p1, p2, plane, u2);
-
-                    return {
-                        positions : [p0, p1, p2, u1, u2 ],
-                        indices : [
-                            // Behind
-                            0, 1, 4,
-                            0, 4, 3,
-
-                            // In front
-                            2, 3, 4
-                        ]
-                    };
-                }
-            }
-
-            // if numBehind is 3, the triangle is completely behind the plane;
-            // otherwise, it is completely in front (numBehind is 0).
-            return undefined;
-        };
-
-    exports.IntersectionTests = IntersectionTests;
-    exports.Ray = Ray;
-
-});
diff --git a/public/libs/Cesium/Workers/MVTWorkTile.js b/public/libs/Cesium/Workers/MVTWorkTile.js
deleted file mode 100644
index 833aedf..0000000
--- a/public/libs/Cesium/Workers/MVTWorkTile.js
+++ /dev/null
@@ -1,18358 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './createTaskProcessorWorker', './earcut-2.2.1-b404d9e6', './pbf-9fe59c76'], function (when, createTaskProcessorWorker, earcut2_2_1, pbf) { 'use strict';
-
-    function DictionaryCoder(strings) {
-        this._stringToNumber = {};
-        this._numberToString = [];
-        for (var i = 0; i < strings.length; i++) {
-            var string = strings[i];
-            this._stringToNumber[string] = i;
-            this._numberToString[i] = string;
-        }
-    }
-
-    DictionaryCoder.prototype.encode = function(string) {
-        return this._stringToNumber[string];
-    };
-
-    DictionaryCoder.prototype.decode = function(n) {
-        return this._numberToString[n];
-    };
-
-    var viewTypes = {
-        'Int8': Int8Array,
-        'Uint8': Uint8Array,
-        'Int16': Int16Array,
-        'Uint16': Uint16Array,
-        'Int32': Int32Array,
-        'Uint32': Uint32Array,
-        'Float32': Float32Array
-    };
-
-    /**
-     * Given a list of member fields, create a full StructArrayLayout, in
-     * particular calculating the correct byte offset for each field.  This data
-     * is used at build time to generate StructArrayLayout_*#emplaceBack() and
-     * other accessors, and at runtime for binding vertex buffer attributes.
-     *
-     * @private
-     */
-    function createLayout(members, alignment) {
-        if (alignment === void 0) alignment = 1;
-
-
-        var offset = 0;
-        var maxSize = 0;
-        var layoutMembers = members.map(function (member) {
-            //assert_1(member.name.length);
-            var typeSize = sizeOf(member.type);
-            var memberOffset = offset = align(offset, Math.max(alignment, typeSize));
-            var components = member.components || 1;
-
-            maxSize = Math.max(maxSize, typeSize);
-            offset += typeSize * components;
-
-            return {
-                name: member.name,
-                type: member.type,
-                components: components,
-                offset: memberOffset,
-            };
-        });
-
-        var size = align(offset, Math.max(maxSize, alignment));
-
-        return {
-            members: layoutMembers,
-            size: size,
-            alignment: alignment
-        };
-    }
-
-    function sizeOf(type) {
-        return viewTypes[type].BYTES_PER_ELEMENT;
-    }
-
-    function align(offset, size) {
-        return Math.ceil(offset / size) * size;
-    }
-
-    var IMAGE_PADDING = 1;
-
-    var ImagePosition = function ImagePosition(paddedRect, ref) {
-        var pixelRatio = ref.pixelRatio;
-        var version = ref.version;
-        var stretchX = ref.stretchX;
-        var stretchY = ref.stretchY;
-        var content = ref.content;
-
-        this.paddedRect = paddedRect;
-        this.pixelRatio = pixelRatio;
-        this.stretchX = stretchX;
-        this.stretchY = stretchY;
-        this.content = content;
-        this.version = version;
-    };
-
-    var prototypeAccessors = { tl: { configurable: true }, br: { configurable: true }, tlbr: { configurable: true }, displaySize: { configurable: true } };
-
-    prototypeAccessors.tl.get = function () {
-        return [
-            this.paddedRect.x + IMAGE_PADDING,
-            this.paddedRect.y + IMAGE_PADDING
-        ];
-    };
-
-    prototypeAccessors.br.get = function () {
-        return [
-            this.paddedRect.x + this.paddedRect.w - IMAGE_PADDING,
-            this.paddedRect.y + this.paddedRect.h - IMAGE_PADDING
-        ];
-    };
-
-    prototypeAccessors.tlbr.get = function () {
-        return this.tl.concat(this.br);
-    };
-
-    prototypeAccessors.displaySize.get = function () {
-        return [
-            (this.paddedRect.w - IMAGE_PADDING * 2) / this.pixelRatio,
-            (this.paddedRect.h - IMAGE_PADDING * 2) / this.pixelRatio
-        ];
-    };
-
-    Object.defineProperties(ImagePosition.prototype, prototypeAccessors);
-
-    // Not premultiplied, because ImageData is not premultiplied.
-    // UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture.
-    var RGBAImage = function RGBAImage(size, data) {
-        createImage(this, size, 4, data);
-    };
-
-    RGBAImage.prototype.resize = function resize(size) {
-        resizeImage(this, size, 4);
-    };
-
-    RGBAImage.prototype.replace = function replace(data, copy) {
-        if (copy) {
-            this.data.set(data);
-        } else if (data instanceof Uint8ClampedArray) {
-            this.data = new Uint8Array(data.buffer);
-        } else {
-            this.data = data;
-        }
-    };
-
-    RGBAImage.prototype.clone = function clone() {
-        return new RGBAImage({width: this.width, height: this.height}, new Uint8Array(this.data));
-    };
-
-    RGBAImage.copy = function copy(srcImg, dstImg, srcPt, dstPt, size) {
-        copyImage(srcImg, dstImg, srcPt, dstPt, size, 4);
-    };
-
-    function createImage(image, ref, channels, data) {
-        var width = ref.width;
-        var height = ref.height;
-
-        if (!data) {
-            data = new Uint8Array(width * height * channels);
-        } else if (data instanceof Uint8ClampedArray) {
-            data = new Uint8Array(data.buffer);
-        } else if (data.length !== width * height * channels) {
-            throw new RangeError('mismatched image size');
-        }
-        image.width = width;
-        image.height = height;
-        image.data = data;
-        return image;
-    }
-
-    function resizeImage(image, ref, channels) {
-        var width = ref.width;
-        var height = ref.height;
-
-        if (width === image.width && height === image.height) {
-            return;
-        }
-
-        var newImage = createImage({}, {width: width, height: height}, channels);
-
-        copyImage(image, newImage, {x: 0, y: 0}, {x: 0, y: 0}, {
-            width: Math.min(image.width, width),
-            height: Math.min(image.height, height)
-        }, channels);
-
-        image.width = width;
-        image.height = height;
-        image.data = newImage.data;
-    }
-
-    function copyImage(srcImg, dstImg, srcPt, dstPt, size, channels) {
-        if (size.width === 0 || size.height === 0) {
-            return dstImg;
-        }
-
-        if (size.width > srcImg.width ||
-            size.height > srcImg.height ||
-            srcPt.x > srcImg.width - size.width ||
-            srcPt.y > srcImg.height - size.height) {
-            throw new RangeError('out of range source coordinates for image copy');
-        }
-
-        if (size.width > dstImg.width ||
-            size.height > dstImg.height ||
-            dstPt.x > dstImg.width - size.width ||
-            dstPt.y > dstImg.height - size.height) {
-            throw new RangeError('out of range destination coordinates for image copy');
-        }
-
-        var srcData = srcImg.data;
-        var dstData = dstImg.data;
-
-        //assert_1(srcData !== dstData);
-
-        for (var y = 0; y < size.height; y++) {
-            var srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels;
-            var dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels;
-            for (var i = 0; i < size.width * channels; i++) {
-                dstData[dstOffset + i] = srcData[srcOffset + i];
-            }
-        }
-        return dstImg;
-    }
-
-    function potpack(boxes) {
-
-        // calculate total box area and maximum box width
-        var area = 0;
-        var maxWidth = 0;
-
-        for (var i$1 = 0, list = boxes; i$1 < list.length; i$1 += 1) {
-            var box = list[i$1];
-
-            area += box.w * box.h;
-            maxWidth = Math.max(maxWidth, box.w);
-        }
-
-        // sort the boxes for insertion by height, descending
-        boxes.sort(function (a, b) { return b.h - a.h; });
-
-        // aim for a squarish resulting container,
-        // slightly adjusted for sub-100% space utilization
-        var startWidth = Math.max(Math.ceil(Math.sqrt(area / 0.95)), maxWidth);
-
-        // start with a single empty space, unbounded at the bottom
-        var spaces = [{x: 0, y: 0, w: startWidth, h: Infinity}];
-
-        var width = 0;
-        var height = 0;
-
-        for (var i$2 = 0, list$1 = boxes; i$2 < list$1.length; i$2 += 1) {
-            // look through spaces backwards so that we check smaller spaces first
-            var box$1 = list$1[i$2];
-
-            for (var i = spaces.length - 1; i >= 0; i--) {
-                var space = spaces[i];
-
-                // look for empty spaces that can accommodate the current box
-                if (box$1.w > space.w || box$1.h > space.h) { continue; }
-
-                // found the space; add the box to its top-left corner
-                // |-------|-------|
-                // |  box  |       |
-                // |_______|       |
-                // |         space |
-                // |_______________|
-                box$1.x = space.x;
-                box$1.y = space.y;
-
-                height = Math.max(height, box$1.y + box$1.h);
-                width = Math.max(width, box$1.x + box$1.w);
-
-                if (box$1.w === space.w && box$1.h === space.h) {
-                    // space matches the box exactly; remove it
-                    var last = spaces.pop();
-                    if (i < spaces.length) { spaces[i] = last; }
-
-                } else if (box$1.h === space.h) {
-                    // space matches the box height; update it accordingly
-                    // |-------|---------------|
-                    // |  box  | updated space |
-                    // |_______|_______________|
-                    space.x += box$1.w;
-                    space.w -= box$1.w;
-
-                } else if (box$1.w === space.w) {
-                    // space matches the box width; update it accordingly
-                    // |---------------|
-                    // |      box      |
-                    // |_______________|
-                    // | updated space |
-                    // |_______________|
-                    space.y += box$1.h;
-                    space.h -= box$1.h;
-
-                } else {
-                    // otherwise the box splits the space into two spaces
-                    // |-------|-----------|
-                    // |  box  | new space |
-                    // |_______|___________|
-                    // | updated space     |
-                    // |___________________|
-                    spaces.push({
-                        x: space.x + box$1.w,
-                        y: space.y,
-                        w: space.w - box$1.w,
-                        h: box$1.h
-                    });
-                    space.y += box$1.h;
-                    space.h -= box$1.h;
-                }
-                break;
-            }
-        }
-
-        return {
-            w: width, // container width
-            h: height, // container height
-            fill: (area / (width * height)) || 0 // space utilization
-        };
-    }
-
-    var IMAGE_PADDING$1 = 1;
-
-    var ImageAtlas = function ImageAtlas(icons, patterns) {
-        var iconPositions = {}, patternPositions = {};
-        this.haveRenderCallbacks = [];
-
-        var bins = [];
-
-        this.addImages(icons, iconPositions, bins);
-        this.addImages(patterns, patternPositions, bins);
-
-        var ref = potpack(bins);
-        var w = ref.w;
-        var h = ref.h;
-        var image = new RGBAImage({width: w || 1, height: h || 1});
-
-        for (var id in icons) {
-            var src = icons[id];
-            var bin = iconPositions[id].paddedRect;
-            RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x: bin.x + IMAGE_PADDING$1, y: bin.y + IMAGE_PADDING$1}, src.data);
-        }
-
-        for (var id$1 in patterns) {
-            var src$1 = patterns[id$1];
-            var bin$1 = patternPositions[id$1].paddedRect;
-            var x = bin$1.x + IMAGE_PADDING$1,
-                y = bin$1.y + IMAGE_PADDING$1,
-                w$1 = src$1.data.width,
-                h$1 = src$1.data.height;
-
-            RGBAImage.copy(src$1.data, image, {x: 0, y: 0}, {x: x, y: y}, src$1.data);
-            // Add 1 pixel wrapped padding on each side of the image.
-            RGBAImage.copy(src$1.data, image, {x: 0, y: h$1 - 1}, {x: x, y: y - 1}, {width: w$1, height: 1}); // T
-            RGBAImage.copy(src$1.data, image, {x: 0, y: 0}, {x: x, y: y + h$1}, {width: w$1, height: 1}); // B
-            RGBAImage.copy(src$1.data, image, {x: w$1 - 1, y: 0}, {x: x - 1, y: y}, {width: 1, height: h$1}); // L
-            RGBAImage.copy(src$1.data, image, {x: 0, y: 0}, {x: x + w$1, y: y}, {width: 1, height: h$1}); // R
-        }
-
-        this.image = image;
-        this.iconPositions = iconPositions;
-        this.patternPositions = patternPositions;
-    };
-
-    ImageAtlas.prototype.addImages = function addImages(images, positions, bins) {
-        for (var id in images) {
-            var src = images[id];
-            var bin = {
-                x: 0,
-                y: 0,
-                w: src.data.width + 2 * IMAGE_PADDING$1,
-                h: src.data.height + 2 * IMAGE_PADDING$1,
-            };
-            bins.push(bin);
-            positions[id] = new ImagePosition(bin, src);
-
-            if (src.hasRenderCallback) {
-                this.haveRenderCallbacks.push(id);
-            }
-        }
-    };
-
-    ImageAtlas.prototype.patchUpdatedImages = function patchUpdatedImages(imageManager, texture) {
-        imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks);
-        for (var name in imageManager.updatedImages) {
-            this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name), texture);
-            this.patchUpdatedImage(this.patternPositions[name], imageManager.getImage(name), texture);
-        }
-    };
-
-    ImageAtlas.prototype.patchUpdatedImage = function patchUpdatedImage(position, image, texture) {
-        if (!position || !image) {
-            return;
-        }
-
-        if (position.version === image.version) {
-            return;
-        }
-
-        position.version = image.version;
-        var ref = position.tl;
-        var x = ref[0];
-        var y = ref[1];
-        texture.update(image.data, undefined, {x: x, y: y});
-    };
-
-    // http://www.w3.org/TR/css3-color/
-    var kCSSColorTable = {
-        "transparent": [0,0,0,0], "aliceblue": [240,248,255,1],
-        "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1],
-        "aquamarine": [127,255,212,1], "azure": [240,255,255,1],
-        "beige": [245,245,220,1], "bisque": [255,228,196,1],
-        "black": [0,0,0,1], "blanchedalmond": [255,235,205,1],
-        "blue": [0,0,255,1], "blueviolet": [138,43,226,1],
-        "brown": [165,42,42,1], "burlywood": [222,184,135,1],
-        "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1],
-        "chocolate": [210,105,30,1], "coral": [255,127,80,1],
-        "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1],
-        "crimson": [220,20,60,1], "cyan": [0,255,255,1],
-        "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1],
-        "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1],
-        "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1],
-        "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1],
-        "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1],
-        "darkorchid": [153,50,204,1], "darkred": [139,0,0,1],
-        "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1],
-        "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1],
-        "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1],
-        "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1],
-        "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1],
-        "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1],
-        "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1],
-        "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1],
-        "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1],
-        "gold": [255,215,0,1], "goldenrod": [218,165,32,1],
-        "gray": [128,128,128,1], "green": [0,128,0,1],
-        "greenyellow": [173,255,47,1], "grey": [128,128,128,1],
-        "honeydew": [240,255,240,1], "hotpink": [255,105,180,1],
-        "indianred": [205,92,92,1], "indigo": [75,0,130,1],
-        "ivory": [255,255,240,1], "khaki": [240,230,140,1],
-        "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1],
-        "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1],
-        "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1],
-        "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1],
-        "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1],
-        "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1],
-        "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1],
-        "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1],
-        "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1],
-        "lightyellow": [255,255,224,1], "lime": [0,255,0,1],
-        "limegreen": [50,205,50,1], "linen": [250,240,230,1],
-        "magenta": [255,0,255,1], "maroon": [128,0,0,1],
-        "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1],
-        "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1],
-        "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1],
-        "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1],
-        "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1],
-        "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1],
-        "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1],
-        "navy": [0,0,128,1], "oldlace": [253,245,230,1],
-        "olive": [128,128,0,1], "olivedrab": [107,142,35,1],
-        "orange": [255,165,0,1], "orangered": [255,69,0,1],
-        "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1],
-        "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1],
-        "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1],
-        "peachpuff": [255,218,185,1], "peru": [205,133,63,1],
-        "pink": [255,192,203,1], "plum": [221,160,221,1],
-        "powderblue": [176,224,230,1], "purple": [128,0,128,1],
-        "rebeccapurple": [102,51,153,1],
-        "red": [255,0,0,1], "rosybrown": [188,143,143,1],
-        "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1],
-        "salmon": [250,128,114,1], "sandybrown": [244,164,96,1],
-        "seagreen": [46,139,87,1], "seashell": [255,245,238,1],
-        "sienna": [160,82,45,1], "silver": [192,192,192,1],
-        "skyblue": [135,206,235,1], "slateblue": [106,90,205,1],
-        "slategray": [112,128,144,1], "slategrey": [112,128,144,1],
-        "snow": [255,250,250,1], "springgreen": [0,255,127,1],
-        "steelblue": [70,130,180,1], "tan": [210,180,140,1],
-        "teal": [0,128,128,1], "thistle": [216,191,216,1],
-        "tomato": [255,99,71,1], "turquoise": [64,224,208,1],
-        "violet": [238,130,238,1], "wheat": [245,222,179,1],
-        "white": [255,255,255,1], "whitesmoke": [245,245,245,1],
-        "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]};
-
-    function clamp_css_byte(i) {  // Clamp to integer 0 .. 255.
-        i = Math.round(i);  // Seems to be what Chrome does (vs truncation).
-        return i < 0 ? 0 : i > 255 ? 255 : i;
-    }
-
-    function clamp_css_float(f) {  // Clamp to float 0.0 .. 1.0.
-        return f < 0 ? 0 : f > 1 ? 1 : f;
-    }
-
-    function parse_css_int(str) {  // int or percentage.
-        if (str[str.length - 1] === '%')
-            return clamp_css_byte(parseFloat(str) / 100 * 255);
-        return clamp_css_byte(parseInt(str));
-    }
-
-    function parse_css_float(str) {  // float or percentage.
-        if (str[str.length - 1] === '%')
-            return clamp_css_float(parseFloat(str) / 100);
-        return clamp_css_float(parseFloat(str));
-    }
-
-    function css_hue_to_rgb(m1, m2, h) {
-        if (h < 0) h += 1;
-        else if (h > 1) h -= 1;
-
-        if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
-        if (h * 2 < 1) return m2;
-        if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;
-        return m1;
-    }
-
-    function parseCSSColor(css_str) {
-        // Remove all whitespace, not compliant, but should just be more accepting.
-        var str = css_str.replace(/ /g, '').toLowerCase();
-
-        // Color keywords (and transparent) lookup.
-        if (str in kCSSColorTable) return kCSSColorTable[str].slice();  // dup.
-
-        // #abc and #abc123 syntax.
-        if (str[0] === '#') {
-            if (str.length === 4) {
-                var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.
-                if (!(iv >= 0 && iv <= 0xfff)) return null;  // Covers NaN.
-                return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),
-                    (iv & 0xf0) | ((iv & 0xf0) >> 4),
-                    (iv & 0xf) | ((iv & 0xf) << 4),
-                    1];
-            } else if (str.length === 7) {
-                var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.
-                if (!(iv >= 0 && iv <= 0xffffff)) return null;  // Covers NaN.
-                return [(iv & 0xff0000) >> 16,
-                    (iv & 0xff00) >> 8,
-                    iv & 0xff,
-                    1];
-            }
-
-            return null;
-        }
-
-        var op = str.indexOf('('), ep = str.indexOf(')');
-        if (op !== -1 && ep + 1 === str.length) {
-            var fname = str.substr(0, op);
-            var params = str.substr(op+1, ep-(op+1)).split(',');
-            var alpha = 1;  // To allow case fallthrough.
-            switch (fname) {
-                case 'rgba':
-                    if (params.length !== 4) return null;
-                    alpha = parse_css_float(params.pop());
-                // Fall through.
-                case 'rgb':
-                    if (params.length !== 3) return null;
-                    return [parse_css_int(params[0]),
-                        parse_css_int(params[1]),
-                        parse_css_int(params[2]),
-                        alpha];
-                case 'hsla':
-                    if (params.length !== 4) return null;
-                    alpha = parse_css_float(params.pop());
-                // Fall through.
-                case 'hsl':
-                    if (params.length !== 3) return null;
-                    var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360;  // 0 .. 1
-                    // NOTE(deanm): According to the CSS spec s/l should only be
-                    // percentages, but we don't bother and let float or percentage.
-                    var s = parse_css_float(params[1]);
-                    var l = parse_css_float(params[2]);
-                    var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
-                    var m1 = l * 2 - m2;
-                    return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),
-                        clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),
-                        clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),
-                        alpha];
-                default:
-                    return null;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * An RGBA color value. Create instances from color strings using the static
-     * method `Color.parse`. The constructor accepts RGB channel values in the range
-     * `[0, 1]`, premultiplied by A.
-     *
-     * @param {number} r The red channel.
-     * @param {number} g The green channel.
-     * @param {number} b The blue channel.
-     * @param {number} a The alpha channel.
-     * @private
-     */
-    var Color$1 = function Color(r, g, b, a) {
-        if (a === void 0) a = 1;
-
-        this.r = r;
-        this.g = g;
-        this.b = b;
-        this.a = a;
-    };
-
-    /**
-     * Parses valid CSS color strings and returns a `Color` instance.
-     * @returns A `Color` instance, or `undefined` if the input is not a valid color string.
-     */
-    Color$1.parse = function parse(input) {
-        if (!input) {
-            return undefined;
-        }
-
-        if (input instanceof Color$1) {
-            return input;
-        }
-
-        if (typeof input !== 'string') {
-            return undefined;
-        }
-
-        var rgba = parseCSSColor(input);
-        if (!rgba) {
-            return undefined;
-        }
-
-        return new Color$1(
-            rgba[0] / 255 * rgba[3],
-            rgba[1] / 255 * rgba[3],
-            rgba[2] / 255 * rgba[3],
-            rgba[3]
-        );
-    };
-
-    /**
-     * Returns an RGBA string representing the color value.
-     *
-     * @returns An RGBA string.
-     * @example
-     * var purple = new Color.parse('purple');
-     * purple.toString; // = "rgba(128,0,128,1)"
-     * var translucentGreen = new Color.parse('rgba(26, 207, 26, .73)');
-     * translucentGreen.toString(); // = "rgba(26,207,26,0.73)"
-     */
-    Color$1.prototype.toString = function toString() {
-        var ref = this.toArray();
-        var r = ref[0];
-        var g = ref[1];
-        var b = ref[2];
-        var a = ref[3];
-        return ("rgba(" + (Math.round(r)) + "," + (Math.round(g)) + "," + (Math.round(b)) + "," + a + ")");
-    };
-
-    Color$1.prototype.toArray = function toArray() {
-        var ref = this;
-        var r = ref.r;
-        var g = ref.g;
-        var b = ref.b;
-        var a = ref.a;
-        return a === 0 ? [0, 0, 0, 0] : [
-            r * 255 / a,
-            g * 255 / a,
-            b * 255 / a,
-            a
-        ];
-    };
-
-    Color$1.black = new Color$1(0, 0, 0, 1);
-    Color$1.white = new Color$1(1, 1, 1, 1);
-    Color$1.transparent = new Color$1(0, 0, 0, 0);
-    Color$1.red = new Color$1(1, 0, 0, 1);
-
-    var NullType = {kind: 'null'};
-    var NumberType$1 = {kind: 'number'};
-    var StringType = {kind: 'string'};
-    var BooleanType = {kind: 'boolean'};
-    var ColorType$1 = {kind: 'color'};
-    var ObjectType = {kind: 'object'};
-    var ValueType = {kind: 'value'};
-    var FormattedType = {kind: 'formatted'};
-    var ResolvedImageType = {kind: 'resolvedImage'};
-
-    function array(itemType, N) {
-        return {
-            kind: 'array',
-            itemType: itemType,
-            N: N
-        };
-    }
-
-    function toString$2(type) {
-        if (type.kind === 'array') {
-            var itemType = toString$2(type.itemType);
-            return typeof type.N === 'number' ?
-                ("array<" + itemType + ", " + (type.N) + ">") :
-                type.itemType.kind === 'value' ? 'array' : ("array<" + itemType + ">");
-        } else {
-            return type.kind;
-        }
-    }
-
-    var valueMemberTypes = [
-        NullType,
-        NumberType$1,
-        StringType,
-        BooleanType,
-        ColorType$1,
-        FormattedType,
-        ObjectType,
-        array(ValueType),
-        ResolvedImageType
-    ];
-
-    /**
-     * Returns null if `t` is a subtype of `expected`; otherwise returns an
-     * error message.
-     * @private
-     */
-    function checkSubtype(expected, t) {
-        if (t.kind === 'error') {
-            // Error is a subtype of every type
-            return null;
-        } else if (expected.kind === 'array') {
-            if (t.kind === 'array' &&
-                ((t.N === 0 && t.itemType.kind === 'value') || !checkSubtype(expected.itemType, t.itemType)) &&
-                (typeof expected.N !== 'number' || expected.N === t.N)) {
-                return null;
-            }
-        } else if (expected.kind === t.kind) {
-            return null;
-        } else if (expected.kind === 'value') {
-            for (var i = 0, list = valueMemberTypes; i < list.length; i += 1) {
-                var memberType = list[i];
-
-                if (!checkSubtype(memberType, t)) {
-                    return null;
-                }
-            }
-        }
-
-        return ("Expected " + (toString$2(expected)) + " but found " + (toString$2(t)) + " instead.");
-    }
-
-    var Collator = function Collator(caseSensitive       , diacriticSensitive       , locale             ) {
-        if (caseSensitive)
-        { this.sensitivity = diacriticSensitive ? 'variant' : 'case'; }
-        else
-        { this.sensitivity = diacriticSensitive ? 'accent' : 'base'; }
-
-        this.locale = locale;
-        this.collator = new Intl.Collator(this.locale ? this.locale : [],
-            {sensitivity: this.sensitivity, usage: 'search'});
-    };
-
-    Collator.prototype.compare = function compare (lhs      , rhs      )       {
-        return this.collator.compare(lhs, rhs);
-    };
-
-    Collator.prototype.resolvedLocale = function resolvedLocale ()       {
-        // We create a Collator without "usage: search" because we don't want
-        // the search options encoded in our result (e.g. "en-u-co-search")
-        return new Intl.Collator(this.locale ? this.locale : [])
-            .resolvedOptions().locale;
-    };
-
-    var FormattedSection = function FormattedSection(text, image, scale, fontStack, textColor) {
-        this.text = text;
-        this.image = image;
-        this.scale = scale;
-        this.fontStack = fontStack;
-        this.textColor = textColor;
-    };
-
-    var Formatted$1 = function Formatted(sections) {
-        this.sections = sections;
-    };
-
-    Formatted$1.fromString = function fromString(unformatted) {
-        return new Formatted$1([new FormattedSection(unformatted, null, null, null, null)]);
-    };
-
-    Formatted$1.prototype.isEmpty = function isEmpty() {
-        if (this.sections.length === 0) {
-            return true;
-        }
-        return !this.sections.some(function (section) {
-            return section.text.length !== 0 ||
-                (section.image && section.image.name.length !== 0);
-        });
-    };
-
-    Formatted$1.factory = function factory(text) {
-        if (text instanceof Formatted$1) {
-            return text;
-        } else {
-            return Formatted$1.fromString(text);
-        }
-    };
-
-    Formatted$1.prototype.toString = function toString() {
-        if (this.sections.length === 0) {
-            return '';
-        }
-        return this.sections.map(function (section) {
-            return section.text;
-        }).join('');
-    };
-
-    Formatted$1.prototype.serialize = function serialize() {
-        var serialized = ["format"];
-        for (var i = 0, list = this.sections; i < list.length; i += 1) {
-            var section = list[i];
-
-            if (section.image) {
-                serialized.push(["image", section.image.name]);
-                continue;
-            }
-            serialized.push(section.text);
-            var options = {};
-            if (section.fontStack) {
-                options["text-font"] = ["literal", section.fontStack.split(',')];
-            }
-            if (section.scale) {
-                options["font-scale"] = section.scale;
-            }
-            if (section.textColor) {
-                options["text-color"] = (["rgba"]          ).concat(section.textColor.toArray());
-            }
-            serialized.push(options);
-        }
-        return serialized;
-    };
-
-    var ResolvedImage$1 = function ResolvedImage(options) {
-        this.name = options.name;
-        this.available = options.available;
-    };
-
-    ResolvedImage$1.prototype.toString = function toString() {
-        return this.name;
-    };
-
-    ResolvedImage$1.fromString = function fromString(name) {
-        return new ResolvedImage$1({name: name, available: false});
-    };
-
-    ResolvedImage$1.prototype.serialize = function serialize() {
-        return ["image", this.name];
-    };
-
-    var NullType$1 = {kind: 'null'};
-    var NumberType$2 = {kind: 'number'};
-    var StringType$1 = {kind: 'string'};
-    var BooleanType$1 = {kind: 'boolean'};
-    var ColorType$2 = {kind: 'color'};
-    var ObjectType$1 = {kind: 'object'};
-    var ValueType$1 = {kind: 'value'};
-    var CollatorType = {kind: 'collator'};
-    var FormattedType$1 = {kind: 'formatted'};
-    var ResolvedImageType$1 = {kind: 'resolvedImage'};
-
-    function array$1(itemType, N) {
-        return {
-            kind: 'array',
-            itemType: itemType,
-            N: N
-        };
-    }
-
-    function Values$1() {
-    }
-
-    Values$1.validateRGBA = function(r, g, b, a){
-        if (!(
-            typeof r === 'number' && r >= 0 && r <= 255 &&
-                typeof g === 'number' && g >= 0 && g <= 255 &&
-                typeof b === 'number' && b >= 0 && b <= 255
-            )) {
-            var value = typeof a === 'number' ? [r, g, b, a] : [r, g, b];
-            return ("Invalid rgba value [" + (value.join(', ')) + "]: 'r', 'g', and 'b' must be between 0 and 255.");
-        }
-        if (!(
-            typeof a === 'undefined' || (typeof a === 'number' && a >= 0 && a <= 1)
-            )) {
-            return ("Invalid rgba value [" + ([r, g, b, a].join(', ')) + "]: 'a' must be between 0 and 1.");
-        }
-        return null;
-    };
-
-    Values$1.isValue = function(mixed){
-        if (mixed === null) {
-            return true;
-        } else if (typeof mixed === 'string') {
-            return true;
-        } else if (typeof mixed === 'boolean') {
-            return true;
-        } else if (typeof mixed === 'number') {
-            return true;
-        } else if (mixed instanceof Color$1) {
-            return true;
-        } else if (mixed instanceof Collator) {
-            return true;
-        } else if (mixed instanceof Formatted$1) {
-            return true;
-        } else if (mixed instanceof ResolvedImage$1) {
-            return true;
-        } else if (Array.isArray(mixed)) {
-            for (var i = 0, list = mixed; i < list.length; i += 1) {
-                var item = list[i];
-
-                if (!Values$1.isValue(item)) {
-                    return false;
-                }
-            }
-            return true;
-        } else if (typeof mixed === 'object') {
-            for (var key in mixed) {
-                if (!Values$1.isValue(mixed[key])) {
-                    return false;
-                }
-            }
-            return true;
-        } else {
-            return false;
-        }
-    };
-
-    Values$1.typeOf = function(value){
-        if (value === null) {
-            return NullType$1;
-        } else if (typeof value === 'string') {
-            return StringType$1;
-        } else if (typeof value === 'boolean') {
-            return BooleanType$1;
-        } else if (typeof value === 'number') {
-            return NumberType$2;
-        } else if (value instanceof Color$1) {
-            return ColorType$2;
-        } else if (value instanceof Collator) {
-            return CollatorType;
-        } else if (value instanceof Formatted$1) {
-            return FormattedType$1;
-        } else if (value instanceof ResolvedImage$1) {
-            return ResolvedImageType$1;
-        } else if (Array.isArray(value)) {
-            var length = value.length;
-            var itemType;
-
-            for (var i = 0, list = value; i < list.length; i += 1) {
-                var item = list[i];
-
-                var t = Values$1.typeOf(item);
-                if (!itemType) {
-                    itemType = t;
-                } else if (itemType === t) {
-                    continue;
-                } else {
-                    itemType = ValueType$1;
-                    break;
-                }
-            }
-
-            return array$1(itemType || ValueType$1, length);
-        } else {
-            assert_1(typeof value === 'object');
-            return ObjectType$1;
-        }
-    };
-
-    Values$1.toString$1 = function(value){
-        var type = typeof value;
-        if (value === null) {
-            return '';
-        } else if (type === 'string' || type === 'number' || type === 'boolean') {
-            return String(value);
-        } else if (value instanceof Color$1 || value instanceof Formatted$1 || value instanceof ResolvedImage$1) {
-            return value.toString();
-        } else {
-            return JSON.stringify(value);
-        }
-    };
-
-    var NumberType$3 = {kind: 'number'};
-    var StringType$2 = {kind: 'string'};
-    var BooleanType$2 = {kind: 'boolean'};
-    var ObjectType$2 = {kind: 'object'};
-    var ValueType$2 = {kind: 'value'};
-
-    function array$2(itemType, N) {
-        return {
-            kind: 'array',
-            itemType: itemType,
-            N: N
-        };
-    }
-
-    var types = {
-        string: StringType$2,
-        number: NumberType$3,
-        boolean: BooleanType$2,
-        object: ObjectType$2
-    };
-
-    var Assertion = function Assertion(type, args) {
-        this.type = type;
-        this.args = args;
-    };
-
-    Assertion.parse = function parse(args, context) {
-        if (args.length < 2) {
-            return context.error("Expected at least one argument.");
-        }
-
-        var i = 1;
-        var type;
-
-        var name = (args[0] );
-        if (name === 'array') {
-            var itemType;
-            if (args.length > 2) {
-                var type$1 = args[1];
-                if (typeof type$1 !== 'string' || !(type$1 in types) || type$1 === 'object') {
-                    return context.error('The item type argument of "array" must be one of string, number, boolean', 1);
-                }
-                itemType = types[type$1];
-                i++;
-            } else {
-                itemType = ValueType$2;
-            }
-
-            var N;
-            if (args.length > 3) {
-                if (args[2] !== null &&
-                    (typeof args[2] !== 'number' ||
-                        args[2] < 0 ||
-                        args[2] !== Math.floor(args[2]))
-                    ) {
-                    return context.error('The length argument to "array" must be a positive integer literal', 2);
-                }
-                N = args[2];
-                i++;
-            }
-
-            type = array$2(itemType, N);
-        } else {
-            assert_1(types[name], name);
-            type = types[name];
-        }
-
-        var parsed = [];
-        for (; i < args.length; i++) {
-            var input = context.parse(args[i], i, ValueType$2);
-            if (!input) {
-                return null;
-            }
-            parsed.push(input);
-        }
-
-        return new Assertion(type, parsed);
-    };
-
-    Assertion.prototype.evaluate = function evaluate(ctx) {
-        for (var i = 0; i < this.args.length; i++) {
-            var value = this.args[i].evaluate(ctx);
-            var error = checkSubtype(this.type, Values$1.typeOf(value));
-            if (!error) {
-                return value;
-            } else if (i === this.args.length - 1) {
-                throw new RuntimeError(("Expected value to be of type " + (toString(this.type)) + ", but found " + (toString(Values$1.typeOf(value))) + " instead."));
-            }
-        }
-
-        assert_1(false);
-        return null;
-    };
-
-    Assertion.prototype.eachChild = function eachChild(fn) {
-        this.args.forEach(fn);
-    };
-
-    Assertion.prototype.possibleOutputs = function possibleOutputs() {
-        var ref;
-
-        return (ref = []).concat.apply(ref, this.args.map(function (arg) {
-            return arg.possibleOutputs();
-        }));
-    };
-
-    Assertion.prototype.serialize = function serialize() {
-        var type = this.type;
-        var serialized = [type.kind];
-        if (type.kind === 'array') {
-            var itemType = type.itemType;
-            if (itemType.kind === 'string' ||
-                itemType.kind === 'number' ||
-                itemType.kind === 'boolean') {
-                serialized.push(itemType.kind);
-                var N = type.N;
-                if (typeof N === 'number' || this.args.length > 1) {
-                    serialized.push(N);
-                }
-            }
-        }
-        return serialized.concat(this.args.map(function (arg) {
-            return arg.serialize();
-        }));
-    };
-
-    var NumberType$4 = {kind: 'number'};
-    var ValueType$3 = {kind: 'value'};
-
-    function array$3(itemType, N) {
-        return {
-            kind: 'array',
-            itemType: itemType,
-            N: N
-        };
-    }
-
-    var At = function At(type, index, input) {
-        this.type = type;
-        this.index = index;
-        this.input = input;
-    };
-
-    At.parse = function parse(args, context) {
-        if (args.length !== 3) {
-            return context.error(("Expected 2 arguments, but found " + (args.length - 1) + " instead."));
-        }
-
-        var index = context.parse(args[1], 1, NumberType$4);
-        var input = context.parse(args[2], 2, array$3(context.expectedType || ValueType$3));
-
-        if (!index || !input) {
-            return null;
-        }
-
-        var t = (input.type );
-        return new At(t.itemType, index, input);
-    };
-
-    At.prototype.evaluate = function evaluate(ctx) {
-        var index = ((this.index.evaluate(ctx) )    );
-        var array = ((this.input.evaluate(ctx) )          );
-
-        if (index < 0) {
-            throw new RuntimeError(("Array index out of bounds: " + index + " < 0."));
-        }
-
-        if (index >= array.length) {
-            throw new RuntimeError(("Array index out of bounds: " + index + " > " + (array.length - 1) + "."));
-        }
-
-        if (index !== Math.floor(index)) {
-            throw new RuntimeError(("Array index must be an integer, but found " + index + " instead."));
-        }
-
-        return array[index];
-    };
-
-    At.prototype.eachChild = function eachChild(fn) {
-        fn(this.index);
-        fn(this.input);
-    };
-
-    At.prototype.possibleOutputs = function possibleOutputs() {
-        return [undefined];
-    };
-
-    At.prototype.serialize = function serialize() {
-        return ["at", this.index.serialize(), this.input.serialize()];
-    };
-
-    var BooleanType$3 = {kind: 'boolean'};
-
-    var Case = function Case(type, branches, otherwise) {
-        this.type = type;
-        this.branches = branches;
-        this.otherwise = otherwise;
-    };
-
-    Case.parse = function parse(args, context) {
-        if (args.length < 4) {
-            return context.error(("Expected at least 3 arguments, but found only " + (args.length - 1) + "."));
-        }
-        if (args.length % 2 !== 0) {
-            return context.error("Expected an odd number of arguments.");
-        }
-
-        var outputType;
-        if (context.expectedType && context.expectedType.kind !== 'value') {
-            outputType = context.expectedType;
-        }
-
-        var branches = [];
-        for (var i = 1; i < args.length - 1; i += 2) {
-            var test = context.parse(args[i], i, BooleanType$3);
-            if (!test) {
-                return null;
-            }
-
-            var result = context.parse(args[i + 1], i + 1, outputType);
-            if (!result) {
-                return null;
-            }
-
-            branches.push([test, result]);
-
-            outputType = outputType || result.type;
-        }
-
-        var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);
-        if (!otherwise) {
-            return null;
-        }
-
-        assert_1(outputType);
-        return new Case((outputType ), branches, otherwise);
-    };
-
-    Case.prototype.evaluate = function evaluate(ctx) {
-        for (var i = 0, list = this.branches; i < list.length; i += 1) {
-            var ref = list[i];
-            var test = ref[0];
-            var expression = ref[1];
-
-            if (test.evaluate(ctx)) {
-                return expression.evaluate(ctx);
-            }
-        }
-        return this.otherwise.evaluate(ctx);
-    };
-
-    Case.prototype.eachChild = function eachChild(fn) {
-        for (var i = 0, list = this.branches; i < list.length; i += 1) {
-            var ref = list[i];
-            var test = ref[0];
-            var expression = ref[1];
-
-            fn(test);
-            fn(expression);
-        }
-        fn(this.otherwise);
-    };
-
-    Case.prototype.possibleOutputs = function possibleOutputs() {
-        var ref;
-
-        return (ref = [])
-            .concat.apply(ref, this.branches.map(function (ref) {
-                var _ = ref[0];
-                var out = ref[1];
-
-                return out.possibleOutputs();
-            }))
-            .concat(this.otherwise.possibleOutputs());
-    };
-
-    Case.prototype.serialize = function serialize() {
-        var serialized = ["case"];
-        this.eachChild(function (child) {
-            serialized.push(child.serialize());
-        });
-        return serialized;
-    };
-
-    var ValueType$4 = {kind: 'value'};
-
-    var Coalesce = function Coalesce(type, args) {
-        this.type = type;
-        this.args = args;
-    };
-
-    Coalesce.parse = function parse(args, context) {
-        if (args.length < 2) {
-            return context.error("Expectected at least one argument.");
-        }
-        var outputType = (null );
-        var expectedType = context.expectedType;
-        if (expectedType && expectedType.kind !== 'value') {
-            outputType = expectedType;
-        }
-        var parsedArgs = [];
-
-        for (var i = 0, list = args.slice(1); i < list.length; i += 1) {
-            var arg = list[i];
-
-            var parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {typeAnnotation: 'omit'});
-            if (!parsed) {
-                return null;
-            }
-            outputType = outputType || parsed.type;
-            parsedArgs.push(parsed);
-        }
-        assert_1(outputType);
-
-        // Above, we parse arguments without inferred type annotation so that
-        // they don't produce a runtime error for `null` input, which would
-        // preempt the desired null-coalescing behavior.
-        // Thus, if any of our arguments would have needed an annotation, we
-        // need to wrap the enclosing coalesce expression with it instead.
-        var needsAnnotation = expectedType &&
-            parsedArgs.some(function (arg) {
-                return checkSubtype(expectedType, arg.type);
-            });
-
-        return needsAnnotation ?
-            new Coalesce(ValueType$4, parsedArgs) :
-            new Coalesce((outputType ), parsedArgs);
-    };
-
-    Coalesce.prototype.evaluate = function evaluate(ctx) {
-        var result = null;
-        var argCount = 0;
-        var requestedImageName;
-        for (var i = 0, list = this.args; i < list.length; i += 1) {
-            var arg = list[i];
-
-            argCount++;
-            result = arg.evaluate(ctx);
-            // we need to keep track of the first requested image in a coalesce statement
-            // if coalesce can't find a valid image, we return the first image name so styleimagemissing can fire
-            if (result && result instanceof ResolvedImage$1 && !result.available) {
-                if (!requestedImageName) {
-                    requestedImageName = result.name;
-                }
-                result = null;
-                if (argCount === this.args.length) {
-                    result = requestedImageName;
-                }
-            }
-
-            if (result !== null) {
-                break;
-            }
-        }
-        return result;
-    };
-
-    Coalesce.prototype.eachChild = function eachChild(fn) {
-        this.args.forEach(fn);
-    };
-
-    Coalesce.prototype.possibleOutputs = function possibleOutputs() {
-        var ref;
-
-        return (ref = []).concat.apply(ref, this.args.map(function (arg) {
-            return arg.possibleOutputs();
-        }));
-    };
-
-    Coalesce.prototype.serialize = function serialize() {
-        var serialized = ["coalesce"];
-        this.eachChild(function (child) {
-            serialized.push(child.serialize());
-        });
-        return serialized;
-    };
-
-    var NumberType$5 = {kind: 'number'};
-    var StringType$3 = {kind: 'string'};
-    var BooleanType$4 = {kind: 'boolean'};
-    var ColorType$3 = {kind: 'color'};
-    var ValueType$5 = {kind: 'value'};
-
-    var types$1 = {
-        'to-boolean': BooleanType$4,
-        'to-color': ColorType$3,
-        'to-number': NumberType$5,
-        'to-string': StringType$3
-    };
-
-    /**
-     * Special form for error-coalescing coercion expressions "to-number",
-     * "to-color".  Since these coercions can fail at runtime, they accept multiple
-     * arguments, only evaluating one at a time until one succeeds.
-     *
-     * @private
-     */
-    var Coercion = function Coercion(type, args) {
-        this.type = type;
-        this.args = args;
-    };
-
-    Coercion.parse = function parse(args, context) {
-        if (args.length < 2) {
-            return context.error("Expected at least one argument.");
-        }
-
-        var name = (args[0] );
-        assert_1(types$1[name], name);
-
-        if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2) {
-            return context.error("Expected one argument.");
-        }
-
-        var type = types$1[name];
-
-        var parsed = [];
-        for (var i = 1; i < args.length; i++) {
-            var input = context.parse(args[i], i, ValueType$5);
-            if (!input) {
-                return null;
-            }
-            parsed.push(input);
-        }
-
-        return new Coercion(type, parsed);
-    };
-
-    Coercion.prototype.evaluate = function evaluate(ctx) {
-        if (this.type.kind === 'boolean') {
-            return Boolean(this.args[0].evaluate(ctx));
-        } else if (this.type.kind === 'color') {
-            var input;
-            var error;
-            for (var i = 0, list = this.args; i < list.length; i += 1) {
-                var arg = list[i];
-
-                input = arg.evaluate(ctx);
-                error = null;
-                if (input instanceof Color) {
-                    return input;
-                } else if (typeof input === 'string') {
-                    var c = ctx.parseColor(input);
-                    if (c) {
-                        return c;
-                    }
-                } else if (Array.isArray(input)) {
-                    if (input.length < 3 || input.length > 4) {
-                        error = "Invalid rbga value " + (JSON.stringify(input)) + ": expected an array containing either three or four numeric values.";
-                    } else {
-                        error = validateRGBA(input[0], input[1], input[2], input[3]);
-                    }
-                    if (!error) {
-                        return new Color((input[0] ) / 255, (input[1] ) / 255, (input[2] ) / 255, (input[3] ));
-                    }
-                }
-            }
-            throw new RuntimeError(error || ("Could not parse color from value '" + (typeof input === 'string' ? input : String(JSON.stringify(input))) + "'"));
-        } else if (this.type.kind === 'number') {
-            var value = null;
-            for (var i$1 = 0, list$1 = this.args; i$1 < list$1.length; i$1 += 1) {
-                var arg$1 = list$1[i$1];
-
-                value = arg$1.evaluate(ctx);
-                if (value === null) {
-                    return 0;
-                }
-                var num = Number(value);
-                if (isNaN(num)) {
-                    continue;
-                }
-                return num;
-            }
-            throw new RuntimeError(("Could not convert " + (JSON.stringify(value)) + " to number."));
-        } else if (this.type.kind === 'formatted') {
-            // There is no explicit 'to-formatted' but this coercion can be implicitly
-            // created by properties that expect the 'formatted' type.
-            return Formatted.fromString(toString$1(this.args[0].evaluate(ctx)));
-        } else if (this.type.kind === 'resolvedImage') {
-            return ResolvedImage.fromString(toString$1(this.args[0].evaluate(ctx)));
-        } else {
-            return toString$1(this.args[0].evaluate(ctx));
-        }
-    };
-
-    Coercion.prototype.eachChild = function eachChild(fn) {
-        this.args.forEach(fn);
-    };
-
-    Coercion.prototype.possibleOutputs = function possibleOutputs() {
-        var ref;
-
-        return (ref = []).concat.apply(ref, this.args.map(function (arg) {
-            return arg.possibleOutputs();
-        }));
-    };
-
-    Coercion.prototype.serialize = function serialize() {
-        if (this.type.kind === 'formatted') {
-            return new FormatExpression([
-                {content: this.args[0], scale: null, font: null, textColor: null}
-            ]).serialize();
-        }
-
-        if (this.type.kind === 'resolvedImage') {
-            return new ImageExpression(this.args[0]).serialize();
-        }
-
-        var serialized = [("to-" + (this.type.kind))];
-        this.eachChild(function (child) {
-            serialized.push(child.serialize());
-        });
-        return serialized;
-    };
-
-    var StringType$4 = {kind: 'string'};
-    var BooleanType$5 = {kind: 'boolean'};
-    var CollatorType$1 = {kind: 'collator'};
-
-    var CollatorExpression = function CollatorExpression(caseSensitive, diacriticSensitive, locale) {
-        this.type = CollatorType$1;
-        this.locale = locale;
-        this.caseSensitive = caseSensitive;
-        this.diacriticSensitive = diacriticSensitive;
-    };
-
-    CollatorExpression.parse = function parse(args, context) {
-        if (args.length !== 2) {
-            return context.error("Expected one argument.");
-        }
-
-        var options = (args[1] );
-        if (typeof options !== "object" || Array.isArray(options)) {
-            return context.error("Collator options argument must be an object.");
-        }
-
-        var caseSensitive = context.parse(
-            options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType$5);
-        if (!caseSensitive) {
-            return null;
-        }
-
-        var diacriticSensitive = context.parse(
-            options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType$5);
-        if (!diacriticSensitive) {
-            return null;
-        }
-
-        var locale = null;
-        if (options['locale']) {
-            locale = context.parse(options['locale'], 1, StringType$4);
-            if (!locale) {
-                return null;
-            }
-        }
-
-        return new CollatorExpression(caseSensitive, diacriticSensitive, locale);
-    };
-
-    CollatorExpression.prototype.evaluate = function evaluate(ctx) {
-        return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null);
-    };
-
-    CollatorExpression.prototype.eachChild = function eachChild(fn) {
-        fn(this.caseSensitive);
-        fn(this.diacriticSensitive);
-        if (this.locale) {
-            fn(this.locale);
-        }
-    };
-
-    CollatorExpression.prototype.possibleOutputs = function possibleOutputs() {
-        // Technically the set of possible outputs is the combinatoric set of Collators produced
-        // by all possibleOutputs of locale/caseSensitive/diacriticSensitive
-        // But for the primary use of Collators in comparison operators, we ignore the Collator's
-        // possibleOutputs anyway, so we can get away with leaving this undefined for now.
-        return [undefined];
-    };
-
-    CollatorExpression.prototype.serialize = function serialize() {
-        var options = {};
-        options['case-sensitive'] = this.caseSensitive.serialize();
-        options['diacritic-sensitive'] = this.diacriticSensitive.serialize();
-        if (this.locale) {
-            options['locale'] = this.locale.serialize();
-        }
-        return ["collator", options];
-    };
-
-    var BooleanType$6 = {kind: 'boolean'};
-    var ValueType$6 = {kind: 'value'};
-    var CollatorType$2 = {kind: 'collator'};
-
-    function isComparableType$1(op, type) {
-        if (op === '==' || op === '!=') {
-            // equality operator
-            return type.kind === 'boolean' ||
-                type.kind === 'string' ||
-                type.kind === 'number' ||
-                type.kind === 'null' ||
-                type.kind === 'value';
-        } else {
-            // ordering operator
-            return type.kind === 'string' ||
-                type.kind === 'number' ||
-                type.kind === 'value';
-        }
-    }
-
-    function eq(ctx, a, b) {
-        return a === b;
-    }
-    function neq(ctx, a, b) {
-        return a !== b;
-    }
-    function lt(ctx, a, b) {
-        return a < b;
-    }
-    function gt(ctx, a, b) {
-        return a > b;
-    }
-    function lteq(ctx, a, b) {
-        return a <= b;
-    }
-    function gteq(ctx, a, b) {
-        return a >= b;
-    }
-
-    function eqCollate(ctx, a, b, c) {
-        return c.compare(a, b) === 0;
-    }
-    function neqCollate(ctx, a, b, c) {
-        return !eqCollate(ctx, a, b, c);
-    }
-    function ltCollate(ctx, a, b, c) {
-        return c.compare(a, b) < 0;
-    }
-    function gtCollate(ctx, a, b, c) {
-        return c.compare(a, b) > 0;
-    }
-    function lteqCollate(ctx, a, b, c) {
-        return c.compare(a, b) <= 0;
-    }
-    function gteqCollate(ctx, a, b, c) {
-        return c.compare(a, b) >= 0;
-    }
-
-    /**
-     * Special form for comparison operators, implementing the signatures:
-     * - (T, T, ?Collator) => boolean
-     * - (T, value, ?Collator) => boolean
-     * - (value, T, ?Collator) => boolean
-     *
-     * For inequalities, T must be either value, string, or number. For ==/!=, it
-     * can also be boolean or null.
-     *
-     * Equality semantics are equivalent to Javascript's strict equality (===/!==)
-     * -- i.e., when the arguments' types don't match, == evaluates to false, != to
-     * true.
-     *
-     * When types don't match in an ordering comparison, a runtime error is thrown.
-     *
-     * @private
-     */
-    function makeComparison(op, compareBasic, compareWithCollator) {
-        var isOrderComparison = op !== '==' && op !== '!=';
-
-        return /*@__PURE__*/(function () {
-            function Comparison(lhs, rhs, collator) {
-                this.type = BooleanType$6;
-                this.lhs = lhs;
-                this.rhs = rhs;
-                this.collator = collator;
-                this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value';
-            }
-
-            Comparison.parse = function parse(args, context) {
-                if (args.length !== 3 && args.length !== 4) {
-                    return context.error("Expected two or three arguments.");
-                }
-
-                var op = (args[0]     );
-
-                var lhs = context.parse(args[1], 1, ValueType$6);
-                if (!lhs) {
-                    return null;
-                }
-                if (!isComparableType$1(op, lhs.type)) {
-                    return context.concat(1).error(("\"" + op + "\" comparisons are not supported for type '" + (toString(lhs.type)) + "'."));
-                }
-                var rhs = context.parse(args[2], 2, ValueType$6);
-                if (!rhs) {
-                    return null;
-                }
-                if (!isComparableType$1(op, rhs.type)) {
-                    return context.concat(2).error(("\"" + op + "\" comparisons are not supported for type '" + (toString(rhs.type)) + "'."));
-                }
-
-                if (
-                    lhs.type.kind !== rhs.type.kind &&
-                        lhs.type.kind !== 'value' &&
-                        rhs.type.kind !== 'value'
-                    ) {
-                    return context.error(("Cannot compare types '" + (toString(lhs.type)) + "' and '" + (toString(rhs.type)) + "'."));
-                }
-
-                if (isOrderComparison) {
-                    // typing rules specific to less/greater than operators
-                    if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') {
-                        // (value, T)
-                        lhs = new Assertion(rhs.type, [lhs]);
-                    } else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') {
-                        // (T, value)
-                        rhs = new Assertion(lhs.type, [rhs]);
-                    }
-                }
-
-                var collator = null;
-                if (args.length === 4) {
-                    if (
-                        lhs.type.kind !== 'string' &&
-                            rhs.type.kind !== 'string' &&
-                            lhs.type.kind !== 'value' &&
-                            rhs.type.kind !== 'value'
-                        ) {
-                        return context.error("Cannot use collator to compare non-string types.");
-                    }
-                    collator = context.parse(args[3], 3, CollatorType$2);
-                    if (!collator) {
-                        return null;
-                    }
-                }
-
-                return new Comparison(lhs, rhs, collator);
-            };
-
-            Comparison.prototype.evaluate = function evaluate(ctx) {
-                var lhs = this.lhs.evaluate(ctx);
-                var rhs = this.rhs.evaluate(ctx);
-
-                if (isOrderComparison && this.hasUntypedArgument) {
-                    var lt = Values$1.typeOf(lhs);
-                    var rt = Values$1.typeOf(rhs);
-                    // check that type is string or number, and equal
-                    if (lt.kind !== rt.kind || !(lt.kind === 'string' || lt.kind === 'number')) {
-                        throw new RuntimeError(("Expected arguments for \"" + op + "\" to be (string, string) or (number, number), but found (" + (lt.kind) + ", " + (rt.kind) + ") instead."));
-                    }
-                }
-
-                if (this.collator && !isOrderComparison && this.hasUntypedArgument) {
-                    var lt$1 = Values$1.typeOf(lhs);
-                    var rt$1 = Values$1.typeOf(rhs);
-                    if (lt$1.kind !== 'string' || rt$1.kind !== 'string') {
-                        return compareBasic(ctx, lhs, rhs);
-                    }
-                }
-
-                return this.collator ?
-                    compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) :
-                    compareBasic(ctx, lhs, rhs);
-            };
-
-            Comparison.prototype.eachChild = function eachChild(fn) {
-                fn(this.lhs);
-                fn(this.rhs);
-                if (this.collator) {
-                    fn(this.collator);
-                }
-            };
-
-            Comparison.prototype.possibleOutputs = function possibleOutputs() {
-                return [true, false];
-            };
-
-            Comparison.prototype.serialize = function serialize() {
-                var serialized = [op];
-                this.eachChild(function (child) {
-                    serialized.push(child.serialize());
-                });
-                return serialized;
-            };
-
-            return Comparison;
-        }());
-    }
-
-    var ComparisonEnum = {
-    };
-    ComparisonEnum.Equals = makeComparison('==', eq, eqCollate);
-    ComparisonEnum.NotEquals = makeComparison('!=', neq, neqCollate);
-    ComparisonEnum.LessThan = makeComparison('<', lt, ltCollate);
-    ComparisonEnum.GreaterThan = makeComparison('>', gt, gtCollate);
-    ComparisonEnum.LessThanOrEqual = makeComparison('<=', lteq, lteqCollate);
-    ComparisonEnum.GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate);
-
-    var NumberType$6 = {kind: 'number'};
-    var StringType$5 = {kind: 'string'};
-    var ColorType$4 = {kind: 'color'};
-    var ValueType$7 = {kind: 'value'};
-    var FormattedType$2 = {kind: 'formatted'};
-    var ResolvedImageType$2 = {kind: 'resolvedImage'};
-
-    function array$4(itemType, N) {
-        return {
-            kind: 'array',
-            itemType: itemType,
-            N: N
-        };
-    }
-
-    var FormatExpression$1 = function FormatExpression(sections) {
-        this.type = FormattedType$2;
-        this.sections = sections;
-    };
-
-    FormatExpression$1.parse = function parse(args, context) {
-        if (args.length < 2) {
-            return context.error("Expected at least one argument.");
-        }
-
-        var firstArg = args[1];
-        if (!Array.isArray(firstArg) && typeof firstArg === 'object') {
-            return context.error("First argument must be an image or text section.");
-        }
-
-        var sections = [];
-        var nextTokenMayBeObject = false;
-        for (var i = 1; i <= args.length - 1; ++i) {
-            var arg = (args[i] );
-
-            if (nextTokenMayBeObject && typeof arg === "object" && !Array.isArray(arg)) {
-                nextTokenMayBeObject = false;
-
-                var scale = null;
-                if (arg['font-scale']) {
-                    scale = context.parse(arg['font-scale'], 1, NumberType$6);
-                    if (!scale) {
-                        return null;
-                    }
-                }
-
-                var font = null;
-                if (arg['text-font']) {
-                    font = context.parse(arg['text-font'], 1, array$4(StringType$5));
-                    if (!font) {
-                        return null;
-                    }
-                }
-
-                var textColor = null;
-                if (arg['text-color']) {
-                    textColor = context.parse(arg['text-color'], 1, ColorType$4);
-                    if (!textColor) {
-                        return null;
-                    }
-                }
-
-                var lastExpression = sections[sections.length - 1];
-                lastExpression.scale = scale;
-                lastExpression.font = font;
-                lastExpression.textColor = textColor;
-            } else {
-                var content = context.parse(args[i], 1, ValueType$7);
-                if (!content) {
-                    return null;
-                }
-
-                var kind = content.type.kind;
-                if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage') {
-                    return context.error("Formatted text type must be 'string', 'value', 'image' or 'null'.");
-                }
-
-                nextTokenMayBeObject = true;
-                sections.push({content: content, scale: null, font: null, textColor: null});
-            }
-        }
-
-        return new FormatExpression$1(sections);
-    };
-
-    FormatExpression$1.prototype.evaluate = function evaluate(ctx) {
-        var evaluateSection = function (section) {
-            var evaluatedContent = section.content.evaluate(ctx);
-            if (Values$1.typeOf(evaluatedContent) === ResolvedImageType$2) {
-                return new FormattedSection('', evaluatedContent, null, null, null);
-            }
-
-            return new FormattedSection(
-                Values$1.toString$1(evaluatedContent),
-                null,
-                section.scale ? section.scale.evaluate(ctx) : null,
-                section.font ? section.font.evaluate(ctx).join(',') : null,
-                section.textColor ? section.textColor.evaluate(ctx) : null
-            );
-        };
-
-        return new Formatted$1(this.sections.map(evaluateSection));
-    };
-
-    FormatExpression$1.prototype.eachChild = function eachChild(fn) {
-        for (var i = 0, list = this.sections; i < list.length; i += 1) {
-            var section = list[i];
-
-            fn(section.content);
-            if (section.scale) {
-                fn(section.scale);
-            }
-            if (section.font) {
-                fn(section.font);
-            }
-            if (section.textColor) {
-                fn(section.textColor);
-            }
-        }
-    };
-
-    FormatExpression$1.prototype.possibleOutputs = function possibleOutputs() {
-        // Technically the combinatoric set of all children
-        // Usually, this.text will be undefined anyway
-        return [undefined];
-    };
-
-    FormatExpression$1.prototype.serialize = function serialize() {
-        var serialized = ["format"];
-        for (var i = 0, list = this.sections; i < list.length; i += 1) {
-            var section = list[i];
-
-            serialized.push(section.content.serialize());
-            var options = {};
-            if (section.scale) {
-                options['font-scale'] = section.scale.serialize();
-            }
-            if (section.font) {
-                options['text-font'] = section.font.serialize();
-            }
-            if (section.textColor) {
-                options['text-color'] = section.textColor.serialize();
-            }
-            serialized.push(options);
-        }
-        return serialized;
-    };
-
-    var StringType$6 = {kind: 'string'};
-    var ResolvedImageType$3 = {kind: 'resolvedImage'};
-
-    var ImageExpression$1 = function ImageExpression(input) {
-        this.type = ResolvedImageType$3;
-        this.input = input;
-    };
-
-    ImageExpression$1.parse = function parse(args, context) {
-        if (args.length !== 2) {
-            return context.error("Expected two arguments.");
-        }
-
-        var name = context.parse(args[1], 1, StringType$6);
-        if (!name) {
-            return context.error("No image name provided.");
-        }
-
-        return new ImageExpression$1(name);
-    };
-
-    ImageExpression$1.prototype.evaluate = function evaluate(ctx) {
-        var evaluatedImageName = this.input.evaluate(ctx);
-        var available = false;
-
-        if (ctx.availableImages && ctx.availableImages.indexOf(evaluatedImageName) > -1) {
-            available = true;
-        }
-
-        return new ResolvedImage$1({name: evaluatedImageName, available: available});
-    };
-
-    ImageExpression$1.prototype.eachChild = function eachChild(fn) {
-        fn(this.input);
-    };
-
-    ImageExpression$1.prototype.possibleOutputs = function possibleOutputs() {
-        // The output of image is determined by the list of available images in the evaluation context
-        return [undefined];
-    };
-
-    ImageExpression$1.prototype.serialize = function serialize() {
-        return ["image", this.input.serialize()];
-    };
-
-    var Interpolate$1 = function Interpolate(type, operator, interpolation, input, stops) {
-        this.type = type;
-        this.operator = operator;
-        this.interpolation = interpolation;
-        this.input = input;
-
-        this.labels = [];
-        this.outputs = [];
-        for (var i = 0, list = stops; i < list.length; i += 1) {
-            var ref = list[i];
-            var label = ref[0];
-            var expression = ref[1];
-
-            this.labels.push(label);
-            this.outputs.push(expression);
-        }
-    };
-
-    Interpolate$1.interpolationFactor = function interpolationFactor(interpolation, input, lower, upper) {
-        var t = 0;
-        if (interpolation.name === 'exponential') {
-            t = exponentialInterpolation(input, interpolation.base, lower, upper);
-        } else if (interpolation.name === 'linear') {
-            t = exponentialInterpolation(input, 1, lower, upper);
-        } else if (interpolation.name === 'cubic-bezier') {
-            var c = interpolation.controlPoints;
-            var ub = new unitbezier(c[0], c[1], c[2], c[3]);
-            t = ub.solve(exponentialInterpolation(input, 1, lower, upper));
-        }
-        return t;
-    };
-
-    Interpolate$1.parse = function parse(args, context) {
-        var operator = args[0];
-        var interpolation = args[1];
-        var input = args[2];
-        var rest = args.slice(3);
-
-        if (!Array.isArray(interpolation) || interpolation.length === 0) {
-            return context.error("Expected an interpolation type expression.", 1);
-        }
-
-        if (interpolation[0] === 'linear') {
-            interpolation = {name: 'linear'};
-        } else if (interpolation[0] === 'exponential') {
-            var base = interpolation[1];
-            if (typeof base !== 'number') {
-                return context.error("Exponential interpolation requires a numeric base.", 1, 1);
-            }
-            interpolation = {
-                name: 'exponential',
-                base: base
-            };
-        } else if (interpolation[0] === 'cubic-bezier') {
-            var controlPoints = interpolation.slice(1);
-            if (
-                controlPoints.length !== 4 ||
-                    controlPoints.some(function (t) {
-                        return typeof t !== 'number' || t < 0 || t > 1;
-                    })
-                ) {
-                return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1);
-            }
-
-            interpolation = {
-                name: 'cubic-bezier',
-                controlPoints: (controlPoints )
-            };
-        } else {
-            return context.error(("Unknown interpolation type " + (String(interpolation[0]))), 1, 0);
-        }
-
-        if (args.length - 1 < 4) {
-            return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + "."));
-        }
-
-        if ((args.length - 1) % 2 !== 0) {
-            return context.error("Expected an even number of arguments.");
-        }
-
-        input = context.parse(input, 2, NumberType);
-        if (!input) {
-            return null;
-        }
-
-        var stops = [];
-
-        var outputType = (null );
-        if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') {
-            outputType = ColorType;
-        } else if (context.expectedType && context.expectedType.kind !== 'value') {
-            outputType = context.expectedType;
-        }
-
-        for (var i = 0; i < rest.length; i += 2) {
-            var label = rest[i];
-            var value = rest[i + 1];
-
-            var labelKey = i + 3;
-            var valueKey = i + 4;
-
-            if (typeof label !== 'number') {
-                return context.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);
-            }
-
-            if (stops.length && stops[stops.length - 1][0] >= label) {
-                return context.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.', labelKey);
-            }
-
-            var parsed = context.parse(value, valueKey, outputType);
-            if (!parsed) {
-                return null;
-            }
-            outputType = outputType || parsed.type;
-            stops.push([label, parsed]);
-        }
-
-        if (outputType.kind !== 'number' &&
-            outputType.kind !== 'color' && !(
-            outputType.kind === 'array' &&
-                outputType.itemType.kind === 'number' &&
-                typeof outputType.N === 'number'
-            )
-            ) {
-            return context.error(("Type " + (toString(outputType)) + " is not interpolatable."));
-        }
-
-        return new Interpolate$1(outputType, (operator ), interpolation, input, stops);
-    };
-
-    Interpolate$1.prototype.evaluate = function evaluate(ctx) {
-        var labels = this.labels;
-        var outputs = this.outputs;
-
-        if (labels.length === 1) {
-            return outputs[0].evaluate(ctx);
-        }
-
-        var value = ((this.input.evaluate(ctx) )    );
-        if (value <= labels[0]) {
-            return outputs[0].evaluate(ctx);
-        }
-
-        var stopCount = labels.length;
-        if (value >= labels[stopCount - 1]) {
-            return outputs[stopCount - 1].evaluate(ctx);
-        }
-
-        var index = findStopLessThanOrEqualTo(labels, value);
-        var lower = labels[index];
-        var upper = labels[index + 1];
-        var t = Interpolate$1.interpolationFactor(this.interpolation, value, lower, upper);
-
-        var outputLower = outputs[index].evaluate(ctx);
-        var outputUpper = outputs[index + 1].evaluate(ctx);
-
-        if (this.operator === 'interpolate') {
-            return (interpolate[this.type.kind.toLowerCase()] )(outputLower, outputUpper, t); // eslint-disable-line import/namespace
-        } else if (this.operator === 'interpolate-hcl') {
-            return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t));
-        } else {
-            return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t));
-        }
-    };
-
-    Interpolate$1.prototype.eachChild = function eachChild(fn) {
-        fn(this.input);
-        for (var i = 0, list = this.outputs; i < list.length; i += 1) {
-            var expression = list[i];
-
-            fn(expression);
-        }
-    };
-
-    Interpolate$1.prototype.possibleOutputs = function possibleOutputs() {
-        var ref;
-
-        return (ref = []).concat.apply(ref, this.outputs.map(function (output) {
-            return output.possibleOutputs();
-        }));
-    };
-
-    Interpolate$1.prototype.serialize = function serialize() {
-        var interpolation;
-        if (this.interpolation.name === 'linear') {
-            interpolation = ["linear"];
-        } else if (this.interpolation.name === 'exponential') {
-            if (this.interpolation.base === 1) {
-                interpolation = ["linear"];
-            } else {
-                interpolation = ["exponential", this.interpolation.base];
-            }
-        } else {
-            interpolation = ["cubic-bezier" ].concat(this.interpolation.controlPoints);
-        }
-
-        var serialized = [this.operator, interpolation, this.input.serialize()];
-
-        for (var i = 0; i < this.labels.length; i++) {
-            serialized.push(
-                this.labels[i],
-                this.outputs[i].serialize()
-            );
-        }
-        return serialized;
-    };
-
-    /**
-     * Returns a ratio that can be used to interpolate between exponential function
-     * stops.
-     * How it works: Two consecutive stop values define a (scaled and shifted) exponential function `f(x) = a * base^x + b`, where `base` is the user-specified base,
-     * and `a` and `b` are constants affording sufficient degrees of freedom to fit
-     * the function to the given stops.
-     *
-     * Here's a bit of algebra that lets us compute `f(x)` directly from the stop
-     * values without explicitly solving for `a` and `b`:
-     *
-     * First stop value: `f(x0) = y0 = a * base^x0 + b`
-     * Second stop value: `f(x1) = y1 = a * base^x1 + b`
-     * => `y1 - y0 = a(base^x1 - base^x0)`
-     * => `a = (y1 - y0)/(base^x1 - base^x0)`
-     *
-     * Desired value: `f(x) = y = a * base^x + b`
-     * => `f(x) = y0 + a * (base^x - base^x0)`
-     *
-     * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a
-     * little algebra:
-     * ```
-     * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0)
-     *                     = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0)
-     * ```
-     *
-     * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have
-     * `f(x) = y0 + (y1 - y0) * ratio`.  In other words, `ratio` may be treated as
-     * an interpolation factor between the two stops' output values.
-     *
-     * (Note: a slightly different form for `ratio`,
-     * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer
-     * expensive `Math.pow()` operations.)
-     *
-     * @private
-     */
-    function exponentialInterpolation(input, base, lowerValue, upperValue) {
-        var difference = upperValue - lowerValue;
-        var progress = input - lowerValue;
-
-        if (difference === 0) {
-            return 0;
-        } else if (base === 1) {
-            return progress / difference;
-        } else {
-            return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);
-        }
-    }
-
-    var BooleanType$7 = {kind: 'boolean'};
-    var ValueType$8 = {kind: 'value'};
-
-    function isComparableType(type) {
-        return type.kind === 'boolean' ||
-            type.kind === 'string' ||
-            type.kind === 'number' ||
-            type.kind === 'null' ||
-            type.kind === 'value';
-    }
-
-    function isComparableRuntimeValue(needle) {
-        return typeof needle === 'boolean' ||
-            typeof needle === 'string' ||
-            typeof needle === 'number';
-    }
-
-    function isSearchableRuntimeValue(haystack) {
-        return Array.isArray(haystack) ||
-            typeof haystack === 'string';
-    }
-
-    var In = function In(needle, haystack) {
-        this.type = BooleanType$7;
-        this.needle = needle;
-        this.haystack = haystack;
-    };
-
-    In.parse = function parse(args, context) {
-        if (args.length !== 3) {
-            return context.error(("Expected 2 arguments, but found " + (args.length - 1) + " instead."));
-        }
-
-        var needle = context.parse(args[1], 1, ValueType$8);
-
-        var haystack = context.parse(args[2], 2, ValueType$8);
-
-        if (!needle || !haystack) {
-            return null;
-        }
-
-        if (!isComparableType(needle.type)) {
-            return context.error(("Expected first argument to be of type boolean, string, number or null, but found " + (toString(needle.type)) + " instead"));
-        }
-
-        return new In(needle, haystack);
-    };
-
-    In.prototype.evaluate = function evaluate(ctx) {
-        var needle = (this.needle.evaluate(ctx) );
-        var haystack = (this.haystack.evaluate(ctx) );
-
-        if (!needle || !haystack) {
-            return false;
-        }
-
-        if (!isComparableRuntimeValue(needle)) {
-            throw new RuntimeError(("Expected first argument to be of type boolean, string or number, but found " + (toString(typeOf(needle))) + " instead."));
-        }
-
-        if (!isSearchableRuntimeValue(haystack)) {
-            throw new RuntimeError(("Expected second argument to be of type array or string, but found " + (toString(typeOf(haystack))) + " instead."));
-        }
-
-        return haystack.indexOf(needle) >= 0;
-    };
-
-    In.prototype.eachChild = function eachChild(fn) {
-        fn(this.needle);
-        fn(this.haystack);
-    };
-
-    In.prototype.possibleOutputs = function possibleOutputs() {
-        return [true, false];
-    };
-
-    In.prototype.serialize = function serialize() {
-        return ["in", this.needle.serialize(), this.haystack.serialize()];
-    };
-
-    var Let = function Let(bindings, result) {
-        this.type = result.type;
-        this.bindings = [].concat(bindings);
-        this.result = result;
-    };
-
-    Let.prototype.evaluate = function evaluate(ctx) {
-        return this.result.evaluate(ctx);
-    };
-
-    Let.prototype.eachChild = function eachChild(fn) {
-        for (var i = 0, list = this.bindings; i < list.length; i += 1) {
-            var binding = list[i];
-
-            fn(binding[1]);
-        }
-        fn(this.result);
-    };
-
-    Let.parse = function parse(args, context) {
-        if (args.length < 4) {
-            return context.error(("Expected at least 3 arguments, but found " + (args.length - 1) + " instead."));
-        }
-
-        var bindings = [];
-        for (var i = 1; i < args.length - 1; i += 2) {
-            var name = args[i];
-
-            if (typeof name !== 'string') {
-                return context.error(("Expected string, but found " + (typeof name) + " instead."), i);
-            }
-
-            if (/[^a-zA-Z0-9_]/.test(name)) {
-                return context.error("Variable names must contain only alphanumeric characters or '_'.", i);
-            }
-
-            var value = context.parse(args[i + 1], i + 1);
-            if (!value) {
-                return null;
-            }
-
-            bindings.push([name, value]);
-        }
-
-        var result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings);
-        if (!result) {
-            return null;
-        }
-
-        return new Let(bindings, result);
-    };
-
-    Let.prototype.possibleOutputs = function possibleOutputs() {
-        return this.result.possibleOutputs();
-    };
-
-    Let.prototype.serialize = function serialize() {
-        var serialized = ["let"];
-        for (var i = 0, list = this.bindings; i < list.length; i += 1) {
-            var ref = list[i];
-            var name = ref[0];
-            var expr = ref[1];
-
-            serialized.push(name, expr.serialize());
-        }
-        serialized.push(this.result.serialize());
-        return serialized;
-    };
-
-    var NumberType$7 = {kind: 'number'};
-
-    var Length = function Length(input) {
-        this.type = NumberType$7;
-        this.input = input;
-    };
-
-    Length.parse = function parse(args, context) {
-        if (args.length !== 2) {
-            return context.error(("Expected 1 argument, but found " + (args.length - 1) + " instead."));
-        }
-
-        var input = context.parse(args[1], 1);
-        if (!input) {
-            return null;
-        }
-
-        if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value') {
-            return context.error(("Expected argument of type string or array, but found " + (toString(input.type)) + " instead."));
-        }
-
-        return new Length(input);
-    };
-
-    Length.prototype.evaluate = function evaluate(ctx) {
-        var input = this.input.evaluate(ctx);
-        if (typeof input === 'string') {
-            return input.length;
-        } else if (Array.isArray(input)) {
-            return input.length;
-        } else {
-            throw new RuntimeError(("Expected value to be of type string or array, but found " + (toString(typeOf(input))) + " instead."));
-        }
-    };
-
-    Length.prototype.eachChild = function eachChild(fn) {
-        fn(this.input);
-    };
-
-    Length.prototype.possibleOutputs = function possibleOutputs() {
-        return [undefined];
-    };
-
-    Length.prototype.serialize = function serialize() {
-        var serialized = ["length"];
-        this.eachChild(function (child) {
-            serialized.push(child.serialize());
-        });
-        return serialized;
-    };
-
-    var Literal = function Literal(type, value) {
-        this.type = type;
-        this.value = value;
-    };
-
-    Literal.parse = function parse(args, context) {
-        if (args.length !== 2) {
-            return context.error(("'literal' expression requires exactly one argument, but found " + (args.length - 1) + " instead."));
-        }
-
-        if (!Values$1.isValue(args[1])) {
-            return context.error("invalid value");
-        }
-
-        var value = (args[1] );
-        var type = Values$1.typeOf(value);
-
-        // special case: infer the item type if possible for zero-length arrays
-        var expected = context.expectedType;
-        if (
-            type.kind === 'array' &&
-                type.N === 0 &&
-                expected &&
-                expected.kind === 'array' &&
-                (typeof expected.N !== 'number' || expected.N === 0)
-            ) {
-            type = expected;
-        }
-
-        return new Literal(type, value);
-    };
-
-    Literal.prototype.evaluate = function evaluate() {
-        return this.value;
-    };
-
-    Literal.prototype.eachChild = function eachChild() {
-    };
-
-    Literal.prototype.possibleOutputs = function possibleOutputs() {
-        return [this.value];
-    };
-
-    Literal.prototype.serialize = function serialize() {
-        if (this.type.kind === 'array' || this.type.kind === 'object') {
-            return ["literal", this.value];
-        } else if (this.value instanceof Color) {
-            // Constant-folding can generate Literal expressions that you
-            // couldn't actually generate with a "literal" expression,
-            // so we have to implement an equivalent serialization here
-            return ["rgba"].concat(this.value.toArray());
-        } else if (this.value instanceof Formatted$1) {
-            // Same as Color
-            return this.value.serialize();
-        } else {
-            assert_1(this.value === null ||
-                typeof this.value === 'string' ||
-                typeof this.value === 'number' ||
-                typeof this.value === 'boolean');
-            return (this.value );
-        }
-    };
-
-    var ValueType$9 = {kind: 'value'};
-
-    // Map input label values to output expression index
-    var Match = function Match(inputType, outputType, input, cases, outputs, otherwise) {
-        this.inputType = inputType;
-        this.type = outputType;
-        this.input = input;
-        this.cases = cases;
-        this.outputs = outputs;
-        this.otherwise = otherwise;
-    };
-
-    Match.parse = function parse(args, context) {
-        if (args.length < 5) {
-            return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + "."));
-        }
-        if (args.length % 2 !== 1) {
-            return context.error("Expected an even number of arguments.");
-        }
-
-        var inputType;
-        var outputType;
-        if (context.expectedType && context.expectedType.kind !== 'value') {
-            outputType = context.expectedType;
-        }
-        var cases = {};
-        var outputs = [];
-        for (var i = 2; i < args.length - 1; i += 2) {
-            var labels = args[i];
-            var value = args[i + 1];
-
-            if (!Array.isArray(labels)) {
-                labels = [labels];
-            }
-
-            var labelContext = context.concat(i);
-            if (labels.length === 0) {
-                return labelContext.error('Expected at least one branch label.');
-            }
-
-            for (var i$1 = 0, list = labels; i$1 < list.length; i$1 += 1) {
-                var label = list[i$1];
-
-                if (typeof label !== 'number' && typeof label !== 'string') {
-                    return labelContext.error("Branch labels must be numbers or strings.");
-                } else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) {
-                    return labelContext.error(("Branch labels must be integers no larger than " + (Number.MAX_SAFE_INTEGER) + "."));
-
-                } else if (typeof label === 'number' && Math.floor(label) !== label) {
-                    return labelContext.error("Numeric branch labels must be integer values.");
-
-                } else if (!inputType) {
-                    inputType = Values$1.typeOf(label);
-                } else if (labelContext.checkSubtype(inputType, Values$1.typeOf(label))) {
-                    return null;
-                }
-
-                if (typeof cases[String(label)] !== 'undefined') {
-                    return labelContext.error('Branch labels must be unique.');
-                }
-
-                cases[String(label)] = outputs.length;
-            }
-
-            var result = context.parse(value, i, outputType);
-            if (!result) {
-                return null;
-            }
-            outputType = outputType || result.type;
-            outputs.push(result);
-        }
-
-        var input = context.parse(args[1], 1, ValueType$9);
-        if (!input) {
-            return null;
-        }
-
-        var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType);
-        if (!otherwise) {
-            return null;
-        }
-
-        assert_1(inputType && outputType);
-
-        if (input.type.kind !== 'value' && context.concat(1).checkSubtype((inputType ), input.type)) {
-            return null;
-        }
-
-        return new Match((inputType ), (outputType ), input, cases, outputs, otherwise);
-    };
-
-    Match.prototype.evaluate = function evaluate(ctx) {
-        var input = (this.input.evaluate(ctx) );
-        var output = (Values$1.typeOf(input) === this.inputType && this.outputs[this.cases[input]]) || this.otherwise;
-        return output.evaluate(ctx);
-    };
-
-    Match.prototype.eachChild = function eachChild(fn) {
-        fn(this.input);
-        this.outputs.forEach(fn);
-        fn(this.otherwise);
-    };
-
-    Match.prototype.possibleOutputs = function possibleOutputs() {
-        var ref;
-
-        return (ref = [])
-            .concat.apply(ref, this.outputs.map(function (out) {
-                return out.possibleOutputs();
-            }))
-            .concat(this.otherwise.possibleOutputs());
-    };
-
-    Match.prototype.serialize = function serialize() {
-        var this$1 = this;
-
-        var serialized = ["match", this.input.serialize()];
-
-        // Sort so serialization has an arbitrary defined order, even though
-        // branch order doesn't affect evaluation
-        var sortedLabels = Object.keys(this.cases).sort();
-
-        // Group branches by unique match expression to support condensed
-        // serializations of the form [case1, case2, ...] -> matchExpression
-        var groupedByOutput = [];
-        var outputLookup = {}; // lookup index into groupedByOutput for a given output expression
-        for (var i = 0, list = sortedLabels; i < list.length; i += 1) {
-            var label = list[i];
-
-            var outputIndex = outputLookup[this.cases[label]];
-            if (outputIndex === undefined) {
-                // First time seeing this output, add it to the end of the grouped list
-                outputLookup[this.cases[label]] = groupedByOutput.length;
-                groupedByOutput.push([this.cases[label], [label]]);
-            } else {
-                // We've seen this expression before, add the label to that output's group
-                groupedByOutput[outputIndex][1].push(label);
-            }
-        }
-
-        var coerceLabel = function (label) {
-            return this$1.inputType.kind === 'number' ? Number(label) : label;
-        };
-
-        for (var i$1 = 0, list$1 = groupedByOutput; i$1 < list$1.length; i$1 += 1) {
-            var ref = list$1[i$1];
-            var outputIndex = ref[0];
-            var labels = ref[1];
-
-            if (labels.length === 1) {
-                // Only a single label matches this output expression
-                serialized.push(coerceLabel(labels[0]));
-            } else {
-                // Array of literal labels pointing to this output expression
-                serialized.push(labels.map(coerceLabel));
-            }
-            serialized.push(this.outputs[outputIndex$1].serialize());
-        }
-        serialized.push(this.otherwise.serialize());
-        return serialized;
-    };
-
-    var NumberType$8 = {kind: 'number'};
-    var StringType$7 = {kind: 'string'};
-
-    var NumberFormat = function NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits) {
-        this.type = StringType$7;
-        this.number = number;
-        this.locale = locale;
-        this.currency = currency;
-        this.minFractionDigits = minFractionDigits;
-        this.maxFractionDigits = maxFractionDigits;
-    };
-
-    NumberFormat.parse = function parse(args, context) {
-        if (args.length !== 3) {
-            return context.error("Expected two arguments.");
-        }
-
-        var number = context.parse(args[1], 1, NumberType$8);
-        if (!number) {
-            return null;
-        }
-
-        var options = (args[2]   );
-        if (typeof options !== "object" || Array.isArray(options)) {
-            return context.error("NumberFormat options argument must be an object.");
-        }
-
-        var locale = null;
-        if (options['locale']) {
-            locale = context.parse(options['locale'], 1, StringType$7);
-            if (!locale) {
-                return null;
-            }
-        }
-
-        var currency = null;
-        if (options['currency']) {
-            currency = context.parse(options['currency'], 1, StringType$7);
-            if (!currency) {
-                return null;
-            }
-        }
-
-        var minFractionDigits = null;
-        if (options['min-fraction-digits']) {
-            minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType$8);
-            if (!minFractionDigits) {
-                return null;
-            }
-        }
-
-        var maxFractionDigits = null;
-        if (options['max-fraction-digits']) {
-            maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType$8);
-            if (!maxFractionDigits) {
-                return null;
-            }
-        }
-
-        return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits);
-    };
-
-    NumberFormat.prototype.evaluate = function evaluate(ctx) {
-        return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [],
-            {
-                style: this.currency ? "currency" : "decimal",
-                currency: this.currency ? this.currency.evaluate(ctx) : undefined,
-                minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined,
-                maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined,
-            }).format(this.number.evaluate(ctx));
-    };
-
-    NumberFormat.prototype.eachChild = function eachChild(fn) {
-        fn(this.number);
-        if (this.locale) {
-            fn(this.locale);
-        }
-        if (this.currency) {
-            fn(this.currency);
-        }
-        if (this.minFractionDigits) {
-            fn(this.minFractionDigits);
-        }
-        if (this.maxFractionDigits) {
-            fn(this.maxFractionDigits);
-        }
-    };
-
-    NumberFormat.prototype.possibleOutputs = function possibleOutputs() {
-        return [undefined];
-    };
-
-    NumberFormat.prototype.serialize = function serialize() {
-        var options = {};
-        if (this.locale) {
-            options['locale'] = this.locale.serialize();
-        }
-        if (this.currency) {
-            options['currency'] = this.currency.serialize();
-        }
-        if (this.minFractionDigits) {
-            options['min-fraction-digits'] = this.minFractionDigits.serialize();
-        }
-        if (this.maxFractionDigits) {
-            options['max-fraction-digits'] = this.maxFractionDigits.serialize();
-        }
-        return ["number-format", this.number.serialize(), options];
-    };
-
-    /**
-     * Returns the index of the last stop <= input, or 0 if it doesn't exist.
-     * @private
-     */
-    function findStopLessThanOrEqualTo$1(stops, input) {
-        var lastIndex = stops.length - 1;
-        var lowerIndex = 0;
-        var upperIndex = lastIndex;
-        var currentIndex = 0;
-        var currentValue, nextValue;
-
-        while (lowerIndex <= upperIndex) {
-            currentIndex = Math.floor((lowerIndex + upperIndex) / 2);
-            currentValue = stops[currentIndex];
-            nextValue = stops[currentIndex + 1];
-
-            if (currentValue <= input) {
-                if (currentIndex === lastIndex || input < nextValue) { // Search complete
-                    return currentIndex;
-                }
-
-                lowerIndex = currentIndex + 1;
-            } else if (currentValue > input) {
-                upperIndex = currentIndex - 1;
-            } else {
-                throw new RuntimeError('Input is not a number.');
-            }
-        }
-
-        return 0;
-    }
-
-    var NumberType$9 = {kind: 'number'};
-
-    var Step = function Step(type, input, stops) {
-        this.type = type;
-        this.input = input;
-
-        this.labels = [];
-        this.outputs = [];
-        for (var i = 0, list = stops; i < list.length; i += 1) {
-            var ref = list[i];
-            var label = ref[0];
-            var expression = ref[1];
-
-            this.labels.push(label);
-            this.outputs.push(expression);
-        }
-    };
-
-    Step.parse = function parse(args, context) {
-        if (args.length - 1 < 4) {
-            return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + "."));
-        }
-
-        if ((args.length - 1) % 2 !== 0) {
-            return context.error("Expected an even number of arguments.");
-        }
-
-        var input = context.parse(args[1], 1, NumberType$9);
-        if (!input) {
-            return null;
-        }
-
-        var stops = [];
-
-        var outputType = (null );
-        if (context.expectedType && context.expectedType.kind !== 'value') {
-            outputType = context.expectedType;
-        }
-
-        for (var i = 1; i < args.length; i += 2) {
-            var label = i === 1 ? -Infinity : args[i];
-            var value = args[i + 1];
-
-            var labelKey = i;
-            var valueKey = i + 1;
-
-            if (typeof label !== 'number') {
-                return context.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey);
-            }
-
-            if (stops.length && stops[stops.length - 1][0] >= label) {
-                return context.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.', labelKey);
-            }
-
-            var parsed = context.parse(value, valueKey, outputType);
-            if (!parsed) {
-                return null;
-            }
-            outputType = outputType || parsed.type;
-            stops.push([label, parsed]);
-        }
-
-        return new Step(outputType, input, stops);
-    };
-
-    Step.prototype.evaluate = function evaluate(ctx) {
-        var labels = this.labels;
-        var outputs = this.outputs;
-
-        if (labels.length === 1) {
-            return outputs[0].evaluate(ctx);
-        }
-
-        var value = ((this.input.evaluate(ctx) )    );
-        if (value <= labels[0]) {
-            return outputs[0].evaluate(ctx);
-        }
-
-        var stopCount = labels.length;
-        if (value >= labels[stopCount - 1]) {
-            return outputs[stopCount - 1].evaluate(ctx);
-        }
-
-        var index = findStopLessThanOrEqualTo$1(labels, value);
-        return outputs[index].evaluate(ctx);
-    };
-
-    Step.prototype.eachChild = function eachChild(fn) {
-        fn(this.input);
-        for (var i = 0, list = this.outputs; i < list.length; i += 1) {
-            var expression = list[i];
-
-            fn(expression);
-        }
-    };
-
-    Step.prototype.possibleOutputs = function possibleOutputs() {
-        var ref;
-
-        return (ref = []).concat.apply(ref, this.outputs.map(function (output) {
-            return output.possibleOutputs();
-        }));
-    };
-
-    Step.prototype.serialize = function serialize() {
-        var serialized = ["step", this.input.serialize()];
-        for (var i = 0; i < this.labels.length; i++) {
-            if (i > 0) {
-                serialized.push(this.labels[i]);
-            }
-            serialized.push(this.outputs[i].serialize());
-        }
-        return serialized;
-    };
-
-    var Var = function Var(name, boundExpression) {
-        this.type = boundExpression.type;
-        this.name = name;
-        this.boundExpression = boundExpression;
-    };
-
-    Var.parse = function parse(args, context) {
-        if (args.length !== 2 || typeof args[1] !== 'string') {
-            return context.error("'var' expression requires exactly one string literal argument.");
-        }
-
-        var name = args[1];
-        if (!context.scope.has(name)) {
-            return context.error(("Unknown variable \"" + name + "\". Make sure \"" + name + "\" has been bound in an enclosing \"let\" expression before using it."), 1);
-        }
-
-        return new Var(name, context.scope.get(name));
-    };
-
-    Var.prototype.evaluate = function evaluate(ctx) {
-        return this.boundExpression.evaluate(ctx);
-    };
-
-    Var.prototype.eachChild = function eachChild() {
-    };
-
-    Var.prototype.possibleOutputs = function possibleOutputs() {
-        return [undefined];
-    };
-
-    Var.prototype.serialize = function serialize() {
-        return ["var", this.name];
-    };
-
-    var expressions = {
-        // special forms
-        '==': ComparisonEnum.Equals,
-        '!=': ComparisonEnum.NotEquals,
-        '>': ComparisonEnum.GreaterThan,
-        '<': ComparisonEnum.LessThan,
-        '>=': ComparisonEnum.GreaterThanOrEqual,
-        '<=': ComparisonEnum.LessThanOrEqual,
-        'array': Assertion,
-        'at': At,
-        'boolean': Assertion,
-        'case': Case,
-        'coalesce': Coalesce,
-        'collator': CollatorExpression,
-        'format': FormatExpression$1,
-        'image': ImageExpression$1,
-        'in': In,
-        'interpolate': Interpolate$1,
-        'interpolate-hcl': Interpolate$1,
-        'interpolate-lab': Interpolate$1,
-        'length': Length,
-        'let': Let,
-        'literal': Literal,
-        'match': Match,
-        'number': Assertion,
-        'number-format': NumberFormat,
-        'object': Assertion,
-        'step': Step,
-        'string': Assertion,
-        'to-boolean': Coercion,
-        'to-color': Coercion,
-        'to-number': Coercion,
-        'to-string': Coercion,
-        'var': Var
-    };
-
-    function WebWorkerTransfer() {
-
-    }
-
-    var registry = {};
-
-    /**
-     * Register the given class as serializable.
-     *
-     * @param options
-     * @param options.omit List of properties to omit from serialization (e.g., cached/computed properties)
-     * @param options.shallow List of properties that should be serialized by a simple shallow copy, rather than by a recursive call to serialize().
-     *
-     * @private
-     */
-    WebWorkerTransfer.register = function (name, klass, options) {
-        if (options === void 0) options = {};
-
-        //assert(!registry[name], (name + " is already registered."));
-        (Object.defineProperty     )(klass, '_classRegistryKey', {
-            value: name,
-            writeable: false
-        });
-        registry[name] = {
-            klass: klass,
-            omit: options.omit || [],
-            shallow: options.shallow || []
-        };
-    };
-
-    WebWorkerTransfer.register('Object', Object);
-
-
-    //    gridIndex.serialize = function serialize(grid, transferables) {
-    //        var buffer = grid.toArrayBuffer();
-    //        if (transferables) {
-    //            transferables.push(buffer);
-    //        }
-    //        return {buffer: buffer};
-    //    };
-    //
-    //    gridIndex.deserialize = function deserialize(serialized) {
-    //        return new gridIndex(serialized.buffer);
-    //    };
-    //    register('Grid', gridIndex);
-
-    WebWorkerTransfer.register('Color', Color$1);
-    //WebWorkerTransfer.register('Error', Error);
-    WebWorkerTransfer.register('ResolvedImage', ResolvedImage$1);
-    WebWorkerTransfer.register('ImageAtlas', ImageAtlas);
-    WebWorkerTransfer.register('ImagePosition', ImagePosition);
-    WebWorkerTransfer.register('RGBAImage', RGBAImage);
-    WebWorkerTransfer.register('Formatted', Formatted$1);
-    WebWorkerTransfer.register('FormattedSection', FormattedSection);
-
-    //    WebWorkerTransfer.register('StylePropertyFunction', StylePropertyFunction);
-    //    WebWorkerTransfer.register('StyleExpression', StyleExpression, {omit: ['_evaluator']});
-    //
-    //    WebWorkerTransfer.register('ZoomDependentExpression', ZoomDependentExpression);
-    //    WebWorkerTransfer.register('ZoomConstantExpression', ZoomConstantExpression);
-    //    WebWorkerTransfer.register('CompoundExpression', CompoundExpression, {omit: ['_evaluate']});
-
-    for (var name$1 in expressions) {
-        if ((expressions[name$1]     )._classRegistryKey) {
-            continue;
-        }
-        WebWorkerTransfer.register(("Expression_" + name$1), expressions[name$1]);
-    }
-
-    function isArrayBuffer(val) {
-        return val && typeof ArrayBuffer !== 'undefined' &&
-            (val instanceof ArrayBuffer || (val.constructor && val.constructor.name === 'ArrayBuffer'));
-    }
-
-    /**
-     * Serialize the given object for transfer to or from a web worker.
-     *
-     * For non-builtin types, recursively serialize each property (possibly
-     * omitting certain properties - see register()), and package the result along
-     * with the constructor's `name` so that the appropriate constructor can be
-     * looked up in `deserialize()`.
-     *
-     * If a `transferables` array is provided, add any transferable objects (i.e.,
-     * any ArrayBuffers or ArrayBuffer views) to the list. (If a copy is needed,
-     * this should happen in the client code, before using serialize().)
-     *
-     * @private
-     */
-    WebWorkerTransfer.serialize = function (input, transferables) {
-        if (input === null ||
-            input === undefined ||
-            typeof input === 'boolean' ||
-            typeof input === 'number' ||
-            typeof input === 'string' ||
-            input instanceof Boolean ||
-            input instanceof Number ||
-            input instanceof String ||
-            input instanceof Date ||
-            input instanceof RegExp) {
-            return input;
-        }
-
-        if (isArrayBuffer(input)) {
-            if (transferables) {
-                transferables.push(((input     )             ));
-            }
-            return input;
-        }
-
-        if (ArrayBuffer.isView(input)) {
-            var view = (input     );
-            if (transferables) {
-                transferables.push(view.buffer);
-            }
-            return view;
-        }
-
-        if (input instanceof ImageData) {
-            if (transferables) {
-                transferables.push(input.data.buffer);
-            }
-            return input;
-        }
-
-        if (Array.isArray(input)) {
-            var serialized = [];
-            for (var i = 0, list = input; i < list.length; i += 1) {
-                var item = list[i];
-
-                serialized.push(WebWorkerTransfer.serialize(item, transferables));
-            }
-            return serialized;
-        }
-
-        if (typeof input === 'object') {
-            var klass = (input.constructor     );
-            var name = klass._classRegistryKey;
-            if (!name) {
-                throw new Error("can't serialize object of unregistered class");
-            }
-            //assert(registry[name]);
-
-            var properties = klass.serialize ?
-                // (Temporary workaround) allow a class to provide static
-                // `serialize()` and `deserialize()` methods to bypass the generic
-                // approach.
-                // This temporary workaround lets us use the generic serialization
-                // approach for objects whose members include instances of dynamic
-                // StructArray types. Once we refactor StructArray to be static,
-                // we can remove this complexity.
-                (klass.serialize(input, transferables)                  ) : {};
-
-            if (!klass.serialize) {
-                for (var key in input) {
-                    // any cast due to https://github.com/facebook/flow/issues/5393
-                    if (!(input     ).hasOwnProperty(key)) {
-                        continue;
-                    }
-                    if (registry[name].omit.indexOf(key) >= 0) {
-                        continue;
-                    }
-                    var property = (input     )[key];
-                    properties[key] = registry[name].shallow.indexOf(key) >= 0 ?
-                        property :
-                        WebWorkerTransfer.serialize(property, transferables);
-                }
-                if (input instanceof Error) {
-                    properties.message = input.message;
-                }
-            }
-
-            if (properties.$name) {
-                throw new Error('$name property is reserved for worker serialization logic.');
-            }
-            if (name !== 'Object') {
-                properties.$name = name;
-            }
-
-            return properties;
-        }
-
-        throw new Error(("can't serialize object of type " + (typeof input)));
-    };
-
-    WebWorkerTransfer.deserialize = function (input) {
-        if (input === null ||
-            input === undefined ||
-            typeof input === 'boolean' ||
-            typeof input === 'number' ||
-            typeof input === 'string' ||
-            input instanceof Boolean ||
-            input instanceof Number ||
-            input instanceof String ||
-            input instanceof Date ||
-            input instanceof RegExp ||
-            isArrayBuffer(input) ||
-            ArrayBuffer.isView(input) ||
-            input instanceof ImageData) {
-            return input;
-        }
-
-        if (Array.isArray(input)) {
-            return input.map(WebWorkerTransfer.deserialize);
-        }
-
-        if (typeof input === 'object') {
-            var name = (input     ).$name || 'Object';
-
-            var ref = registry[name];
-            var klass = ref.klass;
-            if (!klass) {
-                throw new Error(("can't deserialize unregistered class " + name));
-            }
-
-            if (klass.deserialize) {
-                return (klass.deserialize                    )(input);
-            }
-
-            var result = Object.create(klass.prototype);
-
-            for (var i = 0, list = Object.keys(input); i < list.length; i += 1) {
-                var key = list[i];
-
-                if (key === '$name') {
-                    continue;
-                }
-                var value = (input                  )[key];
-                result[key] = registry[name].shallow.indexOf(key) >= 0 ? value : WebWorkerTransfer.deserialize(value);
-            }
-            return result;
-        }
-        throw new Error(("can't deserialize object of type " + (typeof input)));
-    };
-
-    var ZoomHistory = function ZoomHistory() {
-        this.first = true;
-    };
-
-    ZoomHistory.prototype.update = function update (z    , now    ) {
-        var floorZ = Math.floor(z);
-
-        if (this.first) {
-            this.first = false;
-            this.lastIntegerZoom = floorZ;
-            this.lastIntegerZoomTime = 0;
-            this.lastZoom = z;
-            this.lastFloorZoom = floorZ;
-            return true;
-        }
-
-        if (this.lastFloorZoom > floorZ) {
-            this.lastIntegerZoom = floorZ + 1;
-            this.lastIntegerZoomTime = now;
-        } else if (this.lastFloorZoom < floorZ) {
-            this.lastIntegerZoom = floorZ;
-            this.lastIntegerZoomTime = now;
-        }
-
-        if (z !== this.lastZoom) {
-            this.lastZoom = z;
-            this.lastFloorZoom = floorZ;
-            return true;
-        }
-
-        return false;
-    };
-
-    var EvaluationParameters$1 = function EvaluationParameters(zoom, options) {
-        this.zoom = zoom;
-
-        if (options) {
-            this.now = options.now;
-            this.fadeDuration = options.fadeDuration;
-            this.zoomHistory = options.zoomHistory;
-            this.transition = options.transition;
-        } else {
-            this.now = 0;
-            this.fadeDuration = 0;
-            this.zoomHistory = new ZoomHistory();
-            this.transition = {};
-        }
-    };
-
-    EvaluationParameters$1.prototype.isSupportedScript = function isSupportedScript(str) {
-        return false;
-        //return isStringInSupportedScript(str, plugin.isLoaded());
-    };
-
-    EvaluationParameters$1.prototype.crossFadingFactor = function crossFadingFactor() {
-        if (this.fadeDuration === 0) {
-            return 1;
-        } else {
-            return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1);
-        }
-    };
-
-    EvaluationParameters$1.prototype.getCrossfadeParameters = function getCrossfadeParameters() {
-        var z = this.zoom;
-        var fraction = z - Math.floor(z);
-        var t = this.crossFadingFactor();
-
-        return z > this.zoomHistory.lastIntegerZoom ?
-        {fromScale: 2, toScale: 1, t: fraction + (1 - fraction) * t} :
-        {fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction};
-    };
-
-    var EXTENT = 8192;
-
-    function clamp(n, min, max) {
-        return Math.min(max, Math.max(min, n));
-    }
-
-    // These bounds define the minimum and maximum supported coordinate values.
-    // While visible coordinates are within [0, EXTENT], tiles may theoretically
-    // contain cordinates within [-Infinity, Infinity]. Our range is limited by the
-    // number of bits used to represent the coordinate.
-    function createBounds(bits) {
-        return {
-            min: -1 * Math.pow(2, bits - 1),
-            max: Math.pow(2, bits - 1) - 1
-        };
-    }
-
-    var bounds = createBounds(15);
-
-    /**
-     * Loads a geometry from a VectorTileFeature and scales it to the common extent
-     * used internally.
-     * @param {VectorTileFeature} feature
-     * @private
-     */
-    function loadGeometry(feature) {
-        var scale = EXTENT / feature.extent;
-        var geometry = feature.loadGeometry();
-        for (var r = 0; r < geometry.length; r++) {
-            var ring = geometry[r];
-            for (var p = 0; p < ring.length; p++) {
-                var point = ring[p];
-                // round here because mapbox-gl-native uses integers to represent
-                // points and we need to do the same to avoid renering differences.
-                point.x = Math.round(point.x * scale);
-                // 因为绘制到纹理上颠倒了,所以在这里取反
-                point.y = EXTENT - Math.round(point.y * scale);
-
-                if (point.x < bounds.min || point.x > bounds.max || point.y < bounds.min || point.y > bounds.max) {
-                    //warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size');
-                    point.x = clamp(point.x, bounds.min, bounds.max);
-                    point.y = clamp(point.y, bounds.min, bounds.max);
-                }
-            }
-        }
-        return geometry;
-    }
-
-    var SegmentVector = function SegmentVector(segments) {
-        if (segments === void 0) segments = [];
-
-        this.segments = segments;
-    };
-
-    SegmentVector.prototype.prepareSegment = function prepareSegment(numVertices, layoutVertexArray, indexArray, sortKey) {
-        var segment = this.segments[this.segments.length - 1];
-        if (!segment || segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH || segment.sortKey !== sortKey) {
-            segment = ({
-                vertexOffset: layoutVertexArray.length,
-                primitiveOffset: indexArray.length,
-                vertexLength: 0,
-                primitiveLength: 0
-            } );
-            if (sortKey !== undefined) {
-                segment.sortKey = sortKey;
-            }
-            this.segments.push(segment);
-        }
-        return segment;
-    };
-
-    SegmentVector.prototype.get = function get() {
-        return this.segments;
-    };
-
-    SegmentVector.prototype.destroy = function destroy() {
-        for (var i = 0, list = this.segments; i < list.length; i += 1) {
-            var segment = list[i];
-
-            for (var k in segment.vaos) {
-                segment.vaos[k].destroy();
-            }
-        }
-    };
-
-    SegmentVector.simpleSegment = function simpleSegment(vertexOffset, primitiveOffset, vertexLength, primitiveLength) {
-        return new SegmentVector([
-            {
-                vertexOffset: vertexOffset,
-                primitiveOffset: primitiveOffset,
-                vertexLength: vertexLength,
-                primitiveLength: primitiveLength,
-                vaos: {},
-                sortKey: 0
-            }
-        ]);
-    };
-
-    /*
-     * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit
-     * addressing of vertex buffers.
-     * @private
-     * @readonly
-     */
-    SegmentVector.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1;
-    WebWorkerTransfer.register('SegmentVector', SegmentVector);
-
-    /**
-     * @private
-     */
-
-    var DEFAULT_CAPACITY = 128;
-    var RESIZE_MULTIPLIER = 5;
-
-    /**
-     * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray`
-     * making it behave like an array of typed structs.
-     *
-     * Conceptually, a StructArray is comprised of elements, i.e., instances of its
-     * associated struct type. Each particular struct type, together with an
-     * alignment size, determines the memory layout of a StructArray whose elements
-     * are of that type.  Thus, for each such layout that we need, we have
-     * a corrseponding StructArrayLayout class, inheriting from StructArray and
-     * implementing `emplaceBack()` and `_refreshViews()`.
-     *
-     * In some cases, where we need to access particular elements of a StructArray,
-     * we implement a more specific subclass that inherits from one of the
-     * StructArrayLayouts and adds a `get(i): T` accessor that returns a structured
-     * object whose properties are proxies into the underlying memory space for the
-     * i-th element.  This affords the convience of working with (seemingly) plain
-     * Javascript objects without the overhead of serializing/deserializing them
-     * into ArrayBuffers for efficient web worker transfer.
-     *
-     * @private
-     */
-    var StructArray = function StructArray() {
-        this.isTransferred = false;
-        this.capacity = -1;
-        this.resize(0);
-    };
-
-    /**
-     * Serialize a StructArray instance.Serializes both the raw data and the
-     * metadata needed to reconstruct the StructArray base class during
-     * deserialization.
-     */
-    StructArray.serialize = function serialize(array, transferables) {
-        //assert_1(!array.isTransferred);
-        if(array.isTransferred){
-            console.log("StructArray array.isTransferred.");
-        }
-
-        array._trim();
-
-        if (transferables) {
-            array.isTransferred = true;
-            transferables.push(array.arrayBuffer);
-        }
-
-        return {
-            length: array.length,
-            arrayBuffer: array.arrayBuffer,
-        };
-    };
-
-    StructArray.deserialize = function deserialize(input) {
-        var structArray = Object.create(this.prototype);
-        structArray.arrayBuffer = input.arrayBuffer;
-        structArray.length = input.length;
-        structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement;
-        structArray._refreshViews();
-        return structArray;
-    };
-
-    /**
-     * Resize the array to discard unused capacity.
-     */
-    StructArray.prototype._trim = function _trim() {
-        if (this.length !== this.capacity) {
-            this.capacity = this.length;
-            this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);
-            this._refreshViews();
-        }
-    };
-
-    /**
-     * Resets the the length of the array to 0 without de-allocating capcacity.
-     */
-    StructArray.prototype.clear = function clear() {
-        this.length = 0;
-    };
-
-    /**
-     * Resize the array.
-     * If `n` is greater than the current length then additional elements with undefined values are added.
-     * If `n` is less than the current length then the array will be reduced to the first `n` elements.
-     * @param {number} n The new size of the array.
-     */
-    StructArray.prototype.resize = function resize(n) {
-        //assert_1(!this.isTransferred);
-        this.reserve(n);
-        this.length = n;
-    };
-
-    /**
-     * Indicate a planned increase in size, so that any necessary allocation may
-     * be done once, ahead of time.
-     * @param {number} n The expected size of the array.
-     */
-    StructArray.prototype.reserve = function reserve(n) {
-        if (n > this.capacity) {
-            this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY);
-            this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);
-
-            var oldUint8Array = this.uint8;
-            this._refreshViews();
-            if (oldUint8Array) {
-                this.uint8.set(oldUint8Array);
-            }
-        }
-    };
-
-    /**
-     * Create TypedArray views for the current ArrayBuffer.
-     */
-    StructArray.prototype._refreshViews = function _refreshViews() {
-        throw new Error('_refreshViews() must be implemented by each concrete StructArray layout');
-    };
-
-    /**
-     * Implementation of the StructArray layout:
-     * [0]: Int16[2]
-     * [4]: Uint8[4]
-     *
-     * @private
-     */
-    var StructArrayLayout2i4ub8 = /*@__PURE__*/(function (StructArray) {
-        function StructArrayLayout2i4ub8() {
-            StructArray.apply(this, arguments);
-        }
-
-        if (StructArray) StructArrayLayout2i4ub8.__proto__ = StructArray;
-        StructArrayLayout2i4ub8.prototype = Object.create(StructArray && StructArray.prototype);
-        StructArrayLayout2i4ub8.prototype.constructor = StructArrayLayout2i4ub8;
-
-        StructArrayLayout2i4ub8.prototype._refreshViews = function _refreshViews() {
-            this.uint8 = new Uint8Array(this.arrayBuffer);
-            this.int16 = new Int16Array(this.arrayBuffer);
-        };
-
-        StructArrayLayout2i4ub8.prototype.emplaceBack = function emplaceBack(v0, v1, v2, v3, v4, v5) {
-            var i = this.length;
-            this.resize(i + 1);
-            return this.emplace(i, v0, v1, v2, v3, v4, v5);
-        };
-
-        StructArrayLayout2i4ub8.prototype.emplace = function emplace(i, v0, v1, v2, v3, v4, v5) {
-            var o2 = i * 4;
-            var o1 = i * 8;
-            this.int16[o2 + 0] = v0;
-            this.int16[o2 + 1] = v1;
-            this.uint8[o1 + 4] = v2;
-            this.uint8[o1 + 5] = v3;
-            this.uint8[o1 + 6] = v4;
-            this.uint8[o1 + 7] = v5;
-            return i;
-        };
-
-        return StructArrayLayout2i4ub8;
-    }(StructArray));
-
-    StructArrayLayout2i4ub8.prototype.bytesPerElement = 8;
-    WebWorkerTransfer.register('StructArrayLayout2i4ub8', StructArrayLayout2i4ub8);
-
-    /**
-     * Implementation of the StructArray layout:
-     * [0]: Uint16[3]
-     *
-     * @private
-     */
-    var StructArrayLayout3ui6 = /*@__PURE__*/(function (StructArray) {
-        function StructArrayLayout3ui6() {
-            StructArray.apply(this, arguments);
-        }
-
-        if (StructArray) StructArrayLayout3ui6.__proto__ = StructArray;
-        StructArrayLayout3ui6.prototype = Object.create(StructArray && StructArray.prototype);
-        StructArrayLayout3ui6.prototype.constructor = StructArrayLayout3ui6;
-
-        StructArrayLayout3ui6.prototype._refreshViews = function _refreshViews() {
-            this.uint8 = new Uint8Array(this.arrayBuffer);
-            this.uint16 = new Uint16Array(this.arrayBuffer);
-        };
-
-        StructArrayLayout3ui6.prototype.emplaceBack = function emplaceBack(v0, v1, v2) {
-            var i = this.length;
-            this.resize(i + 1);
-            return this.emplace(i, v0, v1, v2);
-        };
-
-        StructArrayLayout3ui6.prototype.emplace = function emplace(i, v0, v1, v2) {
-            var o2 = i * 3;
-            this.uint16[o2 + 0] = v0;
-            this.uint16[o2 + 1] = v1;
-            this.uint16[o2 + 2] = v2;
-            return i;
-        };
-
-        return StructArrayLayout3ui6;
-    }(StructArray));
-
-    StructArrayLayout3ui6.prototype.bytesPerElement = 6;
-    WebWorkerTransfer.register('StructArrayLayout3ui6', StructArrayLayout3ui6);
-
-    // A transferable data structure that maps feature ids to their indices and buffer offsets
-    var FeaturePositionMap = function FeaturePositionMap() {
-        this.ids = [];
-        this.positions = [];
-        this.indexed = false;
-    };
-
-    FeaturePositionMap.prototype.add = function add(id, index, start, end) {
-        this.ids.push(id);
-        this.positions.push(index, start, end);
-    };
-
-    FeaturePositionMap.prototype.getPositions = function getPositions(id) {
-        //assert_1(this.indexed);
-
-        // binary search for the first occurrence of id in this.ids;
-        // relies on ids/positions being sorted by id, which happens in serialization
-        var i = 0;
-        var j = this.ids.length - 1;
-        while (i < j) {
-            var m = (i + j) >> 1;
-            if (this.ids[m] >= id) {
-                j = m;
-            } else {
-                i = m + 1;
-            }
-        }
-        var positions = [];
-        while (this.ids[i] === id) {
-            var index = this.positions[3 * i];
-            var start = this.positions[3 * i + 1];
-            var end = this.positions[3 * i + 2];
-            positions.push({index: index, start: start, end: end});
-            i++;
-        }
-        return positions;
-    };
-
-    FeaturePositionMap.serialize = function serialize(map, transferables) {
-        var ids = new Float64Array(map.ids);
-        var positions = new Uint32Array(map.positions);
-
-        sort(ids, positions, 0, ids.length - 1);
-
-        if (transferables) {
-            transferables.push(ids.buffer, positions.buffer);
-        }
-
-        return {ids: ids, positions: positions};
-    };
-
-    FeaturePositionMap.deserialize = function deserialize(obj) {
-        var map = new FeaturePositionMap();
-        // after transferring, we only use these arrays statically (no pushes),
-        // so TypedArray vs Array distinction that flow points out doesn't matter
-        map.ids = (obj.ids   );
-        map.positions = (obj.positions   );
-        map.indexed = true;
-        return map;
-    };
-
-    // custom quicksort that sorts ids, indices and offsets together (by ids)
-    function sort(ids, positions, left, right) {
-        if (left >= right) {
-            return;
-        }
-
-        var pivot = ids[(left + right) >> 1];
-        var i = left - 1;
-        var j = right + 1;
-
-        while (true) {
-            do {
-                i++;
-            } while (ids[i] < pivot);
-            do {
-                j--;
-            } while (ids[j] > pivot);
-            if (i >= j) {
-                break;
-            }
-            swap(ids, i, j);
-            swap(positions, 3 * i, 3 * j);
-            swap(positions, 3 * i + 1, 3 * j + 1);
-            swap(positions, 3 * i + 2, 3 * j + 2);
-        }
-
-        sort(ids, positions, left, j);
-        sort(ids, positions, j + 1, right);
-    }
-
-    function swap(arr, i, j) {
-        var tmp = arr[i];
-        arr[i] = arr[j];
-        arr[j] = tmp;
-    }
-
-    WebWorkerTransfer.register('FeaturePositionMap', FeaturePositionMap);
-
-    /**
-     * `PossiblyEvaluatedPropertyValue` is used for data-driven paint and layout property values. It holds a
-     * `PossiblyEvaluatedValue` and the `GlobalProperties` that were used to generate it. You're not allowed to supply
-     * a different set of `GlobalProperties` when performing the final evaluation because they would be ignored in the
-     * case where the input value was a constant or camera function.
-     *
-     * @private
-     */
-    var PossiblyEvaluatedPropertyValue$1 = function PossiblyEvaluatedPropertyValue(property, value, parameters) {
-        this.property = property;
-        this.value = value;
-        this.parameters = parameters;
-    };
-
-    PossiblyEvaluatedPropertyValue$1.prototype.isConstant = function isConstant() {
-        return this.value.kind === 'constant';
-    };
-
-    PossiblyEvaluatedPropertyValue$1.prototype.constantOr = function constantOr(value) {
-        if (this.value.kind === 'constant') {
-            return this.value.value;
-        } else {
-            return value;
-        }
-    };
-
-    PossiblyEvaluatedPropertyValue$1.prototype.evaluate = function evaluate(feature, featureState, availableImages) {
-        return this.property.evaluate(this.value, this.parameters, feature, featureState, availableImages);
-    };
-
-    function Supports() {
-    }
-
-    Supports.supportsPropertyExpression = function (spec) {
-        return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven';
-    };
-
-    Supports.supportsZoomExpression = function (spec) {
-        return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1;
-    };
-
-    Supports.supportsInterpolation = function (spec) {
-        return !!spec.expression && spec.expression.interpolated;
-    };
-
-    var UniformType = {};
-
-    var Uniform = function Uniform(context, location) {
-        this.gl = context.gl;
-        this.location = location;
-    };
-
-    UniformType.Uniform1i = /*@__PURE__*/(function (Uniform) {
-        function Uniform1i(context, location) {
-            Uniform.call(this, context, location);
-            this.current = 0;
-        }
-
-        if (Uniform) Uniform1i.__proto__ = Uniform;
-        Uniform1i.prototype = Object.create(Uniform && Uniform.prototype);
-        Uniform1i.prototype.constructor = Uniform1i;
-
-        Uniform1i.prototype.set = function set(v) {
-            if (this.current !== v) {
-                this.current = v;
-                this.gl.uniform1i(this.location, v);
-            }
-        };
-
-        return Uniform1i;
-    }(Uniform));
-
-    UniformType.Uniform1f = /*@__PURE__*/(function (Uniform) {
-        function Uniform1f(context, location) {
-            Uniform.call(this, context, location);
-            this.current = 0;
-        }
-
-        if (Uniform) Uniform1f.__proto__ = Uniform;
-        Uniform1f.prototype = Object.create(Uniform && Uniform.prototype);
-        Uniform1f.prototype.constructor = Uniform1f;
-
-        Uniform1f.prototype.set = function set(v) {
-            if (this.current !== v) {
-                this.current = v;
-                this.gl.uniform1f(this.location, v);
-            }
-        };
-
-        return Uniform1f;
-    }(Uniform));
-
-    UniformType.Uniform2f = /*@__PURE__*/(function (Uniform) {
-        function Uniform2f(context, location) {
-            Uniform.call(this, context, location);
-            this.current = [0, 0];
-        }
-
-        if (Uniform) Uniform2f.__proto__ = Uniform;
-        Uniform2f.prototype = Object.create(Uniform && Uniform.prototype);
-        Uniform2f.prototype.constructor = Uniform2f;
-
-        Uniform2f.prototype.set = function set(v) {
-            if (v[0] !== this.current[0] || v[1] !== this.current[1]) {
-                this.current = v;
-                this.gl.uniform2f(this.location, v[0], v[1]);
-            }
-        };
-
-        return Uniform2f;
-    }(Uniform));
-
-    UniformType.Uniform3f = /*@__PURE__*/(function (Uniform) {
-        function Uniform3f(context, location) {
-            Uniform.call(this, context, location);
-            this.current = [0, 0, 0];
-        }
-
-        if (Uniform) Uniform3f.__proto__ = Uniform;
-        Uniform3f.prototype = Object.create(Uniform && Uniform.prototype);
-        Uniform3f.prototype.constructor = Uniform3f;
-
-        Uniform3f.prototype.set = function set(v) {
-            if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2]) {
-                this.current = v;
-                this.gl.uniform3f(this.location, v[0], v[1], v[2]);
-            }
-        };
-
-        return Uniform3f;
-    }(Uniform));
-
-    UniformType.Uniform4f = /*@__PURE__*/(function (Uniform) {
-        function Uniform4f(context, location) {
-            Uniform.call(this, context, location);
-            this.current = [0, 0, 0, 0];
-        }
-
-        if (Uniform) Uniform4f.__proto__ = Uniform;
-        Uniform4f.prototype = Object.create(Uniform && Uniform.prototype);
-        Uniform4f.prototype.constructor = Uniform4f;
-
-        Uniform4f.prototype.set = function set(v) {
-            if (v[0] !== this.current[0] || v[1] !== this.current[1] ||
-                v[2] !== this.current[2] || v[3] !== this.current[3]) {
-                this.current = v;
-                this.gl.uniform4f(this.location, v[0], v[1], v[2], v[3]);
-            }
-        };
-
-        return Uniform4f;
-    }(Uniform));
-
-    UniformType.UniformColor = /*@__PURE__*/(function (Uniform) {
-        function UniformColor(context, location) {
-            Uniform.call(this, context, location);
-            this.current = Color$1.transparent;
-        }
-
-        if (Uniform) UniformColor.__proto__ = Uniform;
-        UniformColor.prototype = Object.create(Uniform && Uniform.prototype);
-        UniformColor.prototype.constructor = UniformColor;
-
-        UniformColor.prototype.set = function set(v) {
-            if (v.r !== this.current.r || v.g !== this.current.g ||
-                v.b !== this.current.b || v.a !== this.current.a) {
-                this.current = v;
-                this.gl.uniform4f(this.location, v.r, v.g, v.b, v.a);
-            }
-        };
-
-        return UniformColor;
-    }(Uniform));
-
-    var emptyMat4 = new Float32Array(16);
-    UniformType.UniformMatrix4f = /*@__PURE__*/(function (Uniform) {
-        function UniformMatrix4f(context, location) {
-            Uniform.call(this, context, location);
-            this.current = emptyMat4;
-        }
-
-        if (Uniform) UniformMatrix4f.__proto__ = Uniform;
-        UniformMatrix4f.prototype = Object.create(Uniform && Uniform.prototype);
-        UniformMatrix4f.prototype.constructor = UniformMatrix4f;
-
-        UniformMatrix4f.prototype.set = function set(v) {
-            this.gl.uniformMatrix4fv(this.location, false, v);
-            // The vast majority of matrix comparisons that will trip this set
-            // happen at i=12 or i=0, so we check those first to avoid lots of
-            // unnecessary iteration:
-    //            if (v[12] !== this.current[12] || v[0] !== this.current[0]) {
-    //                this.current = v;
-    //                this.gl.uniformMatrix4fv(this.location, false, v);
-    //                return;
-    //            }
-    //            for (var i = 1; i < 16; i++) {
-    //                if (v[i] !== this.current[i]) {
-    //                    this.current = v;
-    //                    this.gl.uniformMatrix4fv(this.location, false, v);
-    //                    break;
-    //                }
-    //            }
-        };
-
-        return UniformMatrix4f;
-    }(Uniform));
-
-    /**
-     * Implementation of the StructArray layout:
-     * [0]: Uint16[8]
-     *
-     * @private
-     */
-    var StructArrayLayout8ui16 = /*@__PURE__*/(function (StructArray) {
-        function StructArrayLayout8ui16() {
-            StructArray.apply(this, arguments);
-        }
-
-        if (StructArray) StructArrayLayout8ui16.__proto__ = StructArray;
-        StructArrayLayout8ui16.prototype = Object.create(StructArray && StructArray.prototype);
-        StructArrayLayout8ui16.prototype.constructor = StructArrayLayout8ui16;
-
-        StructArrayLayout8ui16.prototype._refreshViews = function _refreshViews() {
-            this.uint8 = new Uint8Array(this.arrayBuffer);
-            this.uint16 = new Uint16Array(this.arrayBuffer);
-        };
-
-        StructArrayLayout8ui16.prototype.emplaceBack = function emplaceBack(v0, v1, v2, v3, v4, v5, v6, v7) {
-            var i = this.length;
-            this.resize(i + 1);
-            return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7);
-        };
-
-        StructArrayLayout8ui16.prototype.emplace = function emplace(i, v0, v1, v2, v3, v4, v5, v6, v7) {
-            var o2 = i * 8;
-            this.uint16[o2 + 0] = v0;
-            this.uint16[o2 + 1] = v1;
-            this.uint16[o2 + 2] = v2;
-            this.uint16[o2 + 3] = v3;
-            this.uint16[o2 + 4] = v4;
-            this.uint16[o2 + 5] = v5;
-            this.uint16[o2 + 6] = v6;
-            this.uint16[o2 + 7] = v7;
-            return i;
-        };
-
-        return StructArrayLayout8ui16;
-    }(StructArray));
-
-    StructArrayLayout8ui16.prototype.bytesPerElement = 16;
-    WebWorkerTransfer.register('StructArrayLayout8ui16', StructArrayLayout8ui16);
-
-    /**
-     * Implementation of the StructArray layout:
-     * [0]: Float32[2]
-     *
-     * @private
-     */
-    var StructArrayLayout2f8 = /*@__PURE__*/(function (StructArray) {
-        function StructArrayLayout2f8() {
-            StructArray.apply(this, arguments);
-        }
-
-        if (StructArray) StructArrayLayout2f8.__proto__ = StructArray;
-        StructArrayLayout2f8.prototype = Object.create(StructArray && StructArray.prototype);
-        StructArrayLayout2f8.prototype.constructor = StructArrayLayout2f8;
-
-        StructArrayLayout2f8.prototype._refreshViews = function _refreshViews() {
-            this.uint8 = new Uint8Array(this.arrayBuffer);
-            this.float32 = new Float32Array(this.arrayBuffer);
-        };
-
-        StructArrayLayout2f8.prototype.emplaceBack = function emplaceBack(v0, v1) {
-            var i = this.length;
-            this.resize(i + 1);
-            return this.emplace(i, v0, v1);
-        };
-
-        StructArrayLayout2f8.prototype.emplace = function emplace(i, v0, v1) {
-            var o4 = i * 2;
-            this.float32[o4 + 0] = v0;
-            this.float32[o4 + 1] = v1;
-            return i;
-        };
-
-        return StructArrayLayout2f8;
-    }(StructArray));
-
-    StructArrayLayout2f8.prototype.bytesPerElement = 8;
-    WebWorkerTransfer.register('StructArrayLayout2f8', StructArrayLayout2f8);
-
-    /**
-     * Implementation of the StructArray layout:
-     * [0]: Float32[4]
-     *
-     * @private
-     */
-    var StructArrayLayout4f16 = /*@__PURE__*/(function (StructArray) {
-        function StructArrayLayout4f16() {
-            StructArray.apply(this, arguments);
-        }
-
-        if (StructArray) StructArrayLayout4f16.__proto__ = StructArray;
-        StructArrayLayout4f16.prototype = Object.create(StructArray && StructArray.prototype);
-        StructArrayLayout4f16.prototype.constructor = StructArrayLayout4f16;
-
-        StructArrayLayout4f16.prototype._refreshViews = function _refreshViews() {
-            this.uint8 = new Uint8Array(this.arrayBuffer);
-            this.float32 = new Float32Array(this.arrayBuffer);
-        };
-
-        StructArrayLayout4f16.prototype.emplaceBack = function emplaceBack(v0, v1, v2, v3) {
-            var i = this.length;
-            this.resize(i + 1);
-            return this.emplace(i, v0, v1, v2, v3);
-        };
-
-        StructArrayLayout4f16.prototype.emplace = function emplace(i, v0, v1, v2, v3) {
-            var o4 = i * 4;
-            this.float32[o4 + 0] = v0;
-            this.float32[o4 + 1] = v1;
-            this.float32[o4 + 2] = v2;
-            this.float32[o4 + 3] = v3;
-            return i;
-        };
-
-        return StructArrayLayout4f16;
-    }(StructArray));
-
-    StructArrayLayout4f16.prototype.bytesPerElement = 16;
-    WebWorkerTransfer.register('StructArrayLayout4f16', StructArrayLayout4f16);
-
-    /**
-     * Implementation of the StructArray layout:
-     * [0]: Float32[1]
-     *
-     * @private
-     */
-    var StructArrayLayout1f4 = /*@__PURE__*/(function (StructArray) {
-        function StructArrayLayout1f4() {
-            StructArray.apply(this, arguments);
-        }
-
-        if (StructArray) StructArrayLayout1f4.__proto__ = StructArray;
-        StructArrayLayout1f4.prototype = Object.create(StructArray && StructArray.prototype);
-        StructArrayLayout1f4.prototype.constructor = StructArrayLayout1f4;
-
-        StructArrayLayout1f4.prototype._refreshViews = function _refreshViews() {
-            this.uint8 = new Uint8Array(this.arrayBuffer);
-            this.float32 = new Float32Array(this.arrayBuffer);
-        };
-
-        StructArrayLayout1f4.prototype.emplaceBack = function emplaceBack(v0) {
-            var i = this.length;
-            this.resize(i + 1);
-            return this.emplace(i, v0);
-        };
-
-        StructArrayLayout1f4.prototype.emplace = function emplace(i, v0) {
-            var o4 = i * 1;
-            this.float32[o4 + 0] = v0;
-            return i;
-        };
-
-        return StructArrayLayout1f4;
-    }(StructArray));
-
-    StructArrayLayout1f4.prototype.bytesPerElement = 4;
-    WebWorkerTransfer.register('StructArrayLayout1f4', StructArrayLayout1f4);
-
-    function clamp$1(n, min, max) {
-        return Math.min(max, Math.max(min, n));
-    }
-
-    function packUint8ToFloat(a, b) {
-        // coerce a and b to 8-bit ints
-        a = clamp$1(Math.floor(a), 0, 255);
-        b = clamp$1(Math.floor(b), 0, 255);
-        return 256 * a + b;
-    }
-
-    function packColor(color) {
-        return [
-            packUint8ToFloat(255 * color.r, 255 * color.g),
-            packUint8ToFloat(255 * color.b, 255 * color.a)
-        ];
-    }
-
-    var ConstantBinder = function ConstantBinder(value, names, type) {
-        this.value = value;
-        this.names = names;
-        this.uniformNames = this.names.map(function (name) {
-            return ("u_" + name);
-        });
-        this.type = type;
-        this.maxValue = -Infinity;
-    };
-
-    ConstantBinder.prototype.defines = function defines() {
-        return this.names.map(function (name) {
-            return ("#define HAS_UNIFORM_u_" + name);
-        });
-    };
-    ConstantBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions() {
-    };
-    ConstantBinder.prototype.populatePaintArray = function populatePaintArray() {
-    };
-    ConstantBinder.prototype.updatePaintArray = function updatePaintArray() {
-    };
-    ConstantBinder.prototype.upload = function upload() {
-    };
-    ConstantBinder.prototype.destroy = function destroy() {
-    };
-
-    ConstantBinder.prototype.setUniforms = function setUniforms(context, uniform, globals, currentValue) {
-        uniform.set(currentValue.constantOr(this.value));
-    };
-
-    ConstantBinder.prototype.getBinding = function getBinding(context, location) {
-        return (this.type === 'color') ?
-            new UniformType.UniformColor(context, location) :
-            new UniformType.Uniform1f(context, location);
-    };
-
-    ConstantBinder.serialize = function serialize$1(binder) {
-        var value = binder.value;
-        var names = binder.names;
-        var type = binder.type;
-        return {value: WebWorkerTransfer.serialize(value), names: names, type: type};
-    };
-
-    ConstantBinder.deserialize = function deserialize$1(serialized) {
-        var value = serialized.value;
-        var names = serialized.names;
-        var type = serialized.type;
-        return new ConstantBinder(WebWorkerTransfer.deserialize(value), names, type);
-    };
-
-    var CrossFadedConstantBinder = function CrossFadedConstantBinder(value, names, type) {
-        this.value = value;
-        this.names = names;
-        this.uniformNames = this.names.map(function (name) {
-            return ("u_" + name);
-        });
-        this.type = type;
-        this.maxValue = -Infinity;
-        this.patternPositions = {patternTo: null, patternFrom: null};
-    };
-
-    CrossFadedConstantBinder.prototype.defines = function defines() {
-        return this.names.map(function (name) {
-            return ("#define HAS_UNIFORM_u_" + name);
-        });
-    };
-
-    CrossFadedConstantBinder.prototype.populatePaintArray = function populatePaintArray() {
-    };
-    CrossFadedConstantBinder.prototype.updatePaintArray = function updatePaintArray() {
-    };
-    CrossFadedConstantBinder.prototype.upload = function upload() {
-    };
-    CrossFadedConstantBinder.prototype.destroy = function destroy() {
-    };
-
-    CrossFadedConstantBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions(posTo, posFrom) {
-        this.patternPositions.patternTo = posTo.tlbr;
-        this.patternPositions.patternFrom = posFrom.tlbr;
-    };
-
-    CrossFadedConstantBinder.prototype.setUniforms = function setUniforms(context, uniform, globals, currentValue, uniformName) {
-        var pos = this.patternPositions;
-        if (uniformName === "u_pattern_to" && pos.patternTo) {
-            uniform.set(pos.patternTo);
-        }
-        if (uniformName === "u_pattern_from" && pos.patternFrom) {
-            uniform.set(pos.patternFrom);
-        }
-    };
-
-    CrossFadedConstantBinder.prototype.getBinding = function getBinding(context, location) {
-        return new UniformType.Uniform4f(context, location);
-    };
-
-    var SourceExpressionBinder = function SourceExpressionBinder(expression, names, type, PaintVertexArray) {
-        this.expression = expression;
-        this.names = names;
-        this.type = type;
-        this.uniformNames = this.names.map(function (name) {
-            return ("a_" + name);
-        });
-        this.maxValue = -Infinity;
-        this.paintVertexAttributes = names.map(function (name) {
-                return ({
-                    name: ("a_" + name),
-                    type: 'Float32',
-                    components: type === 'color' ? 2 : 1,
-                    offset: 0
-                });
-            }
-        );
-        this.paintVertexArray = new PaintVertexArray();
-    };
-
-    SourceExpressionBinder.prototype.defines = function defines() {
-        return [];
-    };
-
-    SourceExpressionBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions() {
-    };
-
-    SourceExpressionBinder.prototype.populatePaintArray = function populatePaintArray(newLength, feature, imagePositions, formattedSection) {
-        var paintArray = this.paintVertexArray;
-
-        var start = paintArray.length;
-        paintArray.reserve(newLength);
-
-        var value = this.expression.evaluate(new EvaluationParameters(0), feature, {}, [], formattedSection);
-
-        if (this.type === 'color') {
-            var color = packColor(value);
-            for (var i = start; i < newLength; i++) {
-                paintArray.emplaceBack(color[0], color[1]);
-            }
-        } else {
-            for (var i$1 = start; i$1 < newLength; i$1++) {
-                paintArray.emplaceBack(value);
-            }
-
-            this.maxValue = Math.max(this.maxValue, value);
-        }
-    };
-
-    SourceExpressionBinder.prototype.updatePaintArray = function updatePaintArray(start, end, feature, featureState) {
-        var paintArray = this.paintVertexArray;
-        var value = this.expression.evaluate({zoom: 0}, feature, featureState);
-
-        if (this.type === 'color') {
-            var color = packColor(value);
-            for (var i = start; i < end; i++) {
-                paintArray.emplace(i, color[0], color[1]);
-            }
-        } else {
-            for (var i$1 = start; i$1 < end; i$1++) {
-                paintArray.emplace(i$1, value);
-            }
-
-            this.maxValue = Math.max(this.maxValue, value);
-        }
-    };
-
-    SourceExpressionBinder.prototype.upload = function upload(context) {
-        if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) {
-            if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) {
-                this.paintVertexBuffer.updateData(this.paintVertexArray);
-            } else {
-                this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent);
-            }
-        }
-    };
-
-    SourceExpressionBinder.prototype.destroy = function destroy() {
-        if (this.paintVertexBuffer) {
-            this.paintVertexBuffer.destroy();
-        }
-    };
-
-    SourceExpressionBinder.prototype.setUniforms = function setUniforms(context, uniform) {
-        uniform.set(0);
-    };
-
-    SourceExpressionBinder.prototype.getBinding = function getBinding(context, location) {
-        return new UniformType.Uniform1f(context, location);
-    };
-
-    var CompositeExpressionBinder = function CompositeExpressionBinder(expression, names, type, useIntegerZoom, zoom, layout) {
-        this.expression = expression;
-        this.names = names;
-        this.uniformNames = this.names.map(function (name) {
-            return ("u_" + name + "_t");
-        });
-        this.type = type;
-        this.useIntegerZoom = useIntegerZoom;
-        this.zoom = zoom;
-        this.maxValue = -Infinity;
-        var PaintVertexArray = layout;
-        this.paintVertexAttributes = names.map(function (name) {
-            return {
-                name: ("a_" + name),
-                type: 'Float32',
-                components: type === 'color' ? 4 : 2,
-                offset: 0
-            };
-        });
-        this.paintVertexArray = new PaintVertexArray();
-    };
-
-    CompositeExpressionBinder.prototype.defines = function defines() {
-        return [];
-    };
-
-    CompositeExpressionBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions() {
-    };
-
-    CompositeExpressionBinder.prototype.populatePaintArray = function populatePaintArray(newLength, feature, imagePositions, formattedSection) {
-        var paintArray = this.paintVertexArray;
-
-        var start = paintArray.length;
-        paintArray.reserve(newLength);
-
-        var min = this.expression.evaluate(new EvaluationParameters(this.zoom), feature, {}, [], formattedSection);
-        var max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1), feature, {}, [], formattedSection);
-
-        if (this.type === 'color') {
-            var minColor = packColor(min);
-            var maxColor = packColor(max);
-            for (var i = start; i < newLength; i++) {
-                paintArray.emplaceBack(minColor[0], minColor[1], maxColor[0], maxColor[1]);
-            }
-        } else {
-            for (var i$1 = start; i$1 < newLength; i$1++) {
-                paintArray.emplaceBack(min, max);
-            }
-            this.maxValue = Math.max(this.maxValue, min, max);
-        }
-    };
-
-    CompositeExpressionBinder.prototype.updatePaintArray = function updatePaintArray(start, end, feature, featureState) {
-        var paintArray = this.paintVertexArray;
-
-        var min = this.expression.evaluate({zoom: this.zoom}, feature, featureState);
-        var max = this.expression.evaluate({zoom: this.zoom + 1}, feature, featureState);
-
-        if (this.type === 'color') {
-            var minColor = packColor(min);
-            var maxColor = packColor(max);
-            for (var i = start; i < end; i++) {
-                paintArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]);
-            }
-        } else {
-            for (var i$1 = start; i$1 < end; i$1++) {
-                paintArray.emplace(i$1, min, max);
-            }
-            this.maxValue = Math.max(this.maxValue, min, max);
-        }
-    };
-
-    CompositeExpressionBinder.prototype.upload = function upload(context) {
-        if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) {
-            if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) {
-                this.paintVertexBuffer.updateData(this.paintVertexArray);
-            } else {
-                this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent);
-            }
-        }
-    };
-
-    CompositeExpressionBinder.prototype.destroy = function destroy() {
-        if (this.paintVertexBuffer) {
-            this.paintVertexBuffer.destroy();
-        }
-    };
-
-    CompositeExpressionBinder.prototype.interpolationFactor = function interpolationFactor(currentZoom) {
-        if (this.useIntegerZoom) {
-            currentZoom = Math.floor(currentZoom);
-        }
-        return clamp$1(this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1), 0, 1);
-    };
-
-    CompositeExpressionBinder.prototype.setUniforms = function setUniforms(context, uniform, globals) {
-        uniform.set(this.interpolationFactor(globals.zoom));
-    };
-
-    CompositeExpressionBinder.prototype.getBinding = function getBinding(context, location) {
-        return new UniformType.Uniform1f(context, location);
-    };
-
-    var CrossFadedCompositeBinder = function CrossFadedCompositeBinder(expression, names, type, useIntegerZoom, zoom, PaintVertexArray, layerId) {
-
-        this.expression = expression;
-        this.names = names;
-        this.type = type;
-        this.uniformNames = this.names.map(function (name) {
-            return ("u_" + name + "_t");
-        });
-        this.useIntegerZoom = useIntegerZoom;
-        this.zoom = zoom;
-        this.maxValue = -Infinity;
-        this.layerId = layerId;
-
-        this.paintVertexAttributes = names.map(function (name) {
-                return ({
-                    name: ("a_" + name),
-                    type: 'Uint16',
-                    components: 4,
-                    offset: 0
-                });
-            }
-        );
-
-        this.zoomInPaintVertexArray = new PaintVertexArray();
-        this.zoomOutPaintVertexArray = new PaintVertexArray();
-    };
-
-    CrossFadedCompositeBinder.prototype.defines = function defines() {
-        return [];
-    };
-
-    CrossFadedCompositeBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions() {
-    };
-
-    CrossFadedCompositeBinder.prototype.populatePaintArray = function populatePaintArray(length, feature, imagePositions) {
-        // We populate two paint arrays because, for cross-faded properties, we don't know which direction
-        // we're cross-fading to at layout time. In order to keep vertex attributes to a minimum and not pass
-        // unnecessary vertex data to the shaders, we determine which to upload at draw time.
-
-        var zoomInArray = this.zoomInPaintVertexArray;
-        var zoomOutArray = this.zoomOutPaintVertexArray;
-        var ref = this;
-        var layerId = ref.layerId;
-        var start = zoomInArray.length;
-
-        zoomInArray.reserve(length);
-        zoomOutArray.reserve(length);
-
-        if (imagePositions && feature.patterns && feature.patterns[layerId]) {
-            var ref$1 = feature.patterns[layerId];
-            var min = ref$1.min;
-            var mid = ref$1.mid;
-            var max = ref$1.max;
-
-            var imageMin = imagePositions[min];
-            var imageMid = imagePositions[mid];
-            var imageMax = imagePositions[max];
-
-            if (!imageMin || !imageMid || !imageMax) {
-                return;
-            }
-
-            for (var i = start; i < length; i++) {
-                zoomInArray.emplaceBack(
-                    imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1],
-                    imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1]
-                );
-
-                zoomOutArray.emplaceBack(
-                    imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1],
-                    imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1]
-                );
-            }
-        }
-    };
-
-    CrossFadedCompositeBinder.prototype.updatePaintArray = function updatePaintArray(start, end, feature, featureState, imagePositions) {
-        // We populate two paint arrays because, for cross-faded properties, we don't know which direction
-        // we're cross-fading to at layout time. In order to keep vertex attributes to a minimum and not pass
-        // unnecessary vertex data to the shaders, we determine which to upload at draw time.
-
-        var zoomInArray = this.zoomInPaintVertexArray;
-        var zoomOutArray = this.zoomOutPaintVertexArray;
-        var ref = this;
-        var layerId = ref.layerId;
-
-        if (imagePositions && feature.patterns && feature.patterns[layerId]) {
-            var ref$1 = feature.patterns[layerId];
-            var min = ref$1.min;
-            var mid = ref$1.mid;
-            var max = ref$1.max;
-            var imageMin = imagePositions[min];
-            var imageMid = imagePositions[mid];
-            var imageMax = imagePositions[max];
-
-            if (!imageMin || !imageMid || !imageMax) {
-                return;
-            }
-            for (var i = start; i < end; i++) {
-                zoomInArray.emplace(i,
-                    imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1],
-                    imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1]
-                );
-
-                zoomOutArray.emplace(i,
-                    imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1],
-                    imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1]
-                );
-            }
-        }
-    };
-
-    CrossFadedCompositeBinder.prototype.upload = function upload(context) {
-        if (this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer) {
-            this.zoomInPaintVertexBuffer = context.createVertexBuffer(this.zoomInPaintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent);
-            this.zoomOutPaintVertexBuffer = context.createVertexBuffer(this.zoomOutPaintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent);
-        }
-    };
-
-    CrossFadedCompositeBinder.prototype.destroy = function destroy() {
-        if (this.zoomOutPaintVertexBuffer) {
-            this.zoomOutPaintVertexBuffer.destroy();
-        }
-        if (this.zoomInPaintVertexBuffer) {
-            this.zoomInPaintVertexBuffer.destroy();
-        }
-
-    };
-
-    CrossFadedCompositeBinder.prototype.setUniforms = function setUniforms(context, uniform) {
-        uniform.set(0);
-    };
-
-    CrossFadedCompositeBinder.prototype.getBinding = function getBinding(context, location) {
-        return new Uniform1f(context, location);
-    };
-
-    /**
-     * ProgramConfiguration contains the logic for binding style layer properties and tile
-     * layer feature data into GL program uniforms and vertex attributes.
-     *
-     * Non-data-driven property values are bound to shader uniforms. Data-driven property
-     * values are bound to vertex attributes. In order to support a uniform GLSL syntax over
-     * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma`
-     * abstraction, which ProgramConfiguration is responsible for implementing. At runtime,
-     * it examines the attributes of a particular layer, combines this with fixed knowledge
-     * about how layers of the particular type are implemented, and determines which uniforms
-     * and vertex attributes will be required. It can then substitute the appropriate text
-     * into the shader source code, create and link a program, and bind the uniforms and
-     * vertex attributes in preparation for drawing.
-     *
-     * When a vector tile is parsed, this same configuration information is used to
-     * populate the attribute buffers needed for data-driven styling using the zoom
-     * level and feature property data.
-     *
-     * @private
-     */
-    var ProgramConfiguration = function ProgramConfiguration() {
-        this.binders = {};
-        this.cacheKey = '';
-        this._buffers = [];
-    };
-
-    ProgramConfiguration.createDynamic = function createDynamic(layer, zoom, filterProperties) {
-        var self = new ProgramConfiguration();
-        var keys = [];
-
-        for (var property in layer.paint._values) {
-            if (!filterProperties(property)) {
-                continue;
-            }
-            var value = layer.paint.get(property);
-            if (!(value instanceof PossiblyEvaluatedPropertyValue$1) || !Supports.supportsPropertyExpression(value.property.specification)) {
-                continue;
-            }
-            var names = paintAttributeNames(property, layer.type);
-            var type = value.property.specification.type;
-            var useIntegerZoom = value.property.useIntegerZoom;
-            var isCrossFaded = value.property.specification['property-type'] === 'cross-faded' ||
-                value.property.specification['property-type'] === 'cross-faded-data-driven';
-
-            if (isCrossFaded) {
-                if (value.value.kind === 'constant') {
-                    self.binders[property] = new CrossFadedConstantBinder(value.value.value, names, type);
-                    keys.push(("/u_" + property));
-                } else {
-                    var StructArrayLayout = layoutType(property, type, 'source');
-                    self.binders[property] = new CrossFadedCompositeBinder(value.value, names, type, useIntegerZoom, zoom, StructArrayLayout, layer.id);
-                    keys.push(("/a_" + property));
-                }
-            } else if (value.value.kind === 'constant') {
-                self.binders[property] = new ConstantBinder(value.value.value, names, type);
-                keys.push(("/u_" + property));
-            } else if (value.value.kind === 'source') {
-                var StructArrayLayout$1 = layoutType(property, type, 'source');
-                self.binders[property] = new SourceExpressionBinder(value.value, names, type, StructArrayLayout$1);
-                keys.push(("/a_" + property));
-            } else {
-                var StructArrayLayout$2 = layoutType(property, type, 'composite');
-                self.binders[property] = new CompositeExpressionBinder(value.value, names, type, useIntegerZoom, zoom, StructArrayLayout$2);
-                keys.push(("/z_" + property));
-            }
-        }
-
-        self.cacheKey = keys.sort().join('');
-
-        return self;
-    };
-
-    ProgramConfiguration.prototype.populatePaintArrays = function populatePaintArrays(newLength, feature, index, imagePositions, formattedSection) {
-        for (var property in this.binders) {
-            var binder = this.binders[property];
-            binder.populatePaintArray(newLength, feature, imagePositions, formattedSection);
-        }
-    };
-    ProgramConfiguration.prototype.setConstantPatternPositions = function setConstantPatternPositions(posTo, posFrom) {
-        for (var property in this.binders) {
-            var binder = this.binders[property];
-            binder.setConstantPatternPositions(posTo, posFrom);
-        }
-    };
-
-    ProgramConfiguration.prototype.updatePaintArrays = function updatePaintArrays(featureStates, featureMap, vtLayer, layer, imagePositions) {
-        var dirty = false;
-        for (var id in featureStates) {
-            var positions = featureMap.getPositions(+id);
-
-            for (var i = 0, list = positions; i < list.length; i += 1) {
-                var pos = list[i];
-
-                var feature = vtLayer.feature(pos.index);
-
-                for (var property in this.binders) {
-                    var binder = this.binders[property];
-                    if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder) {
-                        continue;
-                    }
-                    if ((binder   ).expression.isStateDependent === true) {
-                        //AHM: Remove after https://github.com/mapbox/mapbox-gl-js/issues/6255
-                        var value = layer.paint.get(property);
-                        (binder   ).expression = value.value;
-                        binder.updatePaintArray(pos.start, pos.end, feature, featureStates[id], imagePositions);
-                        dirty = true;
-                    }
-                }
-            }
-        }
-        return dirty;
-    };
-
-    ProgramConfiguration.prototype.defines = function defines() {
-        var result = [];
-        for (var property in this.binders) {
-            result.push.apply(result, this.binders[property].defines());
-        }
-        return result;
-    };
-
-    ProgramConfiguration.prototype.getPaintVertexBuffers = function getPaintVertexBuffers() {
-        return this._buffers;
-    };
-
-    ProgramConfiguration.prototype.getUniforms = function getUniforms(context, locations) {
-        var uniforms = [];
-        for (var property in this.binders) {
-            var binder = this.binders[property];
-            for (var i = 0, list = binder.uniformNames; i < list.length; i += 1) {
-                var name = list[i];
-
-                if (locations[name]) {
-                    var binding = binder.getBinding(context, locations[name]);
-                    uniforms.push({name: name, property: property, binding: binding});
-                }
-            }
-        }
-        return uniforms;
-    };
-
-    ProgramConfiguration.prototype.setUniforms = function setUniforms(context, binderUniforms, properties, globals) {
-        // Uniform state bindings are owned by the Program, but we set them
-        // from within the ProgramConfiguraton's binder members.
-        for (var i = 0, list = binderUniforms; i < list.length; i += 1) {
-            var ref = list[i];
-            var name = ref.name;
-            var property = ref.property;
-            var binding = ref.binding;
-
-            this.binders[property].setUniforms(context, binding, globals, properties.get(property), name);
-        }
-    };
-
-    ProgramConfiguration.prototype.updatePatternPaintBuffers = function updatePatternPaintBuffers(crossfade) {
-        var buffers = [];
-
-        for (var property in this.binders) {
-            var binder = this.binders[property];
-            if (binder instanceof CrossFadedCompositeBinder) {
-                var patternVertexBuffer = crossfade.fromScale === 2 ? binder.zoomInPaintVertexBuffer : binder.zoomOutPaintVertexBuffer;
-                if (patternVertexBuffer) {
-                    buffers.push(patternVertexBuffer);
-                }
-            } else if ((binder instanceof SourceExpressionBinder ||
-                binder instanceof CompositeExpressionBinder) &&
-                binder.paintVertexBuffer
-                ) {
-                buffers.push(binder.paintVertexBuffer);
-            }
-        }
-
-        this._buffers = buffers;
-    };
-
-    ProgramConfiguration.prototype.upload = function upload(context) {
-        for (var property in this.binders) {
-            this.binders[property].upload(context);
-        }
-
-        var buffers = [];
-        for (var property$1 in this.binders) {
-            var binder = this.binders[property$1];
-            if ((binder instanceof SourceExpressionBinder ||
-                binder instanceof CompositeExpressionBinder) &&
-                binder.paintVertexBuffer
-                ) {
-                buffers.push(binder.paintVertexBuffer);
-            }
-        }
-        this._buffers = buffers;
-    };
-
-    ProgramConfiguration.prototype.destroy = function destroy() {
-        for (var property in this.binders) {
-            this.binders[property].destroy();
-        }
-    };
-
-    function paintAttributeNames(property, type) {
-        var attributeNameExceptions = {
-            'text-opacity': ['opacity'],
-            'icon-opacity': ['opacity'],
-            'text-color': ['fill_color'],
-            'icon-color': ['fill_color'],
-            'text-halo-color': ['halo_color'],
-            'icon-halo-color': ['halo_color'],
-            'text-halo-blur': ['halo_blur'],
-            'icon-halo-blur': ['halo_blur'],
-            'text-halo-width': ['halo_width'],
-            'icon-halo-width': ['halo_width'],
-            'line-gap-width': ['gapwidth'],
-            'line-pattern': ['pattern_to', 'pattern_from'],
-            'fill-pattern': ['pattern_to', 'pattern_from'],
-            'fill-extrusion-pattern': ['pattern_to', 'pattern_from'],
-        };
-
-        return attributeNameExceptions[property] ||
-            [property.replace((type + "-"), '').replace(/-/g, '_')];
-    }
-
-    function getLayoutException(property) {
-        var propertyExceptions = {
-            'line-pattern': {
-                'source': StructArrayLayout8ui16,
-                'composite': StructArrayLayout8ui16
-            },
-            'fill-pattern': {
-                'source': StructArrayLayout8ui16,
-                'composite': StructArrayLayout8ui16
-            },
-            'fill-extrusion-pattern': {
-                'source': StructArrayLayout8ui16,
-                'composite': StructArrayLayout8ui16
-            }
-        };
-
-        return propertyExceptions[property];
-    }
-
-    function layoutType(property, type, binderType) {
-        var defaultLayouts = {
-            'color': {
-                'source': StructArrayLayout2f8,
-                'composite': StructArrayLayout4f16
-            },
-            'number': {
-                'source': StructArrayLayout1f4,
-                'composite': StructArrayLayout2f8
-            }
-        };
-
-        var layoutException = getLayoutException(property);
-        return  layoutException && layoutException[binderType] ||
-            defaultLayouts[type][binderType];
-    }
-
-    WebWorkerTransfer.register('ConstantBinder', ConstantBinder);
-    WebWorkerTransfer.register('CrossFadedConstantBinder', CrossFadedConstantBinder);
-    WebWorkerTransfer.register('SourceExpressionBinder', SourceExpressionBinder);
-    WebWorkerTransfer.register('CrossFadedCompositeBinder', CrossFadedCompositeBinder);
-    WebWorkerTransfer.register('CompositeExpressionBinder', CompositeExpressionBinder);
-    WebWorkerTransfer.register('ProgramConfiguration', ProgramConfiguration, {omit: ['_buffers']});
-
-    var ProgramConfigurationSet = function ProgramConfigurationSet(layoutAttributes, layers, zoom, filterProperties) {
-        if (filterProperties === void 0) filterProperties = function () {
-            return true;
-        };
-
-        this.programConfigurations = {};
-        for (var i = 0, list = layers; i < list.length; i += 1) {
-            var layer = list[i];
-
-            this.programConfigurations[layer.id] = ProgramConfiguration.createDynamic(layer, zoom, filterProperties);
-            this.programConfigurations[layer.id].layoutAttributes = layoutAttributes;
-        }
-        this.needsUpload = false;
-        this._featureMap = new FeaturePositionMap();
-        this._bufferOffset = 0;
-    };
-
-    ProgramConfigurationSet.prototype.populatePaintArrays = function populatePaintArrays(length, feature, index, imagePositions, formattedSection) {
-        for (var key in this.programConfigurations) {
-            this.programConfigurations[key].populatePaintArrays(length, feature, index, imagePositions, formattedSection);
-        }
-
-        if (feature.id !== undefined) {
-            this._featureMap.add(+feature.id, index, this._bufferOffset, length);
-        }
-        this._bufferOffset = length;
-
-        this.needsUpload = true;
-    };
-
-    ProgramConfigurationSet.prototype.updatePaintArrays = function updatePaintArrays(featureStates, vtLayer, layers, imagePositions) {
-        for (var i = 0, list = layers; i < list.length; i += 1) {
-            var layer = list[i];
-
-            this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, this._featureMap, vtLayer, layer, imagePositions) || this.needsUpload;
-        }
-    };
-
-    ProgramConfigurationSet.prototype.get = function get(layerId) {
-        return this.programConfigurations[layerId];
-    };
-
-    ProgramConfigurationSet.prototype.upload = function upload(context) {
-        if (!this.needsUpload) {
-            return;
-        }
-        for (var layerId in this.programConfigurations) {
-            this.programConfigurations[layerId].upload(context);
-        }
-        this.needsUpload = false;
-    };
-
-    ProgramConfigurationSet.prototype.destroy = function destroy() {
-        for (var layerId in this.programConfigurations) {
-            this.programConfigurations[layerId].destroy();
-        }
-    };
-
-    WebWorkerTransfer.register('ProgramConfigurationSet', ProgramConfigurationSet);
-
-    function addPatternDependencies(type, layers, patternFeature, zoom, options) {
-        var patterns = options.patternDependencies;
-        for (var i = 0, list = layers; i < list.length; i += 1) {
-            var layer = list[i];
-
-            var patternProperty = layer.paint.get((type + "-pattern"));
-
-            var patternPropertyValue = patternProperty.value;
-            if (patternPropertyValue.kind !== "constant") {
-                var min = patternPropertyValue.evaluate({zoom: zoom - 1}, patternFeature, {}, options.availableImages);
-                var mid = patternPropertyValue.evaluate({zoom: zoom}, patternFeature, {}, options.availableImages);
-                var max = patternPropertyValue.evaluate({zoom: zoom + 1}, patternFeature, {}, options.availableImages);
-                min = min && min.name ? min.name : min;
-                mid = mid && mid.name ? mid.name : mid;
-                max = max && max.name ? max.name : max;
-                // add to patternDependencies
-                patterns[min] = true;
-                patterns[mid] = true;
-                patterns[max] = true;
-
-                // save for layout
-                patternFeature.patterns[layer.id] = {min: min, mid: mid, max: max};
-            }
-        }
-        return patternFeature;
-    }
-
-    var VectorTileFeatureTypes = ['Unknown', 'Point', 'LineString', 'Polygon'];
-
-    var lineLayoutAttributes = createLayout([
-        {name: 'a_pos_normal', components: 2, type: 'Int16'},
-        {name: 'a_data', components: 4, type: 'Uint8'}
-    ], 4);
-    var members$3 = lineLayoutAttributes.members;
-
-    // NOTE ON EXTRUDE SCALE:
-    // scale the extrusion vector so that the normal length is this value.
-    // contains the "texture" normals (-1..1). this is distinct from the extrude
-    // normals for line joins, because the x-value remains 0 for the texture
-    // normal array, while the extrude normal actually moves the vertex to create
-    // the acute/bevelled line join.
-    var EXTRUDE_SCALE = 63;
-
-    /*
-     * Sharp corners cause dashed lines to tilt because the distance along the line
-     * is the same at both the inner and outer corners. To improve the appearance of
-     * dashed lines we add extra points near sharp corners so that a smaller part
-     * of the line is tilted.
-     *
-     * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an
-     * extra vertex. The default is 75 degrees.
-     *
-     * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.
-     */
-    var COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));
-    var SHARP_CORNER_OFFSET = 15;
-
-    // Angle per triangle for approximating round line joins.
-    var DEG_PER_TRIANGLE = 20;
-
-    // The number of bits that is used to store the line distance in the buffer.
-    var LINE_DISTANCE_BUFFER_BITS = 15;
-
-    // We don't have enough bits for the line distance as we'd like to have, so
-    // use this value to scale the line distance (in tile units) down to a smaller
-    // value. This lets us store longer distances while sacrificing precision.
-    var LINE_DISTANCE_SCALE = 1 / 2;
-
-    // The maximum line distance, in tile units, that fits in the buffer.
-    var MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE;
-
-    /**
-     * @private
-     */
-    var LineBucket = function LineBucket(options) {
-        this.zoom = options.zoom;
-        this.overscaling = options.overscaling;
-        this.layers = options.layers;
-        this.layerIds = this.layers.map(function (layer) {
-            return layer.id;
-        });
-        this.index = options.index;
-        this.hasPattern = false;
-        this.patternFeatures = [];
-
-        this.layoutVertexArray = new StructArrayLayout2i4ub8();
-        this.indexArray = new StructArrayLayout3ui6();
-        this.programConfigurations = new ProgramConfigurationSet(members$3, options.layers, options.zoom);
-        this.segments = new SegmentVector();
-
-        this.stateDependentLayerIds = this.layers.filter(function (l) {
-            return l.isStateDependent();
-        }).map(function (l) {
-            return l.id;
-        });
-    };
-
-    LineBucket.prototype.populate = function populate(features, options) {
-        //this.hasPattern = hasPattern('line', this.layers, options);
-        this.hasPattern = false;
-        var lineSortKey = this.layers[0].layout.get('line-sort-key');
-        var bucketFeatures = [];
-
-        for (var i = 0, list = features; i < list.length; i += 1) {
-            var ref = list[i];
-            var feature = ref.feature;
-            var index = ref.index;
-            var sourceLayerIndex = ref.sourceLayerIndex;
-
-            if (!this.layers[0]._featureFilter(new EvaluationParameters$1(0), feature)) {
-                continue;
-            }
-
-            var geometry = loadGeometry(feature);
-            var sortKey = lineSortKey ?
-                lineSortKey.evaluate(feature, {}) :
-                undefined;
-
-            var bucketFeature = {
-                id: feature.id,
-                properties: feature.properties,
-                type: feature.type,
-                sourceLayerIndex: sourceLayerIndex,
-                index: index,
-                geometry: geometry,
-                patterns: {},
-                sortKey: sortKey
-            };
-
-            bucketFeatures.push(bucketFeature);
-        }
-
-        if (lineSortKey) {
-            bucketFeatures.sort(function (a, b) {
-                // a.sortKey is always a number when in use
-                return ((a.sortKey )    ) - ((b.sortKey )    );
-            });
-        }
-
-        for (var i$1 = 0, list$1 = bucketFeatures; i$1 < list$1.length; i$1 += 1) {
-            var bucketFeature$1 = list$1[i$1];
-
-            var ref$1 = bucketFeature$1;
-            var geometry$1 = ref$1.geometry;
-            var index$1 = ref$1.index;
-            var sourceLayerIndex$1 = ref$1.sourceLayerIndex;
-
-            if (this.hasPattern) {
-                var patternBucketFeature = addPatternDependencies('line', this.layers, bucketFeature$1, this.zoom, options);
-                // pattern features are added only once the pattern is loaded into the image atlas
-                // so are stored during populate until later updated with positions by tile worker in addFeatures
-                this.patternFeatures.push(patternBucketFeature);
-            } else {
-                this.addFeature(bucketFeature$1, geometry$1, index$1, {});
-            }
-
-            var feature$1 = features[index$1].feature;
-            options.featureIndex.insert(feature$1, geometry$1, index$1, sourceLayerIndex$1, this.index);
-        }
-    };
-
-    LineBucket.prototype.update = function update(states, vtLayer, imagePositions) {
-        if (!this.stateDependentLayers.length) {
-            return;
-        }
-        this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
-    };
-
-    LineBucket.prototype.addFeatures = function addFeatures(options, imagePositions) {
-        for (var i = 0, list = this.patternFeatures; i < list.length; i += 1) {
-            var feature = list[i];
-
-            this.addFeature(feature, feature.geometry, feature.index, imagePositions);
-        }
-    };
-
-    LineBucket.prototype.isEmpty = function isEmpty() {
-        return this.layoutVertexArray.length === 0;
-    };
-
-    LineBucket.prototype.uploadPending = function uploadPending() {
-        return !this.uploaded || this.programConfigurations.needsUpload;
-    };
-
-    LineBucket.prototype.upload = function upload(context) {
-        if (!this.uploaded) {
-            if(this.layoutVertexArray == null) {
-                return;
-            }
-            this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$3);
-            this.indexBuffer = context.createIndexBuffer(this.indexArray);
-        }
-        this.programConfigurations.upload(context);
-        this.uploaded = true;
-    };
-
-    LineBucket.prototype.destroy = function destroy() {
-        if (!this.layoutVertexBuffer) {
-            return;
-        }
-        this.layoutVertexBuffer.destroy();
-        this.indexBuffer.destroy();
-        this.programConfigurations.destroy();
-        this.segments.destroy();
-    };
-
-    LineBucket.prototype.clear = function clear() {
-        if (when.defined(this.layoutVertexArray)) {
-            this.layoutVertexArray = null;
-        }
-        if (when.defined(this.indexArray)) {
-            this.indexArray = null;
-        }
-    };
-
-    LineBucket.prototype.addFeature = function addFeature(feature, geometry, index, imagePositions) {
-        var layout = this.layers[0].layout;
-        var join = layout.get('line-join').evaluate(feature, {});
-        var cap = layout.get('line-cap');
-        var miterLimit = layout.get('line-miter-limit');
-        var roundLimit = layout.get('line-round-limit');
-
-        for (var i = 0, list = geometry; i < list.length; i += 1) {
-            var line = list[i];
-
-            this.addLine(line, feature, join, cap, miterLimit, roundLimit, index, imagePositions);
-        }
-    };
-
-    LineBucket.prototype.addLine = function addLine(vertices, feature, join, cap, miterLimit, roundLimit, index, imagePositions) {
-        this.distance = 0;
-        this.scaledDistance = 0;
-        this.totalDistance = 0;
-
-        if (!!feature.properties &&
-            feature.properties.hasOwnProperty('mapbox_clip_start') &&
-            feature.properties.hasOwnProperty('mapbox_clip_end')) {
-
-            this.clipStart = +feature.properties['mapbox_clip_start'];
-            this.clipEnd = +feature.properties['mapbox_clip_end'];
-
-            // Calculate the total distance, in tile units, of this tiled line feature
-            for (var i = 0; i < vertices.length - 1; i++) {
-                this.totalDistance += vertices[i].dist(vertices[i + 1]);
-            }
-        }
-
-        var isPolygon = VectorTileFeatureTypes[feature.type] === 'Polygon';
-
-        // If the line has duplicate vertices at the ends, adjust start/length to remove them.
-        var len = vertices.length;
-        while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) {
-            len--;
-        }
-        var first = 0;
-        while (first < len - 1 && vertices[first].equals(vertices[first + 1])) {
-            first++;
-        }
-
-        // Ignore invalid geometry.
-        if (len < (isPolygon ? 3 : 2)) {
-            return;
-        }
-
-        if (join === 'bevel') {
-            miterLimit = 1.05;
-        }
-
-        var sharpCornerOffset = this.overscaling <= 16 ?
-            SHARP_CORNER_OFFSET * EXTENT / (512 * this.overscaling) :
-            0;
-
-        // we could be more precise, but it would only save a negligible amount of space
-        var segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray);
-
-        var currentVertex;
-        var prevVertex = ((undefined )   );
-        var nextVertex = ((undefined )   );
-        var prevNormal = ((undefined )   );
-        var nextNormal = ((undefined )   );
-
-        // the last two vertices added
-        this.e1 = this.e2 = -1;
-
-        if (isPolygon) {
-            currentVertex = vertices[len - 2];
-            nextNormal = vertices[first].sub(currentVertex)._unit()._perp();
-        }
-
-        for (var i$1 = first; i$1 < len; i$1++) {
-
-            nextVertex = isPolygon && i$1 === len - 1 ?
-                vertices[first + 1] : // if the line is closed, we treat the last vertex like the first
-                vertices[i$1 + 1]; // just the next vertex
-
-            // if two consecutive vertices exist, skip the current one
-            if (nextVertex && vertices[i$1].equals(nextVertex)) {
-                continue;
-            }
-
-            if (nextNormal) {
-                prevNormal = nextNormal;
-            }
-            if (currentVertex) {
-                prevVertex = currentVertex;
-            }
-
-            currentVertex = vertices[i$1];
-
-            // Calculate the normal towards the next vertex in this line. In case
-            // there is no next vertex, pretend that the line is continuing straight,
-            // meaning that we are just using the previous normal.
-            nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;
-
-            // If we still don't have a previous normal, this is the beginning of a
-            // non-closed line, so we're doing a straight "join".
-            prevNormal = prevNormal || nextNormal;
-
-            // Determine the normal of the join extrusion. It is the angle bisector
-            // of the segments between the previous line and the next line.
-            // In the case of 180° angles, the prev and next normals cancel each other out:
-            // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be
-            // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle
-            // below will also become 0 and miterLength will become Infinity.
-            var joinNormal = prevNormal.add(nextNormal);
-            if (joinNormal.x !== 0 || joinNormal.y !== 0) {
-                joinNormal._unit();
-            }
-            /*  joinNormal prevNormal
-             *         ↖  ↑
-             *            .________. prevVertex
-             *            |
-             * nextNormal  ←  |  currentVertex
-             *            |
-             * nextVertex !
-             *
-             */
-
-            // calculate cosines of the angle (and its half) using dot product
-            var cosAngle = prevNormal.x * nextNormal.x + prevNormal.y * nextNormal.y;
-            var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;
-
-            // Calculate the length of the miter (the ratio of the miter to the width)
-            // as the inverse of cosine of the angle between next and join normals
-            var miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity;
-
-            // approximate angle from cosine
-            var approxAngle = 2 * Math.sqrt(2 - 2 * cosHalfAngle);
-
-            var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;
-            var lineTurnsLeft = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0;
-
-            if (isSharpCorner && i$1 > first) {
-                var prevSegmentLength = currentVertex.dist(prevVertex);
-                if (prevSegmentLength > 2 * sharpCornerOffset) {
-                    var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());
-                    this.updateDistance(prevVertex, newPrevVertex);
-                    this.addCurrentVertex(newPrevVertex, prevNormal, 0, 0, segment);
-                    prevVertex = newPrevVertex;
-                }
-            }
-
-            // The join if a middle vertex, otherwise the cap.
-            var middleVertex = prevVertex && nextVertex;
-            var currentJoin = middleVertex ? join : isPolygon ? 'butt' : cap;
-
-            if (middleVertex && currentJoin === 'round') {
-                if (miterLength < roundLimit) {
-                    currentJoin = 'miter';
-                } else if (miterLength <= 2) {
-                    currentJoin = 'fakeround';
-                }
-            }
-
-            if (currentJoin === 'miter' && miterLength > miterLimit) {
-                currentJoin = 'bevel';
-            }
-
-            if (currentJoin === 'bevel') {
-                // The maximum extrude length is 128 / 63 = 2 times the width of the line
-                // so if miterLength >= 2 we need to draw a different type of bevel here.
-                if (miterLength > 2) {
-                    currentJoin = 'flipbevel';
-                }
-
-                // If the miterLength is really small and the line bevel wouldn't be visible,
-                // just draw a miter join to save a triangle.
-                if (miterLength < miterLimit) {
-                    currentJoin = 'miter';
-                }
-            }
-
-            // Calculate how far along the line the currentVertex is
-            if (prevVertex) {
-                this.updateDistance(prevVertex, currentVertex);
-            }
-
-            if (currentJoin === 'miter') {
-
-                joinNormal._mult(miterLength);
-                this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
-
-            } else if (currentJoin === 'flipbevel') {
-                // miter is too big, flip the direction to make a beveled join
-
-                if (miterLength > 100) {
-                    // Almost parallel lines
-                    joinNormal = nextNormal.mult(-1);
-
-                } else {
-                    var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();
-                    joinNormal._perp()._mult(bevelLength * (lineTurnsLeft ? -1 : 1));
-                }
-                this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
-                this.addCurrentVertex(currentVertex, joinNormal.mult(-1), 0, 0, segment);
-
-            } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {
-                var offset = -Math.sqrt(miterLength * miterLength - 1);
-                var offsetA = lineTurnsLeft ? offset : 0;
-                var offsetB = lineTurnsLeft ? 0 : offset;
-
-                // Close previous segment with a bevel
-                if (prevVertex) {
-                    this.addCurrentVertex(currentVertex, prevNormal, offsetA, offsetB, segment);
-                }
-
-                if (currentJoin === 'fakeround') {
-                    // The join angle is sharp enough that a round join would be visible.
-                    // Bevel joins fill the gap between segments with a single pie slice triangle.
-                    // Create a round join by adding multiple pie slices. The join isn't actually round, but
-                    // it looks like it is at the sizes we render lines at.
-
-                    // pick the number of triangles for approximating round join by based on the angle between normals
-                    var n = Math.round((approxAngle * 180 / Math.PI) / DEG_PER_TRIANGLE);
-
-                    for (var m = 1; m < n; m++) {
-                        var t = m / n;
-                        if (t !== 0.5) {
-                            // approximate spherical interpolation https://observablehq.com/@mourner/approximating-geometric-slerp
-                            var t2 = t - 0.5;
-                            var A = 1.0904 + cosAngle * (-3.2452 + cosAngle * (3.55645 - cosAngle * 1.43519));
-                            var B = 0.848013 + cosAngle * (-1.06021 + cosAngle * 0.215638);
-                            t = t + t * t2 * (t - 1) * (A * t2 * t2 + B);
-                        }
-                        var extrude = nextNormal.sub(prevNormal)._mult(t)._add(prevNormal)._unit()._mult(lineTurnsLeft ? -1 : 1);
-                        this.addHalfVertex(currentVertex, extrude.x, extrude.y, false, lineTurnsLeft, 0, segment);
-                    }
-                }
-
-                if (nextVertex) {
-                    // Start next segment
-                    this.addCurrentVertex(currentVertex, nextNormal, -offsetA, -offsetB, segment);
-                }
-
-            } else if (currentJoin === 'butt') {
-                this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); // butt cap
-
-            } else if (currentJoin === 'square') {
-                var offset$1 = prevVertex ? 1 : -1; // closing or starting square cap
-                this.addCurrentVertex(currentVertex, joinNormal, offset$1, offset$1, segment);
-
-            } else if (currentJoin === 'round') {
-
-                if (prevVertex) {
-                    // Close previous segment with butt
-                    this.addCurrentVertex(currentVertex, prevNormal, 0, 0, segment);
-
-                    // Add round cap or linejoin at end of segment
-                    this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment, true);
-                }
-                if (nextVertex) {
-                    // Add round cap before first segment
-                    this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment, true);
-
-                    // Start next segment with a butt
-                    this.addCurrentVertex(currentVertex, nextNormal, 0, 0, segment);
-                }
-            }
-
-            if (isSharpCorner && i$1 < len - 1) {
-                var nextSegmentLength = currentVertex.dist(nextVertex);
-                if (nextSegmentLength > 2 * sharpCornerOffset) {
-                    var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());
-                    this.updateDistance(currentVertex, newCurrentVertex);
-                    this.addCurrentVertex(newCurrentVertex, nextNormal, 0, 0, segment);
-                    currentVertex = newCurrentVertex;
-                }
-            }
-        }
-
-        this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions);
-    };
-
-    /**
-     * Add two vertices to the buffers.
-     *
-     * @param p the line vertex to add buffer vertices for
-     * @param normal vertex normal
-     * @param endLeft extrude to shift the left vertex along the line
-     * @param endRight extrude to shift the left vertex along the line
-     * @param segment the segment object to add the vertex to
-     * @param round whether this is a round cap
-     * @private
-     */
-    LineBucket.prototype.addCurrentVertex = function addCurrentVertex(p, normal, endLeft, endRight, segment, round) {
-        if (round === void 0) round = false;
-
-        // left and right extrude vectors, perpendicularly shifted by endLeft/endRight
-        var leftX = normal.x + normal.y * endLeft;
-        var leftY = normal.y - normal.x * endLeft;
-        var rightX = -normal.x + normal.y * endRight;
-        var rightY = -normal.y - normal.x * endRight;
-
-        this.addHalfVertex(p, leftX, leftY, round, false, endLeft, segment);
-        this.addHalfVertex(p, rightX, rightY, round, true, -endRight, segment);
-
-        // There is a maximum "distance along the line" that we can store in the buffers.
-        // When we get close to the distance, reset it to zero and add the vertex again with
-        // a distance of zero. The max distance is determined by the number of bits we allocate
-        // to `linesofar`.
-        if (this.distance > MAX_LINE_DISTANCE / 2 && this.totalDistance === 0) {
-            this.distance = 0;
-            this.addCurrentVertex(p, normal, endLeft, endRight, segment, round);
-        }
-    };
-
-    LineBucket.prototype.addHalfVertex = function addHalfVertex(ref, extrudeX, extrudeY, round, up, dir, segment) {
-        var x = ref.x;
-        var y = ref.y;
-
-        // scale down so that we can store longer distances while sacrificing precision.
-        var linesofar = this.scaledDistance * LINE_DISTANCE_SCALE;
-
-        this.layoutVertexArray.emplaceBack(
-            // a_pos_normal
-            // Encode round/up the least significant bits
-            (x << 1) + (round ? 1 : 0),
-            (y << 1) + (up ? 1 : 0),
-            // a_data
-            // add 128 to store a byte in an unsigned byte
-            Math.round(EXTRUDE_SCALE * extrudeX) + 128,
-            Math.round(EXTRUDE_SCALE * extrudeY) + 128,
-            // Encode the -1/0/1 direction value into the first two bits of .z of a_data.
-            // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make
-            // room for the direction value). The upper 8 bits of `linesofar` are placed in
-            // the `w` component.
-            ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofar & 0x3F) << 2),
-            linesofar >> 6);
-
-        var e = segment.vertexLength++;
-        if (this.e1 >= 0 && this.e2 >= 0) {
-            this.indexArray.emplaceBack(this.e1, this.e2, e);
-            segment.primitiveLength++;
-        }
-        if (up) {
-            this.e2 = e;
-        } else {
-            this.e1 = e;
-        }
-    };
-
-    LineBucket.prototype.updateDistance = function updateDistance(prev, next) {
-        this.distance += prev.dist(next);
-
-        // Knowing the ratio of the full linestring covered by this tiled feature, as well
-        // as the total distance (in tile units) of this tiled feature, and the distance
-        // (in tile units) of the current vertex, we can determine the relative distance
-        // of this vertex along the full linestring feature and scale it to [0, 2^15)
-        this.scaledDistance = this.totalDistance > 0 ?
-            (this.clipStart + (this.clipEnd - this.clipStart) * this.distance / this.totalDistance) * (MAX_LINE_DISTANCE - 1) :
-            this.distance;
-    };
-
-    WebWorkerTransfer.register('LineBucket', LineBucket, {omit: ['layers', 'patternFeatures']});
-
-    function quickselect(arr, k, left, right, compare) {
-        quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
-    }
-    function quickselectStep(arr, k, left, right, compare) {
-
-        while (right > left) {
-            if (right - left > 600) {
-                var n = right - left + 1;
-                var m = k - left + 1;
-                var z = Math.log(n);
-                var s = 0.5 * Math.exp(2 * z / 3);
-                var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
-                var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
-                var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
-                quickselectStep(arr, k, newLeft, newRight, compare);
-            }
-
-            var t = arr[k];
-            var i = left;
-            var j = right;
-
-            swap$1(arr, left, k);
-            if (compare(arr[right], t) > 0) swap$1(arr, left, right);
-
-            while (i < j) {
-                swap$1(arr, i, j);
-                i++;
-                j--;
-                while (compare(arr[i], t) < 0) i++;
-                while (compare(arr[j], t) > 0) j--;
-            }
-
-            if (compare(arr[left], t) === 0) swap$1(arr, left, j);
-            else {
-                j++;
-                swap$1(arr, j, right);
-            }
-
-            if (j <= k) left = j + 1;
-            if (k <= j) right = j - 1;
-        }
-    }
-
-    function swap$1(arr, i, j) {
-        var tmp = arr[i];
-        arr[i] = arr[j];
-        arr[j] = tmp;
-    }
-
-    function defaultCompare(a, b) {
-        return a < b ? -1 : a > b ? 1 : 0;
-    }
-
-    /**
-     * Returns the signed area for the polygon ring.  Postive areas are exterior rings and
-     * have a clockwise winding.  Negative areas are interior rings and have a counter clockwise
-     * ordering.
-     *
-     * @private
-     * @param ring Exterior or interior ring
-     */
-    function calculateSignedArea(ring) {
-        var sum = 0;
-        for (var i = 0, len = ring.length, j = len - 1, p1 = (void 0), p2 = (void 0); i < len; j = i++) {
-            p1 = ring[i];
-            p2 = ring[j];
-            sum += (p2.x - p1.x) * (p1.y + p2.y);
-        }
-        return sum;
-    }
-
-    // classifies an array of rings into polygons with outer rings and holes
-    function classifyRings(rings, maxRings) {
-        var len = rings.length;
-
-        if (len <= 1) {
-            return [rings];
-        }
-
-        var polygons = [];
-        var polygon,
-            ccw;
-
-        for (var i = 0; i < len; i++) {
-            var area = calculateSignedArea(rings[i]);
-            if (area === 0) {
-                continue;
-            }
-
-            (rings[i]     ).area = Math.abs(area);
-
-            if (ccw === undefined) {
-                ccw = area < 0;
-            }
-
-            if (ccw === area < 0) {
-                if (polygon) {
-                    polygons.push(polygon);
-                }
-                polygon = [rings[i]];
-
-            } else {
-                (polygon     ).push(rings[i]);
-            }
-        }
-        if (polygon) {
-            polygons.push(polygon);
-        }
-
-        // Earcut performance degrades with the # of rings in a polygon. For this
-        // reason, we limit strip out all but the `maxRings` largest rings.
-        if (maxRings > 1) {
-            for (var j = 0; j < polygons.length; j++) {
-                if (polygons[j].length <= maxRings) {
-                    continue;
-                }
-                quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);
-                polygons[j] = polygons[j].slice(0, maxRings);
-            }
-        }
-
-        return polygons;
-    }
-
-    function compareAreas(a, b) {
-        return b.area - a.area;
-    }
-
-    var StructArrayLayout2i4 = /*@__PURE__*/(function (StructArray) {
-        function StructArrayLayout2i4() {
-            StructArray.apply(this, arguments);
-        }
-
-        if (StructArray) StructArrayLayout2i4.__proto__ = StructArray;
-        StructArrayLayout2i4.prototype = Object.create(StructArray && StructArray.prototype);
-        StructArrayLayout2i4.prototype.constructor = StructArrayLayout2i4;
-
-        StructArrayLayout2i4.prototype._refreshViews = function _refreshViews() {
-            this.uint8 = new Uint8Array(this.arrayBuffer);
-            this.int16 = new Int16Array(this.arrayBuffer);
-        };
-
-        StructArrayLayout2i4.prototype.emplaceBack = function emplaceBack(v0, v1) {
-            var i = this.length;
-            this.resize(i + 1);
-            return this.emplace(i, v0, v1);
-        };
-
-        StructArrayLayout2i4.prototype.emplace = function emplace(i, v0, v1) {
-            var o2 = i * 2;
-            this.int16[o2 + 0] = v0;
-            this.int16[o2 + 1] = v1;
-            return i;
-        };
-
-        return StructArrayLayout2i4;
-    }(StructArray));
-
-    StructArrayLayout2i4.prototype.bytesPerElement = 4;
-    WebWorkerTransfer.register('StructArrayLayout2i4', StructArrayLayout2i4);
-
-    var StructArrayLayout2ui4 = /*@__PURE__*/(function (StructArray) {
-        function StructArrayLayout2ui4() {
-            StructArray.apply(this, arguments);
-        }
-
-        if (StructArray) StructArrayLayout2ui4.__proto__ = StructArray;
-        StructArrayLayout2ui4.prototype = Object.create(StructArray && StructArray.prototype);
-        StructArrayLayout2ui4.prototype.constructor = StructArrayLayout2ui4;
-
-        StructArrayLayout2ui4.prototype._refreshViews = function _refreshViews() {
-            this.uint8 = new Uint8Array(this.arrayBuffer);
-            this.uint16 = new Uint16Array(this.arrayBuffer);
-        };
-
-        StructArrayLayout2ui4.prototype.emplaceBack = function emplaceBack(v0, v1) {
-            var i = this.length;
-            this.resize(i + 1);
-            return this.emplace(i, v0, v1);
-        };
-
-        StructArrayLayout2ui4.prototype.emplace = function emplace(i, v0, v1) {
-            var o2 = i * 2;
-            this.uint16[o2 + 0] = v0;
-            this.uint16[o2 + 1] = v1;
-            return i;
-        };
-
-        return StructArrayLayout2ui4;
-    }(StructArray));
-
-    StructArrayLayout2ui4.prototype.bytesPerElement = 4;
-    WebWorkerTransfer.register('StructArrayLayout2ui4', StructArrayLayout2ui4);
-
-    function hasPattern(type, layers, options) {
-        var patterns = options.patternDependencies;
-        var hasPattern = false;
-
-        for (var i = 0, list = layers; i < list.length; i += 1) {
-            var layer = list[i];
-
-            var patternProperty = layer.paint.get((type + "-pattern"));
-            if (!patternProperty.isConstant()) {
-                hasPattern = true;
-            }
-
-            var constantPattern = patternProperty.constantOr(null);
-            if (constantPattern) {
-                hasPattern = true;
-                patterns[constantPattern.to] = true;
-                patterns[constantPattern.from] = true;
-            }
-        }
-
-        return hasPattern;
-    }
-
-    // Copyright 2010 The Emscripten Authors.  All rights reserved.
-    // Emscripten is available under two separate licenses, the MIT license and the
-    // University of Illinois/NCSA Open Source License.  Both these licenses can be
-    // found in the LICENSE file.
-
-    // The Module object: Our interface to the outside world. We import
-    // and export values on it. There are various ways Module can be used:
-    // 1. Not defined. We create it here
-    // 2. A function parameter, function(Module) { ..generated code.. }
-    // 3. pre-run appended it, var Module = {}; ..generated code..
-    // 4. External script tag defines var Module.
-    // We need to check if Module already exists (e.g. case 3 above).
-    // Substitution will be replaced with actual code on later stage of the build,
-    // this way Closure Compiler will not mangle it (e.g. case 4. above).
-    // Note that if you want to run closure, and also to use Module
-    // after the generated code, you will need to define   var Module = {};
-    // before the code. Then that object will be used in the code, and you
-    // can continue to use Module afterwards as well.
-    if (typeof WebAssembly !== 'undefined') {
-    	var Module = typeof Module !== 'undefined' ? Module : {};
-
-    	// --pre-jses are emitted after the Module integration code, so that they can
-    	// refer to Module (if they choose; they can also define Module)
-    	// {{PRE_JSES}}
-
-    	// Sometimes an existing Module object exists with properties
-    	// meant to overwrite the default module functionality. Here
-    	// we collect those properties and reapply _after_ we configure
-    	// the current environment's defaults to avoid having to be so
-    	// defensive during initialization.
-    	var moduleOverrides = {};
-    	var key;
-    	for (key in Module) {
-    	  if (Module.hasOwnProperty(key)) {
-    		moduleOverrides[key] = Module[key];
-    	  }
-    	}
-
-    	Module['arguments'] = [];
-    	Module['thisProgram'] = './this.program';
-    	Module['quit'] = function(status, toThrow) {
-    	  throw toThrow;
-    	};
-    	Module['preRun'] = [];
-    	Module['postRun'] = [];
-
-    	// Determine the runtime environment we are in. You can customize this by
-    	// setting the ENVIRONMENT setting at compile time (see settings.js).
-
-    	var ENVIRONMENT_IS_WEB = false;
-    	var ENVIRONMENT_IS_WORKER = false;
-    	var ENVIRONMENT_IS_NODE = false;
-    	var ENVIRONMENT_HAS_NODE = false;
-    	var ENVIRONMENT_IS_SHELL = false;
-    	ENVIRONMENT_IS_WEB = typeof window === 'object';
-    	ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
-    	// A web environment like Electron.js can have Node enabled, so we must
-    	// distinguish between Node-enabled environments and Node environments per se.
-    	// This will allow the former to do things like mount NODEFS.
-    	ENVIRONMENT_HAS_NODE = typeof process === 'object' && typeof require === 'function';
-    	ENVIRONMENT_IS_NODE = ENVIRONMENT_HAS_NODE && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;
-    	ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
-
-    	if (Module['ENVIRONMENT']) {
-    	  throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)');
-    	}
-
-
-    	// Three configurations we can be running in:
-    	// 1) We could be the application main() thread running in the main JS UI thread. (ENVIRONMENT_IS_WORKER == false and ENVIRONMENT_IS_PTHREAD == false)
-    	// 2) We could be the application main() thread proxied to worker. (with Emscripten -s PROXY_TO_WORKER=1) (ENVIRONMENT_IS_WORKER == true, ENVIRONMENT_IS_PTHREAD == false)
-    	// 3) We could be an application pthread running in a worker. (ENVIRONMENT_IS_WORKER == true and ENVIRONMENT_IS_PTHREAD == true)
-
-
-
-
-    	// `/` should be present at the end if `scriptDirectory` is not empty
-    	var scriptDirectory = '';
-    	function locateFile(path) {
-    	  if (Module['locateFile']) {
-    		return Module['locateFile'](path, scriptDirectory);
-    	  } else {
-    		return scriptDirectory + path;
-    	  }
-    	}
-
-    	if (ENVIRONMENT_IS_NODE) {
-    	  scriptDirectory = __dirname + '/';
-
-    	  // Expose functionality in the same simple way that the shells work
-    	  // Note that we pollute the global namespace here, otherwise we break in node
-    	  var nodeFS;
-    	  var nodePath;
-
-    	  Module['read'] = function shell_read(filename, binary) {
-    		var ret;
-    		  if (!nodeFS) nodeFS = require('fs');
-    		  if (!nodePath) nodePath = require('path');
-    		  filename = nodePath['normalize'](filename);
-    		  ret = nodeFS['readFileSync'](filename);
-    		return binary ? ret : ret.toString();
-    	  };
-
-    	  Module['readBinary'] = function readBinary(filename) {
-    		var ret = Module['read'](filename, true);
-    		if (!ret.buffer) {
-    		  ret = new Uint8Array(ret);
-    		}
-    		assert(ret.buffer);
-    		return ret;
-    	  };
-
-    	  if (process['argv'].length > 1) {
-    		Module['thisProgram'] = process['argv'][1].replace(/\\/g, '/');
-    	  }
-
-    	  Module['arguments'] = process['argv'].slice(2);
-
-    	  if (typeof module !== 'undefined') {
-    		module['exports'] = Module;
-    	  }
-
-    	  process['on']('uncaughtException', function(ex) {
-    		// suppress ExitStatus exceptions from showing an error
-    		if (!(ex instanceof ExitStatus)) {
-    		  throw ex;
-    		}
-    	  });
-    	  // Currently node will swallow unhandled rejections, but this behavior is
-    	  // deprecated, and in the future it will exit with error status.
-    	  process['on']('unhandledRejection', abort);
-
-    	  Module['quit'] = function(status) {
-    		process['exit'](status);
-    	  };
-
-    	  Module['inspect'] = function () { return '[Emscripten Module object]'; };
-    	} else
-    	if (ENVIRONMENT_IS_SHELL) {
-
-
-    	  if (typeof read != 'undefined') {
-    		Module['read'] = function shell_read(f) {
-    		  return read(f);
-    		};
-    	  }
-
-    	  Module['readBinary'] = function readBinary(f) {
-    		var data;
-    		if (typeof readbuffer === 'function') {
-    		  return new Uint8Array(readbuffer(f));
-    		}
-    		data = read(f, 'binary');
-    		assert(typeof data === 'object');
-    		return data;
-    	  };
-
-    	  if (typeof scriptArgs != 'undefined') {
-    		Module['arguments'] = scriptArgs;
-    	  } else if (typeof arguments != 'undefined') {
-    		Module['arguments'] = arguments;
-    	  }
-
-    	  if (typeof quit === 'function') {
-    		Module['quit'] = function(status) {
-    		  quit(status);
-    		};
-    	  }
-    	} else
-    	if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
-    	  if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled
-    		scriptDirectory = self.location.href;
-    	  } else if (document.currentScript) { // web
-    		scriptDirectory = document.currentScript.src;
-    	  }
-    	  // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.
-    	  // otherwise, slice off the final part of the url to find the script directory.
-    	  // if scriptDirectory does not contain a slash, lastIndexOf will return -1,
-    	  // and scriptDirectory will correctly be replaced with an empty string.
-    	  if (scriptDirectory.indexOf('blob:') !== 0) {
-    		scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1);
-    	  } else {
-    		scriptDirectory = '';
-    	  }
-
-
-    	  Module['read'] = function shell_read(url) {
-    		  var xhr = new XMLHttpRequest();
-    		  xhr.open('GET', url, false);
-    		  xhr.send(null);
-    		  return xhr.responseText;
-    	  };
-
-    	  if (ENVIRONMENT_IS_WORKER) {
-    		Module['readBinary'] = function readBinary(url) {
-    			var xhr = new XMLHttpRequest();
-    			xhr.open('GET', url, false);
-    			xhr.responseType = 'arraybuffer';
-    			xhr.send(null);
-    			return new Uint8Array(xhr.response);
-    		};
-    	  }
-
-    	  Module['readAsync'] = function readAsync(url, onload, onerror) {
-    		var xhr = new XMLHttpRequest();
-    		xhr.open('GET', url, true);
-    		xhr.responseType = 'arraybuffer';
-    		xhr.onload = function xhr_onload() {
-    		  if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
-    			onload(xhr.response);
-    			return;
-    		  }
-    		  onerror();
-    		};
-    		xhr.onerror = onerror;
-    		xhr.send(null);
-    	  };
-
-    	  Module['setWindowTitle'] = function(title) { document.title = title; };
-    	} else
-    	{
-    	  throw new Error('environment detection error');
-    	}
-
-    	// Set up the out() and err() hooks, which are how we can print to stdout or
-    	// stderr, respectively.
-    	// If the user provided Module.print or printErr, use that. Otherwise,
-    	// console.log is checked first, as 'print' on the web will open a print dialogue
-    	// printErr is preferable to console.warn (works better in shells)
-    	// bind(console) is necessary to fix IE/Edge closed dev tools panel behavior.
-    	var out = Module['print'] || (typeof console !== 'undefined' ? console.log.bind(console) : (typeof print !== 'undefined' ? print : null));
-    	var err = Module['printErr'] || (typeof printErr !== 'undefined' ? printErr : ((typeof console !== 'undefined' && console.warn.bind(console)) || out));
-
-    	// Merge back in the overrides
-    	for (key in moduleOverrides) {
-    	  if (moduleOverrides.hasOwnProperty(key)) {
-    		Module[key] = moduleOverrides[key];
-    	  }
-    	}
-    	// Free the object hierarchy contained in the overrides, this lets the GC
-    	// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.
-    	moduleOverrides = undefined;
-
-    	// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
-    	assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead');
-    	assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead');
-    	assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead');
-    	assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead');
-
-    	// stack management, and other functionality that is provided by the compiled code,
-    	// should not be used before it is ready
-    	stackSave = stackRestore = stackAlloc = function() {
-    	  abort('cannot use the stack before compiled code is ready to run, and has provided stack access');
-    	};
-
-    	function warnOnce(text) {
-    	  if (!warnOnce.shown) warnOnce.shown = {};
-    	  if (!warnOnce.shown[text]) {
-    		warnOnce.shown[text] = 1;
-    		//err(text);
-    	  }
-    	}
-
-    	var asm2wasmImports = { // special asm2wasm imports
-    		"f64-rem": function(x, y) {
-    			return x % y;
-    		},
-    		"debugger": function() {
-    			debugger;
-    		}
-    	};
-    	var functionPointers = new Array(0);
-
-    	var tempRet0 = 0;
-
-    	var setTempRet0 = function(value) {
-    	  tempRet0 = value;
-    	};
-
-    	var getTempRet0 = function() {
-    	  return tempRet0;
-    	};
-
-
-
-
-    	// === Preamble library stuff ===
-
-    	// Documentation for the public APIs defined in this file must be updated in:
-    	//    site/source/docs/api_reference/preamble.js.rst
-    	// A prebuilt local version of the documentation is available at:
-    	//    site/build/text/docs/api_reference/preamble.js.txt
-    	// You can also build docs locally as HTML or other formats in site/
-    	// An online HTML version (which may be of a different version of Emscripten)
-    	//    is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
-
-
-
-    	if (typeof WebAssembly !== 'object') {
-    	  abort('No WebAssembly support found. Build with -s WASM=0 to target JavaScript instead.');
-    	}
-
-    	/** @type {function(number, string, boolean=)} */
-    	function getValue(ptr, type, noSafe) {
-    	  type = type || 'i8';
-    	  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
-    		switch(type) {
-    		  case 'i1': return HEAP8[((ptr)>>0)];
-    		  case 'i8': return HEAP8[((ptr)>>0)];
-    		  case 'i16': return HEAP16[((ptr)>>1)];
-    		  case 'i32': return HEAP32[((ptr)>>2)];
-    		  case 'i64': return HEAP32[((ptr)>>2)];
-    		  case 'float': return HEAPF32[((ptr)>>2)];
-    		  case 'double': return HEAPF64[((ptr)>>3)];
-    		  default: abort('invalid type for getValue: ' + type);
-    		}
-    	  return null;
-    	}
-
-
-
-
-
-    	// Wasm globals
-
-    	var wasmMemory;
-
-    	// Potentially used for direct table calls.
-    	var wasmTable;
-
-
-    	//========================================
-    	// Runtime essentials
-    	//========================================
-
-    	// whether we are quitting the application. no code should run after this.
-    	// set in exit() and abort()
-    	var ABORT = false;
-
-    	/** @type {function(*, string=)} */
-    	function assert(condition, text) {
-    	  if (!condition) {
-    		abort('Assertion failed: ' + text);
-    	  }
-    	}
-
-    	// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
-    	function getCFunc(ident) {
-    	  var func = Module['_' + ident]; // closure exported function
-    	  assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported');
-    	  return func;
-    	}
-
-    	// C calling interface.
-    	function ccall(ident, returnType, argTypes, args, opts) {
-    	  // For fast lookup of conversion functions
-    	  var toC = {
-    		'string': function(str) {
-    		  var ret = 0;
-    		  if (str !== null && str !== undefined && str !== 0) { // null string
-    			// at most 4 bytes per UTF-8 code point, +1 for the trailing '\0'
-    			var len = (str.length << 2) + 1;
-    			ret = stackAlloc(len);
-    			stringToUTF8(str, ret, len);
-    		  }
-    		  return ret;
-    		},
-    		'array': function(arr) {
-    		  var ret = stackAlloc(arr.length);
-    		  writeArrayToMemory(arr, ret);
-    		  return ret;
-    		}
-    	  };
-
-    	  function convertReturnValue(ret) {
-    		if (returnType === 'string') return UTF8ToString(ret);
-    		if (returnType === 'boolean') return Boolean(ret);
-    		return ret;
-    	  }
-
-    	  var func = getCFunc(ident);
-    	  var cArgs = [];
-    	  var stack = 0;
-    	  assert(returnType !== 'array', 'Return type should not be "array".');
-    	  if (args) {
-    		for (var i = 0; i < args.length; i++) {
-    		  var converter = toC[argTypes[i]];
-    		  if (converter) {
-    			if (stack === 0) stack = stackSave();
-    			cArgs[i] = converter(args[i]);
-    		  } else {
-    			cArgs[i] = args[i];
-    		  }
-    		}
-    	  }
-    	  var ret = func.apply(null, cArgs);
-    	  ret = convertReturnValue(ret);
-    	  if (stack !== 0) stackRestore(stack);
-    	  return ret;
-    	}
-
-    	function cwrap(ident, returnType, argTypes, opts) {
-    	  return function() {
-    		return ccall(ident, returnType, argTypes, arguments);
-    	  }
-    	}
-
-
-    	// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns
-    	// a copy of that string as a Javascript String object.
-
-    	var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined;
-
-    	/**
-    	 * @param {number} idx
-    	 * @param {number=} maxBytesToRead
-    	 * @return {string}
-    	 */
-    	function UTF8ArrayToString(u8Array, idx, maxBytesToRead) {
-    	  var endIdx = idx + maxBytesToRead;
-    	  var endPtr = idx;
-    	  // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
-    	  // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
-    	  // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity)
-    	  while (u8Array[endPtr] && !(endPtr >= endIdx)) ++endPtr;
-
-    	  if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
-    		return UTF8Decoder.decode(u8Array.subarray(idx, endPtr));
-    	  } else {
-    		var str = '';
-    		// If building with TextDecoder, we have already computed the string length above, so test loop end condition against that
-    		while (idx < endPtr) {
-    		  // For UTF8 byte structure, see:
-    		  // http://en.wikipedia.org/wiki/UTF-8#Description
-    		  // https://www.ietf.org/rfc/rfc2279.txt
-    		  // https://tools.ietf.org/html/rfc3629
-    		  var u0 = u8Array[idx++];
-    		  if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }
-    		  var u1 = u8Array[idx++] & 63;
-    		  if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }
-    		  var u2 = u8Array[idx++] & 63;
-    		  if ((u0 & 0xF0) == 0xE0) {
-    			u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
-    		  } else {
-    			if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!');
-    			u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (u8Array[idx++] & 63);
-    		  }
-
-    		  if (u0 < 0x10000) {
-    			str += String.fromCharCode(u0);
-    		  } else {
-    			var ch = u0 - 0x10000;
-    			str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
-    		  }
-    		}
-    	  }
-    	  return str;
-    	}
-
-    	// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a
-    	// copy of that string as a Javascript String object.
-    	// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit
-    	//                 this parameter to scan the string until the first \0 byte. If maxBytesToRead is
-    	//                 passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the
-    	//                 middle, then the string will cut short at that byte index (i.e. maxBytesToRead will
-    	//                 not produce a string of exact length [ptr, ptr+maxBytesToRead[)
-    	//                 N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may
-    	//                 throw JS JIT optimizations off, so it is worth to consider consistently using one
-    	//                 style or the other.
-    	/**
-    	 * @param {number} ptr
-    	 * @param {number=} maxBytesToRead
-    	 * @return {string}
-    	 */
-    	function UTF8ToString(ptr, maxBytesToRead) {
-    	  return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';
-    	}
-
-    	// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx',
-    	// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP.
-    	// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
-    	// Parameters:
-    	//   str: the Javascript string to copy.
-    	//   outU8Array: the array to copy to. Each index in this array is assumed to be one 8-byte element.
-    	//   outIdx: The starting offset in the array to begin the copying.
-    	//   maxBytesToWrite: The maximum number of bytes this function can write to the array.
-    	//                    This count should include the null terminator,
-    	//                    i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else.
-    	//                    maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator.
-    	// Returns the number of bytes written, EXCLUDING the null terminator.
-
-    	function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
-    	  if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes.
-    		return 0;
-
-    	  var startIdx = outIdx;
-    	  var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
-    	  for (var i = 0; i < str.length; ++i) {
-    		// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
-    		// See http://unicode.org/faq/utf_bom.html#utf16-3
-    		// For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629
-    		var u = str.charCodeAt(i); // possibly a lead surrogate
-    		if (u >= 0xD800 && u <= 0xDFFF) {
-    		  var u1 = str.charCodeAt(++i);
-    		  u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);
-    		}
-    		if (u <= 0x7F) {
-    		  if (outIdx >= endIdx) break;
-    		  outU8Array[outIdx++] = u;
-    		} else if (u <= 0x7FF) {
-    		  if (outIdx + 1 >= endIdx) break;
-    		  outU8Array[outIdx++] = 0xC0 | (u >> 6);
-    		  outU8Array[outIdx++] = 0x80 | (u & 63);
-    		} else if (u <= 0xFFFF) {
-    		  if (outIdx + 2 >= endIdx) break;
-    		  outU8Array[outIdx++] = 0xE0 | (u >> 12);
-    		  outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
-    		  outU8Array[outIdx++] = 0x80 | (u & 63);
-    		} else {
-    		  if (outIdx + 3 >= endIdx) break;
-    		  if (u >= 0x200000) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).');
-    		  outU8Array[outIdx++] = 0xF0 | (u >> 18);
-    		  outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63);
-    		  outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
-    		  outU8Array[outIdx++] = 0x80 | (u & 63);
-    		}
-    	  }
-    	  // Null-terminate the pointer to the buffer.
-    	  outU8Array[outIdx] = 0;
-    	  return outIdx - startIdx;
-    	}
-
-    	// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
-    	// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP.
-    	// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
-    	// Returns the number of bytes written, EXCLUDING the null terminator.
-
-    	function stringToUTF8(str, outPtr, maxBytesToWrite) {
-    	  assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
-    	  return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite);
-    	}
-
-
-    	// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
-    	// a copy of that string as a Javascript String object.
-
-    	var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined;
-
-    	function writeArrayToMemory(array, buffer) {
-    	  assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)');
-    	  HEAP8.set(array, buffer);
-    	}
-
-
-
-
-
-    	function demangle(func) {
-    	  return func;
-    	}
-
-    	function demangleAll(text) {
-    	  var regex =
-    		/__Z[\w\d_]+/g;
-    	  return text.replace(regex,
-    		function(x) {
-    		  var y = demangle(x);
-    		  return x === y ? x : (y + ' [' + x + ']');
-    		});
-    	}
-
-    	function jsStackTrace() {
-    	  var err = new Error();
-    	  if (!err.stack) {
-    		// IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown,
-    		// so try that as a special-case.
-    		try {
-    		  throw new Error(0);
-    		} catch(e) {
-    		  err = e;
-    		}
-    		if (!err.stack) {
-    		  return '(no stack trace available)';
-    		}
-    	  }
-    	  return err.stack.toString();
-    	}
-
-    	function stackTrace() {
-    	  var js = jsStackTrace();
-    	  if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace']();
-    	  return demangleAll(js);
-    	}
-    	var WASM_PAGE_SIZE = 65536;
-
-    	function alignUp(x, multiple) {
-    	  if (x % multiple > 0) {
-    		x += multiple - (x % multiple);
-    	  }
-    	  return x;
-    	}
-
-    	var /** @type {ArrayBuffer} */
-    	  buffer,
-    	/** @type {Int8Array} */
-    	  HEAP8,
-    	/** @type {Uint8Array} */
-    	  HEAPU8,
-    	/** @type {Int16Array} */
-    	  HEAP16,
-    	/** @type {Uint16Array} */
-    	  HEAPU16,
-    	/** @type {Int32Array} */
-    	  HEAP32,
-    	/** @type {Uint32Array} */
-    	  HEAPU32,
-    	/** @type {Float32Array} */
-    	  HEAPF32,
-    	/** @type {Float64Array} */
-    	  HEAPF64;
-
-    	function updateGlobalBufferViews() {
-    	  Module['HEAP8'] = HEAP8 = new Int8Array(buffer);
-    	  Module['HEAP16'] = HEAP16 = new Int16Array(buffer);
-    	  Module['HEAP32'] = HEAP32 = new Int32Array(buffer);
-    	  Module['HEAPU8'] = HEAPU8 = new Uint8Array(buffer);
-    	  Module['HEAPU16'] = HEAPU16 = new Uint16Array(buffer);
-    	  Module['HEAPU32'] = HEAPU32 = new Uint32Array(buffer);
-    	  Module['HEAPF32'] = HEAPF32 = new Float32Array(buffer);
-    	  Module['HEAPF64'] = HEAPF64 = new Float64Array(buffer);
-    	}
-
-
-    	var STACK_BASE = 5872,
-    		STACK_MAX = 5248752,
-    		DYNAMIC_BASE = 5248752,
-    		DYNAMICTOP_PTR = 5840;
-
-    	assert(STACK_BASE % 16 === 0, 'stack must start aligned');
-    	assert(DYNAMIC_BASE % 16 === 0, 'heap must start aligned');
-
-
-
-    	var TOTAL_STACK = 5242880;
-    	if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime');
-
-    	var INITIAL_TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;
-    	if (INITIAL_TOTAL_MEMORY < TOTAL_STACK) err('TOTAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_TOTAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')');
-
-    	// Initialize the runtime's memory
-    	// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
-    	assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined,
-    		   'JS engine does not provide full typed array support');
-
-
-
-
-
-
-
-    	// Use a provided buffer, if there is one, or else allocate a new one
-    	if (Module['buffer']) {
-    	  buffer = Module['buffer'];
-    	  assert(buffer.byteLength === INITIAL_TOTAL_MEMORY, 'provided buffer should be ' + INITIAL_TOTAL_MEMORY + ' bytes, but it is ' + buffer.byteLength);
-    	} else {
-    	  // Use a WebAssembly memory where available
-    	  if (typeof WebAssembly === 'object' && typeof WebAssembly.Memory === 'function') {
-    		assert(INITIAL_TOTAL_MEMORY % WASM_PAGE_SIZE === 0);
-    		wasmMemory = new WebAssembly.Memory({ 'initial': INITIAL_TOTAL_MEMORY / WASM_PAGE_SIZE });
-    		buffer = wasmMemory.buffer;
-    	  } else
-    	  {
-    		buffer = new ArrayBuffer(INITIAL_TOTAL_MEMORY);
-    	  }
-    	  assert(buffer.byteLength === INITIAL_TOTAL_MEMORY);
-    	}
-    	updateGlobalBufferViews();
-
-
-    	HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE;
-
-
-    	// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
-    	function writeStackCookie() {
-    	  assert((STACK_MAX & 3) == 0);
-    	  HEAPU32[(STACK_MAX >> 2)-1] = 0x02135467;
-    	  HEAPU32[(STACK_MAX >> 2)-2] = 0x89BACDFE;
-    	}
-
-    	function checkStackCookie() {
-    	  if (HEAPU32[(STACK_MAX >> 2)-1] != 0x02135467 || HEAPU32[(STACK_MAX >> 2)-2] != 0x89BACDFE) {
-    		abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x02135467, but received 0x' + HEAPU32[(STACK_MAX >> 2)-2].toString(16) + ' ' + HEAPU32[(STACK_MAX >> 2)-1].toString(16));
-    	  }
-    	  // Also test the global address 0 for integrity.
-    	  if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!');
-    	}
-
-    	function abortStackOverflow(allocSize) {
-    	  abort('Stack overflow! Attempted to allocate ' + allocSize + ' bytes on the stack, but stack has only ' + (STACK_MAX - stackSave() + allocSize) + ' bytes available!');
-    	}
-
-
-    	  HEAP32[0] = 0x63736d65; /* 'emsc' */
-
-
-
-    	// Endianness check (note: assumes compiler arch was little-endian)
-    	HEAP16[1] = 0x6373;
-    	if (HEAPU8[2] !== 0x73 || HEAPU8[3] !== 0x63) throw 'Runtime error: expected the system to be little-endian!';
-
-    	function callRuntimeCallbacks(callbacks) {
-    	  while(callbacks.length > 0) {
-    		var callback = callbacks.shift();
-    		if (typeof callback == 'function') {
-    		  callback();
-    		  continue;
-    		}
-    		var func = callback.func;
-    		if (typeof func === 'number') {
-    		  if (callback.arg === undefined) {
-    			Module['dynCall_v'](func);
-    		  } else {
-    			Module['dynCall_vi'](func, callback.arg);
-    		  }
-    		} else {
-    		  func(callback.arg === undefined ? null : callback.arg);
-    		}
-    	  }
-    	}
-
-    	var __ATPRERUN__  = []; // functions called before the runtime is initialized
-    	var __ATINIT__    = []; // functions called during startup
-    	var __ATMAIN__    = []; // functions called when main() is to be run
-    	var __ATPOSTRUN__ = []; // functions called after the main() is called
-
-    	var runtimeInitialized = false;
-    	var runtimeExited = false;
-
-
-    	function preRun() {
-    	  // compatibility - merge in anything from Module['preRun'] at this time
-    	  if (Module['preRun']) {
-    		if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
-    		while (Module['preRun'].length) {
-    		  addOnPreRun(Module['preRun'].shift());
-    		}
-    	  }
-    	  callRuntimeCallbacks(__ATPRERUN__);
-    	}
-
-    	function ensureInitRuntime() {
-    	  checkStackCookie();
-    	  if (runtimeInitialized) return;
-    	  runtimeInitialized = true;
-    	  
-    	  callRuntimeCallbacks(__ATINIT__);
-    	}
-
-    	function preMain() {
-    	  checkStackCookie();
-    	  
-    	  callRuntimeCallbacks(__ATMAIN__);
-    	}
-
-    	function postRun() {
-    	  checkStackCookie();
-    	  // compatibility - merge in anything from Module['postRun'] at this time
-    	  if (Module['postRun']) {
-    		if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
-    		while (Module['postRun'].length) {
-    		  addOnPostRun(Module['postRun'].shift());
-    		}
-    	  }
-    	  callRuntimeCallbacks(__ATPOSTRUN__);
-    	}
-
-    	function addOnPreRun(cb) {
-    	  __ATPRERUN__.unshift(cb);
-    	}
-
-    	function addOnPostRun(cb) {
-    	  __ATPOSTRUN__.unshift(cb);
-    	}
-
-
-    	assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
-    	assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
-    	assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
-    	assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
-
-
-
-    	// A counter of dependencies for calling run(). If we need to
-    	// do asynchronous work before running, increment this and
-    	// decrement it. Incrementing must happen in a place like
-    	// Module.preRun (used by emcc to add file preloading).
-    	// Note that you can add dependencies in preRun, even though
-    	// it happens right before run - run will be postponed until
-    	// the dependencies are met.
-    	var runDependencies = 0;
-    	var runDependencyWatcher = null;
-    	var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
-    	var runDependencyTracking = {};
-
-    	function addRunDependency(id) {
-    	  runDependencies++;
-    	  if (Module['monitorRunDependencies']) {
-    		Module['monitorRunDependencies'](runDependencies);
-    	  }
-    	  if (id) {
-    		assert(!runDependencyTracking[id]);
-    		runDependencyTracking[id] = 1;
-    		if (runDependencyWatcher === null && typeof setInterval !== 'undefined') {
-    		  // Check for missing dependencies every few seconds
-    		  runDependencyWatcher = setInterval(function() {
-    			if (ABORT) {
-    			  clearInterval(runDependencyWatcher);
-    			  runDependencyWatcher = null;
-    			  return;
-    			}
-    		  }, 10000);
-    		}
-    	  }
-    	}
-
-    	function removeRunDependency(id) {
-    	  runDependencies--;
-    	  if (Module['monitorRunDependencies']) {
-    		Module['monitorRunDependencies'](runDependencies);
-    	  }
-    	  if (id) {
-    		assert(runDependencyTracking[id]);
-    		delete runDependencyTracking[id];
-    	  }
-    	  if (runDependencies == 0) {
-    		if (runDependencyWatcher !== null) {
-    		  clearInterval(runDependencyWatcher);
-    		  runDependencyWatcher = null;
-    		}
-    		if (dependenciesFulfilled) {
-    		  var callback = dependenciesFulfilled;
-    		  dependenciesFulfilled = null;
-    		  callback(); // can add another dependenciesFulfilled
-    		}
-    	  }
-    	}
-
-    	Module["preloadedImages"] = {}; // maps url to image data
-    	Module["preloadedAudios"] = {}; // maps url to audio data
-
-
-
-    	// show errors on likely calls to FS when it was not included
-    	var FS = {
-    	  error: function() {
-    		abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with  -s FORCE_FILESYSTEM=1');
-    	  },
-    	  init: function() { FS.error(); },
-    	  createDataFile: function() { FS.error(); },
-    	  createPreloadedFile: function() { FS.error(); },
-    	  createLazyFile: function() { FS.error(); },
-    	  open: function() { FS.error(); },
-    	  mkdev: function() { FS.error(); },
-    	  registerDevice: function() { FS.error(); },
-    	  analyzePath: function() { FS.error(); },
-    	  loadFilesFromDB: function() { FS.error(); },
-
-    	  ErrnoError: function ErrnoError() { FS.error(); },
-    	};
-    	Module['FS_createDataFile'] = FS.createDataFile;
-    	Module['FS_createPreloadedFile'] = FS.createPreloadedFile;
-
-
-
-    	// Copyright 2017 The Emscripten Authors.  All rights reserved.
-    	// Emscripten is available under two separate licenses, the MIT license and the
-    	// University of Illinois/NCSA Open Source License.  Both these licenses can be
-    	// found in the LICENSE file.
-
-    	// Prefix of data URIs emitted by SINGLE_FILE and related options.
-    	var dataURIPrefix = 'data:application/octet-stream;base64,';
-
-    	// Indicates whether filename is a base64 data URI.
-    	function isDataURI(filename) {
-    	  return String.prototype.startsWith ?
-    		  filename.startsWith(dataURIPrefix) :
-    		  filename.indexOf(dataURIPrefix) === 0;
-    	}
-
-
-
-
-    	var wasmBinaryFile = 'ThirdParty/earcut.wasm';
-    	if (!isDataURI(wasmBinaryFile)) {
-    	  wasmBinaryFile = locateFile(wasmBinaryFile);
-    	}
-
-    	function getBinary() {
-    	  try {
-    		if (Module['wasmBinary']) {
-    		  return new Uint8Array(Module['wasmBinary']);
-    		}
-    		if (Module['readBinary']) {
-    		  return Module['readBinary'](wasmBinaryFile);
-    		} else {
-    		  throw "both async and sync fetching of the wasm failed";
-    		}
-    	  }
-    	  catch (err) {
-    		abort(err);
-    	  }
-    	}
-
-    	function getBinaryPromise() {
-    	  // if we don't have the binary yet, and have the Fetch api, use that
-    	  // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web
-    	  if (!Module['wasmBinary'] && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function') {
-    		return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) {
-    		  if (!response['ok']) {
-    			throw "failed to load wasm binary file at '" + wasmBinaryFile + "'";
-    		  }
-    		  return response['arrayBuffer']();
-    		}).catch(function () {
-    		  return getBinary();
-    		});
-    	  }
-    	  // Otherwise, getBinary should be able to get it synchronously
-    	  return new Promise(function(resolve, reject) {
-    		resolve(getBinary());
-    	  });
-    	}
-
-
-
-    	// Create the wasm instance.
-    	// Receives the wasm imports, returns the exports.
-    	function createWasm(env) {
-
-    	  // prepare imports
-    	  var info = {
-    		'env': env
-    		,
-    		'global': {
-    		  'NaN': NaN,
-    		  'Infinity': Infinity
-    		},
-    		'global.Math': Math,
-    		'asm2wasm': asm2wasmImports
-    	  };
-    	  // Load the wasm module and create an instance of using native support in the JS engine.
-    	  // handle a generated wasm instance, receiving its exports and
-    	  // performing other necessary setup
-    	  function receiveInstance(instance, module) {
-    		var exports = instance.exports;
-    		Module['asm'] = exports;
-    		removeRunDependency('wasm-instantiate');
-    	  }
-    	  addRunDependency('wasm-instantiate');
-
-
-    	  // Async compilation can be confusing when an error on the page overwrites Module
-    	  // (for example, if the order of elements is wrong, and the one defining Module is
-    	  // later), so we save Module and check it later.
-    	  var trueModule = Module;
-    	  function receiveInstantiatedSource(output) {
-    		// 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance.
-    		// receiveInstance() will swap in the exports (to Module.asm) so they can be called
-    		assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?');
-    		trueModule = null;
-    		  // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
-    		  // When the regression is fixed, can restore the above USE_PTHREADS-enabled path.
-    		receiveInstance(output['instance']);
-    	  }
-
-
-    	  function instantiateArrayBuffer(receiver) {
-    		return getBinaryPromise().then(function(binary) {
-    		  return WebAssembly.instantiate(binary, info);
-    		}).then(receiver, function(reason) {
-    		  //err('failed to asynchronously prepare wasm: ' + reason);
-    		  //abort(reason);
-    		});
-    	  }
-
-    	  // Prefer streaming instantiation if available.
-    	  function instantiateAsync() {
-    		if (!Module['wasmBinary'] &&
-    			typeof WebAssembly.instantiateStreaming === 'function' &&
-    			!isDataURI(wasmBinaryFile) &&
-    			typeof fetch === 'function') {
-    		  fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) {
-    			return WebAssembly.instantiateStreaming(response, info)
-    			  .then(receiveInstantiatedSource, function(reason) {
-    				// We expect the most common failure cause to be a bad MIME type for the binary,
-    				// in which case falling back to ArrayBuffer instantiation should work.
-    				//err('wasm streaming compile failed: ' + reason);
-    				//err('falling back to ArrayBuffer instantiation');
-    				instantiateArrayBuffer(receiveInstantiatedSource);
-    			  });
-    		  });
-    		} else {
-    		  return instantiateArrayBuffer(receiveInstantiatedSource);
-    		}
-    	  }
-    	  // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
-    	  // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel
-    	  // to any other async startup actions they are performing.
-    	  if (Module['instantiateWasm']) {
-    		try {
-    		  return Module['instantiateWasm'](info, receiveInstance);
-    		} catch(e) {
-    		  //err('Module.instantiateWasm callback failed with error: ' + e);
-    		  return false;
-    		}
-    	  }
-
-    	  instantiateAsync();
-    	  return {}; // no exports yet; we'll fill them in later
-    	}
-
-    	// Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate
-    	// the wasm module at that time, and it receives imports and provides exports and so forth, the app
-    	// doesn't need to care that it is wasm or asm.js.
-
-    	Module['asm'] = function(global, env, providedBuffer) {
-    	  // memory was already allocated (so js could use the buffer)
-    	  env['memory'] = wasmMemory
-    	  ;
-    	  // import table
-    	  env['table'] = wasmTable = new WebAssembly.Table({
-    		'initial': 260,
-    		'maximum': 260,
-    		'element': 'anyfunc'
-    	  });
-    	  // With the wasm backend __memory_base and __table_base and only needed for
-    	  // relocatable output.
-    	  env['__memory_base'] = 1024; // tell the memory segments where to place themselves
-    	  // table starts at 0 by default (even in dynamic linking, for the main module)
-    	  env['__table_base'] = 0;
-
-    	  var exports = createWasm(env);
-    	  assert(exports, 'binaryen setup failed (no wasm support?)');
-    	  return exports;
-    	};
-
-
-
-
-
-    	// STATICTOP = STATIC_BASE + 4848;
-    	/* global initializers */ /*__ATINIT__.push();*/
-
-
-
-
-
-
-
-
-    	/* no memory initializer */
-    	var tempDoublePtr = 5856;
-    	assert(tempDoublePtr % 8 == 0);
-
-    	// {{PRE_LIBRARY}}
-
-
-    	  function ___cxa_allocate_exception(size) {
-    		  return _malloc(size);
-    		}
-
-    	  
-    	  var ___exception_infos={};
-    	  
-    	  var ___exception_caught= [];
-    	  
-    	  function ___exception_addRef(ptr) {
-    		  if (!ptr) return;
-    		  var info = ___exception_infos[ptr];
-    		  info.refcount++;
-    		}
-    	  
-    	  function ___exception_deAdjust(adjusted) {
-    		  if (!adjusted || ___exception_infos[adjusted]) return adjusted;
-    		  for (var key in ___exception_infos) {
-    			var ptr = +key; // the iteration key is a string, and if we throw this, it must be an integer as that is what we look for
-    			var adj = ___exception_infos[ptr].adjusted;
-    			var len = adj.length;
-    			for (var i = 0; i < len; i++) {
-    			  if (adj[i] === adjusted) {
-    				return ptr;
-    			  }
-    			}
-    		  }
-    		  return adjusted;
-    		}function ___cxa_begin_catch(ptr) {
-    		  var info = ___exception_infos[ptr];
-    		  if (info && !info.caught) {
-    			info.caught = true;
-    			__ZSt18uncaught_exceptionv.uncaught_exception--;
-    		  }
-    		  if (info) info.rethrown = false;
-    		  ___exception_caught.push(ptr);
-    		  ___exception_addRef(___exception_deAdjust(ptr));
-    		  return ptr;
-    		}
-    function ___cxa_throw(ptr, type, destructor) {
-    		  ___exception_infos[ptr] = {
-    			ptr: ptr,
-    			adjusted: [ptr],
-    			type: type,
-    			destructor: destructor,
-    			refcount: 0,
-    			caught: false,
-    			rethrown: false
-    		  };
-    		  if (!("uncaught_exception" in __ZSt18uncaught_exceptionv)) {
-    			__ZSt18uncaught_exceptionv.uncaught_exception = 1;
-    		  } else {
-    			__ZSt18uncaught_exceptionv.uncaught_exception++;
-    		  }
-    		  throw ptr + " - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.";
-    		}
-
-    	  function ___cxa_uncaught_exception() {
-    		  return !!__ZSt18uncaught_exceptionv.uncaught_exception;
-    		}
-
-    	  function ___gxx_personality_v0() {
-    		}
-
-    	  function ___lock() {}
-    var SYSCALLS={buffers:[null,[],[]],printChar:function (stream, curr) {
-    			var buffer = SYSCALLS.buffers[stream];
-    			assert(buffer);
-    			if (curr === 0 || curr === 10) {
-    			  (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
-    			  buffer.length = 0;
-    			} else {
-    			  buffer.push(curr);
-    			}
-    		  },varargs:0,get:function (varargs) {
-    			SYSCALLS.varargs += 4;
-    			var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
-    			return ret;
-    		  },getStr:function () {
-    			var ret = UTF8ToString(SYSCALLS.get());
-    			return ret;
-    		  },get64:function () {
-    			var low = SYSCALLS.get(), high = SYSCALLS.get();
-    			if (low >= 0) assert(high === 0);
-    			else assert(high === -1);
-    			return low;
-    		  },getZero:function () {
-    			assert(SYSCALLS.get() === 0);
-    		  }};function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs;
-    	  try {
-    	   // llseek
-    		  var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get();
-    		  abort('it should not be possible to operate on streams when !SYSCALLS_REQUIRE_FILESYSTEM');
-    		  return 0;
-    		} catch (e) {
-    		if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-    		return -e.errno;
-    	  }
-    	  }
-
-    	  
-    	  function flush_NO_FILESYSTEM() {
-    		  // flush anything remaining in the buffers during shutdown
-    		  var fflush = Module["_fflush"];
-    		  if (fflush) fflush(0);
-    		  var buffers = SYSCALLS.buffers;
-    		  if (buffers[1].length) SYSCALLS.printChar(1, 10);
-    		  if (buffers[2].length) SYSCALLS.printChar(2, 10);
-    		}function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs;
-    	  try {
-    	   // writev
-    		  // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
-    		  var stream = SYSCALLS.get(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
-    		  var ret = 0;
-    		  for (var i = 0; i < iovcnt; i++) {
-    			var ptr = HEAP32[(((iov)+(i*8))>>2)];
-    			var len = HEAP32[(((iov)+(i*8 + 4))>>2)];
-    			for (var j = 0; j < len; j++) {
-    			  SYSCALLS.printChar(stream, HEAPU8[ptr+j]);
-    			}
-    			ret += len;
-    		  }
-    		  return ret;
-    		} catch (e) {
-    		if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-    		return -e.errno;
-    	  }
-    	  }
-
-    	  function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs;
-    	  try {
-    	   // ioctl
-    		  return 0;
-    		} catch (e) {
-    		if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-    		return -e.errno;
-    	  }
-    	  }
-
-    	  function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs;
-    	  try {
-    	   // close
-    		  var stream = SYSCALLS.getStreamFromFD();
-    		  abort('it should not be possible to operate on streams when !SYSCALLS_REQUIRE_FILESYSTEM');
-    		  return 0;
-    		} catch (e) {
-    		if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-    		return -e.errno;
-    	  }
-    	  }
-
-    	  function ___unlock() {}
-
-    	  function _abort() {
-    		  Module['abort']();
-    		}
-
-    	  function _emscripten_get_heap_size() {
-    		  return HEAP8.length;
-    		}
-
-    	   
-
-    	   
-
-    	  
-    	  function _emscripten_memcpy_big(dest, src, num) {
-    		  HEAPU8.set(HEAPU8.subarray(src, src+num), dest);
-    		}
-    	  
-    	   
-
-    	   
-
-    	  
-    	  function ___setErrNo(value) {
-    		  if (Module['___errno_location']) HEAP32[((Module['___errno_location']())>>2)]=value;
-    		  else //err('failed to set errno from JS');
-    		  return value;
-    		}
-    	  
-    	  
-    	  function abortOnCannotGrowMemory(requestedSize) {
-    		  abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value ' + HEAP8.length + ', (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 ');
-    		}
-    	  
-    	  function emscripten_realloc_buffer(size) {
-    		  var PAGE_MULTIPLE = 65536;
-    		  size = alignUp(size, PAGE_MULTIPLE); // round up to wasm page size
-    		  var oldSize = buffer.byteLength;
-    		  // native wasm support
-    		  // note that this is *not* threadsafe. multiple threads can call .grow(), and each
-    		  // presents a delta, so in theory we may over-allocate here (e.g. if two threads
-    		  // ask to grow from 256MB to 512MB, we get 2 requests to add +256MB, and may end
-    		  // up growing to 768MB (even though we may have been able to make do with 512MB).
-    		  // TODO: consider decreasing the step sizes in emscripten_resize_heap
-    		  try {
-    			var result = wasmMemory.grow((size - oldSize) / 65536); // .grow() takes a delta compared to the previous size
-    			if (result !== (-1 | 0)) {
-    			  // success in native wasm memory growth, get the buffer from the memory
-    			  buffer = wasmMemory.buffer;
-    			  return true;
-    			} else {
-    			  return false;
-    			}
-    		  } catch(e) {
-    			console.error('emscripten_realloc_buffer: Attempted to grow from ' + oldSize  + ' bytes to ' + size + ' bytes, but got error: ' + e);
-    			return false;
-    		  }
-    		}function _emscripten_resize_heap(requestedSize) {
-    		  var oldSize = _emscripten_get_heap_size();
-    		  // With pthreads, races can happen (another thread might increase the size in between), so return a failure, and let the caller retry.
-    		  assert(requestedSize > oldSize);
-    	  
-    	  
-    		  var PAGE_MULTIPLE = 65536;
-    		  var LIMIT = 2147483648 - PAGE_MULTIPLE; // We can do one page short of 2GB as theoretical maximum.
-    	  
-    		  if (requestedSize > LIMIT) {
-    			//err('Cannot enlarge memory, asked to go up to ' + requestedSize + ' bytes, but the limit is ' + LIMIT + ' bytes!');
-    			return false;
-    		  }
-    	  
-    		  var MIN_TOTAL_MEMORY = 16777216;
-    		  var newSize = Math.max(oldSize, MIN_TOTAL_MEMORY); // So the loop below will not be infinite, and minimum asm.js memory size is 16MB.
-    	  
-    		  // TODO: see realloc_buffer - for PTHREADS we may want to decrease these jumps
-    		  while (newSize < requestedSize) { // Keep incrementing the heap size as long as it's less than what is requested.
-    			if (newSize <= 536870912) {
-    			  newSize = alignUp(2 * newSize, PAGE_MULTIPLE); // Simple heuristic: double until 1GB...
-    			} else {
-    			  // ..., but after that, add smaller increments towards 2GB, which we cannot reach
-    			  newSize = Math.min(alignUp((3 * newSize + 2147483648) / 4, PAGE_MULTIPLE), LIMIT);
-    			}
-    	  
-    			if (newSize === oldSize) {
-    			  warnOnce('Cannot ask for more memory since we reached the practical limit in browsers (which is just below 2GB), so the request would have failed. Requesting only ' + HEAP8.length);
-    			}
-    		  }
-    	  
-    		  if (!emscripten_realloc_buffer(newSize)) {
-    			//err('Failed to grow the heap from ' + oldSize + ' bytes to ' + newSize + ' bytes, not enough memory!');
-    			return false;
-    		  }
-    	  
-    		  updateGlobalBufferViews();
-    	  
-    	  
-    	  
-    		  return true;
-    		} 
-
-
-    	// ASM_LIBRARY EXTERN PRIMITIVES: Math_max,Math_min,Int8Array,Int32Array
-
-
-    	function nullFunc_ii(x) { err("Invalid function pointer called with signature 'ii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	function nullFunc_iidiiii(x) { err("Invalid function pointer called with signature 'iidiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	function nullFunc_iiii(x) { err("Invalid function pointer called with signature 'iiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	function nullFunc_jiji(x) { err("Invalid function pointer called with signature 'jiji'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	function nullFunc_v(x) { err("Invalid function pointer called with signature 'v'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	function nullFunc_vi(x) { err("Invalid function pointer called with signature 'vi'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	function nullFunc_vii(x) { err("Invalid function pointer called with signature 'vii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	function nullFunc_viiii(x) { err("Invalid function pointer called with signature 'viiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	function nullFunc_viiiii(x) { err("Invalid function pointer called with signature 'viiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	function nullFunc_viiiiii(x) { err("Invalid function pointer called with signature 'viiiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-    	var asmGlobalArg = {};
-
-    	var asmLibraryArg = {
-    	  "abort": abort,
-    	  "setTempRet0": setTempRet0,
-    	  "getTempRet0": getTempRet0,
-    	  "abortStackOverflow": abortStackOverflow,
-    	  "nullFunc_ii": nullFunc_ii,
-    	  "nullFunc_iidiiii": nullFunc_iidiiii,
-    	  "nullFunc_iiii": nullFunc_iiii,
-    	  "nullFunc_jiji": nullFunc_jiji,
-    	  "nullFunc_v": nullFunc_v,
-    	  "nullFunc_vi": nullFunc_vi,
-    	  "nullFunc_vii": nullFunc_vii,
-    	  "nullFunc_viiii": nullFunc_viiii,
-    	  "nullFunc_viiiii": nullFunc_viiiii,
-    	  "nullFunc_viiiiii": nullFunc_viiiiii,
-    	  "___cxa_allocate_exception": ___cxa_allocate_exception,
-    	  "___cxa_begin_catch": ___cxa_begin_catch,
-    	  "___cxa_throw": ___cxa_throw,
-    	  "___cxa_uncaught_exception": ___cxa_uncaught_exception,
-    	  "___exception_addRef": ___exception_addRef,
-    	  "___exception_deAdjust": ___exception_deAdjust,
-    	  "___gxx_personality_v0": ___gxx_personality_v0,
-    	  "___lock": ___lock,
-    	  "___setErrNo": ___setErrNo,
-    	  "___syscall140": ___syscall140,
-    	  "___syscall146": ___syscall146,
-    	  "___syscall54": ___syscall54,
-    	  "___syscall6": ___syscall6,
-    	  "___unlock": ___unlock,
-    	  "_abort": _abort,
-    	  "_emscripten_get_heap_size": _emscripten_get_heap_size,
-    	  "_emscripten_memcpy_big": _emscripten_memcpy_big,
-    	  "_emscripten_resize_heap": _emscripten_resize_heap,
-    	  "abortOnCannotGrowMemory": abortOnCannotGrowMemory,
-    	  "emscripten_realloc_buffer": emscripten_realloc_buffer,
-    	  "flush_NO_FILESYSTEM": flush_NO_FILESYSTEM,
-    	  "tempDoublePtr": tempDoublePtr,
-    	  "DYNAMICTOP_PTR": DYNAMICTOP_PTR
-    	};
-    	// EMSCRIPTEN_START_ASM
-    	var asm =Module["asm"]// EMSCRIPTEN_END_ASM
-    	(asmGlobalArg, asmLibraryArg, buffer);
-
-    	var real___ZSt18uncaught_exceptionv = asm["__ZSt18uncaught_exceptionv"];
-    	asm["__ZSt18uncaught_exceptionv"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real___ZSt18uncaught_exceptionv.apply(null, arguments);
-    	};
-
-    	var real____cxa_can_catch = asm["___cxa_can_catch"];
-    	asm["___cxa_can_catch"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real____cxa_can_catch.apply(null, arguments);
-    	};
-
-    	var real____cxa_is_pointer_type = asm["___cxa_is_pointer_type"];
-    	asm["___cxa_is_pointer_type"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real____cxa_is_pointer_type.apply(null, arguments);
-    	};
-
-    	var real____errno_location = asm["___errno_location"];
-    	asm["___errno_location"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real____errno_location.apply(null, arguments);
-    	};
-
-    	var real__earcut = asm["_earcut"];
-    	asm["_earcut"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real__earcut.apply(null, arguments);
-    	};
-
-    	var real__fflush = asm["_fflush"];
-    	asm["_fflush"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real__fflush.apply(null, arguments);
-    	};
-
-    	var real__free = asm["_free"];
-    	asm["_free"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real__free.apply(null, arguments);
-    	};
-
-    	var real__llvm_maxnum_f64 = asm["_llvm_maxnum_f64"];
-    	asm["_llvm_maxnum_f64"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real__llvm_maxnum_f64.apply(null, arguments);
-    	};
-
-    	var real__llvm_minnum_f64 = asm["_llvm_minnum_f64"];
-    	asm["_llvm_minnum_f64"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real__llvm_minnum_f64.apply(null, arguments);
-    	};
-
-    	var real__malloc = asm["_malloc"];
-    	asm["_malloc"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real__malloc.apply(null, arguments);
-    	};
-
-    	var real__sbrk = asm["_sbrk"];
-    	asm["_sbrk"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real__sbrk.apply(null, arguments);
-    	};
-
-    	var real_establishStackSpace = asm["establishStackSpace"];
-    	asm["establishStackSpace"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real_establishStackSpace.apply(null, arguments);
-    	};
-
-    	var real_stackAlloc = asm["stackAlloc"];
-    	asm["stackAlloc"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real_stackAlloc.apply(null, arguments);
-    	};
-
-    	var real_stackRestore = asm["stackRestore"];
-    	asm["stackRestore"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real_stackRestore.apply(null, arguments);
-    	};
-
-    	var real_stackSave = asm["stackSave"];
-    	asm["stackSave"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return real_stackSave.apply(null, arguments);
-    	};
-    	Module["asm"] = asm;
-    	var __ZSt18uncaught_exceptionv = Module["__ZSt18uncaught_exceptionv"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["__ZSt18uncaught_exceptionv"].apply(null, arguments)
-    	};
-
-    	var ___cxa_can_catch = Module["___cxa_can_catch"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["___cxa_can_catch"].apply(null, arguments)
-    	};
-
-    	var ___cxa_is_pointer_type = Module["___cxa_is_pointer_type"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["___cxa_is_pointer_type"].apply(null, arguments)
-    	};
-
-    	var ___errno_location = Module["___errno_location"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["___errno_location"].apply(null, arguments)
-    	};
-
-    	var _earcut = Module["_earcut"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_earcut"].apply(null, arguments)
-    	};
-
-    	var _emscripten_replace_memory = Module["_emscripten_replace_memory"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_emscripten_replace_memory"].apply(null, arguments)
-    	};
-
-    	var _fflush = Module["_fflush"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_fflush"].apply(null, arguments)
-    	};
-
-    	var _free = Module["_free"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_free"].apply(null, arguments)
-    	};
-
-    	var _llvm_maxnum_f64 = Module["_llvm_maxnum_f64"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_llvm_maxnum_f64"].apply(null, arguments)
-    	};
-
-    	var _llvm_minnum_f64 = Module["_llvm_minnum_f64"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_llvm_minnum_f64"].apply(null, arguments)
-    	};
-
-    	var _malloc = Module["_malloc"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_malloc"].apply(null, arguments)
-    	};
-
-    	var _memcpy = Module["_memcpy"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_memcpy"].apply(null, arguments)
-    	};
-
-    	var _memset = Module["_memset"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_memset"].apply(null, arguments)
-    	};
-
-    	var _sbrk = Module["_sbrk"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["_sbrk"].apply(null, arguments)
-    	};
-
-    	var establishStackSpace = Module["establishStackSpace"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["establishStackSpace"].apply(null, arguments)
-    	};
-
-    	var stackAlloc = Module["stackAlloc"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["stackAlloc"].apply(null, arguments)
-    	};
-
-    	var stackRestore = Module["stackRestore"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["stackRestore"].apply(null, arguments)
-    	};
-
-    	var stackSave = Module["stackSave"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["stackSave"].apply(null, arguments)
-    	};
-
-    	var dynCall_ii = Module["dynCall_ii"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_ii"].apply(null, arguments)
-    	};
-
-    	var dynCall_iidiiii = Module["dynCall_iidiiii"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_iidiiii"].apply(null, arguments)
-    	};
-
-    	var dynCall_iiii = Module["dynCall_iiii"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_iiii"].apply(null, arguments)
-    	};
-
-    	var dynCall_jiji = Module["dynCall_jiji"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_jiji"].apply(null, arguments)
-    	};
-
-    	var dynCall_v = Module["dynCall_v"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_v"].apply(null, arguments)
-    	};
-
-    	var dynCall_vi = Module["dynCall_vi"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_vi"].apply(null, arguments)
-    	};
-
-    	var dynCall_vii = Module["dynCall_vii"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_vii"].apply(null, arguments)
-    	};
-
-    	var dynCall_viiii = Module["dynCall_viiii"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_viiii"].apply(null, arguments)
-    	};
-
-    	var dynCall_viiiii = Module["dynCall_viiiii"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_viiiii"].apply(null, arguments)
-    	};
-
-    	var dynCall_viiiiii = Module["dynCall_viiiiii"] = function() {
-    	  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-    	  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-    	  return Module["asm"]["dynCall_viiiiii"].apply(null, arguments)
-    	};
-
-
-
-    	// === Auto-generated postamble setup entry stuff ===
-
-    	Module['asm'] = asm;
-
-    	if (!Module["intArrayFromString"]) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["intArrayToString"]) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	Module["ccall"] = ccall;
-    	Module["cwrap"] = cwrap;
-    	if (!Module["setValue"]) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	Module["getValue"] = getValue;
-    	if (!Module["allocate"]) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["getMemory"]) Module["getMemory"] = function() { abort("'getMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["AsciiToString"]) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["stringToAscii"]) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["UTF8ArrayToString"]) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["UTF8ToString"]) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["stringToUTF8Array"]) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["stringToUTF8"]) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["lengthBytesUTF8"]) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["UTF16ToString"]) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["stringToUTF16"]) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["lengthBytesUTF16"]) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["UTF32ToString"]) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["stringToUTF32"]) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["lengthBytesUTF32"]) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["allocateUTF8"]) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["stackTrace"]) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["addOnPreRun"]) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["addOnInit"]) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["addOnPreMain"]) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["addOnExit"]) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["addOnPostRun"]) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["writeStringToMemory"]) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["writeArrayToMemory"]) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["writeAsciiToMemory"]) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["addRunDependency"]) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["removeRunDependency"]) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["ENV"]) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["FS"]) Module["FS"] = function() { abort("'FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["FS_createFolder"]) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["FS_createPath"]) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["FS_createDataFile"]) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["FS_createPreloadedFile"]) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["FS_createLazyFile"]) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["FS_createLink"]) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["FS_createDevice"]) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["FS_unlink"]) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-    	if (!Module["GL"]) Module["GL"] = function() { abort("'GL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["dynamicAlloc"]) Module["dynamicAlloc"] = function() { abort("'dynamicAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["warnOnce"]) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["loadDynamicLibrary"]) Module["loadDynamicLibrary"] = function() { abort("'loadDynamicLibrary' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["loadWebAssemblyModule"]) Module["loadWebAssemblyModule"] = function() { abort("'loadWebAssemblyModule' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["getLEB"]) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["getFunctionTables"]) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["alignFunctionTables"]) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["registerFunctions"]) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["addFunction"]) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["removeFunction"]) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["getFuncWrapper"]) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["prettyPrint"]) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["makeBigInt"]) Module["makeBigInt"] = function() { abort("'makeBigInt' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["dynCall"]) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["getCompilerSetting"]) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["stackSave"]) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["stackRestore"]) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["stackAlloc"]) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["establishStackSpace"]) Module["establishStackSpace"] = function() { abort("'establishStackSpace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["print"]) Module["print"] = function() { abort("'print' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["printErr"]) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["getTempRet0"]) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["setTempRet0"]) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-    	if (!Module["Pointer_stringify"]) Module["Pointer_stringify"] = function() { abort("'Pointer_stringify' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };if (!Module["ALLOC_NORMAL"]) Object.defineProperty(Module, "ALLOC_NORMAL", { get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); } });
-    	if (!Module["ALLOC_STACK"]) Object.defineProperty(Module, "ALLOC_STACK", { get: function() { abort("'ALLOC_STACK' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); } });
-    	if (!Module["ALLOC_DYNAMIC"]) Object.defineProperty(Module, "ALLOC_DYNAMIC", { get: function() { abort("'ALLOC_DYNAMIC' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); } });
-    	if (!Module["ALLOC_NONE"]) Object.defineProperty(Module, "ALLOC_NONE", { get: function() { abort("'ALLOC_NONE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); } });
-
-
-
-
-    	/**
-    	 * @constructor
-    	 * @extends {Error}
-    	 * @this {ExitStatus}
-    	 */
-    	function ExitStatus(status) {
-    	  this.name = "ExitStatus";
-    	  this.message = "Program terminated with exit(" + status + ")";
-    	  this.status = status;
-    	}	ExitStatus.prototype = new Error();
-    	ExitStatus.prototype.constructor = ExitStatus;
-
-    	dependenciesFulfilled = function runCaller() {
-    	  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
-    	  if (!Module['calledRun']) run();
-    	  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
-    	};
-
-
-
-
-
-    	/** @type {function(Array=)} */
-    	function run(args) {
-    	  args = args || Module['arguments'];
-
-    	  if (runDependencies > 0) {
-    		return;
-    	  }
-
-    	  writeStackCookie();
-
-    	  preRun();
-
-    	  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later
-    	  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame
-
-    	  function doRun() {
-    		if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening
-    		Module['calledRun'] = true;
-
-    		if (ABORT) return;
-
-    		ensureInitRuntime();
-
-    		preMain();
-
-    		if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();
-
-    		assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]');
-
-    		postRun();
-    	  }
-
-    	  if (Module['setStatus']) {
-    		Module['setStatus']('Running...');
-    		setTimeout(function() {
-    		  setTimeout(function() {
-    			Module['setStatus']('');
-    		  }, 1);
-    		  doRun();
-    		}, 1);
-    	  } else {
-    		doRun();
-    	  }
-    	  checkStackCookie();
-    	}
-    	Module['run'] = run;
-
-    	var abortDecorators = [];
-
-    	function abort(what) {
-    	  if (Module['onAbort']) {
-    		Module['onAbort'](what);
-    	  }
-
-    	  if (what !== undefined) {
-    		//out(what);
-    		//err(what);
-    		what = '"' + what + '"';
-    	  } else {
-    		what = '';
-    	  }
-
-    	  ABORT = true;
-
-    	  var extra = '';
-    	  var output = 'abort(' + what + ') at ' + stackTrace() + extra;
-    	  if (abortDecorators) {
-    		abortDecorators.forEach(function(decorator) {
-    		  output = decorator(output, what);
-    		});
-    	  }
-    	  throw output;
-    	}
-    	Module['abort'] = abort;
-
-    	if (Module['preInit']) {
-    	  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
-    	  while (Module['preInit'].length > 0) {
-    		Module['preInit'].pop()();
-    	  }
-    	}
-
-
-    	  Module["noExitRuntime"] = true;
-
-    	run();
-    } else {
-        var Module = null;
-    }
-
-    var earcutWasm = Module;
-
-
-
-    // {{MODULE_ADDITIONS}}
-
-    var earcutWasmReady = false;
-    if (when.defined(earcutWasm)) {
-        earcutWasm.onRuntimeInitialized = function () {
-            earcutWasmReady = true;
-        };
-        var earcutwasm = earcutWasm.cwrap('earcut','number',['number','number','number','number','number','number']);
-    }
-
-    var layout$3 = createLayout([
-        {name: 'a_pos', components: 2, type: 'Int16'}
-    ], 4);
-    var members$1 = layout$3.members;
-
-    var EARCUT_MAX_RINGS = 500;
-
-    var FillBucket = function FillBucket(options) {
-        this.zoom = options.zoom;
-        this.overscaling = options.overscaling;
-        this.layers = options.layers;
-        this.layerIds = this.layers.map(function (layer) {
-            return layer.id;
-        });
-        this.index = options.index;
-        this.hasPattern = false;
-        this.patternFeatures = [];
-
-        this.layoutVertexArray = new StructArrayLayout2i4();
-        this.indexArray = new StructArrayLayout3ui6();
-        this.indexArray2 = new StructArrayLayout2ui4();
-        this.programConfigurations = new ProgramConfigurationSet(members$1, options.layers, options.zoom);
-        this.segments = new SegmentVector();
-        this.segments2 = new SegmentVector();
-        this.stateDependentLayerIds = this.layers.filter(function (l) {
-            return l.isStateDependent();
-        }).map(function (l) {
-            return l.id;
-        });
-    };
-
-    FillBucket.prototype.populate = function populate(features, options) {
-        this.hasPattern = hasPattern('fill', this.layers, options);
-        var bucketFeatures = [];
-
-        for (var i = 0, list = features; i < list.length; i += 1) {
-            var ref = list[i];
-            var feature = ref.feature;
-            var index = ref.index;
-            var sourceLayerIndex = ref.sourceLayerIndex;
-
-            if (!this.layers[0]._featureFilter(new EvaluationParameters$1(0), feature)) {
-                continue;
-            }
-
-            var geometry = loadGeometry(feature);
-            var sortKey = 
-                undefined;
-
-            var bucketFeature = {
-                id: feature.id,
-                properties: feature.properties,
-                type: feature.type,
-                sourceLayerIndex: sourceLayerIndex,
-                index: index,
-                geometry: geometry,
-                patterns: {},
-                sortKey: sortKey
-            };
-
-            bucketFeatures.push(bucketFeature);
-        }
-
-        for (var i$1 = 0, list$1 = bucketFeatures; i$1 < list$1.length; i$1 += 1) {
-            var bucketFeature$1 = list$1[i$1];
-
-            var ref$1 = bucketFeature$1;
-            var geometry$1 = ref$1.geometry;
-            var index$1 = ref$1.index;
-            var sourceLayerIndex$1 = ref$1.sourceLayerIndex;
-
-            if (this.hasPattern) {
-                var patternFeature = addPatternDependencies('fill', this.layers, bucketFeature$1, this.zoom, options);
-                // pattern features are added only once the pattern is loaded into the image atlas
-                // so are stored during populate until later updated with positions by tile worker in addFeatures
-                this.patternFeatures.push(patternFeature);
-            } else {
-                this.addFeature(bucketFeature$1, geometry$1, index$1, {}, options.indexData);
-            }
-
-            var feature$1 = features[index$1].feature;
-            options.featureIndex.insert(feature$1, geometry$1, index$1, sourceLayerIndex$1, this.index);
-        }
-    };
-
-    FillBucket.prototype.update = function update(states, vtLayer, imagePositions) {
-        if (!this.stateDependentLayers.length) {
-            return;
-        }
-        this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
-    };
-
-    FillBucket.prototype.addFeatures = function addFeatures(options, imagePositions) {
-        for (var i = 0, list = this.patternFeatures; i < list.length; i += 1) {
-            var feature = list[i];
-
-            this.addFeature(feature, feature.geometry, feature.index, imagePositions);
-        }
-    };
-
-    FillBucket.prototype.isEmpty = function isEmpty() {
-        return this.layoutVertexArray.length === 0;
-    };
-
-    FillBucket.prototype.uploadPending = function uploadPending() {
-        return !this.uploaded || this.programConfigurations.needsUpload;
-    };
-    FillBucket.prototype.upload = function upload(context) {
-        if (!this.uploaded) {
-            if(this.layoutVertexArray == null) {
-                return;
-            }
-            this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$1);
-            this.indexBuffer = context.createIndexBuffer(this.indexArray);
-            this.indexBuffer2 = context.createIndexBuffer(this.indexArray2);
-        }
-        this.programConfigurations.upload(context);
-        this.uploaded = true;
-    };
-
-    FillBucket.prototype.destroy = function destroy() {
-        if (!this.layoutVertexBuffer) {
-            return;
-        }
-        this.layoutVertexBuffer.destroy();
-        this.indexBuffer.destroy();
-        this.indexBuffer2.destroy();
-        this.programConfigurations.destroy();
-        this.segments.destroy();
-        this.segments2.destroy();
-    };
-
-    FillBucket.prototype.clear = function clear() {
-        if (when.defined(this.layoutVertexArray)) {
-            this.layoutVertexArray = null;
-        }
-        if (when.defined(this.indexArray)) {
-            this.indexArray = null;
-        }
-        if (when.defined(this.indexArray2)) {
-            this.indexArray2 = null;
-        }
-    };
-
-    FillBucket.prototype.addFeature = function addFeature(feature, geometry, index, imagePositions, indexData) {
-        for (var i$4 = 0, list$2 = classifyRings(geometry, EARCUT_MAX_RINGS); i$4 < list$2.length; i$4 += 1) {
-            var polygon = list$2[i$4];
-
-            var numVertices = 0;
-            for (var i$2 = 0, list = polygon; i$2 < list.length; i$2 += 1) {
-                var ring = list[i$2];
-
-                numVertices += ring.length;
-            }
-
-            var triangleSegment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray);
-            var triangleIndex = triangleSegment.vertexLength;
-
-            var flattened = [];
-            var holeIndices = [];
-
-            for (var i$3 = 0, list$1 = polygon; i$3 < list$1.length; i$3 += 1) {
-                var ring$1 = list$1[i$3];
-
-                if (ring$1.length === 0) {
-                    continue;
-                }
-
-                if (ring$1 !== polygon[0]) {
-                    holeIndices.push(flattened.length / 2);
-                }
-
-                var lineSegment = this.segments2.prepareSegment(ring$1.length, this.layoutVertexArray, this.indexArray2);
-                var lineIndex = lineSegment.vertexLength;
-
-                this.layoutVertexArray.emplaceBack(ring$1[0].x, ring$1[0].y);
-                this.indexArray2.emplaceBack(lineIndex + ring$1.length - 1, lineIndex);
-                flattened.push(ring$1[0].x);
-                flattened.push(ring$1[0].y);
-
-                for (var i = 1; i < ring$1.length; i++) {
-                    this.layoutVertexArray.emplaceBack(ring$1[i].x, ring$1[i].y);
-                    this.indexArray2.emplaceBack(lineIndex + i - 1, lineIndex + i);
-                    flattened.push(ring$1[i].x);
-                    flattened.push(ring$1[i].y);
-                }
-
-                lineSegment.vertexLength += ring$1.length;
-                lineSegment.primitiveLength += ring$1.length;
-            }
-            
-            var indices;
-
-            if (when.defined(indexData) && when.defined(indexData[feature.id])) {
-                indices = indexData[feature.id];
-            } else if (earcutWasmReady === true) {
-                var data = new Int32Array(flattened);
-                var dataLength = data.length;
-
-                var offset = earcutWasm._malloc(Int32Array.BYTES_PER_ELEMENT * dataLength); //开辟内存
-                earcutWasm.HEAP32.set(data, offset / Int32Array.BYTES_PER_ELEMENT); //设置值
-
-                var hole = new Int32Array(holeIndices);
-                var holeLength = hole.length;
-                var offset1 = earcutWasm._malloc(Int32Array.BYTES_PER_ELEMENT * holeLength); //开辟内存
-                earcutWasm.HEAP32.set(hole, offset1 / Int32Array.BYTES_PER_ELEMENT); //设置值
-
-                var res = new Int32Array(dataLength * 10);
-                var offset2 = earcutWasm._malloc(Int32Array.BYTES_PER_ELEMENT * dataLength * 10); //开辟内存
-                earcutWasm.HEAP32.set(res, offset2 / Int32Array.BYTES_PER_ELEMENT);
-
-                var len = earcutwasm(offset, dataLength, offset1, holeLength, 2, offset2);
-                var result = new Int32Array(earcutWasm.HEAP32.buffer, offset2, len);
-                indices = new Int32Array(result);
-                earcutWasm._free(offset);
-                earcutWasm._free(offset1);
-                earcutWasm._free(offset2);
-            }  else {
-                indices = earcut2_2_1.earcut(flattened, holeIndices);
-            }
-            
-            for (var i$1 = 0; i$1 < indices.length; i$1 += 3) {
-                this.indexArray.emplaceBack(
-                    triangleIndex + indices[i$1],
-                    triangleIndex + indices[i$1 + 1],
-                    triangleIndex + indices[i$1 + 2]);
-            }
-
-            triangleSegment.vertexLength += numVertices;
-            triangleSegment.primitiveLength += indices.length / 3;
-        }
-        this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions);
-    };
-
-    WebWorkerTransfer.register('FillBucket', FillBucket, {omit: ['layers', 'patternFeatures']});
-
-    var Struct = function Struct(structArray           , index      ) {
-        (this   )._structArray = structArray;
-        this._pos1 = index * this.size;
-        this._pos2 = this._pos1 / 2;
-        this._pos4 = this._pos1 / 4;
-        this._pos8 = this._pos1 / 8;
-    };
-
-    var DEFAULT_CAPACITY$1 = 128;
-    var RESIZE_MULTIPLIER$1 = 5;
-
-    /**
-     * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray`
-     * making it behave like an array of typed structs.
-     *
-     * Conceptually, a StructArray is comprised of elements, i.e., instances of its
-     * associated struct type. Each particular struct type, together with an
-     * alignment size, determines the memory layout of a StructArray whose elements
-     * are of that type.  Thus, for each such layout that we need, we have
-     * a corrseponding StructArrayLayout class, inheriting from StructArray and
-     * implementing `emplaceBack()` and `_refreshViews()`.
-     *
-     * In some cases, where we need to access particular elements of a StructArray,
-     * we implement a more specific subclass that inherits from one of the
-     * StructArrayLayouts and adds a `get(i): T` accessor that returns a structured
-     * object whose properties are proxies into the underlying memory space for the
-     * i-th element.  This affords the convience of working with (seemingly) plain
-     * Javascript objects without the overhead of serializing/deserializing them
-     * into ArrayBuffers for efficient web worker transfer.
-     *
-     * @private
-     */
-    var StructArray$1 = function StructArray() {
-        this.isTransferred = false;
-        this.capacity = -1;
-        this.resize(0);
-    };
-
-    /**
-     * Serialize a StructArray instance.Serializes both the raw data and the
-     * metadata needed to reconstruct the StructArray base class during
-     * deserialization.
-     */
-    StructArray$1.serialize = function serialize (array, transferables) {
-        //assert_1(!array.isTransferred);
-        if(array.isTransferred){
-            console.log("StructArray array.isTransferred.");
-        }
-
-        array._trim();
-
-        if (transferables) {
-            array.isTransferred = true;
-            transferables.push(array.arrayBuffer);
-        }
-
-        return {
-            length: array.length,
-            arrayBuffer: array.arrayBuffer,
-        };
-    };
-
-    StructArray$1.deserialize = function deserialize (input                     ) {
-        var structArray = Object.create(this.prototype);
-        structArray.arrayBuffer = input.arrayBuffer;
-        structArray.length = input.length;
-        structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement;
-        structArray._refreshViews();
-        return structArray;
-    };
-
-    /**
-     * Resize the array to discard unused capacity.
-     */
-    StructArray$1.prototype._trim = function _trim () {
-        if (this.length !== this.capacity) {
-            this.capacity = this.length;
-            this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);
-            this._refreshViews();
-        }
-    };
-
-    /**
-     * Resets the the length of the array to 0 without de-allocating capcacity.
-     */
-    StructArray$1.prototype.clear = function clear () {
-        this.length = 0;
-    };
-
-    /**
-     * Resize the array.
-     * If `n` is greater than the current length then additional elements with undefined values are added.
-     * If `n` is less than the current length then the array will be reduced to the first `n` elements.
-     * @param {number} n The new size of the array.
-     */
-    StructArray$1.prototype.resize = function resize (n      ) {
-        //assert_1(!this.isTransferred);
-        this.reserve(n);
-        this.length = n;
-    };
-
-    /**
-     * Indicate a planned increase in size, so that any necessary allocation may
-     * be done once, ahead of time.
-     * @param {number} n The expected size of the array.
-     */
-    StructArray$1.prototype.reserve = function reserve (n      ) {
-        if (n > this.capacity) {
-            this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER$1), DEFAULT_CAPACITY$1);
-            this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);
-
-            var oldUint8Array = this.uint8;
-            this._refreshViews();
-            if (oldUint8Array) { this.uint8.set(oldUint8Array); }
-        }
-    };
-
-    /**
-     * Create TypedArray views for the current ArrayBuffer.
-     */
-    StructArray$1.prototype._refreshViews = function _refreshViews () {
-        throw new Error('_refreshViews() must be implemented by each concrete StructArray layout');
-    };
-    /**
-     * Implementation of the StructArray layout:
-     * [0]: Uint32[1]
-     * [4]: Uint16[2]
-     *
-     * @private
-     */
-    var StructArrayLayout1ul2ui8 = /*@__PURE__*/(function (StructArray) {
-        function StructArrayLayout1ul2ui8 () {
-            StructArray.apply(this, arguments);
-        }
-
-        if ( StructArray ) StructArrayLayout1ul2ui8.__proto__ = StructArray;
-        StructArrayLayout1ul2ui8.prototype = Object.create( StructArray && StructArray.prototype );
-        StructArrayLayout1ul2ui8.prototype.constructor = StructArrayLayout1ul2ui8;
-
-        StructArrayLayout1ul2ui8.prototype._refreshViews = function _refreshViews () {
-            this.uint8 = new Uint8Array(this.arrayBuffer);
-            this.uint32 = new Uint32Array(this.arrayBuffer);
-            this.uint16 = new Uint16Array(this.arrayBuffer);
-        };
-
-        StructArrayLayout1ul2ui8.prototype.emplaceBack = function emplaceBack (v0        , v1        , v2        ) {
-            var i = this.length;
-            this.resize(i + 1);
-            return this.emplace(i, v0, v1, v2);
-        };
-
-        StructArrayLayout1ul2ui8.prototype.emplace = function emplace (i        , v0        , v1        , v2        ) {
-            var o4 = i * 2;
-            var o2 = i * 4;
-            this.uint32[o4 + 0] = v0;
-            this.uint16[o2 + 2] = v1;
-            this.uint16[o2 + 3] = v2;
-            return i;
-        };
-
-        return StructArrayLayout1ul2ui8;
-    }(StructArray$1));
-
-    StructArrayLayout1ul2ui8.prototype.bytesPerElement = 8;
-
-    var FeatureIndexStruct = /*@__PURE__*/(function (Struct) {
-        function FeatureIndexStruct () {
-            Struct.apply(this, arguments);
-        }
-
-        if ( Struct ) FeatureIndexStruct.__proto__ = Struct;
-        FeatureIndexStruct.prototype = Object.create( Struct && Struct.prototype );
-        FeatureIndexStruct.prototype.constructor = FeatureIndexStruct;
-
-        var prototypeAccessors$5 = { featureIndex: { configurable: true },sourceLayerIndex: { configurable: true },bucketIndex: { configurable: true } };
-
-        prototypeAccessors$5.featureIndex.get = function () { return this._structArray.uint32[this._pos4 + 0]; };
-        prototypeAccessors$5.featureIndex.set = function (x        ) { this._structArray.uint32[this._pos4 + 0] = x; };
-        prototypeAccessors$5.sourceLayerIndex.get = function () { return this._structArray.uint16[this._pos2 + 2]; };
-        prototypeAccessors$5.sourceLayerIndex.set = function (x        ) { this._structArray.uint16[this._pos2 + 2] = x; };
-        prototypeAccessors$5.bucketIndex.get = function () { return this._structArray.uint16[this._pos2 + 3]; };
-        prototypeAccessors$5.bucketIndex.set = function (x        ) { this._structArray.uint16[this._pos2 + 3] = x; };
-
-        Object.defineProperties( FeatureIndexStruct.prototype, prototypeAccessors$5 );
-
-        return FeatureIndexStruct;
-    }(Struct));
-
-    FeatureIndexStruct.prototype.size = 8;
-
-    /**
-     * @private
-     */
-    var FeatureIndexArray = /*@__PURE__*/(function (StructArrayLayout1ul2ui8) {
-        function FeatureIndexArray () {
-            StructArrayLayout1ul2ui8.apply(this, arguments);
-        }
-
-        if ( StructArrayLayout1ul2ui8 ) FeatureIndexArray.__proto__ = StructArrayLayout1ul2ui8;
-        FeatureIndexArray.prototype = Object.create( StructArrayLayout1ul2ui8 && StructArrayLayout1ul2ui8.prototype );
-        FeatureIndexArray.prototype.constructor = FeatureIndexArray;
-
-        FeatureIndexArray.prototype.get = function get (index        )                     {
-            //assert_1(!this.isTransferred);
-            return new FeatureIndexStruct(this, index);
-        };
-
-        return FeatureIndexArray;
-    }(StructArrayLayout1ul2ui8));
-
-    WebWorkerTransfer.register('FeatureIndexArray', FeatureIndexArray, {omit: ['layers', 'patternFeatures']});
-    var arrayTypes = {
-        FeatureIndexArray : FeatureIndexArray
-    };
-
-    /**
-     * A standalone point geometry with useful accessor, comparison, and
-     * modification methods.
-     *
-     * @class Point
-     * @param {Number} x the x-coordinate. this could be longitude or screen
-     * pixels, or any other sort of unit.
-     * @param {Number} y the y-coordinate. this could be latitude or screen
-     * pixels, or any other sort of unit.
-     * @example
-     * var point = new Point(-77, 38);
-     */
-    function Point(x, y) {
-        this.x = x;
-        this.y = y;
-    }
-
-    Point.prototype = {
-
-        /**
-         * Clone this point, returning a new point that can be modified
-         * without affecting the old one.
-         * @return {Point} the clone
-         */
-        clone: function() { return new Point(this.x, this.y); },
-
-        /**
-         * Add this point's x & y coordinates to another point,
-         * yielding a new point.
-         * @param {Point} p the other point
-         * @return {Point} output point
-         */
-        add:     function(p) { return this.clone()._add(p); },
-
-        /**
-         * Subtract this point's x & y coordinates to from point,
-         * yielding a new point.
-         * @param {Point} p the other point
-         * @return {Point} output point
-         */
-        sub:     function(p) { return this.clone()._sub(p); },
-
-        /**
-         * Multiply this point's x & y coordinates by point,
-         * yielding a new point.
-         * @param {Point} p the other point
-         * @return {Point} output point
-         */
-        multByPoint:    function(p) { return this.clone()._multByPoint(p); },
-
-        /**
-         * Divide this point's x & y coordinates by point,
-         * yielding a new point.
-         * @param {Point} p the other point
-         * @return {Point} output point
-         */
-        divByPoint:     function(p) { return this.clone()._divByPoint(p); },
-
-        /**
-         * Multiply this point's x & y coordinates by a factor,
-         * yielding a new point.
-         * @param {Point} k factor
-         * @return {Point} output point
-         */
-        mult:    function(k) { return this.clone()._mult(k); },
-
-        /**
-         * Divide this point's x & y coordinates by a factor,
-         * yielding a new point.
-         * @param {Point} k factor
-         * @return {Point} output point
-         */
-        div:     function(k) { return this.clone()._div(k); },
-
-        /**
-         * Rotate this point around the 0, 0 origin by an angle a,
-         * given in radians
-         * @param {Number} a angle to rotate around, in radians
-         * @return {Point} output point
-         */
-        rotate:  function(a) { return this.clone()._rotate(a); },
-
-        /**
-         * Rotate this point around p point by an angle a,
-         * given in radians
-         * @param {Number} a angle to rotate around, in radians
-         * @param {Point} p Point to rotate around
-         * @return {Point} output point
-         */
-        rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
-
-        /**
-         * Multiply this point by a 4x1 transformation matrix
-         * @param {Array<Number>} m transformation matrix
-         * @return {Point} output point
-         */
-        matMult: function(m) { return this.clone()._matMult(m); },
-
-        /**
-         * Calculate this point but as a unit vector from 0, 0, meaning
-         * that the distance from the resulting point to the 0, 0
-         * coordinate will be equal to 1 and the angle from the resulting
-         * point to the 0, 0 coordinate will be the same as before.
-         * @return {Point} unit vector point
-         */
-        unit:    function() { return this.clone()._unit(); },
-
-        /**
-         * Compute a perpendicular point, where the new y coordinate
-         * is the old x coordinate and the new x coordinate is the old y
-         * coordinate multiplied by -1
-         * @return {Point} perpendicular point
-         */
-        perp:    function() { return this.clone()._perp(); },
-
-        /**
-         * Return a version of this point with the x & y coordinates
-         * rounded to integers.
-         * @return {Point} rounded point
-         */
-        round:   function() { return this.clone()._round(); },
-
-        /**
-         * Return the magitude of this point: this is the Euclidean
-         * distance from the 0, 0 coordinate to this point's x and y
-         * coordinates.
-         * @return {Number} magnitude
-         */
-        mag: function() {
-            return Math.sqrt(this.x * this.x + this.y * this.y);
-        },
-
-        /**
-         * Judge whether this point is equal to another point, returning
-         * true or false.
-         * @param {Point} other the other point
-         * @return {boolean} whether the points are equal
-         */
-        equals: function(other) {
-            return this.x === other.x &&
-                this.y === other.y;
-        },
-
-        /**
-         * Calculate the distance from this point to another point
-         * @param {Point} p the other point
-         * @return {Number} distance
-         */
-        dist: function(p) {
-            return Math.sqrt(this.distSqr(p));
-        },
-
-        /**
-         * Calculate the distance from this point to another point,
-         * without the square root step. Useful if you're comparing
-         * relative distances.
-         * @param {Point} p the other point
-         * @return {Number} distance
-         */
-        distSqr: function(p) {
-            var dx = p.x - this.x,
-                dy = p.y - this.y;
-            return dx * dx + dy * dy;
-        },
-
-        /**
-         * Get the angle from the 0, 0 coordinate to this point, in radians
-         * coordinates.
-         * @return {Number} angle
-         */
-        angle: function() {
-            return Math.atan2(this.y, this.x);
-        },
-
-        /**
-         * Get the angle from this point to another point, in radians
-         * @param {Point} b the other point
-         * @return {Number} angle
-         */
-        angleTo: function(b) {
-            return Math.atan2(this.y - b.y, this.x - b.x);
-        },
-
-        /**
-         * Get the angle between this point and another point, in radians
-         * @param {Point} b the other point
-         * @return {Number} angle
-         */
-        angleWith: function(b) {
-            return this.angleWithSep(b.x, b.y);
-        },
-
-        /*
-         * Find the angle of the two vectors, solving the formula for
-         * the cross product a x b = |a||b|sin(θ) for θ.
-         * @param {Number} x the x-coordinate
-         * @param {Number} y the y-coordinate
-         * @return {Number} the angle in radians
-         */
-        angleWithSep: function(x, y) {
-            return Math.atan2(
-                this.x * y - this.y * x,
-                this.x * x + this.y * y);
-        },
-
-        _matMult: function(m) {
-            var x = m[0] * this.x + m[1] * this.y,
-                y = m[2] * this.x + m[3] * this.y;
-            this.x = x;
-            this.y = y;
-            return this;
-        },
-
-        _add: function(p) {
-            this.x += p.x;
-            this.y += p.y;
-            return this;
-        },
-
-        _sub: function(p) {
-            this.x -= p.x;
-            this.y -= p.y;
-            return this;
-        },
-
-        _mult: function(k) {
-            this.x *= k;
-            this.y *= k;
-            return this;
-        },
-
-        _div: function(k) {
-            this.x /= k;
-            this.y /= k;
-            return this;
-        },
-
-        _multByPoint: function(p) {
-            this.x *= p.x;
-            this.y *= p.y;
-            return this;
-        },
-
-        _divByPoint: function(p) {
-            this.x /= p.x;
-            this.y /= p.y;
-            return this;
-        },
-
-        _unit: function() {
-            this._div(this.mag());
-            return this;
-        },
-
-        _perp: function() {
-            var y = this.y;
-            this.y = this.x;
-            this.x = -y;
-            return this;
-        },
-
-        _rotate: function(angle) {
-            var cos = Math.cos(angle),
-                sin = Math.sin(angle),
-                x = cos * this.x - sin * this.y,
-                y = sin * this.x + cos * this.y;
-            this.x = x;
-            this.y = y;
-            return this;
-        },
-
-        _rotateAround: function(angle, p) {
-            var cos = Math.cos(angle),
-                sin = Math.sin(angle),
-                x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
-                y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
-            this.x = x;
-            this.y = y;
-            return this;
-        },
-
-        _round: function() {
-            this.x = Math.round(this.x);
-            this.y = Math.round(this.y);
-            return this;
-        }
-    };
-
-    /**
-     * Construct a point from an array if necessary, otherwise if the input
-     * is already a Point, or an unknown type, return it unchanged
-     * @param {Array<Number>|Point|*} a any kind of input value
-     * @return {Point} constructed point, or passed-through value.
-     * @example
-     * // this
-     * var point = Point.convert([0, 1]);
-     * // is equivalent to
-     * var point = new Point(0, 1);
-     */
-    Point.convert = function (a) {
-        if (a instanceof Point) {
-            return a;
-        }
-        if (Array.isArray(a)) {
-            return new Point(a[0], a[1]);
-        }
-        return a;
-    };
-
-    function VectorTileFeature(pbf, end, extent, keys, values) {
-        // Public
-        this.properties = {};
-        this.extent = extent;
-        this.type = 0;
-
-        // Private
-        this._pbf = pbf;
-        this._geometry = -1;
-        this._keys = keys;
-        this._values = values;
-
-        pbf.readFields(readFeature, this, end);
-    }
-
-    function readFeature(tag, feature, pbf) {
-        if (tag == 1) feature.id = pbf.readVarint();
-        else if (tag == 2) readTag(pbf, feature);
-        else if (tag == 3) feature.type = pbf.readVarint();
-        else if (tag == 4) feature._geometry = pbf.pos;
-    }
-
-    function readTag(pbf, feature) {
-        var end = pbf.readVarint() + pbf.pos;
-
-        while (pbf.pos < end) {
-            var key = feature._keys[pbf.readVarint()],
-                value = feature._values[pbf.readVarint()];
-            feature.properties[key] = value;
-        }
-    }
-
-    VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
-
-    VectorTileFeature.prototype.loadGeometry = function() {
-        var pbf = this._pbf;
-        pbf.pos = this._geometry;
-
-        var end = pbf.readVarint() + pbf.pos,
-            cmd = 1,
-            length = 0,
-            x = 0,
-            y = 0,
-            lines = [],
-            line;
-
-        while (pbf.pos < end) {
-            if (length <= 0) {
-                var cmdLen = pbf.readVarint();
-                cmd = cmdLen & 0x7;
-                length = cmdLen >> 3;
-            }
-
-            length--;
-
-            if (cmd === 1 || cmd === 2) {
-                x += pbf.readSVarint();
-                y += pbf.readSVarint();
-
-                if (cmd === 1) { // moveTo
-                    if (line) lines.push(line);
-                    line = [];
-                }
-
-                line.push(new Point(x, y));
-
-            } else if (cmd === 7) {
-
-                // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
-                if (line) {
-                    line.push(line[0].clone()); // closePolygon
-                }
-
-            } else {
-                console.log('VectorTileFeature loadGeometry unknown command ' + cmd);
-                //throw new Error('unknown command ' + cmd);
-            }
-        }
-
-        if (line) lines.push(line);
-
-        return lines;
-    };
-
-    VectorTileFeature.prototype.bbox = function() {
-        var pbf = this._pbf;
-        pbf.pos = this._geometry;
-
-        var end = pbf.readVarint() + pbf.pos,
-            cmd = 1,
-            length = 0,
-            x = 0,
-            y = 0,
-            x1 = Infinity,
-            x2 = -Infinity,
-            y1 = Infinity,
-            y2 = -Infinity;
-
-        while (pbf.pos < end) {
-            if (length <= 0) {
-                var cmdLen = pbf.readVarint();
-                cmd = cmdLen & 0x7;
-                length = cmdLen >> 3;
-            }
-
-            length--;
-
-            if (cmd === 1 || cmd === 2) {
-                x += pbf.readSVarint();
-                y += pbf.readSVarint();
-                if (x < x1) x1 = x;
-                if (x > x2) x2 = x;
-                if (y < y1) y1 = y;
-                if (y > y2) y2 = y;
-
-            } else if (cmd !== 7) {
-                throw new Error('unknown command ' + cmd);
-            }
-        }
-
-        return [x1, y1, x2, y2];
-    };
-
-    VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
-        var size = this.extent * Math.pow(2, z),
-            x0 = this.extent * x,
-            y0 = this.extent * y,
-            coords = this.loadGeometry(),
-            type = VectorTileFeature.types[this.type],
-            i, j;
-
-        function project(line) {
-            for (var j = 0; j < line.length; j++) {
-                var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
-                line[j] = [
-                    (p.x + x0) * 360 / size - 180,
-                    360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
-                ];
-            }
-        }
-
-        switch (this.type) {
-            case 1:
-                var points = [];
-                for (i = 0; i < coords.length; i++) {
-                    points[i] = coords[i][0];
-                }
-                coords = points;
-                project(coords);
-                break;
-
-            case 2:
-                for (i = 0; i < coords.length; i++) {
-                    project(coords[i]);
-                }
-                break;
-
-            case 3:
-                coords = classifyRings$1(coords);
-                for (i = 0; i < coords.length; i++) {
-                    for (j = 0; j < coords[i].length; j++) {
-                        project(coords[i][j]);
-                    }
-                }
-                break;
-        }
-
-        if (coords.length === 1) {
-            coords = coords[0];
-        } else {
-            type = 'Multi' + type;
-        }
-
-        var result = {
-            type: "Feature",
-            geometry: {
-                type: type,
-                coordinates: coords
-            },
-            properties: this.properties
-        };
-
-        if ('id' in this) {
-            result.id = this.id;
-        }
-
-        return result;
-    };
-
-    // classifies an array of rings into polygons with outer rings and holes
-
-    function classifyRings$1(rings) {
-        var len = rings.length;
-
-        if (len <= 1) return [rings];
-
-        var polygons = [],
-            polygon,
-            ccw;
-
-        for (var i = 0; i < len; i++) {
-            var area = signedArea(rings[i]);
-            if (area === 0) continue;
-
-            if (ccw === undefined) ccw = area < 0;
-
-            if (ccw === area < 0) {
-                if (polygon) polygons.push(polygon);
-                polygon = [rings[i]];
-
-            } else {
-                polygon.push(rings[i]);
-            }
-        }
-        if (polygon) polygons.push(polygon);
-
-        return polygons;
-    }
-
-    function signedArea(ring) {
-        var sum = 0;
-        for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
-            p1 = ring[i];
-            p2 = ring[j];
-            sum += (p2.x - p1.x) * (p1.y + p2.y);
-        }
-        return sum;
-    }
-
-    function VectorTileLayer(pbf, end) {
-        // Public
-        this.version = 1;
-        this.name = null;
-        this.extent = 4096;
-        this.length = 0;
-
-        // Private
-        this._pbf = pbf;
-        this._keys = [];
-        this._values = [];
-        this._features = [];
-
-        pbf.readFields(readLayer, this, end);
-
-        this.length = this._features.length;
-    }
-
-    function readLayer(tag, layer, pbf) {
-        if (tag === 15) layer.version = pbf.readVarint();
-        else if (tag === 1) layer.name = pbf.readString();
-        else if (tag === 5) layer.extent = pbf.readVarint();
-        else if (tag === 2) layer._features.push(pbf.pos);
-        else if (tag === 3) layer._keys.push(pbf.readString());
-        else if (tag === 4) layer._values.push(readValueMessage(pbf));
-    }
-
-    function readValueMessage(pbf) {
-        var value = null,
-            end = pbf.readVarint() + pbf.pos;
-
-        while (pbf.pos < end) {
-            var tag = pbf.readVarint() >> 3;
-
-            value = tag === 1 ? pbf.readString() :
-                tag === 2 ? pbf.readFloat() :
-                    tag === 3 ? pbf.readDouble() :
-                        tag === 4 ? pbf.readVarint64() :
-                            tag === 5 ? pbf.readVarint() :
-                                tag === 6 ? pbf.readSVarint() :
-                                    tag === 7 ? pbf.readBoolean() : null;
-        }
-
-        return value;
-    }
-
-    // return feature `i` from this layer as a `VectorTileFeature`
-    VectorTileLayer.prototype.feature = function(i) {
-        if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
-
-        this._pbf.pos = this._features[i];
-
-        var end = this._pbf.readVarint() + this._pbf.pos;
-        return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);
-    };
-
-    function VectorTile(pbf, end) {
-        this.layers = pbf.readFields(readTile, {}, end);
-    }
-
-    function readTile(tag, layers, pbf) {
-        if (tag === 3) {
-            var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);
-            if (layer.length) layers[layer.name] = layer;
-        }
-    }
-
-    var NUM_PARAMS = 3;
-
-    function GridIndex(extent, n, padding) {
-        var cells = this.cells = [];
-
-        if (extent instanceof ArrayBuffer) {
-            this.arrayBuffer = extent;
-            var array = new Int32Array(this.arrayBuffer);
-            extent = array[0];
-            n = array[1];
-            padding = array[2];
-
-            this.d = n + 2 * padding;
-            for (var k = 0; k < this.d * this.d; k++) {
-                var start = array[NUM_PARAMS + k];
-                var end = array[NUM_PARAMS + k + 1];
-                cells.push(start === end ?
-                        null :
-                        array.subarray(start, end));
-            }
-            var keysOffset = array[NUM_PARAMS + cells.length];
-            var bboxesOffset = array[NUM_PARAMS + cells.length + 1];
-            this.keys = array.subarray(keysOffset, bboxesOffset);
-            this.bboxes = array.subarray(bboxesOffset);
-
-            this.insert = this._insertReadonly;
-
-        } else {
-            this.d = n + 2 * padding;
-            for (var i = 0; i < this.d * this.d; i++) {
-                cells.push([]);
-            }
-            this.keys = [];
-            this.bboxes = [];
-        }
-
-        this.n = n;
-        this.extent = extent;
-        this.padding = padding;
-        this.scale = n / extent;
-        this.uid = 0;
-
-        var p = (padding / n) * extent;
-        this.min = -p;
-        this.max = extent + p;
-    }
-
-
-    GridIndex.prototype.insert = function(key, x1, y1, x2, y2) {
-        this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++);
-        this.keys.push(key);
-        this.bboxes.push(x1);
-        this.bboxes.push(y1);
-        this.bboxes.push(x2);
-        this.bboxes.push(y2);
-    };
-
-    GridIndex.prototype._insertReadonly = function() {
-        throw 'Cannot insert into a GridIndex created from an ArrayBuffer.';
-    };
-
-    GridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) {
-        this.cells[cellIndex].push(uid);
-    };
-
-    GridIndex.prototype.query = function(x1, y1, x2, y2, intersectionTest) {
-        var min = this.min;
-        var max = this.max;
-        if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) {
-            // We use `Array#slice` because `this.keys` may be a `Int32Array` and
-            // some browsers (Safari and IE) do not support `TypedArray#slice`
-            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility
-            return Array.prototype.slice.call(this.keys);
-
-        } else {
-            var result = [];
-            var seenUids = {};
-            this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest);
-            return result;
-        }
-    };
-
-    GridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) {
-        var cell = this.cells[cellIndex];
-        if (cell !== null) {
-            var keys = this.keys;
-            var bboxes = this.bboxes;
-            for (var u = 0; u < cell.length; u++) {
-                var uid = cell[u];
-                if (seenUids[uid] === undefined) {
-                    var offset = uid * 4;
-                    if (intersectionTest ?
-                        intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) :
-                        ((x1 <= bboxes[offset + 2]) &&
-                        (y1 <= bboxes[offset + 3]) &&
-                        (x2 >= bboxes[offset + 0]) &&
-                        (y2 >= bboxes[offset + 1]))) {
-                        seenUids[uid] = true;
-                        result.push(keys[uid]);
-                    } else {
-                        seenUids[uid] = false;
-                    }
-                }
-            }
-        }
-    };
-
-    GridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) {
-        var cx1 = this._convertToCellCoord(x1);
-        var cy1 = this._convertToCellCoord(y1);
-        var cx2 = this._convertToCellCoord(x2);
-        var cy2 = this._convertToCellCoord(y2);
-        for (var x = cx1; x <= cx2; x++) {
-            for (var y = cy1; y <= cy2; y++) {
-                var cellIndex = this.d * y + x;
-                if (intersectionTest && !intersectionTest(
-                            this._convertFromCellCoord(x),
-                            this._convertFromCellCoord(y),
-                            this._convertFromCellCoord(x + 1),
-                            this._convertFromCellCoord(y + 1))) { continue; }
-                if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest)) { return; }
-            }
-        }
-    };
-
-    GridIndex.prototype._convertFromCellCoord = function(x) {
-        return (x - this.padding) / this.scale;
-    };
-
-    GridIndex.prototype._convertToCellCoord = function(x) {
-        return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding));
-    };
-
-    GridIndex.prototype.toArrayBuffer = function() {
-        if (this.arrayBuffer) { return this.arrayBuffer; }
-
-        var cells = this.cells;
-
-        var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1;
-        var totalCellLength = 0;
-        for (var i = 0; i < this.cells.length; i++) {
-            totalCellLength += this.cells[i].length;
-        }
-
-        var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length);
-        array[0] = this.extent;
-        array[1] = this.n;
-        array[2] = this.padding;
-
-        var offset = metadataLength;
-        for (var k = 0; k < cells.length; k++) {
-            var cell = cells[k];
-            array[NUM_PARAMS + k] = offset;
-            array.set(cell, offset);
-            offset += cell.length;
-        }
-
-        array[NUM_PARAMS + cells.length] = offset;
-        array.set(this.keys, offset);
-        offset += this.keys.length;
-
-        array[NUM_PARAMS + cells.length + 1] = offset;
-        array.set(this.bboxes, offset);
-        offset += this.bboxes.length;
-
-        return array.buffer;
-    };
-
-    WebWorkerTransfer.register('GridIndex', GridIndex, {omit: ['layers', 'patternFeatures']});
-
-    /**
-     * @module util
-     * @private
-     */
-    function Util() {
-    }
-
-    /**
-     * Given a value `t` that varies between 0 and 1, return
-     * an interpolation function that eases between 0 and 1 in a pleasing
-     * cubic in-out fashion.
-     *
-     * @private
-     */
-    Util.easeCubicInOut = function (t) {
-        if (t <= 0) {
-            return 0;
-        }
-        if (t >= 1) {
-            return 1;
-        }
-        var t2 = t * t,
-            t3 = t2 * t;
-        return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);
-    };
-
-    /*
-     * Call an asynchronous function on an array of arguments,
-     * calling `callback` with the completed results of all calls.
-     *
-     * @param array input to each call of the async function.
-     * @param fn an async function with signature (data, callback)
-     * @param callback a callback run after all async work is done.
-     * called with an array, containing the results of each async call.
-     * @private
-     */
-    Util.asyncAll = function (array, fn, callback) {
-        if (!array.length) {
-            return callback(null, []);
-        }
-        var remaining = array.length;
-        var results = new Array(array.length);
-        var error = null;
-        array.forEach(function (item, i) {
-            fn(item, function (err, result) {
-                if (err) {
-                    error = err;
-                }
-                results[i] = ((result     )        ); // https://github.com/facebook/flow/issues/2123
-                if (--remaining === 0) {
-                    callback(error, results);
-                }
-            });
-        });
-    };
-
-    /**
-     * Given a destination object and optionally many source objects,
-     * copy all properties from the source objects into the destination.
-     * The last source object given overrides properties from previous
-     * source objects.
-     *
-     * @param dest destination object
-     * @param sources sources from which properties are pulled
-     * @private
-     */
-    Util.extend = function (dest) {
-        var sources = [], len = arguments.length - 1;
-        while (len-- > 0) sources[ len ] = arguments[ len + 1 ];
-
-        for (var i = 0, list = sources; i < list.length; i += 1) {
-            var src = list[i];
-
-            for (var k in src) {
-                dest[k] = src[k];
-            }
-        }
-        return dest;
-    };
-
-    var id = 1;
-
-    /**
-     * Return a unique numeric id, starting at 1 and incrementing with
-     * each call.
-     *
-     * @returns unique numeric id.
-     * @private
-     */
-    Util.uniqueId = function () {
-        return id++;
-    };
-
-    /**
-     * Return a random UUID (v4). Taken from: https://gist.github.com/jed/982883
-     * @private
-     */
-    Util.uuid = function () {
-        function b(a) {
-            return a ? (a ^ Math.random() * 16 >> a / 4).toString(16) :
-                //$FlowFixMe: Flow doesn't like the implied array literal conversion here
-                ([1e7] + -[1e3] + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);
-        }
-
-        return b();
-    };
-
-    /**
-     * Validate a string to match UUID(v4) of the
-     * form: xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxx
-     * @param str string to validate.
-     * @private
-     */
-    Util.validateUuid = function (str) {
-        return str ? /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str) : false;
-    };
-
-    /**
-     * Given an array of member function names as strings, replace all of them
-     * with bound versions that will always refer to `context` as `this`. This
-     * is useful for classes where otherwise event bindings would reassign
-     * `this` to the evented object or some other value: this lets you ensure
-     * the `this` value always.
-     *
-     * @param fns list of member function names
-     * @param context the context value
-     * @example
-     * function MyClass() {
-    *   bindAll(['ontimer'], this);
-    *   this.name = 'Tom';
-    * }
-     * MyClass.prototype.ontimer = function() {
-    *   alert(this.name);
-    * };
-     * var myClass = new MyClass();
-     * setTimeout(myClass.ontimer, 100);
-     * @private
-     */
-    Util.bindAll = function (fns, context) {
-        fns.forEach(function (fn) {
-            if (!context[fn]) {
-                return;
-            }
-            context[fn] = context[fn].bind(context);
-        });
-    };
-
-    /**
-     * Determine if a string ends with a particular substring
-     *
-     * @private
-     */
-    Util.endsWith = function (string, suffix) {
-        return string.indexOf(suffix, string.length - suffix.length) !== -1;
-    };
-
-    /**
-     * Create an object by mapping all the values of an existing object while
-     * preserving their keys.
-     *
-     * @private
-     */
-    Util.mapObject = function (input, iterator, context) {
-        var output = {};
-        for (var key in input) {
-            output[key] = iterator.call(context || this, input[key], key, input);
-        }
-        return output;
-    };
-
-    /**
-     * Create an object by filtering out values of an existing object.
-     *
-     * @private
-     */
-    Util.filterObject = function (input, iterator, context) {
-        var output = {};
-        for (var key in input) {
-            if (iterator.call(context || this, input[key], key, input)) {
-                output[key] = input[key];
-            }
-        }
-        return output;
-    };
-
-    /**
-     * Deeply clones two objects.
-     *
-     * @private
-     */
-    Util.clone = function (input) {
-        if (Array.isArray(input)) {
-            return input.map(Util.clone);
-        } else if (typeof input === 'object' && input) {
-            return ((Util.mapObject(input, Util.clone)     )   );
-        } else {
-            return input;
-        }
-    };
-
-    Util.deepEqual = function (a, b) {
-        if (Array.isArray(a)) {
-            if (!Array.isArray(b) || a.length !== b.length) {
-                return false;
-            }
-            for (var i = 0; i < a.length; i++) {
-                if (!Util.deepEqual(a[i], b[i])) {
-                    return false;
-                }
-            }
-            return true;
-        }
-        if (typeof a === 'object' && a !== null && b !== null) {
-            if (!(typeof b === 'object')) {
-                return false;
-            }
-            var keys = Object.keys(a);
-            if (keys.length !== Object.keys(b).length) {
-                return false;
-            }
-            for (var key in a) {
-                if (!Util.deepEqual(a[key], b[key])) {
-                    return false;
-                }
-            }
-            return true;
-        }
-        return a === b;
-    };
-
-    /**
-     * Check if two arrays have at least one common element.
-     *
-     * @private
-     */
-    Util.arraysIntersect = function (a, b) {
-        for (var l = 0; l < a.length; l++) {
-            if (b.indexOf(a[l]) >= 0) {
-                return true;
-            }
-        }
-        return false;
-    };
-
-    /**
-     * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order
-     *
-     * @private
-     * @returns true for a counter clockwise set of points
-     */
-    // http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/
-    Util.isCounterClockwise = function (a, b, c) {
-        return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);
-    };
-
-    /* global self, WorkerGlobalScope */
-    /**
-     *  Retuns true if the when run in the web-worker context.
-     *
-     * @private
-     * @returns {boolean}
-     */
-    Util.isWorker = function () {
-        return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' &&
-            self instanceof WorkerGlobalScope;
-    };
-
-    var _isSafari = null;
-
-    /**
-     * Returns true when run in WebKit derived browsers.
-     * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to
-     * transfer data between WebWorkers and the main thread.
-     * https://github.com/mapbox/mapbox-gl-js/issues/8771
-     *
-     * This should be removed once the underlying Safari issue is fixed.
-     *
-     * @private
-     * @param scope {WindowOrWorkerGlobalScope} Since this function is used both on the main thread and WebWorker context,
-     *      let the calling scope pass in the global scope object.
-     * @returns {boolean}
-     */
-    Util.isSafari = function (scope) {
-        if (_isSafari == null) {
-            var userAgent = scope.navigator ? scope.navigator.userAgent : null;
-            _isSafari = !!scope.safari || !!(userAgent && (/\b(iPad|iPhone|iPod)\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome'))));
-        }
-        return _isSafari;
-    };
-
-    /**
-     * Replace tokens in a string template with values in an object
-     *
-     * @param properties a key/value relationship between tokens and replacements
-     * @param text the template string
-     * @returns the template with tokens replaced
-     * @private
-     */
-    Util.resolveTokens = function (properties, text) {
-        return text.replace(/{([^{}]+)}/g, function (match, key) {
-            return key in properties ? String(properties[key]) : '';
-        });
-    };
-
-    /**
-     * Tracks `let` bindings during expression parsing.
-     * @private
-     */
-    var Scope = function Scope(parent, bindings) {
-        if (bindings === void 0) bindings = [];
-
-        this.parent = parent;
-        this.bindings = {};
-        for (var i = 0, list = bindings; i < list.length; i += 1) {
-            var ref = list[i];
-            var name = ref[0];
-            var expression = ref[1];
-
-            this.bindings[name] = expression;
-        }
-    };
-
-    Scope.prototype.concat = function concat(bindings) {
-        return new Scope(this, bindings);
-    };
-
-    Scope.prototype.get = function get(name) {
-        if (this.bindings[name]) {
-            return this.bindings[name];
-        }
-        if (this.parent) {
-            return this.parent.get(name);
-        }
-        throw new Error((name + " not found in scope."));
-    };
-
-    Scope.prototype.has = function has(name) {
-        if (this.bindings[name]) {
-            return true;
-        }
-        return this.parent ? this.parent.has(name) : false;
-    };
-
-    var ParsingError = /*@__PURE__*/(function (Error) {
-        function ParsingError(key        , message        ) {
-            Error.call(this, message);
-            this.message = message;
-            this.key = key;
-        }
-
-        if ( Error ) ParsingError.__proto__ = Error;
-        ParsingError.prototype = Object.create( Error && Error.prototype );
-        ParsingError.prototype.constructor = ParsingError;
-
-        return ParsingError;
-    }(Error));
-
-    var geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon'];
-
-    var EvaluationContext = function EvaluationContext() {
-        this.globals = (null );
-        this.feature = null;
-        this.featureState = null;
-        this.formattedSection = null;
-        this._parseColorCache = {};
-        this.availableImages = null;
-    };
-
-    EvaluationContext.prototype.id = function id () {
-        return this.feature && 'id' in this.feature ? this.feature.id : null;
-    };
-
-    EvaluationContext.prototype.geometryType = function geometryType () {
-        return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null;
-    };
-
-    EvaluationContext.prototype.properties = function properties () {
-        return this.feature && this.feature.properties || {};
-    };
-
-    EvaluationContext.prototype.parseColor = function parseColor (input    )     {
-        var cached = this._parseColorCache[input];
-        if (!cached) {
-            cached = this._parseColorCache[input] = Color.parse(input);
-        }
-        return cached;
-    };
-
-    function isConstant() {
-    }
-
-    isConstant.isFeatureConstant = function(e){
-        if (e instanceof CompoundExpression) {
-            if (e.name === 'get' && e.args.length === 1) {
-                return false;
-            } else if (e.name === 'feature-state') {
-                return false;
-            } else if (e.name === 'has' && e.args.length === 1) {
-                return false;
-            } else if (
-                e.name === 'properties' ||
-                    e.name === 'geometry-type' ||
-                    e.name === 'id'
-                ) {
-                return false;
-            } else if (/^filter-/.test(e.name)) {
-                return false;
-            }
-        }
-
-        var result = true;
-        e.eachChild(function (arg) {
-            if (result && !isConstant.isFeatureConstant(arg)) {
-                result = false;
-            }
-        });
-        return result;
-    };
-
-    isConstant.isStateConstant = function(e){
-        if (e instanceof CompoundExpression) {
-            if (e.name === 'feature-state') {
-                return false;
-            }
-        }
-        var result = true;
-        e.eachChild(function (arg) {
-            if (result && !isConstant.isStateConstant(arg)) {
-                result = false;
-            }
-        });
-        return result;
-    };
-
-    isConstant.isGlobalPropertyConstant = function(e, properties){
-        if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) {
-            return false;
-        }
-        var result = true;
-        e.eachChild(function (arg) {
-            if (result && !isConstant.isGlobalPropertyConstant(arg, properties)) {
-                result = false;
-            }
-        });
-        return result;
-    };
-
-    /**
-     * State associated parsing at a given point in an expression tree.
-     * @private
-     */
-    var ParsingContext = function ParsingContext(registry, path, expectedType, scope, errors) {
-        if (path === void 0) path = [];
-        if (scope === void 0) scope = new Scope();
-        if (errors === void 0) errors = [];
-
-        this.registry = registry;
-        this.path = path;
-        this.key = path.map(function (part) {
-            return ("[" + part + "]");
-        }).join('');
-        this.scope = scope;
-        this.errors = errors;
-        this.expectedType = expectedType;
-    };
-
-    /**
-     * @param expr the JSON expression to parse
-     * @param index the optional argument index if this expression is an argument of a parent expression that's being parsed
-     * @param options
-     * @param options.omitTypeAnnotations set true to omit inferred type annotations.  Caller beware: with this option set, the parsed expression's type will NOT satisfy `expectedType` if it would normally be wrapped in an inferred annotation.
-     * @private
-     */
-    ParsingContext.prototype.parse = function parse(expr, index, expectedType, bindings, options) {
-        if (options === void 0) options = {};
-
-        if (index) {
-            return this.concat(index, expectedType, bindings)._parse(expr, options);
-        }
-        return this._parse(expr, options);
-    };
-
-    ParsingContext.prototype._parse = function _parse(expr, options) {
-        if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') {
-            expr = ['literal', expr];
-        }
-
-        function annotate(parsed, type, typeAnnotation) {
-            if (typeAnnotation === 'assert') {
-                return new Assertion(type, [parsed]);
-            } else if (typeAnnotation === 'coerce') {
-                return new Coercion(type, [parsed]);
-            } else {
-                return parsed;
-            }
-        }
-
-        if (Array.isArray(expr)) {
-            if (expr.length === 0) {
-                return this.error("Expected an array with at least one element. If you wanted a literal array, use [\"literal\", []].");
-            }
-
-            var op = expr[0];
-            if (typeof op !== 'string') {
-                this.error(("Expression name must be a string, but found " + (typeof op) + " instead. If you wanted a literal array, use [\"literal\", [...]]."), 0);
-                return null;
-            }
-
-            var Expr = this.registry[op];
-            if (Expr) {
-                var parsed = Expr.parse(expr, this);
-                if (!parsed) {
-                    return null;
-                }
-
-                if (this.expectedType) {
-                    var expected = this.expectedType;
-                    var actual = parsed.type;
-
-                    // When we expect a number, string, boolean, or array but have a value, wrap it in an assertion.
-                    // When we expect a color or formatted string, but have a string or value, wrap it in a coercion.
-                    // Otherwise, we do static type-checking.
-                    //
-                    // These behaviors are overridable for:
-                    //   * The "coalesce" operator, which needs to omit type annotations.
-                    //   * String-valued properties (e.g. `text-field`), where coercion is more convenient than assertion.
-                    //
-                    if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') {
-                        parsed = annotate(parsed, expected, options.typeAnnotation || 'assert');
-                    } else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) {
-                        parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce');
-                    } else if (this.checkSubtype(expected, actual)) {
-                        return null;
-                    }
-                }
-
-                // If an expression's arguments are all literals, we can evaluate
-                // it immediately and replace it with a literal value in the
-                // parsed/compiled result. Expressions that expect an image should
-                // not be resolved here so we can later get the available images.
-                if (!(parsed instanceof Literal) && (parsed.type.kind !== 'resolvedImage') && isConstant()) {
-                    var ec = new EvaluationContext();
-                    try {
-                        parsed = new Literal(parsed.type, parsed.evaluate(ec));
-                    } catch (e) {
-                        this.error(e.message);
-                        return null;
-                    }
-                }
-
-                return parsed;
-            }
-
-            return this.error(("Unknown expression \"" + op + "\". If you wanted a literal array, use [\"literal\", [...]]."), 0);
-        } else if (typeof expr === 'undefined') {
-            return this.error("'undefined' value invalid. Use null instead.");
-        } else if (typeof expr === 'object') {
-            return this.error("Bare objects invalid. Use [\"literal\", {...}] instead.");
-        } else {
-            return this.error(("Expected an array, but found " + (typeof expr) + " instead."));
-        }
-    };
-
-    /**
-     * Returns a copy of this context suitable for parsing the subexpression at
-     * index `index`, optionally appending to 'let' binding map.
-     *
-     * Note that `errors` property, intended for collecting errors while
-     * parsing, is copied by reference rather than cloned.
-     * @private
-     */
-    ParsingContext.prototype.concat = function concat(index, expectedType, bindings) {
-        var path = typeof index === 'number' ? this.path.concat(index) : this.path;
-        var scope = bindings ? this.scope.concat(bindings) : this.scope;
-        return new ParsingContext(
-            this.registry,
-            path,
-            expectedType || null,
-            scope,
-            this.errors
-        );
-    };
-
-    /**
-     * Push a parsing (or type checking) error into the `this.errors`
-     * @param error The message
-     * @param keys Optionally specify the source of the error at a child
-     * of the current expression at `this.key`.
-     * @private
-     */
-    ParsingContext.prototype.error = function error(error$1) {
-        var keys = [], len = arguments.length - 1;
-        while (len-- > 0) keys[ len ] = arguments[ len + 1 ];
-
-        var key = "" + (this.key) + (keys.map(function (k) {
-            return ("[" + k + "]");
-        }).join(''));
-        this.errors.push(new ParsingError(key, error$1));
-    };
-
-    /**
-     * Returns null if `t` is a subtype of `expected`; otherwise returns an
-     * error message and also pushes it to `this.errors`.
-     */
-    ParsingContext.prototype.checkSubtype = function checkSubtype$1(expected, t) {
-        var error = checkSubtype(expected, t);
-        if (error) {
-            this.error(error);
-        }
-        return error;
-    };
-
-    function get(key, obj) {
-        const v = obj[key];
-        return typeof v === 'undefined' ? null : v;
-    }
-
-    var CompoundExpression$1 = function CompoundExpression(name, type, evaluate, args) {
-        this.name = name;
-        this.type = type;
-        this._evaluate = evaluate;
-        this.args = args;
-    };
-
-    CompoundExpression$1.prototype.evaluate = function evaluate(ctx) {
-        return this._evaluate(ctx, this.args);
-    };
-
-    CompoundExpression$1.prototype.eachChild = function eachChild(fn) {
-        this.args.forEach(fn);
-    };
-
-    CompoundExpression$1.prototype.possibleOutputs = function possibleOutputs() {
-        return [undefined];
-    };
-
-    CompoundExpression$1.prototype.serialize = function serialize() {
-        return [this.name].concat(this.args.map(function (arg) {
-            return arg.serialize();
-        }));
-    };
-
-    CompoundExpression$1.parse = function parse(args, context) {
-        var ref$1;
-
-        var op = (args[0] );
-        var definition = CompoundExpression$1.definitions[op];
-        if (!definition) {
-            return context.error(("Unknown expression \"" + op + "\". If you wanted a literal array, use [\"literal\", [...]]."), 0);
-        }
-
-        // Now check argument types against each signature
-        var type = Array.isArray(definition) ?
-            definition[0] : definition.type;
-
-        var availableOverloads = Array.isArray(definition) ?
-            [
-                [definition[1], definition[2]]
-            ] :
-            definition.overloads;
-
-        var overloads = availableOverloads.filter(function (ref) {
-            var signature = ref[0];
-
-            return (
-                !Array.isArray(signature) || // varags
-                    signature.length === args.length - 1 // correct param count
-                );
-        });
-
-        var signatureContext = (null );
-
-        for (var i$3 = 0, list = overloads; i$3 < list.length; i$3 += 1) {
-            // Use a fresh context for each attempted signature so that, if
-            // we eventually succeed, we haven't polluted `context.errors`.
-            var ref = list[i$3];
-            var params = ref[0];
-            var evaluate = ref[1];
-
-            signatureContext = new ParsingContext(context.registry, context.path, null, context.scope);
-
-            // First parse all the args, potentially coercing to the
-            // types expected by this overload.
-            var parsedArgs = [];
-            var argParseFailed = false;
-            for (var i = 1; i < args.length; i++) {
-                var arg = args[i];
-                var expectedType = Array.isArray(params) ?
-                    params[i - 1] :
-                    params.type;
-
-                var parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType);
-                if (!parsed) {
-                    argParseFailed = true;
-                    break;
-                }
-                parsedArgs.push(parsed);
-            }
-            if (argParseFailed) {
-                // Couldn't coerce args of this overload to expected type, move
-                // on to next one.
-                continue;
-            }
-
-            if (Array.isArray(params)) {
-                if (params.length !== parsedArgs.length) {
-                    signatureContext.error(("Expected " + (params.length) + " arguments, but found " + (parsedArgs.length) + " instead."));
-                    continue;
-                }
-            }
-
-            for (var i$1 = 0; i$1 < parsedArgs.length; i$1++) {
-                var expected = Array.isArray(params) ? params[i$1] : params.type;
-                var arg$1 = parsedArgs[i$1];
-                signatureContext.concat(i$1 + 1).checkSubtype(expected, arg$1.type);
-            }
-
-            if (signatureContext.errors.length === 0) {
-                return new CompoundExpression$1(op, type, evaluate, parsedArgs);
-            }
-        }
-
-        //assert_1(!signatureContext || signatureContext.errors.length > 0);
-
-        if (overloads.length === 1) {
-            (ref$1 = context.errors).push.apply(ref$1, signatureContext.errors);
-        } else {
-            var expected$1 = overloads.length ? overloads : availableOverloads;
-            var signatures = expected$1
-                .map(function (ref) {
-                    var params = ref[0];
-
-                    return stringifySignature(params);
-                })
-                .join(' | ');
-
-            var actualTypes = [];
-            // For error message, re-parse arguments without trying to
-            // apply any coercions
-            for (var i$2 = 1; i$2 < args.length; i$2++) {
-                var parsed$1 = context.parse(args[i$2], 1 + actualTypes.length);
-                if (!parsed$1) {
-                    return null;
-                }
-                actualTypes.push(toString(parsed$1.type));
-            }
-            context.error(("Expected arguments of type " + signatures + ", but found (" + (actualTypes.join(', ')) + ") instead."));
-        }
-
-        return null;
-    };
-
-    CompoundExpression$1.register = function register(registry, definitions) {
-        //assert_1(!CompoundExpression.definitions);
-        CompoundExpression$1.definitions = definitions;
-        for (var name in definitions) {
-            registry[name] = CompoundExpression$1;
-        }
-    };
-
-    function stringifySignature(signature) {
-        if (Array.isArray(signature)) {
-            return ("(" + (signature.map(toString).join(', ')) + ")");
-        } else {
-            return ("(" + (toString(signature.type)) + "...)");
-        }
-    }
-    var NumberType$a = {kind: 'number'};
-    var StringType$8 = {kind: 'string'};
-    var BooleanType$8 = {kind: 'boolean'};
-    var ColorType$5 = {kind: 'color'};
-    var ObjectType$3 = {kind: 'object'};
-    var ValueType$a = {kind: 'value'};
-    var ErrorType = {kind: 'error'};
-    var CollatorType$3 = {kind: 'collator'};
-
-    function array$5(itemType, N) {
-        return {
-            kind: 'array',
-            itemType: itemType,
-            N: N
-        };
-    }
-
-    function varargs(type) {
-        return {type: type};
-    }
-
-    function rgba(ctx, ref) {
-        var r = ref[0];
-        var g = ref[1];
-        var b = ref[2];
-        var a = ref[3];
-
-        r = r.evaluate(ctx);
-        g = g.evaluate(ctx);
-        b = b.evaluate(ctx);
-        var alpha = a ? a.evaluate(ctx) : 1;
-        var error = Values.validateRGBA(r, g, b, alpha);
-        if (error) {
-            throw new RuntimeError(error);
-        }
-        return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha);
-    }
-
-    CompoundExpression$1.register(expressions, {
-        'error': [
-            ErrorType,
-            [StringType$8],
-            function (ctx, ref) {
-                var v = ref[0];
-                throw new RuntimeError(v.evaluate(ctx));
-            }
-        ],
-        'typeof': [
-            StringType$8,
-            [ValueType$a],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                return toString(Values.typeOf(v.evaluate(ctx)));
-            }
-        ],
-        'to-rgba': [
-            array$5(NumberType$a, 4),
-            [ColorType$5],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                return v.evaluate(ctx).toArray();
-            }
-        ],
-        'rgb': [
-            ColorType$5,
-            [NumberType$a, NumberType$a, NumberType$a],
-            rgba
-        ],
-        'rgba': [
-            ColorType$5,
-            [NumberType$a, NumberType$a, NumberType$a, NumberType$a],
-            rgba
-        ],
-        'has': {
-            type: BooleanType$8,
-            overloads: [
-                [
-                    [StringType$8],
-                    function (ctx, ref) {
-                        var key = ref[0];
-
-                        return has(key.evaluate(ctx), ctx.properties());
-                    }
-                ],
-                [
-                    [StringType$8, ObjectType$3],
-                    function (ctx, ref) {
-                        var key = ref[0];
-                        var obj = ref[1];
-
-                        return has(key.evaluate(ctx), obj.evaluate(ctx));
-                    }
-                ]
-            ]
-        },
-        'get': {
-            type: ValueType$a,
-            overloads: [
-                [
-                    [StringType$8],
-                    function (ctx, ref) {
-                        var key = ref[0];
-
-                        return get(key.evaluate(ctx), ctx.properties());
-                    }
-                ],
-                [
-                    [StringType$8, ObjectType$3],
-                    function (ctx, ref) {
-                        var key = ref[0];
-                        var obj = ref[1];
-
-                        return get(key.evaluate(ctx), obj.evaluate(ctx));
-                    }
-                ]
-            ]
-        },
-        'feature-state': [
-            ValueType$a,
-            [StringType$8],
-            function (ctx, ref) {
-                var key = ref[0];
-
-                return get(key.evaluate(ctx), ctx.featureState || {});
-            }
-        ],
-        'properties': [
-            ObjectType$3,
-            [],
-            function (ctx) {
-                return ctx.properties();
-            }
-        ],
-        'geometry-type': [
-            StringType$8,
-            [],
-            function (ctx) {
-                return ctx.geometryType();
-            }
-        ],
-        'id': [
-            ValueType$a,
-            [],
-            function (ctx) {
-                return ctx.id();
-            }
-        ],
-        'zoom': [
-            NumberType$a,
-            [],
-            function (ctx) {
-                return ctx.globals.zoom;
-            }
-        ],
-        'heatmap-density': [
-            NumberType$a,
-            [],
-            function (ctx) {
-                return ctx.globals.heatmapDensity || 0;
-            }
-        ],
-        'line-progress': [
-            NumberType$a,
-            [],
-            function (ctx) {
-                return ctx.globals.lineProgress || 0;
-            }
-        ],
-        'accumulated': [
-            ValueType$a,
-            [],
-            function (ctx) {
-                return ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated;
-            }
-        ],
-        '+': [
-            NumberType$a,
-            varargs(NumberType$a),
-            function (ctx, args) {
-                var result = 0;
-                for (var i = 0, list = args; i < list.length; i += 1) {
-                    var arg = list[i];
-
-                    result += arg.evaluate(ctx);
-                }
-                return result;
-            }
-        ],
-        '*': [
-            NumberType$a,
-            varargs(NumberType$a),
-            function (ctx, args) {
-                var result = 1;
-                for (var i = 0, list = args; i < list.length; i += 1) {
-                    var arg = list[i];
-
-                    result *= arg.evaluate(ctx);
-                }
-                return result;
-            }
-        ],
-        '-': {
-            type: NumberType$a,
-            overloads: [
-                [
-                    [NumberType$a, NumberType$a],
-                    function (ctx, ref) {
-                        var a = ref[0];
-                        var b = ref[1];
-
-                        return a.evaluate(ctx) - b.evaluate(ctx);
-                    }
-                ],
-                [
-                    [NumberType$a],
-                    function (ctx, ref) {
-                        var a = ref[0];
-
-                        return -a.evaluate(ctx);
-                    }
-                ]
-            ]
-        },
-        '/': [
-            NumberType$a,
-            [NumberType$a, NumberType$a],
-            function (ctx, ref) {
-                var a = ref[0];
-                var b = ref[1];
-
-                return a.evaluate(ctx) / b.evaluate(ctx);
-            }
-        ],
-        '%': [
-            NumberType$a,
-            [NumberType$a, NumberType$a],
-            function (ctx, ref) {
-                var a = ref[0];
-                var b = ref[1];
-
-                return a.evaluate(ctx) % b.evaluate(ctx);
-            }
-        ],
-        'ln2': [
-            NumberType$a,
-            [],
-            function () {
-                return Math.LN2;
-            }
-        ],
-        'pi': [
-            NumberType$a,
-            [],
-            function () {
-                return Math.PI;
-            }
-        ],
-        'e': [
-            NumberType$a,
-            [],
-            function () {
-                return Math.E;
-            }
-        ],
-        '^': [
-            NumberType$a,
-            [NumberType$a, NumberType$a],
-            function (ctx, ref) {
-                var b = ref[0];
-                var e = ref[1];
-
-                return Math.pow(b.evaluate(ctx), e.evaluate(ctx));
-            }
-        ],
-        'sqrt': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var x = ref[0];
-
-                return Math.sqrt(x.evaluate(ctx));
-            }
-        ],
-        'log10': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.log(n.evaluate(ctx)) / Math.LN10;
-            }
-        ],
-        'ln': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.log(n.evaluate(ctx));
-            }
-        ],
-        'log2': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.log(n.evaluate(ctx)) / Math.LN2;
-            }
-        ],
-        'sin': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.sin(n.evaluate(ctx));
-            }
-        ],
-        'cos': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.cos(n.evaluate(ctx));
-            }
-        ],
-        'tan': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.tan(n.evaluate(ctx));
-            }
-        ],
-        'asin': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.asin(n.evaluate(ctx));
-            }
-        ],
-        'acos': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.acos(n.evaluate(ctx));
-            }
-        ],
-        'atan': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.atan(n.evaluate(ctx));
-            }
-        ],
-        'min': [
-            NumberType$a,
-            varargs(NumberType$a),
-            function (ctx, args) {
-                return Math.min.apply(Math, args.map(function (arg) {
-                    return arg.evaluate(ctx);
-                }));
-            }
-        ],
-        'max': [
-            NumberType$a,
-            varargs(NumberType$a),
-            function (ctx, args) {
-                return Math.max.apply(Math, args.map(function (arg) {
-                    return arg.evaluate(ctx);
-                }));
-            }
-        ],
-        'abs': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.abs(n.evaluate(ctx));
-            }
-        ],
-        'round': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                var v = n.evaluate(ctx);
-                // Javascript's Math.round() rounds towards +Infinity for halfway
-                // values, even when they're negative. It's more common to round
-                // away from 0 (e.g., this is what python and C++ do)
-                return v < 0 ? -Math.round(-v) : Math.round(v);
-            }
-        ],
-        'floor': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.floor(n.evaluate(ctx));
-            }
-        ],
-        'ceil': [
-            NumberType$a,
-            [NumberType$a],
-            function (ctx, ref) {
-                var n = ref[0];
-
-                return Math.ceil(n.evaluate(ctx));
-            }
-        ],
-        'filter-==': [
-            BooleanType$8,
-            [StringType$8, ValueType$a],
-            function (ctx, ref) {
-                var k = ref[0];
-                var v = ref[1];
-
-                return ctx.properties()[(k     ).value] === (v     ).value;
-            }
-        ],
-        'filter-id-==': [
-            BooleanType$8,
-            [ValueType$a],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                return ctx.id() === (v     ).value;
-            }
-        ],
-        'filter-like': [
-            BooleanType$8,
-            [StringType$8, StringType$8],
-            function (ctx, ref) {
-                var a = ref[0].value;
-                var b = ref[1].value;
-                var properties = ctx.properties();
-                if(!(a in properties)) {
-                    return false;
-                }
-                if(/^%.*[^%]$/.test(b)) { // 以百分号开头并且不以百分号结尾
-                    b = b.replace("%", "");
-                    return properties[a].endsWith(b);
-                } else if(/^(?!%).+%$/.test(b)) { // 以百分号结尾并且不以百分号开头
-                    b = b.replace("%", "");
-                    return properties[a].startsWith(b);
-                } else { // 百分号开头百分号结尾 or 不含百分号
-                    b = b.replace(/%/g, "");
-                    return (properties[a].indexOf(b)) > -1;
-                }
-            }
-        ],
-        'filter-type-==': [
-            BooleanType$8,
-            [StringType$8],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                return ctx.geometryType() === (v     ).value;
-            }
-        ],
-        'filter-<': [
-            BooleanType$8,
-            [StringType$8, ValueType$a],
-            function (ctx, ref) {
-                var k = ref[0];
-                var v = ref[1];
-
-                var a = ctx.properties()[(k     ).value];
-                var b = (v     ).value;
-                return typeof a === typeof b && a < b;
-            }
-        ],
-        'filter-id-<': [
-            BooleanType$8,
-            [ValueType$a],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                var a = ctx.id();
-                var b = (v     ).value;
-                return typeof a === typeof b && a < b;
-            }
-        ],
-        'filter->': [
-            BooleanType$8,
-            [StringType$8, ValueType$a],
-            function (ctx, ref) {
-                var k = ref[0];
-                var v = ref[1];
-
-                var a = ctx.properties()[(k     ).value];
-                var b = (v     ).value;
-                return typeof a === typeof b && a > b;
-            }
-        ],
-        'filter-id->': [
-            BooleanType$8,
-            [ValueType$a],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                var a = ctx.id();
-                var b = (v     ).value;
-                return typeof a === typeof b && a > b;
-            }
-        ],
-        'filter-<=': [
-            BooleanType$8,
-            [StringType$8, ValueType$a],
-            function (ctx, ref) {
-                var k = ref[0];
-                var v = ref[1];
-
-                var a = ctx.properties()[(k     ).value];
-                var b = (v     ).value;
-                return typeof a === typeof b && a <= b;
-            }
-        ],
-        'filter-id-<=': [
-            BooleanType$8,
-            [ValueType$a],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                var a = ctx.id();
-                var b = (v     ).value;
-                return typeof a === typeof b && a <= b;
-            }
-        ],
-        'filter->=': [
-            BooleanType$8,
-            [StringType$8, ValueType$a],
-            function (ctx, ref) {
-                var k = ref[0];
-                var v = ref[1];
-
-                var a = ctx.properties()[(k     ).value];
-                var b = (v     ).value;
-                return typeof a === typeof b && a >= b;
-            }
-        ],
-        'filter-id->=': [
-            BooleanType$8,
-            [ValueType$a],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                var a = ctx.id();
-                var b = (v     ).value;
-                return typeof a === typeof b && a >= b;
-            }
-        ],
-        'filter-has': [
-            BooleanType$8,
-            [ValueType$a],
-            function (ctx, ref) {
-                var k = ref[0];
-
-                return (k     ).value in ctx.properties();
-            }
-        ],
-        'filter-has-id': [
-            BooleanType$8,
-            [],
-            function (ctx) {
-                return ctx.id() !== null;
-            }
-        ],
-        'filter-type-in': [
-            BooleanType$8,
-            [array$5(StringType$8)],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                return (v     ).value.indexOf(ctx.geometryType()) >= 0;
-            }
-        ],
-        'filter-id-in': [
-            BooleanType$8,
-            [array$5(ValueType$a)],
-            function (ctx, ref) {
-                var v = ref[0];
-
-                return (v     ).value.indexOf(ctx.id()) >= 0;
-            }
-        ],
-        'filter-in-small': [
-            BooleanType$8,
-            [StringType$8, array$5(ValueType$a)],
-            // assumes v is an array literal
-            function (ctx, ref) {
-                var k = ref[0];
-                var v = ref[1];
-
-                return (v     ).value.indexOf(ctx.properties()[(k     ).value]) >= 0;
-            }
-        ],
-        'filter-in-large': [
-            BooleanType$8,
-            [StringType$8, array$5(ValueType$a)],
-            // assumes v is a array literal with values sorted in ascending order and of a single type
-            function (ctx, ref) {
-                var k = ref[0];
-                var v = ref[1];
-
-                return binarySearch(ctx.properties()[(k     ).value], (v     ).value, 0, (v     ).value.length - 1);
-            }
-        ],
-        'all': {
-            type: BooleanType$8,
-            overloads: [
-                [
-                    [BooleanType$8, BooleanType$8],
-                    function (ctx, ref) {
-                        var a = ref[0];
-                        var b = ref[1];
-
-                        return a.evaluate(ctx) && b.evaluate(ctx);
-                    }
-                ],
-                [
-                    varargs(BooleanType$8),
-                    function (ctx, args) {
-                        for (var i = 0, list = args; i < list.length; i += 1) {
-                            var arg = list[i];
-
-                            if (!arg.evaluate(ctx)) {
-                                return false;
-                            }
-                        }
-                        return true;
-                    }
-                ]
-            ]
-        },
-        'any': {
-            type: BooleanType$8,
-            overloads: [
-                [
-                    [BooleanType$8, BooleanType$8],
-                    function (ctx, ref) {
-                        var a = ref[0];
-                        var b = ref[1];
-
-                        return a.evaluate(ctx) || b.evaluate(ctx);
-                    }
-                ],
-                [
-                    varargs(BooleanType$8),
-                    function (ctx, args) {
-                        for (var i = 0, list = args; i < list.length; i += 1) {
-                            var arg = list[i];
-
-                            if (arg.evaluate(ctx)) {
-                                return true;
-                            }
-                        }
-                        return false;
-                    }
-                ]
-            ]
-        },
-        '!': [
-            BooleanType$8,
-            [BooleanType$8],
-            function (ctx, ref) {
-                var b = ref[0];
-
-                return !b.evaluate(ctx);
-            }
-        ],
-        'is-supported-script': [
-            BooleanType$8,
-            [StringType$8],
-            // At parse time this will always return true, so we need to exclude this expression with isGlobalPropertyConstant
-            function (ctx, ref) {
-                var s = ref[0];
-
-                var isSupportedScript = ctx.globals && ctx.globals.isSupportedScript;
-                if (isSupportedScript) {
-                    return isSupportedScript(s.evaluate(ctx));
-                }
-                return true;
-            }
-        ],
-        'upcase': [
-            StringType$8,
-            [StringType$8],
-            function (ctx, ref) {
-                var s = ref[0];
-
-                return s.evaluate(ctx).toUpperCase();
-            }
-        ],
-        'downcase': [
-            StringType$8,
-            [StringType$8],
-            function (ctx, ref) {
-                var s = ref[0];
-
-                return s.evaluate(ctx).toLowerCase();
-            }
-        ],
-        'concat': [
-            StringType$8,
-            varargs(ValueType$a),
-            function (ctx, args) {
-                return args.map(function (arg) {
-                    return Values.toString$1(arg.evaluate(ctx));
-                }).join('');
-            }
-        ],
-        'resolved-locale': [
-            StringType$8,
-            [CollatorType$3],
-            function (ctx, ref) {
-                var collator = ref[0];
-
-                return collator.evaluate(ctx).resolvedLocale();
-            }
-        ]
-    });
-
-    var StyleExpression$1 = function StyleExpression(expression, propertySpec) {
-        this.expression = expression;
-        this._warningHistory = {};
-        this._evaluator = new EvaluationContext();
-        this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null;
-        this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null;
-    };
-
-    StyleExpression$1.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling(globals, feature, featureState, availableImages, formattedSection) {
-        this._evaluator.globals = globals;
-        this._evaluator.feature = feature;
-        this._evaluator.featureState = featureState;
-        this._evaluator.availableImages = availableImages || null;
-        this._evaluator.formattedSection = formattedSection;
-
-        return this.expression.evaluate(this._evaluator);
-    };
-
-    StyleExpression$1.prototype.evaluate = function evaluate(globals, feature, featureState, availableImages, formattedSection) {
-        this._evaluator.globals = globals;
-        this._evaluator.feature = feature || null;
-        this._evaluator.featureState = featureState || null;
-        this._evaluator.availableImages = availableImages || null;
-        this._evaluator.formattedSection = formattedSection || null;
-
-        try {
-            var val = this.expression.evaluate(this._evaluator);
-            // eslint-disable-next-line no-self-compare
-            if (val === null || val === undefined || (typeof val === 'number' && val !== val)) {
-                return this._defaultValue;
-            }
-            if (this._enumValues && !(val in this._enumValues)) {
-                throw new RuntimeError(("Expected value to be one of " + (Object.keys(this._enumValues).map(function (v) {
-                    return JSON.stringify(v);
-                }).join(', ')) + ", but found " + (JSON.stringify(val)) + " instead."));
-            }
-            return val;
-        } catch (e) {
-            if (!this._warningHistory[e.message]) {
-                this._warningHistory[e.message] = true;
-                if (typeof console !== 'undefined') {
-                    console.warn(e.message);
-                }
-            }
-            return this._defaultValue;
-        }
-    };
-
-    function isFunction(value) {
-        return typeof value === 'object' && value !== null && !Array.isArray(value);
-    }
-
-    function getDefaultValue(spec) {
-        if (spec.type === 'color' && isFunction(spec.default)) {
-            // Special case for heatmap-color: it uses the 'default:' to define a
-            // default color ramp, but createExpression expects a simple value to fall
-            // back to in case of runtime errors
-            return new Color(0, 0, 0, 0);
-        } else if (spec.type === 'color') {
-            return Color.parse(spec.default) || null;
-        } else if (spec.default === undefined) {
-            return null;
-        } else {
-            return spec.default;
-        }
-    }
-
-    function Expression() {
-    }
-
-    function success(value) {
-        return {result: 'success', value: value};
-    }
-
-    function error(value) {
-        return {result: 'error', value: value};
-    }
-
-    Expression.isExpression = function (testExpression) {
-        return Array.isArray(testExpression) && testExpression.length > 0 &&
-            typeof testExpression[0] === 'string' && testExpression[0] in expressions;
-    };
-
-    var NumberType$b = {kind: 'number'};
-    var StringType$9 = {kind: 'string'};
-    var BooleanType$9 = {kind: 'boolean'};
-    var ColorType$6 = {kind: 'color'};
-    var ValueType$b = {kind: 'value'};
-    var FormattedType$3 = {kind: 'formatted'};
-    var ResolvedImageType$4 = {kind: 'resolvedImage'};
-
-    function array$6(itemType, N) {
-        return {
-            kind: 'array',
-            itemType: itemType,
-            N: N
-        };
-    }
-
-    function getExpectedType(spec) {
-        var types = {
-            color: ColorType$6,
-            string: StringType$9,
-            number: NumberType$b,
-            enum: StringType$9,
-            boolean: BooleanType$9,
-            formatted: FormattedType$3,
-            resolvedImage: ResolvedImageType$4
-        };
-
-        if (spec.type === 'array') {
-            return array$6(types[spec.value] || ValueType$b, spec.length);
-        }
-
-        return types[spec.type];
-    }
-
-    Expression.createExpression = function (expression, propertySpec) {
-        var parser = new ParsingContext(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined);
-        // For string-valued properties, coerce to string at the top level rather than asserting.
-        var parsed = parser.parse(expression, undefined, undefined, undefined,
-            propertySpec && propertySpec.type === 'string' ? {typeAnnotation: 'coerce'} : undefined);
-
-        if (!parsed) {
-            //assert_1(parser.errors.length > 0);
-            return error(parser.errors);
-        }
-
-        return success(new StyleExpression$1(parsed, propertySpec));
-    };
-
-
-    function isFunction$1(value) {
-        return typeof value === 'object' && value !== null && !Array.isArray(value);
-    }
-
-    function extend$1(output) {
-        var inputs = [], len = arguments.length - 1;
-        while (len-- > 0) inputs[ len ] = arguments[ len + 1 ];
-
-        for (var i = 0, list = inputs; i < list.length; i += 1) {
-            var input = list[i];
-
-            for (var k in input) {
-                output[k] = input[k];
-            }
-        }
-        return output;
-    }
-
-    function evaluateIdentityFunction(parameters, propertySpec, input) {
-        if (propertySpec.type === 'color') {
-            input = Color$1.parse(input);
-        } else if (propertySpec.type === 'formatted') {
-            input = Formatted.fromString(input.toString());
-        } else if (propertySpec.type === 'resolvedImage') {
-            input = ResolvedImage.fromString(input.toString());
-        } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) {
-            input = undefined;
-        }
-        return coalesce(input, parameters.default, propertySpec.default);
-    }
-
-    function createFunction(parameters, propertySpec) {
-        var isColor = propertySpec.type === 'color';
-        var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';
-        var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;
-        var zoomDependent = zoomAndFeatureDependent || !featureDependent;
-        var type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval');
-
-        if (isColor) {
-            parameters = extend$1({}, parameters);
-
-            if (parameters.stops) {
-                parameters.stops = parameters.stops.map(function (stop) {
-                    return [stop[0], Color$1.parse(stop[1])];
-                });
-            }
-
-            if (parameters.default) {
-                parameters.default = Color$1.parse(parameters.default);
-            } else {
-                parameters.default = Color$1.parse(propertySpec.default);
-            }
-        }
-
-        if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { // eslint-disable-line import/namespace
-            throw new Error(("Unknown color space: " + (parameters.colorSpace)));
-        }
-
-        var innerFun;
-        var hashedStops;
-        var categoricalKeyType;
-        if (type === 'exponential') {
-            innerFun = evaluateExponentialFunction;
-        } else if (type === 'interval') {
-            innerFun = evaluateIntervalFunction;
-        } else if (type === 'categorical') {
-            innerFun = evaluateCategoricalFunction;
-
-            // For categorical functions, generate an Object as a hashmap of the stops for fast searching
-            hashedStops = Object.create(null);
-            for (var i = 0, list = parameters.stops; i < list.length; i += 1) {
-                var stop = list[i];
-
-                hashedStops[stop[0]] = stop[1];
-            }
-
-            // Infer key type based on first stop key-- used to encforce strict type checking later
-            categoricalKeyType = typeof parameters.stops[0][0];
-
-        } else if (type === 'identity') {
-            innerFun = evaluateIdentityFunction;
-        } else {
-            throw new Error(("Unknown function type \"" + type + "\""));
-        }
-
-        if (zoomAndFeatureDependent) {
-            var featureFunctions = {};
-            var zoomStops = [];
-            for (var s = 0; s < parameters.stops.length; s++) {
-                var stop$1 = parameters.stops[s];
-                var zoom = stop$1[0].zoom;
-                if (featureFunctions[zoom] === undefined) {
-                    featureFunctions[zoom] = {
-                        zoom: zoom,
-                        type: parameters.type,
-                        property: parameters.property,
-                        default: parameters.default,
-                        stops: []
-                    };
-                    zoomStops.push(zoom);
-                }
-                featureFunctions[zoom].stops.push([stop$1[0].value, stop$1[1]]);
-            }
-
-            var featureFunctionStops = [];
-            for (var i$1 = 0, list$1 = zoomStops; i$1 < list$1.length; i$1 += 1) {
-                var z = list$1[i$1];
-
-                featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]);
-            }
-
-            var interpolationType = {name: 'linear'};
-            return {
-                kind: 'composite',
-                interpolationType: interpolationType,
-                interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType),
-                zoomStops: featureFunctionStops.map(function (s) {
-                    return s[0];
-                }),
-                evaluate: function evaluate(ref, properties) {
-                    var zoom = ref.zoom;
-
-                    return evaluateExponentialFunction({
-                        stops: featureFunctionStops,
-                        base: parameters.base
-                    }, propertySpec, zoom).evaluate(zoom, properties);
-                }
-            };
-        } else if (zoomDependent) {
-            var interpolationType$1 = type === 'exponential' ?
-            {name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1} : null;
-            return {
-                kind: 'camera',
-                interpolationType: interpolationType$1,
-                interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType$1),
-                zoomStops: parameters.stops.map(function (s) {
-                    return s[0];
-                }),
-                evaluate: function (ref) {
-                    var zoom = ref.zoom;
-
-                    return innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType);
-                }
-            };
-        } else {
-            return {
-                kind: 'source',
-                evaluate: function evaluate(_, feature) {
-                    var value = feature && feature.properties ? feature.properties[parameters.property] : undefined;
-                    if (value === undefined) {
-                        return coalesce(parameters.default, propertySpec.default);
-                    }
-                    return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType);
-                }
-            };
-        }
-    }
-
-    function coalesce(a, b, c) {
-        if (a !== undefined) return a;
-        if (b !== undefined) return b;
-        if (c !== undefined) return c;
-    }
-
-    // serialization wrapper for old-style stop functions normalized to the
-    // expression interface
-    var StylePropertyFunction = function StylePropertyFunction(parameters, specification) {
-        this._parameters = parameters;
-        this._specification = specification;
-        extend$1(this, createFunction(this._parameters, this._specification));
-    };
-
-    StylePropertyFunction.deserialize = function deserialize(serialized) {
-        return ((new StylePropertyFunction(serialized._parameters, serialized._specification))                        );
-    };
-
-    StylePropertyFunction.serialize = function serialize(input) {
-        return {
-            _parameters: input._parameters,
-            _specification: input._specification
-        };
-    };
-
-    Expression.normalizePropertyExpression = function (value, specification) {
-        if (isFunction$1(value)) {
-            return (new StylePropertyFunction(value, specification)     );
-
-        } else if (Expression.isExpression(value)) {
-            var expression = createPropertyExpression(value, specification);
-            if (expression.result === 'error') {
-                // this should have been caught in validation
-                throw new Error(expression.value.map(function (err) {
-                    return ((err.key) + ": " + (err.message));
-                }).join(', '));
-            }
-            return expression.value;
-
-        } else {
-            var constant = value;
-            if (typeof value === 'string' && specification.type === 'color') {
-                constant = Color$1.parse(value);
-            }
-            return {
-                kind: 'constant',
-                evaluate: function () {
-                    return constant;
-                }
-            };
-        }
-    };
-
-    function featureFilter() {
-    }
-
-    featureFilter.isExpressionFilter = function (filter) {
-        if (filter === true || filter === false) {
-            return true;
-        }
-
-        if (!Array.isArray(filter) || filter.length === 0) {
-            return false;
-        }
-        switch (filter[0]) {
-            case 'has':
-                return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type';
-
-            case 'in':
-                return filter.length >= 3 && Array.isArray(filter[2]);
-            case '!in':
-            case '!has':
-            case 'none':
-                return false;
-
-            case '==':
-            case '!=':
-            case '>':
-            case '>=':
-            case '<':
-            case '<=':
-            case 'like':
-                return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2]));
-
-            case 'any':
-            case 'all':
-                for (var i = 0, list = filter.slice(1); i < list.length; i += 1) {
-                    var f = list[i];
-
-                    if (!featureFilter.isExpressionFilter(f) && typeof f !== 'boolean') {
-                        return false;
-                    }
-                }
-                return true;
-
-            default:
-                return true;
-        }
-    };
-
-    var filterSpec = {
-        'type': 'boolean',
-        'default': false,
-        'transition': false,
-        'property-type': 'data-driven',
-        'expression': {
-            'interpolated': false,
-            'parameters': ['zoom', 'feature']
-        }
-    };
-
-    /**
-     * Given a filter expressed as nested arrays, return a new function
-     * that evaluates whether a given feature (with a .properties or .tags property)
-     * passes its test.
-     *
-     * @private
-     * @param {Array} filter mapbox gl filter
-     * @returns {Function} filter-evaluating function
-     */
-    featureFilter.createFilter = function (filter) {
-        if (filter === null || filter === undefined) {
-            return function () {
-                return true;
-            };
-        }
-
-        if (!featureFilter.isExpressionFilter(filter)) {
-            filter = convertFilter(filter);
-        }
-
-        var compiled = Expression.createExpression(filter, filterSpec);
-        if (compiled.result === 'error') {
-            throw new Error(compiled.value.map(function (err) {
-                return ((err.key) + ": " + (err.message));
-            }).join(', '));
-        } else {
-            return function (globalProperties, feature) {
-                return compiled.value.evaluate(globalProperties, feature);
-            };
-        }
-    };
-
-    // Comparison function to sort numbers and strings
-    function compare(a, b) {
-        return a < b ? -1 : a > b ? 1 : 0;
-    }
-
-    function convertFilter(filter) {
-        if (!filter) {
-            return true;
-        }
-        var op = filter[0];
-        if (filter.length <= 1) {
-            return (op !== 'any');
-        }
-        var converted =
-            op === '==' ? convertComparisonOp(filter[1], filter[2], '==') :
-                op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) :
-                    op === '<' ||
-                        op === '>' ||
-                        op === '<=' ||
-                        op === '>=' ? convertComparisonOp(filter[1], filter[2], op) :
-                        op === 'any' ? convertDisjunctionOp(filter.slice(1)) :
-                            op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) :
-                                op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) :
-                                    op === 'in' ? convertInOp(filter[1], filter.slice(2)) :
-                                        op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) :
-                                            op === 'has' ? convertHasOp(filter[1]) :
-                                                op === '!has' ? convertNegation(convertHasOp(filter[1])) :
-                                                    op === 'like' ? convertComparisonOp(filter[1], filter[2], 'like') :
-                                                        true;
-        return converted;
-    }
-
-    function convertComparisonOp(property, value, op) {
-        switch (property) {
-            case '$type':
-                return [("filter-type-" + op), value];
-            case '$id':
-                return [("filter-id-" + op), value];
-            default:
-                return [("filter-" + op), property, value];
-        }
-    }
-
-    function convertDisjunctionOp(filters) {
-        return ['any'].concat(filters.map(convertFilter));
-    }
-
-    function convertInOp(property, values) {
-        if (values.length === 0) {
-            return false;
-        }
-        switch (property) {
-            case '$type':
-                return ["filter-type-in", ['literal', values]];
-            case '$id':
-                return ["filter-id-in", ['literal', values]];
-            default:
-                if (values.length > 200 && !values.some(function (v) {
-                    return typeof v !== typeof values[0];
-                })) {
-                    return ['filter-in-large', property, ['literal', values.sort(compare)]];
-                } else {
-                    return ['filter-in-small', property, ['literal', values]];
-                }
-        }
-    }
-
-    function convertHasOp(property) {
-        switch (property) {
-            case '$type':
-                return true;
-            case '$id':
-                return ["filter-has-id"];
-            default:
-                return ["filter-has", property];
-        }
-    }
-
-    function convertNegation(filter) {
-        return ['!', filter];
-    }
-
-    var FeatureIndexArray$1 = arrayTypes.FeatureIndexArray;
-    var FeatureIndex = function FeatureIndex(tileID, grid, featureIndexArray) {
-        //this.tileID = tileID;
-        this.x = tileID.x;
-        this.y = tileID.y;
-        this.z = tileID.z;
-        this.grid = grid || new GridIndex(EXTENT, 16, 0);
-        this.featureIndexArray = featureIndexArray || new FeatureIndexArray$1();
-    };
-
-    FeatureIndex.prototype.insert = function insert(feature, geometry, featureIndex, sourceLayerIndex, bucketIndex, is3D, padding) {
-        var key = this.featureIndexArray.length;
-        this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex);
-
-        var grid = this.grid;
-        padding = padding || 0;
-
-        for (var r = 0; r < geometry.length; r++) {
-            var ring = geometry[r];
-
-            var bbox = [Infinity, Infinity, -Infinity, -Infinity];
-            for (var i = 0; i < ring.length; i++) {
-                var p = ring[i];
-                bbox[0] = Math.min(bbox[0], p.x);
-                bbox[1] = Math.min(bbox[1], p.y);
-                bbox[2] = Math.max(bbox[2], p.x);
-                bbox[3] = Math.max(bbox[3], p.y);
-            }
-
-            if (bbox[0] < EXTENT &&
-                bbox[1] < EXTENT &&
-                bbox[2] >= 0 &&
-                bbox[3] >= 0) {
-                grid.insert(key, bbox[0] - padding, bbox[1] - padding, bbox[2] + padding, bbox[3] + padding);
-            }
-        }
-    };
-
-    FeatureIndex.prototype.loadVTLayers = function loadVTLayers() {
-        if (!this.vtLayers) {
-            this.vtLayers = new VectorTile(new pbf.Protobuf(this.rawTileData)).layers;
-            this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);
-        }
-        return this.vtLayers;
-    };
-
-    // Finds non-symbol features in this tile at a particular position.
-    FeatureIndex.prototype.query = function query(args, styleLayers, sourceFeatureState) {
-        var this$1 = this;
-
-        this.loadVTLayers();
-
-        var params = args.params || {},
-            pixelsToTileUnits = EXTENT / args.tileSize,
-            filter = featureFilter.createFilter(params.filter);
-
-        var queryGeometry = args.queryGeometry;
-        var queryPadding = 5;
-
-        var bounds = getBounds(queryGeometry);
-        var matching = this.grid.query(bounds.minX - queryPadding, bounds.minY - queryPadding, bounds.maxX + queryPadding, bounds.maxY + queryPadding);
-        matching.sort(topDownFeatureComparator);
-
-        var result = {};
-        var previousIndex;
-        var loop = function (k) {
-            var index = matching[k];
-
-            // don't check the same feature more than once
-            if (index === previousIndex) {
-                return;
-            }
-            previousIndex = index;
-
-            var match = this$1.featureIndexArray.get(index);
-            var featureGeometry = null;
-            this$1.loadMatchingFeature(
-                result,
-                match.bucketIndex,
-                match.sourceLayerIndex,
-                match.featureIndex,
-                filter,
-                params.layers,
-                styleLayers,
-                function (feature, styleLayer) {
-                    if (!featureGeometry) {
-                        featureGeometry = loadGeometry(feature);
-                    }
-                    var featureState = {};
-    //                    if (feature.id) {
-    //                        // `feature-state` expression evaluation requires feature state to be available
-    //                        featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', feature.id);
-    //                    }
-                    return styleLayer.queryIntersectsFeature(queryGeometry, feature, featureState, featureGeometry, this$1.z, args.transform, pixelsToTileUnits, args.pixelPosMatrix, args.adjustScale);
-                }
-            );
-        };
-
-        for (var k = 0; k < matching.length; k++) loop(k);
-
-        return result;
-    };
-
-    FeatureIndex.prototype.loadMatchingFeature = function loadMatchingFeature(result, bucketIndex, sourceLayerIndex, featureIndex, filter, filterLayerIDs, styleLayers, intersectionTest) {
-        if(!when.defined(bucketIndex) || !when.defined(sourceLayerIndex) || !when.defined(featureIndex)){
-            return;
-        }
-
-        var layerIDs = this.bucketLayerIDs[bucketIndex];
-        if (filterLayerIDs && !Util.arraysIntersect(filterLayerIDs, layerIDs)) {
-            return;
-        }
-
-        var sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex);
-        var sourceLayer = this.vtLayers[sourceLayerName];
-        var feature = sourceLayer.feature(featureIndex);
-
-        if (!filter(new EvaluationParameters$1(this.z), feature)) {
-            return;
-        }
-
-        for (var l = 0; l < layerIDs.length; l++) {
-            var layerID = layerIDs[l];
-
-            if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {
-                continue;
-            }
-
-            var styleLayer = styleLayers[layerID];
-            if (!styleLayer) {
-                continue;
-            }
-
-            var intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer);
-            if (!intersectionZ) {
-                // Only applied for non-symbol features
-                continue;
-            }
-
-    //            var geojsonFeature = new Feature(feature, this.z, this.x, this.y);
-    //            (geojsonFeature ).layer = styleLayer.serialize();
-            feature.layer = styleLayer.serialize();
-            var layerResult = result[layerID];
-            if (layerResult === undefined) {
-                layerResult = result[layerID] = [];
-            }
-            layerResult.push({featureIndex: featureIndex, feature: feature, intersectionZ: intersectionZ});
-        }
-    };
-
-    // Given a set of symbol indexes that have already been looked up,
-    // return a matching set of GeoJSONFeatures
-    FeatureIndex.prototype.lookupSymbolFeatures = function lookupSymbolFeatures(symbolFeatureIndexes, bucketIndex, sourceLayerIndex, filterSpec, filterLayerIDs, styleLayers) {
-        var result = {};
-        this.loadVTLayers();
-
-        var filter = createFilter(filterSpec);
-
-        for (var i = 0, list = symbolFeatureIndexes; i < list.length; i += 1) {
-            var symbolFeatureIndex = list[i];
-
-            this.loadMatchingFeature(
-                result,
-                bucketIndex,
-                sourceLayerIndex,
-                symbolFeatureIndex,
-                filter,
-                filterLayerIDs,
-                styleLayers
-            );
-
-        }
-        return result;
-    };
-
-    FeatureIndex.prototype.hasLayer = function hasLayer(id) {
-        for (var i$1 = 0, list$1 = this.bucketLayerIDs; i$1 < list$1.length; i$1 += 1) {
-            var layerIDs = list$1[i$1];
-
-            for (var i = 0, list = layerIDs; i < list.length; i += 1) {
-                var layerID = list[i];
-
-                if (id === layerID) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    };
-
-    // register(
-    //     'FeatureIndex',
-    //     FeatureIndex,
-    //     {omit: ['rawTileData', 'sourceLayerCoder']}
-    // );
-
-    function getBounds(geometry) {
-        var minX = Infinity;
-        var minY = Infinity;
-        var maxX = -Infinity;
-        var maxY = -Infinity;
-        for (var i = 0, list = geometry; i < list.length; i += 1) {
-            var p = list[i];
-
-            minX = Math.min(minX, p.x);
-            minY = Math.min(minY, p.y);
-            maxX = Math.max(maxX, p.x);
-            maxY = Math.max(maxY, p.y);
-        }
-        return {minX: minX, minY: minY, maxX: maxX, maxY: maxY};
-    }
-
-    function topDownFeatureComparator(a, b) {
-        return b - a;
-    }
-
-    WebWorkerTransfer.register('FeatureIndex', FeatureIndex, {omit: ['rawTileData', 'sourceLayerCoder', 'vtLayers']});
-
-    const refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];
-
-    function stringify(obj) {
-        var type = typeof obj;
-        if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null)
-        { return JSON.stringify(obj); }
-
-        if (Array.isArray(obj)) {
-            var str$1 = '[';
-            for (var i$1 = 0, list = obj; i$1 < list.length; i$1 += 1) {
-                var val = list[i$1];
-
-                str$1 += (stringify(val)) + ",";
-            }
-            return (str$1 + "]");
-        }
-
-        var keys = Object.keys(obj).sort();
-
-        var str = '{';
-        for (var i = 0; i < keys.length; i++) {
-            str += (JSON.stringify(keys[i])) + ":" + (stringify(obj[keys[i]])) + ",";
-        }
-        return (str + "}");
-    }
-
-    function getKey(layer) {
-        var key = '';
-        for (var i = 0, list = refProperties; i < list.length; i += 1) {
-            var k = list[i];
-
-            key += "/" + (stringify(layer[k]));
-        }
-        return key;
-    }
-
-    /**
-     * Given an array of layers, return an array of arrays of layers where all
-     * layers in each group have identical layout-affecting properties. These
-     * are the properties that were formerly used by explicit `ref` mechanism
-     * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom',
-     * 'filter', and 'layout'.
-     *
-     * The input is not modified. The output layers are references to the
-     * input layers.
-     *
-     * @private
-     * @param {Array<Layer>} layers
-     * @param {Object} [cachedKeys] - an object to keep already calculated keys.
-     * @returns {Array<Array<Layer>>}
-     */
-    function groupByLayout(layers, cachedKeys) {
-        var groups = {};
-
-        for (var i = 0; i < layers.length; i++) {
-
-            var k = (cachedKeys && cachedKeys[layers[i].id]) || getKey(layers[i]);
-            // update the cache if there is one
-            if (cachedKeys)
-            { cachedKeys[layers[i].id] = k; }
-
-            var group = groups[k];
-            if (!group) {
-                group = groups[k] = [];
-            }
-            group.push(layers[i]);
-        }
-
-        var result = [];
-
-        for (var k$1 in groups) {
-            result.push(groups[k$1]);
-        }
-
-        return result;
-    }
-
-    var layout$1 = createLayout([
-        {name: 'a_pos', components: 2, type: 'Int16'}
-    ], 4);
-    var members = layout$1.members;
-
-    function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) {
-        layoutVertexArray.emplaceBack(
-            (x * 2) + ((extrudeX + 1) / 2),
-            (y * 2) + ((extrudeY + 1) / 2));
-    }
-
-    /**
-     * Circles are represented by two triangles.
-     *
-     * Each corner has a pos that is the center of the circle and an extrusion
-     * vector that is where it points.
-     * @private
-     */
-    var CircleBucket = function CircleBucket(options) {
-        this.zoom = options.zoom;
-        this.overscaling = options.overscaling;
-        this.layers = options.layers;
-        this.layerIds = this.layers.map(function (layer) {
-            return layer.id;
-        });
-        this.index = options.index;
-        this.hasPattern = false;
-
-        this.layoutVertexArray = new StructArrayLayout2i4();
-        this.indexArray = new StructArrayLayout3ui6();
-        this.segments = new SegmentVector();
-        this.programConfigurations = new ProgramConfigurationSet(members, options.layers, options.zoom);
-        this.stateDependentLayerIds = this.layers.filter(function (l) {
-            return l.isStateDependent();
-        }).map(function (l) {
-            return l.id;
-        });
-    };
-
-    CircleBucket.prototype.populate = function populate(features, options) {
-        var styleLayer = this.layers[0];
-        var bucketFeatures = [];
-        var circleSortKey = null;
-
-        // Heatmap layers are handled in this bucket and have no evaluated properties, so we check our access
-        if (styleLayer.type === 'circle') {
-            circleSortKey = ((styleLayer )).layout.get('circle-sort-key');
-        }
-
-        for (var i = 0, list = features; i < list.length; i += 1) {
-            var ref = list[i];
-            var feature = ref.feature;
-            var index = ref.index;
-            var sourceLayerIndex = ref.sourceLayerIndex;
-            var currentLayer = this.layers[sourceLayerIndex];
-            var pixelsToTileUnits = EXTENT / 512;
-            var circleRadius = currentLayer.paint.get('circle-radius').value.value * pixelsToTileUnits;
-
-            if (this.layers[0]._featureFilter(new EvaluationParameters$1(0), feature)) {
-                var geometry = loadGeometry(feature);
-                var sortKey = circleSortKey ?
-                    circleSortKey.evaluate(feature, {}) :
-                    undefined;
-
-                var bucketFeature = {
-                    id: feature.id,
-                    properties: feature.properties,
-                    type: feature.type,
-                    sourceLayerIndex: sourceLayerIndex,
-                    index: index,
-                    geometry: geometry,
-                    patterns: {},
-                    sortKey: sortKey,
-                    circleRadius: circleRadius
-                };
-
-                bucketFeatures.push(bucketFeature);
-            }
-        }
-
-        if (circleSortKey) {
-            bucketFeatures.sort(function (a, b) {
-                // a.sortKey is always a number when in use
-                return ((a.sortKey )    ) - ((b.sortKey )    );
-            });
-        }
-
-        for (var i$1 = 0, list$1 = bucketFeatures; i$1 < list$1.length; i$1 += 1) {
-            var bucketFeature$1 = list$1[i$1];
-
-            var ref$1 = bucketFeature$1;
-            var geometry$1 = ref$1.geometry;
-            var index$1 = ref$1.index;
-            var sourceLayerIndex$1 = ref$1.sourceLayerIndex;
-            var feature$1 = features[index$1].feature;
-
-            this.addFeature(bucketFeature$1, geometry$1, index$1);
-            options.featureIndex.insert(feature$1, geometry$1, index$1, sourceLayerIndex$1, this.index, undefined, ref$1.circleRadius);
-        }
-    };
-
-    CircleBucket.prototype.update = function update(states, vtLayer, imagePositions) {
-        if (!this.stateDependentLayers.length) {
-            return;
-        }
-        this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
-    };
-
-    CircleBucket.prototype.isEmpty = function isEmpty() {
-        return this.layoutVertexArray.length === 0;
-    };
-
-    CircleBucket.prototype.uploadPending = function uploadPending() {
-        return !this.uploaded || this.programConfigurations.needsUpload;
-    };
-
-    CircleBucket.prototype.upload = function upload(context) {
-        if (!this.uploaded) {
-            this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members);
-            this.indexBuffer = context.createIndexBuffer(this.indexArray);
-        }
-        this.programConfigurations.upload(context);
-        this.uploaded = true;
-    };
-
-    CircleBucket.prototype.destroy = function destroy() {
-        if (!this.layoutVertexBuffer) {
-            return;
-        }
-        this.layoutVertexBuffer.destroy();
-        this.indexBuffer.destroy();
-        this.programConfigurations.destroy();
-        this.segments.destroy();
-    };
-
-    CircleBucket.prototype.clear = function clear() {
-        if (when.defined(this.layoutVertexArray)) {
-            this.layoutVertexArray = null;
-        }
-        if (when.defined(this.indexArray)) {
-            this.indexArray = null;
-        }
-    };
-
-    CircleBucket.prototype.addFeature = function addFeature(feature, geometry, index) {
-        for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) {
-            var ring = list$1[i$1];
-
-            for (var i = 0, list = ring; i < list.length; i += 1) {
-                var point = list[i];
-
-                var x = point.x;
-                var y = point.y;
-
-                // Do not include points that are outside the tile boundaries.
-                if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) {
-                    continue;
-                }
-
-                // this geometry will be of the Point type, and we'll derive
-                // two triangles from it.
-                //
-                // ┌─────────┐
-                // │ 3 2 │
-                // │     │
-                // │ 0 1 │
-                // └─────────┘
-
-                var segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, feature.sortKey);
-                var index$1 = segment.vertexLength;
-
-                addCircleVertex(this.layoutVertexArray, x, y, -1, -1);
-                addCircleVertex(this.layoutVertexArray, x, y, 1, -1);
-                addCircleVertex(this.layoutVertexArray, x, y, 1, 1);
-                addCircleVertex(this.layoutVertexArray, x, y, -1, 1);
-
-                this.indexArray.emplaceBack(index$1, index$1 + 1, index$1 + 2);
-                this.indexArray.emplaceBack(index$1, index$1 + 3, index$1 + 2);
-
-                segment.vertexLength += 4;
-                segment.primitiveLength += 2;
-            }
-        }
-
-        this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {});
-    };
-
-    WebWorkerTransfer.register('CircleBucket', CircleBucket, {omit: ['layers']});
-
-    /**
-     * An implementation of `Property` for properties that do not permit data-driven (source or composite) expressions.
-     * This restriction allows us to declare statically that the result of possibly evaluating this kind of property
-     * is in fact always the scalar type `T`, and can be used without further evaluating the value on a per-feature basis.
-     *
-     * @private
-     */
-    var DataConstantProperty = function DataConstantProperty(specification) {
-        this.specification = specification;
-    };
-
-    DataConstantProperty.prototype.possiblyEvaluate = function possiblyEvaluate(value, parameters) {
-        //assert_1(!value.isDataDriven());
-        return value.expression.evaluate(parameters);
-    };
-
-    DataConstantProperty.prototype.interpolate = function interpolate$1(a, b, t) {
-        var interp = (interpolate   )[this.specification.type];
-        if (interp) {
-            return interp(a, b, t);
-        } else {
-            return a;
-        }
-    };
-
-    WebWorkerTransfer.register('DataConstantProperty', DataConstantProperty);
-
-    /**
-     * An implementation of `Property` for properties that permit data-driven (source or composite) expressions.
-     * The result of possibly evaluating this kind of property is `PossiblyEvaluatedPropertyValue<T>`; obtaining
-     * a scalar value `T` requires further evaluation on a per-feature basis.
-     *
-     * @private
-     */
-    var DataDrivenProperty = function DataDrivenProperty(specification, overrides) {
-        this.specification = specification;
-        this.overrides = overrides;
-    };
-
-    DataDrivenProperty.prototype.possiblyEvaluate = function possiblyEvaluate(value, parameters, availableImages) {
-        if (value.expression.kind === 'constant' || value.expression.kind === 'camera') {
-            return new PossiblyEvaluatedPropertyValue$1(this, {kind: 'constant', value: value.expression.evaluate(parameters, (null   ), {}, availableImages)}, parameters);
-        } else {
-            return new PossiblyEvaluatedPropertyValue$1(this, value.expression, parameters);
-        }
-    };
-
-    DataDrivenProperty.prototype.interpolate = function interpolate$2(a, b, t) {
-        // If either possibly-evaluated value is non-constant, give up: we aren't able to interpolate data-driven values.
-        if (a.value.kind !== 'constant' || b.value.kind !== 'constant') {
-            return a;
-        }
-
-        // Special case hack solely for fill-outline-color. The undefined value is subsequently handled in
-        // FillStyleLayer#recalculate, which sets fill-outline-color to the fill-color value if the former
-        // is a PossiblyEvaluatedPropertyValue containing a constant undefined value. In addition to the
-        // return value here, the other source of a PossiblyEvaluatedPropertyValue containing a constant
-        // undefined value is the "default value" for fill-outline-color held in
-        // `Properties#defaultPossiblyEvaluatedValues`, which serves as the prototype of
-        // `PossiblyEvaluated#_values`.
-        if (a.value.value === undefined || b.value.value === undefined) {
-            return new PossiblyEvaluatedPropertyValue$1(this, {kind: 'constant', value: (undefined   )}, a.parameters);
-        }
-
-        var interp = (interpolate   )[this.specification.type];
-        if (interp) {
-            return new PossiblyEvaluatedPropertyValue$1(this, {kind: 'constant', value: interp(a.value.value, b.value.value, t)}, a.parameters);
-        } else {
-            return a;
-        }
-    };
-
-    DataDrivenProperty.prototype.evaluate = function evaluate(value, parameters, feature, featureState, availableImages) {
-        if (value.kind === 'constant') {
-            return value.value;
-        } else {
-            return value.evaluate(parameters, feature, featureState, availableImages);
-        }
-    };
-
-    WebWorkerTransfer.register('DataDrivenProperty', DataDrivenProperty);
-
-    var PropertyValue = function PropertyValue(property, value) {
-        this.property = property;
-        this.value = value;
-        this.expression = Expression.normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification);
-    };
-
-    PropertyValue.prototype.isDataDriven = function isDataDriven() {
-        return this.expression.kind === 'source' || this.expression.kind === 'composite';
-    };
-
-    PropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate(parameters, availableImages) {
-        return this.property.possiblyEvaluate(this, parameters, availableImages);
-    };
-
-    /**
-     * Given a value `t` that varies between 0 and 1, return
-     * an interpolation function that eases between 0 and 1 in a pleasing
-     * cubic in-out fashion.
-     *
-     * @private
-     */
-    function easeCubicInOut(t        )         {
-        if (t <= 0) { return 0; }
-        if (t >= 1) { return 1; }
-        var t2 = t * t,
-            t3 = t2 * t;
-        return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);
-    }
-
-    /**
-     * `TransitioningPropertyValue` implements the first of two intermediate steps in the evaluation chain of a paint
-     * property value. In this step, transitions between old and new values are handled: as long as the transition is in
-     * progress, `TransitioningPropertyValue` maintains a reference to the prior value, and interpolates between it and
-     * the new value based on the current time and the configured transition duration and delay. The product is the next
-     * step in the evaluation chain: the "possibly evaluated" result type `R`. See below for more on this concept.
-     *
-     * @private
-     */
-    var TransitioningPropertyValue = function TransitioningPropertyValue(property, value, prior, transition, now) {
-        this.property = property;
-        this.value = value;
-        this.begin = now + transition.delay || 0;
-        this.end = this.begin + transition.duration || 0;
-        if (property.specification.transition && (transition.delay || transition.duration)) {
-            this.prior = prior;
-        }
-    };
-
-    TransitioningPropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate(parameters, availableImages) {
-        var now = parameters.now || 0;
-        var finalValue = this.value.possiblyEvaluate(parameters, availableImages);
-        var prior = this.prior;
-        if (!prior) {
-            // No prior value.
-            return finalValue;
-        } else if (now > this.end) {
-            // Transition from prior value is now complete.
-            this.prior = null;
-            return finalValue;
-        } else if (this.value.isDataDriven()) {
-            // Transitions to data-driven properties are not supported.
-            // We snap immediately to the data-driven value so that, when we perform layout,
-            // we see the data-driven function and can use it to populate vertex buffers.
-            this.prior = null;
-            return finalValue;
-        } else if (now < this.begin) {
-            // Transition hasn't started yet.
-            return prior.possiblyEvaluate(parameters, availableImages);
-        } else {
-            // Interpolate between recursively-calculated prior value and final.
-            var t = (now - this.begin) / (this.end - this.begin);
-            return this.property.interpolate(prior.possiblyEvaluate(parameters, availableImages), finalValue, easeCubicInOut(t));
-        }
-    };
-
-    /**
-     * Paint properties are _transitionable_: they can change in a fluid manner, interpolating or cross-fading between
-     * old and new value. The duration of the transition, and the delay before it begins, is configurable.
-     *
-     * `TransitionablePropertyValue` is a compositional class that stores both the property value and that transition
-     * configuration.
-     *
-     * A `TransitionablePropertyValue` can calculate the next step in the evaluation chain for paint property values:
-     * `TransitioningPropertyValue`.
-     *
-     * @private
-     */
-    var TransitionablePropertyValue = function TransitionablePropertyValue(property) {
-        this.property = property;
-        this.value = new PropertyValue(property, undefined);
-    };
-
-    TransitionablePropertyValue.prototype.transitioned = function transitioned(parameters, prior) {
-        return new TransitioningPropertyValue(this.property, this.value, prior, // eslint-disable-line no-use-before-define
-            Util.extend({}, parameters.transition, this.transition), parameters.now);
-    };
-
-    TransitionablePropertyValue.prototype.untransitioned = function untransitioned() {
-        return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define
-    };
-
-    /**
-     * A helper type: given an object type `Properties` whose values are each of type `Property<T, R>`, it calculates
-     * an object type with the same keys, and values of type `R`.
-     *
-     * For properties that don't allow data-driven values, `R` is a scalar type such as `number`, `string`, or `Color`.
-     * For data-driven properties, it is `PossiblyEvaluatedPropertyValue`. Critically, the type definitions are set up
-     * in a way that allows flow to know which of these two cases applies for any given property name, and if you attempt
-     * to use a `PossiblyEvaluatedPropertyValue` as if it was a scalar, or vice versa, you will get a type error. (However,
-     * there's at least one case in which flow fails to produce a type error that you should be aware of: in a context such
-     * as `layer.paint.get('foo-opacity') === 0`, if `foo-opacity` is data-driven, than the left-hand side is of type
-     * `PossiblyEvaluatedPropertyValue<number>`, but flow will not complain about comparing this to a number using `===`.
-     * See https://github.com/facebook/flow/issues/2359.)
-     *
-     * There's also a third, special case possiblity for `R`: for cross-faded properties, it's `?CrossFaded<T>`.
-     *
-     * @private
-     */
-
-    /**
-     * `Properties` holds objects containing default values for the layout or paint property set of a given
-     * layer type. These objects are immutable, and they are used as the prototypes for the `_values` members of
-     * `Transitionable`, `Transitioning`, `Layout`, and `PossiblyEvaluated`. This allows these classes to avoid
-     * doing work in the common case where a property has no explicit value set and should be considered to take
-     * on the default value: using `for (const property of Object.keys(this._values))`, they can iterate over
-     * only the _own_ properties of `_values`, skipping repeated calculation of transitions and possible/final
-     * evaluations for defaults, the result of which will always be the same.
-     *
-     * @private
-     */
-    var Properties = function Properties(properties) {
-        this.properties = properties;
-        this.defaultPropertyValues = ({}   );
-        this.defaultTransitionablePropertyValues = ({}   );
-        this.defaultTransitioningPropertyValues = ({}   );
-        this.defaultPossiblyEvaluatedValues = ({}   );
-        this.overridableProperties = ([]   );
-
-        for (var property in properties) {
-            var prop = properties[property];
-            if (prop.specification.overridable) {
-                this.overridableProperties.push(property);
-            }
-            var defaultPropertyValue = this.defaultPropertyValues[property] =
-                new PropertyValue(prop, undefined);
-            var defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] =
-                new TransitionablePropertyValue(prop);
-            this.defaultTransitioningPropertyValues[property] =
-                defaultTransitionablePropertyValue.untransitioned();
-            this.defaultPossiblyEvaluatedValues[property] =
-                defaultPropertyValue.possiblyEvaluate(({}   ));
-        }
-    };
-
-    function QueryUtils() {
-    }
-
-    QueryUtils.getMaximumPaintValue = function (property, layer, bucket) {
-        var value = ((layer.paint).get(property)).value;
-        if (value.kind === 'constant') {
-            return value.value;
-        } else {
-            var binders = bucket.programConfigurations.get(layer.id).binders;
-            return binders[property].maxValue;
-        }
-    };
-
-    QueryUtils.translateDistance = function (translate) {
-        return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);
-    };
-
-    QueryUtils.translate = function (queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) {
-        if (!translate[0] && !translate[1]) {
-            return queryGeometry;
-        }
-        var pt = Point.convert(translate)._mult(pixelsToTileUnits);
-
-        if (translateAnchor === "viewport") {
-            pt._rotate(-bearing);
-        }
-
-        var translated = [];
-        for (var i = 0; i < queryGeometry.length; i++) {
-            var point = queryGeometry[i];
-            translated.push(point.sub(pt));
-        }
-        return translated;
-    };
-
-    /**
-     * `PossiblyEvaluated` stores a map of all (property name, `R`) pairs for paint or layout properties of a
-     * given layer type.
-     * @private
-     */
-    var PossiblyEvaluated = function PossiblyEvaluated(properties) {
-        this._properties = properties;
-        this._values = (Object.create(properties.defaultPossiblyEvaluatedValues)   );
-    };
-
-    PossiblyEvaluated.prototype.get = function get(name) {
-        return this._values[name];
-    };
-
-    /**
-     * Because layout properties are not transitionable, they have a simpler representation and evaluation chain than
-     * paint properties: `PropertyValue`s are possibly evaluated, producing possibly evaluated values, which are then
-     * fully evaluated.
-     *
-     * `Layout` stores a map of all (property name, `PropertyValue`) pairs for layout properties of a
-     * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a
-     * `PossiblyEvaluated` instance for the same set of properties.
-     *
-     * @private
-     */
-    var Layout = function Layout(properties                 ) {
-        this._properties = properties;
-        this._values = (Object.create(properties.defaultPropertyValues)   );
-    };
-
-    Layout.prototype.getValue = function getValue (name ) {
-        return Util.clone(this._values[name].value);
-    };
-
-    Layout.prototype.setValue = function setValue (name , value ) {
-        this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : Util.clone(value));
-    };
-
-    Layout.prototype.serialize = function serialize () {
-        var result    = {};
-        for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) {
-            var property = list[i];
-
-            var value = this.getValue(property);
-            if (value !== undefined) {
-                result[property] = value;
-            }
-        }
-        return result;
-    };
-
-    Layout.prototype.possiblyEvaluate = function possiblyEvaluate (parameters                    , availableImages              )                         {
-        var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define
-        for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) {
-            var property = list[i];
-
-            result._values[property] = this._values[property].possiblyEvaluate(parameters, availableImages);
-        }
-        return result;
-    };
-
-    // ------- Transitioning -------
-
-    /**
-     * A helper type: given an object type `Properties` whose values are each of type `Property<T, R>`, it calculates
-     * an object type with the same keys and values of type `TransitioningPropertyValue<T, R>`.
-     *
-     * @private
-     */
-
-
-    /**
-     * `Transitioning` stores a map of all (property name, `TransitioningPropertyValue`) pairs for paint properties of a
-     * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a
-     * `PossiblyEvaluated` instance for the same set of properties.
-     *
-     * @private
-     */
-    var Transitioning = function Transitioning(properties) {
-        this._properties = properties;
-        this._values = (Object.create(properties.defaultTransitioningPropertyValues)   );
-    };
-
-    Transitioning.prototype.possiblyEvaluate = function possiblyEvaluate(parameters, availableImages) {
-        var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define
-        for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) {
-            var property = list[i];
-
-            result._values[property] = this._values[property].possiblyEvaluate(parameters, availableImages);
-        }
-        return result;
-    };
-
-    Transitioning.prototype.hasTransition = function hasTransition() {
-        for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) {
-            var property = list[i];
-
-            if (this._values[property].prior) {
-                return true;
-            }
-        }
-        return false;
-    };
-
-    /**
-     * A helper type: given an object type `Properties` whose values are each of type `Property<T, R>`, it calculates
-     * an object type with the same keys and values of type `TransitionablePropertyValue<T, R>`.
-     *
-     * @private
-     */
-
-
-    /**
-     * `Transitionable` stores a map of all (property name, `TransitionablePropertyValue`) pairs for paint properties of a
-     * given layer type. It can calculate the `TransitioningPropertyValue`s for all of them at once, producing a
-     * `Transitioning` instance for the same set of properties.
-     *
-     * @private
-     */
-    var Transitionable = function Transitionable(properties) {
-        this._properties = properties;
-        this._values = (Object.create(properties.defaultTransitionablePropertyValues)   );
-    };
-
-    Transitionable.prototype.getValue = function getValue(name) {
-        return Util.clone(this._values[name].value.value);
-    };
-
-    Transitionable.prototype.setValue = function setValue(name, value) {
-        if (!this._values.hasOwnProperty(name)) {
-            this._values[name] = new TransitionablePropertyValue(this._values[name].property);
-        }
-        // Note that we do not _remove_ an own property in the case where a value is being reset
-        // to the default: the transition might still be non-default.
-        this._values[name].value = new PropertyValue(this._values[name].property, value === null ? undefined : Util.clone(value));
-    };
-
-    Transitionable.prototype.getTransition = function getTransition(name) {
-        return Util.clone(this._values[name].transition);
-    };
-
-    Transitionable.prototype.setTransition = function setTransition(name, value) {
-        if (!this._values.hasOwnProperty(name)) {
-            this._values[name] = new TransitionablePropertyValue(this._values[name].property);
-        }
-        this._values[name].transition = Util.clone(value) || undefined;
-    };
-
-    Transitionable.prototype.serialize = function serialize() {
-        var result = {};
-        for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) {
-            var property = list[i];
-
-            var value = this.getValue(property);
-            if (value !== undefined) {
-                result[property] = value;
-            }
-
-            var transition = this.getTransition(property);
-            if (transition !== undefined) {
-                result[(property + "-transition")] = transition;
-            }
-        }
-        return result;
-    };
-
-    Transitionable.prototype.transitioned = function transitioned(parameters, prior) {
-        var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define
-        for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) {
-            var property = list[i];
-
-            result._values[property] = this._values[property].transitioned(parameters, prior._values[property]);
-        }
-        return result;
-    };
-
-    Transitionable.prototype.untransitioned = function untransitioned() {
-        var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define
-        for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) {
-            var property = list[i];
-
-            result._values[property] = this._values[property].untransitioned();
-        }
-        return result;
-    };
-
-    var TRANSITION_SUFFIX = '-transition';
-
-    function endsWith(string, suffix) {
-        return string.indexOf(suffix, string.length - suffix.length) !== -1;
-    }
-
-    function StyleLayer(layer, properties) {
-        //Evented.call(this);
-
-        this.id = layer.id;
-        this.type = layer.type;
-    //        this._featureFilter = function () {
-    //            return true;
-    //        };
-
-        if (layer.type === 'custom') {
-            return;
-        }
-
-        layer = ((layer));
-
-        this.metadata = layer.metadata;
-        this.minzoom = layer.minzoom;
-        this.maxzoom = layer.maxzoom;
-
-        if (layer.type !== 'background') {
-            this.source = layer.source;
-            this.sourceLayer = layer['source-layer'];
-            this.filter = layer.filter;
-        }
-
-        if (properties.layout) {
-            this._unevaluatedLayout = new Layout(properties.layout);
-        }
-
-        if (properties.paint) {
-            this._transitionablePaint = new Transitionable(properties.paint);
-
-            for (var property in layer.paint) {
-                this.setPaintProperty(property, layer.paint[property], {validate: false});
-            }
-            for (var property$1 in layer.layout) {
-                this.setLayoutProperty(property$1, layer.layout[property$1], {validate: false});
-            }
-
-            this._transitioningPaint = this._transitionablePaint.untransitioned();
-        }
-    }
-
-    //    if (Evented) StyleLayer.__proto__ = Evented;
-    //    StyleLayer.prototype = Object.create(Evented && Evented.prototype);
-    //    StyleLayer.prototype.constructor = StyleLayer;
-
-    StyleLayer.prototype.getCrossfadeParameters = function getCrossfadeParameters() {
-        return this._crossfadeParameters;
-    };
-
-    StyleLayer.prototype.getLayoutProperty = function getLayoutProperty(name) {
-        if (name === 'visibility') {
-            return this.visibility;
-        }
-
-        return this._unevaluatedLayout.getValue(name);
-    };
-
-    StyleLayer.prototype.setLayoutProperty = function setLayoutProperty(name, value, options) {
-
-        if (value !== null && value !== undefined) {
-            var key = "layers." + (this.id) + ".layout." + name;
-    //            if (this._validate(validateLayoutProperty$1, key, name, value, options)) {
-    //                return;
-    //            }
-        }
-
-        if (name === 'visibility') {
-            this.visibility = value;
-            return;
-        }
-
-        this._unevaluatedLayout.setValue(name, value);
-    };
-
-    StyleLayer.prototype.getPaintProperty = function getPaintProperty(name) {
-        if (endsWith(name, TRANSITION_SUFFIX)) {
-            return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length));
-        } else {
-            return this._transitionablePaint.getValue(name);
-        }
-    };
-
-    StyleLayer.prototype.setPaintProperty = function setPaintProperty(name, value, options) {
-
-        if (value !== null && value !== undefined) {
-            var key = "layers." + (this.id) + ".paint." + name;
-    //            if (this._validate(validatePaintProperty$1, key, name, value, options)) {
-    //                return false;
-    //            }
-        }
-
-        if (endsWith(name, TRANSITION_SUFFIX)) {
-            this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), (value     ) || undefined);
-            return false;
-        } else {
-            var transitionable = this._transitionablePaint._values[name];
-            var isCrossFadedProperty = transitionable.property.specification["property-type"] === 'cross-faded-data-driven';
-            var wasDataDriven = transitionable.value.isDataDriven();
-            var oldValue = transitionable.value;
-
-            this._transitionablePaint.setValue(name, value);
-            this._handleSpecialPaintPropertyUpdate(name);
-
-            var newValue = this._transitionablePaint._values[name].value;
-            var isDataDriven = newValue.isDataDriven();
-
-            // if a cross-faded value is changed, we need to make sure the new icons get added to each tile's iconAtlas
-            // so a call to _updateLayer is necessary, and we return true from this function so it gets called in
-            // Style#setPaintProperty
-            return isDataDriven || wasDataDriven || isCrossFadedProperty || this._handleOverridablePaintPropertyUpdate(name, oldValue, newValue);
-        }
-    };
-
-    StyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate(_) {
-        // No-op; can be overridden by derived classes.
-    };
-
-    // eslint-disable-next-line no-unused-vars
-    StyleLayer.prototype._handleOverridablePaintPropertyUpdate = function _handleOverridablePaintPropertyUpdate(name, oldValue, newValue) {
-        // No-op; can be overridden by derived classes.
-        return false;
-    };
-
-    StyleLayer.prototype.isHidden = function isHidden(zoom) {
-        if (this.minzoom && zoom < this.minzoom) {
-            return true;
-        }
-        if (this.maxzoom && zoom >= this.maxzoom) {
-            return true;
-        }
-        return this.visibility === 'none';
-    };
-
-    StyleLayer.prototype.updateTransitions = function updateTransitions(parameters) {
-        this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint);
-    };
-
-    StyleLayer.prototype.hasTransition = function hasTransition() {
-        return this._transitioningPaint.hasTransition();
-    };
-
-    StyleLayer.prototype.recalculate = function recalculate(parameters, availableImages) {
-        if (parameters.getCrossfadeParameters) {
-            this._crossfadeParameters = parameters.getCrossfadeParameters();
-        }
-
-        if (this._unevaluatedLayout) {
-            (this).layout = this._unevaluatedLayout.possiblyEvaluate(parameters, availableImages);
-        }
-
-        (this).paint = this._transitioningPaint.possiblyEvaluate(parameters, availableImages);
-    };
-
-    StyleLayer.prototype.serialize = function serialize() {
-        var output = {
-            'id': this.id,
-            'type': this.type,
-            'source': this.source,
-            'source-layer': this.sourceLayer,
-            'metadata': this.metadata,
-            'minzoom': this.minzoom,
-            'maxzoom': this.maxzoom,
-            'filter': this.filter,
-            'layout': this._unevaluatedLayout && this._unevaluatedLayout.serialize(),
-            'paint': this._transitionablePaint && this._transitionablePaint.serialize()
-        };
-
-        if (this.visibility) {
-            output.layout = output.layout || {};
-            output.layout.visibility = this.visibility;
-        }
-
-        return Util.filterObject(output, function (value, key) {
-            return value !== undefined && !(key === 'layout' && !Object.keys(value).length) && !(key === 'paint' && !Object.keys(value).length);
-        });
-    };
-
-    StyleLayer.prototype._validate = function _validate(validate, key, name, value, options) {
-        return true;
-    //        if (options === void 0) options = {};
-    //
-    //        if (options && options.validate === false) {
-    //            return false;
-    //        }
-    //        return emitValidationErrors(this, validate.call(validateStyle, {
-    //            key: key,
-    //            layerType: this.type,
-    //            objectKey: name,
-    //            value: value,
-    //            styleSpec: spec,
-    //            // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407
-    //            style: {glyphs: true, sprite: true}
-    //        }));
-    };
-
-    StyleLayer.prototype.is3D = function is3D() {
-        return false;
-    };
-
-    StyleLayer.prototype.isTileClipped = function isTileClipped() {
-        return false;
-    };
-
-    StyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass() {
-        return false;
-    };
-
-    StyleLayer.prototype.resize = function resize() {
-        // noop
-    };
-
-    StyleLayer.prototype.isStateDependent = function isStateDependent() {
-        return true;
-    //        for (var property in (this     ).paint._values) {
-    //            var value = (this     ).paint.get(property);
-    //            if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) {
-    //                continue;
-    //            }
-    //
-    //            if ((value.value.kind === 'source' || value.value.kind === 'composite') &&
-    //                value.value.isStateDependent) {
-    //                return true;
-    //            }
-    //        }
-    //        return false;
-    };
-
-    var $version = 8;
-    var $root = {
-        version: {
-            required: true,
-            type: "enum",
-            values: [
-                8
-            ]
-        },
-        name: {
-            type: "string"
-        },
-        metadata: {
-            type: "*"
-        },
-        center: {
-            type: "array",
-            value: "number"
-        },
-        zoom: {
-            type: "number"
-        },
-        bearing: {
-            type: "number",
-            "default": 0,
-            period: 360,
-            units: "degrees"
-        },
-        pitch: {
-            type: "number",
-            "default": 0,
-            units: "degrees"
-        },
-        light: {
-            type: "light"
-        },
-        sources: {
-            required: true,
-            type: "sources"
-        },
-        sprite: {
-            type: "string"
-        },
-        glyphs: {
-            type: "string"
-        },
-        transition: {
-            type: "transition"
-        },
-        layers: {
-            required: true,
-            type: "array",
-            value: "layer"
-        }
-    };
-    var sources = {
-        "*": {
-            type: "source"
-        }
-    };
-    var source = [
-        "source_vector",
-        "source_raster",
-        "source_raster_dem",
-        "source_geojson",
-        "source_video",
-        "source_image"
-    ];
-    var source_vector = {
-        type: {
-            required: true,
-            type: "enum",
-            values: {
-                vector: {
-                }
-            }
-        },
-        url: {
-            type: "string"
-        },
-        tiles: {
-            type: "array",
-            value: "string"
-        },
-        bounds: {
-            type: "array",
-            value: "number",
-            length: 4,
-            "default": [
-                -180,
-                -85.051129,
-                180,
-                85.051129
-            ]
-        },
-        scheme: {
-            type: "enum",
-            values: {
-                xyz: {
-                },
-                tms: {
-                }
-            },
-            "default": "xyz"
-        },
-        minzoom: {
-            type: "number",
-            "default": 0
-        },
-        maxzoom: {
-            type: "number",
-            "default": 22
-        },
-        attribution: {
-            type: "string"
-        },
-        "*": {
-            type: "*"
-        }
-    };
-    var source_raster = {
-        type: {
-            required: true,
-            type: "enum",
-            values: {
-                raster: {
-                }
-            }
-        },
-        url: {
-            type: "string"
-        },
-        tiles: {
-            type: "array",
-            value: "string"
-        },
-        bounds: {
-            type: "array",
-            value: "number",
-            length: 4,
-            "default": [
-                -180,
-                -85.051129,
-                180,
-                85.051129
-            ]
-        },
-        minzoom: {
-            type: "number",
-            "default": 0
-        },
-        maxzoom: {
-            type: "number",
-            "default": 22
-        },
-        tileSize: {
-            type: "number",
-            "default": 512,
-            units: "pixels"
-        },
-        scheme: {
-            type: "enum",
-            values: {
-                xyz: {
-                },
-                tms: {
-                }
-            },
-            "default": "xyz"
-        },
-        attribution: {
-            type: "string"
-        },
-        "*": {
-            type: "*"
-        }
-    };
-    var source_raster_dem = {
-        type: {
-            required: true,
-            type: "enum",
-            values: {
-                "raster-dem": {
-                }
-            }
-        },
-        url: {
-            type: "string"
-        },
-        tiles: {
-            type: "array",
-            value: "string"
-        },
-        bounds: {
-            type: "array",
-            value: "number",
-            length: 4,
-            "default": [
-                -180,
-                -85.051129,
-                180,
-                85.051129
-            ]
-        },
-        minzoom: {
-            type: "number",
-            "default": 0
-        },
-        maxzoom: {
-            type: "number",
-            "default": 22
-        },
-        tileSize: {
-            type: "number",
-            "default": 512,
-            units: "pixels"
-        },
-        attribution: {
-            type: "string"
-        },
-        encoding: {
-            type: "enum",
-            values: {
-                terrarium: {
-                },
-                mapbox: {
-                }
-            },
-            "default": "mapbox"
-        },
-        "*": {
-            type: "*"
-        }
-    };
-    var source_geojson = {
-        type: {
-            required: true,
-            type: "enum",
-            values: {
-                geojson: {
-                }
-            }
-        },
-        data: {
-            type: "*"
-        },
-        maxzoom: {
-            type: "number",
-            "default": 18
-        },
-        attribution: {
-            type: "string"
-        },
-        buffer: {
-            type: "number",
-            "default": 128,
-            maximum: 512,
-            minimum: 0
-        },
-        tolerance: {
-            type: "number",
-            "default": 0.375
-        },
-        cluster: {
-            type: "boolean",
-            "default": false
-        },
-        clusterRadius: {
-            type: "number",
-            "default": 50,
-            minimum: 0
-        },
-        clusterMaxZoom: {
-            type: "number"
-        },
-        clusterProperties: {
-            type: "*"
-        },
-        lineMetrics: {
-            type: "boolean",
-            "default": false
-        },
-        generateId: {
-            type: "boolean",
-            "default": false
-        }
-    };
-    var source_video = {
-        type: {
-            required: true,
-            type: "enum",
-            values: {
-                video: {
-                }
-            }
-        },
-        urls: {
-            required: true,
-            type: "array",
-            value: "string"
-        },
-        coordinates: {
-            required: true,
-            type: "array",
-            length: 4,
-            value: {
-                type: "array",
-                length: 2,
-                value: "number"
-            }
-        }
-    };
-    var source_image = {
-        type: {
-            required: true,
-            type: "enum",
-            values: {
-                image: {
-                }
-            }
-        },
-        url: {
-            required: true,
-            type: "string"
-        },
-        coordinates: {
-            required: true,
-            type: "array",
-            length: 4,
-            value: {
-                type: "array",
-                length: 2,
-                value: "number"
-            }
-        }
-    };
-    var layer = {
-        id: {
-            type: "string",
-            required: true
-        },
-        type: {
-            type: "enum",
-            values: {
-                fill: {
-                },
-                line: {
-                },
-                symbol: {
-                },
-                circle: {
-                },
-                heatmap: {
-                },
-                "fill-extrusion": {
-                },
-                raster: {
-                },
-                hillshade: {
-                },
-                background: {
-                }
-            },
-            required: true
-        },
-        metadata: {
-            type: "*"
-        },
-        source: {
-            type: "string"
-        },
-        "source-layer": {
-            type: "string"
-        },
-        minzoom: {
-            type: "number",
-            minimum: 0,
-            maximum: 24
-        },
-        maxzoom: {
-            type: "number",
-            minimum: 0,
-            maximum: 24
-        },
-        filter: {
-            type: "filter"
-        },
-        layout: {
-            type: "layout"
-        },
-        paint: {
-            type: "paint"
-        }
-    };
-    var layout = [
-        "layout_fill",
-        "layout_line",
-        "layout_circle",
-        "layout_heatmap",
-        "layout_fill-extrusion",
-        "layout_symbol",
-        "layout_raster",
-        "layout_hillshade",
-        "layout_background"
-    ];
-    var layout_background = {
-        visibility: {
-            type: "enum",
-            values: {
-                visible: {
-                },
-                none: {
-                }
-            },
-            "default": "visible",
-            "property-type": "constant"
-        }
-    };
-    var layout_fill = {
-        "fill-sort-key": {
-            type: "number",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        visibility: {
-            type: "enum",
-            values: {
-                visible: {
-                },
-                none: {
-                }
-            },
-            "default": "visible",
-            "property-type": "constant"
-        }
-    };
-    var layout_circle = {
-        "circle-sort-key": {
-            type: "number",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        visibility: {
-            type: "enum",
-            values: {
-                visible: {
-                },
-                none: {
-                }
-            },
-            "default": "visible",
-            "property-type": "constant"
-        }
-    };
-    var layout_heatmap = {
-        visibility: {
-            type: "enum",
-            values: {
-                visible: {
-                },
-                none: {
-                }
-            },
-            "default": "visible",
-            "property-type": "constant"
-        }
-    };
-    var layout_line = {
-        "line-cap": {
-            type: "enum",
-            values: {
-                butt: {
-                },
-                round: {
-                },
-                square: {
-                }
-            },
-            "default": "butt",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "line-join": {
-            type: "enum",
-            values: {
-                bevel: {
-                },
-                round: {
-                },
-                miter: {
-                }
-            },
-            "default": "miter",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "line-miter-limit": {
-            type: "number",
-            "default": 2,
-            requires: [
-                {
-                    "line-join": "miter"
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "line-round-limit": {
-            type: "number",
-            "default": 1.05,
-            requires: [
-                {
-                    "line-join": "round"
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "line-sort-key": {
-            type: "number",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        visibility: {
-            type: "enum",
-            values: {
-                visible: {
-                },
-                none: {
-                }
-            },
-            "default": "visible",
-            "property-type": "constant"
-        }
-    };
-    var layout_symbol = {
-        "symbol-placement": {
-            type: "enum",
-            values: {
-                point: {
-                },
-                line: {
-                },
-                "line-center": {
-                }
-            },
-            "default": "point",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "symbol-spacing": {
-            type: "number",
-            "default": 250,
-            minimum: 1,
-            units: "pixels",
-            requires: [
-                {
-                    "symbol-placement": "line"
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "symbol-avoid-edges": {
-            type: "boolean",
-            "default": false,
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "symbol-sort-key": {
-            type: "number",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "symbol-z-order": {
-            type: "enum",
-            values: {
-                auto: {
-                },
-                "viewport-y": {
-                },
-                source: {
-                }
-            },
-            "default": "auto",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-allow-overlap": {
-            type: "boolean",
-            "default": false,
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-ignore-placement": {
-            type: "boolean",
-            "default": false,
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-optional": {
-            type: "boolean",
-            "default": false,
-            requires: [
-                "icon-image",
-                "text-field"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-rotation-alignment": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                },
-                auto: {
-                }
-            },
-            "default": "auto",
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-size": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            units: "factor of the original icon size",
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-text-fit": {
-            type: "enum",
-            values: {
-                none: {
-                },
-                width: {
-                },
-                height: {
-                },
-                both: {
-                }
-            },
-            "default": "none",
-            requires: [
-                "icon-image",
-                "text-field"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-text-fit-padding": {
-            type: "array",
-            value: "number",
-            length: 4,
-            "default": [
-                0,
-                0,
-                0,
-                0
-            ],
-            units: "pixels",
-            requires: [
-                "icon-image",
-                "text-field",
-                {
-                    "icon-text-fit": [
-                        "both",
-                        "width",
-                        "height"
-                    ]
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-image": {
-            type: "resolvedImage",
-            tokens: true,
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-rotate": {
-            type: "number",
-            "default": 0,
-            period: 360,
-            units: "degrees",
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-padding": {
-            type: "number",
-            "default": 2,
-            minimum: 0,
-            units: "pixels",
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-keep-upright": {
-            type: "boolean",
-            "default": false,
-            requires: [
-                "icon-image",
-                {
-                    "icon-rotation-alignment": "map"
-                },
-                {
-                    "symbol-placement": [
-                        "line",
-                        "line-center"
-                    ]
-                }
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-offset": {
-            type: "array",
-            value: "number",
-            length: 2,
-            "default": [
-                0,
-                0
-            ],
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-anchor": {
-            type: "enum",
-            values: {
-                center: {
-                },
-                left: {
-                },
-                right: {
-                },
-                top: {
-                },
-                bottom: {
-                },
-                "top-left": {
-                },
-                "top-right": {
-                },
-                "bottom-left": {
-                },
-                "bottom-right": {
-                }
-            },
-            "default": "center",
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-pitch-alignment": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                },
-                auto: {
-                }
-            },
-            "default": "auto",
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-pitch-alignment": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                },
-                auto: {
-                }
-            },
-            "default": "auto",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-rotation-alignment": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                },
-                auto: {
-                }
-            },
-            "default": "auto",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-field": {
-            type: "formatted",
-            "default": "",
-            tokens: true,
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-font": {
-            type: "array",
-            value: "string",
-            "default": [
-                "Open Sans Regular",
-                "Arial Unicode MS Regular"
-            ],
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-size": {
-            type: "number",
-            "default": 16,
-            minimum: 0,
-            units: "pixels",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-max-width": {
-            type: "number",
-            "default": 10,
-            minimum: 0,
-            units: "ems",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-line-height": {
-            type: "number",
-            "default": 1.2,
-            units: "ems",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-letter-spacing": {
-            type: "number",
-            "default": 0,
-            units: "ems",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-justify": {
-            type: "enum",
-            values: {
-                auto: {
-                },
-                left: {
-                },
-                center: {
-                },
-                right: {
-                }
-            },
-            "default": "center",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-radial-offset": {
-            type: "number",
-            units: "ems",
-            "default": 0,
-            requires: [
-                "text-field"
-            ],
-            "property-type": "data-driven",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            }
-        },
-        "text-variable-anchor": {
-            type: "array",
-            value: "enum",
-            values: {
-                center: {
-                },
-                left: {
-                },
-                right: {
-                },
-                top: {
-                },
-                bottom: {
-                },
-                "top-left": {
-                },
-                "top-right": {
-                },
-                "bottom-left": {
-                },
-                "bottom-right": {
-                }
-            },
-            requires: [
-                "text-field",
-                {
-                    "symbol-placement": [
-                        "point"
-                    ]
-                }
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-anchor": {
-            type: "enum",
-            values: {
-                center: {
-                },
-                left: {
-                },
-                right: {
-                },
-                top: {
-                },
-                bottom: {
-                },
-                "top-left": {
-                },
-                "top-right": {
-                },
-                "bottom-left": {
-                },
-                "bottom-right": {
-                }
-            },
-            "default": "center",
-            requires: [
-                "text-field",
-                {
-                    "!": "text-variable-anchor"
-                }
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-max-angle": {
-            type: "number",
-            "default": 45,
-            units: "degrees",
-            requires: [
-                "text-field",
-                {
-                    "symbol-placement": [
-                        "line",
-                        "line-center"
-                    ]
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-writing-mode": {
-            type: "array",
-            value: "enum",
-            values: {
-                horizontal: {
-                },
-                vertical: {
-                }
-            },
-            requires: [
-                "text-field",
-                {
-                    "symbol-placement": [
-                        "point"
-                    ]
-                }
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-rotate": {
-            type: "number",
-            "default": 0,
-            period: 360,
-            units: "degrees",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-padding": {
-            type: "number",
-            "default": 2,
-            minimum: 0,
-            units: "pixels",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-keep-upright": {
-            type: "boolean",
-            "default": true,
-            requires: [
-                "text-field",
-                {
-                    "text-rotation-alignment": "map"
-                },
-                {
-                    "symbol-placement": [
-                        "line",
-                        "line-center"
-                    ]
-                }
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-transform": {
-            type: "enum",
-            values: {
-                none: {
-                },
-                uppercase: {
-                },
-                lowercase: {
-                }
-            },
-            "default": "none",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-offset": {
-            type: "array",
-            value: "number",
-            units: "ems",
-            length: 2,
-            "default": [
-                0,
-                0
-            ],
-            requires: [
-                "text-field",
-                {
-                    "!": "text-radial-offset"
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-allow-overlap": {
-            type: "boolean",
-            "default": false,
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-ignore-placement": {
-            type: "boolean",
-            "default": false,
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-optional": {
-            type: "boolean",
-            "default": false,
-            requires: [
-                "text-field",
-                "icon-image"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        visibility: {
-            type: "enum",
-            values: {
-                visible: {
-                },
-                none: {
-                }
-            },
-            "default": "visible",
-            "property-type": "constant"
-        }
-    };
-    var layout_raster = {
-        visibility: {
-            type: "enum",
-            values: {
-                visible: {
-                },
-                none: {
-                }
-            },
-            "default": "visible",
-            "property-type": "constant"
-        }
-    };
-    var layout_hillshade = {
-        visibility: {
-            type: "enum",
-            values: {
-                visible: {
-                },
-                none: {
-                }
-            },
-            "default": "visible",
-            "property-type": "constant"
-        }
-    };
-    var filter = {
-        type: "array",
-        value: "*"
-    };
-    var filter_operator = {
-        type: "enum",
-        values: {
-            "==": {
-            },
-            "!=": {
-            },
-            ">": {
-            },
-            ">=": {
-            },
-            "<": {
-            },
-            "<=": {
-            },
-            "in": {
-            },
-            "!in": {
-            },
-            all: {
-            },
-            any: {
-            },
-            none: {
-            },
-            has: {
-            },
-            "!has": {
-            }
-        }
-    };
-    var geometry_type = {
-        type: "enum",
-        values: {
-            Point: {
-            },
-            LineString: {
-            },
-            Polygon: {
-            }
-        }
-    };
-    var function_stop = {
-        type: "array",
-        minimum: 0,
-        maximum: 24,
-        value: [
-            "number",
-            "color"
-        ],
-        length: 2
-    };
-    var expression = {
-        type: "array",
-        value: "*",
-        minimum: 1
-    };
-    var expression_name = {
-        type: "enum",
-        values: {
-            "let": {
-                group: "Variable binding"
-            },
-            "var": {
-                group: "Variable binding"
-            },
-            literal: {
-                group: "Types"
-            },
-            array: {
-                group: "Types"
-            },
-            at: {
-                group: "Lookup"
-            },
-            "in": {
-                group: "Lookup"
-            },
-            "case": {
-                group: "Decision"
-            },
-            match: {
-                group: "Decision"
-            },
-            coalesce: {
-                group: "Decision"
-            },
-            step: {
-                group: "Ramps, scales, curves"
-            },
-            interpolate: {
-                group: "Ramps, scales, curves"
-            },
-            "interpolate-hcl": {
-                group: "Ramps, scales, curves"
-            },
-            "interpolate-lab": {
-                group: "Ramps, scales, curves"
-            },
-            ln2: {
-                group: "Math"
-            },
-            pi: {
-                group: "Math"
-            },
-            e: {
-                group: "Math"
-            },
-            "typeof": {
-                group: "Types"
-            },
-            string: {
-                group: "Types"
-            },
-            number: {
-                group: "Types"
-            },
-            boolean: {
-                group: "Types"
-            },
-            object: {
-                group: "Types"
-            },
-            collator: {
-                group: "Types"
-            },
-            format: {
-                group: "Types"
-            },
-            image: {
-                group: "Types"
-            },
-            "number-format": {
-                group: "Types"
-            },
-            "to-string": {
-                group: "Types"
-            },
-            "to-number": {
-                group: "Types"
-            },
-            "to-boolean": {
-                group: "Types"
-            },
-            "to-rgba": {
-                group: "Color"
-            },
-            "to-color": {
-                group: "Types"
-            },
-            rgb: {
-                group: "Color"
-            },
-            rgba: {
-                group: "Color"
-            },
-            get: {
-                group: "Lookup"
-            },
-            has: {
-                group: "Lookup"
-            },
-            length: {
-                group: "Lookup"
-            },
-            properties: {
-                group: "Feature data"
-            },
-            "feature-state": {
-                group: "Feature data"
-            },
-            "geometry-type": {
-                group: "Feature data"
-            },
-            id: {
-                group: "Feature data"
-            },
-            zoom: {
-                group: "Zoom"
-            },
-            "heatmap-density": {
-                group: "Heatmap"
-            },
-            "line-progress": {
-                group: "Feature data"
-            },
-            accumulated: {
-                group: "Feature data"
-            },
-            "+": {
-                group: "Math"
-            },
-            "*": {
-                group: "Math"
-            },
-            "-": {
-                group: "Math"
-            },
-            "/": {
-                group: "Math"
-            },
-            "%": {
-                group: "Math"
-            },
-            "^": {
-                group: "Math"
-            },
-            sqrt: {
-                group: "Math"
-            },
-            log10: {
-                group: "Math"
-            },
-            ln: {
-                group: "Math"
-            },
-            log2: {
-                group: "Math"
-            },
-            sin: {
-                group: "Math"
-            },
-            cos: {
-                group: "Math"
-            },
-            tan: {
-                group: "Math"
-            },
-            asin: {
-                group: "Math"
-            },
-            acos: {
-                group: "Math"
-            },
-            atan: {
-                group: "Math"
-            },
-            min: {
-                group: "Math"
-            },
-            max: {
-                group: "Math"
-            },
-            round: {
-                group: "Math"
-            },
-            abs: {
-                group: "Math"
-            },
-            ceil: {
-                group: "Math"
-            },
-            floor: {
-                group: "Math"
-            },
-            "==": {
-                group: "Decision"
-            },
-            "!=": {
-                group: "Decision"
-            },
-            ">": {
-                group: "Decision"
-            },
-            "<": {
-                group: "Decision"
-            },
-            ">=": {
-                group: "Decision"
-            },
-            "<=": {
-                group: "Decision"
-            },
-            all: {
-                group: "Decision"
-            },
-            any: {
-                group: "Decision"
-            },
-            "!": {
-                group: "Decision"
-            },
-            "is-supported-script": {
-                group: "String"
-            },
-            upcase: {
-                group: "String"
-            },
-            downcase: {
-                group: "String"
-            },
-            concat: {
-                group: "String"
-            },
-            "resolved-locale": {
-                group: "String"
-            }
-        }
-    };
-    var light = {
-        anchor: {
-            type: "enum",
-            "default": "viewport",
-            values: {
-                map: {
-                },
-                viewport: {
-                }
-            },
-            "property-type": "data-constant",
-            transition: false,
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            }
-        },
-        position: {
-            type: "array",
-            "default": [
-                1.15,
-                210,
-                30
-            ],
-            length: 3,
-            value: "number",
-            "property-type": "data-constant",
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            }
-        },
-        color: {
-            type: "color",
-            "property-type": "data-constant",
-            "default": "#ffffff",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            transition: true
-        },
-        intensity: {
-            type: "number",
-            "property-type": "data-constant",
-            "default": 0.5,
-            minimum: 0,
-            maximum: 1,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            transition: true
-        }
-    };
-    var paint = [
-        "paint_fill",
-        "paint_line",
-        "paint_circle",
-        "paint_heatmap",
-        "paint_fill-extrusion",
-        "paint_symbol",
-        "paint_raster",
-        "paint_hillshade",
-        "paint_background"
-    ];
-    var paint_fill = {
-        "fill-antialias": {
-            type: "boolean",
-            "default": true,
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "fill-opacity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "fill-color": {
-            type: "color",
-            "default": "#000000",
-            transition: true,
-            requires: [
-                {
-                    "!": "fill-pattern"
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "fill-outline-color": {
-            type: "color",
-            transition: true,
-            requires: [
-                {
-                    "!": "fill-pattern"
-                },
-                {
-                    "fill-antialias": true
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "fill-translate": {
-            type: "array",
-            value: "number",
-            length: 2,
-            "default": [
-                0,
-                0
-            ],
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "fill-translate-anchor": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                }
-            },
-            "default": "map",
-            requires: [
-                "fill-translate"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "fill-pattern": {
-            type: "resolvedImage",
-            transition: true,
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "cross-faded-data-driven"
-        }
-    };
-    var paint_line = {
-        "line-opacity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "line-color": {
-            type: "color",
-            "default": "#000000",
-            transition: true,
-            requires: [
-                {
-                    "!": "line-pattern"
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "line-translate": {
-            type: "array",
-            value: "number",
-            length: 2,
-            "default": [
-                0,
-                0
-            ],
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "line-translate-anchor": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                }
-            },
-            "default": "map",
-            requires: [
-                "line-translate"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "line-width": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "line-gap-width": {
-            type: "number",
-            "default": 0,
-            minimum: 0,
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "line-offset": {
-            type: "number",
-            "default": 0,
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "line-blur": {
-            type: "number",
-            "default": 0,
-            minimum: 0,
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "line-dasharray": {
-            type: "array",
-            value: "number",
-            minimum: 0,
-            transition: true,
-            units: "line widths",
-            requires: [
-                {
-                    "!": "line-pattern"
-                }
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "cross-faded"
-        },
-        "line-pattern": {
-            type: "resolvedImage",
-            transition: true,
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom",
-                    "feature"
-                ]
-            },
-            "property-type": "cross-faded-data-driven"
-        },
-        "line-gradient": {
-            type: "color",
-            transition: false,
-            requires: [
-                {
-                    "!": "line-dasharray"
-                },
-                {
-                    "!": "line-pattern"
-                },
-                {
-                    source: "geojson",
-                    has: {
-                        lineMetrics: true
-                    }
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "line-progress"
-                ]
-            },
-            "property-type": "color-ramp"
-        }
-    };
-    var paint_circle = {
-        "circle-radius": {
-            type: "number",
-            "default": 5,
-            minimum: 0,
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "circle-color": {
-            type: "color",
-            "default": "#000000",
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "circle-blur": {
-            type: "number",
-            "default": 0,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "circle-opacity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "circle-translate": {
-            type: "array",
-            value: "number",
-            length: 2,
-            "default": [
-                0,
-                0
-            ],
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "circle-translate-anchor": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                }
-            },
-            "default": "map",
-            requires: [
-                "circle-translate"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "circle-pitch-scale": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                }
-            },
-            "default": "map",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "circle-pitch-alignment": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                }
-            },
-            "default": "viewport",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "circle-stroke-width": {
-            type: "number",
-            "default": 0,
-            minimum: 0,
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "circle-stroke-color": {
-            type: "color",
-            "default": "#000000",
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "circle-stroke-opacity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        }
-    };
-    var paint_heatmap = {
-        "heatmap-radius": {
-            type: "number",
-            "default": 30,
-            minimum: 1,
-            transition: true,
-            units: "pixels",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "heatmap-weight": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            transition: false,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "heatmap-intensity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "heatmap-color": {
-            type: "color",
-            "default": [
-                "interpolate",
-                [
-                    "linear"
-                ],
-                [
-                    "heatmap-density"
-                ],
-                0,
-                "rgba(0, 0, 255, 0)",
-                0.1,
-                "royalblue",
-                0.3,
-                "cyan",
-                0.5,
-                "lime",
-                0.7,
-                "yellow",
-                1,
-                "red"
-            ],
-            transition: false,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "heatmap-density"
-                ]
-            },
-            "property-type": "color-ramp"
-        },
-        "heatmap-opacity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        }
-    };
-    var paint_symbol = {
-        "icon-opacity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-color": {
-            type: "color",
-            "default": "#000000",
-            transition: true,
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-halo-color": {
-            type: "color",
-            "default": "rgba(0, 0, 0, 0)",
-            transition: true,
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-halo-width": {
-            type: "number",
-            "default": 0,
-            minimum: 0,
-            transition: true,
-            units: "pixels",
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-halo-blur": {
-            type: "number",
-            "default": 0,
-            minimum: 0,
-            transition: true,
-            units: "pixels",
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "icon-translate": {
-            type: "array",
-            value: "number",
-            length: 2,
-            "default": [
-                0,
-                0
-            ],
-            transition: true,
-            units: "pixels",
-            requires: [
-                "icon-image"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "icon-translate-anchor": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                }
-            },
-            "default": "map",
-            requires: [
-                "icon-image",
-                "icon-translate"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-opacity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-color": {
-            type: "color",
-            "default": "#000000",
-            transition: true,
-            overridable: true,
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-halo-color": {
-            type: "color",
-            "default": "rgba(0, 0, 0, 0)",
-            transition: true,
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-halo-width": {
-            type: "number",
-            "default": 0,
-            minimum: 0,
-            transition: true,
-            units: "pixels",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-halo-blur": {
-            type: "number",
-            "default": 0,
-            minimum: 0,
-            transition: true,
-            units: "pixels",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom",
-                    "feature",
-                    "feature-state"
-                ]
-            },
-            "property-type": "data-driven"
-        },
-        "text-translate": {
-            type: "array",
-            value: "number",
-            length: 2,
-            "default": [
-                0,
-                0
-            ],
-            transition: true,
-            units: "pixels",
-            requires: [
-                "text-field"
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "text-translate-anchor": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                }
-            },
-            "default": "map",
-            requires: [
-                "text-field",
-                "text-translate"
-            ],
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        }
-    };
-    var paint_raster = {
-        "raster-opacity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "raster-hue-rotate": {
-            type: "number",
-            "default": 0,
-            period: 360,
-            transition: true,
-            units: "degrees",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "raster-brightness-min": {
-            type: "number",
-            "default": 0,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "raster-brightness-max": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "raster-saturation": {
-            type: "number",
-            "default": 0,
-            minimum: -1,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "raster-contrast": {
-            type: "number",
-            "default": 0,
-            minimum: -1,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "raster-resampling": {
-            type: "enum",
-            values: {
-                linear: {
-                },
-                nearest: {
-                }
-            },
-            "default": "linear",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "raster-fade-duration": {
-            type: "number",
-            "default": 300,
-            minimum: 0,
-            transition: false,
-            units: "milliseconds",
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        }
-    };
-    var paint_hillshade = {
-        "hillshade-illumination-direction": {
-            type: "number",
-            "default": 335,
-            minimum: 0,
-            maximum: 359,
-            transition: false,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "hillshade-illumination-anchor": {
-            type: "enum",
-            values: {
-                map: {
-                },
-                viewport: {
-                }
-            },
-            "default": "viewport",
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "hillshade-exaggeration": {
-            type: "number",
-            "default": 0.5,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "hillshade-shadow-color": {
-            type: "color",
-            "default": "#000000",
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "hillshade-highlight-color": {
-            type: "color",
-            "default": "#FFFFFF",
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "hillshade-accent-color": {
-            type: "color",
-            "default": "#000000",
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        }
-    };
-    var paint_background = {
-        "background-color": {
-            type: "color",
-            "default": "#000000",
-            transition: true,
-            requires: [
-                {
-                    "!": "background-pattern"
-                }
-            ],
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        },
-        "background-pattern": {
-            type: "resolvedImage",
-            transition: true,
-            expression: {
-                interpolated: false,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "cross-faded"
-        },
-        "background-opacity": {
-            type: "number",
-            "default": 1,
-            minimum: 0,
-            maximum: 1,
-            transition: true,
-            expression: {
-                interpolated: true,
-                parameters: [
-                    "zoom"
-                ]
-            },
-            "property-type": "data-constant"
-        }
-    };
-    var transition = {
-        duration: {
-            type: "number",
-            "default": 300,
-            minimum: 0,
-            units: "milliseconds"
-        },
-        delay: {
-            type: "number",
-            "default": 0,
-            minimum: 0,
-            units: "milliseconds"
-        }
-    };
-
-    var StyleSpec = {
-        $version: $version,
-        $root: $root,
-        sources: sources,
-        source: source,
-        source_vector: source_vector,
-        source_raster: source_raster,
-        source_raster_dem: source_raster_dem,
-        source_geojson: source_geojson,
-        source_video: source_video,
-        source_image: source_image,
-        layer: layer,
-        layout: layout,
-        layout_background: layout_background,
-        layout_fill: layout_fill,
-        layout_circle: layout_circle,
-        layout_heatmap: layout_heatmap,
-        "layout_fill-extrusion": {
-            visibility: {
-                type: "enum",
-                values: {
-                    visible: {
-                    },
-                    none: {
-                    }
-                },
-                "default": "visible",
-                "property-type": "constant"
-            }
-        },
-        layout_line: layout_line,
-        layout_symbol: layout_symbol,
-        layout_raster: layout_raster,
-        layout_hillshade: layout_hillshade,
-        filter: filter,
-        filter_operator: filter_operator,
-        geometry_type: geometry_type,
-        "function": {
-            expression: {
-                type: "expression"
-            },
-            stops: {
-                type: "array",
-                value: "function_stop"
-            },
-            base: {
-                type: "number",
-                "default": 1,
-                minimum: 0
-            },
-            property: {
-                type: "string",
-                "default": "$zoom"
-            },
-            type: {
-                type: "enum",
-                values: {
-                    identity: {
-                    },
-                    exponential: {
-                    },
-                    interval: {
-                    },
-                    categorical: {
-                    }
-                },
-                "default": "exponential"
-            },
-            colorSpace: {
-                type: "enum",
-                values: {
-                    rgb: {
-                    },
-                    lab: {
-                    },
-                    hcl: {
-                    }
-                },
-                "default": "rgb"
-            },
-            "default": {
-                type: "*",
-                required: false
-            }
-        },
-        function_stop: function_stop,
-        expression: expression,
-        expression_name: expression_name,
-        light: light,
-        paint: paint,
-        paint_fill: paint_fill,
-        "paint_fill-extrusion": {
-            "fill-extrusion-opacity": {
-                type: "number",
-                "default": 1,
-                minimum: 0,
-                maximum: 1,
-                transition: true,
-                expression: {
-                    interpolated: true,
-                    parameters: [
-                        "zoom"
-                    ]
-                },
-                "property-type": "data-constant"
-            },
-            "fill-extrusion-color": {
-                type: "color",
-                "default": "#000000",
-                transition: true,
-                requires: [
-                    {
-                        "!": "fill-extrusion-pattern"
-                    }
-                ],
-                expression: {
-                    interpolated: true,
-                    parameters: [
-                        "zoom",
-                        "feature",
-                        "feature-state"
-                    ]
-                },
-                "property-type": "data-driven"
-            },
-            "fill-extrusion-translate": {
-                type: "array",
-                value: "number",
-                length: 2,
-                "default": [
-                    0,
-                    0
-                ],
-                transition: true,
-                units: "pixels",
-                expression: {
-                    interpolated: true,
-                    parameters: [
-                        "zoom"
-                    ]
-                },
-                "property-type": "data-constant"
-            },
-            "fill-extrusion-translate-anchor": {
-                type: "enum",
-                values: {
-                    map: {
-                    },
-                    viewport: {
-                    }
-                },
-                "default": "map",
-                requires: [
-                    "fill-extrusion-translate"
-                ],
-                expression: {
-                    interpolated: false,
-                    parameters: [
-                        "zoom"
-                    ]
-                },
-                "property-type": "data-constant"
-            },
-            "fill-extrusion-pattern": {
-                type: "resolvedImage",
-                transition: true,
-                expression: {
-                    interpolated: false,
-                    parameters: [
-                        "zoom",
-                        "feature"
-                    ]
-                },
-                "property-type": "cross-faded-data-driven"
-            },
-            "fill-extrusion-height": {
-                type: "number",
-                "default": 0,
-                minimum: 0,
-                units: "meters",
-                transition: true,
-                expression: {
-                    interpolated: true,
-                    parameters: [
-                        "zoom",
-                        "feature",
-                        "feature-state"
-                    ]
-                },
-                "property-type": "data-driven"
-            },
-            "fill-extrusion-base": {
-                type: "number",
-                "default": 0,
-                minimum: 0,
-                units: "meters",
-                transition: true,
-                requires: [
-                    "fill-extrusion-height"
-                ],
-                expression: {
-                    interpolated: true,
-                    parameters: [
-                        "zoom",
-                        "feature",
-                        "feature-state"
-                    ]
-                },
-                "property-type": "data-driven"
-            },
-            "fill-extrusion-vertical-gradient": {
-                type: "boolean",
-                "default": true,
-                transition: false,
-                expression: {
-                    interpolated: false,
-                    parameters: [
-                        "zoom"
-                    ]
-                },
-                "property-type": "data-constant"
-            }
-        },
-        paint_line: paint_line,
-        paint_circle: paint_circle,
-        paint_heatmap: paint_heatmap,
-        paint_symbol: paint_symbol,
-        paint_raster: paint_raster,
-        paint_hillshade: paint_hillshade,
-        paint_background: paint_background,
-        transition: transition,
-        "property-type": {
-            "data-driven": {
-                type: "property-type"
-            },
-            "cross-faded": {
-                type: "property-type"
-            },
-            "cross-faded-data-driven": {
-                type: "property-type"
-            },
-            "color-ramp": {
-                type: "property-type"
-            },
-            "data-constant": {
-                type: "property-type"
-            },
-            constant: {
-                type: "property-type"
-            }
-        }
-    };
-
-    function IntersectionTest() {
-    }
-
-    IntersectionTest.polygonIntersectsPolygon = function (polygonA, polygonB) {
-        for (var i = 0; i < polygonA.length; i++) {
-            if (polygonContainsPoint(polygonB, polygonA[i])) {
-                return true;
-            }
-        }
-
-        for (var i$1 = 0; i$1 < polygonB.length; i$1++) {
-            if (polygonContainsPoint(polygonA, polygonB[i$1])) {
-                return true;
-            }
-        }
-
-        if (lineIntersectsLine(polygonA, polygonB)) {
-            return true;
-        }
-
-        return false;
-    };
-
-    IntersectionTest.polygonIntersectsBufferedPoint = function (polygon, point, radius) {
-        if (polygonContainsPoint(polygon, point)) {
-            return true;
-        }
-        if (pointIntersectsBufferedLine(point, polygon, radius)) {
-            return true;
-        }
-        return false;
-    };
-
-    IntersectionTest.polygonIntersectsMultiPolygon = function (polygon, multiPolygon) {
-        if (polygon.length === 1) {
-            return multiPolygonContainsPoint(multiPolygon, polygon[0]);
-        }
-
-        for (var m = 0; m < multiPolygon.length; m++) {
-            var ring = multiPolygon[m];
-            for (var n = 0; n < ring.length; n++) {
-                if (polygonContainsPoint(polygon, ring[n])) {
-                    return true;
-                }
-            }
-        }
-
-        for (var i = 0; i < polygon.length; i++) {
-            if (multiPolygonContainsPoint(multiPolygon, polygon[i])) {
-                return true;
-            }
-        }
-
-        for (var k = 0; k < multiPolygon.length; k++) {
-            if (lineIntersectsLine(polygon, multiPolygon[k])) {
-                return true;
-            }
-        }
-
-        return false;
-    };
-
-    IntersectionTest.polygonIntersectsBufferedMultiLine = function (polygon, multiLine, radius) {
-        for (var i = 0; i < multiLine.length; i++) {
-            var line = multiLine[i];
-
-            if (polygon.length >= 3) {
-                for (var k = 0; k < line.length; k++) {
-                    if (polygonContainsPoint(polygon, line[k])) {
-                        return true;
-                    }
-                }
-            }
-
-            if (lineIntersectsBufferedLine(polygon, line, radius)) {
-                return true;
-            }
-        }
-        return false;
-    };
-
-    function lineIntersectsBufferedLine(lineA, lineB, radius) {
-
-        if (lineA.length > 1) {
-            if (lineIntersectsLine(lineA, lineB)) {
-                return true;
-            }
-
-            // Check whether any point in either line is within radius of the other line
-            for (var j = 0; j < lineB.length; j++) {
-                if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) {
-                    return true;
-                }
-            }
-        }
-
-        for (var k = 0; k < lineA.length; k++) {
-            if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    function lineIntersectsLine(lineA, lineB) {
-        if (lineA.length === 0 || lineB.length === 0) {
-            return false;
-        }
-        for (var i = 0; i < lineA.length - 1; i++) {
-            var a0 = lineA[i];
-            var a1 = lineA[i + 1];
-            for (var j = 0; j < lineB.length - 1; j++) {
-                var b0 = lineB[j];
-                var b1 = lineB[j + 1];
-                if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    function lineSegmentIntersectsLineSegment(a0, a1, b0, b1) {
-        return Util.isCounterClockwise(a0, b0, b1) !== Util.isCounterClockwise(a1, b0, b1) &&
-            Util.isCounterClockwise(a0, a1, b0) !== Util.isCounterClockwise(a0, a1, b1);
-    }
-
-    function pointIntersectsBufferedLine(p, line, radius) {
-        var radiusSquared = radius * radius;
-
-        if (line.length === 1) {
-            return p.distSqr(line[0]) < radiusSquared;
-        }
-
-        for (var i = 1; i < line.length; i++) {
-            // Find line segments that have a distance <= radius^2 to p
-            // In that case, we treat the line as "containing point p".
-            var v = line[i - 1], w = line[i];
-            if (IntersectionTest.distToSegmentSquared(p, v, w) < radiusSquared) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Code from http://stackoverflow.com/a/1501725/331379.
-    IntersectionTest.distToSegmentSquared = function (p, v, w) {
-        var l2 = v.distSqr(w);
-        if (l2 === 0) {
-            return p.distSqr(v);
-        }
-        var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;
-        if (t < 0) {
-            return p.distSqr(v);
-        }
-        if (t > 1) {
-            return p.distSqr(w);
-        }
-        return p.distSqr(w.sub(v)._mult(t)._add(v));
-    };
-
-    // point in polygon ray casting algorithm
-    function multiPolygonContainsPoint(rings, p) {
-        var c = false,
-            ring, p1, p2;
-
-        for (var k = 0; k < rings.length; k++) {
-            ring = rings[k];
-            for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {
-                p1 = ring[i];
-                p2 = ring[j];
-                if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
-                    c = !c;
-                }
-            }
-        }
-        return c;
-    }
-
-    function polygonContainsPoint(ring, p) {
-        var c = false;
-        for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {
-            var p1 = ring[i];
-            var p2 = ring[j];
-            if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
-                c = !c;
-            }
-        }
-        return c;
-    }
-
-    var layout$2 = new Properties({
-        "circle-sort-key": new DataDrivenProperty(StyleSpec["layout_circle"]["circle-sort-key"])
-    });
-
-    var paint$1 = new Properties({
-        "circle-radius": new DataDrivenProperty(StyleSpec["paint_circle"]["circle-radius"]),
-        "circle-color": new DataDrivenProperty(StyleSpec["paint_circle"]["circle-color"]),
-        "circle-blur": new DataDrivenProperty(StyleSpec["paint_circle"]["circle-blur"]),
-        "circle-opacity": new DataDrivenProperty(StyleSpec["paint_circle"]["circle-opacity"]),
-        "circle-translate": new DataConstantProperty(StyleSpec["paint_circle"]["circle-translate"]),
-        "circle-translate-anchor": new DataConstantProperty(StyleSpec["paint_circle"]["circle-translate-anchor"]),
-        "circle-pitch-scale": new DataConstantProperty(StyleSpec["paint_circle"]["circle-pitch-scale"]),
-        "circle-pitch-alignment": new DataConstantProperty(StyleSpec["paint_circle"]["circle-pitch-alignment"]),
-        "circle-stroke-width": new DataDrivenProperty(StyleSpec["paint_circle"]["circle-stroke-width"]),
-        "circle-stroke-color": new DataDrivenProperty(StyleSpec["paint_circle"]["circle-stroke-color"]),
-        "circle-stroke-opacity": new DataDrivenProperty(StyleSpec["paint_circle"]["circle-stroke-opacity"])
-    });
-
-    // Note: without adding the explicit type annotation, Flow infers weaker types
-    // for these objects from their use in the constructor to StyleLayer, as
-    // {layout?: Properties<...>, paint: Properties<...>}
-    var properties = ({ paint: paint$1, layout: layout$2 });
-
-    var CircleStyleLayer = /*@__PURE__*/(function (StyleLayer) {
-        function CircleStyleLayer(layer) {
-            StyleLayer.call(this, layer, properties);
-        }
-
-        if (StyleLayer) CircleStyleLayer.__proto__ = StyleLayer;
-        CircleStyleLayer.prototype = Object.create(StyleLayer && StyleLayer.prototype);
-        CircleStyleLayer.prototype.constructor = CircleStyleLayer;
-
-        CircleStyleLayer.prototype.createBucket = function createBucket(parameters) {
-            return new CircleBucket(parameters);
-        };
-
-        CircleStyleLayer.prototype.queryRadius = function queryRadius(bucket) {
-            var circleBucket = (bucket     );
-            return QueryUtils.getMaximumPaintValue('circle-radius', this, circleBucket) +
-                QueryUtils.getMaximumPaintValue('circle-stroke-width', this, circleBucket) +
-                QueryUtils.translateDistance(this.paint.get('circle-translate'));
-        };
-
-        CircleStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits, pixelPosMatrix, adjustedScale) {
-            pixelPosMatrix = createMat4();
-            var translatedPolygon = QueryUtils.translate(queryGeometry,
-                this.paint.get('circle-translate'),
-                this.paint.get('circle-translate-anchor'),
-                0, pixelsToTileUnits);
-            var radius = this.paint.get('circle-radius').evaluate(feature, featureState);
-            var stroke = this.paint.get('circle-stroke-width').evaluate(feature, featureState);
-            var size = radius + stroke;
-
-            // For pitch-alignment: map, compare feature geometry to query geometry in the plane of the tile
-            // // Otherwise, compare geometry in the plane of the viewport
-            // // A circle with fixed scaling relative to the viewport gets larger in tile space as it moves into the distance
-            // // A circle with fixed scaling relative to the map gets smaller in viewport space as it moves into the distance
-            var alignWithMap = this.paint.get('circle-pitch-alignment') === 'map';
-            var transformedPolygon = alignWithMap ? translatedPolygon : projectQueryGeometry(translatedPolygon, pixelPosMatrix);
-            var transformedSize = alignWithMap ? size * pixelsToTileUnits : size;
-
-            for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) {
-                var ring = list$1[i$1];
-
-                for (var i = 0, list = ring; i < list.length; i += 1) {
-
-                    var point = list[i];
-
-                    var transformedPoint = alignWithMap ? point : projectPoint(point, pixelPosMatrix);
-
-                    var adjustedSize = transformedSize;
-                    var projectedCenter = transformMat4([], [point.x, point.y, 0, 1], pixelPosMatrix);
-                    if (this.paint.get('circle-pitch-scale') === 'viewport' && this.paint.get('circle-pitch-alignment') === 'map') ; else if (this.paint.get('circle-pitch-scale') === 'map' && this.paint.get('circle-pitch-alignment') === 'viewport') ;
-
-                    adjustedScale = when.defined(adjustedScale) ? adjustedScale : 10.0;
-                    if (IntersectionTest.polygonIntersectsBufferedPoint(transformedPolygon, transformedPoint, adjustedSize * adjustedScale)) {
-                        return true;
-                    }
-                }
-            }
-
-            return false;
-        };
-
-        return CircleStyleLayer;
-    }(StyleLayer));
-
-    function projectPoint(p, pixelPosMatrix) {
-        var point = transformMat4([], [p.x, p.y, 0, 1], pixelPosMatrix);
-        //return new pointGeometry(point[0] / point[3], point[1] / point[3]);
-        return new Point(point[0], point[1]);
-    }
-
-    function projectQueryGeometry(queryGeometry, pixelPosMatrix) {
-        return queryGeometry.map(function (p) {
-            return projectPoint(p, pixelPosMatrix);
-        });
-    }
-
-    function createMat4() {
-        var out = new Float32Array(16);
-        out[0] = 1;
-        out[5] = 1;
-        out[10] = 1;
-        out[15] = 1;
-        return out;
-    }
-
-    /**
-     * Transforms the vec3 with a mat4.
-     * 4th vector component is implicitly '1'
-     *
-     * @param {vec3} out the receiving vector
-     * @param {vec3} a the vector to transform
-     * @param {mat4} m matrix to transform with
-     * @returns {vec3} out
-     */
-    function transformMat4(out, a, m) {
-        var x = a[0],
-            y = a[1],
-            z = a[2];
-        var w = m[3] * x + m[7] * y + m[11] * z + m[15];
-        w = w || 1.0;
-        out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;
-        out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;
-        out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;
-        return out;
-    }
-
-    /**
-     * An implementation of `Property` for  data driven `line-pattern` which are transitioned by cross-fading
-     * rather than interpolation.
-     *
-     * @private
-     */
-
-    var CrossFadedDataDrivenProperty = /*@__PURE__*/(function (DataDrivenProperty) {
-        function CrossFadedDataDrivenProperty() {
-            DataDrivenProperty.apply(this, arguments);
-        }
-
-        if (DataDrivenProperty) CrossFadedDataDrivenProperty.__proto__ = DataDrivenProperty;
-        CrossFadedDataDrivenProperty.prototype = Object.create(DataDrivenProperty && DataDrivenProperty.prototype);
-        CrossFadedDataDrivenProperty.prototype.constructor = CrossFadedDataDrivenProperty;
-
-        CrossFadedDataDrivenProperty.prototype.possiblyEvaluate = function possiblyEvaluate(value, parameters, availableImages) {
-            if (value.value === undefined) {
-                return new PossiblyEvaluatedPropertyValue$1(this, {kind: 'constant', value: undefined}, parameters);
-            } else if (value.expression.kind === 'constant') {
-                var evaluatedValue = value.expression.evaluate(parameters, (null     ), {}, availableImages);
-                var isImageExpression = value.property.specification.type === 'resolvedImage';
-                var constantValue = isImageExpression && typeof evaluatedValue !== 'string' ? evaluatedValue.name : evaluatedValue;
-                var constant = this._calculate(constantValue, constantValue, constantValue, parameters);
-                return new PossiblyEvaluatedPropertyValue$1(this, {kind: 'constant', value: constant}, parameters);
-            } else if (value.expression.kind === 'camera') {
-                var cameraVal = this._calculate(
-                    value.expression.evaluate({zoom: parameters.zoom - 1.0}),
-                    value.expression.evaluate({zoom: parameters.zoom}),
-                    value.expression.evaluate({zoom: parameters.zoom + 1.0}),
-                    parameters);
-                return new PossiblyEvaluatedPropertyValue$1(this, {kind: 'constant', value: cameraVal}, parameters);
-            } else {
-                // source or composite expression
-                return new PossiblyEvaluatedPropertyValue$1(this, value.expression, parameters);
-            }
-        };
-
-        CrossFadedDataDrivenProperty.prototype.evaluate = function evaluate(value, globals, feature, featureState, availableImages) {
-            if (value.kind === 'source') {
-                var constant = value.evaluate(globals, feature, featureState, availableImages);
-                return this._calculate(constant, constant, constant, globals);
-            } else if (value.kind === 'composite') {
-                return this._calculate(
-                    value.evaluate({zoom: Math.floor(globals.zoom) - 1.0}, feature, featureState),
-                    value.evaluate({zoom: Math.floor(globals.zoom)}, feature, featureState),
-                    value.evaluate({zoom: Math.floor(globals.zoom) + 1.0}, feature, featureState),
-                    globals);
-            } else {
-                return value.value;
-            }
-        };
-
-        CrossFadedDataDrivenProperty.prototype._calculate = function _calculate(min, mid, max, parameters) {
-            var z = parameters.zoom;
-            return z > parameters.zoomHistory.lastIntegerZoom ? {from: min, to: mid} : {from: max, to: mid};
-        };
-
-        CrossFadedDataDrivenProperty.prototype.interpolate = function interpolate(a) {
-            return a;
-        };
-
-        return CrossFadedDataDrivenProperty;
-    }(DataDrivenProperty));
-
-    WebWorkerTransfer.register('DataDrivenProperty', DataDrivenProperty);
-
-    var layout$4 = new Properties({
-        "fill-sort-key": new DataDrivenProperty(StyleSpec["layout_fill"]["fill-sort-key"])
-    });
-
-    var paint$4 = new Properties({
-        "fill-antialias": new DataConstantProperty(StyleSpec["paint_fill"]["fill-antialias"]),
-        "fill-opacity": new DataDrivenProperty(StyleSpec["paint_fill"]["fill-opacity"]),
-        "fill-color": new DataDrivenProperty(StyleSpec["paint_fill"]["fill-color"]),
-        "fill-outline-color": new DataDrivenProperty(StyleSpec["paint_fill"]["fill-outline-color"]),
-        "fill-translate": new DataConstantProperty(StyleSpec["paint_fill"]["fill-translate"]),
-        "fill-translate-anchor": new DataConstantProperty(StyleSpec["paint_fill"]["fill-translate-anchor"]),
-        "fill-pattern": new CrossFadedDataDrivenProperty(StyleSpec["paint_fill"]["fill-pattern"]),
-    });
-
-    // Note: without adding the explicit type annotation, Flow infers weaker types
-    // for these objects from their use in the constructor to StyleLayer, as
-    // {layout?: Properties<...>, paint: Properties<...>}
-    var properties$3 = ({ paint: paint$4, layout: layout$4 }
-
-        );
-
-    var FillStyleLayer = /*@__PURE__*/(function (StyleLayer) {
-        function FillStyleLayer(layer) {
-            StyleLayer.call(this, layer, properties$3);
-        }
-
-        if (StyleLayer) FillStyleLayer.__proto__ = StyleLayer;
-        FillStyleLayer.prototype = Object.create(StyleLayer && StyleLayer.prototype);
-        FillStyleLayer.prototype.constructor = FillStyleLayer;
-
-        FillStyleLayer.prototype.recalculate = function recalculate(parameters, availableImages) {
-            StyleLayer.prototype.recalculate.call(this, parameters, availableImages);
-
-            var outlineColor = this.paint._values['fill-outline-color'];
-            if (outlineColor.value.kind === 'constant' && outlineColor.value.value === undefined) {
-                this.paint._values['fill-outline-color'] = this.paint._values['fill-color'];
-            }
-        };
-
-        FillStyleLayer.prototype.createBucket = function createBucket(parameters) {
-            return new FillBucket(parameters);
-        };
-
-        FillStyleLayer.prototype.queryRadius = function queryRadius() {
-            return QueryUtils.translateDistance(this.paint.get('fill-translate'));
-        };
-
-        FillStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits) {
-            var translatedPolygon = QueryUtils.translate(queryGeometry,
-                this.paint.get('fill-translate'),
-                this.paint.get('fill-translate-anchor'),
-                0, pixelsToTileUnits);
-            return IntersectionTest.polygonIntersectsMultiPolygon(translatedPolygon, geometry);
-        };
-
-        FillStyleLayer.prototype.isTileClipped = function isTileClipped() {
-            return true;
-        };
-
-        return FillStyleLayer;
-    }(StyleLayer));
-
-    /**
-     * An implementation of `Property` for `*-pattern` and `line-dasharray`, which are transitioned by cross-fading
-     * rather than interpolation.
-     *
-     * @private
-     */
-    var CrossFadedProperty = function CrossFadedProperty(specification) {
-        this.specification = specification;
-    };
-
-    CrossFadedProperty.prototype.possiblyEvaluate = function possiblyEvaluate(value, parameters, availableImages) {
-        if (value.value === undefined) {
-            return undefined;
-        } else if (value.expression.kind === 'constant') {
-            var constant = value.expression.evaluate(parameters, (null   ), {}, availableImages);
-            return this._calculate(constant, constant, constant, parameters);
-        } else {
-            //assert_1(!value.isDataDriven());
-            return this._calculate(
-                value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom - 1.0), parameters)),
-                value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom), parameters)),
-                value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom + 1.0), parameters)),
-                parameters);
-        }
-    };
-
-    CrossFadedProperty.prototype._calculate = function _calculate(min, mid, max, parameters) {
-        var z = parameters.zoom;
-        return z > parameters.zoomHistory.lastIntegerZoom ? {from: min, to: mid} : {from: max, to: mid};
-    };
-
-    CrossFadedProperty.prototype.interpolate = function interpolate(a) {
-        return a;
-    };
-
-    WebWorkerTransfer.register('CrossFadedProperty', CrossFadedProperty);
-
-    /**
-     * An implementation of `Property` for `heatmap-color` and `line-gradient`. Interpolation is a no-op, and
-     * evaluation returns a boolean value in order to indicate its presence, but the real
-     * evaluation happens in StyleLayer classes.
-     *
-     * @private
-     */
-
-    var ColorRampProperty = function ColorRampProperty(specification) {
-        this.specification = specification;
-    };
-
-    ColorRampProperty.prototype.possiblyEvaluate = function possiblyEvaluate(value, parameters, availableImages) {
-        return !!value.expression.evaluate(parameters, (null   ), {}, availableImages);
-    };
-
-    ColorRampProperty.prototype.interpolate = function interpolate() {
-        return false;
-    };
-
-    WebWorkerTransfer.register('ColorRampProperty', ColorRampProperty);
-
-    var layout$6 = new Properties({
-        "line-cap": new DataConstantProperty(StyleSpec["layout_line"]["line-cap"]),
-        "line-join": new DataDrivenProperty(StyleSpec["layout_line"]["line-join"]),
-        "line-miter-limit": new DataConstantProperty(StyleSpec["layout_line"]["line-miter-limit"]),
-        "line-round-limit": new DataConstantProperty(StyleSpec["layout_line"]["line-round-limit"]),
-        "line-sort-key": new DataDrivenProperty(StyleSpec["layout_line"]["line-sort-key"])
-    });
-
-
-    var paint$6 = new Properties({
-        "line-opacity": new DataDrivenProperty(StyleSpec["paint_line"]["line-opacity"]),
-        "line-color": new DataDrivenProperty(StyleSpec["paint_line"]["line-color"]),
-        "line-translate": new DataConstantProperty(StyleSpec["paint_line"]["line-translate"]),
-        "line-translate-anchor": new DataConstantProperty(StyleSpec["paint_line"]["line-translate-anchor"]),
-        "line-width": new DataDrivenProperty(StyleSpec["paint_line"]["line-width"]),
-        "line-gap-width": new DataDrivenProperty(StyleSpec["paint_line"]["line-gap-width"]),
-        "line-offset": new DataDrivenProperty(StyleSpec["paint_line"]["line-offset"]),
-        "line-blur": new DataDrivenProperty(StyleSpec["paint_line"]["line-blur"]),
-        "line-dasharray": new CrossFadedProperty(StyleSpec["paint_line"]["line-dasharray"]),
-        "line-pattern": new CrossFadedDataDrivenProperty(StyleSpec["paint_line"]["line-pattern"]),
-        "line-gradient": new ColorRampProperty(StyleSpec["paint_line"]["line-gradient"])
-    });
-
-    // Note: without adding the explicit type annotation, Flow infers weaker types
-    // for these objects from their use in the constructor to StyleLayer, as
-    // {layout?: Properties<...>, paint: Properties<...>}
-    var properties$5 = ({ paint: paint$6, layout: layout$6 }
-
-        );
-
-    var LineFloorwidthProperty = /*@__PURE__*/(function (DataDrivenProperty) {
-        function LineFloorwidthProperty() {
-            DataDrivenProperty.apply(this, arguments);
-        }
-
-        if (DataDrivenProperty) LineFloorwidthProperty.__proto__ = DataDrivenProperty;
-        LineFloorwidthProperty.prototype = Object.create(DataDrivenProperty && DataDrivenProperty.prototype);
-        LineFloorwidthProperty.prototype.constructor = LineFloorwidthProperty;
-
-        LineFloorwidthProperty.prototype.possiblyEvaluate = function possiblyEvaluate(value, parameters) {
-            parameters = new EvaluationParameters$1(Math.floor(parameters.zoom), {
-                now: parameters.now,
-                fadeDuration: parameters.fadeDuration,
-                zoomHistory: parameters.zoomHistory,
-                transition: parameters.transition
-            });
-            return DataDrivenProperty.prototype.possiblyEvaluate.call(this, value, parameters);
-        };
-
-        LineFloorwidthProperty.prototype.evaluate = function evaluate(value, globals, feature, featureState) {
-            globals = extend({}, globals, {zoom: Math.floor(globals.zoom)});
-            return DataDrivenProperty.prototype.evaluate.call(this, value, globals, feature, featureState);
-        };
-
-        return LineFloorwidthProperty;
-    }(DataDrivenProperty));
-
-    var lineFloorwidthProperty = new LineFloorwidthProperty(properties$5.paint.properties['line-width'].specification);
-    lineFloorwidthProperty.useIntegerZoom = true;
-
-    var LineStyleLayer = /*@__PURE__*/(function (StyleLayer) {
-        function LineStyleLayer(layer) {
-            StyleLayer.call(this, layer, properties$5);
-        }
-
-        if (StyleLayer) LineStyleLayer.__proto__ = StyleLayer;
-        LineStyleLayer.prototype = Object.create(StyleLayer && StyleLayer.prototype);
-        LineStyleLayer.prototype.constructor = LineStyleLayer;
-
-        LineStyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate(name) {
-            if (name === 'line-gradient') {
-                this._updateGradient();
-            }
-        };
-
-        LineStyleLayer.prototype._updateGradient = function _updateGradient() {
-            var expression = this._transitionablePaint._values['line-gradient'].value.expression;
-            this.gradient = renderColorRamp(expression, 'lineProgress');
-            this.gradientTexture = null;
-        };
-
-        LineStyleLayer.prototype.recalculate = function recalculate(parameters, availableImages) {
-            StyleLayer.prototype.recalculate.call(this, parameters, availableImages);
-
-            (this.paint._values     )['line-floorwidth'] =
-                lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters);
-        };
-
-        LineStyleLayer.prototype.createBucket = function createBucket(parameters) {
-            return new LineBucket(parameters);
-        };
-
-        LineStyleLayer.prototype.queryRadius = function queryRadius(bucket) {
-            var lineBucket = (bucket     );
-            var width = getLineWidth(
-                QueryUtils.getMaximumPaintValue('line-width', this, lineBucket),
-                QueryUtils.getMaximumPaintValue('line-gap-width', this, lineBucket));
-            var offset = QueryUtils.getMaximumPaintValue('line-offset', this, lineBucket);
-            return width / 2 + Math.abs(offset) + QueryUtils.translateDistance(this.paint.get('line-translate'));
-        };
-
-        LineStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature(queryGeometry, feature, featureState, geometry, zoom, transform, pixelsToTileUnits) {
-            var translatedPolygon = QueryUtils.translate(queryGeometry,
-                this.paint.get('line-translate'),
-                this.paint.get('line-translate-anchor'),
-                0, pixelsToTileUnits);
-            var halfWidth = pixelsToTileUnits / 2 * getLineWidth(
-                this.paint.get('line-width').evaluate(feature, featureState),
-                this.paint.get('line-gap-width').evaluate(feature, featureState));
-            var lineOffset = this.paint.get('line-offset').evaluate(feature, featureState);
-            if (lineOffset) {
-                geometry = offsetLine(geometry, lineOffset * pixelsToTileUnits);
-            }
-
-            return IntersectionTest.polygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth);
-        };
-
-        LineStyleLayer.prototype.isTileClipped = function isTileClipped() {
-            return true;
-        };
-
-        function getLineWidth(lineWidth, lineGapWidth) {
-            if (lineGapWidth > 0) {
-                return lineGapWidth + 2 * lineWidth;
-            } else {
-                return lineWidth;
-            }
-        }
-
-        function offsetLine(rings, offset) {
-            var newRings = [];
-            var zero = new Point(0, 0);
-            for (var k = 0; k < rings.length; k++) {
-                var ring = rings[k];
-                var newRing = [];
-                for (var i = 0; i < ring.length; i++) {
-                    var a = ring[i - 1];
-                    var b = ring[i];
-                    var c = ring[i + 1];
-                    var aToB = i === 0 ? zero : b.sub(a)._unit()._perp();
-                    var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp();
-                    var extrude = aToB._add(bToC)._unit();
-
-                    var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;
-                    extrude._mult(1 / cosHalfAngle);
-
-                    newRing.push(extrude._mult(offset)._add(b));
-                }
-                newRings.push(newRing);
-            }
-            return newRings;
-        }
-
-        return LineStyleLayer;
-    }(StyleLayer));
-
-    function SymbolAttributes() {
-    }
-
-    SymbolAttributes.symbolLayoutAttributes = createLayout([
-        {name: 'a_pos_offset', components: 4, type: 'Int16'},
-        {name: 'a_data', components: 4, type: 'Uint16'},
-        {name: 'a_pixeloffset', components: 4, type: 'Int16'}
-    ], 4);
-
-    SymbolAttributes.dynamicLayoutAttributes = createLayout([
-        {name: 'a_projected_pos', components: 3, type: 'Float32'}
-    ], 4);
-
-    SymbolAttributes.placementOpacityAttributes = createLayout([
-        {name: 'a_fade_opacity', components: 1, type: 'Uint32'}
-    ], 4);
-
-    SymbolAttributes.collisionVertexAttributes = createLayout([
-        {name: 'a_placed', components: 2, type: 'Uint8'},
-        {name: 'a_shift', components: 2, type: 'Float32'}
-    ]);
-
-    SymbolAttributes.collisionBox = createLayout([
-        // the box is centered around the anchor point
-        {type: 'Int16', name: 'anchorPointX'},
-        {type: 'Int16', name: 'anchorPointY'},
-
-        // distances to the edges from the anchor
-        {type: 'Int16', name: 'x1'},
-        {type: 'Int16', name: 'y1'},
-        {type: 'Int16', name: 'x2'},
-        {type: 'Int16', name: 'y2'},
-
-        // the index of the feature in the original vectortile
-        {type: 'Uint32', name: 'featureIndex'},
-        // the source layer the feature appears in
-        {type: 'Uint16', name: 'sourceLayerIndex'},
-        // the bucket the feature appears in
-        {type: 'Uint16', name: 'bucketIndex'},
-
-        // collision circles for lines store their distance to the anchor in tile units
-        // so that they can be ignored if the projected label doesn't extend into
-        // the box area
-        {type: 'Int16', name: 'radius'},
-        {type: 'Int16', name: 'signedDistanceFromAnchor'}
-    ]);
-
-    SymbolAttributes.collisionBoxLayout = createLayout([ // used to render collision boxes for debugging purposes
-        {name: 'a_pos', components: 2, type: 'Int16'},
-        {name: 'a_anchor_pos', components: 2, type: 'Int16'},
-        {name: 'a_extrude', components: 2, type: 'Int16'}
-    ], 4);
-
-    SymbolAttributes.collisionCircleLayout = createLayout([ // used to render collision circles for debugging purposes
-        {name: 'a_pos', components: 2, type: 'Int16'},
-        {name: 'a_anchor_pos', components: 2, type: 'Int16'},
-        {name: 'a_extrude', components: 2, type: 'Int16'}
-    ], 4);
-
-    SymbolAttributes.placement = createLayout([
-        {type: 'Int16', name: 'anchorX'},
-        {type: 'Int16', name: 'anchorY'},
-        {type: 'Uint16', name: 'glyphStartIndex'},
-        {type: 'Uint16', name: 'numGlyphs'},
-        {type: 'Uint32', name: 'vertexStartIndex'},
-        {type: 'Uint32', name: 'lineStartIndex'},
-        {type: 'Uint32', name: 'lineLength'},
-        {type: 'Uint16', name: 'segment'},
-        {type: 'Uint16', name: 'lowerSize'},
-        {type: 'Uint16', name: 'upperSize'},
-        {type: 'Float32', name: 'lineOffsetX'},
-        {type: 'Float32', name: 'lineOffsetY'},
-        {type: 'Uint8', name: 'writingMode'},
-        {type: 'Uint8', name: 'placedOrientation'},
-        {type: 'Uint8', name: 'hidden'},
-        {type: 'Uint32', name: 'crossTileID'},
-        {type: 'Int16', name: 'associatedIconIndex'}
-    ]);
-
-    SymbolAttributes.symbolInstance = createLayout([
-        {type: 'Int16', name: 'anchorX'},
-        {type: 'Int16', name: 'anchorY'},
-        {type: 'Int16', name: 'rightJustifiedTextSymbolIndex'},
-        {type: 'Int16', name: 'centerJustifiedTextSymbolIndex'},
-        {type: 'Int16', name: 'leftJustifiedTextSymbolIndex'},
-        {type: 'Int16', name: 'verticalPlacedTextSymbolIndex'},
-        {type: 'Int16', name: 'placedIconSymbolIndex'},
-        {type: 'Int16', name: 'verticalPlacedIconSymbolIndex'},
-        {type: 'Uint16', name: 'key'},
-        {type: 'Uint16', name: 'textBoxStartIndex'},
-        {type: 'Uint16', name: 'textBoxEndIndex'},
-        {type: 'Uint16', name: 'verticalTextBoxStartIndex'},
-        {type: 'Uint16', name: 'verticalTextBoxEndIndex'},
-        {type: 'Uint16', name: 'iconBoxStartIndex'},
-        {type: 'Uint16', name: 'iconBoxEndIndex'},
-        {type: 'Uint16', name: 'verticalIconBoxStartIndex'},
-        {type: 'Uint16', name: 'verticalIconBoxEndIndex'},
-        {type: 'Uint16', name: 'featureIndex'},
-        {type: 'Uint16', name: 'numHorizontalGlyphVertices'},
-        {type: 'Uint16', name: 'numVerticalGlyphVertices'},
-        {type: 'Uint16', name: 'numIconVertices'},
-        {type: 'Uint16', name: 'numVerticalIconVertices'},
-        {type: 'Uint32', name: 'crossTileID'},
-        {type: 'Float32', name: 'textBoxScale'},
-        {type: 'Float32', components: 2, name: 'textOffset'}
-    ]);
-
-    SymbolAttributes.glyphOffset = createLayout([
-        {type: 'Float32', name: 'offsetX'}
-    ]);
-
-    SymbolAttributes.lineVertex = createLayout([
-        {type: 'Int16', name: 'x'},
-        {type: 'Int16', name: 'y'},
-        {type: 'Int16', name: 'tileUnitDistanceFromAnchor'}
-    ]);
-
-    function mergeLines(features) {
-        var leftIndex = {};
-        var rightIndex = {};
-        var mergedFeatures = [];
-        var mergedIndex = 0;
-
-        function add(k) {
-            mergedFeatures.push(features[k]);
-            mergedIndex++;
-        }
-
-        function mergeFromRight(leftKey, rightKey, geom) {
-            var i = rightIndex[leftKey];
-            delete rightIndex[leftKey];
-            rightIndex[rightKey] = i;
-
-            mergedFeatures[i].geometry[0].pop();
-            mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]);
-            return i;
-        }
-
-        function mergeFromLeft(leftKey, rightKey, geom) {
-            var i = leftIndex[rightKey];
-            delete leftIndex[rightKey];
-            leftIndex[leftKey] = i;
-
-            mergedFeatures[i].geometry[0].shift();
-            mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]);
-            return i;
-        }
-
-        function getKey(text, geom, onRight) {
-            var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];
-            return (text + ":" + (point.x) + ":" + (point.y));
-        }
-
-        for (var k = 0; k < features.length; k++) {
-            var feature = features[k];
-            var geom = feature.geometry;
-            var text = feature.text ? feature.text.toString() : null;
-
-            if (!text) {
-                add(k);
-                continue;
-            }
-
-            var leftKey = getKey(text, geom),
-                rightKey = getKey(text, geom, true);
-
-            if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {
-                // found lines with the same text adjacent to both ends of the current line, merge all three
-                var j = mergeFromLeft(leftKey, rightKey, geom);
-                var i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry);
-
-                delete leftIndex[leftKey];
-                delete rightIndex[rightKey];
-
-                rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i;
-                mergedFeatures[j].geometry = (null     );
-
-            } else if (leftKey in rightIndex) {
-                // found mergeable line adjacent to the start of the current line, merge
-                mergeFromRight(leftKey, rightKey, geom);
-
-            } else if (rightKey in leftIndex) {
-                // found mergeable line adjacent to the end of the current line, merge
-                mergeFromLeft(leftKey, rightKey, geom);
-
-            } else {
-                // no adjacent lines, add as a new item
-                add(k);
-                leftIndex[leftKey] = mergedIndex - 1;
-                rightIndex[rightKey] = mergedIndex - 1;
-            }
-        }
-
-        return mergedFeatures.filter(function (f) {
-            return f.geometry;
-        });
-    }
-
-    var Shaping = function Shaping() {
-    };
-
-    Shaping.WritingMode = {
-        horizontal: 1,
-        vertical: 2,
-        horizontalOnly: 3
-    };
-
-    // The position of a glyph relative to the text's anchor point.
-
-
-    // A collection of positioned glyphs and some metadata
-
-
-    function isEmpty(positionedLines) {
-        for (var i = 0, list = positionedLines; i < list.length; i += 1) {
-            var line = list[i];
-
-            if (line.positionedGlyphs.length !== 0) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-
-    // Max number of images in label is 6401 U+E000–U+F8FF that covers
-    // Basic Multilingual Plane Unicode Private Use Area (PUA).
-    var PUAbegin = 0xE000;
-    var PUAend = 0xF8FF;
-
-    var SectionOptions = function SectionOptions() {
-        this.scale = 1.0;
-        this.fontStack = "";
-        this.imageName = null;
-    };
-
-    SectionOptions.forText = function forText(scale, fontStack) {
-        var textOptions = new SectionOptions();
-        textOptions.scale = scale || 1;
-        textOptions.fontStack = fontStack;
-        return textOptions;
-    };
-
-    SectionOptions.forImage = function forImage(imageName) {
-        var imageOptions = new SectionOptions();
-        imageOptions.imageName = imageName;
-        return imageOptions;
-    };
-
-    var TaggedString = function TaggedString() {
-        this.text = "";
-        this.sectionIndex = [];
-        this.sections = [];
-        this.imageSectionID = null;
-    };
-
-    TaggedString.fromFeature = function fromFeature(text, defaultFontStack) {
-        var result = new TaggedString();
-        for (var i = 0; i < text.sections.length; i++) {
-            var section = text.sections[i];
-            if (!section.image) {
-                result.addTextSection(section, defaultFontStack);
-            } else {
-                result.addImageSection(section);
-            }
-        }
-        return result;
-    };
-
-    TaggedString.prototype.length = function length() {
-        return this.text.length;
-    };
-
-    TaggedString.prototype.getSection = function getSection(index) {
-        return this.sections[this.sectionIndex[index]];
-    };
-
-    TaggedString.prototype.getSectionIndex = function getSectionIndex(index) {
-        return this.sectionIndex[index];
-    };
-
-    TaggedString.prototype.getCharCode = function getCharCode(index) {
-        return this.text.charCodeAt(index);
-    };
-
-    TaggedString.prototype.verticalizePunctuation = function verticalizePunctuation$1() {
-        //this.text = verticalizePunctuation(this.text);
-    };
-
-    TaggedString.prototype.trim = function trim() {
-        var beginningWhitespace = 0;
-        for (var i = 0;
-             i < this.text.length && whitespace[this.text.charCodeAt(i)];
-             i++) {
-            beginningWhitespace++;
-        }
-        var trailingWhitespace = this.text.length;
-        for (var i$1 = this.text.length - 1;
-             i$1 >= 0 && i$1 >= beginningWhitespace && whitespace[this.text.charCodeAt(i$1)];
-             i$1--) {
-            trailingWhitespace--;
-        }
-        this.text = this.text.substring(beginningWhitespace, trailingWhitespace);
-        this.sectionIndex = this.sectionIndex.slice(beginningWhitespace, trailingWhitespace);
-    };
-
-    TaggedString.prototype.substring = function substring(start, end) {
-        var substring = new TaggedString();
-        substring.text = this.text.substring(start, end);
-        substring.sectionIndex = this.sectionIndex.slice(start, end);
-        substring.sections = this.sections;
-        return substring;
-    };
-
-    TaggedString.prototype.toString = function toString() {
-        return this.text;
-    };
-
-    TaggedString.prototype.getMaxScale = function getMaxScale() {
-        var this$1 = this;
-
-        return this.sectionIndex.reduce(function (max, index) {
-            return Math.max(max, this$1.sections[index].scale);
-        }, 0);
-    };
-
-    TaggedString.prototype.addTextSection = function addTextSection(section, defaultFontStack) {
-        this.text += section.text;
-        this.sections.push(SectionOptions.forText(section.scale, section.fontStack || defaultFontStack));
-        var index = this.sections.length - 1;
-        for (var i = 0; i < section.text.length; ++i) {
-            this.sectionIndex.push(index);
-        }
-    };
-
-    TaggedString.prototype.addImageSection = function addImageSection(section) {
-        var imageName = section.image ? section.image.name : '';
-        if (imageName.length === 0) {
-            //warnOnce("Can't add FormattedSection with an empty image.");
-            return;
-        }
-
-        var nextImageSectionCharCode = this.getNextImageSectionCharCode();
-        if (!nextImageSectionCharCode) {
-            //warnOnce(("Reached maximum number of images " + (PUAend - PUAbegin + 2)));
-            return;
-        }
-
-        this.text += String.fromCharCode(nextImageSectionCharCode);
-        this.sections.push(SectionOptions.forImage(imageName));
-        this.sectionIndex.push(this.sections.length - 1);
-    };
-
-    TaggedString.prototype.getNextImageSectionCharCode = function getNextImageSectionCharCode() {
-        if (!this.imageSectionID) {
-            this.imageSectionID = PUAbegin;
-            return this.imageSectionID;
-        }
-
-        if (this.imageSectionID >= PUAend) {
-            return null;
-        }
-        return ++this.imageSectionID;
-    };
-
-    function breakLines(input, lineBreakPoints) {
-        var lines = [];
-        var text = input.text;
-        var start = 0;
-        for (var i = 0, list = lineBreakPoints; i < list.length; i += 1) {
-            var lineBreak = list[i];
-
-            lines.push(input.substring(start, lineBreak));
-            start = lineBreak;
-        }
-
-        if (start < text.length) {
-            lines.push(input.substring(start, text.length));
-        }
-        return lines;
-    }
-
-    Shaping.shapeText = function(text, glyphMap, glyphPositions, imagePositions, defaultFontStack, maxWidth, lineHeight, textAnchor, textJustify, spacing, translate, writingMode, allowVerticalPlacement, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom){
-        var logicalInput = TaggedString.fromFeature(text, defaultFontStack);
-
-        if (writingMode === Shaping.WritingMode.vertical) {
-            logicalInput.verticalizePunctuation();
-        }
-
-        var lines;
-        {
-            lines = breakLines(logicalInput, determineLineBreaks());
-        }
-
-        var positionedLines = [];
-        var shaping = {
-            positionedLines: positionedLines,
-            text: logicalInput.toString(),
-            top: translate[1],
-            bottom: translate[1],
-            left: translate[0],
-            right: translate[0],
-            writingMode: writingMode,
-            iconsInText: false,
-            verticalizable: false
-        };
-        if (isEmpty(positionedLines)) {
-            return false;
-        }
-
-        return shaping;
-    };
-
-    // using computed properties due to https://github.com/facebook/flow/issues/380
-    /* eslint no-useless-computed-key: 0 */
-
-    var whitespace = {};
-    whitespace[0x09] = true;
-    whitespace[0x0a] = true;
-    whitespace[0x0b] = true;
-    whitespace[0x0c] = true;
-    whitespace[0x0d] = true;
-    whitespace[0x20] = true;
-
-    function determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize) {
-    //        if (symbolPlacement !== 'point') {
-    //            return [];
-    //        }
-    //
-    //        if (!logicalInput) {
-    //            return [];
-    //        }
-    //
-    //        var potentialLineBreaks = [];
-    //        var targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize);
-    //
-    //        var hasServerSuggestedBreakpoints = logicalInput.text.indexOf("\u200b") >= 0;
-    //
-    //        var currentX = 0;
-    //
-    //        for (var i = 0; i < logicalInput.length(); i++) {
-    //            var section = logicalInput.getSection(i);
-    //            var codePoint = logicalInput.getCharCode(i);
-    //            if (!whitespace[codePoint]) {
-    //                currentX += getGlyphAdvance(codePoint, section, glyphMap, imagePositions, spacing, layoutTextSize);
-    //            }
-    //
-    //            // Ideographic characters, spaces, and word-breaking punctuation that often appear without
-    //            // surrounding spaces.
-    //            if ((i < logicalInput.length() - 1)) {
-    //                var ideographicBreak = charAllowsIdeographicBreaking(codePoint);
-    //                if (breakable[codePoint] || ideographicBreak || section.imageName) {
-    //
-    //                    potentialLineBreaks.push(
-    //                        evaluateBreak(
-    //                            i + 1,
-    //                            currentX,
-    //                            targetWidth,
-    //                            potentialLineBreaks,
-    //                            calculatePenalty(codePoint, logicalInput.getCharCode(i + 1), ideographicBreak && hasServerSuggestedBreakpoints),
-    //                            false));
-    //                }
-    //            }
-    //        }
-    //
-    //        return leastBadBreaks(
-    //            evaluateBreak(
-    //                logicalInput.length(),
-    //                currentX,
-    //                targetWidth,
-    //                potentialLineBreaks,
-    //                0,
-    //                true));
-    }
-
-    function getAnchorAlignment(anchor) {
-        var horizontalAlign = 0.5, verticalAlign = 0.5;
-
-        switch (anchor) {
-            case 'right':
-            case 'top-right':
-            case 'bottom-right':
-                horizontalAlign = 1;
-                break;
-            case 'left':
-            case 'top-left':
-            case 'bottom-left':
-                horizontalAlign = 0;
-                break;
-        }
-
-        switch (anchor) {
-            case 'bottom':
-            case 'bottom-right':
-            case 'bottom-left':
-                verticalAlign = 1;
-                break;
-            case 'top':
-            case 'top-right':
-            case 'top-left':
-                verticalAlign = 0;
-                break;
-        }
-
-        return {horizontalAlign: horizontalAlign, verticalAlign: verticalAlign};
-    }
-
-
-    Shaping.shapeIcon = function(image, iconOffset, iconAnchor){
-        var ref = getAnchorAlignment(iconAnchor);
-        var horizontalAlign = ref.horizontalAlign;
-        var verticalAlign = ref.verticalAlign;
-        var dx = iconOffset[0];
-        var dy = iconOffset[1];
-        var x1 = dx - image.displaySize[0] * horizontalAlign;
-        var x2 = x1 + image.displaySize[0];
-        var y1 = dy - image.displaySize[1] * verticalAlign;
-        var y2 = y1 + image.displaySize[1];
-        return {image: image, top: y1, bottom: y2, left: x1, right: x2};
-    };
-
-    Shaping.fitIconToText = function(shapedIcon, shapedText, textFit, padding, iconOffset, fontScale){
-    //        assert_1(textFit !== 'none');
-    //        assert_1(Array.isArray(padding) && padding.length === 4);
-    //        assert_1(Array.isArray(iconOffset) && iconOffset.length === 2);
-
-        var image = shapedIcon.image;
-
-        var collisionPadding;
-        if (image.content) {
-            var content = image.content;
-            var pixelRatio = image.pixelRatio || 1;
-            collisionPadding = [
-                content[0] / pixelRatio,
-                content[1] / pixelRatio,
-                image.displaySize[0] - content[2] / pixelRatio,
-                image.displaySize[1] - content[3] / pixelRatio
-            ];
-        }
-
-        // We don't respect the icon-anchor, because icon-text-fit is set. Instead,
-        // the icon will be centered on the text, then stretched in the given
-        // dimensions.
-
-        var textLeft = shapedText.left * fontScale;
-        var textRight = shapedText.right * fontScale;
-
-        var top, right, bottom, left;
-        if (textFit === 'width' || textFit === 'both') {
-            // Stretched horizontally to the text width
-            left = iconOffset[0] + textLeft - padding[3];
-            right = iconOffset[0] + textRight + padding[1];
-        } else {
-            // Centered on the text
-            left = iconOffset[0] + (textLeft + textRight - image.displaySize[0]) / 2;
-            right = left + image.displaySize[0];
-        }
-
-        var textTop = shapedText.top * fontScale;
-        var textBottom = shapedText.bottom * fontScale;
-        if (textFit === 'height' || textFit === 'both') {
-            // Stretched vertically to the text height
-            top = iconOffset[1] + textTop - padding[0];
-            bottom = iconOffset[1] + textBottom + padding[2];
-        } else {
-            // Centered on the text
-            top = iconOffset[1] + (textTop + textBottom - image.displaySize[1]) / 2;
-            bottom = top + image.displaySize[1];
-        }
-
-        return {image: image, top: top, right: right, bottom: bottom, left: left, collisionPadding: collisionPadding};
-    };
-
-    var SIZE_PACK_FACTOR = 128;
-
-    // For {text,icon}-size, get the bucket-level data that will be needed by
-    // the painter to set symbol-size-related uniforms
-    function getSizeData(tileZoom, value) {
-        var expression = value.expression;
-
-        if (expression.kind === 'constant') {
-            var layoutSize = expression.evaluate(new EvaluationParameters$1(tileZoom + 1));
-            return {kind: 'constant', layoutSize: layoutSize};
-
-        } else if (expression.kind === 'source') {
-            return {kind: 'source'};
-
-        } else {
-            var zoomStops = expression.zoomStops;
-            var interpolationType = expression.interpolationType;
-
-            // calculate covering zoom stops for zoom-dependent values
-            var lower = 0;
-            while (lower < zoomStops.length && zoomStops[lower] <= tileZoom) {
-                lower++;
-            }
-            lower = Math.max(0, lower - 1);
-            var upper = lower;
-            while (upper < zoomStops.length && zoomStops[upper] < tileZoom + 1) {
-                upper++;
-            }
-            upper = Math.min(zoomStops.length - 1, upper);
-
-            var minZoom = zoomStops[lower];
-            var maxZoom = zoomStops[upper];
-
-            // We'd like to be able to use CameraExpression or CompositeExpression in these
-            // return types rather than ExpressionSpecification, but the former are not
-            // transferrable across Web Worker boundaries.
-            if (expression.kind === 'composite') {
-                return {kind: 'composite', minZoom: minZoom, maxZoom: maxZoom, interpolationType: interpolationType};
-            }
-
-            // for camera functions, also save off the function values
-            // evaluated at the covering zoom levels
-            var minSize = expression.evaluate(new EvaluationParameters$1(minZoom));
-            var maxSize = expression.evaluate(new EvaluationParameters$1(maxZoom));
-
-            return {kind: 'camera', minZoom: minZoom, maxZoom: maxZoom, minSize: minSize, maxSize: maxSize, interpolationType: interpolationType};
-        }
-    }
-
-    function evaluateSizeForFeature(sizeData, ref, ref$1) {
-        var uSize = ref.uSize;
-        var uSizeT = ref.uSizeT;
-        var lowerSize = ref$1.lowerSize;
-        var upperSize = ref$1.upperSize;
-
-        if (sizeData.kind === 'source') {
-            return lowerSize / SIZE_PACK_FACTOR;
-        } else if (sizeData.kind === 'composite') {
-            return number(lowerSize / SIZE_PACK_FACTOR, upperSize / SIZE_PACK_FACTOR, uSizeT);
-        }
-        return uSize;
-    }
-
-    function evaluateSizeForZoom(sizeData, zoom) {
-        var uSizeT = 0;
-        var uSize = 0;
-
-        if (sizeData.kind === 'constant') {
-            uSize = sizeData.layoutSize;
-
-        } else if (sizeData.kind !== 'source') {
-            var interpolationType = sizeData.interpolationType;
-            var minZoom = sizeData.minZoom;
-            var maxZoom = sizeData.maxZoom;
-
-            // Even though we could get the exact value of the camera function
-            // at z = tr.zoom, we intentionally do not: instead, we interpolate
-            // between the camera function values at a pair of zoom stops covering
-            // [tileZoom, tileZoom + 1] in order to be consistent with this
-            // restriction on composite functions
-    //            var t = !interpolationType ? 0 : clamp(
-    //                Interpolate.interpolationFactor(interpolationType, zoom, minZoom, maxZoom), 0, 1);
-            var t = 0;
-
-            if (sizeData.kind === 'camera') {
-                uSize = number(sizeData.minSize, sizeData.maxSize, t);
-            } else {
-                uSizeT = t;
-            }
-        }
-
-        return {uSizeT: uSizeT, uSize: uSize};
-    }
-
-    var symbolSize = /*#__PURE__*/Object.freeze({
-        __proto__: null,
-        getSizeData: getSizeData,
-        evaluateSizeForFeature: evaluateSizeForFeature,
-        evaluateSizeForZoom: evaluateSizeForZoom,
-        SIZE_PACK_FACTOR: SIZE_PACK_FACTOR
-    });
-
-    function transformText(text, layer, feature) {
-        var transform = layer.layout.get('text-transform').evaluate(feature, {});
-        if (transform === 'uppercase') {
-            text = text.toLocaleUpperCase();
-        } else if (transform === 'lowercase') {
-            text = text.toLocaleLowerCase();
-        }
-
-    //        if (plugin.applyArabicShaping) {
-    //            text = plugin.applyArabicShaping(text);
-    //        }
-
-        return text;
-    }
-
-    function transformText$1(text, layer, feature) {
-        text.sections.forEach(function (section) {
-            section.text = transformText(section.text, layer, feature);
-        });
-        return text;
-    }
-
-    // The following table comes from <http://www.unicode.org/Public/12.0.0/ucd/Blocks.txt>.
-    // Keep it synchronized with <http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt>.
-
-    var unicodeBlockLookup = {
-        // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F,
-        'Latin-1 Supplement': function (char) {
-            return char >= 0x0080 && char <= 0x00FF;
-        },
-        // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F,
-        // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F,
-        // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF,
-        // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF,
-        // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F,
-        // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF,
-        // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF,
-        // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F,
-        // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F,
-        //'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF,
-        'Arabic': function (char) {
-            return char >= 0x0600 && char <= 0x06FF;
-        },
-        //'Syriac': (char) => char >= 0x0700 && char <= 0x074F,
-        'Arabic Supplement': function (char) {
-            return char >= 0x0750 && char <= 0x077F;
-        },
-        // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF,
-        // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF,
-        // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F,
-        // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F,
-        // 'Syriac Supplement': (char) => char >= 0x0860 && char <= 0x086F,
-        'Arabic Extended-A': function (char) {
-            return char >= 0x08A0 && char <= 0x08FF;
-        },
-        // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F,
-        // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF,
-        // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F,
-        // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF,
-        // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F,
-        // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF,
-        // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F,
-        // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF,
-        // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F,
-        // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF,
-        // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F,
-        // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF,
-        // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF,
-        // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F,
-        // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF,
-        'Hangul Jamo': function (char) {
-            return char >= 0x1100 && char <= 0x11FF;
-        },
-        // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F,
-        // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F,
-        // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF,
-        'Unified Canadian Aboriginal Syllabics': function (char) {
-            return char >= 0x1400 && char <= 0x167F;
-        },
-        // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F,
-        // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF,
-        // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F,
-        // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F,
-        // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F,
-        // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F,
-        'Khmer': function (char) {
-            return char >= 0x1780 && char <= 0x17FF;
-        },
-        // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF,
-        'Unified Canadian Aboriginal Syllabics Extended': function (char) {
-            return char >= 0x18B0 && char <= 0x18FF;
-        },
-        // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F,
-        // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F,
-        // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF,
-        // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF,
-        // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F,
-        // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF,
-        // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF,
-        // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F,
-        // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF,
-        // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF,
-        // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F,
-        // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F,
-        // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F,
-        // 'Georgian Extended': (char) => char >= 0x1C90 && char <= 0x1CBF,
-        // 'Sundanese Supplement': (char) => char >= 0x1CC0 && char <= 0x1CCF,
-        // 'Vedic Extensions': (char) => char >= 0x1CD0 && char <= 0x1CFF,
-        // 'Phonetic Extensions': (char) => char >= 0x1D00 && char <= 0x1D7F,
-        // 'Phonetic Extensions Supplement': (char) => char >= 0x1D80 && char <= 0x1DBF,
-        // 'Combining Diacritical Marks Supplement': (char) => char >= 0x1DC0 && char <= 0x1DFF,
-        // 'Latin Extended Additional': (char) => char >= 0x1E00 && char <= 0x1EFF,
-        // 'Greek Extended': (char) => char >= 0x1F00 && char <= 0x1FFF,
-        'General Punctuation': function (char) {
-            return char >= 0x2000 && char <= 0x206F;
-        },
-        // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F,
-        // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF,
-        // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF,
-        'Letterlike Symbols': function (char) {
-            return char >= 0x2100 && char <= 0x214F;
-        },
-        'Number Forms': function (char) {
-            return char >= 0x2150 && char <= 0x218F;
-        },
-        // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF,
-        // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF,
-        'Miscellaneous Technical': function (char) {
-            return char >= 0x2300 && char <= 0x23FF;
-        },
-        'Control Pictures': function (char) {
-            return char >= 0x2400 && char <= 0x243F;
-        },
-        'Optical Character Recognition': function (char) {
-            return char >= 0x2440 && char <= 0x245F;
-        },
-        'Enclosed Alphanumerics': function (char) {
-            return char >= 0x2460 && char <= 0x24FF;
-        },
-        // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F,
-        // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F,
-        'Geometric Shapes': function (char) {
-            return char >= 0x25A0 && char <= 0x25FF;
-        },
-        'Miscellaneous Symbols': function (char) {
-            return char >= 0x2600 && char <= 0x26FF;
-        },
-        // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF,
-        // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF,
-        // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF,
-        // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF,
-        // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F,
-        // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF,
-        // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF,
-        'Miscellaneous Symbols and Arrows': function (char) {
-            return char >= 0x2B00 && char <= 0x2BFF;
-        },
-        // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F,
-        // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F,
-        // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF,
-        // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F,
-        // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F,
-        // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF,
-        // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF,
-        // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F,
-        'CJK Radicals Supplement': function (char) {
-            return char >= 0x2E80 && char <= 0x2EFF;
-        },
-        'Kangxi Radicals': function (char) {
-            return char >= 0x2F00 && char <= 0x2FDF;
-        },
-        'Ideographic Description Characters': function (char) {
-            return char >= 0x2FF0 && char <= 0x2FFF;
-        },
-        'CJK Symbols and Punctuation': function (char) {
-            return char >= 0x3000 && char <= 0x303F;
-        },
-        'Hiragana': function (char) {
-            return char >= 0x3040 && char <= 0x309F;
-        },
-        'Katakana': function (char) {
-            return char >= 0x30A0 && char <= 0x30FF;
-        },
-        'Bopomofo': function (char) {
-            return char >= 0x3100 && char <= 0x312F;
-        },
-        'Hangul Compatibility Jamo': function (char) {
-            return char >= 0x3130 && char <= 0x318F;
-        },
-        'Kanbun': function (char) {
-            return char >= 0x3190 && char <= 0x319F;
-        },
-        'Bopomofo Extended': function (char) {
-            return char >= 0x31A0 && char <= 0x31BF;
-        },
-        'CJK Strokes': function (char) {
-            return char >= 0x31C0 && char <= 0x31EF;
-        },
-        'Katakana Phonetic Extensions': function (char) {
-            return char >= 0x31F0 && char <= 0x31FF;
-        },
-        'Enclosed CJK Letters and Months': function (char) {
-            return char >= 0x3200 && char <= 0x32FF;
-        },
-        'CJK Compatibility': function (char) {
-            return char >= 0x3300 && char <= 0x33FF;
-        },
-        'CJK Unified Ideographs Extension A': function (char) {
-            return char >= 0x3400 && char <= 0x4DBF;
-        },
-        'Yijing Hexagram Symbols': function (char) {
-            return char >= 0x4DC0 && char <= 0x4DFF;
-        },
-        'CJK Unified Ideographs': function (char) {
-            return char >= 0x4E00 && char <= 0x9FFF;
-        },
-        'Yi Syllables': function (char) {
-            return char >= 0xA000 && char <= 0xA48F;
-        },
-        'Yi Radicals': function (char) {
-            return char >= 0xA490 && char <= 0xA4CF;
-        },
-        // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF,
-        // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F,
-        // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F,
-        // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF,
-        // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F,
-        // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF,
-        // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F,
-        // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F,
-        // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F,
-        // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF,
-        // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF,
-        // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F,
-        // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F,
-        'Hangul Jamo Extended-A': function (char) {
-            return char >= 0xA960 && char <= 0xA97F;
-        },
-        // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF,
-        // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF,
-        // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F,
-        // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F,
-        // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF,
-        // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF,
-        // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F,
-        // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F,
-        // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF,
-        // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF,
-        'Hangul Syllables': function (char) {
-            return char >= 0xAC00 && char <= 0xD7AF;
-        },
-        'Hangul Jamo Extended-B': function (char) {
-            return char >= 0xD7B0 && char <= 0xD7FF;
-        },
-        // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F,
-        // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF,
-        // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF,
-        'Private Use Area': function (char) {
-            return char >= 0xE000 && char <= 0xF8FF;
-        },
-        'CJK Compatibility Ideographs': function (char) {
-            return char >= 0xF900 && char <= 0xFAFF;
-        },
-        // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F,
-        'Arabic Presentation Forms-A': function (char) {
-            return char >= 0xFB50 && char <= 0xFDFF;
-        },
-        // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F,
-        'Vertical Forms': function (char) {
-            return char >= 0xFE10 && char <= 0xFE1F;
-        },
-        // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F,
-        'CJK Compatibility Forms': function (char) {
-            return char >= 0xFE30 && char <= 0xFE4F;
-        },
-        'Small Form Variants': function (char) {
-            return char >= 0xFE50 && char <= 0xFE6F;
-        },
-        'Arabic Presentation Forms-B': function (char) {
-            return char >= 0xFE70 && char <= 0xFEFF;
-        },
-        'Halfwidth and Fullwidth Forms': function (char) {
-            return char >= 0xFF00 && char <= 0xFFEF;
-        }
-        // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF,
-        // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F,
-        // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF,
-        // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F,
-        // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F,
-        // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF,
-        // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF,
-        // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F,
-        // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF,
-        // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF,
-        // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F,
-        // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F,
-        // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F,
-        // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F,
-        // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF,
-        // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F,
-        // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F,
-        // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF,
-        // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF,
-        // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F,
-        // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F,
-        // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F,
-        // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F,
-        // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F,
-        // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F,
-        // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF,
-        // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF,
-        // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F,
-        // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F,
-        // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F,
-        // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF,
-        // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F,
-        // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F,
-        // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F,
-        // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF,
-        // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F,
-        // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F,
-        // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F,
-        // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF,
-        // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F,
-        // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF,
-        // 'Hanifi Rohingya': (char) => char >= 0x10D00 && char <= 0x10D3F,
-        // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F,
-        // 'Old Sogdian': (char) => char >= 0x10F00 && char <= 0x10F2F,
-        // 'Sogdian': (char) => char >= 0x10F30 && char <= 0x10F6F,
-        // 'Elymaic': (char) => char >= 0x10FE0 && char <= 0x10FFF,
-        // 'Brahmi': (char) => char >= 0x11000 && char <= 0x1107F,
-        // 'Kaithi': (char) => char >= 0x11080 && char <= 0x110CF,
-        // 'Sora Sompeng': (char) => char >= 0x110D0 && char <= 0x110FF,
-        // 'Chakma': (char) => char >= 0x11100 && char <= 0x1114F,
-        // 'Mahajani': (char) => char >= 0x11150 && char <= 0x1117F,
-        // 'Sharada': (char) => char >= 0x11180 && char <= 0x111DF,
-        // 'Sinhala Archaic Numbers': (char) => char >= 0x111E0 && char <= 0x111FF,
-        // 'Khojki': (char) => char >= 0x11200 && char <= 0x1124F,
-        // 'Multani': (char) => char >= 0x11280 && char <= 0x112AF,
-        // 'Khudawadi': (char) => char >= 0x112B0 && char <= 0x112FF,
-        // 'Grantha': (char) => char >= 0x11300 && char <= 0x1137F,
-        // 'Newa': (char) => char >= 0x11400 && char <= 0x1147F,
-        // 'Tirhuta': (char) => char >= 0x11480 && char <= 0x114DF,
-        // 'Siddham': (char) => char >= 0x11580 && char <= 0x115FF,
-        // 'Modi': (char) => char >= 0x11600 && char <= 0x1165F,
-        // 'Mongolian Supplement': (char) => char >= 0x11660 && char <= 0x1167F,
-        // 'Takri': (char) => char >= 0x11680 && char <= 0x116CF,
-        // 'Ahom': (char) => char >= 0x11700 && char <= 0x1173F,
-        // 'Dogra': (char) => char >= 0x11800 && char <= 0x1184F,
-        // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF,
-        // 'Nandinagari': (char) => char >= 0x119A0 && char <= 0x119FF,
-        // 'Zanabazar Square': (char) => char >= 0x11A00 && char <= 0x11A4F,
-        // 'Soyombo': (char) => char >= 0x11A50 && char <= 0x11AAF,
-        // 'Pau Cin Hau': (char) => char >= 0x11AC0 && char <= 0x11AFF,
-        // 'Bhaiksuki': (char) => char >= 0x11C00 && char <= 0x11C6F,
-        // 'Marchen': (char) => char >= 0x11C70 && char <= 0x11CBF,
-        // 'Masaram Gondi': (char) => char >= 0x11D00 && char <= 0x11D5F,
-        // 'Gunjala Gondi': (char) => char >= 0x11D60 && char <= 0x11DAF,
-        // 'Makasar': (char) => char >= 0x11EE0 && char <= 0x11EFF,
-        // 'Tamil Supplement': (char) => char >= 0x11FC0 && char <= 0x11FFF,
-        // 'Cuneiform': (char) => char >= 0x12000 && char <= 0x123FF,
-        // 'Cuneiform Numbers and Punctuation': (char) => char >= 0x12400 && char <= 0x1247F,
-        // 'Early Dynastic Cuneiform': (char) => char >= 0x12480 && char <= 0x1254F,
-        // 'Egyptian Hieroglyphs': (char) => char >= 0x13000 && char <= 0x1342F,
-        // 'Egyptian Hieroglyph Format Controls': (char) => char >= 0x13430 && char <= 0x1343F,
-        // 'Anatolian Hieroglyphs': (char) => char >= 0x14400 && char <= 0x1467F,
-        // 'Bamum Supplement': (char) => char >= 0x16800 && char <= 0x16A3F,
-        // 'Mro': (char) => char >= 0x16A40 && char <= 0x16A6F,
-        // 'Bassa Vah': (char) => char >= 0x16AD0 && char <= 0x16AFF,
-        // 'Pahawh Hmong': (char) => char >= 0x16B00 && char <= 0x16B8F,
-        // 'Medefaidrin': (char) => char >= 0x16E40 && char <= 0x16E9F,
-        // 'Miao': (char) => char >= 0x16F00 && char <= 0x16F9F,
-        // 'Ideographic Symbols and Punctuation': (char) => char >= 0x16FE0 && char <= 0x16FFF,
-        // 'Tangut': (char) => char >= 0x17000 && char <= 0x187FF,
-        // 'Tangut Components': (char) => char >= 0x18800 && char <= 0x18AFF,
-        // 'Kana Supplement': (char) => char >= 0x1B000 && char <= 0x1B0FF,
-        // 'Kana Extended-A': (char) => char >= 0x1B100 && char <= 0x1B12F,
-        // 'Small Kana Extension': (char) => char >= 0x1B130 && char <= 0x1B16F,
-        // 'Nushu': (char) => char >= 0x1B170 && char <= 0x1B2FF,
-        // 'Duployan': (char) => char >= 0x1BC00 && char <= 0x1BC9F,
-        // 'Shorthand Format Controls': (char) => char >= 0x1BCA0 && char <= 0x1BCAF,
-        // 'Byzantine Musical Symbols': (char) => char >= 0x1D000 && char <= 0x1D0FF,
-        // 'Musical Symbols': (char) => char >= 0x1D100 && char <= 0x1D1FF,
-        // 'Ancient Greek Musical Notation': (char) => char >= 0x1D200 && char <= 0x1D24F,
-        // 'Mayan Numerals': (char) => char >= 0x1D2E0 && char <= 0x1D2FF,
-        // 'Tai Xuan Jing Symbols': (char) => char >= 0x1D300 && char <= 0x1D35F,
-        // 'Counting Rod Numerals': (char) => char >= 0x1D360 && char <= 0x1D37F,
-        // 'Mathematical Alphanumeric Symbols': (char) => char >= 0x1D400 && char <= 0x1D7FF,
-        // 'Sutton SignWriting': (char) => char >= 0x1D800 && char <= 0x1DAAF,
-        // 'Glagolitic Supplement': (char) => char >= 0x1E000 && char <= 0x1E02F,
-        // 'Nyiakeng Puachue Hmong': (char) => char >= 0x1E100 && char <= 0x1E14F,
-        // 'Wancho': (char) => char >= 0x1E2C0 && char <= 0x1E2FF,
-        // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF,
-        // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F,
-        // 'Indic Siyaq Numbers': (char) => char >= 0x1EC70 && char <= 0x1ECBF,
-        // 'Ottoman Siyaq Numbers': (char) => char >= 0x1ED00 && char <= 0x1ED4F,
-        // 'Arabic Mathematical Alphabetic Symbols': (char) => char >= 0x1EE00 && char <= 0x1EEFF,
-        // 'Mahjong Tiles': (char) => char >= 0x1F000 && char <= 0x1F02F,
-        // 'Domino Tiles': (char) => char >= 0x1F030 && char <= 0x1F09F,
-        // 'Playing Cards': (char) => char >= 0x1F0A0 && char <= 0x1F0FF,
-        // 'Enclosed Alphanumeric Supplement': (char) => char >= 0x1F100 && char <= 0x1F1FF,
-        // 'Enclosed Ideographic Supplement': (char) => char >= 0x1F200 && char <= 0x1F2FF,
-        // 'Miscellaneous Symbols and Pictographs': (char) => char >= 0x1F300 && char <= 0x1F5FF,
-        // 'Emoticons': (char) => char >= 0x1F600 && char <= 0x1F64F,
-        // 'Ornamental Dingbats': (char) => char >= 0x1F650 && char <= 0x1F67F,
-        // 'Transport and Map Symbols': (char) => char >= 0x1F680 && char <= 0x1F6FF,
-        // 'Alchemical Symbols': (char) => char >= 0x1F700 && char <= 0x1F77F,
-        // 'Geometric Shapes Extended': (char) => char >= 0x1F780 && char <= 0x1F7FF,
-        // 'Supplemental Arrows-C': (char) => char >= 0x1F800 && char <= 0x1F8FF,
-        // 'Supplemental Symbols and Pictographs': (char) => char >= 0x1F900 && char <= 0x1F9FF,
-        // 'Chess Symbols': (char) => char >= 0x1FA00 && char <= 0x1FA6F,
-        // 'Symbols and Pictographs Extended-A': (char) => char >= 0x1FA70 && char <= 0x1FAFF,
-        // 'CJK Unified Ideographs Extension B': (char) => char >= 0x20000 && char <= 0x2A6DF,
-        // 'CJK Unified Ideographs Extension C': (char) => char >= 0x2A700 && char <= 0x2B73F,
-        // 'CJK Unified Ideographs Extension D': (char) => char >= 0x2B740 && char <= 0x2B81F,
-        // 'CJK Unified Ideographs Extension E': (char) => char >= 0x2B820 && char <= 0x2CEAF,
-        // 'CJK Unified Ideographs Extension F': (char) => char >= 0x2CEB0 && char <= 0x2EBEF,
-        // 'CJK Compatibility Ideographs Supplement': (char) => char >= 0x2F800 && char <= 0x2FA1F,
-        // 'Tags': (char) => char >= 0xE0000 && char <= 0xE007F,
-        // 'Variation Selectors Supplement': (char) => char >= 0xE0100 && char <= 0xE01EF,
-        // 'Supplementary Private Use Area-A': (char) => char >= 0xF0000 && char <= 0xFFFFF,
-        // 'Supplementary Private Use Area-B': (char) => char >= 0x100000 && char <= 0x10FFFF,
-    };
-
-    var ScriptDetection = function ScriptDetection() {
-    };
-
-    ScriptDetection.allowsVerticalWritingMode = function(chars){
-        for (var i = 0, list = chars; i < list.length; i += 1) {
-            var char = list[i];
-
-            if (charHasUprightVerticalOrientation(char.charCodeAt(0))) {
-                return true;
-            }
-        }
-        return false;
-    };
-
-    ScriptDetection.allowsLetterSpacing = function(chars){
-        for (var i = 0, list = chars; i < list.length; i += 1) {
-            var char = list[i];
-
-            if (!charAllowsLetterSpacing(char.charCodeAt(0))) {
-                return false;
-            }
-        }
-        return true;
-    };
-
-    function charAllowsLetterSpacing(char) {
-        if (unicodeBlockLookup['Arabic'](char)) {
-            return false;
-        }
-        if (unicodeBlockLookup['Arabic Supplement'](char)) {
-            return false;
-        }
-        if (unicodeBlockLookup['Arabic Extended-A'](char)) {
-            return false;
-        }
-        if (unicodeBlockLookup['Arabic Presentation Forms-A'](char)) {
-            return false;
-        }
-        if (unicodeBlockLookup['Arabic Presentation Forms-B'](char)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    // The following logic comes from
-    // <http://www.unicode.org/Public/12.0.0/ucd/VerticalOrientation.txt>.
-    // Keep it synchronized with
-    // <http://www.unicode.org/Public/UCD/latest/ucd/VerticalOrientation.txt>.
-    // The data file denotes with “U” or “Tu” any codepoint that may be drawn
-    // upright in vertical text but does not distinguish between upright and
-    // “neutral” characters.
-
-    // Blocks in the Unicode supplementary planes are excluded from this module due
-    // to <https://github.com/mapbox/mapbox-gl/issues/29>.
-
-    /**
-     * Returns true if the given Unicode codepoint identifies a character with
-     * upright orientation.
-     *
-     * A character has upright orientation if it is drawn upright (unrotated)
-     * whether the line is oriented horizontally or vertically, even if both
-     * adjacent characters can be rotated. For example, a Chinese character is
-     * always drawn upright. An uprightly oriented character causes an adjacent
-     * “neutral” character to be drawn upright as well.
-     * @private
-     */
-    function charHasUprightVerticalOrientation(char) {
-        if (char === 0x02EA /* modifier letter yin departing tone mark */ ||
-            char === 0x02EB /* modifier letter yang departing tone mark */) {
-            return true;
-        }
-
-        // Return early for characters outside all ranges whose characters remain
-        // upright in vertical writing mode.
-        if (char < 0x1100) {
-            return false;
-        }
-
-        if (unicodeBlockLookup['Bopomofo Extended'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Bopomofo'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['CJK Compatibility Forms'](char)) {
-            if (!((char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F) /* wavy low line */)) {
-                return true;
-            }
-        }
-        if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['CJK Compatibility'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['CJK Radicals Supplement'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['CJK Strokes'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) {
-            if (!((char >= 0x3008 /* left angle bracket */ && char <= 0x3011) /* right black lenticular bracket */) && !((char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F) /* low double prime quotation mark */) &&
-                char !== 0x3030 /* wavy dash */) {
-                return true;
-            }
-        }
-        if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['CJK Unified Ideographs'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Hangul Compatibility Jamo'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Hangul Jamo Extended-A'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Hangul Jamo Extended-B'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Hangul Jamo'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Hangul Syllables'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Hiragana'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Ideographic Description Characters'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Kanbun'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Kangxi Radicals'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Katakana'](char)) {
-            if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) {
-                return true;
-            }
-        }
-        if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) {
-            if (char !== 0xFF08 /* fullwidth left parenthesis */ &&
-                char !== 0xFF09 /* fullwidth right parenthesis */ &&
-                char !== 0xFF0D /* fullwidth hyphen-minus */ && !((char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E) /* fullwidth greater-than sign */) &&
-                char !== 0xFF3B /* fullwidth left square bracket */ &&
-                char !== 0xFF3D /* fullwidth right square bracket */ &&
-                char !== 0xFF3F /* fullwidth low line */ && !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) &&
-                char !== 0xFFE3 /* fullwidth macron */ && !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) {
-                return true;
-            }
-        }
-        if (unicodeBlockLookup['Small Form Variants'](char)) {
-            if (!((char >= 0xFE58 /* small em dash */ && char <= 0xFE5E) /* small right tortoise shell bracket */) && !((char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66) /* small equals sign */)) {
-                return true;
-            }
-        }
-        if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics Extended'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Vertical Forms'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Yijing Hexagram Symbols'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Yi Syllables'](char)) {
-            return true;
-        }
-        if (unicodeBlockLookup['Yi Radicals'](char)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    function charInRTLScript(char) {
-        // Main blocks for Hebrew, Arabic, Thaana and other RTL scripts
-        return (char >= 0x0590 && char <= 0x08FF) ||
-            unicodeBlockLookup['Arabic Presentation Forms-A'](char) ||
-            unicodeBlockLookup['Arabic Presentation Forms-B'](char);
-    }
-
-    ScriptDetection.stringContainsRTLText = function(chars){
-        for (var i = 0, list = chars; i < list.length; i += 1) {
-            var char = list[i];
-
-            if (charInRTLScript(char.charCodeAt(0))) {
-                return true;
-            }
-        }
-        return false;
-    };
-
-    var vectorTileFeatureTypes$2 = ['Unknown', 'Point', 'LineString', 'Polygon'];
-
-    // Opacity arrays are frequently updated but don't contain a lot of information, so we pack them
-    // tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph
-    // 7 bits are for the current opacity, and the lowest bit is the target opacity
-
-    // actually defined in symbol_attributes.js
-    // const placementOpacityAttributes = [
-    //     { name: 'a_fade_opacity', components: 1, type: 'Uint32' }
-    // ];
-    var shaderOpacityAttributes = [
-        {name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0}
-    ];
-
-    function addVertex$1(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex, isSDF, pixelOffsetX, pixelOffsetY, minFontScaleX, minFontScaleY) {
-        var aSizeX = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[0])) : 0;
-        var aSizeY = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[1])) : 0;
-        array.emplaceBack(
-            // a_pos_offset
-            anchorX,
-            anchorY,
-            Math.round(ox * 32),
-            Math.round(oy * 32),
-
-            // a_data
-            tx, // x coordinate of symbol on glyph atlas texture
-            ty, // y coordinate of symbol on glyph atlas texture
-            (aSizeX << 1) + (isSDF ? 1 : 0),
-            aSizeY,
-            pixelOffsetX * 16,
-            pixelOffsetY * 16,
-            minFontScaleX * 256,
-            minFontScaleY * 256
-        );
-    }
-
-    function addDynamicAttributes(dynamicLayoutVertexArray, p, angle) {
-        dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
-        dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
-        dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
-        dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
-    }
-
-    function containsRTLText(formattedText) {
-        for (var i = 0, list = formattedText.sections; i < list.length; i += 1) {
-            var section = list[i];
-
-            if (ScriptDetection.stringContainsRTLText(section.text)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    var SymbolBuffers = function SymbolBuffers(programConfigurations) {
-        this.layoutVertexArray = new StructArrayLayout4i4ui4i24();
-        this.indexArray = new StructArrayLayout3ui6();
-        this.programConfigurations = programConfigurations;
-        this.segments = new SegmentVector();
-        this.dynamicLayoutVertexArray = new StructArrayLayout3f12();
-        this.opacityVertexArray = new StructArrayLayout1ul4();
-        this.placedSymbolArray = new PlacedSymbolArray();
-    };
-
-    SymbolBuffers.prototype.upload = function upload(context, dynamicIndexBuffer, upload$1, update) {
-        if (upload$1) {
-            this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, SymbolAttributes.symbolLayoutAttributes.members);
-            this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer);
-            this.dynamicLayoutVertexBuffer = context.createVertexBuffer(this.dynamicLayoutVertexArray, SymbolAttributes.dynamicLayoutAttributes.members, true);
-            this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true);
-            // This is a performance hack so that we can write to opacityVertexArray with uint32s
-            // even though the shaders read uint8s
-            this.opacityVertexBuffer.itemSize = 1;
-        }
-        if (upload$1 || update) {
-            this.programConfigurations.upload(context);
-        }
-    };
-
-    SymbolBuffers.prototype.destroy = function destroy() {
-        if (!this.layoutVertexBuffer) {
-            return;
-        }
-        this.layoutVertexBuffer.destroy();
-        this.indexBuffer.destroy();
-        this.programConfigurations.destroy();
-        this.segments.destroy();
-        this.dynamicLayoutVertexBuffer.destroy();
-        this.opacityVertexBuffer.destroy();
-    };
-
-    SymbolBuffers.prototype.clear = function clear() {
-
-    };
-
-    WebWorkerTransfer.register('SymbolBuffers', SymbolBuffers);
-
-    var CollisionBuffers = function CollisionBuffers(LayoutArray, layoutAttributes, IndexArray) {
-        this.layoutVertexArray = new LayoutArray();
-        this.layoutAttributes = layoutAttributes;
-        this.indexArray = new IndexArray();
-        this.segments = new SegmentVector();
-        this.collisionVertexArray = new StructArrayLayout2ub2f12();
-    };
-
-    CollisionBuffers.prototype.upload = function upload(context) {
-        this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes);
-        this.indexBuffer = context.createIndexBuffer(this.indexArray);
-        this.collisionVertexBuffer = context.createVertexBuffer(this.collisionVertexArray, collisionVertexAttributes.members, true);
-    };
-
-    CollisionBuffers.prototype.destroy = function destroy() {
-        if (!this.layoutVertexBuffer) {
-            return;
-        }
-        this.layoutVertexBuffer.destroy();
-        this.indexBuffer.destroy();
-        this.segments.destroy();
-        this.collisionVertexBuffer.destroy();
-    };
-
-    WebWorkerTransfer.register('CollisionBuffers', CollisionBuffers);
-
-    /**
-     * Unlike other buckets, which simply implement #addFeature with type-specific
-     * logic for (essentially) triangulating feature geometries, SymbolBucket
-     * requires specialized behavior:
-     *
-     * 1. WorkerTile#parse(), the logical owner of the bucket creation process,
-     *    calls SymbolBucket#populate(), which resolves text and icon tokens on
-     *    each feature, adds each glyphs and symbols needed to the passed-in
-     *    collections options.glyphDependencies and options.iconDependencies, and
-     *    stores the feature data for use in subsequent step (this.features).
-     *
-     * 2. WorkerTile asynchronously requests from the main thread all of the glyphs
-     *    and icons needed (by this bucket and any others). When glyphs and icons
-     *    have been received, the WorkerTile creates a CollisionIndex and invokes:
-     *
-     * 3. performSymbolLayout(bucket, stacks, icons) perform texts shaping and
-     *    layout on a Symbol Bucket. This step populates:
-     *      `this.symbolInstances`: metadata on generated symbols
-     *      `this.collisionBoxArray`: collision data for use by foreground
-     *      `this.text`: SymbolBuffers for text symbols
-     *      `this.icons`: SymbolBuffers for icons
-     *      `this.iconCollisionBox`: Debug SymbolBuffers for icon collision boxes
-     *      `this.textCollisionBox`: Debug SymbolBuffers for text collision boxes
-     *      `this.iconCollisionCircle`: Debug SymbolBuffers for icon collision circles
-     *      `this.textCollisionCircle`: Debug SymbolBuffers for text collision circles
-     *    The results are sent to the foreground for rendering
-     *
-     * 4. performSymbolPlacement(bucket, collisionIndex) is run on the foreground,
-     *    and uses the CollisionIndex along with current camera settings to determine
-     *    which symbols can actually show on the map. Collided symbols are hidden
-     *    using a dynamic "OpacityVertexArray".
-     *
-     * @private
-     */
-    var SymbolBucket = function SymbolBucket(options) {
-        this.collisionBoxArray = options.collisionBoxArray;
-        this.zoom = options.zoom;
-        this.overscaling = options.overscaling;
-        this.layers = options.layers;
-        this.layerIds = this.layers.map(function (layer) {
-            return layer.id;
-        });
-        this.index = options.index;
-        this.pixelRatio = options.pixelRatio;
-        this.sourceLayerIndex = options.sourceLayerIndex;
-        this.hasPattern = false;
-        this.hasPaintOverrides = false;
-        this.hasRTLText = false;
-
-        var layer = this.layers[0];
-        var unevaluatedLayoutValues = layer._unevaluatedLayout._values;
-
-        this.textSizeData = symbolSize.getSizeData(this.zoom, unevaluatedLayoutValues['text-size']);
-        this.iconSizeData = symbolSize.getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']);
-
-        var layout = this.layers[0].layout;
-        var sortKey = layout.get('symbol-sort-key');
-        var zOrder = layout.get('symbol-z-order');
-        this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined;
-        var zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey);
-        this.sortFeaturesByY = zOrderByViewportY && (layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') ||
-            layout.get('text-ignore-placement') || layout.get('icon-ignore-placement'));
-
-        if (layout.get('symbol-placement') === 'point') {
-            this.writingModes = layout.get('text-writing-mode').map(function (wm) {
-                return Shaping.WritingMode[wm];
-            });
-        }
-
-        this.stateDependentLayerIds = this.layers.filter(function (l) {
-            return l.isStateDependent();
-        }).map(function (l) {
-                return l.id;
-            });
-
-        this.sourceID = options.sourceID;
-    };
-
-    SymbolBucket.prototype.createArrays = function createArrays() {
-    //        var layout = this.layers[0].layout;
-    //        //this.hasPaintOverrides = SymbolStyleLayer.hasPaintOverrides(layout);
-    //        this.hasPaintOverrides = false;
-    //
-    //        this.text = new SymbolBuffers(new ProgramConfigurationSet(SymbolAttributes.symbolLayoutAttributes.members, this.layers, this.zoom, function (property) {
-    //            return /^text/.test(property);
-    //        }));
-    //        this.icon = new SymbolBuffers(new ProgramConfigurationSet(SymbolAttributes.symbolLayoutAttributes.members, this.layers, this.zoom, function (property) {
-    //            return /^icon/.test(property);
-    //        }));
-    //
-    //        this.textCollisionBox = new CollisionBuffers(StructArrayLayout2i2i2i12, SymbolAttributes.collisionBoxLayout.members, StructArrayLayout2ui4);
-    //        this.iconCollisionBox = new CollisionBuffers(StructArrayLayout2i2i2i12, SymbolAttributes.collisionBoxLayout.members, StructArrayLayout2ui4);
-    //        this.textCollisionCircle = new CollisionBuffers(StructArrayLayout2i2i2i12, SymbolAttributes.collisionCircleLayout.members, StructArrayLayout3ui6);
-    //        this.iconCollisionCircle = new CollisionBuffers(StructArrayLayout2i2i2i12, SymbolAttributes.collisionCircleLayout.members, StructArrayLayout3ui6);
-    //
-    //        this.glyphOffsetArray = new GlyphOffsetArray();
-    //        this.lineVertexArray = new SymbolLineVertexArray();
-    //        this.symbolInstances = new SymbolInstanceArray();
-    };
-
-    SymbolBucket.prototype.calculateGlyphDependencies = function calculateGlyphDependencies(text, stack, textAlongLine, allowVerticalPlacement, doesAllowVerticalWritingMode) {
-        for (var i = 0; i < text.length; i++) {
-            stack[text.charCodeAt(i)] = true;
-        }
-    };
-
-    SymbolBucket.prototype.populate = function populate(features, options) {
-        var layer = this.layers[0];
-        var layout = layer.layout;
-
-        var textFont = layout.get('text-font');
-        var textField = layout.get('text-field');
-        var iconImage = layout.get('icon-image');
-        var hasText =
-            (textField.value.kind !== 'constant' ||
-                (textField.value.value instanceof Formatted$1 && !textField.value.value.isEmpty()) ||
-                textField.value.value.toString().length > 0) &&
-                (textFont.value.kind !== 'constant' || textFont.value.value.length > 0);
-        // we should always resolve the icon-image value if the property was defined in the style
-        // this allows us to fire the styleimagemissing event if image evaluation returns null
-        // the only way to distinguish between null returned from a coalesce statement with no valid images
-        // and null returned because icon-image wasn't defined is to check whether or not iconImage.parameters is an empty object
-        var hasIcon = (iconImage.value.kind !== 'constant' || !!iconImage.value.value) && Object.keys(iconImage.parameters).length > 0;
-        var symbolSortKey = layout.get('symbol-sort-key');
-
-        this.features = [];
-
-        if (!hasText && !hasIcon) {
-            return;
-        }
-
-        var icons = options.iconDependencies;
-        var stacks = options.glyphDependencies;
-        var availableImages = options.availableImages;
-        var globalProperties = new EvaluationParameters$1(this.zoom);
-
-        for (var i$1 = 0, list$1 = features; i$1 < list$1.length; i$1 += 1) {
-            var ref = list$1[i$1];
-            var feature = ref.feature;
-            var index = ref.index;
-            var sourceLayerIndex = ref.sourceLayerIndex;
-
-            if (!layer._featureFilter(globalProperties, feature)) {
-                continue;
-            }
-
-            var text = (void 0);
-            if (hasText) {
-                // Expression evaluation will automatically coerce to Formatted
-                // but plain string token evaluation skips that pathway so do the
-                // conversion here.
-                var resolvedTokens = layer.getValueAndResolveTokens('text-field', feature, availableImages);
-                var formattedText = Formatted$1.factory(resolvedTokens);
-                if (containsRTLText(formattedText)) {
-                    this.hasRTLText = true;
-                }
-                if (
-                    !this.hasRTLText || // non-rtl text so can proceed safely
-                        getRTLTextPluginStatus() === 'unavailable' || // We don't intend to lazy-load the rtl text plugin, so proceed with incorrect shaping
-                        this.hasRTLText && plugin.isParsed() // Use the rtlText plugin to shape text
-                    ) {
-                    text = transformText$1(formattedText, layer, feature);
-                }
-            }
-
-            var icon = (void 0);
-            if (hasIcon) {
-                // Expression evaluation will automatically coerce to Image
-                // but plain string token evaluation skips that pathway so do the
-                // conversion here.
-                var resolvedTokens$1 = layer.getValueAndResolveTokens('icon-image', feature, availableImages);
-                if (resolvedTokens$1 instanceof ResolvedImage$1) {
-                    icon = resolvedTokens$1;
-                } else {
-                    icon = ResolvedImage$1.fromString(resolvedTokens$1);
-                }
-            }
-
-            if (!text && !icon) {
-                continue;
-            }
-
-            var sortKey = this.sortFeaturesByKey ?
-                symbolSortKey.evaluate(feature, {}) :
-                undefined;
-
-            var symbolFeature = {
-                text: text,
-                icon: icon,
-                index: index,
-                sourceLayerIndex: sourceLayerIndex,
-                geometry: loadGeometry(feature),
-                properties: feature.properties,
-                type: vectorTileFeatureTypes$2[feature.type],
-                sortKey: sortKey
-            };
-            if (typeof feature.id !== 'undefined') {
-                symbolFeature.id = feature.id;
-            }
-            this.features.push(symbolFeature);
-
-            if (icon) {
-                icons[icon.name] = true;
-            }
-
-            if (text) {
-                var fontStack = textFont.evaluate(feature, {}).join(',');
-                var textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point';
-                this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(Shaping.WritingMode.vertical) >= 0;
-                for (var i = 0, list = text.sections; i < list.length; i += 1) {
-                    var section = list[i];
-
-                    if (!section.image) {
-                        var doesAllowVerticalWritingMode = ScriptDetection.allowsVerticalWritingMode(text.toString());
-                        var sectionFont = section.fontStack || fontStack;
-                        var sectionStack = stacks[sectionFont] = stacks[sectionFont] || {};
-                        this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode);
-                    } else {
-                        // Add section image to the list of dependencies.
-                        icons[section.image.name] = true;
-                    }
-                }
-            }
-        }
-
-        if (layout.get('symbol-placement') === 'line') {
-            // Merge adjacent lines with the same text to improve labelling.
-            // It's better to place labels on one long line than on many short segments.
-            this.features = mergeLines(this.features);
-        }
-
-        if (this.sortFeaturesByKey) {
-            this.features.sort(function (a, b) {
-                // a.sortKey is always a number when sortFeaturesByKey is true
-                return ((a.sortKey   )      ) - ((b.sortKey   )      );
-            });
-        }
-    };
-
-    SymbolBucket.prototype.update = function update(states, vtLayer, imagePositions) {
-        if (!this.stateDependentLayers.length) {
-            return;
-        }
-        this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions);
-        this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions);
-    };
-
-    SymbolBucket.prototype.isEmpty = function isEmpty() {
-        // When the bucket encounters only rtl-text but the plugin isnt loaded, no symbol instances will be created.
-        // In order for the bucket to be serialized, and not discarded as an empty bucket both checks are necessary.
-        return this.symbolInstances.length === 0 && !this.hasRTLText;
-    };
-
-    SymbolBucket.prototype.uploadPending = function uploadPending() {
-        return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload;
-    };
-
-    SymbolBucket.prototype.upload = function upload(context) {
-    //        if (!this.uploaded) {
-    //            this.textCollisionBox.upload(context);
-    //            this.iconCollisionBox.upload(context);
-    //            this.textCollisionCircle.upload(context);
-    //            this.iconCollisionCircle.upload(context);
-    //        }
-    //        this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload);
-    //        this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload);
-    //        this.uploaded = true;
-    };
-
-    SymbolBucket.prototype.destroy = function destroy() {
-    //        this.text.destroy();
-    //        this.icon.destroy();
-    //        this.textCollisionBox.destroy();
-    //        this.iconCollisionBox.destroy();
-    //        this.textCollisionCircle.destroy();
-    //        this.iconCollisionCircle.destroy();
-    };
-
-    SymbolBucket.prototype.clear = function clear() {
-    };
-
-    SymbolBucket.prototype.addToLineVertexArray = function addToLineVertexArray(anchor, line) {
-        var lineStartIndex = this.lineVertexArray.length;
-        if (anchor.segment !== undefined) {
-            var sumForwardLength = anchor.dist(line[anchor.segment + 1]);
-            var sumBackwardLength = anchor.dist(line[anchor.segment]);
-            var vertices = {};
-            for (var i = anchor.segment + 1; i < line.length; i++) {
-                vertices[i] = {x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumForwardLength};
-                if (i < line.length - 1) {
-                    sumForwardLength += line[i + 1].dist(line[i]);
-                }
-            }
-            for (var i$1 = anchor.segment || 0; i$1 >= 0; i$1--) {
-                vertices[i$1] = {x: line[i$1].x, y: line[i$1].y, tileUnitDistanceFromAnchor: sumBackwardLength};
-                if (i$1 > 0) {
-                    sumBackwardLength += line[i$1 - 1].dist(line[i$1]);
-                }
-            }
-            for (var i$2 = 0; i$2 < line.length; i$2++) {
-                var vertex = vertices[i$2];
-                this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor);
-            }
-        }
-        return {
-            lineStartIndex: lineStartIndex,
-            lineLength: this.lineVertexArray.length - lineStartIndex
-        };
-    };
-
-    SymbolBucket.prototype.addSymbols = function addSymbols(arrays, quads, sizeVertex, lineOffset, alongLine, feature, writingMode, labelAnchor, lineStartIndex, lineLength, associatedIconIndex) {
-        var this$1 = this;
-
-        var indexArray = arrays.indexArray;
-        var layoutVertexArray = arrays.layoutVertexArray;
-        var dynamicLayoutVertexArray = arrays.dynamicLayoutVertexArray;
-
-        var segment = arrays.segments.prepareSegment(4 * quads.length, arrays.layoutVertexArray, arrays.indexArray, feature.sortKey);
-        var glyphOffsetArrayStart = this.glyphOffsetArray.length;
-        var vertexStartIndex = segment.vertexLength;
-
-        var angle = (this.allowVerticalPlacement && writingMode === Shaping.WritingMode.vertical) ? Math.PI / 2 : 0;
-
-        var addSymbol = function (symbol) {
-            var tl = symbol.tl,
-                tr = symbol.tr,
-                bl = symbol.bl,
-                br = symbol.br,
-                tex = symbol.tex,
-                pixelOffsetTL = symbol.pixelOffsetTL,
-                pixelOffsetBR = symbol.pixelOffsetBR,
-                mfsx = symbol.minFontScaleX,
-                mfsy = symbol.minFontScaleY;
-
-            var index = segment.vertexLength;
-
-            var y = symbol.glyphOffset[1];
-            addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex, symbol.isSDF, pixelOffsetTL.x, pixelOffsetTL.y, mfsx, mfsy);
-            addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex, symbol.isSDF, pixelOffsetBR.x, pixelOffsetTL.y, mfsx, mfsy);
-            addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex, symbol.isSDF, pixelOffsetTL.x, pixelOffsetBR.y, mfsx, mfsy);
-            addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex, symbol.isSDF, pixelOffsetBR.x, pixelOffsetBR.y, mfsx, mfsy);
-
-            addDynamicAttributes(dynamicLayoutVertexArray, labelAnchor, angle);
-
-            indexArray.emplaceBack(index, index + 1, index + 2);
-            indexArray.emplaceBack(index + 1, index + 2, index + 3);
-
-            segment.vertexLength += 4;
-            segment.primitiveLength += 2;
-
-            this$1.glyphOffsetArray.emplaceBack(symbol.glyphOffset[0]);
-        };
-
-        if (feature.text && feature.text.sections) {
-            var sections = feature.text.sections;
-
-            if (this.hasPaintOverrides) {
-                var currentSectionIndex;
-                var populatePaintArrayForSection = function (sectionIndex, lastSection) {
-                    if (currentSectionIndex !== undefined && (currentSectionIndex !== sectionIndex || lastSection)) {
-                        arrays.programConfigurations.populatePaintArrays(arrays.layoutVertexArray.length, feature, feature.index, {}, sections[currentSectionIndex]);
-                    }
-                    currentSectionIndex = sectionIndex;
-                };
-
-                for (var i = 0, list = quads; i < list.length; i += 1) {
-                    var symbol = list[i];
-
-                    populatePaintArrayForSection(symbol.sectionIndex, false);
-                    addSymbol(symbol);
-                }
-
-                // Populate paint arrays for the last section.
-                populatePaintArrayForSection(currentSectionIndex, true);
-            } else {
-                for (var i$1 = 0, list$1 = quads; i$1 < list$1.length; i$1 += 1) {
-                    var symbol$1 = list$1[i$1];
-
-                    addSymbol(symbol$1);
-                }
-                arrays.programConfigurations.populatePaintArrays(arrays.layoutVertexArray.length, feature, feature.index, {}, sections[0]);
-            }
-
-        } else {
-            for (var i$2 = 0, list$2 = quads; i$2 < list$2.length; i$2 += 1) {
-                var symbol$2 = list$2[i$2];
-
-                addSymbol(symbol$2);
-            }
-            arrays.programConfigurations.populatePaintArrays(arrays.layoutVertexArray.length, feature, feature.index, {});
-        }
-
-        arrays.placedSymbolArray.emplaceBack(labelAnchor.x, labelAnchor.y,
-            glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex,
-            lineStartIndex, lineLength, (labelAnchor.segment   ),
-            sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0,
-            lineOffset[0], lineOffset[1],
-            writingMode,
-            // placedOrientation is null initially; will be updated to horizontal(1)/vertical(2) if placed
-            0,
-            (false   ),
-            // The crossTileID is only filled/used on the foreground for dynamic text anchors
-            0,
-            associatedIconIndex
-        );
-    };
-
-    SymbolBucket.prototype._addCollisionDebugVertex = function _addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, point, anchorX, anchorY, extrude) {
-        collisionVertexArray.emplaceBack(0, 0);
-        return layoutVertexArray.emplaceBack(
-            // pos
-            point.x,
-            point.y,
-            // a_anchor_pos
-            anchorX,
-            anchorY,
-            // extrude
-            Math.round(extrude.x),
-            Math.round(extrude.y));
-    };
-
-    SymbolBucket.prototype.addCollisionDebugVertices = function addCollisionDebugVertices(x1, y1, x2, y2, arrays, boxAnchorPoint, symbolInstance, isCircle) {
-        var segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray);
-        var index = segment.vertexLength;
-
-        var layoutVertexArray = arrays.layoutVertexArray;
-        var collisionVertexArray = arrays.collisionVertexArray;
-
-        var anchorX = symbolInstance.anchorX;
-        var anchorY = symbolInstance.anchorY;
-
-        this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y1));
-        this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y1));
-        this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y2));
-        this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y2));
-
-        segment.vertexLength += 4;
-        if (isCircle) {
-            var indexArray = (arrays.indexArray   );
-            indexArray.emplaceBack(index, index + 1, index + 2);
-            indexArray.emplaceBack(index, index + 2, index + 3);
-
-            segment.primitiveLength += 2;
-        } else {
-            var indexArray$1 = (arrays.indexArray   );
-            indexArray$1.emplaceBack(index, index + 1);
-            indexArray$1.emplaceBack(index + 1, index + 2);
-            indexArray$1.emplaceBack(index + 2, index + 3);
-            indexArray$1.emplaceBack(index + 3, index);
-
-            segment.primitiveLength += 4;
-        }
-    };
-
-    SymbolBucket.prototype.addDebugCollisionBoxes = function addDebugCollisionBoxes(startIndex, endIndex, symbolInstance, isText) {
-        for (var b = startIndex; b < endIndex; b++) {
-            var box = (this.collisionBoxArray.get(b)   );
-            var x1 = box.x1;
-            var y1 = box.y1;
-            var x2 = box.x2;
-            var y2 = box.y2;
-
-            // If the radius > 0, this collision box is actually a circle
-            // The data we add to the buffers is exactly the same, but we'll render with a different shader.
-            var isCircle = box.radius > 0;
-            this.addCollisionDebugVertices(x1, y1, x2, y2, isCircle ?
-                (isText ? this.textCollisionCircle : this.iconCollisionCircle) : (isText ? this.textCollisionBox : this.iconCollisionBox),
-                box.anchorPoint, symbolInstance, isCircle);
-        }
-    };
-
-    SymbolBucket.prototype.generateCollisionDebugBuffers = function generateCollisionDebugBuffers() {
-        for (var i = 0; i < this.symbolInstances.length; i++) {
-            var symbolInstance = this.symbolInstances.get(i);
-            this.addDebugCollisionBoxes(symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance, true);
-            this.addDebugCollisionBoxes(symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance, true);
-            this.addDebugCollisionBoxes(symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance, false);
-            this.addDebugCollisionBoxes(symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex, symbolInstance, false);
-        }
-    };
-
-    // These flat arrays are meant to be quicker to iterate over than the source
-    // CollisionBoxArray
-    SymbolBucket.prototype._deserializeCollisionBoxesForSymbol = function _deserializeCollisionBoxesForSymbol(collisionBoxArray, textStartIndex, textEndIndex, verticalTextStartIndex, verticalTextEndIndex, iconStartIndex, iconEndIndex, verticalIconStartIndex, verticalIconEndIndex) {
-
-        var collisionArrays = {};
-        for (var k = textStartIndex; k < textEndIndex; k++) {
-            var box = (collisionBoxArray.get(k)   );
-            if (box.radius === 0) {
-                collisionArrays.textBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY};
-                collisionArrays.textFeatureIndex = box.featureIndex;
-                break; // Only one box allowed per instance
-            } else {
-                if (!collisionArrays.textCircles) {
-                    collisionArrays.textCircles = [];
-                    collisionArrays.textFeatureIndex = box.featureIndex;
-                }
-                var used = 1; // May be updated at collision detection time
-                collisionArrays.textCircles.push(box.anchorPointX, box.anchorPointY, box.radius, box.signedDistanceFromAnchor, used);
-            }
-        }
-        for (var k$1 = verticalTextStartIndex; k$1 < verticalTextEndIndex; k$1++) {
-            var box$1 = (collisionBoxArray.get(k$1)   );
-            if (box$1.radius === 0) {
-                collisionArrays.verticalTextBox = {x1: box$1.x1, y1: box$1.y1, x2: box$1.x2, y2: box$1.y2, anchorPointX: box$1.anchorPointX, anchorPointY: box$1.anchorPointY};
-                collisionArrays.verticalTextFeatureIndex = box$1.featureIndex;
-                break; // Only one box allowed per instance
-            }
-        }
-        for (var k$2 = iconStartIndex; k$2 < iconEndIndex; k$2++) {
-            // An icon can only have one box now, so this indexing is a bit vestigial...
-            var box$2 = (collisionBoxArray.get(k$2)   );
-            if (box$2.radius === 0) {
-                collisionArrays.iconBox = {x1: box$2.x1, y1: box$2.y1, x2: box$2.x2, y2: box$2.y2, anchorPointX: box$2.anchorPointX, anchorPointY: box$2.anchorPointY};
-                collisionArrays.iconFeatureIndex = box$2.featureIndex;
-                break; // Only one box allowed per instance
-            }
-        }
-        for (var k$3 = verticalIconStartIndex; k$3 < verticalIconEndIndex; k$3++) {
-            // An icon can only have one box now, so this indexing is a bit vestigial...
-            var box$3 = (collisionBoxArray.get(k$3)   );
-            if (box$3.radius === 0) {
-                collisionArrays.verticalIconBox = {x1: box$3.x1, y1: box$3.y1, x2: box$3.x2, y2: box$3.y2, anchorPointX: box$3.anchorPointX, anchorPointY: box$3.anchorPointY};
-                collisionArrays.verticalIconFeatureIndex = box$3.featureIndex;
-                break; // Only one box allowed per instance
-            }
-        }
-        return collisionArrays;
-    };
-
-    SymbolBucket.prototype.deserializeCollisionBoxes = function deserializeCollisionBoxes(collisionBoxArray) {
-        this.collisionArrays = [];
-        for (var i = 0; i < this.symbolInstances.length; i++) {
-            var symbolInstance = this.symbolInstances.get(i);
-            this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol(
-                collisionBoxArray,
-                symbolInstance.textBoxStartIndex,
-                symbolInstance.textBoxEndIndex,
-                symbolInstance.verticalTextBoxStartIndex,
-                symbolInstance.verticalTextBoxEndIndex,
-                symbolInstance.iconBoxStartIndex,
-                symbolInstance.iconBoxEndIndex,
-                symbolInstance.verticalIconBoxStartIndex,
-                symbolInstance.verticalIconBoxEndIndex
-            ));
-        }
-    };
-
-    SymbolBucket.prototype.hasTextData = function hasTextData() {
-        return this.text.segments.get().length > 0;
-    };
-
-    SymbolBucket.prototype.hasIconData = function hasIconData() {
-        return this.icon.segments.get().length > 0;
-    };
-
-    SymbolBucket.prototype.hasTextCollisionBoxData = function hasTextCollisionBoxData() {
-        return this.textCollisionBox.segments.get().length > 0;
-    };
-
-    SymbolBucket.prototype.hasIconCollisionBoxData = function hasIconCollisionBoxData() {
-        return this.iconCollisionBox.segments.get().length > 0;
-    };
-
-    SymbolBucket.prototype.hasTextCollisionCircleData = function hasTextCollisionCircleData() {
-        return this.textCollisionCircle.segments.get().length > 0;
-    };
-
-    SymbolBucket.prototype.hasIconCollisionCircleData = function hasIconCollisionCircleData() {
-        return this.iconCollisionCircle.segments.get().length > 0;
-    };
-
-    SymbolBucket.prototype.addIndicesForPlacedSymbol = function addIndicesForPlacedSymbol(iconOrText, placedSymbolIndex) {
-        var placedSymbol = iconOrText.placedSymbolArray.get(placedSymbolIndex);
-
-        var endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4;
-        for (var vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) {
-            iconOrText.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2);
-            iconOrText.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3);
-        }
-    };
-
-    SymbolBucket.prototype.getSortedSymbolIndexes = function getSortedSymbolIndexes(angle) {
-        if (this.sortedAngle === angle && this.symbolInstanceIndexes !== undefined) {
-            return this.symbolInstanceIndexes;
-        }
-        var sin = Math.sin(angle);
-        var cos = Math.cos(angle);
-        var rotatedYs = [];
-        var featureIndexes = [];
-        var result = [];
-
-        for (var i = 0; i < this.symbolInstances.length; ++i) {
-            result.push(i);
-            var symbolInstance = this.symbolInstances.get(i);
-            rotatedYs.push(Math.round(sin * symbolInstance.anchorX + cos * symbolInstance.anchorY) | 0);
-            featureIndexes.push(symbolInstance.featureIndex);
-        }
-
-        result.sort(function (aIndex, bIndex) {
-            return (rotatedYs[aIndex] - rotatedYs[bIndex]) ||
-                (featureIndexes[bIndex] - featureIndexes[aIndex]);
-        });
-
-        return result;
-    };
-
-    SymbolBucket.prototype.sortFeatures = function sortFeatures(angle) {
-        var this$1 = this;
-
-        if (!this.sortFeaturesByY) {
-            return;
-        }
-        if (this.sortedAngle === angle) {
-            return;
-        }
-
-        // The current approach to sorting doesn't sort across segments so don't try.
-        // Sorting within segments separately seemed not to be worth the complexity.
-        if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1) {
-            return;
-        }
-
-        // If the symbols are allowed to overlap sort them by their vertical screen position.
-        // The index array buffer is rewritten to reference the (unchanged) vertices in the
-        // sorted order.
-
-        // To avoid sorting the actual symbolInstance array we sort an array of indexes.
-        this.symbolInstanceIndexes = this.getSortedSymbolIndexes(angle);
-        this.sortedAngle = angle;
-
-        this.text.indexArray.clear();
-        this.icon.indexArray.clear();
-
-        this.featureSortOrder = [];
-
-        for (var i$1 = 0, list = this.symbolInstanceIndexes; i$1 < list.length; i$1 += 1) {
-            var i = list[i$1];
-
-            var symbolInstance = this.symbolInstances.get(i);
-            this.featureSortOrder.push(symbolInstance.featureIndex);
-
-            [
-                symbolInstance.rightJustifiedTextSymbolIndex,
-                symbolInstance.centerJustifiedTextSymbolIndex,
-                symbolInstance.leftJustifiedTextSymbolIndex
-            ].forEach(function (index, i, array) {
-                    // Only add a given index the first time it shows up,
-                    // to avoid duplicate opacity entries when multiple justifications
-                    // share the same glyphs.
-                    if (index >= 0 && array.indexOf(index) === i) {
-                        this$1.addIndicesForPlacedSymbol(this$1.text, index);
-                    }
-                });
-
-            if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) {
-                this.addIndicesForPlacedSymbol(this.text, symbolInstance.verticalPlacedTextSymbolIndex);
-            }
-
-            if (symbolInstance.placedIconSymbolIndex >= 0) {
-                this.addIndicesForPlacedSymbol(this.icon, symbolInstance.placedIconSymbolIndex);
-            }
-
-            if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) {
-                this.addIndicesForPlacedSymbol(this.icon, symbolInstance.verticalPlacedIconSymbolIndex);
-            }
-        }
-
-        if (this.text.indexBuffer) {
-            this.text.indexBuffer.updateData(this.text.indexArray);
-        }
-        if (this.icon.indexBuffer) {
-            this.icon.indexBuffer.updateData(this.icon.indexArray);
-        }
-    };
-
-    WebWorkerTransfer.register('SymbolBucket', SymbolBucket, {
-        //omit: ['layers', 'collisionBoxArray', 'features', 'compareText']
-        omit: ['layers', 'collisionBoxArray', 'compareText']
-    });
-
-    // this constant is based on the size of StructArray indexes used in a symbol
-    // bucket--namely, glyphOffsetArrayStart
-    // eg the max valid UInt16 is 65,535
-    // See https://github.com/mapbox/mapbox-gl-js/issues/2907 for motivation
-    // lineStartIndex and textBoxStartIndex could potentially be concerns
-    // but we expect there to be many fewer boxes/lines than glyphs
-    SymbolBucket.MAX_GLYPHS = 65535;
-
-    SymbolBucket.addDynamicAttributes = addDynamicAttributes;
-
-    var ColorType$7 = {kind: 'color'};
-    var FormattedType$4 = {kind: 'formatted'};
-
-    var layout$7 = new Properties({
-        "symbol-placement": new DataConstantProperty(StyleSpec["layout_symbol"]["symbol-placement"]),
-        "symbol-spacing": new DataConstantProperty(StyleSpec["layout_symbol"]["symbol-spacing"]),
-        "symbol-avoid-edges": new DataConstantProperty(StyleSpec["layout_symbol"]["symbol-avoid-edges"]),
-        "symbol-sort-key": new DataDrivenProperty(StyleSpec["layout_symbol"]["symbol-sort-key"]),
-        "symbol-z-order": new DataConstantProperty(StyleSpec["layout_symbol"]["symbol-z-order"]),
-        "icon-allow-overlap": new DataConstantProperty(StyleSpec["layout_symbol"]["icon-allow-overlap"]),
-        "icon-ignore-placement": new DataConstantProperty(StyleSpec["layout_symbol"]["icon-ignore-placement"]),
-        "icon-optional": new DataConstantProperty(StyleSpec["layout_symbol"]["icon-optional"]),
-        "icon-rotation-alignment": new DataConstantProperty(StyleSpec["layout_symbol"]["icon-rotation-alignment"]),
-        "icon-size": new DataDrivenProperty(StyleSpec["layout_symbol"]["icon-size"]),
-        "icon-text-fit": new DataConstantProperty(StyleSpec["layout_symbol"]["icon-text-fit"]),
-        "icon-text-fit-padding": new DataConstantProperty(StyleSpec["layout_symbol"]["icon-text-fit-padding"]),
-        "icon-image": new DataDrivenProperty(StyleSpec["layout_symbol"]["icon-image"]),
-        "icon-rotate": new DataDrivenProperty(StyleSpec["layout_symbol"]["icon-rotate"]),
-        "icon-padding": new DataConstantProperty(StyleSpec["layout_symbol"]["icon-padding"]),
-        "icon-keep-upright": new DataConstantProperty(StyleSpec["layout_symbol"]["icon-keep-upright"]),
-        "icon-offset": new DataDrivenProperty(StyleSpec["layout_symbol"]["icon-offset"]),
-        "icon-anchor": new DataDrivenProperty(StyleSpec["layout_symbol"]["icon-anchor"]),
-        "icon-pitch-alignment": new DataConstantProperty(StyleSpec["layout_symbol"]["icon-pitch-alignment"]),
-        "text-pitch-alignment": new DataConstantProperty(StyleSpec["layout_symbol"]["text-pitch-alignment"]),
-        "text-rotation-alignment": new DataConstantProperty(StyleSpec["layout_symbol"]["text-rotation-alignment"]),
-        "text-field": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-field"]),
-        "text-font": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-font"]),
-        "text-size": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-size"]),
-        "text-max-width": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-max-width"]),
-        "text-line-height": new DataConstantProperty(StyleSpec["layout_symbol"]["text-line-height"]),
-        "text-letter-spacing": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-letter-spacing"]),
-        "text-justify": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-justify"]),
-        "text-radial-offset": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-radial-offset"]),
-        "text-variable-anchor": new DataConstantProperty(StyleSpec["layout_symbol"]["text-variable-anchor"]),
-        "text-anchor": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-anchor"]),
-        "text-max-angle": new DataConstantProperty(StyleSpec["layout_symbol"]["text-max-angle"]),
-        "text-writing-mode": new DataConstantProperty(StyleSpec["layout_symbol"]["text-writing-mode"]),
-        "text-rotate": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-rotate"]),
-        "text-padding": new DataConstantProperty(StyleSpec["layout_symbol"]["text-padding"]),
-        "text-keep-upright": new DataConstantProperty(StyleSpec["layout_symbol"]["text-keep-upright"]),
-        "text-transform": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-transform"]),
-        "text-offset": new DataDrivenProperty(StyleSpec["layout_symbol"]["text-offset"]),
-        "text-allow-overlap": new DataConstantProperty(StyleSpec["layout_symbol"]["text-allow-overlap"]),
-        "text-ignore-placement": new DataConstantProperty(StyleSpec["layout_symbol"]["text-ignore-placement"]),
-        "text-optional": new DataConstantProperty(StyleSpec["layout_symbol"]["text-optional"])
-    });
-
-
-    var paint$7 = new Properties({
-        "icon-opacity": new DataDrivenProperty(StyleSpec["paint_symbol"]["icon-opacity"]),
-        "icon-color": new DataDrivenProperty(StyleSpec["paint_symbol"]["icon-color"]),
-        "icon-halo-color": new DataDrivenProperty(StyleSpec["paint_symbol"]["icon-halo-color"]),
-        "icon-halo-width": new DataDrivenProperty(StyleSpec["paint_symbol"]["icon-halo-width"]),
-        "icon-halo-blur": new DataDrivenProperty(StyleSpec["paint_symbol"]["icon-halo-blur"]),
-        "icon-translate": new DataConstantProperty(StyleSpec["paint_symbol"]["icon-translate"]),
-        "icon-translate-anchor": new DataConstantProperty(StyleSpec["paint_symbol"]["icon-translate-anchor"]),
-        "text-opacity": new DataDrivenProperty(StyleSpec["paint_symbol"]["text-opacity"]),
-        "text-color": new DataDrivenProperty(StyleSpec["paint_symbol"]["text-color"], { runtimeType: ColorType$7, getOverride: function (o) {
-            return o.textColor;
-        }, hasOverride: function (o) {
-            return !!o.textColor;
-        } }),
-        "text-halo-color": new DataDrivenProperty(StyleSpec["paint_symbol"]["text-halo-color"]),
-        "text-halo-width": new DataDrivenProperty(StyleSpec["paint_symbol"]["text-halo-width"]),
-        "text-halo-blur": new DataDrivenProperty(StyleSpec["paint_symbol"]["text-halo-blur"]),
-        "text-translate": new DataConstantProperty(StyleSpec["paint_symbol"]["text-translate"]),
-        "text-translate-anchor": new DataConstantProperty(StyleSpec["paint_symbol"]["text-translate-anchor"])
-    });
-
-    // Note: without adding the explicit type annotation, Flow infers weaker types
-    // for these objects from their use in the constructor to StyleLayer, as
-    // {layout?: Properties<...>, paint: Properties<...>}
-    var properties$6 = ({ paint: paint$7, layout: layout$7 }
-        );
-
-    var SymbolStyleLayer = /*@__PURE__*/(function (StyleLayer) {
-        function SymbolStyleLayer(layer) {
-            StyleLayer.call(this, layer, properties$6);
-        }
-
-        if (StyleLayer) SymbolStyleLayer.__proto__ = StyleLayer;
-        SymbolStyleLayer.prototype = Object.create(StyleLayer && StyleLayer.prototype);
-        SymbolStyleLayer.prototype.constructor = SymbolStyleLayer;
-
-        SymbolStyleLayer.prototype.recalculate = function recalculate(parameters, availableImages) {
-            StyleLayer.prototype.recalculate.call(this, parameters, availableImages);
-
-            if (this.layout.get('icon-rotation-alignment') === 'auto') {
-                if (this.layout.get('symbol-placement') !== 'point') {
-                    this.layout._values['icon-rotation-alignment'] = 'map';
-                } else {
-                    this.layout._values['icon-rotation-alignment'] = 'viewport';
-                }
-            }
-
-            if (this.layout.get('text-rotation-alignment') === 'auto') {
-                if (this.layout.get('symbol-placement') !== 'point') {
-                    this.layout._values['text-rotation-alignment'] = 'map';
-                } else {
-                    this.layout._values['text-rotation-alignment'] = 'viewport';
-                }
-            }
-
-            // If unspecified, `*-pitch-alignment` inherits `*-rotation-alignment`
-            if (this.layout.get('text-pitch-alignment') === 'auto') {
-                this.layout._values['text-pitch-alignment'] = this.layout.get('text-rotation-alignment');
-            }
-            if (this.layout.get('icon-pitch-alignment') === 'auto') {
-                this.layout._values['icon-pitch-alignment'] = this.layout.get('icon-rotation-alignment');
-            }
-
-            if (this.layout.get('symbol-placement') === 'point') {
-                var writingModes = this.layout.get('text-writing-mode');
-                if (writingModes) {
-                    // remove duplicates, preserving order
-                    var deduped = [];
-                    for (var i = 0, list = writingModes; i < list.length; i += 1) {
-                        var m = list[i];
-
-                        if (deduped.indexOf(m) < 0) {
-                            deduped.push(m);
-                        }
-                    }
-                    this.layout._values['text-writing-mode'] = deduped;
-                } else {
-                    this.layout._values['text-writing-mode'] = ['horizontal'];
-                }
-            }
-
-            this._setPaintOverrides();
-        };
-
-        SymbolStyleLayer.prototype.getValueAndResolveTokens = function getValueAndResolveTokens(name, feature, availableImages) {
-            var value = this.layout.get(name).evaluate(feature, {}, availableImages);
-            var unevaluated = this._unevaluatedLayout._values[name];
-            if (!unevaluated.isDataDriven() && !Expression.isExpression(unevaluated.value) && value) {
-                return Util.resolveTokens(feature.properties, value);
-            }
-
-            return value;
-        };
-
-        SymbolStyleLayer.prototype.createBucket = function createBucket(parameters) {
-            return new SymbolBucket(parameters);
-        };
-
-        SymbolStyleLayer.prototype.queryRadius = function queryRadius() {
-            return 0;
-        };
-
-        SymbolStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature() {
-            assert_1(false); // Should take a different path in FeatureIndex
-            return false;
-        };
-
-        SymbolStyleLayer.prototype._setPaintOverrides = function _setPaintOverrides() {
-            for (var i = 0, list = properties$6.paint.overridableProperties; i < list.length; i += 1) {
-                var overridable = list[i];
-
-                if (!SymbolStyleLayer.hasPaintOverride(this.layout, overridable)) {
-                    continue;
-                }
-                var overriden = this.paint.get(overridable);
-                var override = new FormatSectionOverride(overriden);
-                var styleExpression = new StyleExpression(override, overriden.property.specification);
-                var expression = null;
-                if (overriden.value.kind === 'constant' || overriden.value.kind === 'source') {
-                    expression = (new ZoomConstantExpression('source', styleExpression)                  );
-                } else {
-                    expression = (new ZoomDependentExpression('composite',
-                        styleExpression,
-                        overriden.value.zoomStops,
-                        overriden.value._interpolationType)                     );
-                }
-                this.paint._values[overridable] = new PossiblyEvaluatedPropertyValue(overriden.property,
-                    expression,
-                    overriden.parameters);
-            }
-        };
-
-        SymbolStyleLayer.prototype._handleOverridablePaintPropertyUpdate = function _handleOverridablePaintPropertyUpdate(name, oldValue, newValue) {
-            if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) {
-                return false;
-            }
-            return SymbolStyleLayer.hasPaintOverride(this.layout, name);
-        };
-
-        SymbolStyleLayer.hasPaintOverride = function hasPaintOverride(layout, propertyName) {
-            var textField = layout.get('text-field');
-            var property = properties$6.paint.properties[propertyName];
-            var hasOverrides = false;
-
-            var checkSections = function (sections) {
-                for (var i = 0, list = sections; i < list.length; i += 1) {
-                    var section = list[i];
-
-                    if (property.overrides && property.overrides.hasOverride(section)) {
-                        hasOverrides = true;
-                        return;
-                    }
-                }
-            };
-
-            if (textField.value.kind === 'constant' && textField.value.value instanceof Formatted$1) {
-                checkSections(textField.value.value.sections);
-            } else if (textField.value.kind === 'source') {
-
-                var checkExpression = function (expression) {
-                    if (hasOverrides) {
-                        return;
-                    }
-
-                    if (expression instanceof Literal && Values$1.typeOf(expression.value) === FormattedType$4) {
-                        var formatted = ((expression.value)     );
-                        checkSections(formatted.sections);
-                    } else if (expression instanceof FormatExpression$1) {
-                        checkSections(expression.sections);
-                    } else {
-                        expression.eachChild(checkExpression);
-                    }
-                };
-
-                var expr = ((textField.value)     );
-                if (expr._styleExpression) {
-                    checkExpression(expr._styleExpression.expression);
-                }
-            }
-
-            return hasOverrides;
-        };
-
-        SymbolStyleLayer.hasPaintOverrides = function hasPaintOverrides(layout) {
-            for (var i = 0, list = properties$6.paint.overridableProperties; i < list.length; i += 1) {
-                var overridable = list[i];
-
-                if (SymbolStyleLayer.hasPaintOverride(layout, overridable)) {
-                    return true;
-                }
-            }
-            return false;
-        };
-
-        return SymbolStyleLayer;
-    }(StyleLayer));
-
-    var subclasses = {
-        circle: CircleStyleLayer,
-        fill: FillStyleLayer,
-        line: LineStyleLayer,
-        symbol : SymbolStyleLayer
-    };
-
-    function createStyleLayer(layer) {
-        if(subclasses[layer.type]){
-            return new subclasses[layer.type](layer);
-        }
-        else{
-            return null;
-        }
-    }
-
-    var StyleLayerIndex = function StyleLayerIndex(layerConfigs) {
-        this.keyCache = {};
-        if (layerConfigs) {
-            this.replace(layerConfigs);
-        }
-    };
-
-    StyleLayerIndex.prototype.replace = function replace (layerConfigs) {
-        this._layerConfigs = {};
-        this._layers = {};
-        this.update(layerConfigs, []);
-    };
-
-    function values(obj) {
-        var result = [];
-        for (var k in obj) {
-            result.push(obj[k]);
-        }
-        return result;
-    }
-
-    StyleLayerIndex.prototype.update = function update (layerConfigs, removedIds) {
-        var this$1 = this;
-
-        for (var i = 0, list = layerConfigs; i < list.length; i += 1) {
-            var layerConfig = list[i];
-
-            this._layerConfigs[layerConfig.id] = layerConfig;
-
-            var layer = createStyleLayer(layerConfig);
-            if(layer == null){
-                continue;
-            }
-            this._layers[layerConfig.id] = layer;
-            layer._featureFilter = featureFilter.createFilter(layer.filter);
-            if (this.keyCache[layerConfig.id])
-            { delete this.keyCache[layerConfig.id]; }
-        }
-        for (var i$1 = 0, list$1 = removedIds; i$1 < list$1.length; i$1 += 1) {
-            var id = list$1[i$1];
-
-            delete this.keyCache[id];
-            delete this._layerConfigs[id];
-            delete this._layers[id];
-        }
-
-        this.familiesBySource = {};
-
-        var groups = groupByLayout(values(this._layerConfigs), this.keyCache);
-
-        for (var i$2 = 0, list$2 = groups; i$2 < list$2.length; i$2 += 1) {
-            var layerConfigs$1 = list$2[i$2];
-
-            var layers = layerConfigs$1.map(function (layerConfig) { return this$1._layers[layerConfig.id]; });
-
-            var layer$1 = layers[0];
-            if (layer$1 == undefined || layer$1.visibility === 'none') {
-                continue;
-            }
-
-            var sourceId = layer$1.source || '';
-            var sourceGroup = this.familiesBySource[sourceId];
-            if (!sourceGroup) {
-                sourceGroup = this.familiesBySource[sourceId] = {};
-            }
-
-            var sourceLayerId = layer$1.sourceLayer;
-            var sourceLayerFamilies = sourceGroup[sourceLayerId];
-            if (!sourceLayerFamilies) {
-                sourceLayerFamilies = sourceGroup[sourceLayerId] = [];
-            }
-
-            sourceLayerFamilies.push(layers);
-        }
-    };
-
-    WebWorkerTransfer.register('FeatureIndex', FeatureIndex, {omit: ['rawTileData', 'sourceLayerCoder']});
-
-    function MVTWorkTile(parameters, transferableObjects) {
-        var pbfData = parameters.pbfData;
-        var layers = parameters.layers;
-        var imageMap = parameters.imageMap;
-        var serializeObj = WebWorkerTransfer.deserialize(parameters.serializeObj);
-        var featureIndex = serializeObj.featureIndex;
-        var zoom = parameters.tileID.z;
-        if(!when.defined(featureIndex)){
-            featureIndex = new FeatureIndex(parameters.tileID);
-            featureIndex.bucketLayerIDs = [];
-        }
-        var result = {};
-        try {
-            var styleIndexLayer = new StyleLayerIndex(layers);
-            var vectorTile = loadVectorTile(pbfData);
-            result = parse(vectorTile, styleIndexLayer, imageMap, featureIndex, zoom, parameters.indexData);
-            result = WebWorkerTransfer.serialize(result, transferableObjects);
-        }
-        catch (err) {
-        }
-        result.pickId = parameters.pickId;
-        return result;
-    }
-
-    function loadVectorTile(rawData) {
-        if (!when.defined(rawData)) {
-            return;
-        }
-        return new VectorTile(new pbf.Protobuf(rawData));
-    }
-
-    function parse(vectorTile, layerIndex, imageMap, featureIndex, zoom, indexData) {
-        var sourceLayerCoder = new DictionaryCoder(Object.keys(vectorTile.layers).sort());
-        var buckets = {};
-        var options = {
-            featureIndex: featureIndex,
-            iconDependencies: {},
-            patternDependencies: {},
-            glyphDependencies: {},
-            //availableImages: availableImages
-        };
-
-        for (var source in layerIndex.familiesBySource) {
-            //if (source == "") continue;
-            var layerFamilies = layerIndex.familiesBySource[source];
-            for (var sourceLayerId in layerFamilies) {
-                var sourceLayer = vectorTile.layers[sourceLayerId];
-                if (!sourceLayer) {
-                    continue;
-                }
-
-                var sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId);
-                var features = [];
-                for (var index = 0; index < sourceLayer.length; index++) {
-                    var feature = sourceLayer.feature(index);
-                    features.push({feature: feature, index: index, sourceLayerIndex: sourceLayerIndex});
-                }
-
-                for (var i = 0, list = layerFamilies[sourceLayerId]; i < list.length; i += 1) {
-                    var family = list[i];
-                    var layer = family[0];
-    //                    if(defined(layer.minzoom) && zoom < Math.floor(layer.minzoom)){
-    //                        continue;
-    //                    }
-    //                    if(defined(layer.maxzoom) && zoom >= layer.maxzoom){
-    //                        continue;
-    //                    }
-                    if (layer.visibility === 'none') {
-                        continue;
-                    }
-
-                    //recalculateLayers(family, this.zoom, availableImages);
-                    recalculateLayers(family, 0, null);
-                    var bucketName = layer.id;
-                    var bucket = buckets[bucketName] = layer.createBucket({
-                        index: featureIndex.bucketLayerIDs.length,
-                        layers: family,
-    //                    zoom: this.zoom,
-    //                    pixelRatio: this.pixelRatio,
-    //                    overscaling : this.overscaling,
-    //                    collisionBoxArray: this.collisionBoxArray,
-                        sourceLayerIndex: sourceLayerIndex,
-                        //sourceID: this.source
-                    });
-
-                    if (when.defined(indexData) && when.defined(indexData[layer.id])) {
-                        options.indexData = indexData[layer.id];
-                    }
-                    bucket.populate(features, options);
-                    featureIndex.bucketLayerIDs.push(family.map(function (l) { return l.id; }));
-                }
-            }
-        }
-
-        var imageAtlas = null;
-
-        for (var key in buckets) {
-            var bucket = buckets[key];
-            if (bucket.hasPattern &&
-                (bucket instanceof LineBucket || bucket instanceof FillBucket)) {
-                //recalculateLayers(bucket.layers, this.zoom, availableImages);
-                if(imageAtlas == null){
-                    imageAtlas = new ImageAtlas({}, imageMap);
-                }
-                bucket.addFeatures(options, imageAtlas.patternPositions);
-            }
-        }
-
-        return {
-            buckets : buckets,
-            imageAtlas : imageAtlas,
-            featureIndex : featureIndex
-        };
-    }
-
-    function recalculateLayers(layers, zoom, availableImages) {
-        // Layers are shared and may have been used by a WorkerTile with a different zoom.
-        var parameters = new EvaluationParameters$1(zoom);
-        for (var i = 0, list = layers; i < list.length; i += 1) {
-            var layer = list[i];
-            layer.recalculate(parameters, availableImages);
-        }
-    }
-
-    var MVTWorkTile$1 = createTaskProcessorWorker(MVTWorkTile);
-
-    return MVTWorkTile$1;
-
-});
diff --git a/public/libs/Cesium/Workers/MVTWorker.js b/public/libs/Cesium/Workers/MVTWorker.js
deleted file mode 100644
index cf7a877..0000000
--- a/public/libs/Cesium/Workers/MVTWorker.js
+++ /dev/null
@@ -1,13334 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './FeatureDetection-7bd32c34', './createTaskProcessorWorker', './Color-69f1845f', './pbf-9fe59c76'], function (when, Check, _Math, FeatureDetection, createTaskProcessorWorker, Color, pbf) { 'use strict';
-
-    // 用来根据Mapbox style标准构建过滤器和定义过滤方法
-    function MvtFilter() {
-    }
-
-    /**
-     * 根据根据Mapbox style的过滤器对象构造过滤条件
-     * @param filter 输入过滤器
-     * @returns 返回过滤条件数组
-     */
-    MvtFilter.parseLayerFilter = function(filter) {
-        if (!when.defined(filter) || !(filter instanceof Array)) {
-            return null;
-        }
-
-        var filterArray = [];
-        var condition;
-        if (isOperator(filter[0])) {
-            condition = parseSingleFilterArray(filter);
-            if(when.defined(condition)){
-                filterArray.push(condition);
-            }
-        }
-        else{
-            for (var fi = 0; fi < filter.length; fi++) {
-                if (!(filter[fi] instanceof Array)) {
-                    continue;
-                }
-
-                if (filter[fi].length !== 3) {
-                    for (var fj = 0; fj < filter[fi].length; fj++) {
-                        if (filter[fi][fj] instanceof Array && filter[fi][fj].length === 3) {
-                            condition = parseSingleFilterArray(filter[fi][fj]);
-                            if(when.defined(condition)){
-                                filterArray.push(condition);
-                            }
-                        }
-                    }
-                } else {
-                    condition = parseSingleFilterArray(filter[fi]);
-                    if(when.defined(condition)){
-                        filterArray.push(condition);
-                    }
-                }
-
-            }
-        }
-        return filterArray;
-    };
-
-    /**
-     * 根据对象的属性进行过滤条件测试
-     * @param filterArray 过滤条件数组
-     * @param properties 对象属性
-     * @returns 通过过滤条件返回true
-     */
-    MvtFilter.filterTest = function(properties, filterArray) {
-        for(var filterIdx = 0, filterCount = filterArray.length; filterIdx < filterCount; filterIdx++){
-            var filter = filterArray[filterIdx];
-            if(!compareFunctions[filter.filterOperator](properties, filter.filterFieldName, filter.filterCompareValue)){
-                return false;
-            }
-        }
-        return true;
-    };
-
-    function parseSingleFilterArray(filterArray){
-        var filterCompareValue = null;
-        var filterFieldName = null;
-        var filterOperator = null;
-        if (isOperator(filterArray[0])) {
-            filterOperator = filterArray[0];
-        }
-        else{
-            return null;
-        }
-
-        if(filterArray.length > 1){
-            filterFieldName = filterArray[1];
-            // TODO: 系统字段暂不处理
-            if(filterFieldName[0] === "$" ){
-                return null;
-            }
-        }
-        if(filterArray.length > 2){
-            filterCompareValue = filterArray[2];
-        }
-        return {
-            filterOperator : filterOperator,
-            filterFieldName : filterFieldName,
-            filterCompareValue : filterCompareValue
-        };
-    }
-
-    function isOperator(key) {
-        return ["==", "===", ">=", "<=", ">", "<", "!=", "has"].indexOf(key) !== -1;
-    }
-
-    function equalFunction(properties, fieldName, testValue){
-        return properties[fieldName] == testValue;
-    }
-
-    function greaterFunction(properties, fieldName, testValue){
-        return properties[fieldName] > testValue;
-    }
-
-    function lessFunction(properties, fieldName, testValue){
-        return properties[fieldName] < testValue;
-    }
-
-    function greaterEqualFunction(properties, fieldName, testValue){
-        return properties[fieldName] >= testValue;
-    }
-
-    function lessEqualFunction(properties, fieldName, testValue){
-        return properties[fieldName] <= testValue;
-    }
-
-    function notEqualFunction(properties, fieldName, testValue){
-        return properties[fieldName] != testValue;
-    }
-
-    function hasFunction(properties, fieldName){
-        return when.defined(properties[fieldName]);
-    }
-
-    var compareFunctions = {
-        "==" : equalFunction,
-        "===" : equalFunction,
-        ">" : greaterFunction,
-        "<" : lessFunction,
-        ">=" : greaterEqualFunction,
-        "<=" : lessEqualFunction,
-        "!=" : notEqualFunction,
-        "has" : hasFunction
-    };
-
-    function MvtStyle(openlayer, useOffscreen) {
-        if(!openlayer){
-            throw new Check.DeveloperError('need include ol-debug.js');
-        }
-        this._useOffscreen = useOffscreen;
-        this._openlayer = openlayer;
-    }
-
-    Object.defineProperties(MvtStyle.prototype, {
-        proxy: {
-            get: function() {}
-        }
-    });
-
-    MvtStyle.prototype.getStyle = function() {
-        var openlayer = this._openlayer;
-        var fill = new openlayer.style.Fill({
-            color: ""
-        });
-        fill.setColor("#ffffff");
-
-        var stroke = new openlayer.style.Stroke({
-            color: "",
-            width: 1
-        });
-        stroke.setWidth(1);
-        stroke.setColor("#000000");
-
-        var fillAndOutlineStyle = new openlayer.style.Style({
-            fill: fill,
-            stroke: stroke
-        });
-
-        return fillAndOutlineStyle;
-    };
-
-    function parseMapboxColorString(colorString){
-        var tempS = colorString.substring(colorString.indexOf("(") + 1, colorString.indexOf(")"));
-        tempS = tempS.split(",");
-        var resultColor = [];
-        resultColor.push(parseFloat(tempS[0]));
-        resultColor.push(parseFloat(tempS[1]));
-        resultColor.push(parseFloat(tempS[2]));
-        resultColor.push(parseFloat(tempS[3]));
-        return resultColor;
-    }
-
-    function colorWithOpacity(color, opacity) {
-        if (color && opacity !== undefined) {
-            var colorData = {
-                color: [
-                    color[0] * 255 / color[3],
-                    color[1] * 255 / color[3],
-                    color[2] * 255 / color[3],
-                    color[3]
-                ],
-                opacity: color[3]
-            };
-            color = colorData.color;
-            color[3] = colorData.opacity * opacity;
-            if (color[3] === 0) {
-                color = undefined;
-            }
-        }
-        return color;
-    }
-
-    MvtStyle.prototype.getStyleByMapboxStyle = function(mapboxStyle) {
-        var openlayer = this._openlayer;
-        var type = mapboxStyle.type;
-        var paint = mapboxStyle.paint;
-        var layout = mapboxStyle.layout;
-        if(!when.defined(type) || !when.defined(paint)){
-            return this.getStyle();
-        }
-        if(type == "fill"){
-            var fillStyle = new openlayer.style.Style({
-            });
-            var fill = new openlayer.style.Fill({
-                color: "[255,255,255,1]"
-            });
-            fillStyle.setFill(fill);
-            var fillOpcatiy = paint["fill-opacity"];
-            if (when.defined(paint["fill-color"])) {
-                var fillColor = parseMapboxColorString(paint["fill-color"]);
-                if(when.defined(fillOpcatiy)){
-                    fillColor[3] *= fillOpcatiy;
-                }
-                fill.setColor(fillColor);
-            }
-            if (when.defined(paint["fill-outline-color"])) {
-                var fillOutlineStroke = new openlayer.style.Stroke({
-                    color: "",
-                    width: 1
-                });
-                fillOutlineStroke.setColor(paint["fill-outline-color"]);
-                fillStyle.setStroke(fillOutlineStroke);
-            }
-            if (when.defined(paint["fill-pattern"])) {
-                fillStyle.fillPatternName = paint["fill-pattern"];
-            }
-            return fillStyle;
-        }
-        else if(type == "line"){
-            var lineStyle = new openlayer.style.Style({
-            });
-            var lineStroke = new openlayer.style.Stroke({
-                color: "#000000",
-                width: 1
-            });
-            lineStyle.setStroke(lineStroke);
-            var lineOpcatiy = paint["line-opacity"];
-            if (when.defined(paint["line-color"])) {
-                var lineColor = parseMapboxColorString(paint["line-color"]);
-                if(when.defined(lineOpcatiy)){
-                    lineColor[3] *= lineOpcatiy;
-                }
-            }
-            if (when.defined(paint["line-width"])) {
-                var lineWidth = paint["line-width"];
-                lineStroke.setWidth(lineWidth);
-            }
-
-            if (when.defined(paint["line-dasharray"])) {
-                var lineDasharray = paint["line-dasharray"];
-                lineStroke.setLineDash(lineDasharray);
-            }
-
-            if(when.defined(layout)){
-                if (when.defined(layout["line-cap"])) {
-                    var lineCap = layout["line-cap"];
-                    lineStroke.setLineCap(lineCap);
-                }
-                if (when.defined(layout["line-join"])) {
-                    var lineJoin = layout["line-join"];
-                    lineStroke.setLineJoin(lineJoin);
-                }
-                if (when.defined(layout["line-miter-limit"])) {
-                    var lineMiterLimit = layout["line-miter-limit"];
-                    lineStroke.setMiterLimit(lineMiterLimit);
-                }
-            }
-
-            lineStroke.setColor(lineColor);
-            return lineStyle;
-        }
-        else if(type == "symbol"){
-            var iconStyle = new openlayer.style.Style({
-            });
-            if(when.defined(layout) && when.defined(layout["icon-image"])){
-                iconStyle.hasIconImage = true;
-            }
-            if(when.defined(layout) && when.defined(layout["text-field"])){
-                iconStyle.hasTextStyle = true;
-            }
-            return iconStyle;
-        }
-        else if(type == "circle"){
-            var circleRadius = paint["circle-radius"];
-            var circleColor = paint["circle-color"];
-            var circleStrokeColor = paint["circle-stroke-color"];
-            var circleOpacity = paint["circle-opacity"];
-            var circleStrokeOpacity = paint["circle-stroke-opacity"];
-            var circleStrokeWidth = paint["circle-stroke-width"];
-            var iconImg = new openlayer.style.Circle({
-                radius: circleRadius,
-                stroke: circleStrokeWidth === 0 ? undefined : new openlayer.style.Stroke({
-                    width: circleStrokeWidth,
-                    color: colorWithOpacity(circleStrokeColor, circleStrokeOpacity)
-                }),
-                fill: new openlayer.style.Fill({
-                    color: colorWithOpacity(circleColor, circleOpacity)
-                })
-            });
-            var circleStyle = new openlayer.style.Style({
-            });
-            circleStyle.setImage(iconImg);
-            return circleStyle;
-        }
-        else{
-            return this.getStyle();
-        }
-    };
-
-    var scratchIDColor = new Color.Color();
-    function convertIDtoColor(id, layerID){
-        var colorB = Math.floor(id / 65536);
-        var d = id - colorB * 65536;
-        var colorG = Math.floor(d / 256);
-        var colorR = d - colorG * 256;
-        var alpha = 1;
-        scratchIDColor.red = colorR / 256;
-        scratchIDColor.green = colorG / 256;
-        scratchIDColor.blue = colorB / 256;
-        scratchIDColor.alpha = alpha;
-        return scratchIDColor;
-    }
-
-    MvtStyle.prototype.getIDColorStyle = function(geometryType, id, layerID, lineWidth, radius, lineWidthExpand) {
-        var openlayer = this._openlayer;
-        var idColor = convertIDtoColor(id);
-        var cssColor = idColor.toCssColorString();
-        if(geometryType ==  'LineString' || geometryType ==  'LinearRing' || geometryType ==  'MultiLineString'){
-            var expandWidth = 4;
-            if (when.defined(lineWidth)) {
-                expandWidth = lineWidth * 2 + lineWidthExpand;
-            }
-            var scratchIDStroke = new openlayer.style.Stroke({
-                color: "",
-                width: expandWidth
-            });
-            scratchIDStroke.setColor(cssColor);
-            return new openlayer.style.Style({
-                stroke: scratchIDStroke
-            });
-        }
-        else if(geometryType == 'Point' || geometryType == 'MultiPoint'){
-            var iconImg = new openlayer.style.Circle({
-                radius: (radius - 0.5),
-                fill: new openlayer.style.Fill({
-                    color: cssColor
-                })
-            });
-            var circleStyle = new openlayer.style.Style({
-            });
-            circleStyle.setImage(iconImg);
-            return circleStyle;
-        }
-        else{
-            var scratchIDFill = new openlayer.style.Fill({
-                color: ""
-            });
-            scratchIDFill.setColor(cssColor);
-            var resultStyle = new openlayer.style.Style({
-                fill: scratchIDFill
-            });
-            if(when.defined(lineWidth)){
-                var scratchIDStroke = new openlayer.style.Stroke({
-                    color: "",
-                    width: when.defined(lineWidth) ? lineWidth * 2 : 4
-                });
-                scratchIDStroke.setColor(cssColor);
-                resultStyle.setStroke(scratchIDStroke);
-            }
-            return resultStyle;
-        }
-    };
-
-    var templateRegEx = /^([^]*)\{(.*)\}([^]*)$/;
-    function fromTemplate(text, properties) {
-        var parts;
-        do {
-            parts = text.match(templateRegEx);
-            if (parts) {
-                const value = properties[parts[2]] || '';
-                text = parts[1] + value + parts[3];
-            }
-        } while (parts);
-        return text;
-    }
-
-    MvtStyle.prototype.getTextStyle = function(oldStyle, feature, mapboxStyleLayer) {
-        var openlayer = this._openlayer;
-        var paint = mapboxStyleLayer.paint;
-        var layout = mapboxStyleLayer.layout;
-        var textField = layout['text-field'];
-        var label = fromTemplate(textField, feature.getProperties());
-        if(!when.defined(label)){
-            return;
-        }
-        var style = new openlayer.style.Style();
-        var text = new openlayer.style.Text();
-        style.setText(text);
-        var textSize = layout['text-size'];
-        var font = when.defaultValue(layout['text-font'], ['Open Sans Regular', 'Arial Unicode MS Regular']);
-        var textTransform = layout['text-transform'];
-        if (textTransform == 'uppercase') {
-            label = label.toUpperCase();
-        } else if (textTransform == 'lowercase') {
-            label = label.toLowerCase();
-        }
-        var textMaxWidth = when.defaultValue(layout['text-max-width'], 10);
-        //var wrappedLabel = wrapText(label, font, textMaxWidth);
-        var wrappedLabel = label;
-        text.setText(wrappedLabel);
-        text.setFont(font);
-        text.setRotation(0);
-
-        var textAnchor = when.defaultValue(layout['text-anchor'], 'center');
-        var placement = when.defaultValue(layout['symbol-placement'], 'point');
-        text.setPlacement(placement);
-        if (placement == 'point') {
-            var textAlign = 'center';
-            if (textAnchor.indexOf('left') !== -1) {
-                textAlign = 'left';
-            } else if (textAnchor.indexOf('right') !== -1) {
-                textAlign = 'right';
-            }
-            text.setTextAlign(textAlign);
-        } else {
-            text.setTextAlign();
-        }
-        var textBaseline = 'middle';
-        if (textAnchor.indexOf('bottom') == 0) {
-            textBaseline = 'bottom';
-        } else if (textAnchor.indexOf('top') == 0) {
-            textBaseline = 'top';
-        }
-        text.setTextBaseline(textBaseline);
-        var textOffset = when.defaultValue(layout['text-offset'], [0.0, 0.0]);
-        var textTranslate = when.defaultValue(layout['text-translate'], [0.0, 0.0]);
-        text.setOffsetX(textOffset[0] * textSize + textTranslate[0]);
-        text.setOffsetY(textOffset[1] * textSize + textTranslate[1]);
-        var opacity = paint['text-opacity'];
-        var textColorFill = new openlayer.style.Fill();
-        var textColor = paint["text-color"];
-        if(when.defined(textColor)){
-            textColor = parseMapboxColorString(textColor);
-            textColorFill.setColor(textColor);
-        }
-        text.setFill(textColorFill);
-        var textHaloColor = paint["text-halo-color"];
-        if (when.defined(textHaloColor)) {
-            var textHalo = new openlayer.style.Stroke();
-            textHaloColor = parseMapboxColorString(textHaloColor);
-            textHalo.setColor(textHaloColor);
-            textHalo.setWidth(paint['text-halo-width']);
-            text.setStroke(textHalo);
-        } else {
-            text.setStroke(undefined);
-        }
-        style.setZIndex(oldStyle.getZIndex());
-        style.hasIconImage = oldStyle.hasIconImage;
-        style.textSize = textSize;
-        return style;
-    };
-
-    function covertIconAnchor(iconAnchor) {
-        var anchorOffset = [0.5, 0.5];
-        if (['top-left', 'top-right', 'bottom-left', 'bottom-right'].includes(iconAnchor)) {
-            anchorOffset = [0, 0];
-        }
-        if (iconAnchor === 'left') {
-            iconAnchor = 'top-left';
-            anchorOffset = [0, 0.5];
-        }
-        if (iconAnchor === 'right') {
-            iconAnchor = 'top-left';
-            anchorOffset = [1, 0.5];
-        }
-        if (iconAnchor === 'bottom') {
-            iconAnchor = 'top-left';
-            anchorOffset = [0.5, 1];
-        }
-        if (iconAnchor === 'top') {
-            iconAnchor = 'top-left';
-            anchorOffset = [0.5, 0];
-        }
-        return {
-            anchorOffset: anchorOffset,
-            iconAnchor: iconAnchor
-        };
-    }
-
-    var iconImageCache = {};
-
-    MvtStyle.prototype.setIconImageForStyle = function(spriteImageDatas, style, mapboxStyleLayer){
-        var openlayer = this._openlayer;
-        var paint = mapboxStyleLayer.paint;
-        var layout = mapboxStyleLayer.layout;
-        var iconSize = when.defaultValue(layout["icon-size"], 1);
-        var iconColor = paint['icon-color'];
-        var iconTranslate = when.defaultValue(paint['icon-translate'], [0.0, 0.0]);
-        var iconTranslateAnchor = when.defaultValue(paint['icon-translate-anchor'], 'map');
-        var iconAnchor = when.defaultValue(layout['icon-anchor'], 'center');
-        var anchorOffsetAndIconAnchor = covertIconAnchor(iconAnchor);
-        var anchorOffset = anchorOffsetAndIconAnchor.anchorOffset;
-        var iconOffset = when.defaultValue(layout['iconoffset'], [0.0, 0.0]);
-        var iconOpacity = when.defaultValue(layout['icon-opacity'], 1.0);
-        var spriteImageName = layout["icon-image"];
-        if(!when.defined(spriteImageDatas[spriteImageName])){
-            console.log('miss icon-image ' + spriteImageName);
-            return;
-        }
-
-        var icon_cache_key = spriteImageName + '.' + iconSize + '.' + iconTranslate + '.' + iconTranslateAnchor + '.' + iconAnchor + '.' + iconOffset;
-        if (when.defined(iconColor)) {
-            icon_cache_key += '.' + iconColor;
-        }
-        var iconImg = iconImageCache[icon_cache_key];
-        if(!when.defined(iconImg)){
-            var spriteImage = spriteImageDatas[spriteImageName];
-            var canvas;
-            if(this._useOffscreen){
-                canvas = new OffscreenCanvas(spriteImage.width, spriteImage.height);
-            }
-            else{
-                canvas = document.createElement('canvas');
-                canvas.width = spriteImage.width;
-                canvas.height = spriteImage.height;
-            }
-            var ctx = canvas.getContext('2d');
-            ctx.putImageData(spriteImage, 0, 0);
-            var translateOffset = [iconTranslate[0] / spriteImage.width, iconTranslate[1] / spriteImage.height];
-            iconImg = new openlayer.style.Icon({
-                img: canvas,
-                anchorOrigin: anchorOffsetAndIconAnchor.iconAnchor,
-                anchor: [iconOffset[0] + anchorOffset[0] + translateOffset[0], iconOffset[1] + anchorOffset[1] - translateOffset[1]],
-                imgSize: [canvas.width, canvas.height],
-                scale: iconSize
-            });
-            iconImg.setOpacity(iconOpacity);
-            iconImageCache[icon_cache_key] = iconImg;
-        }
-
-        style.setImage(iconImg);
-        //style.setText(undefined);
-    };
-
-    var VALUE_EXTENT = 4096;
-    var replays = ["Default", "Polygon", "LineString", "Image", "Symbol", "Text"];
-
-    function MvtRenderer2D(options) {
-        this._mvtStyleClass = options.mvtStyle;
-        this._openlayer = options.openlayer;
-    }
-
-    Object.defineProperties(MvtRenderer2D.prototype, {
-    });
-
-    MvtRenderer2D.prototype.renderFeatures = function(options) {
-        var canvas = options.colorCanvas;
-        var idCanvas = options.idCanvas;
-        var transform = options.transform;
-        var layers = options.layers;
-        var features = options.features;
-        var tileLevel = options.tileLevel;
-        var spriteImageCanvas = options.spriteImageCanvas;
-        var spriteImageDatas = options.spriteImageDatas;
-        var squaredTolerance = options.squaredTolerance;
-        var showBillboard = options.showBillboard;
-        var renderID = options.renderID;
-        var renderColor = options.renderColor;
-        var lineWidthExpand = options.lineWidthExpand;
-
-        var ol = this._openlayer;
-        var ctx = canvas.getContext('2d');
-
-        var idFeatures = [];
-        var iconImageObjects = [];
-        var textObjects = [];
-        var style = null;
-        var declutterTree = ol.ext.rbush(9);
-        var replayGroup = new ol.render.canvas.ReplayGroup(0, [0, 0, VALUE_EXTENT, VALUE_EXTENT], 8, 2, true, declutterTree);
-
-        var featureLength = features.length;
-        for (var r = 0; r < featureLength; r++) {
-            var feature = features[r];
-            var sourceLayer = feature.getProperties().layer;
-            feature.index = sourceLayer + feature.getId();
-            var featureHasStyle = false;
-            var layerGroupById = layers[sourceLayer];
-            var zIndex = 0;
-            for (var layerId in layerGroupById) {
-                var layerById = layerGroupById[layerId];
-
-                var maxzoom = layerById.mapboxStyleLayer.maxzoom;
-                var minzoom = layerById.mapboxStyleLayer.minzoom;
-                if(tileLevel < minzoom || tileLevel > maxzoom){
-                    continue;
-                }
-
-                var filterArray = layerById.filterArray;
-                if (!when.defined(filterArray)) {
-                    style = this._mvtStyleClass.getStyleByMapboxStyle(layerById.mapboxStyleLayer);
-                }
-                else {
-                    var properties = feature.getProperties();
-                    if (MvtFilter.filterTest(properties, filterArray)) {
-                        style = this._mvtStyleClass.getStyleByMapboxStyle(layerById.mapboxStyleLayer);
-                    }
-                    else {
-                        continue;
-                    }
-                }
-
-                if (!when.defined(style)) {
-                    continue;
-                }
-
-                this.createFillPatternForStyle(style, spriteImageCanvas, spriteImageDatas, ctx);
-
-                if (when.defined(style.hasTextStyle)) {
-                    var textStyle = this._mvtStyleClass.getTextStyle(style, feature, layerById.mapboxStyleLayer);
-                    textStyle.setZIndex(zIndex);
-                    if(showBillboard){
-                        textObjects.push({
-                            feature : feature,
-                            style : textStyle
-                        });
-                    }
-                    else{
-                        if(renderColor){
-                            ol.renderer.vector.renderFeature_(replayGroup, feature, textStyle, -1);
-                        }
-                    }
-                }
-
-                if (when.defined(style.hasIconImage) && !when.defined(style.getImage())) {
-                    if(showBillboard){
-                        iconImageObjects.push({
-                            feature : feature,
-                            style : layerById.mapboxStyleLayer
-                        });
-                        continue;
-                    }
-                    else{
-                        this._mvtStyleClass.setIconImageForStyle(spriteImageDatas, style, layerById.mapboxStyleLayer);
-                    }
-                }
-
-                style.setZIndex(zIndex);
-                this.setPickStyleInFeature(feature, style);
-                zIndex++;
-
-                if(renderColor){
-                    ol.renderer.vector.renderFeature_(replayGroup, feature, style, -1);
-                }
-                featureHasStyle = true;
-            }
-            if (featureHasStyle) {
-                idFeatures.push(feature);
-            }
-        }
-
-        if(renderColor){
-            replayGroup.finish();
-            var declutterReplays = {};
-            replayGroup.replay(ctx, transform, 0, {}, replays, declutterReplays);
-            if (declutterReplays) {
-                ol.render.canvas.ReplayGroup.replayDeclutter(declutterReplays, ctx, 0.0);
-            }
-        }
-
-        replayGroup = null;
-        if(renderID){
-            this.renderIDtoTexture(transform, idCanvas, idFeatures, 0, squaredTolerance, lineWidthExpand);
-        }
-        return {
-            idFeatures : idFeatures,
-            iconImageObjects : iconImageObjects,
-            textObjects : textObjects
-        }
-    };
-
-    MvtRenderer2D.prototype.renderIDtoTexture = function(transform, canvas, features, layerID, tileTolerance, lineWidthExpand) {
-        var ol = this._openlayer;
-        var ctx = canvas.getContext('2d');
-        var declutterTree = ol.ext.rbush(9);
-        var replayGroup = new ol.render.canvas.ReplayGroup(0, [0, 0, VALUE_EXTENT, VALUE_EXTENT], 8, 2, true, declutterTree);
-        var featureLength = features.length;
-        for (var r = 0; r < featureLength; r++) {
-            var feature = features[r];
-            var id = getFeatureID(feature);
-            var idStyle = this._mvtStyleClass.getIDColorStyle(feature.getGeometry().getType(), id, layerID, feature.lineWidth, feature.radius, lineWidthExpand);
-            idStyle.setZIndex(feature.zIndex);
-            ol.renderer.vector.renderFeature_(replayGroup, feature, idStyle, -1);
-        }
-        replayGroup.finish();
-        var declutterReplays = {};
-        replayGroup.replay(ctx, transform, 0, {}, replays, declutterReplays);
-        if (declutterReplays) {
-            ol.render.canvas.ReplayGroup.replayDeclutter(declutterReplays, ctx, 0.0);
-        }
-        replayGroup = null;
-    };
-
-    MvtRenderer2D.prototype.createFillPatternForStyle = function(style, spriteImageCanvas, subSpriteImage, ctx){
-        if(!when.defined(style.fillPatternName)){
-            return;
-        }
-        var patternName = style.fillPatternName;
-        var patternCanvas = null;
-        if (when.defined(spriteImageCanvas[patternName])) {
-            patternCanvas = spriteImageCanvas[patternName];
-        }
-        else {
-            var imageData = subSpriteImage[patternName];
-            if (!when.defined(imageData)) {
-                console.log('miss sprite ' + patternName);
-                return;
-            }
-            patternCanvas = document.createElement('canvas');
-            patternCanvas.width = imageData.width;
-            patternCanvas.height = imageData.height;
-            var spriteCtx = patternCanvas.getContext('2d');
-            spriteCtx.putImageData(imageData, 0, 0);
-            spriteImageCanvas[patternName] = patternCanvas;
-        }
-        style.fill_.color_ = ctx.createPattern(patternCanvas, 'repeat');
-    };
-
-    MvtRenderer2D.prototype.setPickStyleInFeature = function(feature, style){
-        var ol = this._openlayer;
-        feature.zIndex = style.getZIndex();
-        if(when.defined(style.getStroke())){
-            var styleLineWidth = style.getStroke().getWidth();
-            if(when.defined(feature.lineWidth)){
-                feature.lineWidth = Math.max(feature.lineWidth, styleLineWidth);
-            }
-            else{
-                feature.lineWidth = styleLineWidth;
-            }
-        }
-        if(when.defined(style.getImage())){
-            var imageStyle = style.getImage();
-            var radius = 1.0;
-            if(imageStyle instanceof ol.style.Icon ){
-                var imageSize = imageStyle.getImageSize();
-                radius = Math.max(imageSize[0], imageSize[1]) / 2.0;
-                radius -= 1.0;
-            }
-            else if(imageStyle instanceof ol.style.Circle ){
-                radius = imageStyle.getRadius();
-            }
-            if(when.defined(feature.radius)){
-                feature.radius = Math.max(feature.radius, radius);
-            }
-            else{
-                feature.radius = radius;
-            }
-        }
-    };
-
-    function getFeatureID(feature) {
-        var id = feature.getId();
-        // 只在颜色中记录256*256*256这么大范围的ID,超过这个范围的ID舍去
-        var discard = Math.floor(id / 16777216);
-        id = id - discard * 16777216;
-        return id;
-    }
-
-    function ol() {
-        }
-
-        ol.array = {};
-
-        /**
-         * Performs a binary search on the provided sorted list and returns the index of the item if found. If it can't be found it'll return -1.
-         * https://github.com/darkskyapp/binary-search
-         *
-         * @param {Array.<*>} haystack Items to search through.
-         * @param {*} needle The item to look for.
-         * @param {Function=} opt_comparator Comparator function.
-         * @return {number} The index of the item if found, -1 if not.
-         */
-        ol.array.binarySearch = function(haystack, needle, opt_comparator) {
-            var mid, cmp;
-            var comparator = opt_comparator || ol.array.numberSafeCompareFunction;
-            var low = 0;
-            var high = haystack.length;
-            var found = false;
-
-            while (low < high) {
-                /* Note that "(low + high) >>> 1" may overflow, and results in a typecast
-                 * to double (which gives the wrong results). */
-                mid = low + (high - low >> 1);
-                cmp = +comparator(haystack[mid], needle);
-
-                if (cmp < 0.0) { /* Too low. */
-                    low  = mid + 1;
-
-                } else { /* Key found or too high */
-                    high = mid;
-                    found = !cmp;
-                }
-            }
-
-            /* Key not found. */
-            return found ? low : ~low;
-        };
-
-
-        /**
-         * Compare function for array sort that is safe for numbers.
-         * @param {*} a The first object to be compared.
-         * @param {*} b The second object to be compared.
-         * @return {number} A negative number, zero, or a positive number as the first
-         *     argument is less than, equal to, or greater than the second.
-         */
-        ol.array.numberSafeCompareFunction = function(a, b) {
-            return a > b ? 1 : a < b ? -1 : 0;
-        };
-
-
-        /**
-         * Whether the array contains the given object.
-         * @param {Array.<*>} arr The array to test for the presence of the element.
-         * @param {*} obj The object for which to test.
-         * @return {boolean} The object is in the array.
-         */
-        ol.array.includes = function(arr, obj) {
-            return arr.indexOf(obj) >= 0;
-        };
-
-
-        /**
-         * @param {Array.<number>} arr Array.
-         * @param {number} target Target.
-         * @param {number} direction 0 means return the nearest, > 0
-         *    means return the largest nearest, < 0 means return the
-         *    smallest nearest.
-         * @return {number} Index.
-         */
-        ol.array.linearFindNearest = function(arr, target, direction) {
-            var n = arr.length;
-            if (arr[0] <= target) {
-                return 0;
-            } else if (target <= arr[n - 1]) {
-                return n - 1;
-            } else {
-                var i;
-                if (direction > 0) {
-                    for (i = 1; i < n; ++i) {
-                        if (arr[i] < target) {
-                            return i - 1;
-                        }
-                    }
-                } else if (direction < 0) {
-                    for (i = 1; i < n; ++i) {
-                        if (arr[i] <= target) {
-                            return i;
-                        }
-                    }
-                } else {
-                    for (i = 1; i < n; ++i) {
-                        if (arr[i] == target) {
-                            return i;
-                        } else if (arr[i] < target) {
-                            if (arr[i - 1] - target < target - arr[i]) {
-                                return i - 1;
-                            } else {
-                                return i;
-                            }
-                        }
-                    }
-                }
-                return n - 1;
-            }
-        };
-
-
-        /**
-         * @param {Array.<*>} arr Array.
-         * @param {number} begin Begin index.
-         * @param {number} end End index.
-         */
-        ol.array.reverseSubArray = function(arr, begin, end) {
-            while (begin < end) {
-                var tmp = arr[begin];
-                arr[begin] = arr[end];
-                arr[end] = tmp;
-                ++begin;
-                --end;
-            }
-        };
-
-        /**
-         * @param {Array.<VALUE>} arr The array to modify.
-         * @param {Array.<VALUE>|VALUE} data The elements or arrays of elements
-         *     to add to arr.
-         * @template VALUE
-         */
-        ol.array.extend = function(arr, data) {
-            var i;
-            var extension = Array.isArray(data) ? data : [data];
-            var length = extension.length;
-            for (i = 0; i < length; i++) {
-                arr[arr.length] = extension[i];
-            }
-        };
-
-
-        /**
-         * @param {Array.<VALUE>} arr The array to modify.
-         * @param {VALUE} obj The element to remove.
-         * @template VALUE
-         * @return {boolean} If the element was removed.
-         */
-        ol.array.remove = function(arr, obj) {
-            var i = arr.indexOf(obj);
-            var found = i > -1;
-            if (found) {
-                arr.splice(i, 1);
-            }
-            return found;
-        };
-
-
-        /**
-         * @param {Array.<VALUE>} arr The array to search in.
-         * @param {function(VALUE, number, ?) : boolean} func The function to compare.
-         * @template VALUE
-         * @return {VALUE} The element found.
-         */
-        ol.array.find = function(arr, func) {
-            var length = arr.length >>> 0;
-            var value;
-
-            for (var i = 0; i < length; i++) {
-                value = arr[i];
-                if (func(value, i, arr)) {
-                    return value;
-                }
-            }
-            return null;
-        };
-
-
-        /**
-         * @param {Array|Uint8ClampedArray} arr1 The first array to compare.
-         * @param {Array|Uint8ClampedArray} arr2 The second array to compare.
-         * @return {boolean} Whether the two arrays are equal.
-         */
-        ol.array.equals = function(arr1, arr2) {
-            var len1 = arr1.length;
-            if (len1 !== arr2.length) {
-                return false;
-            }
-            for (var i = 0; i < len1; i++) {
-                if (arr1[i] !== arr2[i]) {
-                    return false;
-                }
-            }
-            return true;
-        };
-
-
-        /**
-         * @param {Array.<*>} arr The array to sort (modifies original).
-         * @param {Function} compareFnc Comparison function.
-         */
-        ol.array.stableSort = function(arr, compareFnc) {
-            var length = arr.length;
-            var tmp = Array(arr.length);
-            var i;
-            for (i = 0; i < length; i++) {
-                tmp[i] = {index: i, value: arr[i]};
-            }
-            tmp.sort(function(a, b) {
-                return compareFnc(a.value, b.value) || a.index - b.index;
-            });
-            for (i = 0; i < arr.length; i++) {
-                arr[i] = tmp[i].value;
-            }
-        };
-
-
-        /**
-         * @param {Array.<*>} arr The array to search in.
-         * @param {Function} func Comparison function.
-         * @return {number} Return index.
-         */
-        ol.array.findIndex = function(arr, func) {
-            var index;
-            var found = !arr.every(function(el, idx) {
-                index = idx;
-                return !func(el, idx, arr);
-            });
-            return found ? index : -1;
-        };
-
-
-        /**
-         * @param {Array.<*>} arr The array to test.
-         * @param {Function=} opt_func Comparison function.
-         * @param {boolean=} opt_strict Strictly sorted (default false).
-         * @return {boolean} Return index.
-         */
-        ol.array.isSorted = function(arr, opt_func, opt_strict) {
-            var compare = opt_func || ol.array.numberSafeCompareFunction;
-            return arr.every(function(currentVal, index) {
-                if (index === 0) {
-                    return true;
-                }
-                var res = compare(arr[index - 1], currentVal);
-                return !(res > 0 || opt_strict && res === 0);
-            });
-        };
-
-
-        ol.ASSUME_TOUCH = false;
-        ol.DEFAULT_MAX_ZOOM = 42;
-        ol.DEFAULT_MIN_ZOOM = 0;
-        ol.DEFAULT_RASTER_REPROJECTION_ERROR_THRESHOLD = 0.5;
-        ol.DEFAULT_TILE_SIZE = 256;
-        ol.DEFAULT_WMS_VERSION = '1.3.0';
-        ol.ENABLE_CANVAS = true;
-        ol.ENABLE_PROJ4JS = true;
-        ol.ENABLE_RASTER_REPROJECTION = true;
-        ol.ENABLE_WEBGL = true;
-        ol.DEBUG_WEBGL = true;
-        ol.INITIAL_ATLAS_SIZE = 256;
-        ol.MAX_ATLAS_SIZE = -1;
-        ol.MOUSEWHEELZOOM_MAXDELTA = 1;
-        ol.OVERVIEWMAP_MAX_RATIO = 0.75;
-        ol.OVERVIEWMAP_MIN_RATIO = 0.1;
-        ol.RASTER_REPROJECTION_MAX_SOURCE_TILES = 100;
-        ol.RASTER_REPROJECTION_MAX_SUBDIVISION = 10;
-        ol.RASTER_REPROJECTION_MAX_TRIANGLE_WIDTH = 0.25;
-        ol.SIMPLIFY_TOLERANCE = 0.5;
-        ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK = 1024;
-        ol.VERSION = '';
-
-        ol.inherits = function(childCtor, parentCtor) {
-            childCtor.prototype = Object.create(parentCtor.prototype);
-            childCtor.prototype.constructor = childCtor;
-        };
-
-        ol.nullFunction = function() {};
-
-        ol.getUid = function(obj) {
-            return obj.ol_uid ||
-                (obj.ol_uid = ++ol.uidCounter_);
-        };
-
-        ol.asserts = {};
-        ol.asserts.assert = function(assertion, errorCode) {
-        };
-
-        ol.has = {};
-
-        var ua = typeof navigator !== 'undefined' ?
-            navigator.userAgent.toLowerCase() : '';
-
-        ol.has.FIREFOX = ua.indexOf('firefox') !== -1;
-        ol.has.SAFARI = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') == -1;
-        ol.has.WEBKIT = ua.indexOf('webkit') !== -1 && ua.indexOf('edge') == -1;
-        ol.has.MAC = ua.indexOf('macintosh') !== -1;
-        ol.has.DEVICE_PIXEL_RATIO = 1;
-        ol.has.CANVAS_LINE_DASH = true;
-
-        ol.structs = {};
-
-        /**
-         * @enum {string}
-         */
-        ol.CollectionEventType = {
-            ADD: 'add',
-            REMOVE: 'remove'
-        };
-
-        /**
-         * @enum {string}
-         */
-        ol.ObjectEventType = {
-            PROPERTYCHANGE: 'propertychange'
-        };
-
-        ol.events = {};
-
-        /**
-         * @param {ol.EventsKey} listenerObj Listener object.
-         * @return {ol.EventsListenerFunctionType} Bound listener.
-         */
-        ol.events.bindListener_ = function(listenerObj) {
-            var boundListener = function(evt) {
-                var listener = listenerObj.listener;
-                var bindTo = listenerObj.bindTo || listenerObj.target;
-                if (listenerObj.callOnce) {
-                    ol.events.unlistenByKey(listenerObj);
-                }
-                return listener.call(bindTo, evt);
-            };
-            listenerObj.boundListener = boundListener;
-            return boundListener;
-        };
-
-        ol.events.findListener_ = function(listeners, listener, opt_this,
-                                           opt_setDeleteIndex) {
-            var listenerObj;
-            for (var i = 0, ii = listeners.length; i < ii; ++i) {
-                listenerObj = listeners[i];
-                if (listenerObj.listener === listener &&
-                    listenerObj.bindTo === opt_this) {
-                    if (opt_setDeleteIndex) {
-                        listenerObj.deleteIndex = i;
-                    }
-                    return listenerObj;
-                }
-            }
-            return undefined;
-        };
-
-
-        /**
-         * @param {ol.EventTargetLike} target Target.
-         * @param {string} type Type.
-         * @return {Array.<ol.EventsKey>|undefined} Listeners.
-         */
-        ol.events.getListeners = function(target, type) {
-            var listenerMap = target.ol_lm;
-            return listenerMap ? listenerMap[type] : undefined;
-        };
-
-
-        /**
-         * Get the lookup of listeners.  If one does not exist on the target, it is
-         * created.
-         * @param {ol.EventTargetLike} target Target.
-         * @return {!Object.<string, Array.<ol.EventsKey>>} Map of
-         *     listeners by event type.
-         * @private
-         */
-        ol.events.getListenerMap_ = function(target) {
-            var listenerMap = target.ol_lm;
-            if (!listenerMap) {
-                listenerMap = target.ol_lm = {};
-            }
-            return listenerMap;
-        };
-
-
-        /**
-         * Clean up all listener objects of the given type.  All properties on the
-         * listener objects will be removed, and if no listeners remain in the listener
-         * map, it will be removed from the target.
-         * @param {ol.EventTargetLike} target Target.
-         * @param {string} type Type.
-         * @private
-         */
-        ol.events.removeListeners_ = function(target, type) {
-            var listeners = ol.events.getListeners(target, type);
-            if (listeners) {
-                for (var i = 0, ii = listeners.length; i < ii; ++i) {
-                    target.removeEventListener(type, listeners[i].boundListener);
-                    ol.obj.clear(listeners[i]);
-                }
-                listeners.length = 0;
-                var listenerMap = target.ol_lm;
-                if (listenerMap) {
-                    delete listenerMap[type];
-                    if (Object.keys(listenerMap).length === 0) {
-                        delete target.ol_lm;
-                    }
-                }
-            }
-        };
-
-        ol.events.listen = function(target, type, listener, opt_this, opt_once) {
-            var listenerMap = ol.events.getListenerMap_(target);
-            var listeners = listenerMap[type];
-            if (!listeners) {
-                listeners = listenerMap[type] = [];
-            }
-            var listenerObj = ol.events.findListener_(listeners, listener, opt_this,
-                false);
-            if (listenerObj) {
-                if (!opt_once) {
-                    // Turn one-off listener into a permanent one.
-                    listenerObj.callOnce = false;
-                }
-            } else {
-                listenerObj = /** @type {ol.EventsKey} */ ({
-                    bindTo: opt_this,
-                    callOnce: !!opt_once,
-                    listener: listener,
-                    target: target,
-                    type: type
-                });
-                target.addEventListener(type, ol.events.bindListener_(listenerObj));
-                listeners.push(listenerObj);
-            }
-
-            return listenerObj;
-        };
-
-        ol.events.listenOnce = function(target, type, listener, opt_this) {
-            return ol.events.listen(target, type, listener, opt_this, true);
-        };
-
-        ol.events.unlisten = function(target, type, listener, opt_this) {
-            var listeners = ol.events.getListeners(target, type);
-            if (listeners) {
-                var listenerObj = ol.events.findListener_(listeners, listener, opt_this,
-                    true);
-                if (listenerObj) {
-                    ol.events.unlistenByKey(listenerObj);
-                }
-            }
-        };
-
-        ol.events.unlistenByKey = function(key) {
-            if (key && key.target) {
-                key.target.removeEventListener(key.type, key.boundListener);
-                var listeners = ol.events.getListeners(key.target, key.type);
-                if (listeners) {
-                    var i = 'deleteIndex' in key ? key.deleteIndex : listeners.indexOf(key);
-                    if (i !== -1) {
-                        listeners.splice(i, 1);
-                    }
-                    if (listeners.length === 0) {
-                        ol.events.removeListeners_(key.target, key.type);
-                    }
-                }
-                ol.obj.clear(key);
-            }
-        };
-
-        ol.events.unlistenAll = function(target) {
-            var listenerMap = ol.events.getListenerMap_(target);
-            for (var type in listenerMap) {
-                ol.events.removeListeners_(target, type);
-            }
-        };
-
-        /**
-         * Objects that need to clean up after themselves.
-         * @constructor
-         */
-        ol.Disposable = function() {};
-
-        ol.Disposable.prototype.disposed_ = false;
-
-        ol.Disposable.prototype.dispose = function() {
-            if (!this.disposed_) {
-                this.disposed_ = true;
-                this.disposeInternal();
-            }
-        };
-
-        ol.Disposable.prototype.disposeInternal = ol.nullFunction;
-
-        ol.events.Event = {};
-
-        ol.events.Event = function(type) {
-            this.propagationStopped;
-            this.type = type;
-            this.target = null;
-        };
-
-        ol.events.Event.prototype.preventDefault =
-
-        /**
-         * Stop event propagation.
-         * @function
-         * @override
-         * @api
-         */
-            ol.events.Event.prototype.stopPropagation = function() {
-                this.propagationStopped = true;
-            };
-
-
-        /**
-         * @param {Event|ol.events.Event} evt Event
-         */
-        ol.events.Event.stopPropagation = function(evt) {
-            evt.stopPropagation();
-        };
-
-
-        /**
-         * @param {Event|ol.events.Event} evt Event
-         */
-        ol.events.Event.preventDefault = function(evt) {
-            evt.preventDefault();
-        };
-
-        ol.events.EventTarget = {};
-
-        ol.events.EventTarget = function() {
-            ol.Disposable.call(this);
-            this.pendingRemovals_ = {};
-            this.dispatching_ = {};
-            this.listeners_ = {};
-
-        };
-        ol.inherits(ol.events.EventTarget, ol.Disposable);
-
-
-        /**
-         * @param {string} type Type.
-         * @param {ol.EventsListenerFunctionType} listener Listener.
-         */
-        ol.events.EventTarget.prototype.addEventListener = function(type, listener) {
-            var listeners = this.listeners_[type];
-            if (!listeners) {
-                listeners = this.listeners_[type] = [];
-            }
-            if (listeners.indexOf(listener) === -1) {
-                listeners.push(listener);
-            }
-        };
-
-        ol.events.EventTarget.prototype.dispatchEvent = function(event) {
-            var evt = typeof event === 'string' ? new ol.events.Event(event) : event;
-            var type = evt.type;
-            evt.target = this;
-            var listeners = this.listeners_[type];
-            var propagate;
-            if (listeners) {
-                if (!(type in this.dispatching_)) {
-                    this.dispatching_[type] = 0;
-                    this.pendingRemovals_[type] = 0;
-                }
-                ++this.dispatching_[type];
-                for (var i = 0, ii = listeners.length; i < ii; ++i) {
-                    if (listeners[i].call(this, evt) === false || evt.propagationStopped) {
-                        propagate = false;
-                        break;
-                    }
-                }
-                --this.dispatching_[type];
-                if (this.dispatching_[type] === 0) {
-                    var pendingRemovals = this.pendingRemovals_[type];
-                    delete this.pendingRemovals_[type];
-                    while (pendingRemovals--) {
-                        this.removeEventListener(type, ol.nullFunction);
-                    }
-                    delete this.dispatching_[type];
-                }
-                return propagate;
-            }
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.events.EventTarget.prototype.disposeInternal = function() {
-            ol.events.unlistenAll(this);
-        };
-
-
-        /**
-         * Get the listeners for a specified event type. Listeners are returned in the
-         * order that they will be called in.
-         *
-         * @param {string} type Type.
-         * @return {Array.<ol.EventsListenerFunctionType>} Listeners.
-         */
-        ol.events.EventTarget.prototype.getListeners = function(type) {
-            return this.listeners_[type];
-        };
-
-
-        /**
-         * @param {string=} opt_type Type. If not provided,
-         *     `true` will be returned if this EventTarget has any listeners.
-         * @return {boolean} Has listeners.
-         */
-        ol.events.EventTarget.prototype.hasListener = function(opt_type) {
-            return opt_type ?
-                opt_type in this.listeners_ :
-                Object.keys(this.listeners_).length > 0;
-        };
-
-
-        /**
-         * @param {string} type Type.
-         * @param {ol.EventsListenerFunctionType} listener Listener.
-         */
-        ol.events.EventTarget.prototype.removeEventListener = function(type, listener) {
-            var listeners = this.listeners_[type];
-            if (listeners) {
-                var index = listeners.indexOf(listener);
-                if (type in this.pendingRemovals_) {
-                    // make listener a no-op, and remove later in #dispatchEvent()
-                    listeners[index] = ol.nullFunction;
-                    ++this.pendingRemovals_[type];
-                } else {
-                    listeners.splice(index, 1);
-                    if (listeners.length === 0) {
-                        delete this.listeners_[type];
-                    }
-                }
-            }
-        };
-
-        /**
-         * @enum {string}
-         * @const
-         */
-        ol.events.EventType = {
-            CHANGE: 'change',
-            CLEAR: 'clear',
-            CLICK: 'click',
-            DBLCLICK: 'dblclick',
-            DRAGENTER: 'dragenter',
-            DRAGOVER: 'dragover',
-            DROP: 'drop',
-            ERROR: 'error',
-            KEYDOWN: 'keydown',
-            KEYPRESS: 'keypress',
-            LOAD: 'load',
-            MOUSEDOWN: 'mousedown',
-            MOUSEMOVE: 'mousemove',
-            MOUSEOUT: 'mouseout',
-            MOUSEUP: 'mouseup',
-            MOUSEWHEEL: 'mousewheel',
-            MSPOINTERDOWN: 'MSPointerDown',
-            RESIZE: 'resize',
-            TOUCHSTART: 'touchstart',
-            TOUCHMOVE: 'touchmove',
-            TOUCHEND: 'touchend',
-            WHEEL: 'wheel'
-        };
-
-        ol.Observable = function() {
-            this.revision_ = 0;
-
-        };
-        ol.inherits(ol.Observable, ol.events.EventTarget);
-
-        ol.Observable.unByKey = function(key) {
-            if (Array.isArray(key)) {
-                for (var i = 0, ii = key.length; i < ii; ++i) {
-                    ol.events.unlistenByKey(key[i]);
-                }
-            } else {
-                ol.events.unlistenByKey(/** @type {ol.EventsKey} */ (key));
-            }
-        };
-
-
-        /**
-         * Increases the revision counter and dispatches a 'change' event.
-         * @api
-         */
-        ol.Observable.prototype.changed = function() {
-            ++this.revision_;
-            //this.dispatchEvent(ol.events.EventType.CHANGE);
-        };
-
-
-        /**
-         * Dispatches an event and calls all listeners listening for events
-         * of this type. The event parameter can either be a string or an
-         * Object with a `type` property.
-         *
-         * @param {{type: string,
-     *     target: (EventTarget|ol.events.EventTarget|undefined)}|ol.events.Event|
-     *     string} event Event object.
-         * @function
-         * @api
-         */
-        ol.Observable.prototype.dispatchEvent;
-
-
-        /**
-         * Get the version number for this object.  Each time the object is modified,
-         * its version number will be incremented.
-         * @return {number} Revision.
-         * @api
-         */
-        ol.Observable.prototype.getRevision = function() {
-            return this.revision_;
-        };
-
-
-        /**
-         * Listen for a certain type of event.
-         * @param {string|Array.<string>} type The event type or array of event types.
-         * @param {function(?): ?} listener The listener function.
-         * @param {Object=} opt_this The object to use as `this` in `listener`.
-         * @return {ol.EventsKey|Array.<ol.EventsKey>} Unique key for the listener. If
-         *     called with an array of event types as the first argument, the return
-         *     will be an array of keys.
-         * @api
-         */
-        ol.Observable.prototype.on = function(type, listener, opt_this) {
-            if (Array.isArray(type)) {
-                var len = type.length;
-                var keys = new Array(len);
-                for (var i = 0; i < len; ++i) {
-                    keys[i] = ol.events.listen(this, type[i], listener, opt_this);
-                }
-                return keys;
-            } else {
-                return ol.events.listen(
-                    this, /** @type {string} */ (type), listener, opt_this);
-            }
-        };
-
-
-        /**
-         * Listen once for a certain type of event.
-         * @param {string|Array.<string>} type The event type or array of event types.
-         * @param {function(?): ?} listener The listener function.
-         * @param {Object=} opt_this The object to use as `this` in `listener`.
-         * @return {ol.EventsKey|Array.<ol.EventsKey>} Unique key for the listener. If
-         *     called with an array of event types as the first argument, the return
-         *     will be an array of keys.
-         * @api
-         */
-        ol.Observable.prototype.once = function(type, listener, opt_this) {
-            if (Array.isArray(type)) {
-                var len = type.length;
-                var keys = new Array(len);
-                for (var i = 0; i < len; ++i) {
-                    keys[i] = ol.events.listenOnce(this, type[i], listener, opt_this);
-                }
-                return keys;
-            } else {
-                return ol.events.listenOnce(
-                    this, /** @type {string} */ (type), listener, opt_this);
-            }
-        };
-
-
-        /**
-         * Unlisten for a certain type of event.
-         * @param {string|Array.<string>} type The event type or array of event types.
-         * @param {function(?): ?} listener The listener function.
-         * @param {Object=} opt_this The object which was used as `this` by the
-         * `listener`.
-         * @api
-         */
-        ol.Observable.prototype.un = function(type, listener, opt_this) {
-            if (Array.isArray(type)) {
-                for (var i = 0, ii = type.length; i < ii; ++i) {
-                    ol.events.unlisten(this, type[i], listener, opt_this);
-                }
-                return;
-            } else {
-                ol.events.unlisten(this, /** @type {string} */ (type), listener, opt_this);
-            }
-        };
-
-        ol.uidCounter_ = 0;
-
-        ol.Object = function(opt_values) {
-            ol.Observable.call(this);
-
-            // Call ol.getUid to ensure that the order of objects' ids is the same as
-            // the order in which they were created.  This also helps to ensure that
-            // object properties are always added in the same order, which helps many
-            // JavaScript engines generate faster code.
-            ol.getUid(this);
-
-            /**
-             * @private
-             * @type {!Object.<string, *>}
-             */
-            this.values_ = {};
-
-            if (opt_values !== undefined) {
-                this.setProperties(opt_values);
-            }
-        };
-        ol.inherits(ol.Object, ol.Observable);
-
-
-        /**
-         * @private
-         * @type {Object.<string, string>}
-         */
-        ol.Object.changeEventTypeCache_ = {};
-
-
-        /**
-         * @param {string} key Key name.
-         * @return {string} Change name.
-         */
-        ol.Object.getChangeEventType = function(key) {
-            return ol.Object.changeEventTypeCache_.hasOwnProperty(key) ?
-                ol.Object.changeEventTypeCache_[key] :
-                (ol.Object.changeEventTypeCache_[key] = 'change:' + key);
-        };
-
-
-        /**
-         * Gets a value.
-         * @param {string} key Key name.
-         * @return {*} Value.
-         * @api
-         */
-        ol.Object.prototype.get = function(key) {
-            var value;
-            if (this.values_.hasOwnProperty(key)) {
-                value = this.values_[key];
-            }
-            return value;
-        };
-
-
-        /**
-         * Get a list of object property names.
-         * @return {Array.<string>} List of property names.
-         * @api
-         */
-        ol.Object.prototype.getKeys = function() {
-            return Object.keys(this.values_);
-        };
-
-
-        /**
-         * Get an object of all property names and values.
-         * @return {Object.<string, *>} Object.
-         * @api
-         */
-        ol.Object.prototype.getProperties = function() {
-            return ol.obj.assign({}, this.values_);
-        };
-
-
-        /**
-         * @param {string} key Key name.
-         * @param {*} oldValue Old value.
-         */
-        ol.Object.prototype.notify = function(key, oldValue) {
-            // FIX ME
-            return;
-        };
-
-
-        /**
-         * Sets a value.
-         * @param {string} key Key name.
-         * @param {*} value Value.
-         * @param {boolean=} opt_silent Update without triggering an event.
-         * @api
-         */
-        ol.Object.prototype.set = function(key, value, opt_silent) {
-            if (opt_silent) {
-                this.values_[key] = value;
-            } else {
-                var oldValue = this.values_[key];
-                this.values_[key] = value;
-                if (oldValue !== value) {
-                    this.notify(key, oldValue);
-                }
-            }
-        };
-
-
-        /**
-         * Sets a collection of key-value pairs.  Note that this changes any existing
-         * properties and adds new ones (it does not remove any existing properties).
-         * @param {Object.<string, *>} values Values.
-         * @param {boolean=} opt_silent Update without triggering an event.
-         * @api
-         */
-        ol.Object.prototype.setProperties = function(values, opt_silent) {
-            var key;
-            for (key in values) {
-                this.set(key, values[key], opt_silent);
-            }
-        };
-
-
-        /**
-         * Unsets a property.
-         * @param {string} key Key name.
-         * @param {boolean=} opt_silent Unset without triggering an event.
-         * @api
-         */
-        ol.Object.prototype.unset = function(key, opt_silent) {
-            if (key in this.values_) {
-                var oldValue = this.values_[key];
-                delete this.values_[key];
-                if (!opt_silent) {
-                    this.notify(key, oldValue);
-                }
-            }
-        };
-
-        ol.Object.Event = function(type, key, oldValue) {
-            ol.events.Event.call(this, type);
-            this.key = key;
-            this.oldValue = oldValue;
-
-        };
-        ol.inherits(ol.Object.Event, ol.events.Event);
-
-        ol.functions = {};
-        /**
-         * Always returns true.
-         * @returns {boolean} true.
-         */
-        ol.functions.TRUE = function() {
-            return true;
-        };
-
-        /**
-         * Always returns false.
-         * @returns {boolean} false.
-         */
-        ol.functions.FALSE = function() {
-            return false;
-        };
-
-        ol.math = {};
-
-        ol.math.clamp = function(value, min, max) {
-            return Math.min(Math.max(value, min), max);
-        };
-
-        ol.math.cosh = (function() {
-            // Wrapped in a iife, to save the overhead of checking for the native
-            // implementation on every invocation.
-            var cosh;
-            if ('cosh' in Math) {
-                // The environment supports the native Math.cosh function, use it…
-                cosh = Math.cosh;
-            } else {
-                // … else, use the reference implementation of MDN:
-                cosh = function(x) {
-                    var y = Math.exp(x);
-                    return (y + 1 / y) / 2;
-                };
-            }
-            return cosh;
-        }());
-
-
-        /**
-         * @param {number} x X.
-         * @return {number} The smallest power of two greater than or equal to x.
-         */
-        ol.math.roundUpToPowerOfTwo = function(x) {
-            ol.asserts.assert(0 < x, 29); // `x` must be greater than `0`
-            return Math.pow(2, Math.ceil(Math.log(x) / Math.LN2));
-        };
-
-        ol.math.squaredSegmentDistance = function(x, y, x1, y1, x2, y2) {
-            var dx = x2 - x1;
-            var dy = y2 - y1;
-            if (dx !== 0 || dy !== 0) {
-                var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);
-                if (t > 1) {
-                    x1 = x2;
-                    y1 = y2;
-                } else if (t > 0) {
-                    x1 += dx * t;
-                    y1 += dy * t;
-                }
-            }
-            return ol.math.squaredDistance(x, y, x1, y1);
-        };
-
-        ol.math.squaredDistance = function(x1, y1, x2, y2) {
-            var dx = x2 - x1;
-            var dy = y2 - y1;
-            return dx * dx + dy * dy;
-        };
-
-        ol.math.solveLinearSystem = function(mat) {
-            var n = mat.length;
-
-            for (var i = 0; i < n; i++) {
-                // Find max in the i-th column (ignoring i - 1 first rows)
-                var maxRow = i;
-                var maxEl = Math.abs(mat[i][i]);
-                for (var r = i + 1; r < n; r++) {
-                    var absValue = Math.abs(mat[r][i]);
-                    if (absValue > maxEl) {
-                        maxEl = absValue;
-                        maxRow = r;
-                    }
-                }
-
-                if (maxEl === 0) {
-                    return null; // matrix is singular
-                }
-
-                // Swap max row with i-th (current) row
-                var tmp = mat[maxRow];
-                mat[maxRow] = mat[i];
-                mat[i] = tmp;
-
-                // Subtract the i-th row to make all the remaining rows 0 in the i-th column
-                for (var j = i + 1; j < n; j++) {
-                    var coef = -mat[j][i] / mat[i][i];
-                    for (var k = i; k < n + 1; k++) {
-                        if (i == k) {
-                            mat[j][k] = 0;
-                        } else {
-                            mat[j][k] += coef * mat[i][k];
-                        }
-                    }
-                }
-            }
-
-            // Solve Ax=b for upper triangular matrix A (mat)
-            var x = new Array(n);
-            for (var l = n - 1; l >= 0; l--) {
-                x[l] = mat[l][n] / mat[l][l];
-                for (var m = l - 1; m >= 0; m--) {
-                    mat[m][n] -= mat[m][l] * x[l];
-                }
-            }
-            return x;
-        };
-
-        ol.math.toDegrees = function(angleInRadians) {
-            return angleInRadians * 180 / Math.PI;
-        };
-
-        ol.math.toRadians = function(angleInDegrees) {
-            return angleInDegrees * Math.PI / 180;
-        };
-
-        ol.math.modulo = function(a, b) {
-            var r = a % b;
-            return r * b < 0 ? r + b : r;
-        };
-
-        ol.math.lerp = function(a, b, x) {
-            return a + x * (b - a);
-        };
-
-        ol.ImageState = {
-            IDLE: 0,
-            LOADING: 1,
-            LOADED: 2,
-            ERROR: 3
-        };
-
-        ol.color = {};
-
-        ol.color.HEX_COLOR_RE_ = /^#(?:[0-9a-f]{3,4}){1,2}$/i;
-
-        ol.color.NAMED_COLOR_RE_ = /^([a-z]*)$/i;
-
-        ol.color.asArray = function(color) {
-            if (Array.isArray(color)) {
-                return color;
-            } else {
-                return ol.color.fromString(/** @type {string} */ (color));
-            }
-        };
-
-        ol.color.asString = function(color) {
-            if (typeof color === 'string') {
-                return color;
-            } else {
-                return ol.color.toString(color);
-            }
-        };
-
-        ol.color.fromNamed = function(color) {
-            var el = document.createElement('div');
-            el.style.color = color;
-            document.body.appendChild(el);
-            var rgb = getComputedStyle(el).color;
-            document.body.removeChild(el);
-            return rgb;
-        };
-
-        ol.color.fromString = (
-            function() {
-
-                // We maintain a small cache of parsed strings.  To provide cheap LRU-like
-                // semantics, whenever the cache grows too large we simply delete an
-                // arbitrary 25% of the entries.
-
-                /**
-                 * @const
-                 * @type {number}
-                 */
-                var MAX_CACHE_SIZE = 1024;
-
-                /**
-                 * @type {Object.<string, ol.Color>}
-                 */
-                var cache = {};
-
-                /**
-                 * @type {number}
-                 */
-                var cacheSize = 0;
-
-                return (
-                    /**
-                     * @param {string} s String.
-                     * @return {ol.Color} Color.
-                     */
-                        function(s) {
-                        var color;
-                        if (cache.hasOwnProperty(s)) {
-                            color = cache[s];
-                        } else {
-                            if (cacheSize >= MAX_CACHE_SIZE) {
-                                var i = 0;
-                                var key;
-                                for (key in cache) {
-                                    if ((i++ & 3) === 0) {
-                                        delete cache[key];
-                                        --cacheSize;
-                                    }
-                                }
-                            }
-                            color = ol.color.fromStringInternal_(s);
-                            cache[s] = color;
-                            ++cacheSize;
-                        }
-                        return color;
-                    });
-
-            })();
-
-        ol.color.fromStringInternal_ = function(s) {
-            var r, g, b, a, color, parts;
-
-            if (ol.color.NAMED_COLOR_RE_.exec(s)) {
-                s = ol.color.fromNamed(s);
-            }
-
-            if (ol.color.HEX_COLOR_RE_.exec(s)) { // hex
-                var n = s.length - 1; // number of hex digits
-                var d; // number of digits per channel
-                if (n <= 4) {
-                    d = 1;
-                } else {
-                    d = 2;
-                }
-                var hasAlpha = n === 4 || n === 8;
-                r = parseInt(s.substr(1 + 0 * d, d), 16);
-                g = parseInt(s.substr(1 + 1 * d, d), 16);
-                b = parseInt(s.substr(1 + 2 * d, d), 16);
-                if (hasAlpha) {
-                    a = parseInt(s.substr(1 + 3 * d, d), 16);
-                } else {
-                    a = 255;
-                }
-                if (d == 1) {
-                    r = (r << 4) + r;
-                    g = (g << 4) + g;
-                    b = (b << 4) + b;
-                    if (hasAlpha) {
-                        a = (a << 4) + a;
-                    }
-                }
-                color = [r, g, b, a / 255];
-            } else if (s.indexOf('rgba(') == 0) { // rgba()
-                parts = s.slice(5, -1).split(',').map(Number);
-                color = ol.color.normalize(parts);
-            } else if (s.indexOf('rgb(') == 0) { // rgb()
-                parts = s.slice(4, -1).split(',').map(Number);
-                parts.push(1);
-                color = ol.color.normalize(parts);
-            } else {
-                ol.asserts.assert(false, 14); // Invalid color
-            }
-            return /** @type {ol.Color} */ (color);
-        };
-
-
-        /**
-         * @param {ol.Color} color Color.
-         * @param {ol.Color=} opt_color Color.
-         * @return {ol.Color} Clamped color.
-         */
-        ol.color.normalize = function(color, opt_color) {
-            var result = opt_color || [];
-            result[0] = ol.math.clamp((color[0] + 0.5) | 0, 0, 255);
-            result[1] = ol.math.clamp((color[1] + 0.5) | 0, 0, 255);
-            result[2] = ol.math.clamp((color[2] + 0.5) | 0, 0, 255);
-            result[3] = ol.math.clamp(color[3], 0, 1);
-            return result;
-        };
-
-
-        /**
-         * @param {ol.Color} color Color.
-         * @return {string} String.
-         */
-        ol.color.toString = function(color) {
-            var r = color[0];
-            if (r != (r | 0)) {
-                r = (r + 0.5) | 0;
-            }
-            var g = color[1];
-            if (g != (g | 0)) {
-                g = (g + 0.5) | 0;
-            }
-            var b = color[2];
-            if (b != (b | 0)) {
-                b = (b + 0.5) | 0;
-            }
-            var a = color[3] === undefined ? 1 : color[3];
-            return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';
-        };
-
-        ol.colorlike = {};
-
-        ol.colorlike.asColorLike = function(color) {
-            if (ol.colorlike.isColorLike(color)) {
-                return /** @type {string|CanvasPattern|CanvasGradient} */ (color);
-            } else {
-                return ol.color.asString(/** @type {ol.Color} */ (color));
-            }
-        };
-
-        ol.colorlike.isColorLike = function(color) {
-            return (
-                typeof color === 'string' ||
-                    color instanceof CanvasPattern ||
-                    color instanceof CanvasGradient
-                );
-        };
-
-        ol.css = {};
-        ol.css.CLASS_HIDDEN = 'ol-hidden';
-        ol.css.CLASS_SELECTABLE = 'ol-selectable';
-        ol.css.CLASS_UNSELECTABLE = 'ol-unselectable';
-        ol.css.CLASS_UNSUPPORTED = 'ol-unsupported';
-        ol.css.CLASS_CONTROL = 'ol-control';
-        ol.css.getFontFamilies = (function() {
-            var style;
-            var cache = {};
-            return function(font) {
-                if (!style) {
-                    style = document.createElement('div').style;
-                }
-                if (!(font in cache)) {
-                    style.font = font;
-                    var family = style.fontFamily;
-                    style.font = '';
-                    if (!family) {
-                        return null;
-                    }
-                    cache[font] = family.split(/,\s?/);
-                }
-                return cache[font];
-            };
-        })();
-
-        ol.dom = {};
-
-        /**
-         * Create an html canvas element and returns its 2d context.
-         * @param {number=} opt_width Canvas width.
-         * @param {number=} opt_height Canvas height.
-         * @return {CanvasRenderingContext2D} The context.
-         */
-        ol.dom.createCanvasContext2D = function(opt_width, opt_height) {
-            //var canvas = document.createElement('CANVAS');
-            var canvas;
-            if (opt_width && opt_height) {
-                canvas = new OffscreenCanvas(opt_width, opt_height);
-            }
-            else{
-                canvas = new OffscreenCanvas(1, 1);
-            }
-            return canvas.getContext('2d');
-        };
-
-
-        /**
-         * Get the current computed width for the given element including margin,
-         * padding and border.
-         * Equivalent to jQuery's `$(el).outerWidth(true)`.
-         * @param {!Element} element Element.
-         * @return {number} The width.
-         */
-        ol.dom.outerWidth = function(element) {
-            var width = element.offsetWidth;
-            var style = getComputedStyle(element);
-            width += parseInt(style.marginLeft, 10) + parseInt(style.marginRight, 10);
-
-            return width;
-        };
-
-
-        /**
-         * Get the current computed height for the given element including margin,
-         * padding and border.
-         * Equivalent to jQuery's `$(el).outerHeight(true)`.
-         * @param {!Element} element Element.
-         * @return {number} The height.
-         */
-        ol.dom.outerHeight = function(element) {
-            var height = element.offsetHeight;
-            var style = getComputedStyle(element);
-            height += parseInt(style.marginTop, 10) + parseInt(style.marginBottom, 10);
-
-            return height;
-        };
-
-        /**
-         * @param {Node} newNode Node to replace old node
-         * @param {Node} oldNode The node to be replaced
-         */
-        ol.dom.replaceNode = function(newNode, oldNode) {
-            var parent = oldNode.parentNode;
-            if (parent) {
-                parent.replaceChild(newNode, oldNode);
-            }
-        };
-
-        /**
-         * @param {Node} node The node to remove.
-         * @returns {Node} The node that was removed or null.
-         */
-        ol.dom.removeNode = function(node) {
-            return node && node.parentNode ? node.parentNode.removeChild(node) : null;
-        };
-
-        /**
-         * @param {Node} node The node to remove the children from.
-         */
-        ol.dom.removeChildren = function(node) {
-            while (node.lastChild) {
-                node.removeChild(node.lastChild);
-            }
-        };
-
-        ol.extent = {};
-
-        ol.extent.Corner = {
-            BOTTOM_LEFT: 'bottom-left',
-            BOTTOM_RIGHT: 'bottom-right',
-            TOP_LEFT: 'top-left',
-            TOP_RIGHT: 'top-right'
-        };
-
-        /**
-         * Relationship to an extent.
-         * @enum {number}
-         */
-        ol.extent.Relationship = {
-            UNKNOWN: 0,
-            INTERSECTING: 1,
-            ABOVE: 2,
-            RIGHT: 4,
-            BELOW: 8,
-            LEFT: 16
-        };
-
-        /**
-         * Build an extent that includes all given coordinates.
-         *
-         * @param {Array.<ol.Coordinate>} coordinates Coordinates.
-         * @return {ol.Extent} Bounding extent.
-         * @api
-         */
-        ol.extent.boundingExtent = function(coordinates) {
-            var extent = ol.extent.createEmpty();
-            for (var i = 0, ii = coordinates.length; i < ii; ++i) {
-                ol.extent.extendCoordinate(extent, coordinates[i]);
-            }
-            return extent;
-        };
-
-        ol.extent.boundingExtentXYs_ = function(xs, ys, opt_extent) {
-            var minX = Math.min.apply(null, xs);
-            var minY = Math.min.apply(null, ys);
-            var maxX = Math.max.apply(null, xs);
-            var maxY = Math.max.apply(null, ys);
-            return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent);
-        };
-
-        ol.extent.buffer = function(extent, value, opt_extent) {
-            if (opt_extent) {
-                opt_extent[0] = extent[0] - value;
-                opt_extent[1] = extent[1] - value;
-                opt_extent[2] = extent[2] + value;
-                opt_extent[3] = extent[3] + value;
-                return opt_extent;
-            } else {
-                return [
-                    extent[0] - value,
-                    extent[1] - value,
-                    extent[2] + value,
-                    extent[3] + value
-                ];
-            }
-        };
-
-        ol.extent.clone = function(extent, opt_extent) {
-            if (opt_extent) {
-                opt_extent[0] = extent[0];
-                opt_extent[1] = extent[1];
-                opt_extent[2] = extent[2];
-                opt_extent[3] = extent[3];
-                return opt_extent;
-            } else {
-                return extent.slice();
-            }
-        };
-
-        ol.extent.closestSquaredDistanceXY = function(extent, x, y) {
-            var dx, dy;
-            if (x < extent[0]) {
-                dx = extent[0] - x;
-            } else if (extent[2] < x) {
-                dx = x - extent[2];
-            } else {
-                dx = 0;
-            }
-            if (y < extent[1]) {
-                dy = extent[1] - y;
-            } else if (extent[3] < y) {
-                dy = y - extent[3];
-            } else {
-                dy = 0;
-            }
-            return dx * dx + dy * dy;
-        };
-
-
-        /**
-         * Check if the passed coordinate is contained or on the edge of the extent.
-         *
-         * @param {ol.Extent} extent Extent.
-         * @param {ol.Coordinate} coordinate Coordinate.
-         * @return {boolean} The coordinate is contained in the extent.
-         * @api
-         */
-        ol.extent.containsCoordinate = function(extent, coordinate) {
-            return ol.extent.containsXY(extent, coordinate[0], coordinate[1]);
-        };
-
-
-        /**
-         * Check if one extent contains another.
-         *
-         * An extent is deemed contained if it lies completely within the other extent,
-         * including if they share one or more edges.
-         *
-         * @param {ol.Extent} extent1 Extent 1.
-         * @param {ol.Extent} extent2 Extent 2.
-         * @return {boolean} The second extent is contained by or on the edge of the
-         *     first.
-         * @api
-         */
-        ol.extent.containsExtent = function(extent1, extent2) {
-            return extent1[0] <= extent2[0] && extent2[2] <= extent1[2] &&
-                extent1[1] <= extent2[1] && extent2[3] <= extent1[3];
-        };
-
-
-        /**
-         * Check if the passed coordinate is contained or on the edge of the extent.
-         *
-         * @param {ol.Extent} extent Extent.
-         * @param {number} x X coordinate.
-         * @param {number} y Y coordinate.
-         * @return {boolean} The x, y values are contained in the extent.
-         * @api
-         */
-        ol.extent.containsXY = function(extent, x, y) {
-            return extent[0] <= x && x <= extent[2] && extent[1] <= y && y <= extent[3];
-        };
-
-
-        /**
-         * Get the relationship between a coordinate and extent.
-         * @param {ol.Extent} extent The extent.
-         * @param {ol.Coordinate} coordinate The coordinate.
-         * @return {number} The relationship (bitwise compare with
-         *     ol.extent.Relationship).
-         */
-        ol.extent.coordinateRelationship = function(extent, coordinate) {
-            var minX = extent[0];
-            var minY = extent[1];
-            var maxX = extent[2];
-            var maxY = extent[3];
-            var x = coordinate[0];
-            var y = coordinate[1];
-            var relationship = ol.extent.Relationship.UNKNOWN;
-            if (x < minX) {
-                relationship = relationship | ol.extent.Relationship.LEFT;
-            } else if (x > maxX) {
-                relationship = relationship | ol.extent.Relationship.RIGHT;
-            }
-            if (y < minY) {
-                relationship = relationship | ol.extent.Relationship.BELOW;
-            } else if (y > maxY) {
-                relationship = relationship | ol.extent.Relationship.ABOVE;
-            }
-            if (relationship === ol.extent.Relationship.UNKNOWN) {
-                relationship = ol.extent.Relationship.INTERSECTING;
-            }
-            return relationship;
-        };
-
-
-        /**
-         * Create an empty extent.
-         * @return {ol.Extent} Empty extent.
-         * @api
-         */
-        ol.extent.createEmpty = function() {
-            return [Infinity, Infinity, -Infinity, -Infinity];
-        };
-
-
-        /**
-         * Create a new extent or update the provided extent.
-         * @param {number} minX Minimum X.
-         * @param {number} minY Minimum Y.
-         * @param {number} maxX Maximum X.
-         * @param {number} maxY Maximum Y.
-         * @param {ol.Extent=} opt_extent Destination extent.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.createOrUpdate = function(minX, minY, maxX, maxY, opt_extent) {
-            if (opt_extent) {
-                opt_extent[0] = minX;
-                opt_extent[1] = minY;
-                opt_extent[2] = maxX;
-                opt_extent[3] = maxY;
-                return opt_extent;
-            } else {
-                return [minX, minY, maxX, maxY];
-            }
-        };
-
-
-        /**
-         * Create a new empty extent or make the provided one empty.
-         * @param {ol.Extent=} opt_extent Extent.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.createOrUpdateEmpty = function(opt_extent) {
-            return ol.extent.createOrUpdate(
-                Infinity, Infinity, -Infinity, -Infinity, opt_extent);
-        };
-
-
-        /**
-         * @param {ol.Coordinate} coordinate Coordinate.
-         * @param {ol.Extent=} opt_extent Extent.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.createOrUpdateFromCoordinate = function(coordinate, opt_extent) {
-            var x = coordinate[0];
-            var y = coordinate[1];
-            return ol.extent.createOrUpdate(x, y, x, y, opt_extent);
-        };
-
-
-        /**
-         * @param {Array.<ol.Coordinate>} coordinates Coordinates.
-         * @param {ol.Extent=} opt_extent Extent.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.createOrUpdateFromCoordinates = function(coordinates, opt_extent) {
-            var extent = ol.extent.createOrUpdateEmpty(opt_extent);
-            return ol.extent.extendCoordinates(extent, coordinates);
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @param {ol.Extent=} opt_extent Extent.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.createOrUpdateFromFlatCoordinates = function(flatCoordinates, offset, end, stride, opt_extent) {
-            var extent = ol.extent.createOrUpdateEmpty(opt_extent);
-            return ol.extent.extendFlatCoordinates(
-                extent, flatCoordinates, offset, end, stride);
-        };
-
-
-        /**
-         * @param {Array.<Array.<ol.Coordinate>>} rings Rings.
-         * @param {ol.Extent=} opt_extent Extent.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.createOrUpdateFromRings = function(rings, opt_extent) {
-            var extent = ol.extent.createOrUpdateEmpty(opt_extent);
-            return ol.extent.extendRings(extent, rings);
-        };
-
-
-        /**
-         * Determine if two extents are equivalent.
-         * @param {ol.Extent} extent1 Extent 1.
-         * @param {ol.Extent} extent2 Extent 2.
-         * @return {boolean} The two extents are equivalent.
-         * @api
-         */
-        ol.extent.equals = function(extent1, extent2) {
-            return extent1[0] == extent2[0] && extent1[2] == extent2[2] &&
-                extent1[1] == extent2[1] && extent1[3] == extent2[3];
-        };
-
-
-        /**
-         * Modify an extent to include another extent.
-         * @param {ol.Extent} extent1 The extent to be modified.
-         * @param {ol.Extent} extent2 The extent that will be included in the first.
-         * @return {ol.Extent} A reference to the first (extended) extent.
-         * @api
-         */
-        ol.extent.extend = function(extent1, extent2) {
-            if (extent2[0] < extent1[0]) {
-                extent1[0] = extent2[0];
-            }
-            if (extent2[2] > extent1[2]) {
-                extent1[2] = extent2[2];
-            }
-            if (extent2[1] < extent1[1]) {
-                extent1[1] = extent2[1];
-            }
-            if (extent2[3] > extent1[3]) {
-                extent1[3] = extent2[3];
-            }
-            return extent1;
-        };
-
-
-        /**
-         * @param {ol.Extent} extent Extent.
-         * @param {ol.Coordinate} coordinate Coordinate.
-         */
-        ol.extent.extendCoordinate = function(extent, coordinate) {
-            if (coordinate[0] < extent[0]) {
-                extent[0] = coordinate[0];
-            }
-            if (coordinate[0] > extent[2]) {
-                extent[2] = coordinate[0];
-            }
-            if (coordinate[1] < extent[1]) {
-                extent[1] = coordinate[1];
-            }
-            if (coordinate[1] > extent[3]) {
-                extent[3] = coordinate[1];
-            }
-        };
-
-
-        /**
-         * @param {ol.Extent} extent Extent.
-         * @param {Array.<ol.Coordinate>} coordinates Coordinates.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.extendCoordinates = function(extent, coordinates) {
-            var i, ii;
-            for (i = 0, ii = coordinates.length; i < ii; ++i) {
-                ol.extent.extendCoordinate(extent, coordinates[i]);
-            }
-            return extent;
-        };
-
-
-        /**
-         * @param {ol.Extent} extent Extent.
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.extendFlatCoordinates = function(extent, flatCoordinates, offset, end, stride) {
-            for (; offset < end; offset += stride) {
-                ol.extent.extendXY(
-                    extent, flatCoordinates[offset], flatCoordinates[offset + 1]);
-            }
-            return extent;
-        };
-
-
-        /**
-         * @param {ol.Extent} extent Extent.
-         * @param {Array.<Array.<ol.Coordinate>>} rings Rings.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.extendRings = function(extent, rings) {
-            var i, ii;
-            for (i = 0, ii = rings.length; i < ii; ++i) {
-                ol.extent.extendCoordinates(extent, rings[i]);
-            }
-            return extent;
-        };
-
-
-        /**
-         * @param {ol.Extent} extent Extent.
-         * @param {number} x X.
-         * @param {number} y Y.
-         */
-        ol.extent.extendXY = function(extent, x, y) {
-            extent[0] = Math.min(extent[0], x);
-            extent[1] = Math.min(extent[1], y);
-            extent[2] = Math.max(extent[2], x);
-            extent[3] = Math.max(extent[3], y);
-        };
-
-
-        /**
-         * This function calls `callback` for each corner of the extent. If the
-         * callback returns a truthy value the function returns that value
-         * immediately. Otherwise the function returns `false`.
-         * @param {ol.Extent} extent Extent.
-         * @param {function(this:T, ol.Coordinate): S} callback Callback.
-         * @param {T=} opt_this Value to use as `this` when executing `callback`.
-         * @return {S|boolean} Value.
-         * @template S, T
-         */
-        ol.extent.forEachCorner = function(extent, callback, opt_this) {
-            var val;
-            val = callback.call(opt_this, ol.extent.getBottomLeft(extent));
-            if (val) {
-                return val;
-            }
-            val = callback.call(opt_this, ol.extent.getBottomRight(extent));
-            if (val) {
-                return val;
-            }
-            val = callback.call(opt_this, ol.extent.getTopRight(extent));
-            if (val) {
-                return val;
-            }
-            val = callback.call(opt_this, ol.extent.getTopLeft(extent));
-            if (val) {
-                return val;
-            }
-            return false;
-        };
-
-
-        /**
-         * Get the size of an extent.
-         * @param {ol.Extent} extent Extent.
-         * @return {number} Area.
-         * @api
-         */
-        ol.extent.getArea = function(extent) {
-            var area = 0;
-            if (!ol.extent.isEmpty(extent)) {
-                area = ol.extent.getWidth(extent) * ol.extent.getHeight(extent);
-            }
-            return area;
-        };
-
-
-        /**
-         * Get the bottom left coordinate of an extent.
-         * @param {ol.Extent} extent Extent.
-         * @return {ol.Coordinate} Bottom left coordinate.
-         * @api
-         */
-        ol.extent.getBottomLeft = function(extent) {
-            return [extent[0], extent[1]];
-        };
-
-
-        /**
-         * Get the bottom right coordinate of an extent.
-         * @param {ol.Extent} extent Extent.
-         * @return {ol.Coordinate} Bottom right coordinate.
-         * @api
-         */
-        ol.extent.getBottomRight = function(extent) {
-            return [extent[2], extent[1]];
-        };
-
-
-        /**
-         * Get the center coordinate of an extent.
-         * @param {ol.Extent} extent Extent.
-         * @return {ol.Coordinate} Center.
-         * @api
-         */
-        ol.extent.getCenter = function(extent) {
-            return [(extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2];
-        };
-
-
-        /**
-         * Get a corner coordinate of an extent.
-         * @param {ol.Extent} extent Extent.
-         * @param {ol.extent.Corner} corner Corner.
-         * @return {ol.Coordinate} Corner coordinate.
-         */
-        ol.extent.getCorner = function(extent, corner) {
-            var coordinate;
-            if (corner === ol.extent.Corner.BOTTOM_LEFT) {
-                coordinate = ol.extent.getBottomLeft(extent);
-            } else if (corner === ol.extent.Corner.BOTTOM_RIGHT) {
-                coordinate = ol.extent.getBottomRight(extent);
-            } else if (corner === ol.extent.Corner.TOP_LEFT) {
-                coordinate = ol.extent.getTopLeft(extent);
-            } else if (corner === ol.extent.Corner.TOP_RIGHT) {
-                coordinate = ol.extent.getTopRight(extent);
-            } else {
-                ol.asserts.assert(false, 13); // Invalid corner
-            }
-            return /** @type {!ol.Coordinate} */ (coordinate);
-        };
-
-
-        /**
-         * @param {ol.Extent} extent1 Extent 1.
-         * @param {ol.Extent} extent2 Extent 2.
-         * @return {number} Enlarged area.
-         */
-        ol.extent.getEnlargedArea = function(extent1, extent2) {
-            var minX = Math.min(extent1[0], extent2[0]);
-            var minY = Math.min(extent1[1], extent2[1]);
-            var maxX = Math.max(extent1[2], extent2[2]);
-            var maxY = Math.max(extent1[3], extent2[3]);
-            return (maxX - minX) * (maxY - minY);
-        };
-
-
-        /**
-         * @param {ol.Coordinate} center Center.
-         * @param {number} resolution Resolution.
-         * @param {number} rotation Rotation.
-         * @param {ol.Size} size Size.
-         * @param {ol.Extent=} opt_extent Destination extent.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.getForViewAndSize = function(center, resolution, rotation, size, opt_extent) {
-            var dx = resolution * size[0] / 2;
-            var dy = resolution * size[1] / 2;
-            var cosRotation = Math.cos(rotation);
-            var sinRotation = Math.sin(rotation);
-            var xCos = dx * cosRotation;
-            var xSin = dx * sinRotation;
-            var yCos = dy * cosRotation;
-            var ySin = dy * sinRotation;
-            var x = center[0];
-            var y = center[1];
-            var x0 = x - xCos + ySin;
-            var x1 = x - xCos - ySin;
-            var x2 = x + xCos - ySin;
-            var x3 = x + xCos + ySin;
-            var y0 = y - xSin - yCos;
-            var y1 = y - xSin + yCos;
-            var y2 = y + xSin + yCos;
-            var y3 = y + xSin - yCos;
-            return ol.extent.createOrUpdate(
-                Math.min(x0, x1, x2, x3), Math.min(y0, y1, y2, y3),
-                Math.max(x0, x1, x2, x3), Math.max(y0, y1, y2, y3),
-                opt_extent);
-        };
-
-
-        /**
-         * Get the height of an extent.
-         * @param {ol.Extent} extent Extent.
-         * @return {number} Height.
-         * @api
-         */
-        ol.extent.getHeight = function(extent) {
-            return extent[3] - extent[1];
-        };
-
-
-        /**
-         * @param {ol.Extent} extent1 Extent 1.
-         * @param {ol.Extent} extent2 Extent 2.
-         * @return {number} Intersection area.
-         */
-        ol.extent.getIntersectionArea = function(extent1, extent2) {
-            var intersection = ol.extent.getIntersection(extent1, extent2);
-            return ol.extent.getArea(intersection);
-        };
-
-
-        /**
-         * Get the intersection of two extents.
-         * @param {ol.Extent} extent1 Extent 1.
-         * @param {ol.Extent} extent2 Extent 2.
-         * @param {ol.Extent=} opt_extent Optional extent to populate with intersection.
-         * @return {ol.Extent} Intersecting extent.
-         * @api
-         */
-        ol.extent.getIntersection = function(extent1, extent2, opt_extent) {
-            var intersection = opt_extent ? opt_extent : ol.extent.createEmpty();
-            if (ol.extent.intersects(extent1, extent2)) {
-                if (extent1[0] > extent2[0]) {
-                    intersection[0] = extent1[0];
-                } else {
-                    intersection[0] = extent2[0];
-                }
-                if (extent1[1] > extent2[1]) {
-                    intersection[1] = extent1[1];
-                } else {
-                    intersection[1] = extent2[1];
-                }
-                if (extent1[2] < extent2[2]) {
-                    intersection[2] = extent1[2];
-                } else {
-                    intersection[2] = extent2[2];
-                }
-                if (extent1[3] < extent2[3]) {
-                    intersection[3] = extent1[3];
-                } else {
-                    intersection[3] = extent2[3];
-                }
-            }
-            return intersection;
-        };
-
-
-        /**
-         * @param {ol.Extent} extent Extent.
-         * @return {number} Margin.
-         */
-        ol.extent.getMargin = function(extent) {
-            return ol.extent.getWidth(extent) + ol.extent.getHeight(extent);
-        };
-
-
-        /**
-         * Get the size (width, height) of an extent.
-         * @param {ol.Extent} extent The extent.
-         * @return {ol.Size} The extent size.
-         * @api
-         */
-        ol.extent.getSize = function(extent) {
-            return [extent[2] - extent[0], extent[3] - extent[1]];
-        };
-
-
-        /**
-         * Get the top left coordinate of an extent.
-         * @param {ol.Extent} extent Extent.
-         * @return {ol.Coordinate} Top left coordinate.
-         * @api
-         */
-        ol.extent.getTopLeft = function(extent) {
-            return [extent[0], extent[3]];
-        };
-
-
-        /**
-         * Get the top right coordinate of an extent.
-         * @param {ol.Extent} extent Extent.
-         * @return {ol.Coordinate} Top right coordinate.
-         * @api
-         */
-        ol.extent.getTopRight = function(extent) {
-            return [extent[2], extent[3]];
-        };
-
-
-        /**
-         * Get the width of an extent.
-         * @param {ol.Extent} extent Extent.
-         * @return {number} Width.
-         * @api
-         */
-        ol.extent.getWidth = function(extent) {
-            return extent[2] - extent[0];
-        };
-
-
-        /**
-         * Determine if one extent intersects another.
-         * @param {ol.Extent} extent1 Extent 1.
-         * @param {ol.Extent} extent2 Extent.
-         * @return {boolean} The two extents intersect.
-         * @api
-         */
-        ol.extent.intersects = function(extent1, extent2) {
-            return extent1[0] <= extent2[2] &&
-                extent1[2] >= extent2[0] &&
-                extent1[1] <= extent2[3] &&
-                extent1[3] >= extent2[1];
-        };
-
-
-        /**
-         * Determine if an extent is empty.
-         * @param {ol.Extent} extent Extent.
-         * @return {boolean} Is empty.
-         * @api
-         */
-        ol.extent.isEmpty = function(extent) {
-            return extent[2] < extent[0] || extent[3] < extent[1];
-        };
-
-
-        /**
-         * @param {ol.Extent} extent Extent.
-         * @param {ol.Extent=} opt_extent Extent.
-         * @return {ol.Extent} Extent.
-         */
-        ol.extent.returnOrUpdate = function(extent, opt_extent) {
-            if (opt_extent) {
-                opt_extent[0] = extent[0];
-                opt_extent[1] = extent[1];
-                opt_extent[2] = extent[2];
-                opt_extent[3] = extent[3];
-                return opt_extent;
-            } else {
-                return extent;
-            }
-        };
-
-
-        /**
-         * @param {ol.Extent} extent Extent.
-         * @param {number} value Value.
-         */
-        ol.extent.scaleFromCenter = function(extent, value) {
-            var deltaX = ((extent[2] - extent[0]) / 2) * (value - 1);
-            var deltaY = ((extent[3] - extent[1]) / 2) * (value - 1);
-            extent[0] -= deltaX;
-            extent[2] += deltaX;
-            extent[1] -= deltaY;
-            extent[3] += deltaY;
-        };
-
-
-        /**
-         * Determine if the segment between two coordinates intersects (crosses,
-         * touches, or is contained by) the provided extent.
-         * @param {ol.Extent} extent The extent.
-         * @param {ol.Coordinate} start Segment start coordinate.
-         * @param {ol.Coordinate} end Segment end coordinate.
-         * @return {boolean} The segment intersects the extent.
-         */
-        ol.extent.intersectsSegment = function(extent, start, end) {
-            var intersects = false;
-            var startRel = ol.extent.coordinateRelationship(extent, start);
-            var endRel = ol.extent.coordinateRelationship(extent, end);
-            if (startRel === ol.extent.Relationship.INTERSECTING ||
-                endRel === ol.extent.Relationship.INTERSECTING) {
-                intersects = true;
-            } else {
-                var minX = extent[0];
-                var minY = extent[1];
-                var maxX = extent[2];
-                var maxY = extent[3];
-                var startX = start[0];
-                var startY = start[1];
-                var endX = end[0];
-                var endY = end[1];
-                var slope = (endY - startY) / (endX - startX);
-                var x, y;
-                if (!!(endRel & ol.extent.Relationship.ABOVE) &&
-                    !(startRel & ol.extent.Relationship.ABOVE)) {
-                    // potentially intersects top
-                    x = endX - ((endY - maxY) / slope);
-                    intersects = x >= minX && x <= maxX;
-                }
-                if (!intersects && !!(endRel & ol.extent.Relationship.RIGHT) &&
-                    !(startRel & ol.extent.Relationship.RIGHT)) {
-                    // potentially intersects right
-                    y = endY - ((endX - maxX) * slope);
-                    intersects = y >= minY && y <= maxY;
-                }
-                if (!intersects && !!(endRel & ol.extent.Relationship.BELOW) &&
-                    !(startRel & ol.extent.Relationship.BELOW)) {
-                    // potentially intersects bottom
-                    x = endX - ((endY - minY) / slope);
-                    intersects = x >= minX && x <= maxX;
-                }
-                if (!intersects && !!(endRel & ol.extent.Relationship.LEFT) &&
-                    !(startRel & ol.extent.Relationship.LEFT)) {
-                    // potentially intersects left
-                    y = endY - ((endX - minX) * slope);
-                    intersects = y >= minY && y <= maxY;
-                }
-
-            }
-            return intersects;
-        };
-
-
-        /**
-         * Apply a transform function to the extent.
-         * @param {ol.Extent} extent Extent.
-         * @param {ol.TransformFunction} transformFn Transform function.  Called with
-         * [minX, minY, maxX, maxY] extent coordinates.
-         * @param {ol.Extent=} opt_extent Destination extent.
-         * @return {ol.Extent} Extent.
-         * @api
-         */
-        ol.extent.applyTransform = function(extent, transformFn, opt_extent) {
-            var coordinates = [
-                extent[0], extent[1],
-                extent[0], extent[3],
-                extent[2], extent[1],
-                extent[2], extent[3]
-            ];
-            transformFn(coordinates, coordinates, 2);
-            var xs = [coordinates[0], coordinates[2], coordinates[4], coordinates[6]];
-            var ys = [coordinates[1], coordinates[3], coordinates[5], coordinates[7]];
-            return ol.extent.boundingExtentXYs_(xs, ys, opt_extent);
-        };
-
-        ol.obj = {};
-
-        /**
-         * Polyfill for Object.assign().  Assigns enumerable and own properties from
-         * one or more source objects to a target object.
-         *
-         * @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
-         * @param {!Object} target The target object.
-         * @param {...Object} var_sources The source object(s).
-         * @return {!Object} The modified target object.
-         */
-        ol.obj.assign = (typeof Object.assign === 'function') ? Object.assign : function(target, var_sources) {
-            if (target === undefined || target === null) {
-                throw new TypeError('Cannot convert undefined or null to object');
-            }
-
-            var output = Object(target);
-            for (var i = 1, ii = arguments.length; i < ii; ++i) {
-                var source = arguments[i];
-                if (source !== undefined && source !== null) {
-                    for (var key in source) {
-                        if (source.hasOwnProperty(key)) {
-                            output[key] = source[key];
-                        }
-                    }
-                }
-            }
-            return output;
-        };
-
-
-        /**
-         * Removes all properties from an object.
-         * @param {Object} object The object to clear.
-         */
-        ol.obj.clear = function(object) {
-            for (var property in object) {
-                delete object[property];
-            }
-        };
-
-
-        /**
-         * Get an array of property values from an object.
-         * @param {Object<K,V>} object The object from which to get the values.
-         * @return {!Array<V>} The property values.
-         * @template K,V
-         */
-        ol.obj.getValues = function(object) {
-            var values = [];
-            for (var property in object) {
-                values.push(object[property]);
-            }
-            return values;
-        };
-
-
-        /**
-         * Determine if an object has any properties.
-         * @param {Object} object The object to check.
-         * @return {boolean} The object is empty.
-         */
-        ol.obj.isEmpty = function(object) {
-            var property;
-            for (property in object) {
-                return false;
-            }
-            return !property;
-        };
-
-        ol.transform = {};
-
-        /**
-         * @private
-         * @type {ol.Transform}
-         */
-        ol.transform.tmp_ = new Array(6);
-
-
-        /**
-         * Create an identity transform.
-         * @return {!ol.Transform} Identity transform.
-         */
-        ol.transform.create = function() {
-            return [1, 0, 0, 1, 0, 0];
-        };
-
-
-        /**
-         * Resets the given transform to an identity transform.
-         * @param {!ol.Transform} transform Transform.
-         * @return {!ol.Transform} Transform.
-         */
-        ol.transform.reset = function(transform) {
-            return ol.transform.set(transform, 1, 0, 0, 1, 0, 0);
-        };
-
-
-        /**
-         * Multiply the underlying matrices of two transforms and return the result in
-         * the first transform.
-         * @param {!ol.Transform} transform1 Transform parameters of matrix 1.
-         * @param {!ol.Transform} transform2 Transform parameters of matrix 2.
-         * @return {!ol.Transform} transform1 multiplied with transform2.
-         */
-        ol.transform.multiply = function(transform1, transform2) {
-            var a1 = transform1[0];
-            var b1 = transform1[1];
-            var c1 = transform1[2];
-            var d1 = transform1[3];
-            var e1 = transform1[4];
-            var f1 = transform1[5];
-            var a2 = transform2[0];
-            var b2 = transform2[1];
-            var c2 = transform2[2];
-            var d2 = transform2[3];
-            var e2 = transform2[4];
-            var f2 = transform2[5];
-
-            transform1[0] = a1 * a2 + c1 * b2;
-            transform1[1] = b1 * a2 + d1 * b2;
-            transform1[2] = a1 * c2 + c1 * d2;
-            transform1[3] = b1 * c2 + d1 * d2;
-            transform1[4] = a1 * e2 + c1 * f2 + e1;
-            transform1[5] = b1 * e2 + d1 * f2 + f1;
-
-            return transform1;
-        };
-
-        /**
-         * Set the transform components a-f on a given transform.
-         * @param {!ol.Transform} transform Transform.
-         * @param {number} a The a component of the transform.
-         * @param {number} b The b component of the transform.
-         * @param {number} c The c component of the transform.
-         * @param {number} d The d component of the transform.
-         * @param {number} e The e component of the transform.
-         * @param {number} f The f component of the transform.
-         * @return {!ol.Transform} Matrix with transform applied.
-         */
-        ol.transform.set = function(transform, a, b, c, d, e, f) {
-            transform[0] = a;
-            transform[1] = b;
-            transform[2] = c;
-            transform[3] = d;
-            transform[4] = e;
-            transform[5] = f;
-            return transform;
-        };
-
-
-        /**
-         * Set transform on one matrix from another matrix.
-         * @param {!ol.Transform} transform1 Matrix to set transform to.
-         * @param {!ol.Transform} transform2 Matrix to set transform from.
-         * @return {!ol.Transform} transform1 with transform from transform2 applied.
-         */
-        ol.transform.setFromArray = function(transform1, transform2) {
-            transform1[0] = transform2[0];
-            transform1[1] = transform2[1];
-            transform1[2] = transform2[2];
-            transform1[3] = transform2[3];
-            transform1[4] = transform2[4];
-            transform1[5] = transform2[5];
-            return transform1;
-        };
-
-
-        /**
-         * Transforms the given coordinate with the given transform returning the
-         * resulting, transformed coordinate. The coordinate will be modified in-place.
-         *
-         * @param {ol.Transform} transform The transformation.
-         * @param {ol.Coordinate|ol.Pixel} coordinate The coordinate to transform.
-         * @return {ol.Coordinate|ol.Pixel} return coordinate so that operations can be
-         *     chained together.
-         */
-        ol.transform.apply = function(transform, coordinate) {
-            var x = coordinate[0], y = coordinate[1];
-            coordinate[0] = transform[0] * x + transform[2] * y + transform[4];
-            coordinate[1] = transform[1] * x + transform[3] * y + transform[5];
-            return coordinate;
-        };
-
-
-        /**
-         * Applies rotation to the given transform.
-         * @param {!ol.Transform} transform Transform.
-         * @param {number} angle Angle in radians.
-         * @return {!ol.Transform} The rotated transform.
-         */
-        ol.transform.rotate = function(transform, angle) {
-            var cos = Math.cos(angle);
-            var sin = Math.sin(angle);
-            return ol.transform.multiply(transform,
-                ol.transform.set(ol.transform.tmp_, cos, sin, -sin, cos, 0, 0));
-        };
-
-
-        /**
-         * Applies scale to a given transform.
-         * @param {!ol.Transform} transform Transform.
-         * @param {number} x Scale factor x.
-         * @param {number} y Scale factor y.
-         * @return {!ol.Transform} The scaled transform.
-         */
-        ol.transform.scale = function(transform, x, y) {
-            return ol.transform.multiply(transform,
-                ol.transform.set(ol.transform.tmp_, x, 0, 0, y, 0, 0));
-        };
-
-
-        /**
-         * Applies translation to the given transform.
-         * @param {!ol.Transform} transform Transform.
-         * @param {number} dx Translation x.
-         * @param {number} dy Translation y.
-         * @return {!ol.Transform} The translated transform.
-         */
-        ol.transform.translate = function(transform, dx, dy) {
-            return ol.transform.multiply(transform,
-                ol.transform.set(ol.transform.tmp_, 1, 0, 0, 1, dx, dy));
-        };
-
-
-        /**
-         * Creates a composite transform given an initial translation, scale, rotation, and
-         * final translation (in that order only, not commutative).
-         * @param {!ol.Transform} transform The transform (will be modified in place).
-         * @param {number} dx1 Initial translation x.
-         * @param {number} dy1 Initial translation y.
-         * @param {number} sx Scale factor x.
-         * @param {number} sy Scale factor y.
-         * @param {number} angle Rotation (in counter-clockwise radians).
-         * @param {number} dx2 Final translation x.
-         * @param {number} dy2 Final translation y.
-         * @return {!ol.Transform} The composite transform.
-         */
-        ol.transform.compose = function(transform, dx1, dy1, sx, sy, angle, dx2, dy2) {
-            var sin = Math.sin(angle);
-            var cos = Math.cos(angle);
-            transform[0] = sx * cos;
-            transform[1] = sy * sin;
-            transform[2] = -sx * sin;
-            transform[3] = sy * cos;
-            transform[4] = dx2 * sx * cos - dy2 * sx * sin + dx1;
-            transform[5] = dx2 * sy * sin + dy2 * sy * cos + dy1;
-            return transform;
-        };
-
-
-        /**
-         * Invert the given transform.
-         * @param {!ol.Transform} transform Transform.
-         * @return {!ol.Transform} Inverse of the transform.
-         */
-        ol.transform.invert = function(transform) {
-            var det = ol.transform.determinant(transform);
-            //ol.asserts.assert(det !== 0, 32); // Transformation matrix cannot be inverted
-
-            var a = transform[0];
-            var b = transform[1];
-            var c = transform[2];
-            var d = transform[3];
-            var e = transform[4];
-            var f = transform[5];
-
-            transform[0] = d / det;
-            transform[1] = -b / det;
-            transform[2] = -c / det;
-            transform[3] = a / det;
-            transform[4] = (c * f - d * e) / det;
-            transform[5] = -(a * f - b * e) / det;
-
-            return transform;
-        };
-
-
-        /**
-         * Returns the determinant of the given matrix.
-         * @param {!ol.Transform} mat Matrix.
-         * @return {number} Determinant.
-         */
-        ol.transform.determinant = function(mat) {
-            return mat[0] * mat[3] - mat[1] * mat[2];
-        };
-
-        ol.geom = {};
-        ol.geom.flat = {};
-        ol.geom.flat.center = {};
-        ol.geom.flat.reverse = {};
-        ol.geom.flat.orient = {};
-
-
-        ol.geom.flat.transform = {};
-        ol.geom.flat.transform.transform2D = function(flatCoordinates, offset, end, stride, transform, opt_dest) {
-            var dest = opt_dest ? opt_dest : [];
-            var i = 0;
-            var j;
-            for (j = offset; j < end; j += stride) {
-                var x = flatCoordinates[j];
-                var y = flatCoordinates[j + 1];
-                dest[i++] = transform[0] * x + transform[2] * y + transform[4];
-                dest[i++] = transform[1] * x + transform[3] * y + transform[5];
-            }
-            if (opt_dest && dest.length != i) {
-                dest.length = i;
-            }
-            return dest;
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @param {number} angle Angle.
-         * @param {Array.<number>} anchor Rotation anchor point.
-         * @param {Array.<number>=} opt_dest Destination.
-         * @return {Array.<number>} Transformed coordinates.
-         */
-        ol.geom.flat.transform.rotate = function(flatCoordinates, offset, end, stride, angle, anchor, opt_dest) {
-            var dest = opt_dest ? opt_dest : [];
-            var cos = Math.cos(angle);
-            var sin = Math.sin(angle);
-            var anchorX = anchor[0];
-            var anchorY = anchor[1];
-            var i = 0;
-            for (var j = offset; j < end; j += stride) {
-                var deltaX = flatCoordinates[j] - anchorX;
-                var deltaY = flatCoordinates[j + 1] - anchorY;
-                dest[i++] = anchorX + deltaX * cos - deltaY * sin;
-                dest[i++] = anchorY + deltaX * sin + deltaY * cos;
-                for (var k = j + 2; k < j + stride; ++k) {
-                    dest[i++] = flatCoordinates[k];
-                }
-            }
-            if (opt_dest && dest.length != i) {
-                dest.length = i;
-            }
-            return dest;
-        };
-
-
-        /**
-         * Scale the coordinates.
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @param {number} sx Scale factor in the x-direction.
-         * @param {number} sy Scale factor in the y-direction.
-         * @param {Array.<number>} anchor Scale anchor point.
-         * @param {Array.<number>=} opt_dest Destination.
-         * @return {Array.<number>} Transformed coordinates.
-         */
-        ol.geom.flat.transform.scale = function(flatCoordinates, offset, end, stride, sx, sy, anchor, opt_dest) {
-            var dest = opt_dest ? opt_dest : [];
-            var anchorX = anchor[0];
-            var anchorY = anchor[1];
-            var i = 0;
-            for (var j = offset; j < end; j += stride) {
-                var deltaX = flatCoordinates[j] - anchorX;
-                var deltaY = flatCoordinates[j + 1] - anchorY;
-                dest[i++] = anchorX + sx * deltaX;
-                dest[i++] = anchorY + sy * deltaY;
-                for (var k = j + 2; k < j + stride; ++k) {
-                    dest[i++] = flatCoordinates[k];
-                }
-            }
-            if (opt_dest && dest.length != i) {
-                dest.length = i;
-            }
-            return dest;
-        };
-
-        /**
-         * The coordinate layout for geometries, indicating whether a 3rd or 4th z ('Z')
-         * or measure ('M') coordinate is available. Supported values are `'XY'`,
-         * `'XYZ'`, `'XYM'`, `'XYZM'`.
-         * @enum {string}
-         */
-        ol.geom.GeometryLayout = {
-            XY: 'XY',
-            XYZ: 'XYZ',
-            XYM: 'XYM',
-            XYZM: 'XYZM'
-        };
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         */
-        ol.geom.flat.reverse.coordinates = function(flatCoordinates, offset, end, stride) {
-            while (offset < end - stride) {
-                var i;
-                for (i = 0; i < stride; ++i) {
-                    var tmp = flatCoordinates[offset + i];
-                    flatCoordinates[offset + i] = flatCoordinates[end - stride + i];
-                    flatCoordinates[end - stride + i] = tmp;
-                }
-                offset += stride;
-                end -= stride;
-            }
-        };
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @return {boolean} Is clockwise.
-         */
-        ol.geom.flat.orient.linearRingIsClockwise = function(flatCoordinates, offset, end, stride) {
-            // http://tinyurl.com/clockwise-method
-            // https://github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrlinearring.cpp
-            var edge = 0;
-            var x1 = flatCoordinates[end - stride];
-            var y1 = flatCoordinates[end - stride + 1];
-            for (; offset < end; offset += stride) {
-                var x2 = flatCoordinates[offset];
-                var y2 = flatCoordinates[offset + 1];
-                edge += (x2 - x1) * (y2 + y1);
-                x1 = x2;
-                y1 = y2;
-            }
-            return edge > 0;
-        };
-
-
-        /**
-         * Determines if linear rings are oriented.  By default, left-hand orientation
-         * is tested (first ring must be clockwise, remaining rings counter-clockwise).
-         * To test for right-hand orientation, use the `opt_right` argument.
-         *
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<number>} ends Array of end indexes.
-         * @param {number} stride Stride.
-         * @param {boolean=} opt_right Test for right-hand orientation
-         *     (counter-clockwise exterior ring and clockwise interior rings).
-         * @return {boolean} Rings are correctly oriented.
-         */
-        ol.geom.flat.orient.linearRingsAreOriented = function(flatCoordinates, offset, ends, stride, opt_right) {
-            var right = opt_right !== undefined ? opt_right : false;
-            var i, ii;
-            for (i = 0, ii = ends.length; i < ii; ++i) {
-                var end = ends[i];
-                var isClockwise = ol.geom.flat.orient.linearRingIsClockwise(
-                    flatCoordinates, offset, end, stride);
-                if (i === 0) {
-                    if ((right && isClockwise) || (!right && !isClockwise)) {
-                        return false;
-                    }
-                } else {
-                    if ((right && !isClockwise) || (!right && isClockwise)) {
-                        return false;
-                    }
-                }
-                offset = end;
-            }
-            return true;
-        };
-
-
-        /**
-         * Determines if linear rings are oriented.  By default, left-hand orientation
-         * is tested (first ring must be clockwise, remaining rings counter-clockwise).
-         * To test for right-hand orientation, use the `opt_right` argument.
-         *
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<Array.<number>>} endss Array of array of end indexes.
-         * @param {number} stride Stride.
-         * @param {boolean=} opt_right Test for right-hand orientation
-         *     (counter-clockwise exterior ring and clockwise interior rings).
-         * @return {boolean} Rings are correctly oriented.
-         */
-        ol.geom.flat.orient.linearRingssAreOriented = function(flatCoordinates, offset, endss, stride, opt_right) {
-            var i, ii;
-            for (i = 0, ii = endss.length; i < ii; ++i) {
-                if (!ol.geom.flat.orient.linearRingsAreOriented(
-                    flatCoordinates, offset, endss[i], stride, opt_right)) {
-                    return false;
-                }
-            }
-            return true;
-        };
-
-
-        /**
-         * Orient coordinates in a flat array of linear rings.  By default, rings
-         * are oriented following the left-hand rule (clockwise for exterior and
-         * counter-clockwise for interior rings).  To orient according to the
-         * right-hand rule, use the `opt_right` argument.
-         *
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<number>} ends Ends.
-         * @param {number} stride Stride.
-         * @param {boolean=} opt_right Follow the right-hand rule for orientation.
-         * @return {number} End.
-         */
-        ol.geom.flat.orient.orientLinearRings = function(flatCoordinates, offset, ends, stride, opt_right) {
-            var right = opt_right !== undefined ? opt_right : false;
-            var i, ii;
-            for (i = 0, ii = ends.length; i < ii; ++i) {
-                var end = ends[i];
-                var isClockwise = ol.geom.flat.orient.linearRingIsClockwise(
-                    flatCoordinates, offset, end, stride);
-                var reverse = i === 0 ?
-                    (right && isClockwise) || (!right && !isClockwise) :
-                    (right && !isClockwise) || (!right && isClockwise);
-                if (reverse) {
-                    ol.geom.flat.reverse.coordinates(flatCoordinates, offset, end, stride);
-                }
-                offset = end;
-            }
-            return offset;
-        };
-
-
-        /**
-         * Orient coordinates in a flat array of linear rings.  By default, rings
-         * are oriented following the left-hand rule (clockwise for exterior and
-         * counter-clockwise for interior rings).  To orient according to the
-         * right-hand rule, use the `opt_right` argument.
-         *
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<Array.<number>>} endss Array of array of end indexes.
-         * @param {number} stride Stride.
-         * @param {boolean=} opt_right Follow the right-hand rule for orientation.
-         * @return {number} End.
-         */
-        ol.geom.flat.orient.orientLinearRingss = function(flatCoordinates, offset, endss, stride, opt_right) {
-            var i, ii;
-            for (i = 0, ii = endss.length; i < ii; ++i) {
-                offset = ol.geom.flat.orient.orientLinearRings(
-                    flatCoordinates, offset, endss[i], stride, opt_right);
-            }
-            return offset;
-        };
-
-        ol.geom.flat.simplify = {};
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @param {number} squaredTolerance Squared tolerance.
-         * @param {boolean} highQuality Highest quality.
-         * @param {Array.<number>=} opt_simplifiedFlatCoordinates Simplified flat
-         *     coordinates.
-         * @return {Array.<number>} Simplified line string.
-         */
-        ol.geom.flat.simplify.lineString = function(flatCoordinates, offset, end,
-                                                    stride, squaredTolerance, highQuality, opt_simplifiedFlatCoordinates) {
-            var simplifiedFlatCoordinates = opt_simplifiedFlatCoordinates !== undefined ?
-                opt_simplifiedFlatCoordinates : [];
-            if (!highQuality) {
-                end = ol.geom.flat.simplify.radialDistance(flatCoordinates, offset, end,
-                    stride, squaredTolerance,
-                    simplifiedFlatCoordinates, 0);
-                flatCoordinates = simplifiedFlatCoordinates;
-                offset = 0;
-                stride = 2;
-            }
-            simplifiedFlatCoordinates.length = ol.geom.flat.simplify.douglasPeucker(
-                flatCoordinates, offset, end, stride, squaredTolerance,
-                simplifiedFlatCoordinates, 0);
-            return simplifiedFlatCoordinates;
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @param {number} squaredTolerance Squared tolerance.
-         * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
-         *     coordinates.
-         * @param {number} simplifiedOffset Simplified offset.
-         * @return {number} Simplified offset.
-         */
-        ol.geom.flat.simplify.douglasPeucker = function(flatCoordinates, offset, end,
-                                                        stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) {
-            var n = (end - offset) / stride;
-            if (n < 3) {
-                for (; offset < end; offset += stride) {
-                    simplifiedFlatCoordinates[simplifiedOffset++] =
-                        flatCoordinates[offset];
-                    simplifiedFlatCoordinates[simplifiedOffset++] =
-                        flatCoordinates[offset + 1];
-                }
-                return simplifiedOffset;
-            }
-            /** @type {Array.<number>} */
-            var markers = new Array(n);
-            markers[0] = 1;
-            markers[n - 1] = 1;
-            /** @type {Array.<number>} */
-            var stack = [offset, end - stride];
-            var index = 0;
-            var i;
-            while (stack.length > 0) {
-                var last = stack.pop();
-                var first = stack.pop();
-                var maxSquaredDistance = 0;
-                var x1 = flatCoordinates[first];
-                var y1 = flatCoordinates[first + 1];
-                var x2 = flatCoordinates[last];
-                var y2 = flatCoordinates[last + 1];
-                for (i = first + stride; i < last; i += stride) {
-                    var x = flatCoordinates[i];
-                    var y = flatCoordinates[i + 1];
-                    var squaredDistance = ol.math.squaredSegmentDistance(
-                        x, y, x1, y1, x2, y2);
-                    if (squaredDistance > maxSquaredDistance) {
-                        index = i;
-                        maxSquaredDistance = squaredDistance;
-                    }
-                }
-                if (maxSquaredDistance > squaredTolerance) {
-                    markers[(index - offset) / stride] = 1;
-                    if (first + stride < index) {
-                        stack.push(first, index);
-                    }
-                    if (index + stride < last) {
-                        stack.push(index, last);
-                    }
-                }
-            }
-            for (i = 0; i < n; ++i) {
-                if (markers[i]) {
-                    simplifiedFlatCoordinates[simplifiedOffset++] =
-                        flatCoordinates[offset + i * stride];
-                    simplifiedFlatCoordinates[simplifiedOffset++] =
-                        flatCoordinates[offset + i * stride + 1];
-                }
-            }
-            return simplifiedOffset;
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<number>} ends Ends.
-         * @param {number} stride Stride.
-         * @param {number} squaredTolerance Squared tolerance.
-         * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
-         *     coordinates.
-         * @param {number} simplifiedOffset Simplified offset.
-         * @param {Array.<number>} simplifiedEnds Simplified ends.
-         * @return {number} Simplified offset.
-         */
-        ol.geom.flat.simplify.douglasPeuckers = function(flatCoordinates, offset,
-                                                         ends, stride, squaredTolerance, simplifiedFlatCoordinates,
-                                                         simplifiedOffset, simplifiedEnds) {
-            var i, ii;
-            for (i = 0, ii = ends.length; i < ii; ++i) {
-                var end = ends[i];
-                simplifiedOffset = ol.geom.flat.simplify.douglasPeucker(
-                    flatCoordinates, offset, end, stride, squaredTolerance,
-                    simplifiedFlatCoordinates, simplifiedOffset);
-                simplifiedEnds.push(simplifiedOffset);
-                offset = end;
-            }
-            return simplifiedOffset;
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<Array.<number>>} endss Endss.
-         * @param {number} stride Stride.
-         * @param {number} squaredTolerance Squared tolerance.
-         * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
-         *     coordinates.
-         * @param {number} simplifiedOffset Simplified offset.
-         * @param {Array.<Array.<number>>} simplifiedEndss Simplified endss.
-         * @return {number} Simplified offset.
-         */
-        ol.geom.flat.simplify.douglasPeuckerss = function(
-            flatCoordinates, offset, endss, stride, squaredTolerance,
-            simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) {
-            var i, ii;
-            for (i = 0, ii = endss.length; i < ii; ++i) {
-                var ends = endss[i];
-                var simplifiedEnds = [];
-                simplifiedOffset = ol.geom.flat.simplify.douglasPeuckers(
-                    flatCoordinates, offset, ends, stride, squaredTolerance,
-                    simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds);
-                simplifiedEndss.push(simplifiedEnds);
-                offset = ends[ends.length - 1];
-            }
-            return simplifiedOffset;
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @param {number} squaredTolerance Squared tolerance.
-         * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
-         *     coordinates.
-         * @param {number} simplifiedOffset Simplified offset.
-         * @return {number} Simplified offset.
-         */
-        ol.geom.flat.simplify.radialDistance = function(flatCoordinates, offset, end,
-                                                        stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) {
-            if (end <= offset + stride) {
-                // zero or one point, no simplification possible, so copy and return
-                for (; offset < end; offset += stride) {
-                    simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset];
-                    simplifiedFlatCoordinates[simplifiedOffset++] =
-                        flatCoordinates[offset + 1];
-                }
-                return simplifiedOffset;
-            }
-            var x1 = flatCoordinates[offset];
-            var y1 = flatCoordinates[offset + 1];
-            // copy first point
-            simplifiedFlatCoordinates[simplifiedOffset++] = x1;
-            simplifiedFlatCoordinates[simplifiedOffset++] = y1;
-            var x2 = x1;
-            var y2 = y1;
-            for (offset += stride; offset < end; offset += stride) {
-                x2 = flatCoordinates[offset];
-                y2 = flatCoordinates[offset + 1];
-                if (ol.math.squaredDistance(x1, y1, x2, y2) > squaredTolerance) {
-                    // copy point at offset
-                    simplifiedFlatCoordinates[simplifiedOffset++] = x2;
-                    simplifiedFlatCoordinates[simplifiedOffset++] = y2;
-                    x1 = x2;
-                    y1 = y2;
-                }
-            }
-            if (x2 != x1 || y2 != y1) {
-                // copy last point
-                simplifiedFlatCoordinates[simplifiedOffset++] = x2;
-                simplifiedFlatCoordinates[simplifiedOffset++] = y2;
-            }
-            return simplifiedOffset;
-        };
-
-
-        /**
-         * @param {number} value Value.
-         * @param {number} tolerance Tolerance.
-         * @return {number} Rounded value.
-         */
-        ol.geom.flat.simplify.snap = function(value, tolerance) {
-            return tolerance * Math.round(value / tolerance);
-        };
-
-
-        /**
-         * Simplifies a line string using an algorithm designed by Tim Schaub.
-         * Coordinates are snapped to the nearest value in a virtual grid and
-         * consecutive duplicate coordinates are discarded.  This effectively preserves
-         * topology as the simplification of any subsection of a line string is
-         * independent of the rest of the line string.  This means that, for examples,
-         * the common edge between two polygons will be simplified to the same line
-         * string independently in both polygons.  This implementation uses a single
-         * pass over the coordinates and eliminates intermediate collinear points.
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @param {number} tolerance Tolerance.
-         * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
-         *     coordinates.
-         * @param {number} simplifiedOffset Simplified offset.
-         * @return {number} Simplified offset.
-         */
-        ol.geom.flat.simplify.quantize = function(flatCoordinates, offset, end, stride,
-                                                  tolerance, simplifiedFlatCoordinates, simplifiedOffset) {
-            // do nothing if the line is empty
-            if (offset == end) {
-                return simplifiedOffset;
-            }
-            // snap the first coordinate (P1)
-            var x1 = ol.geom.flat.simplify.snap(flatCoordinates[offset], tolerance);
-            var y1 = ol.geom.flat.simplify.snap(flatCoordinates[offset + 1], tolerance);
-            offset += stride;
-            // add the first coordinate to the output
-            simplifiedFlatCoordinates[simplifiedOffset++] = x1;
-            simplifiedFlatCoordinates[simplifiedOffset++] = y1;
-            // find the next coordinate that does not snap to the same value as the first
-            // coordinate (P2)
-            var x2, y2;
-            do {
-                x2 = ol.geom.flat.simplify.snap(flatCoordinates[offset], tolerance);
-                y2 = ol.geom.flat.simplify.snap(flatCoordinates[offset + 1], tolerance);
-                offset += stride;
-                if (offset == end) {
-                    // all coordinates snap to the same value, the line collapses to a point
-                    // push the last snapped value anyway to ensure that the output contains
-                    // at least two points
-                    // FIXME should we really return at least two points anyway?
-                    simplifiedFlatCoordinates[simplifiedOffset++] = x2;
-                    simplifiedFlatCoordinates[simplifiedOffset++] = y2;
-                    return simplifiedOffset;
-                }
-            } while (x2 == x1 && y2 == y1);
-            while (offset < end) {
-                var x3, y3;
-                // snap the next coordinate (P3)
-                x3 = ol.geom.flat.simplify.snap(flatCoordinates[offset], tolerance);
-                y3 = ol.geom.flat.simplify.snap(flatCoordinates[offset + 1], tolerance);
-                offset += stride;
-                // skip P3 if it is equal to P2
-                if (x3 == x2 && y3 == y2) {
-                    continue;
-                }
-                // calculate the delta between P1 and P2
-                var dx1 = x2 - x1;
-                var dy1 = y2 - y1;
-                // calculate the delta between P3 and P1
-                var dx2 = x3 - x1;
-                var dy2 = y3 - y1;
-                // if P1, P2, and P3 are colinear and P3 is further from P1 than P2 is from
-                // P1 in the same direction then P2 is on the straight line between P1 and
-                // P3
-                if ((dx1 * dy2 == dy1 * dx2) &&
-                    ((dx1 < 0 && dx2 < dx1) || dx1 == dx2 || (dx1 > 0 && dx2 > dx1)) &&
-                    ((dy1 < 0 && dy2 < dy1) || dy1 == dy2 || (dy1 > 0 && dy2 > dy1))) {
-                    // discard P2 and set P2 = P3
-                    x2 = x3;
-                    y2 = y3;
-                    continue;
-                }
-                // either P1, P2, and P3 are not colinear, or they are colinear but P3 is
-                // between P3 and P1 or on the opposite half of the line to P2.  add P2,
-                // and continue with P1 = P2 and P2 = P3
-                simplifiedFlatCoordinates[simplifiedOffset++] = x2;
-                simplifiedFlatCoordinates[simplifiedOffset++] = y2;
-                x1 = x2;
-                y1 = y2;
-                x2 = x3;
-                y2 = y3;
-            }
-            // add the last point (P2)
-            simplifiedFlatCoordinates[simplifiedOffset++] = x2;
-            simplifiedFlatCoordinates[simplifiedOffset++] = y2;
-            return simplifiedOffset;
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<number>} ends Ends.
-         * @param {number} stride Stride.
-         * @param {number} tolerance Tolerance.
-         * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
-         *     coordinates.
-         * @param {number} simplifiedOffset Simplified offset.
-         * @param {Array.<number>} simplifiedEnds Simplified ends.
-         * @return {number} Simplified offset.
-         */
-        ol.geom.flat.simplify.quantizes = function(
-            flatCoordinates, offset, ends, stride,
-            tolerance,
-            simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) {
-            var i, ii;
-            for (i = 0, ii = ends.length; i < ii; ++i) {
-                var end = ends[i];
-                simplifiedOffset = ol.geom.flat.simplify.quantize(
-                    flatCoordinates, offset, end, stride,
-                    tolerance,
-                    simplifiedFlatCoordinates, simplifiedOffset);
-                simplifiedEnds.push(simplifiedOffset);
-                offset = end;
-            }
-            return simplifiedOffset;
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<Array.<number>>} endss Endss.
-         * @param {number} stride Stride.
-         * @param {number} tolerance Tolerance.
-         * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
-         *     coordinates.
-         * @param {number} simplifiedOffset Simplified offset.
-         * @param {Array.<Array.<number>>} simplifiedEndss Simplified endss.
-         * @return {number} Simplified offset.
-         */
-        ol.geom.flat.simplify.quantizess = function(
-            flatCoordinates, offset, endss, stride,
-            tolerance,
-            simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) {
-            var i, ii;
-            for (i = 0, ii = endss.length; i < ii; ++i) {
-                var ends = endss[i];
-                var simplifiedEnds = [];
-                simplifiedOffset = ol.geom.flat.simplify.quantizes(
-                    flatCoordinates, offset, ends, stride,
-                    tolerance,
-                    simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds);
-                simplifiedEndss.push(simplifiedEnds);
-                offset = ends[ends.length - 1];
-            }
-            return simplifiedOffset;
-        };
-
-        ol.geom.GeometryType = {
-            POINT: 'Point',
-            LINE_STRING: 'LineString',
-            LINEAR_RING: 'LinearRing',
-            POLYGON: 'Polygon',
-            MULTI_POINT: 'MultiPoint',
-            MULTI_LINE_STRING: 'MultiLineString',
-            MULTI_POLYGON: 'MultiPolygon',
-            GEOMETRY_COLLECTION: 'GeometryCollection',
-            CIRCLE: 'Circle'
-        };
-
-        /**
-         * @classdesc
-         * Abstract base class; normally only used for creating subclasses and not
-         * instantiated in apps.
-         * Base class for vector geometries.
-         *
-         * To get notified of changes to the geometry, register a listener for the
-         * generic `change` event on your geometry instance.
-         *
-         * @constructor
-         * @abstract
-         * @extends {ol.Object}
-         * @api
-         */
-        ol.geom.Geometry = function() {
-
-            ol.Object.call(this);
-
-            /**
-             * @private
-             * @type {ol.Extent}
-             */
-            this.extent_ = ol.extent.createEmpty();
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.extentRevision_ = -1;
-
-            /**
-             * @protected
-             * @type {Object.<string, ol.geom.Geometry>}
-             */
-            this.simplifiedGeometryCache = {};
-
-            /**
-             * @protected
-             * @type {number}
-             */
-            this.simplifiedGeometryMaxMinSquaredTolerance = 0;
-
-            /**
-             * @protected
-             * @type {number}
-             */
-            this.simplifiedGeometryRevision = 0;
-
-            /**
-             * @private
-             * @type {ol.Transform}
-             */
-            this.tmpTransform_ = ol.transform.create();
-
-        };
-        ol.inherits(ol.geom.Geometry, ol.Object);
-
-
-        /**
-         * Make a complete copy of the geometry.
-         * @abstract
-         * @return {!ol.geom.Geometry} Clone.
-         */
-        ol.geom.Geometry.prototype.clone = function() {};
-
-
-        /**
-         * @abstract
-         * @param {number} x X.
-         * @param {number} y Y.
-         * @param {ol.Coordinate} closestPoint Closest point.
-         * @param {number} minSquaredDistance Minimum squared distance.
-         * @return {number} Minimum squared distance.
-         */
-        ol.geom.Geometry.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) {};
-
-
-        /**
-         * Return the closest point of the geometry to the passed point as
-         * {@link ol.Coordinate coordinate}.
-         * @param {ol.Coordinate} point Point.
-         * @param {ol.Coordinate=} opt_closestPoint Closest point.
-         * @return {ol.Coordinate} Closest point.
-         * @api
-         */
-        ol.geom.Geometry.prototype.getClosestPoint = function(point, opt_closestPoint) {
-            var closestPoint = opt_closestPoint ? opt_closestPoint : [NaN, NaN];
-            this.closestPointXY(point[0], point[1], closestPoint, Infinity);
-            return closestPoint;
-        };
-
-
-        /**
-         * Returns true if this geometry includes the specified coordinate. If the
-         * coordinate is on the boundary of the geometry, returns false.
-         * @param {ol.Coordinate} coordinate Coordinate.
-         * @return {boolean} Contains coordinate.
-         * @api
-         */
-        ol.geom.Geometry.prototype.intersectsCoordinate = function(coordinate) {
-            return this.containsXY(coordinate[0], coordinate[1]);
-        };
-
-
-        /**
-         * @abstract
-         * @param {ol.Extent} extent Extent.
-         * @protected
-         * @return {ol.Extent} extent Extent.
-         */
-        ol.geom.Geometry.prototype.computeExtent = function(extent) {};
-
-
-        /**
-         * @param {number} x X.
-         * @param {number} y Y.
-         * @return {boolean} Contains (x, y).
-         */
-        ol.geom.Geometry.prototype.containsXY = ol.functions.FALSE;
-
-
-        /**
-         * Get the extent of the geometry.
-         * @param {ol.Extent=} opt_extent Extent.
-         * @return {ol.Extent} extent Extent.
-         * @api
-         */
-        ol.geom.Geometry.prototype.getExtent = function(opt_extent) {
-            if (this.extentRevision_ != this.getRevision()) {
-                this.extent_ = this.computeExtent(this.extent_);
-                this.extentRevision_ = this.getRevision();
-            }
-            return ol.extent.returnOrUpdate(this.extent_, opt_extent);
-        };
-
-
-        /**
-         * Rotate the geometry around a given coordinate. This modifies the geometry
-         * coordinates in place.
-         * @abstract
-         * @param {number} angle Rotation angle in radians.
-         * @param {ol.Coordinate} anchor The rotation center.
-         * @api
-         */
-        ol.geom.Geometry.prototype.rotate = function(angle, anchor) {};
-
-
-        /**
-         * Scale the geometry (with an optional origin).  This modifies the geometry
-         * coordinates in place.
-         * @abstract
-         * @param {number} sx The scaling factor in the x-direction.
-         * @param {number=} opt_sy The scaling factor in the y-direction (defaults to
-         *     sx).
-         * @param {ol.Coordinate=} opt_anchor The scale origin (defaults to the center
-         *     of the geometry extent).
-         * @api
-         */
-        ol.geom.Geometry.prototype.scale = function(sx, opt_sy, opt_anchor) {};
-
-
-        /**
-         * Create a simplified version of this geometry.  For linestrings, this uses
-         * the the {@link
-         * https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
-         * Douglas Peucker} algorithm.  For polygons, a quantization-based
-         * simplification is used to preserve topology.
-         * @function
-         * @param {number} tolerance The tolerance distance for simplification.
-         * @return {ol.geom.Geometry} A new, simplified version of the original
-         *     geometry.
-         * @api
-         */
-        ol.geom.Geometry.prototype.simplify = function(tolerance) {
-            return this.getSimplifiedGeometry(tolerance * tolerance);
-        };
-
-
-        /**
-         * Create a simplified version of this geometry using the Douglas Peucker
-         * algorithm.
-         * @see https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
-         * @abstract
-         * @param {number} squaredTolerance Squared tolerance.
-         * @return {ol.geom.Geometry} Simplified geometry.
-         */
-        ol.geom.Geometry.prototype.getSimplifiedGeometry = function(squaredTolerance) {};
-
-
-        /**
-         * Get the type of this geometry.
-         * @abstract
-         * @return {ol.geom.GeometryType} Geometry type.
-         */
-        ol.geom.Geometry.prototype.getType = function() {};
-
-
-        /**
-         * Apply a transform function to each coordinate of the geometry.
-         * The geometry is modified in place.
-         * If you do not want the geometry modified in place, first `clone()` it and
-         * then use this function on the clone.
-         * @abstract
-         * @param {ol.TransformFunction} transformFn Transform.
-         */
-        ol.geom.Geometry.prototype.applyTransform = function(transformFn) {};
-
-
-        /**
-         * Test if the geometry and the passed extent intersect.
-         * @abstract
-         * @param {ol.Extent} extent Extent.
-         * @return {boolean} `true` if the geometry and the extent intersect.
-         */
-        ol.geom.Geometry.prototype.intersectsExtent = function(extent) {};
-
-
-        /**
-         * Translate the geometry.  This modifies the geometry coordinates in place.  If
-         * instead you want a new geometry, first `clone()` this geometry.
-         * @abstract
-         * @param {number} deltaX Delta X.
-         * @param {number} deltaY Delta Y.
-         */
-        ol.geom.Geometry.prototype.translate = function(deltaX, deltaY) {};
-
-
-        /**
-         * Transform each coordinate of the geometry from one coordinate reference
-         * system to another. The geometry is modified in place.
-         * For example, a line will be transformed to a line and a circle to a circle.
-         * If you do not want the geometry modified in place, first `clone()` it and
-         * then use this function on the clone.
-         *
-         * @param {ol.ProjectionLike} source The current projection.  Can be a
-         *     string identifier or a {@link ol.proj.Projection} object.
-         * @param {ol.ProjectionLike} destination The desired projection.  Can be a
-         *     string identifier or a {@link ol.proj.Projection} object.
-         * @return {ol.geom.Geometry} This geometry.  Note that original geometry is
-         *     modified in place.
-         * @api
-         */
-        ol.geom.Geometry.prototype.transform = function(source, destination) {
-            var tmpTransform = this.tmpTransform_;
-            source = ol.proj.get(source);
-            var transformFn = source.getUnits() == ol.proj.Units.TILE_PIXELS ?
-                function(inCoordinates, outCoordinates, stride) {
-                    var pixelExtent = source.getExtent();
-                    var projectedExtent = source.getWorldExtent();
-                    var scale = ol.extent.getHeight(projectedExtent) / ol.extent.getHeight(pixelExtent);
-                    ol.transform.compose(tmpTransform,
-                        projectedExtent[0], projectedExtent[3],
-                        scale, -scale, 0,
-                        0, 0);
-                    ol.geom.flat.transform.transform2D(inCoordinates, 0, inCoordinates.length, stride,
-                        tmpTransform, outCoordinates);
-                    return ol.proj.getTransform(source, destination)(inCoordinates, outCoordinates, stride);
-                } :
-                ol.proj.getTransform(source, destination);
-            this.applyTransform(transformFn);
-            return this;
-        };
-
-
-        /**
-         * @classdesc
-         * Abstract base class; only used for creating subclasses; do not instantiate
-         * in apps, as cannot be rendered.
-         *
-         * @constructor
-         * @abstract
-         * @extends {ol.geom.Geometry}
-         * @api
-         */
-        ol.geom.SimpleGeometry = function() {
-
-            ol.geom.Geometry.call(this);
-
-            /**
-             * @protected
-             * @type {ol.geom.GeometryLayout}
-             */
-            this.layout = ol.geom.GeometryLayout.XY;
-
-            /**
-             * @protected
-             * @type {number}
-             */
-            this.stride = 2;
-
-            /**
-             * @protected
-             * @type {Array.<number>}
-             */
-            this.flatCoordinates = null;
-
-        };
-        ol.inherits(ol.geom.SimpleGeometry, ol.geom.Geometry);
-
-
-        /**
-         * @param {number} stride Stride.
-         * @private
-         * @return {ol.geom.GeometryLayout} layout Layout.
-         */
-        ol.geom.SimpleGeometry.getLayoutForStride_ = function(stride) {
-            var layout;
-            if (stride == 2) {
-                layout = ol.geom.GeometryLayout.XY;
-            } else if (stride == 3) {
-                layout = ol.geom.GeometryLayout.XYZ;
-            } else if (stride == 4) {
-                layout = ol.geom.GeometryLayout.XYZM;
-            }
-            return /** @type {ol.geom.GeometryLayout} */ (layout);
-        };
-
-
-        /**
-         * @param {ol.geom.GeometryLayout} layout Layout.
-         * @return {number} Stride.
-         */
-        ol.geom.SimpleGeometry.getStrideForLayout = function(layout) {
-            var stride;
-            if (layout == ol.geom.GeometryLayout.XY) {
-                stride = 2;
-            } else if (layout == ol.geom.GeometryLayout.XYZ || layout == ol.geom.GeometryLayout.XYM) {
-                stride = 3;
-            } else if (layout == ol.geom.GeometryLayout.XYZM) {
-                stride = 4;
-            }
-            return /** @type {number} */ (stride);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.SimpleGeometry.prototype.containsXY = ol.functions.FALSE;
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.SimpleGeometry.prototype.computeExtent = function(extent) {
-            return ol.extent.createOrUpdateFromFlatCoordinates(
-                this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
-                extent);
-        };
-
-
-        /**
-         * @abstract
-         * @return {Array} Coordinates.
-         */
-        ol.geom.SimpleGeometry.prototype.getCoordinates = function() {};
-
-
-        /**
-         * Return the first coordinate of the geometry.
-         * @return {ol.Coordinate} First coordinate.
-         * @api
-         */
-        ol.geom.SimpleGeometry.prototype.getFirstCoordinate = function() {
-            return this.flatCoordinates.slice(0, this.stride);
-        };
-
-
-        /**
-         * @return {Array.<number>} Flat coordinates.
-         */
-        ol.geom.SimpleGeometry.prototype.getFlatCoordinates = function() {
-            return this.flatCoordinates;
-        };
-
-
-        /**
-         * Return the last coordinate of the geometry.
-         * @return {ol.Coordinate} Last point.
-         * @api
-         */
-        ol.geom.SimpleGeometry.prototype.getLastCoordinate = function() {
-            return this.flatCoordinates.slice(this.flatCoordinates.length - this.stride);
-        };
-
-
-        /**
-         * Return the {@link ol.geom.GeometryLayout layout} of the geometry.
-         * @return {ol.geom.GeometryLayout} Layout.
-         * @api
-         */
-        ol.geom.SimpleGeometry.prototype.getLayout = function() {
-            return this.layout;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.SimpleGeometry.prototype.getSimplifiedGeometry = function(squaredTolerance) {
-            if (this.simplifiedGeometryRevision != this.getRevision()) {
-                ol.obj.clear(this.simplifiedGeometryCache);
-                this.simplifiedGeometryMaxMinSquaredTolerance = 0;
-                this.simplifiedGeometryRevision = this.getRevision();
-            }
-            // If squaredTolerance is negative or if we know that simplification will not
-            // have any effect then just return this.
-            if (squaredTolerance < 0 ||
-                (this.simplifiedGeometryMaxMinSquaredTolerance !== 0 &&
-                    squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance)) {
-                return this;
-            }
-            var key = squaredTolerance.toString();
-            if (this.simplifiedGeometryCache.hasOwnProperty(key)) {
-                return this.simplifiedGeometryCache[key];
-            } else {
-                var simplifiedGeometry =
-                    this.getSimplifiedGeometryInternal(squaredTolerance);
-                var simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates();
-                if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) {
-                    this.simplifiedGeometryCache[key] = simplifiedGeometry;
-                    return simplifiedGeometry;
-                } else {
-                    // Simplification did not actually remove any coordinates.  We now know
-                    // that any calls to getSimplifiedGeometry with a squaredTolerance less
-                    // than or equal to the current squaredTolerance will also not have any
-                    // effect.  This allows us to short circuit simplification (saving CPU
-                    // cycles) and prevents the cache of simplified geometries from filling
-                    // up with useless identical copies of this geometry (saving memory).
-                    this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;
-                    return this;
-                }
-            }
-        };
-
-
-        /**
-         * @param {number} squaredTolerance Squared tolerance.
-         * @return {ol.geom.SimpleGeometry} Simplified geometry.
-         * @protected
-         */
-        ol.geom.SimpleGeometry.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) {
-            return this;
-        };
-
-
-        /**
-         * @return {number} Stride.
-         */
-        ol.geom.SimpleGeometry.prototype.getStride = function() {
-            return this.stride;
-        };
-
-
-        /**
-         * @param {ol.geom.GeometryLayout} layout Layout.
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @protected
-         */
-        ol.geom.SimpleGeometry.prototype.setFlatCoordinatesInternal = function(layout, flatCoordinates) {
-            this.stride = ol.geom.SimpleGeometry.getStrideForLayout(layout);
-            this.layout = layout;
-            this.flatCoordinates = flatCoordinates;
-        };
-
-
-        /**
-         * @abstract
-         * @param {Array} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         */
-        ol.geom.SimpleGeometry.prototype.setCoordinates = function(coordinates, opt_layout) {};
-
-
-        /**
-         * @param {ol.geom.GeometryLayout|undefined} layout Layout.
-         * @param {Array} coordinates Coordinates.
-         * @param {number} nesting Nesting.
-         * @protected
-         */
-        ol.geom.SimpleGeometry.prototype.setLayout = function(layout, coordinates, nesting) {
-            /** @type {number} */
-            var stride;
-            if (layout) {
-                stride = ol.geom.SimpleGeometry.getStrideForLayout(layout);
-            } else {
-                var i;
-                for (i = 0; i < nesting; ++i) {
-                    if (coordinates.length === 0) {
-                        this.layout = ol.geom.GeometryLayout.XY;
-                        this.stride = 2;
-                        return;
-                    } else {
-                        coordinates = /** @type {Array} */ (coordinates[0]);
-                    }
-                }
-                stride = coordinates.length;
-                layout = ol.geom.SimpleGeometry.getLayoutForStride_(stride);
-            }
-            this.layout = layout;
-            this.stride = stride;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.SimpleGeometry.prototype.applyTransform = function(transformFn) {
-            if (this.flatCoordinates) {
-                transformFn(this.flatCoordinates, this.flatCoordinates, this.stride);
-                this.changed();
-            }
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.SimpleGeometry.prototype.rotate = function(angle, anchor) {
-            var flatCoordinates = this.getFlatCoordinates();
-            if (flatCoordinates) {
-                var stride = this.getStride();
-                ol.geom.flat.transform.rotate(
-                    flatCoordinates, 0, flatCoordinates.length,
-                    stride, angle, anchor, flatCoordinates);
-                this.changed();
-            }
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.SimpleGeometry.prototype.scale = function(sx, opt_sy, opt_anchor) {
-            var sy = opt_sy;
-            if (sy === undefined) {
-                sy = sx;
-            }
-            var anchor = opt_anchor;
-            if (!anchor) {
-                anchor = ol.extent.getCenter(this.getExtent());
-            }
-            var flatCoordinates = this.getFlatCoordinates();
-            if (flatCoordinates) {
-                var stride = this.getStride();
-                ol.geom.flat.transform.scale(
-                    flatCoordinates, 0, flatCoordinates.length,
-                    stride, sx, sy, anchor, flatCoordinates);
-                this.changed();
-            }
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.SimpleGeometry.prototype.translate = function(deltaX, deltaY) {
-            var flatCoordinates = this.getFlatCoordinates();
-            if (flatCoordinates) {
-                var stride = this.getStride();
-                ol.geom.flat.transform.translate(
-                    flatCoordinates, 0, flatCoordinates.length, stride,
-                    deltaX, deltaY, flatCoordinates);
-                this.changed();
-            }
-        };
-
-
-        /**
-         * @param {ol.geom.SimpleGeometry} simpleGeometry Simple geometry.
-         * @param {ol.Transform} transform Transform.
-         * @param {Array.<number>=} opt_dest Destination.
-         * @return {Array.<number>} Transformed flat coordinates.
-         */
-        ol.geom.SimpleGeometry.transform2D = function(simpleGeometry, transform, opt_dest) {
-            var flatCoordinates = simpleGeometry.getFlatCoordinates();
-            if (!flatCoordinates) {
-                return null;
-            } else {
-                var stride = simpleGeometry.getStride();
-                return ol.geom.flat.transform.transform2D(
-                    flatCoordinates, 0, flatCoordinates.length, stride,
-                    transform, opt_dest);
-            }
-        };
-
-        ol.geom.Polygon = function(coordinates, opt_layout) {
-
-            ol.geom.SimpleGeometry.call(this);
-
-            /**
-             * @type {Array.<number>}
-             * @private
-             */
-            this.ends_ = [];
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.flatInteriorPointRevision_ = -1;
-
-            /**
-             * @private
-             * @type {ol.Coordinate}
-             */
-            this.flatInteriorPoint_ = null;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.maxDelta_ = -1;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.maxDeltaRevision_ = -1;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.orientedRevision_ = -1;
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.orientedFlatCoordinates_ = null;
-
-            this.setCoordinates(coordinates, opt_layout);
-
-        };
-        ol.inherits(ol.geom.Polygon, ol.geom.SimpleGeometry);
-
-
-        /**
-         * Append the passed linear ring to this polygon.
-         * @param {ol.geom.LinearRing} linearRing Linear ring.
-         * @api
-         */
-        ol.geom.Polygon.prototype.appendLinearRing = function(linearRing) {
-            if (!this.flatCoordinates) {
-                this.flatCoordinates = linearRing.getFlatCoordinates().slice();
-            } else {
-                ol.array.extend(this.flatCoordinates, linearRing.getFlatCoordinates());
-            }
-            this.ends_.push(this.flatCoordinates.length);
-            this.changed();
-        };
-
-
-        /**
-         * Make a complete copy of the geometry.
-         * @return {!ol.geom.Polygon} Clone.
-         * @override
-         * @api
-         */
-        ol.geom.Polygon.prototype.clone = function() {
-            var polygon = new ol.geom.Polygon(null);
-            polygon.setFlatCoordinates(
-                this.layout, this.flatCoordinates.slice(), this.ends_.slice());
-            return polygon;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.Polygon.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) {
-            if (minSquaredDistance <
-                ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
-                return minSquaredDistance;
-            }
-            if (this.maxDeltaRevision_ != this.getRevision()) {
-                this.maxDelta_ = Math.sqrt(ol.geom.flat.closest.getsMaxSquaredDelta(
-                    this.flatCoordinates, 0, this.ends_, this.stride, 0));
-                this.maxDeltaRevision_ = this.getRevision();
-            }
-            return ol.geom.flat.closest.getsClosestPoint(
-                this.flatCoordinates, 0, this.ends_, this.stride,
-                this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.Polygon.prototype.containsXY = function(x, y) {
-            return ol.geom.flat.contains.linearRingsContainsXY(
-                this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, x, y);
-        };
-
-
-        /**
-         * Return the area of the polygon on projected plane.
-         * @return {number} Area (on projected plane).
-         * @api
-         */
-        ol.geom.Polygon.prototype.getArea = function() {
-            return ol.geom.flat.area.linearRings(
-                this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride);
-        };
-
-
-        /**
-         * Get the coordinate array for this geometry.  This array has the structure
-         * of a GeoJSON coordinate array for polygons.
-         *
-         * @param {boolean=} opt_right Orient coordinates according to the right-hand
-         *     rule (counter-clockwise for exterior and clockwise for interior rings).
-         *     If `false`, coordinates will be oriented according to the left-hand rule
-         *     (clockwise for exterior and counter-clockwise for interior rings).
-         *     By default, coordinate orientation will depend on how the geometry was
-         *     constructed.
-         * @return {Array.<Array.<ol.Coordinate>>} Coordinates.
-         * @override
-         * @api
-         */
-        ol.geom.Polygon.prototype.getCoordinates = function(opt_right) {
-            var flatCoordinates;
-            if (opt_right !== undefined) {
-                flatCoordinates = this.getOrientedFlatCoordinates().slice();
-                ol.geom.flat.orient.orientLinearRings(
-                    flatCoordinates, 0, this.ends_, this.stride, opt_right);
-            } else {
-                flatCoordinates = this.flatCoordinates;
-            }
-
-            return ol.geom.flat.inflate.coordinatess(
-                flatCoordinates, 0, this.ends_, this.stride);
-        };
-
-
-        /**
-         * @return {Array.<number>} Ends.
-         */
-        ol.geom.Polygon.prototype.getEnds = function() {
-            return this.ends_;
-        };
-
-
-        /**
-         * @return {Array.<number>} Interior point.
-         */
-        ol.geom.Polygon.prototype.getFlatInteriorPoint = function() {
-            if (this.flatInteriorPointRevision_ != this.getRevision()) {
-                var flatCenter = ol.extent.getCenter(this.getExtent());
-                this.flatInteriorPoint_ = ol.geom.flat.interiorpoint.linearRings(
-                    this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride,
-                    flatCenter, 0);
-                this.flatInteriorPointRevision_ = this.getRevision();
-            }
-            return this.flatInteriorPoint_;
-        };
-
-
-        /**
-         * Return an interior point of the polygon.
-         * @return {ol.geom.Point} Interior point as XYM coordinate, where M is the
-         * length of the horizontal intersection that the point belongs to.
-         * @api
-         */
-        ol.geom.Polygon.prototype.getInteriorPoint = function() {
-            return new ol.geom.Point(this.getFlatInteriorPoint(), ol.geom.GeometryLayout.XYM);
-        };
-
-
-        /**
-         * Return the number of rings of the polygon,  this includes the exterior
-         * ring and any interior rings.
-         *
-         * @return {number} Number of rings.
-         * @api
-         */
-        ol.geom.Polygon.prototype.getLinearRingCount = function() {
-            return this.ends_.length;
-        };
-
-
-        /**
-         * Return the Nth linear ring of the polygon geometry. Return `null` if the
-         * given index is out of range.
-         * The exterior linear ring is available at index `0` and the interior rings
-         * at index `1` and beyond.
-         *
-         * @param {number} index Index.
-         * @return {ol.geom.LinearRing} Linear ring.
-         * @api
-         */
-        ol.geom.Polygon.prototype.getLinearRing = function(index) {
-            if (index < 0 || this.ends_.length <= index) {
-                return null;
-            }
-            var linearRing = new ol.geom.LinearRing(null);
-            linearRing.setFlatCoordinates(this.layout, this.flatCoordinates.slice(
-                index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]));
-            return linearRing;
-        };
-
-
-        /**
-         * Return the linear rings of the polygon.
-         * @return {Array.<ol.geom.LinearRing>} Linear rings.
-         * @api
-         */
-        ol.geom.Polygon.prototype.getLinearRings = function() {
-            var layout = this.layout;
-            var flatCoordinates = this.flatCoordinates;
-            var ends = this.ends_;
-            var linearRings = [];
-            var offset = 0;
-            var i, ii;
-            for (i = 0, ii = ends.length; i < ii; ++i) {
-                var end = ends[i];
-                var linearRing = new ol.geom.LinearRing(null);
-                linearRing.setFlatCoordinates(layout, flatCoordinates.slice(offset, end));
-                linearRings.push(linearRing);
-                offset = end;
-            }
-            return linearRings;
-        };
-
-
-        /**
-         * @return {Array.<number>} Oriented flat coordinates.
-         */
-        ol.geom.Polygon.prototype.getOrientedFlatCoordinates = function() {
-            if (this.orientedRevision_ != this.getRevision()) {
-                var flatCoordinates = this.flatCoordinates;
-                if (ol.geom.flat.orient.linearRingsAreOriented(
-                    flatCoordinates, 0, this.ends_, this.stride)) {
-                    this.orientedFlatCoordinates_ = flatCoordinates;
-                } else {
-                    this.orientedFlatCoordinates_ = flatCoordinates.slice();
-                    this.orientedFlatCoordinates_.length =
-                        ol.geom.flat.orient.orientLinearRings(
-                            this.orientedFlatCoordinates_, 0, this.ends_, this.stride);
-                }
-                this.orientedRevision_ = this.getRevision();
-            }
-            return this.orientedFlatCoordinates_;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.Polygon.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) {
-            var simplifiedFlatCoordinates = [];
-            var simplifiedEnds = [];
-            simplifiedFlatCoordinates.length = ol.geom.flat.simplify.quantizes(
-                this.flatCoordinates, 0, this.ends_, this.stride,
-                Math.sqrt(squaredTolerance),
-                simplifiedFlatCoordinates, 0, simplifiedEnds);
-            var simplifiedPolygon = new ol.geom.Polygon(null);
-            simplifiedPolygon.setFlatCoordinates(
-                ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEnds);
-            return simplifiedPolygon;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.Polygon.prototype.getType = function() {
-            return ol.geom.GeometryType.POLYGON;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.Polygon.prototype.intersectsExtent = function(extent) {
-            return ol.geom.flat.intersectsextent.linearRings(
-                this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, extent);
-        };
-
-
-        /**
-         * Set the coordinates of the polygon.
-         * @param {Array.<Array.<ol.Coordinate>>} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         * @override
-         * @api
-         */
-        ol.geom.Polygon.prototype.setCoordinates = function(coordinates, opt_layout) {
-            if (!coordinates) {
-                this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.ends_);
-            } else {
-                this.setLayout(opt_layout, coordinates, 2);
-                if (!this.flatCoordinates) {
-                    this.flatCoordinates = [];
-                }
-                var ends = ol.geom.flat.deflate.coordinatess(
-                    this.flatCoordinates, 0, coordinates, this.stride, this.ends_);
-                this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1];
-                //this.changed();
-            }
-        };
-
-
-        /**
-         * @param {ol.geom.GeometryLayout} layout Layout.
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {Array.<number>} ends Ends.
-         */
-        ol.geom.Polygon.prototype.setFlatCoordinates = function(layout, flatCoordinates, ends) {
-            this.setFlatCoordinatesInternal(layout, flatCoordinates);
-            this.ends_ = ends;
-            //this.changed();
-        };
-
-
-        /**
-         * Create an approximation of a circle on the surface of a sphere.
-         * @param {ol.Sphere} sphere The sphere.
-         * @param {ol.Coordinate} center Center (`[lon, lat]` in degrees).
-         * @param {number} radius The great-circle distance from the center to
-         *     the polygon vertices.
-         * @param {number=} opt_n Optional number of vertices for the resulting
-         *     polygon. Default is `32`.
-         * @return {ol.geom.Polygon} The "circular" polygon.
-         * @api
-         */
-        ol.geom.Polygon.circular = function(sphere, center, radius, opt_n) {
-            var n = opt_n ? opt_n : 32;
-            /** @type {Array.<number>} */
-            var flatCoordinates = [];
-            var i;
-            for (i = 0; i < n; ++i) {
-                ol.array.extend(
-                    flatCoordinates, sphere.offset(center, radius, 2 * Math.PI * i / n));
-            }
-            flatCoordinates.push(flatCoordinates[0], flatCoordinates[1]);
-            var polygon = new ol.geom.Polygon(null);
-            polygon.setFlatCoordinates(
-                ol.geom.GeometryLayout.XY, flatCoordinates, [flatCoordinates.length]);
-            return polygon;
-        };
-
-
-        /**
-         * Create a polygon from an extent. The layout used is `XY`.
-         * @param {ol.Extent} extent The extent.
-         * @return {ol.geom.Polygon} The polygon.
-         * @api
-         */
-        ol.geom.Polygon.fromExtent = function(extent) {
-            var minX = extent[0];
-            var minY = extent[1];
-            var maxX = extent[2];
-            var maxY = extent[3];
-            var flatCoordinates =
-                [minX, minY, minX, maxY, maxX, maxY, maxX, minY, minX, minY];
-            var polygon = new ol.geom.Polygon(null);
-            polygon.setFlatCoordinates(
-                ol.geom.GeometryLayout.XY, flatCoordinates, [flatCoordinates.length]);
-            return polygon;
-        };
-
-
-        /**
-         * Create a regular polygon from a circle.
-         * @param {ol.geom.Circle} circle Circle geometry.
-         * @param {number=} opt_sides Number of sides of the polygon. Default is 32.
-         * @param {number=} opt_angle Start angle for the first vertex of the polygon in
-         *     radians. Default is 0.
-         * @return {ol.geom.Polygon} Polygon geometry.
-         * @api
-         */
-        ol.geom.Polygon.fromCircle = function(circle, opt_sides, opt_angle) {
-            var sides = opt_sides ? opt_sides : 32;
-            var stride = circle.getStride();
-            var layout = circle.getLayout();
-            var polygon = new ol.geom.Polygon(null, layout);
-            var arrayLength = stride * (sides + 1);
-            var flatCoordinates = new Array(arrayLength);
-            for (var i = 0; i < arrayLength; i++) {
-                flatCoordinates[i] = 0;
-            }
-            var ends = [flatCoordinates.length];
-            polygon.setFlatCoordinates(layout, flatCoordinates, ends);
-            ol.geom.Polygon.makeRegular(
-                polygon, circle.getCenter(), circle.getRadius(), opt_angle);
-            return polygon;
-        };
-
-
-        /**
-         * Modify the coordinates of a polygon to make it a regular polygon.
-         * @param {ol.geom.Polygon} polygon Polygon geometry.
-         * @param {ol.Coordinate} center Center of the regular polygon.
-         * @param {number} radius Radius of the regular polygon.
-         * @param {number=} opt_angle Start angle for the first vertex of the polygon in
-         *     radians. Default is 0.
-         */
-        ol.geom.Polygon.makeRegular = function(polygon, center, radius, opt_angle) {
-            var flatCoordinates = polygon.getFlatCoordinates();
-            var layout = polygon.getLayout();
-            var stride = polygon.getStride();
-            var ends = polygon.getEnds();
-            var sides = flatCoordinates.length / stride - 1;
-            var startAngle = opt_angle ? opt_angle : 0;
-            var angle, offset;
-            for (var i = 0; i <= sides; ++i) {
-                offset = i * stride;
-                angle = startAngle + (ol.math.modulo(i, sides) * 2 * Math.PI / sides);
-                flatCoordinates[offset] = center[0] + (radius * Math.cos(angle));
-                flatCoordinates[offset + 1] = center[1] + (radius * Math.sin(angle));
-            }
-            polygon.setFlatCoordinates(layout, flatCoordinates, ends);
-        };
-
-        /**
-         * @classdesc
-         * Linestring geometry.
-         *
-         * @constructor
-         * @extends {ol.geom.SimpleGeometry}
-         * @param {Array.<ol.Coordinate>} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         * @api
-         */
-        ol.geom.LineString = function(coordinates, opt_layout) {
-
-            ol.geom.SimpleGeometry.call(this);
-
-            /**
-             * @private
-             * @type {ol.Coordinate}
-             */
-            this.flatMidpoint_ = null;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.flatMidpointRevision_ = -1;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.maxDelta_ = -1;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.maxDeltaRevision_ = -1;
-
-            this.setCoordinates(coordinates, opt_layout);
-
-        };
-        ol.inherits(ol.geom.LineString, ol.geom.SimpleGeometry);
-
-
-        /**
-         * Append the passed coordinate to the coordinates of the linestring.
-         * @param {ol.Coordinate} coordinate Coordinate.
-         * @api
-         */
-        ol.geom.LineString.prototype.appendCoordinate = function(coordinate) {
-            if (!this.flatCoordinates) {
-                this.flatCoordinates = coordinate.slice();
-            } else {
-                ol.array.extend(this.flatCoordinates, coordinate);
-            }
-            this.changed();
-        };
-
-
-        /**
-         * Make a complete copy of the geometry.
-         * @return {!ol.geom.LineString} Clone.
-         * @override
-         * @api
-         */
-        ol.geom.LineString.prototype.clone = function() {
-            var lineString = new ol.geom.LineString(null);
-            lineString.setFlatCoordinates(this.layout, this.flatCoordinates.slice());
-            return lineString;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.LineString.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) {
-            if (minSquaredDistance <
-                ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
-                return minSquaredDistance;
-            }
-            if (this.maxDeltaRevision_ != this.getRevision()) {
-                this.maxDelta_ = Math.sqrt(ol.geom.flat.closest.getMaxSquaredDelta(
-                    this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0));
-                this.maxDeltaRevision_ = this.getRevision();
-            }
-            return ol.geom.flat.closest.getClosestPoint(
-                this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
-                this.maxDelta_, false, x, y, closestPoint, minSquaredDistance);
-        };
-
-
-        /**
-         * Iterate over each segment, calling the provided callback.
-         * If the callback returns a truthy value the function returns that
-         * value immediately. Otherwise the function returns `false`.
-         *
-         * @param {function(this: S, ol.Coordinate, ol.Coordinate): T} callback Function
-         *     called for each segment.
-         * @param {S=} opt_this The object to be used as the value of 'this'
-         *     within callback.
-         * @return {T|boolean} Value.
-         * @template T,S
-         * @api
-         */
-        ol.geom.LineString.prototype.forEachSegment = function(callback, opt_this) {
-            return ol.geom.flat.segments.forEach(this.flatCoordinates, 0,
-                this.flatCoordinates.length, this.stride, callback, opt_this);
-        };
-
-
-        /**
-         * Returns the coordinate at `m` using linear interpolation, or `null` if no
-         * such coordinate exists.
-         *
-         * `opt_extrapolate` controls extrapolation beyond the range of Ms in the
-         * MultiLineString. If `opt_extrapolate` is `true` then Ms less than the first
-         * M will return the first coordinate and Ms greater than the last M will
-         * return the last coordinate.
-         *
-         * @param {number} m M.
-         * @param {boolean=} opt_extrapolate Extrapolate. Default is `false`.
-         * @return {ol.Coordinate} Coordinate.
-         * @api
-         */
-        ol.geom.LineString.prototype.getCoordinateAtM = function(m, opt_extrapolate) {
-            if (this.layout != ol.geom.GeometryLayout.XYM &&
-                this.layout != ol.geom.GeometryLayout.XYZM) {
-                return null;
-            }
-            var extrapolate = opt_extrapolate !== undefined ? opt_extrapolate : false;
-            return ol.geom.flat.interpolate.lineStringCoordinateAtM(this.flatCoordinates, 0,
-                this.flatCoordinates.length, this.stride, m, extrapolate);
-        };
-
-
-        /**
-         * Return the coordinates of the linestring.
-         * @return {Array.<ol.Coordinate>} Coordinates.
-         * @override
-         * @api
-         */
-        ol.geom.LineString.prototype.getCoordinates = function() {
-            return ol.geom.flat.inflate.coordinates(
-                this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
-        };
-
-
-        /**
-         * Return the coordinate at the provided fraction along the linestring.
-         * The `fraction` is a number between 0 and 1, where 0 is the start of the
-         * linestring and 1 is the end.
-         * @param {number} fraction Fraction.
-         * @param {ol.Coordinate=} opt_dest Optional coordinate whose values will
-         *     be modified. If not provided, a new coordinate will be returned.
-         * @return {ol.Coordinate} Coordinate of the interpolated point.
-         * @api
-         */
-        ol.geom.LineString.prototype.getCoordinateAt = function(fraction, opt_dest) {
-            return ol.geom.flat.interpolate.lineString(
-                this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
-                fraction, opt_dest);
-        };
-
-
-        /**
-         * Return the length of the linestring on projected plane.
-         * @return {number} Length (on projected plane).
-         * @api
-         */
-        ol.geom.LineString.prototype.getLength = function() {
-            return ol.geom.flat.length.lineString(
-                this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
-        };
-
-
-        /**
-         * @return {Array.<number>} Flat midpoint.
-         */
-        ol.geom.LineString.prototype.getFlatMidpoint = function() {
-            if (this.flatMidpointRevision_ != this.getRevision()) {
-                this.flatMidpoint_ = this.getCoordinateAt(0.5, this.flatMidpoint_);
-                this.flatMidpointRevision_ = this.getRevision();
-            }
-            return this.flatMidpoint_;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.LineString.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) {
-            var simplifiedFlatCoordinates = [];
-            simplifiedFlatCoordinates.length = ol.geom.flat.simplify.douglasPeucker(
-                this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
-                squaredTolerance, simplifiedFlatCoordinates, 0);
-            var simplifiedLineString = new ol.geom.LineString(null);
-            simplifiedLineString.setFlatCoordinates(
-                ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates);
-            return simplifiedLineString;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.LineString.prototype.getType = function() {
-            return ol.geom.GeometryType.LINE_STRING;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.LineString.prototype.intersectsExtent = function(extent) {
-            return ol.geom.flat.intersectsextent.lineString(
-                this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
-                extent);
-        };
-
-
-        /**
-         * Set the coordinates of the linestring.
-         * @param {Array.<ol.Coordinate>} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         * @override
-         * @api
-         */
-        ol.geom.LineString.prototype.setCoordinates = function(coordinates, opt_layout) {
-            if (!coordinates) {
-                this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null);
-            } else {
-                this.setLayout(opt_layout, coordinates, 1);
-                if (!this.flatCoordinates) {
-                    this.flatCoordinates = [];
-                }
-                this.flatCoordinates.length = ol.geom.flat.deflate.coordinates(
-                    this.flatCoordinates, 0, coordinates, this.stride);
-                this.changed();
-            }
-        };
-
-
-        /**
-         * @param {ol.geom.GeometryLayout} layout Layout.
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         */
-        ol.geom.LineString.prototype.setFlatCoordinates = function(layout, flatCoordinates) {
-            this.setFlatCoordinatesInternal(layout, flatCoordinates);
-            this.changed();
-        };
-
-        ol.geom.Point = function(coordinates, opt_layout) {
-            ol.geom.SimpleGeometry.call(this);
-            this.setCoordinates(coordinates, opt_layout);
-        };
-        ol.inherits(ol.geom.Point, ol.geom.SimpleGeometry);
-
-        ol.geom.Point.prototype.clone = function() {
-            var point = new ol.geom.Point(null);
-            point.setFlatCoordinates(this.layout, this.flatCoordinates.slice());
-            return point;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.Point.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) {
-            var flatCoordinates = this.flatCoordinates;
-            var squaredDistance = ol.math.squaredDistance(
-                x, y, flatCoordinates[0], flatCoordinates[1]);
-            if (squaredDistance < minSquaredDistance) {
-                var stride = this.stride;
-                var i;
-                for (i = 0; i < stride; ++i) {
-                    closestPoint[i] = flatCoordinates[i];
-                }
-                closestPoint.length = stride;
-                return squaredDistance;
-            } else {
-                return minSquaredDistance;
-            }
-        };
-
-        ol.geom.Point.prototype.getCoordinates = function() {
-            return !this.flatCoordinates ? [] : this.flatCoordinates.slice();
-        };
-
-        ol.geom.Point.prototype.computeExtent = function(extent) {
-            return ol.extent.createOrUpdateFromCoordinate(this.flatCoordinates, extent);
-        };
-
-        ol.geom.Point.prototype.getType = function() {
-            return ol.geom.GeometryType.POINT;
-        };
-
-        ol.geom.Point.prototype.intersectsExtent = function(extent) {
-            return ol.extent.containsXY(extent,
-                this.flatCoordinates[0], this.flatCoordinates[1]);
-        };
-
-        ol.geom.Point.prototype.setCoordinates = function(coordinates, opt_layout) {
-            if (!coordinates) {
-                this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null);
-            } else {
-                this.setLayout(opt_layout, coordinates, 0);
-                if (!this.flatCoordinates) {
-                    this.flatCoordinates = [];
-                }
-                this.flatCoordinates.length = ol.geom.flat.deflate.coordinate(
-                    this.flatCoordinates, 0, coordinates, this.stride);
-                this.changed();
-            }
-        };
-
-        ol.geom.Point.prototype.setFlatCoordinates = function(layout, flatCoordinates) {
-            this.setFlatCoordinatesInternal(layout, flatCoordinates);
-            this.changed();
-        };
-
-        /**
-         * @classdesc
-         * Multi-linestring geometry.
-         *
-         * @constructor
-         * @extends {ol.geom.SimpleGeometry}
-         * @param {Array.<Array.<ol.Coordinate>>} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         * @api
-         */
-        ol.geom.MultiLineString = function(coordinates, opt_layout) {
-
-            ol.geom.SimpleGeometry.call(this);
-
-            /**
-             * @type {Array.<number>}
-             * @private
-             */
-            this.ends_ = [];
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.maxDelta_ = -1;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.maxDeltaRevision_ = -1;
-
-            this.setCoordinates(coordinates, opt_layout);
-
-        };
-        ol.inherits(ol.geom.MultiLineString, ol.geom.SimpleGeometry);
-
-
-        /**
-         * Append the passed linestring to the multilinestring.
-         * @param {ol.geom.LineString} lineString LineString.
-         * @api
-         */
-        ol.geom.MultiLineString.prototype.appendLineString = function(lineString) {
-            if (!this.flatCoordinates) {
-                this.flatCoordinates = lineString.getFlatCoordinates().slice();
-            } else {
-                ol.array.extend(
-                    this.flatCoordinates, lineString.getFlatCoordinates().slice());
-            }
-            this.ends_.push(this.flatCoordinates.length);
-            this.changed();
-        };
-
-
-        /**
-         * Make a complete copy of the geometry.
-         * @return {!ol.geom.MultiLineString} Clone.
-         * @override
-         * @api
-         */
-        ol.geom.MultiLineString.prototype.clone = function() {
-            var multiLineString = new ol.geom.MultiLineString(null);
-            multiLineString.setFlatCoordinates(
-                this.layout, this.flatCoordinates.slice(), this.ends_.slice());
-            return multiLineString;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.MultiLineString.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) {
-            if (minSquaredDistance <
-                ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
-                return minSquaredDistance;
-            }
-            if (this.maxDeltaRevision_ != this.getRevision()) {
-                this.maxDelta_ = Math.sqrt(ol.geom.flat.closest.getsMaxSquaredDelta(
-                    this.flatCoordinates, 0, this.ends_, this.stride, 0));
-                this.maxDeltaRevision_ = this.getRevision();
-            }
-            return ol.geom.flat.closest.getsClosestPoint(
-                this.flatCoordinates, 0, this.ends_, this.stride,
-                this.maxDelta_, false, x, y, closestPoint, minSquaredDistance);
-        };
-
-
-        /**
-         * Returns the coordinate at `m` using linear interpolation, or `null` if no
-         * such coordinate exists.
-         *
-         * `opt_extrapolate` controls extrapolation beyond the range of Ms in the
-         * MultiLineString. If `opt_extrapolate` is `true` then Ms less than the first
-         * M will return the first coordinate and Ms greater than the last M will
-         * return the last coordinate.
-         *
-         * `opt_interpolate` controls interpolation between consecutive LineStrings
-         * within the MultiLineString. If `opt_interpolate` is `true` the coordinates
-         * will be linearly interpolated between the last coordinate of one LineString
-         * and the first coordinate of the next LineString.  If `opt_interpolate` is
-         * `false` then the function will return `null` for Ms falling between
-         * LineStrings.
-         *
-         * @param {number} m M.
-         * @param {boolean=} opt_extrapolate Extrapolate. Default is `false`.
-         * @param {boolean=} opt_interpolate Interpolate. Default is `false`.
-         * @return {ol.Coordinate} Coordinate.
-         * @api
-         */
-        ol.geom.MultiLineString.prototype.getCoordinateAtM = function(m, opt_extrapolate, opt_interpolate) {
-            if ((this.layout != ol.geom.GeometryLayout.XYM &&
-                this.layout != ol.geom.GeometryLayout.XYZM) ||
-                this.flatCoordinates.length === 0) {
-                return null;
-            }
-            var extrapolate = opt_extrapolate !== undefined ? opt_extrapolate : false;
-            var interpolate = opt_interpolate !== undefined ? opt_interpolate : false;
-            return ol.geom.flat.interpolate.lineStringsCoordinateAtM(this.flatCoordinates, 0,
-                this.ends_, this.stride, m, extrapolate, interpolate);
-        };
-
-
-        /**
-         * Return the coordinates of the multilinestring.
-         * @return {Array.<Array.<ol.Coordinate>>} Coordinates.
-         * @override
-         * @api
-         */
-        ol.geom.MultiLineString.prototype.getCoordinates = function() {
-            return ol.geom.flat.inflate.coordinatess(
-                this.flatCoordinates, 0, this.ends_, this.stride);
-        };
-
-
-        /**
-         * @return {Array.<number>} Ends.
-         */
-        ol.geom.MultiLineString.prototype.getEnds = function() {
-            return this.ends_;
-        };
-
-
-        /**
-         * Return the linestring at the specified index.
-         * @param {number} index Index.
-         * @return {ol.geom.LineString} LineString.
-         * @api
-         */
-        ol.geom.MultiLineString.prototype.getLineString = function(index) {
-            if (index < 0 || this.ends_.length <= index) {
-                return null;
-            }
-            var lineString = new ol.geom.LineString(null);
-            lineString.setFlatCoordinates(this.layout, this.flatCoordinates.slice(
-                index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]));
-            return lineString;
-        };
-
-
-        /**
-         * Return the linestrings of this multilinestring.
-         * @return {Array.<ol.geom.LineString>} LineStrings.
-         * @api
-         */
-        ol.geom.MultiLineString.prototype.getLineStrings = function() {
-            var flatCoordinates = this.flatCoordinates;
-            var ends = this.ends_;
-            var layout = this.layout;
-            /** @type {Array.<ol.geom.LineString>} */
-            var lineStrings = [];
-            var offset = 0;
-            var i, ii;
-            for (i = 0, ii = ends.length; i < ii; ++i) {
-                var end = ends[i];
-                var lineString = new ol.geom.LineString(null);
-                lineString.setFlatCoordinates(layout, flatCoordinates.slice(offset, end));
-                lineStrings.push(lineString);
-                offset = end;
-            }
-            return lineStrings;
-        };
-
-
-        /**
-         * @return {Array.<number>} Flat midpoints.
-         */
-        ol.geom.MultiLineString.prototype.getFlatMidpoints = function() {
-            var midpoints = [];
-            var flatCoordinates = this.flatCoordinates;
-            var offset = 0;
-            var ends = this.ends_;
-            var stride = this.stride;
-            var i, ii;
-            for (i = 0, ii = ends.length; i < ii; ++i) {
-                var end = ends[i];
-                var midpoint = ol.geom.flat.interpolate.lineString(
-                    flatCoordinates, offset, end, stride, 0.5);
-                ol.array.extend(midpoints, midpoint);
-                offset = end;
-            }
-            return midpoints;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.MultiLineString.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) {
-            var simplifiedFlatCoordinates = [];
-            var simplifiedEnds = [];
-            simplifiedFlatCoordinates.length = ol.geom.flat.simplify.douglasPeuckers(
-                this.flatCoordinates, 0, this.ends_, this.stride, squaredTolerance,
-                simplifiedFlatCoordinates, 0, simplifiedEnds);
-            var simplifiedMultiLineString = new ol.geom.MultiLineString(null);
-            simplifiedMultiLineString.setFlatCoordinates(
-                ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEnds);
-            return simplifiedMultiLineString;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.MultiLineString.prototype.getType = function() {
-            return ol.geom.GeometryType.MULTI_LINE_STRING;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.MultiLineString.prototype.intersectsExtent = function(extent) {
-            return ol.geom.flat.intersectsextent.lineStrings(
-                this.flatCoordinates, 0, this.ends_, this.stride, extent);
-        };
-
-
-        /**
-         * Set the coordinates of the multilinestring.
-         * @param {Array.<Array.<ol.Coordinate>>} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         * @override
-         * @api
-         */
-        ol.geom.MultiLineString.prototype.setCoordinates = function(coordinates, opt_layout) {
-            if (!coordinates) {
-                this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.ends_);
-            } else {
-                this.setLayout(opt_layout, coordinates, 2);
-                if (!this.flatCoordinates) {
-                    this.flatCoordinates = [];
-                }
-                var ends = ol.geom.flat.deflate.coordinatess(
-                    this.flatCoordinates, 0, coordinates, this.stride, this.ends_);
-                this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1];
-                this.changed();
-            }
-        };
-
-
-        /**
-         * @param {ol.geom.GeometryLayout} layout Layout.
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {Array.<number>} ends Ends.
-         */
-        ol.geom.MultiLineString.prototype.setFlatCoordinates = function(layout, flatCoordinates, ends) {
-            this.setFlatCoordinatesInternal(layout, flatCoordinates);
-            this.ends_ = ends;
-            this.changed();
-        };
-
-
-        /**
-         * @param {Array.<ol.geom.LineString>} lineStrings LineStrings.
-         */
-        ol.geom.MultiLineString.prototype.setLineStrings = function(lineStrings) {
-            var layout = this.getLayout();
-            var flatCoordinates = [];
-            var ends = [];
-            var i, ii;
-            for (i = 0, ii = lineStrings.length; i < ii; ++i) {
-                var lineString = lineStrings[i];
-                if (i === 0) {
-                    layout = lineString.getLayout();
-                }
-                ol.array.extend(flatCoordinates, lineString.getFlatCoordinates());
-                ends.push(flatCoordinates.length);
-            }
-            this.setFlatCoordinates(layout, flatCoordinates, ends);
-        };
-
-        /**
-         * @classdesc
-         * Multi-point geometry.
-         *
-         * @constructor
-         * @extends {ol.geom.SimpleGeometry}
-         * @param {Array.<ol.Coordinate>} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         * @api
-         */
-        ol.geom.MultiPoint = function(coordinates, opt_layout) {
-            ol.geom.SimpleGeometry.call(this);
-            this.setCoordinates(coordinates, opt_layout);
-        };
-        ol.inherits(ol.geom.MultiPoint, ol.geom.SimpleGeometry);
-
-
-        /**
-         * Append the passed point to this multipoint.
-         * @param {ol.geom.Point} point Point.
-         * @api
-         */
-        ol.geom.MultiPoint.prototype.appendPoint = function(point) {
-            if (!this.flatCoordinates) {
-                this.flatCoordinates = point.getFlatCoordinates().slice();
-            } else {
-                ol.array.extend(this.flatCoordinates, point.getFlatCoordinates());
-            }
-            this.changed();
-        };
-
-
-        /**
-         * Make a complete copy of the geometry.
-         * @return {!ol.geom.MultiPoint} Clone.
-         * @override
-         * @api
-         */
-        ol.geom.MultiPoint.prototype.clone = function() {
-            var multiPoint = new ol.geom.MultiPoint(null);
-            multiPoint.setFlatCoordinates(this.layout, this.flatCoordinates.slice());
-            return multiPoint;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.MultiPoint.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) {
-            if (minSquaredDistance <
-                ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
-                return minSquaredDistance;
-            }
-            var flatCoordinates = this.flatCoordinates;
-            var stride = this.stride;
-            var i, ii, j;
-            for (i = 0, ii = flatCoordinates.length; i < ii; i += stride) {
-                var squaredDistance = ol.math.squaredDistance(
-                    x, y, flatCoordinates[i], flatCoordinates[i + 1]);
-                if (squaredDistance < minSquaredDistance) {
-                    minSquaredDistance = squaredDistance;
-                    for (j = 0; j < stride; ++j) {
-                        closestPoint[j] = flatCoordinates[i + j];
-                    }
-                    closestPoint.length = stride;
-                }
-            }
-            return minSquaredDistance;
-        };
-
-
-        /**
-         * Return the coordinates of the multipoint.
-         * @return {Array.<ol.Coordinate>} Coordinates.
-         * @override
-         * @api
-         */
-        ol.geom.MultiPoint.prototype.getCoordinates = function() {
-            return ol.geom.flat.inflate.coordinates(
-                this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
-        };
-
-
-        /**
-         * Return the point at the specified index.
-         * @param {number} index Index.
-         * @return {ol.geom.Point} Point.
-         * @api
-         */
-        ol.geom.MultiPoint.prototype.getPoint = function(index) {
-            var n = !this.flatCoordinates ?
-                0 : this.flatCoordinates.length / this.stride;
-            if (index < 0 || n <= index) {
-                return null;
-            }
-            var point = new ol.geom.Point(null);
-            point.setFlatCoordinates(this.layout, this.flatCoordinates.slice(
-                index * this.stride, (index + 1) * this.stride));
-            return point;
-        };
-
-
-        /**
-         * Return the points of this multipoint.
-         * @return {Array.<ol.geom.Point>} Points.
-         * @api
-         */
-        ol.geom.MultiPoint.prototype.getPoints = function() {
-            var flatCoordinates = this.flatCoordinates;
-            var layout = this.layout;
-            var stride = this.stride;
-            /** @type {Array.<ol.geom.Point>} */
-            var points = [];
-            var i, ii;
-            for (i = 0, ii = flatCoordinates.length; i < ii; i += stride) {
-                var point = new ol.geom.Point(null);
-                point.setFlatCoordinates(layout, flatCoordinates.slice(i, i + stride));
-                points.push(point);
-            }
-            return points;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.MultiPoint.prototype.getType = function() {
-            return ol.geom.GeometryType.MULTI_POINT;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.MultiPoint.prototype.intersectsExtent = function(extent) {
-            var flatCoordinates = this.flatCoordinates;
-            var stride = this.stride;
-            var i, ii, x, y;
-            for (i = 0, ii = flatCoordinates.length; i < ii; i += stride) {
-                x = flatCoordinates[i];
-                y = flatCoordinates[i + 1];
-                if (ol.extent.containsXY(extent, x, y)) {
-                    return true;
-                }
-            }
-            return false;
-        };
-
-
-        /**
-         * Set the coordinates of the multipoint.
-         * @param {Array.<ol.Coordinate>} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         * @override
-         * @api
-         */
-        ol.geom.MultiPoint.prototype.setCoordinates = function(coordinates, opt_layout) {
-            if (!coordinates) {
-                this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null);
-            } else {
-                this.setLayout(opt_layout, coordinates, 1);
-                if (!this.flatCoordinates) {
-                    this.flatCoordinates = [];
-                }
-                this.flatCoordinates.length = ol.geom.flat.deflate.coordinates(
-                    this.flatCoordinates, 0, coordinates, this.stride);
-                this.changed();
-            }
-        };
-
-
-        /**
-         * @param {ol.geom.GeometryLayout} layout Layout.
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         */
-        ol.geom.MultiPoint.prototype.setFlatCoordinates = function(layout, flatCoordinates) {
-            this.setFlatCoordinatesInternal(layout, flatCoordinates);
-            this.changed();
-        };
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<Array.<number>>} endss Endss.
-         * @param {number} stride Stride.
-         * @return {Array.<number>} Flat centers.
-         */
-        ol.geom.flat.center.linearRingss = {};
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<Array.<number>>} endss Endss.
-         * @param {number} stride Stride.
-         * @return {Array.<number>} Flat centers.
-         */
-        ol.geom.flat.center.linearRingss = function(flatCoordinates, offset, endss, stride) {
-            var flatCenters = [];
-            var i, ii;
-            var extent = ol.extent.createEmpty();
-            for (i = 0, ii = endss.length; i < ii; ++i) {
-                var ends = endss[i];
-                extent = ol.extent.createOrUpdateFromFlatCoordinates(
-                    flatCoordinates, offset, ends[0], stride);
-                flatCenters.push((extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2);
-                offset = ends[ends.length - 1];
-            }
-            return flatCenters;
-        };
-
-        /**
-         * @classdesc
-         * Multi-polygon geometry.
-         *
-         * @constructor
-         * @extends {ol.geom.SimpleGeometry}
-         * @param {Array.<Array.<Array.<ol.Coordinate>>>} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         * @api
-         */
-        ol.geom.MultiPolygon = function(coordinates, opt_layout) {
-
-            ol.geom.SimpleGeometry.call(this);
-
-            /**
-             * @type {Array.<Array.<number>>}
-             * @private
-             */
-            this.endss_ = [];
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.flatInteriorPointsRevision_ = -1;
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.flatInteriorPoints_ = null;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.maxDelta_ = -1;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.maxDeltaRevision_ = -1;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.orientedRevision_ = -1;
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.orientedFlatCoordinates_ = null;
-
-            this.setCoordinates(coordinates, opt_layout);
-
-        };
-        ol.inherits(ol.geom.MultiPolygon, ol.geom.SimpleGeometry);
-
-
-        /**
-         * Append the passed polygon to this multipolygon.
-         * @param {ol.geom.Polygon} polygon Polygon.
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.appendPolygon = function(polygon) {
-            /** @type {Array.<number>} */
-            var ends;
-            if (!this.flatCoordinates) {
-                this.flatCoordinates = polygon.getFlatCoordinates().slice();
-                ends = polygon.getEnds().slice();
-                this.endss_.push();
-            } else {
-                var offset = this.flatCoordinates.length;
-                ol.array.extend(this.flatCoordinates, polygon.getFlatCoordinates());
-                ends = polygon.getEnds().slice();
-                var i, ii;
-                for (i = 0, ii = ends.length; i < ii; ++i) {
-                    ends[i] += offset;
-                }
-            }
-            this.endss_.push(ends);
-            this.changed();
-        };
-
-
-        /**
-         * Make a complete copy of the geometry.
-         * @return {!ol.geom.MultiPolygon} Clone.
-         * @override
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.clone = function() {
-            var multiPolygon = new ol.geom.MultiPolygon(null);
-
-            var len = this.endss_.length;
-            var newEndss = new Array(len);
-            for (var i = 0; i < len; ++i) {
-                newEndss[i] = this.endss_[i].slice();
-            }
-
-            multiPolygon.setFlatCoordinates(
-                this.layout, this.flatCoordinates.slice(), newEndss);
-            return multiPolygon;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.MultiPolygon.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) {
-            if (minSquaredDistance <
-                ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
-                return minSquaredDistance;
-            }
-            if (this.maxDeltaRevision_ != this.getRevision()) {
-                this.maxDelta_ = Math.sqrt(ol.geom.flat.closest.getssMaxSquaredDelta(
-                    this.flatCoordinates, 0, this.endss_, this.stride, 0));
-                this.maxDeltaRevision_ = this.getRevision();
-            }
-            return ol.geom.flat.closest.getssClosestPoint(
-                this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride,
-                this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.MultiPolygon.prototype.containsXY = function(x, y) {
-            return ol.geom.flat.contains.linearRingssContainsXY(
-                this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, x, y);
-        };
-
-
-        /**
-         * Return the area of the multipolygon on projected plane.
-         * @return {number} Area (on projected plane).
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.getArea = function() {
-            return ol.geom.flat.area.linearRingss(
-                this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride);
-        };
-
-
-        /**
-         * Get the coordinate array for this geometry.  This array has the structure
-         * of a GeoJSON coordinate array for multi-polygons.
-         *
-         * @param {boolean=} opt_right Orient coordinates according to the right-hand
-         *     rule (counter-clockwise for exterior and clockwise for interior rings).
-         *     If `false`, coordinates will be oriented according to the left-hand rule
-         *     (clockwise for exterior and counter-clockwise for interior rings).
-         *     By default, coordinate orientation will depend on how the geometry was
-         *     constructed.
-         * @return {Array.<Array.<Array.<ol.Coordinate>>>} Coordinates.
-         * @override
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.getCoordinates = function(opt_right) {
-            var flatCoordinates;
-            if (opt_right !== undefined) {
-                flatCoordinates = this.getOrientedFlatCoordinates().slice();
-                ol.geom.flat.orient.orientLinearRingss(
-                    flatCoordinates, 0, this.endss_, this.stride, opt_right);
-            } else {
-                flatCoordinates = this.flatCoordinates;
-            }
-
-            return ol.geom.flat.inflate.coordinatesss(
-                flatCoordinates, 0, this.endss_, this.stride);
-        };
-
-
-        /**
-         * @return {Array.<Array.<number>>} Endss.
-         */
-        ol.geom.MultiPolygon.prototype.getEndss = function() {
-            return this.endss_;
-        };
-
-
-        /**
-         * @return {Array.<number>} Flat interior points.
-         */
-        ol.geom.MultiPolygon.prototype.getFlatInteriorPoints = function() {
-            if (this.flatInteriorPointsRevision_ != this.getRevision()) {
-                var flatCenters = ol.geom.flat.center.linearRingss(
-                    this.flatCoordinates, 0, this.endss_, this.stride);
-                this.flatInteriorPoints_ = ol.geom.flat.interiorpoint.linearRingss(
-                    this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride,
-                    flatCenters);
-                this.flatInteriorPointsRevision_ = this.getRevision();
-            }
-            return this.flatInteriorPoints_;
-        };
-
-
-        /**
-         * Return the interior points as {@link ol.geom.MultiPoint multipoint}.
-         * @return {ol.geom.MultiPoint} Interior points as XYM coordinates, where M is
-         * the length of the horizontal intersection that the point belongs to.
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.getInteriorPoints = function() {
-            var interiorPoints = new ol.geom.MultiPoint(null);
-            interiorPoints.setFlatCoordinates(ol.geom.GeometryLayout.XYM,
-                this.getFlatInteriorPoints().slice());
-            return interiorPoints;
-        };
-
-
-        /**
-         * @return {Array.<number>} Oriented flat coordinates.
-         */
-        ol.geom.MultiPolygon.prototype.getOrientedFlatCoordinates = function() {
-            if (this.orientedRevision_ != this.getRevision()) {
-                var flatCoordinates = this.flatCoordinates;
-                if (ol.geom.flat.orient.linearRingssAreOriented(
-                    flatCoordinates, 0, this.endss_, this.stride)) {
-                    this.orientedFlatCoordinates_ = flatCoordinates;
-                } else {
-                    this.orientedFlatCoordinates_ = flatCoordinates.slice();
-                    this.orientedFlatCoordinates_.length =
-                        ol.geom.flat.orient.orientLinearRingss(
-                            this.orientedFlatCoordinates_, 0, this.endss_, this.stride);
-                }
-                this.orientedRevision_ = this.getRevision();
-            }
-            return this.orientedFlatCoordinates_;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.geom.MultiPolygon.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) {
-            var simplifiedFlatCoordinates = [];
-            var simplifiedEndss = [];
-            simplifiedFlatCoordinates.length = ol.geom.flat.simplify.quantizess(
-                this.flatCoordinates, 0, this.endss_, this.stride,
-                Math.sqrt(squaredTolerance),
-                simplifiedFlatCoordinates, 0, simplifiedEndss);
-            var simplifiedMultiPolygon = new ol.geom.MultiPolygon(null);
-            simplifiedMultiPolygon.setFlatCoordinates(
-                ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEndss);
-            return simplifiedMultiPolygon;
-        };
-
-
-        /**
-         * Return the polygon at the specified index.
-         * @param {number} index Index.
-         * @return {ol.geom.Polygon} Polygon.
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.getPolygon = function(index) {
-            if (index < 0 || this.endss_.length <= index) {
-                return null;
-            }
-            var offset;
-            if (index === 0) {
-                offset = 0;
-            } else {
-                var prevEnds = this.endss_[index - 1];
-                offset = prevEnds[prevEnds.length - 1];
-            }
-            var ends = this.endss_[index].slice();
-            var end = ends[ends.length - 1];
-            if (offset !== 0) {
-                var i, ii;
-                for (i = 0, ii = ends.length; i < ii; ++i) {
-                    ends[i] -= offset;
-                }
-            }
-            var polygon = new ol.geom.Polygon(null);
-            polygon.setFlatCoordinates(
-                this.layout, this.flatCoordinates.slice(offset, end), ends);
-            return polygon;
-        };
-
-
-        /**
-         * Return the polygons of this multipolygon.
-         * @return {Array.<ol.geom.Polygon>} Polygons.
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.getPolygons = function() {
-            var layout = this.layout;
-            var flatCoordinates = this.flatCoordinates;
-            var endss = this.endss_;
-            var polygons = [];
-            var offset = 0;
-            var i, ii, j, jj;
-            for (i = 0, ii = endss.length; i < ii; ++i) {
-                var ends = endss[i].slice();
-                var end = ends[ends.length - 1];
-                if (offset !== 0) {
-                    for (j = 0, jj = ends.length; j < jj; ++j) {
-                        ends[j] -= offset;
-                    }
-                }
-                var polygon = new ol.geom.Polygon(null);
-                polygon.setFlatCoordinates(
-                    layout, flatCoordinates.slice(offset, end), ends);
-                polygons.push(polygon);
-                offset = end;
-            }
-            return polygons;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.getType = function() {
-            return ol.geom.GeometryType.MULTI_POLYGON;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.intersectsExtent = function(extent) {
-            return ol.geom.flat.intersectsextent.linearRingss(
-                this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, extent);
-        };
-
-
-        /**
-         * Set the coordinates of the multipolygon.
-         * @param {Array.<Array.<Array.<ol.Coordinate>>>} coordinates Coordinates.
-         * @param {ol.geom.GeometryLayout=} opt_layout Layout.
-         * @override
-         * @api
-         */
-        ol.geom.MultiPolygon.prototype.setCoordinates = function(coordinates, opt_layout) {
-            if (!coordinates) {
-                this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.endss_);
-            } else {
-                this.setLayout(opt_layout, coordinates, 3);
-                if (!this.flatCoordinates) {
-                    this.flatCoordinates = [];
-                }
-                var endss = ol.geom.flat.deflate.coordinatesss(
-                    this.flatCoordinates, 0, coordinates, this.stride, this.endss_);
-                if (endss.length === 0) {
-                    this.flatCoordinates.length = 0;
-                } else {
-                    var lastEnds = endss[endss.length - 1];
-                    this.flatCoordinates.length = lastEnds.length === 0 ?
-                        0 : lastEnds[lastEnds.length - 1];
-                }
-                this.changed();
-            }
-        };
-
-
-        /**
-         * @param {ol.geom.GeometryLayout} layout Layout.
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {Array.<Array.<number>>} endss Endss.
-         */
-        ol.geom.MultiPolygon.prototype.setFlatCoordinates = function(layout, flatCoordinates, endss) {
-            this.setFlatCoordinatesInternal(layout, flatCoordinates);
-            this.endss_ = endss;
-            this.changed();
-        };
-
-
-        /**
-         * @param {Array.<ol.geom.Polygon>} polygons Polygons.
-         */
-        ol.geom.MultiPolygon.prototype.setPolygons = function(polygons) {
-            var layout = this.getLayout();
-            var flatCoordinates = [];
-            var endss = [];
-            var i, ii, ends;
-            for (i = 0, ii = polygons.length; i < ii; ++i) {
-                var polygon = polygons[i];
-                if (i === 0) {
-                    layout = polygon.getLayout();
-                }
-                var offset = flatCoordinates.length;
-                ends = polygon.getEnds();
-                var j, jj;
-                for (j = 0, jj = ends.length; j < jj; ++j) {
-                    ends[j] += offset;
-                }
-                ol.array.extend(flatCoordinates, polygon.getFlatCoordinates());
-                endss.push(ends);
-            }
-            this.setFlatCoordinates(layout, flatCoordinates, endss);
-        };
-
-
-        ol.Feature = function(opt_geometryOrProperties) {
-
-            ol.Object.call(this);
-
-            /**
-             * @private
-             * @type {number|string|undefined}
-             */
-            this.id_ = undefined;
-
-            /**
-             * @type {string}
-             * @private
-             */
-            this.geometryName_ = 'geometry';
-
-            /**
-             * User provided style.
-             * @private
-             * @type {ol.style.Style|Array.<ol.style.Style>|
-       *     ol.FeatureStyleFunction}
-             */
-            this.style_ = null;
-
-            /**
-             * @private
-             * @type {ol.FeatureStyleFunction|undefined}
-             */
-            this.styleFunction_ = undefined;
-
-            /**
-             * @private
-             * @type {?ol.EventsKey}
-             */
-            this.geometryChangeKey_ = null;
-
-    //        ol.events.listen(
-    //            this, ol.Object.getChangeEventType(this.geometryName_),
-    //            this.handleGeometryChanged_, this);
-
-            if (opt_geometryOrProperties !== undefined) {
-                if (opt_geometryOrProperties instanceof ol.geom.Geometry ||
-                    !opt_geometryOrProperties) {
-                    var geometry = opt_geometryOrProperties;
-                    this.setGeometry(geometry);
-                } else {
-                    /** @type {Object.<string, *>} */
-                    var properties = opt_geometryOrProperties;
-                    this.setProperties(properties);
-                }
-            }
-        };
-        ol.inherits(ol.Feature, ol.Object);
-
-
-        /**
-         * Clone this feature. If the original feature has a geometry it
-         * is also cloned. The feature id is not set in the clone.
-         * @return {ol.Feature} The clone.
-         * @api
-         */
-        ol.Feature.prototype.clone = function() {
-            var clone = new ol.Feature(this.getProperties());
-            clone.setGeometryName(this.getGeometryName());
-            var geometry = this.getGeometry();
-            if (geometry) {
-                clone.setGeometry(geometry.clone());
-            }
-            var style = this.getStyle();
-            if (style) {
-                clone.setStyle(style);
-            }
-            return clone;
-        };
-
-
-        /**
-         * Get the feature's default geometry.  A feature may have any number of named
-         * geometries.  The "default" geometry (the one that is rendered by default) is
-         * set when calling {@link ol.Feature#setGeometry}.
-         * @return {ol.geom.Geometry|undefined} The default geometry for the feature.
-         * @api
-         * @observable
-         */
-        ol.Feature.prototype.getGeometry = function() {
-            return /** @type {ol.geom.Geometry|undefined} */ (
-                this.get(this.geometryName_));
-        };
-
-
-        /**
-         * Get the feature identifier.  This is a stable identifier for the feature and
-         * is either set when reading data from a remote source or set explicitly by
-         * calling {@link ol.Feature#setId}.
-         * @return {number|string|undefined} Id.
-         * @api
-         */
-        ol.Feature.prototype.getId = function() {
-            return this.id_;
-        };
-
-
-        /**
-         * Get the name of the feature's default geometry.  By default, the default
-         * geometry is named `geometry`.
-         * @return {string} Get the property name associated with the default geometry
-         *     for this feature.
-         * @api
-         */
-        ol.Feature.prototype.getGeometryName = function() {
-            return this.geometryName_;
-        };
-
-
-        /**
-         * Get the feature's style. Will return what was provided to the
-         * {@link ol.Feature#setStyle} method.
-         * @return {ol.style.Style|Array.<ol.style.Style>|
-     *     ol.FeatureStyleFunction|ol.StyleFunction} The feature style.
-         * @api
-         */
-        ol.Feature.prototype.getStyle = function() {
-            return this.style_;
-        };
-
-
-        /**
-         * Get the feature's style function.
-         * @return {ol.FeatureStyleFunction|undefined} Return a function
-         * representing the current style of this feature.
-         * @api
-         */
-        ol.Feature.prototype.getStyleFunction = function() {
-            return this.styleFunction_;
-        };
-
-
-        /**
-         * @private
-         */
-        ol.Feature.prototype.handleGeometryChange_ = function() {
-            this.changed();
-        };
-
-
-        /**
-         * @private
-         */
-        ol.Feature.prototype.handleGeometryChanged_ = function() {
-            if (this.geometryChangeKey_) {
-                ol.events.unlistenByKey(this.geometryChangeKey_);
-                this.geometryChangeKey_ = null;
-            }
-            var geometry = this.getGeometry();
-            if (geometry) {
-                this.geometryChangeKey_ = ol.events.listen(geometry,
-                    ol.events.EventType.CHANGE, this.handleGeometryChange_, this);
-            }
-            this.changed();
-        };
-
-
-        /**
-         * Set the default geometry for the feature.  This will update the property
-         * with the name returned by {@link ol.Feature#getGeometryName}.
-         * @param {ol.geom.Geometry|undefined} geometry The new geometry.
-         * @api
-         * @observable
-         */
-        ol.Feature.prototype.setGeometry = function(geometry) {
-            this.set(this.geometryName_, geometry);
-        };
-
-
-        /**
-         * Set the style for the feature.  This can be a single style object, an array
-         * of styles, or a function that takes a resolution and returns an array of
-         * styles. If it is `null` the feature has no style (a `null` style).
-         * @param {ol.style.Style|Array.<ol.style.Style>|
-     *     ol.FeatureStyleFunction|ol.StyleFunction} style Style for this feature.
-         * @api
-         * @fires ol.events.Event#event:change
-         */
-        ol.Feature.prototype.setStyle = function(style) {
-            this.style_ = style;
-            this.styleFunction_ = !style ?
-                undefined : ol.Feature.createStyleFunction(style);
-            this.changed();
-        };
-
-
-        /**
-         * Set the feature id.  The feature id is considered stable and may be used when
-         * requesting features or comparing identifiers returned from a remote source.
-         * The feature id can be used with the {@link ol.source.Vector#getFeatureById}
-         * method.
-         * @param {number|string|undefined} id The feature id.
-         * @api
-         * @fires ol.events.Event#event:change
-         */
-        ol.Feature.prototype.setId = function(id) {
-            this.id_ = id;
-            this.changed();
-        };
-
-
-        /**
-         * Set the property name to be used when getting the feature's default geometry.
-         * When calling {@link ol.Feature#getGeometry}, the value of the property with
-         * this name will be returned.
-         * @param {string} name The property name of the default geometry.
-         * @api
-         */
-        ol.Feature.prototype.setGeometryName = function(name) {
-            ol.events.unlisten(
-                this, ol.Object.getChangeEventType(this.geometryName_),
-                this.handleGeometryChanged_, this);
-            this.geometryName_ = name;
-            ol.events.listen(
-                this, ol.Object.getChangeEventType(this.geometryName_),
-                this.handleGeometryChanged_, this);
-            this.handleGeometryChanged_();
-        };
-
-
-        /**
-         * Convert the provided object into a feature style function.  Functions passed
-         * through unchanged.  Arrays of ol.style.Style or single style objects wrapped
-         * in a new feature style function.
-         * @param {ol.FeatureStyleFunction|!Array.<ol.style.Style>|!ol.style.Style} obj
-         *     A feature style function, a single style, or an array of styles.
-         * @return {ol.FeatureStyleFunction} A style function.
-         */
-        ol.Feature.createStyleFunction = function(obj) {
-            var styleFunction;
-
-            if (typeof obj === 'function') {
-                if (obj.length == 2) {
-                    styleFunction = function(resolution) {
-                        return /** @type {ol.StyleFunction} */ (obj)(this, resolution);
-                    };
-                } else {
-                    styleFunction = obj;
-                }
-            } else {
-                /**
-                 * @type {Array.<ol.style.Style>}
-                 */
-                var styles;
-                if (Array.isArray(obj)) {
-                    styles = obj;
-                } else {
-                    ol.asserts.assert(obj instanceof ol.style.Style,
-                        41); // Expected an `ol.style.Style` or an array of `ol.style.Style`
-                    styles = [obj];
-                }
-                styleFunction = function() {
-                    return styles;
-                };
-            }
-            return styleFunction;
-        };
-
-        ol.format = {};
-
-        ol.format.Feature = function() {
-
-            /**
-             * @protected
-             * @type {ol.proj.Projection}
-             */
-            this.defaultDataProjection = null;
-
-            /**
-             * @protected
-             * @type {ol.proj.Projection}
-             */
-            this.defaultFeatureProjection = null;
-
-        };
-
-
-        /**
-         * Adds the data projection to the read options.
-         * @param {Document|Node|Object|string} source Source.
-         * @param {olx.format.ReadOptions=} opt_options Options.
-         * @return {olx.format.ReadOptions|undefined} Options.
-         * @protected
-         */
-        ol.format.Feature.prototype.getReadOptions = function(source, opt_options) {
-            var options;
-            if (opt_options) {
-                options = {
-                    dataProjection: opt_options.dataProjection ?
-                        opt_options.dataProjection : this.readProjection(source),
-                    featureProjection: opt_options.featureProjection
-                };
-            }
-            return this.adaptOptions(options);
-        };
-
-
-        /**
-         * Sets the `defaultDataProjection` on the options, if no `dataProjection`
-         * is set.
-         * @param {olx.format.WriteOptions|olx.format.ReadOptions|undefined} options
-         *     Options.
-         * @protected
-         * @return {olx.format.WriteOptions|olx.format.ReadOptions|undefined}
-         *     Updated options.
-         */
-        ol.format.Feature.prototype.adaptOptions = function(options) {
-            return ol.obj.assign({
-                dataProjection: this.defaultDataProjection,
-                featureProjection: this.defaultFeatureProjection
-            }, options);
-        };
-
-
-        /**
-         * Get the extent from the source of the last {@link readFeatures} call.
-         * @return {ol.Extent} Tile extent.
-         */
-        ol.format.Feature.prototype.getLastExtent = function() {
-            return null;
-        };
-
-
-        /**
-         * @abstract
-         * @return {ol.format.FormatType} Format.
-         */
-        ol.format.Feature.prototype.getType = function() {};
-
-
-        /**
-         * Read a single feature from a source.
-         *
-         * @abstract
-         * @param {Document|Node|Object|string} source Source.
-         * @param {olx.format.ReadOptions=} opt_options Read options.
-         * @return {ol.Feature} Feature.
-         */
-        ol.format.Feature.prototype.readFeature = function(source, opt_options) {};
-
-
-        /**
-         * Read all features from a source.
-         *
-         * @abstract
-         * @param {Document|Node|ArrayBuffer|Object|string} source Source.
-         * @param {olx.format.ReadOptions=} opt_options Read options.
-         * @return {Array.<ol.Feature>} Features.
-         */
-        ol.format.Feature.prototype.readFeatures = function(source, opt_options) {};
-
-
-        /**
-         * Read a single geometry from a source.
-         *
-         * @abstract
-         * @param {Document|Node|Object|string} source Source.
-         * @param {olx.format.ReadOptions=} opt_options Read options.
-         * @return {ol.geom.Geometry} Geometry.
-         */
-        ol.format.Feature.prototype.readGeometry = function(source, opt_options) {};
-
-
-        /**
-         * Read the projection from a source.
-         *
-         * @abstract
-         * @param {Document|Node|Object|string} source Source.
-         * @return {ol.proj.Projection} Projection.
-         */
-        ol.format.Feature.prototype.readProjection = function(source) {};
-
-
-        /**
-         * Encode a feature in this format.
-         *
-         * @abstract
-         * @param {ol.Feature} feature Feature.
-         * @param {olx.format.WriteOptions=} opt_options Write options.
-         * @return {string} Result.
-         */
-        ol.format.Feature.prototype.writeFeature = function(feature, opt_options) {};
-
-
-        /**
-         * Encode an array of features in this format.
-         *
-         * @abstract
-         * @param {Array.<ol.Feature>} features Features.
-         * @param {olx.format.WriteOptions=} opt_options Write options.
-         * @return {string} Result.
-         */
-        ol.format.Feature.prototype.writeFeatures = function(features, opt_options) {};
-
-
-        /**
-         * Write a single geometry in this format.
-         *
-         * @abstract
-         * @param {ol.geom.Geometry} geometry Geometry.
-         * @param {olx.format.WriteOptions=} opt_options Write options.
-         * @return {string} Result.
-         */
-        ol.format.Feature.prototype.writeGeometry = function(geometry, opt_options) {};
-
-
-        /**
-         * @param {ol.geom.Geometry|ol.Extent} geometry Geometry.
-         * @param {boolean} write Set to true for writing, false for reading.
-         * @param {(olx.format.WriteOptions|olx.format.ReadOptions)=} opt_options
-         *     Options.
-         * @return {ol.geom.Geometry|ol.Extent} Transformed geometry.
-         * @protected
-         */
-        ol.format.Feature.transformWithOptions = function(
-            geometry, write, opt_options) {
-
-            /**
-             * @type {ol.geom.Geometry|ol.Extent}
-             */
-            var transformed;
-            {
-                transformed = geometry;
-            }
-            if (write && opt_options && opt_options.decimals !== undefined) {
-                var power = Math.pow(10, opt_options.decimals);
-                // if decimals option on write, round each coordinate appropriately
-                /**
-                 * @param {Array.<number>} coordinates Coordinates.
-                 * @return {Array.<number>} Transformed coordinates.
-                 */
-                var transform = function(coordinates) {
-                    for (var i = 0, ii = coordinates.length; i < ii; ++i) {
-                        coordinates[i] = Math.round(coordinates[i] * power) / power;
-                    }
-                    return coordinates;
-                };
-                if (transformed === geometry) {
-                    transformed = transformed.clone();
-                }
-                transformed.applyTransform(transform);
-            }
-            return transformed;
-        };
-
-
-        ol.format.MVT = function(opt_options) {
-
-            ol.format.Feature.call(this);
-
-            var options = opt_options ? opt_options : {};
-
-            /**
-             * @type {ol.proj.Projection}
-             */
-    //        this.defaultDataProjection = new ol.proj.Projection({
-    //            code: 'EPSG:3857',
-    //            units: ol.proj.Units.TILE_PIXELS
-    //        });
-
-            /**
-             * @private
-             * @type {function((ol.geom.Geometry|Object.<string,*>)=)|
-       *     function(ol.geom.GeometryType,Array.<number>,
-       *         (Array.<number>|Array.<Array.<number>>),Object.<string,*>,number)}
-             */
-            this.featureClass_ = options.featureClass ?
-                options.featureClass : ol.render.Feature;
-
-            /**
-             * @private
-             * @type {string|undefined}
-             */
-            this.geometryName_ = options.geometryName;
-
-            /**
-             * @private
-             * @type {string}
-             */
-            this.layerName_ = options.layerName ? options.layerName : 'layer';
-
-            /**
-             * @private
-             * @type {Array.<string>}
-             */
-            this.layers_ = options.layers ? options.layers : null;
-
-            /**
-             * @private
-             * @type {ol.Extent}
-             */
-            this.extent_ = null;
-
-        };
-        ol.inherits(ol.format.MVT, ol.format.Feature);
-
-        ol.format.MVT.pbfReaders_ = {
-            layers: function (tag, layers, pbf) {
-                if (tag === 3) {
-                    var layer = {
-                        keys: [],
-                        values: [],
-                        features: []
-                    };
-                    var end = pbf.readVarint() + pbf.pos;
-                    pbf.readFields(ol.format.MVT.pbfReaders_.layer, layer, end);
-                    layer.length = layer.features.length;
-                    if (layer.length) {
-                        layers[layer.name] = layer;
-                    }
-                }
-            },
-            layer: function (tag, layer, pbf) {
-                if (tag === 15) {
-                    layer.version = pbf.readVarint();
-                } else if (tag === 1) {
-                    layer.name = pbf.readString();
-                } else if (tag === 5) {
-                    layer.extent = pbf.readVarint();
-                } else if (tag === 2) {
-                    layer.features.push(pbf.pos);
-                } else if (tag === 3) {
-                    layer.keys.push(pbf.readString());
-                } else if (tag === 4) {
-                    var value = null;
-                    var end = pbf.readVarint() + pbf.pos;
-                    while (pbf.pos < end) {
-                        tag = pbf.readVarint() >> 3;
-                        value = tag === 1 ? pbf.readString() :
-                            tag === 2 ? pbf.readFloat() :
-                                tag === 3 ? pbf.readDouble() :
-                                    tag === 4 ? pbf.readVarint64() :
-                                        tag === 5 ? pbf.readVarint() :
-                                            tag === 6 ? pbf.readSVarint() :
-                                                tag === 7 ? pbf.readBoolean() : null;
-                    }
-                    layer.values.push(value);
-                }
-            },
-            feature: function (tag, feature, pbf) {
-                if (tag == 1) {
-                    feature.id = pbf.readVarint();
-                } else if (tag == 2) {
-                    var end = pbf.readVarint() + pbf.pos;
-                    while (pbf.pos < end) {
-                        var key = feature.layer.keys[pbf.readVarint()];
-                        var value = feature.layer.values[pbf.readVarint()];
-                        feature.properties[key] = value;
-                    }
-                } else if (tag == 3) {
-                    feature.type = pbf.readVarint();
-                } else if (tag == 4) {
-                    feature.geometry = pbf.pos;
-                }
-            }
-        };
-
-        /**
-         * Read a raw feature from the pbf offset stored at index `i` in the raw layer.
-         * @suppress {missingProperties}
-         * @private
-         * @param {ol.ext.PBF} pbf PBF.
-         * @param {Object} layer Raw layer.
-         * @param {number} i Index of the feature in the raw layer's `features` array.
-         * @return {Object} Raw feature.
-         */
-        ol.format.MVT.readRawFeature_ = function (pbf, layer, i) {
-            pbf.pos = layer.features[i];
-            var end = pbf.readVarint() + pbf.pos;
-
-            var feature = {
-                layer: layer,
-                type: 0,
-                properties: {}
-            };
-            pbf.readFields(ol.format.MVT.pbfReaders_.feature, feature, end);
-            return feature;
-        };
-
-        /**
-         * Read the raw geometry from the pbf offset stored in a raw feature's geometry
-         * proeprty.
-         * @suppress {missingProperties}
-         * @private
-         * @param {ol.ext.PBF} pbf PBF.
-         * @param {Object} feature Raw feature.
-         * @param {Array.<number>} flatCoordinates Array to store flat coordinates in.
-         * @param {Array.<number>} ends Array to store ends in.
-         */
-        ol.format.MVT.readRawGeometry_ = function (pbf, feature, flatCoordinates, ends) {
-            pbf.pos = feature.geometry;
-
-            var end = pbf.readVarint() + pbf.pos;
-            var cmd = 1;
-            var length = 0;
-            var x = 0;
-            var y = 0;
-            var coordsLen = 0;
-            var currentEnd = 0;
-
-            while (pbf.pos < end) {
-                if (!length) {
-                    var cmdLen = pbf.readVarint();
-                    cmd = cmdLen & 0x7;
-                    length = cmdLen >> 3;
-                }
-
-                length--;
-
-                if (cmd === 1 || cmd === 2) {
-                    x += pbf.readSVarint();
-                    y += pbf.readSVarint();
-
-                    if (cmd === 1) { // moveTo
-                        if (coordsLen > currentEnd) {
-                            ends.push(coordsLen);
-                            currentEnd = coordsLen;
-                        }
-                    }
-
-                    flatCoordinates.push(x, y);
-                    coordsLen += 2;
-
-                } else if (cmd === 7) {
-
-                    if (coordsLen > currentEnd) {
-                        // close polygon
-                        flatCoordinates.push(
-                            flatCoordinates[currentEnd], flatCoordinates[currentEnd + 1]);
-                        coordsLen += 2;
-                    }
-
-                } else {
-                    ol.asserts.assert(false, 59); // Invalid command found in the PBF
-                }
-            }
-
-            if (coordsLen > currentEnd) {
-                ends.push(coordsLen);
-                currentEnd = coordsLen;
-            }
-
-        };
-
-        /**
-         * @suppress {missingProperties}
-         * @private
-         * @param {number} type The raw feature's geometry type
-         * @param {number} numEnds Number of ends of the flat coordinates of the
-         * geometry.
-         * @return {ol.geom.GeometryType} The geometry type.
-         */
-        ol.format.MVT.getGeometryType_ = function (type, numEnds) {
-            /** @type {ol.geom.GeometryType} */
-            var geometryType;
-            if (type === 1) {
-                geometryType = numEnds === 1 ?
-                    ol.geom.GeometryType.POINT : ol.geom.GeometryType.MULTI_POINT;
-            } else if (type === 2) {
-                geometryType = numEnds === 1 ?
-                    ol.geom.GeometryType.LINE_STRING :
-                    ol.geom.GeometryType.MULTI_LINE_STRING;
-            } else if (type === 3) {
-                geometryType = ol.geom.GeometryType.POLYGON;
-                // MultiPolygon not relevant for rendering - winding order determines
-                // outer rings of polygons.
-            }
-            return geometryType;
-        };
-
-        /**
-         * @private
-         * @param {ol.ext.PBF} pbf PBF
-         * @param {Object} rawFeature Raw Mapbox feature.
-         * @param {olx.format.ReadOptions=} opt_options Read options.
-         * @return {ol.Feature|ol.render.Feature} Feature.
-         */
-        ol.format.MVT.prototype.createFeature_ = function (pbf, rawFeature, opt_options) {
-            var type = rawFeature.type;
-            if (type === 0) {
-                return null;
-            }
-
-            var feature;
-            var id = rawFeature.id;
-            var values = rawFeature.properties;
-            values[this.layerName_] = rawFeature.layer.name;
-
-            var flatCoordinates = [];
-            var ends = [];
-            ol.format.MVT.readRawGeometry_(pbf, rawFeature, flatCoordinates, ends);
-
-            var geometryType = ol.format.MVT.getGeometryType_(type, ends.length);
-
-            var geom;
-            if (geometryType == ol.geom.GeometryType.POLYGON) {
-                var endss = [];
-                var offset = 0;
-                var prevEndIndex = 0;
-                for (var i = 0, ii = ends.length; i < ii; ++i) {
-                    var end = ends[i];
-                    if (!ol.geom.flat.orient.linearRingIsClockwise(flatCoordinates, offset, end, 2)) {
-                        endss.push(ends.slice(prevEndIndex, i + 1));
-                        prevEndIndex = i + 1;
-                    }
-                    offset = end;
-                }
-                if (endss.length > 1) {
-                    ends = endss;
-                    geom = new ol.geom.MultiPolygon(null);
-                } else {
-                    geom = new ol.geom.Polygon(null);
-                }
-            } else {
-                geom = geometryType === ol.geom.GeometryType.POINT ? new ol.geom.Point(null) :
-                    geometryType === ol.geom.GeometryType.LINE_STRING ? new ol.geom.LineString(null) :
-                        geometryType === ol.geom.GeometryType.POLYGON ? new ol.geom.Polygon(null) :
-                            geometryType === ol.geom.GeometryType.MULTI_POINT ? new ol.geom.MultiPoint(null) :
-                                geometryType === ol.geom.GeometryType.MULTI_LINE_STRING ? new ol.geom.MultiLineString(null) :
-                                    null;
-            }
-            geom.setFlatCoordinates(ol.geom.GeometryLayout.XY, flatCoordinates, ends);
-            feature = new this.featureClass_();
-            if (this.geometryName_) {
-                feature.setGeometryName(this.geometryName_);
-            }
-            var geometry = ol.format.Feature.transformWithOptions(geom, false, this.adaptOptions(opt_options));
-            feature.setGeometry(geometry);
-            feature.setId(id);
-            feature.setProperties(values);
-
-            return feature;
-        };
-
-        ol.format.MVT.prototype.readFeatures = function (source, opt_options) {
-            var layers = this.layers_;
-
-            var pbf$1 = new pbf.Protobuf(/** @type {ArrayBuffer} */ (source));
-            var pbfLayers = pbf$1.readFields(ol.format.MVT.pbfReaders_.layers, {});
-            /** @type {Array.<ol.Feature|ol.render.Feature>} */
-            var features = [];
-            var pbfLayer;
-            for (var name in pbfLayers) {
-                if (layers && layers.indexOf(name) == -1) {
-                    continue;
-                }
-
-                if (opt_options !== undefined) {
-                    var needSourceLayerNames = opt_options.needSourceLayerNames;
-                    if (needSourceLayerNames !== undefined && needSourceLayerNames[name] === undefined) {
-                        continue;
-                    }
-                }
-
-                pbfLayer = pbfLayers[name];
-
-                var rawFeature;
-                for (var i = 0, ii = pbfLayer.length; i < ii; ++i) {
-                    rawFeature = ol.format.MVT.readRawFeature_(pbf$1, pbfLayer, i);
-                    features.push(this.createFeature_(pbf$1, rawFeature));
-                }
-                this.extent_ = pbfLayer ? [0, 0, pbfLayer.extent, pbfLayer.extent] : null;
-            }
-
-            return features;
-        };
-
-        ol.style = {};
-
-        /**
-         * Singleton class. Available through {@link ol.style.iconImageCache}.
-         * @constructor
-         */
-        ol.style.IconImageCache = function() {
-            this.cache_ = {};
-            this.cacheSize_ = 0;
-            this.maxCacheSize_ = 32;
-        };
-
-        ol.style.IconImageCache.getKey = function(src, crossOrigin, color) {
-            var colorString = color ? ol.color.asString(color) : 'null';
-            return crossOrigin + ':' + src + ':' + colorString;
-        };
-
-
-        /**
-         * FIXME empty description for jsdoc
-         */
-        ol.style.IconImageCache.prototype.clear = function() {
-            this.cache_ = {};
-            this.cacheSize_ = 0;
-        };
-
-
-        /**
-         * FIXME empty description for jsdoc
-         */
-        ol.style.IconImageCache.prototype.expire = function() {
-            if (this.cacheSize_ > this.maxCacheSize_) {
-                var i = 0;
-                var key, iconImage;
-                for (key in this.cache_) {
-                    iconImage = this.cache_[key];
-                    if ((i++ & 3) === 0 && !iconImage.hasListener()) {
-                        delete this.cache_[key];
-                        --this.cacheSize_;
-                    }
-                }
-            }
-        };
-
-        ol.style.IconImageCache.prototype.get = function(src, crossOrigin, color) {
-            var key = ol.style.IconImageCache.getKey(src, crossOrigin, color);
-            return key in this.cache_ ? this.cache_[key] : null;
-        };
-
-        ol.style.IconImageCache.prototype.set = function(src, crossOrigin, color, iconImage) {
-            var key = ol.style.IconImageCache.getKey(src, crossOrigin, color);
-            this.cache_[key] = iconImage;
-            ++this.cacheSize_;
-        };
-
-        ol.style.IconImageCache.prototype.setSize = function(maxCacheSize) {
-            this.maxCacheSize_ = maxCacheSize;
-            this.expire();
-        };
-
-        /**
-         * The {@link ol.style.IconImageCache} for {@link ol.style.Icon} images.
-         * @api
-         */
-        ol.style.iconImageCache = new ol.style.IconImageCache();
-
-        ol.style.Image = function(options) {
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.opacity_ = options.opacity;
-
-            /**
-             * @private
-             * @type {boolean}
-             */
-            this.rotateWithView_ = options.rotateWithView;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.rotation_ = options.rotation;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.scale_ = options.scale;
-
-            /**
-             * @private
-             * @type {boolean}
-             */
-            this.snapToPixel_ = options.snapToPixel;
-
-        };
-
-        ol.style.Image.prototype.getOpacity = function() {
-            return this.opacity_;
-        };
-
-        ol.style.Image.prototype.getRotateWithView = function() {
-            return this.rotateWithView_;
-        };
-
-        ol.style.Image.prototype.getRotation = function() {
-            return this.rotation_;
-        };
-
-        ol.style.Image.prototype.getScale = function() {
-            return this.scale_;
-        };
-
-        ol.style.Image.prototype.getSnapToPixel = function() {
-            return this.snapToPixel_;
-        };
-
-        ol.style.Image.prototype.getAnchor = function() {};
-
-        ol.style.Image.prototype.getImage = function(pixelRatio) {};
-
-        ol.style.Image.prototype.getHitDetectionImage = function(pixelRatio) {};
-
-        ol.style.Image.prototype.getImageState = function() {};
-
-        ol.style.Image.prototype.getImageSize = function() {};
-
-        ol.style.Image.prototype.getHitDetectionImageSize = function() {};
-
-        ol.style.Image.prototype.getOrigin = function() {};
-
-        ol.style.Image.prototype.getSize = function() {};
-
-        ol.style.Image.prototype.setOpacity = function(opacity) {
-            this.opacity_ = opacity;
-        };
-
-        ol.style.Image.prototype.setRotateWithView = function(rotateWithView) {
-            this.rotateWithView_ = rotateWithView;
-        };
-
-        ol.style.Image.prototype.setRotation = function(rotation) {
-            this.rotation_ = rotation;
-        };
-
-        ol.style.Image.prototype.setScale = function(scale) {
-            this.scale_ = scale;
-        };
-
-        ol.style.Image.prototype.setSnapToPixel = function(snapToPixel) {
-            this.snapToPixel_ = snapToPixel;
-        };
-
-        ol.style.Image.prototype.listenImageChange = function(listener, thisArg) {};
-
-        ol.style.Image.prototype.load = function() {};
-
-        ol.style.Image.prototype.unlistenImageChange = function(listener, thisArg) {};
-
-        /**
-         * @classdesc
-         * Set regular shape style for vector features. The resulting shape will be
-         * a regular polygon when `radius` is provided, or a star when `radius1` and
-         * `radius2` are provided.
-         *
-         * @constructor
-         * @param {olx.style.RegularShapeOptions} options Options.
-         * @extends {ol.style.Image}
-         * @api
-         */
-        ol.style.RegularShape = function(options) {
-            /**
-             * @private
-             * @type {Array.<string>}
-             */
-            this.checksums_ = null;
-
-            /**
-             * @private
-             * @type {HTMLCanvasElement}
-             */
-            this.canvas_ = null;
-
-            /**
-             * @private
-             * @type {HTMLCanvasElement}
-             */
-            this.hitDetectionCanvas_ = null;
-
-            /**
-             * @private
-             * @type {ol.style.Fill}
-             */
-            this.fill_ = options.fill !== undefined ? options.fill : null;
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.origin_ = [0, 0];
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.points_ = options.points;
-
-            /**
-             * @protected
-             * @type {number}
-             */
-            this.radius_ = /** @type {number} */ (options.radius !== undefined ?
-                options.radius : options.radius1);
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.radius2_ = options.radius2;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.angle_ = options.angle !== undefined ? options.angle : 0;
-
-            /**
-             * @private
-             * @type {ol.style.Stroke}
-             */
-            this.stroke_ = options.stroke !== undefined ? options.stroke : null;
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.anchor_ = null;
-
-            /**
-             * @private
-             * @type {ol.Size}
-             */
-            this.size_ = null;
-
-            /**
-             * @private
-             * @type {ol.Size}
-             */
-            this.imageSize_ = null;
-
-            /**
-             * @private
-             * @type {ol.Size}
-             */
-            this.hitDetectionImageSize_ = null;
-
-            /**
-             * @protected
-             * @type {ol.style.AtlasManager|undefined}
-             */
-            this.atlasManager_ = options.atlasManager;
-
-            this.render_(this.atlasManager_);
-
-            /**
-             * @type {boolean}
-             */
-            var snapToPixel = options.snapToPixel !== undefined ?
-                options.snapToPixel : true;
-
-            /**
-             * @type {boolean}
-             */
-            var rotateWithView = options.rotateWithView !== undefined ?
-                options.rotateWithView : false;
-
-            ol.style.Image.call(this, {
-                opacity: 1,
-                rotateWithView: rotateWithView,
-                rotation: options.rotation !== undefined ? options.rotation : 0,
-                scale: 1,
-                snapToPixel: snapToPixel
-            });
-        };
-        ol.inherits(ol.style.RegularShape, ol.style.Image);
-
-        ol.style.RegularShape.prototype.clone = function() {
-            var style = new ol.style.RegularShape({
-                fill: this.getFill() ? this.getFill().clone() : undefined,
-                points: this.getPoints(),
-                radius: this.getRadius(),
-                radius2: this.getRadius2(),
-                angle: this.getAngle(),
-                snapToPixel: this.getSnapToPixel(),
-                stroke: this.getStroke() ?  this.getStroke().clone() : undefined,
-                rotation: this.getRotation(),
-                rotateWithView: this.getRotateWithView(),
-                atlasManager: this.atlasManager_
-            });
-            style.setOpacity(this.getOpacity());
-            style.setScale(this.getScale());
-            return style;
-        };
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.style.RegularShape.prototype.getAnchor = function() {
-            return this.anchor_;
-        };
-
-
-        /**
-         * Get the angle used in generating the shape.
-         * @return {number} Shape's rotation in radians.
-         * @api
-         */
-        ol.style.RegularShape.prototype.getAngle = function() {
-            return this.angle_;
-        };
-
-        /**
-         * Get the fill style for the shape.
-         * @return {ol.style.Fill} Fill style.
-         * @api
-         */
-        ol.style.RegularShape.prototype.getFill = function() {
-            return this.fill_;
-        };
-
-        /**
-         * @inheritDoc
-         */
-        ol.style.RegularShape.prototype.getHitDetectionImage = function(pixelRatio) {
-            return this.hitDetectionCanvas_;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.style.RegularShape.prototype.getImage = function(pixelRatio) {
-            return this.canvas_;
-        };
-
-        /**
-         * @inheritDoc
-         */
-        ol.style.RegularShape.prototype.getImageSize = function() {
-            return this.imageSize_;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.style.RegularShape.prototype.getHitDetectionImageSize = function() {
-            return this.hitDetectionImageSize_;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.style.RegularShape.prototype.getImageState = function() {
-            return ol.ImageState.LOADED;
-        };
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.style.RegularShape.prototype.getOrigin = function() {
-            return this.origin_;
-        };
-
-
-        /**
-         * Get the number of points for generating the shape.
-         * @return {number} Number of points for stars and regular polygons.
-         * @api
-         */
-        ol.style.RegularShape.prototype.getPoints = function() {
-            return this.points_;
-        };
-
-
-        /**
-         * Get the (primary) radius for the shape.
-         * @return {number} Radius.
-         * @api
-         */
-        ol.style.RegularShape.prototype.getRadius = function() {
-            return this.radius_;
-        };
-
-
-        /**
-         * Get the secondary radius for the shape.
-         * @return {number|undefined} Radius2.
-         * @api
-         */
-        ol.style.RegularShape.prototype.getRadius2 = function() {
-            return this.radius2_;
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.style.RegularShape.prototype.getSize = function() {
-            return this.size_;
-        };
-
-
-        /**
-         * Get the stroke style for the shape.
-         * @return {ol.style.Stroke} Stroke style.
-         * @api
-         */
-        ol.style.RegularShape.prototype.getStroke = function() {
-            return this.stroke_;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.style.RegularShape.prototype.listenImageChange = function(listener, thisArg) {};
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.style.RegularShape.prototype.load = function() {};
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.style.RegularShape.prototype.unlistenImageChange = function(listener, thisArg) {};
-
-
-        /**
-         * @protected
-         * @param {ol.style.AtlasManager|undefined} atlasManager An atlas manager.
-         */
-        ol.style.RegularShape.prototype.render_ = function(atlasManager) {
-            var imageSize;
-            var lineCap = '';
-            var lineJoin = '';
-            var miterLimit = 0;
-            var lineDash = null;
-            var lineDashOffset = 0;
-            var strokeStyle;
-            var strokeWidth = 0;
-
-            if (this.stroke_) {
-                strokeStyle = this.stroke_.getColor();
-                if (strokeStyle === null) {
-                    strokeStyle = ol.render.canvas.defaultStrokeStyle;
-                }
-                strokeStyle = ol.colorlike.asColorLike(strokeStyle);
-                strokeWidth = this.stroke_.getWidth();
-                if (strokeWidth === undefined) {
-                    strokeWidth = ol.render.canvas.defaultLineWidth;
-                }
-                lineDash = this.stroke_.getLineDash();
-                lineDashOffset = this.stroke_.getLineDashOffset();
-                if (!ol.has.CANVAS_LINE_DASH) {
-                    lineDash = null;
-                    lineDashOffset = 0;
-                }
-                lineJoin = this.stroke_.getLineJoin();
-                if (lineJoin === undefined) {
-                    lineJoin = ol.render.canvas.defaultLineJoin;
-                }
-                lineCap = this.stroke_.getLineCap();
-                if (lineCap === undefined) {
-                    lineCap = ol.render.canvas.defaultLineCap;
-                }
-                miterLimit = this.stroke_.getMiterLimit();
-                if (miterLimit === undefined) {
-                    miterLimit = ol.render.canvas.defaultMiterLimit;
-                }
-            }
-
-            var size = 2 * (this.radius_ + strokeWidth) + 1;
-
-            /** @type {ol.RegularShapeRenderOptions} */
-            var renderOptions = {
-                strokeStyle: strokeStyle,
-                strokeWidth: strokeWidth,
-                size: size,
-                lineCap: lineCap,
-                lineDash: lineDash,
-                lineDashOffset: lineDashOffset,
-                lineJoin: lineJoin,
-                miterLimit: miterLimit
-            };
-
-            if (atlasManager === undefined) {
-                // no atlas manager is used, create a new canvas
-                var context = ol.dom.createCanvasContext2D(size, size);
-                this.canvas_ = context.canvas;
-
-                // canvas.width and height are rounded to the closest integer
-                size = this.canvas_.width;
-                imageSize = size;
-
-                this.draw_(renderOptions, context, 0, 0);
-
-                this.createHitDetectionCanvas_(renderOptions);
-            } else {
-                // an atlas manager is used, add the symbol to an atlas
-                size = Math.round(size);
-
-                var hasCustomHitDetectionImage = !this.fill_;
-                var renderHitDetectionCallback;
-                if (hasCustomHitDetectionImage) {
-                    // render the hit-detection image into a separate atlas image
-                    renderHitDetectionCallback =
-                        this.drawHitDetectionCanvas_.bind(this, renderOptions);
-                }
-
-                var id = this.getChecksum();
-                var info = atlasManager.add(
-                    id, size, size, this.draw_.bind(this, renderOptions),
-                    renderHitDetectionCallback);
-
-                this.canvas_ = info.image;
-                this.origin_ = [info.offsetX, info.offsetY];
-                imageSize = info.image.width;
-
-                if (hasCustomHitDetectionImage) {
-                    this.hitDetectionCanvas_ = info.hitImage;
-                    this.hitDetectionImageSize_ =
-                        [info.hitImage.width, info.hitImage.height];
-                } else {
-                    this.hitDetectionCanvas_ = this.canvas_;
-                    this.hitDetectionImageSize_ = [imageSize, imageSize];
-                }
-            }
-
-            this.anchor_ = [size / 2, size / 2];
-            this.size_ = [size, size];
-            this.imageSize_ = [imageSize, imageSize];
-        };
-
-
-        /**
-         * @private
-         * @param {ol.RegularShapeRenderOptions} renderOptions Render options.
-         * @param {CanvasRenderingContext2D} context The rendering context.
-         * @param {number} x The origin for the symbol (x).
-         * @param {number} y The origin for the symbol (y).
-         */
-        ol.style.RegularShape.prototype.draw_ = function(renderOptions, context, x, y) {
-            var i, angle0, radiusC;
-            // reset transform
-            context.setTransform(1, 0, 0, 1, 0, 0);
-
-            // then move to (x, y)
-            context.translate(x, y);
-
-            context.beginPath();
-
-            var points = this.points_;
-            if (points === Infinity) {
-                context.arc(
-                    renderOptions.size / 2, renderOptions.size / 2,
-                    this.radius_, 0, 2 * Math.PI, true);
-            } else {
-                var radius2 = (this.radius2_ !== undefined) ? this.radius2_
-                    : this.radius_;
-                if (radius2 !== this.radius_) {
-                    points = 2 * points;
-                }
-                for (i = 0; i <= points; i++) {
-                    angle0 = i * 2 * Math.PI / points - Math.PI / 2 + this.angle_;
-                    radiusC = i % 2 === 0 ? this.radius_ : radius2;
-                    context.lineTo(renderOptions.size / 2 + radiusC * Math.cos(angle0),
-                        renderOptions.size / 2 + radiusC * Math.sin(angle0));
-                }
-            }
-
-
-            if (this.fill_) {
-                var color = this.fill_.getColor();
-                if (color === null) {
-                    color = ol.render.canvas.defaultFillStyle;
-                }
-                context.fillStyle = ol.colorlike.asColorLike(color);
-                context.fill();
-            }
-            if (this.stroke_) {
-                context.strokeStyle = renderOptions.strokeStyle;
-                context.lineWidth = renderOptions.strokeWidth;
-                if (renderOptions.lineDash) {
-                    context.setLineDash(renderOptions.lineDash);
-                    context.lineDashOffset = renderOptions.lineDashOffset;
-                }
-                context.lineCap = renderOptions.lineCap;
-                context.lineJoin = renderOptions.lineJoin;
-                context.miterLimit = renderOptions.miterLimit;
-                context.stroke();
-            }
-            context.closePath();
-        };
-
-
-        /**
-         * @private
-         * @param {ol.RegularShapeRenderOptions} renderOptions Render options.
-         */
-        ol.style.RegularShape.prototype.createHitDetectionCanvas_ = function(renderOptions) {
-            this.hitDetectionImageSize_ = [renderOptions.size, renderOptions.size];
-            if (this.fill_) {
-                this.hitDetectionCanvas_ = this.canvas_;
-                return;
-            }
-
-            // if no fill style is set, create an extra hit-detection image with a
-            // default fill style
-            var context = ol.dom.createCanvasContext2D(renderOptions.size, renderOptions.size);
-            this.hitDetectionCanvas_ = context.canvas;
-
-            this.drawHitDetectionCanvas_(renderOptions, context, 0, 0);
-        };
-
-
-        /**
-         * @private
-         * @param {ol.RegularShapeRenderOptions} renderOptions Render options.
-         * @param {CanvasRenderingContext2D} context The context.
-         * @param {number} x The origin for the symbol (x).
-         * @param {number} y The origin for the symbol (y).
-         */
-        ol.style.RegularShape.prototype.drawHitDetectionCanvas_ = function(renderOptions, context, x, y) {
-            // reset transform
-            context.setTransform(1, 0, 0, 1, 0, 0);
-
-            // then move to (x, y)
-            context.translate(x, y);
-
-            context.beginPath();
-
-            var points = this.points_;
-            if (points === Infinity) {
-                context.arc(
-                    renderOptions.size / 2, renderOptions.size / 2,
-                    this.radius_, 0, 2 * Math.PI, true);
-            } else {
-                var radius2 = (this.radius2_ !== undefined) ? this.radius2_
-                    : this.radius_;
-                if (radius2 !== this.radius_) {
-                    points = 2 * points;
-                }
-                var i, radiusC, angle0;
-                for (i = 0; i <= points; i++) {
-                    angle0 = i * 2 * Math.PI / points - Math.PI / 2 + this.angle_;
-                    radiusC = i % 2 === 0 ? this.radius_ : radius2;
-                    context.lineTo(renderOptions.size / 2 + radiusC * Math.cos(angle0),
-                        renderOptions.size / 2 + radiusC * Math.sin(angle0));
-                }
-            }
-
-            context.fillStyle = ol.render.canvas.defaultFillStyle;
-            context.fill();
-            if (this.stroke_) {
-                context.strokeStyle = renderOptions.strokeStyle;
-                context.lineWidth = renderOptions.strokeWidth;
-                if (renderOptions.lineDash) {
-                    context.setLineDash(renderOptions.lineDash);
-                    context.lineDashOffset = renderOptions.lineDashOffset;
-                }
-                context.stroke();
-            }
-            context.closePath();
-        };
-
-
-        /**
-         * @return {string} The checksum.
-         */
-        ol.style.RegularShape.prototype.getChecksum = function() {
-            var strokeChecksum = this.stroke_ ?
-                this.stroke_.getChecksum() : '-';
-            var fillChecksum = this.fill_ ?
-                this.fill_.getChecksum() : '-';
-
-            var recalculate = !this.checksums_ ||
-                (strokeChecksum != this.checksums_[1] ||
-                    fillChecksum != this.checksums_[2] ||
-                    this.radius_ != this.checksums_[3] ||
-                    this.radius2_ != this.checksums_[4] ||
-                    this.angle_ != this.checksums_[5] ||
-                    this.points_ != this.checksums_[6]);
-
-            if (recalculate) {
-                var checksum = 'r' + strokeChecksum + fillChecksum +
-                    (this.radius_ !== undefined ? this.radius_.toString() : '-') +
-                    (this.radius2_ !== undefined ? this.radius2_.toString() : '-') +
-                    (this.angle_ !== undefined ? this.angle_.toString() : '-') +
-                    (this.points_ !== undefined ? this.points_.toString() : '-');
-                this.checksums_ = [checksum, strokeChecksum, fillChecksum,
-                    this.radius_, this.radius2_, this.angle_, this.points_];
-            }
-
-            return this.checksums_[0];
-        };
-
-        /**
-         * @classdesc
-         * Set circle style for vector features.
-         *
-         * @constructor
-         * @param {olx.style.CircleOptions=} opt_options Options.
-         * @extends {ol.style.RegularShape}
-         * @api
-         */
-        ol.style.Circle = function(opt_options) {
-
-            var options = opt_options || {};
-
-            ol.style.RegularShape.call(this, {
-                points: Infinity,
-                fill: options.fill,
-                radius: options.radius,
-                snapToPixel: options.snapToPixel,
-                stroke: options.stroke,
-                atlasManager: options.atlasManager
-            });
-
-        };
-        ol.inherits(ol.style.Circle, ol.style.RegularShape);
-
-
-        /**
-         * Clones the style.  If an atlasmanager was provided to the original style it will be used in the cloned style, too.
-         * @return {ol.style.Circle} The cloned style.
-         * @override
-         * @api
-         */
-        ol.style.Circle.prototype.clone = function() {
-            var style = new ol.style.Circle({
-                fill: this.getFill() ? this.getFill().clone() : undefined,
-                stroke: this.getStroke() ? this.getStroke().clone() : undefined,
-                radius: this.getRadius(),
-                snapToPixel: this.getSnapToPixel(),
-                atlasManager: this.atlasManager_
-            });
-            style.setOpacity(this.getOpacity());
-            style.setScale(this.getScale());
-            return style;
-        };
-
-
-        /**
-         * Set the circle radius.
-         *
-         * @param {number} radius Circle radius.
-         * @api
-         */
-        ol.style.Circle.prototype.setRadius = function(radius) {
-            this.radius_ = radius;
-            this.render_(this.atlasManager_);
-        };
-
-        /**
-         * @classdesc
-         * Set fill style for vector features.
-         *
-         * @constructor
-         * @param {olx.style.FillOptions=} opt_options Options.
-         * @api
-         */
-        ol.style.Fill = function(opt_options) {
-
-            var options = opt_options || {};
-
-            /**
-             * @private
-             * @type {ol.Color|ol.ColorLike}
-             */
-            this.color_ = options.color !== undefined ? options.color : null;
-
-            /**
-             * @private
-             * @type {string|undefined}
-             */
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * Clones the style. The color is not cloned if it is an {@link ol.ColorLike}.
-         * @return {ol.style.Fill} The cloned style.
-         * @api
-         */
-        ol.style.Fill.prototype.clone = function() {
-            var color = this.getColor();
-            return new ol.style.Fill({
-                color: (color && color.slice) ? color.slice() : color || undefined
-            });
-        };
-
-
-        /**
-         * Get the fill color.
-         * @return {ol.Color|ol.ColorLike} Color.
-         * @api
-         */
-        ol.style.Fill.prototype.getColor = function() {
-            return this.color_;
-        };
-
-
-        /**
-         * Set the color.
-         *
-         * @param {ol.Color|ol.ColorLike} color Color.
-         * @api
-         */
-        ol.style.Fill.prototype.setColor = function(color) {
-            this.color_ = color;
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * @return {string} The checksum.
-         */
-        ol.style.Fill.prototype.getChecksum = function() {
-            if (this.checksum_ === undefined) {
-                if (
-                    this.color_ instanceof CanvasPattern ||
-                        this.color_ instanceof CanvasGradient
-                    ) {
-                    this.checksum_ = ol.getUid(this.color_).toString();
-                } else {
-                    this.checksum_ = 'f' + (this.color_ ?
-                        ol.color.asString(this.color_) : '-');
-                }
-            }
-
-            return this.checksum_;
-        };
-
-        /**
-         * @classdesc
-         * Set stroke style for vector features.
-         * Note that the defaults given are the Canvas defaults, which will be used if
-         * option is not defined. The `get` functions return whatever was entered in
-         * the options; they will not return the default.
-         *
-         * @constructor
-         * @param {olx.style.StrokeOptions=} opt_options Options.
-         * @api
-         */
-        ol.style.Stroke = function(opt_options) {
-
-            var options = opt_options || {};
-
-            /**
-             * @private
-             * @type {ol.Color|ol.ColorLike}
-             */
-            this.color_ = options.color !== undefined ? options.color : null;
-
-            /**
-             * @private
-             * @type {string|undefined}
-             */
-            this.lineCap_ = options.lineCap;
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.lineDash_ = options.lineDash !== undefined ? options.lineDash : null;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.lineDashOffset_ = options.lineDashOffset;
-
-            /**
-             * @private
-             * @type {string|undefined}
-             */
-            this.lineJoin_ = options.lineJoin;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.miterLimit_ = options.miterLimit;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.width_ = options.width;
-
-            /**
-             * @private
-             * @type {string|undefined}
-             */
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * Clones the style.
-         * @return {ol.style.Stroke} The cloned style.
-         * @api
-         */
-        ol.style.Stroke.prototype.clone = function() {
-            var color = this.getColor();
-            return new ol.style.Stroke({
-                color: (color && color.slice) ? color.slice() : color || undefined,
-                lineCap: this.getLineCap(),
-                lineDash: this.getLineDash() ? this.getLineDash().slice() : undefined,
-                lineDashOffset: this.getLineDashOffset(),
-                lineJoin: this.getLineJoin(),
-                miterLimit: this.getMiterLimit(),
-                width: this.getWidth()
-            });
-        };
-
-
-        /**
-         * Get the stroke color.
-         * @return {ol.Color|ol.ColorLike} Color.
-         * @api
-         */
-        ol.style.Stroke.prototype.getColor = function() {
-            return this.color_;
-        };
-
-
-        /**
-         * Get the line cap type for the stroke.
-         * @return {string|undefined} Line cap.
-         * @api
-         */
-        ol.style.Stroke.prototype.getLineCap = function() {
-            return this.lineCap_;
-        };
-
-
-        /**
-         * Get the line dash style for the stroke.
-         * @return {Array.<number>} Line dash.
-         * @api
-         */
-        ol.style.Stroke.prototype.getLineDash = function() {
-            return this.lineDash_;
-        };
-
-
-        /**
-         * Get the line dash offset for the stroke.
-         * @return {number|undefined} Line dash offset.
-         * @api
-         */
-        ol.style.Stroke.prototype.getLineDashOffset = function() {
-            return this.lineDashOffset_;
-        };
-
-
-        /**
-         * Get the line join type for the stroke.
-         * @return {string|undefined} Line join.
-         * @api
-         */
-        ol.style.Stroke.prototype.getLineJoin = function() {
-            return this.lineJoin_;
-        };
-
-
-        /**
-         * Get the miter limit for the stroke.
-         * @return {number|undefined} Miter limit.
-         * @api
-         */
-        ol.style.Stroke.prototype.getMiterLimit = function() {
-            return this.miterLimit_;
-        };
-
-
-        /**
-         * Get the stroke width.
-         * @return {number|undefined} Width.
-         * @api
-         */
-        ol.style.Stroke.prototype.getWidth = function() {
-            return this.width_;
-        };
-
-
-        /**
-         * Set the color.
-         *
-         * @param {ol.Color|ol.ColorLike} color Color.
-         * @api
-         */
-        ol.style.Stroke.prototype.setColor = function(color) {
-            this.color_ = color;
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * Set the line cap.
-         *
-         * @param {string|undefined} lineCap Line cap.
-         * @api
-         */
-        ol.style.Stroke.prototype.setLineCap = function(lineCap) {
-            this.lineCap_ = lineCap;
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * Set the line dash.
-         *
-         * Please note that Internet Explorer 10 and lower [do not support][mdn] the
-         * `setLineDash` method on the `CanvasRenderingContext2D` and therefore this
-         * property will have no visual effect in these browsers.
-         *
-         * [mdn]: https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility
-         *
-         * @param {Array.<number>} lineDash Line dash.
-         * @api
-         */
-        ol.style.Stroke.prototype.setLineDash = function(lineDash) {
-            this.lineDash_ = lineDash;
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * Set the line dash offset.
-         *
-         * @param {number|undefined} lineDashOffset Line dash offset.
-         * @api
-         */
-        ol.style.Stroke.prototype.setLineDashOffset = function(lineDashOffset) {
-            this.lineDashOffset_ = lineDashOffset;
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * Set the line join.
-         *
-         * @param {string|undefined} lineJoin Line join.
-         * @api
-         */
-        ol.style.Stroke.prototype.setLineJoin = function(lineJoin) {
-            this.lineJoin_ = lineJoin;
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * Set the miter limit.
-         *
-         * @param {number|undefined} miterLimit Miter limit.
-         * @api
-         */
-        ol.style.Stroke.prototype.setMiterLimit = function(miterLimit) {
-            this.miterLimit_ = miterLimit;
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * Set the width.
-         *
-         * @param {number|undefined} width Width.
-         * @api
-         */
-        ol.style.Stroke.prototype.setWidth = function(width) {
-            this.width_ = width;
-            this.checksum_ = undefined;
-        };
-
-
-        /**
-         * @return {string} The checksum.
-         */
-        ol.style.Stroke.prototype.getChecksum = function() {
-            if (this.checksum_ === undefined) {
-                this.checksum_ = 's';
-                if (this.color_) {
-                    if (typeof this.color_ === 'string') {
-                        this.checksum_ += this.color_;
-                    } else {
-                        this.checksum_ += ol.getUid(this.color_).toString();
-                    }
-                } else {
-                    this.checksum_ += '-';
-                }
-                this.checksum_ += ',' +
-                    (this.lineCap_ !== undefined ?
-                        this.lineCap_.toString() : '-') + ',' +
-                    (this.lineDash_ ?
-                        this.lineDash_.toString() : '-') + ',' +
-                    (this.lineDashOffset_ !== undefined ?
-                        this.lineDashOffset_ : '-') + ',' +
-                    (this.lineJoin_ !== undefined ?
-                        this.lineJoin_ : '-') + ',' +
-                    (this.miterLimit_ !== undefined ?
-                        this.miterLimit_.toString() : '-') + ',' +
-                    (this.width_ !== undefined ?
-                        this.width_.toString() : '-');
-            }
-
-            return this.checksum_;
-        };
-
-        /**
-         * Icon anchor units. One of 'fraction', 'pixels'.
-         * @enum {string}
-         */
-        ol.style.IconAnchorUnits = {
-            FRACTION: 'fraction',
-            PIXELS: 'pixels'
-        };
-
-        /**
-         * @constructor
-         * @param {Image|HTMLCanvasElement} image Image.
-         * @param {string|undefined} src Src.
-         * @param {ol.Size} size Size.
-         * @param {?string} crossOrigin Cross origin.
-         * @param {ol.ImageState} imageState Image state.
-         * @param {ol.Color} color Color.
-         * @extends {ol.events.EventTarget}
-         */
-        ol.style.IconImage = function(image, src, size, crossOrigin, imageState,
-                                      color) {
-
-            ol.events.EventTarget.call(this);
-
-            /**
-             * @private
-             * @type {Image|HTMLCanvasElement}
-             */
-            this.hitDetectionImage_ = null;
-
-            /**
-             * @private
-             * @type {Image|HTMLCanvasElement}
-             */
-            this.image_ = !image ? new Image() : image;
-
-            if (crossOrigin !== null) {
-                this.image_.crossOrigin = crossOrigin;
-            }
-
-            /**
-             * @private
-             * @type {HTMLCanvasElement}
-             */
-            this.canvas_ = color ?
-            /** @type {HTMLCanvasElement} */ (document.createElement('CANVAS')) :
-                null;
-
-            /**
-             * @private
-             * @type {ol.Color}
-             */
-            this.color_ = color;
-
-            /**
-             * @private
-             * @type {Array.<ol.EventsKey>}
-             */
-            this.imageListenerKeys_ = null;
-
-            /**
-             * @private
-             * @type {ol.ImageState}
-             */
-            this.imageState_ = imageState;
-
-            /**
-             * @private
-             * @type {ol.Size}
-             */
-            this.size_ = size;
-
-            /**
-             * @private
-             * @type {string|undefined}
-             */
-            this.src_ = src;
-
-            /**
-             * @private
-             * @type {boolean}
-             */
-            this.tainting_ = false;
-            if (this.imageState_ == ol.ImageState.LOADED) {
-                this.determineTainting_();
-            }
-
-        };
-        ol.inherits(ol.style.IconImage, ol.events.EventTarget);
-
-
-        /**
-         * @param {Image|HTMLCanvasElement} image Image.
-         * @param {string} src Src.
-         * @param {ol.Size} size Size.
-         * @param {?string} crossOrigin Cross origin.
-         * @param {ol.ImageState} imageState Image state.
-         * @param {ol.Color} color Color.
-         * @return {ol.style.IconImage} Icon image.
-         */
-        ol.style.IconImage.get = function(image, src, size, crossOrigin, imageState,
-                                          color) {
-            var iconImageCache = ol.style.iconImageCache;
-            var iconImage = iconImageCache.get(src, crossOrigin, color);
-            if (!iconImage) {
-                iconImage = new ol.style.IconImage(
-                    image, src, size, crossOrigin, imageState, color);
-                iconImageCache.set(src, crossOrigin, color, iconImage);
-            }
-            return iconImage;
-        };
-
-
-        /**
-         * @private
-         */
-        ol.style.IconImage.prototype.determineTainting_ = function() {
-            var context = ol.dom.createCanvasContext2D(1, 1);
-            try {
-                context.drawImage(this.image_, 0, 0);
-                context.getImageData(0, 0, 1, 1);
-            } catch (e) {
-                this.tainting_ = true;
-            }
-        };
-
-
-        /**
-         * @private
-         */
-        ol.style.IconImage.prototype.dispatchChangeEvent_ = function() {
-            this.dispatchEvent(ol.events.EventType.CHANGE);
-        };
-
-
-        /**
-         * @private
-         */
-        ol.style.IconImage.prototype.handleImageError_ = function() {
-            this.imageState_ = ol.ImageState.ERROR;
-            this.unlistenImage_();
-            this.dispatchChangeEvent_();
-        };
-
-
-        /**
-         * @private
-         */
-        ol.style.IconImage.prototype.handleImageLoad_ = function() {
-            this.imageState_ = ol.ImageState.LOADED;
-            if (this.size_) {
-                this.image_.width = this.size_[0];
-                this.image_.height = this.size_[1];
-            }
-            this.size_ = [this.image_.width, this.image_.height];
-            this.unlistenImage_();
-            this.determineTainting_();
-            this.replaceColor_();
-            this.dispatchChangeEvent_();
-        };
-
-
-        /**
-         * @param {number} pixelRatio Pixel ratio.
-         * @return {Image|HTMLCanvasElement} Image or Canvas element.
-         */
-        ol.style.IconImage.prototype.getImage = function(pixelRatio) {
-            return this.canvas_ ? this.canvas_ : this.image_;
-        };
-
-
-        /**
-         * @return {ol.ImageState} Image state.
-         */
-        ol.style.IconImage.prototype.getImageState = function() {
-            return this.imageState_;
-        };
-
-
-        /**
-         * @param {number} pixelRatio Pixel ratio.
-         * @return {Image|HTMLCanvasElement} Image element.
-         */
-        ol.style.IconImage.prototype.getHitDetectionImage = function(pixelRatio) {
-            if (!this.hitDetectionImage_) {
-                if (this.tainting_) {
-                    var width = this.size_[0];
-                    var height = this.size_[1];
-                    var context = ol.dom.createCanvasContext2D(width, height);
-                    context.fillRect(0, 0, width, height);
-                    this.hitDetectionImage_ = context.canvas;
-                } else {
-                    this.hitDetectionImage_ = this.image_;
-                }
-            }
-            return this.hitDetectionImage_;
-        };
-
-
-        /**
-         * @return {ol.Size} Image size.
-         */
-        ol.style.IconImage.prototype.getSize = function() {
-            return this.size_;
-        };
-
-
-        /**
-         * @return {string|undefined} Image src.
-         */
-        ol.style.IconImage.prototype.getSrc = function() {
-            return this.src_;
-        };
-
-
-        /**
-         * Load not yet loaded URI.
-         */
-        ol.style.IconImage.prototype.load = function() {
-            if (this.imageState_ == ol.ImageState.IDLE) {
-                this.imageState_ = ol.ImageState.LOADING;
-                this.imageListenerKeys_ = [
-                    ol.events.listenOnce(this.image_, ol.events.EventType.ERROR,
-                        this.handleImageError_, this),
-                    ol.events.listenOnce(this.image_, ol.events.EventType.LOAD,
-                        this.handleImageLoad_, this)
-                ];
-                try {
-                    this.image_.src = this.src_;
-                } catch (e) {
-                    this.handleImageError_();
-                }
-            }
-        };
-
-
-        /**
-         * @private
-         */
-        ol.style.IconImage.prototype.replaceColor_ = function() {
-            if (this.tainting_ || this.color_ === null) {
-                return;
-            }
-
-            this.canvas_.width = this.image_.width;
-            this.canvas_.height = this.image_.height;
-
-            var ctx = this.canvas_.getContext('2d');
-            ctx.drawImage(this.image_, 0, 0);
-
-            var imgData = ctx.getImageData(0, 0, this.image_.width, this.image_.height);
-            var data = imgData.data;
-            var r = this.color_[0] / 255.0;
-            var g = this.color_[1] / 255.0;
-            var b = this.color_[2] / 255.0;
-
-            for (var i = 0, ii = data.length; i < ii; i += 4) {
-                data[i] *= r;
-                data[i + 1] *= g;
-                data[i + 2] *= b;
-            }
-            ctx.putImageData(imgData, 0, 0);
-        };
-
-
-        /**
-         * Discards event handlers which listen for load completion or errors.
-         *
-         * @private
-         */
-        ol.style.IconImage.prototype.unlistenImage_ = function() {
-            this.imageListenerKeys_.forEach(ol.events.unlistenByKey);
-            this.imageListenerKeys_ = null;
-        };
-
-        /**
-         * Icon origin. One of 'bottom-left', 'bottom-right', 'top-left', 'top-right'.
-         * @enum {string}
-         */
-        ol.style.IconOrigin = {
-            BOTTOM_LEFT: 'bottom-left',
-            BOTTOM_RIGHT: 'bottom-right',
-            TOP_LEFT: 'top-left',
-            TOP_RIGHT: 'top-right'
-        };
-
-        /**
-         * @classdesc
-         * Set icon style for vector features.
-         *
-         * @constructor
-         * @param {olx.style.IconOptions=} opt_options Options.
-         * @extends {ol.style.Image}
-         * @api
-         */
-        ol.style.Icon = function(opt_options) {
-
-            var options = opt_options || {};
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.anchor_ = options.anchor !== undefined ? options.anchor : [0.5, 0.5];
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.normalizedAnchor_ = null;
-
-            /**
-             * @private
-             * @type {ol.style.IconOrigin}
-             */
-            this.anchorOrigin_ = options.anchorOrigin !== undefined ?
-                options.anchorOrigin : ol.style.IconOrigin.TOP_LEFT;
-
-            /**
-             * @private
-             * @type {ol.style.IconAnchorUnits}
-             */
-            this.anchorXUnits_ = options.anchorXUnits !== undefined ?
-                options.anchorXUnits : ol.style.IconAnchorUnits.FRACTION;
-
-            /**
-             * @private
-             * @type {ol.style.IconAnchorUnits}
-             */
-            this.anchorYUnits_ = options.anchorYUnits !== undefined ?
-                options.anchorYUnits : ol.style.IconAnchorUnits.FRACTION;
-
-            /**
-             * @private
-             * @type {?string}
-             */
-            this.crossOrigin_ =
-                options.crossOrigin !== undefined ? options.crossOrigin : null;
-
-            /**
-             * @type {Image|HTMLCanvasElement}
-             */
-            var image = options.img !== undefined ? options.img : null;
-
-            /**
-             * @type {ol.Size}
-             */
-            var imgSize = options.imgSize !== undefined ? options.imgSize : null;
-
-            /**
-             * @type {string|undefined}
-             */
-            var src = options.src;
-
-    //        ol.asserts.assert(!(src !== undefined && image),
-    //            4); // `image` and `src` cannot be provided at the same time
-    //        ol.asserts.assert(!image || (image && imgSize),
-    //            5); // `imgSize` must be set when `image` is provided
-
-            if ((src === undefined || src.length === 0) && image) {
-                src = image.src || ol.getUid(image).toString();
-            }
-    //        ol.asserts.assert(src !== undefined && src.length > 0,
-    //            6); // A defined and non-empty `src` or `image` must be provided
-
-            /**
-             * @type {ol.ImageState}
-             */
-            var imageState = options.src !== undefined ?
-                ol.ImageState.IDLE : ol.ImageState.LOADED;
-
-            /**
-             * @private
-             * @type {ol.Color}
-             */
-            this.color_ = options.color !== undefined ? ol.color.asArray(options.color) :
-                null;
-
-            /**
-             * @private
-             * @type {ol.style.IconImage}
-             */
-            this.iconImage_ = ol.style.IconImage.get(
-                image, /** @type {string} */ (src), imgSize, this.crossOrigin_, imageState, this.color_);
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.offset_ = options.offset !== undefined ? options.offset : [0, 0];
-
-            /**
-             * @private
-             * @type {ol.style.IconOrigin}
-             */
-            this.offsetOrigin_ = options.offsetOrigin !== undefined ?
-                options.offsetOrigin : ol.style.IconOrigin.TOP_LEFT;
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.origin_ = null;
-
-            /**
-             * @private
-             * @type {ol.Size}
-             */
-            this.size_ = options.size !== undefined ? options.size : null;
-
-            /**
-             * @type {number}
-             */
-            var opacity = options.opacity !== undefined ? options.opacity : 1;
-
-            /**
-             * @type {boolean}
-             */
-            var rotateWithView = options.rotateWithView !== undefined ?
-                options.rotateWithView : false;
-
-            /**
-             * @type {number}
-             */
-            var rotation = options.rotation !== undefined ? options.rotation : 0;
-
-            /**
-             * @type {number}
-             */
-            var scale = options.scale !== undefined ? options.scale : 1;
-
-            /**
-             * @type {boolean}
-             */
-            var snapToPixel = options.snapToPixel !== undefined ?
-                options.snapToPixel : true;
-
-            ol.style.Image.call(this, {
-                opacity: opacity,
-                rotation: rotation,
-                scale: scale,
-                snapToPixel: snapToPixel,
-                rotateWithView: rotateWithView
-            });
-
-        };
-        ol.inherits(ol.style.Icon, ol.style.Image);
-
-
-        /**
-         * Clones the style. The underlying Image/HTMLCanvasElement is not cloned.
-         * @return {ol.style.Icon} The cloned style.
-         * @api
-         */
-        ol.style.Icon.prototype.clone = function() {
-            return new ol.style.Icon({
-                anchor: this.anchor_.slice(),
-                anchorOrigin: this.anchorOrigin_,
-                anchorXUnits: this.anchorXUnits_,
-                anchorYUnits: this.anchorYUnits_,
-                crossOrigin: this.crossOrigin_,
-                color: (this.color_ && this.color_.slice) ? this.color_.slice() : this.color_ || undefined,
-                src: this.getSrc(),
-                offset: this.offset_.slice(),
-                offsetOrigin: this.offsetOrigin_,
-                size: this.size_ !== null ? this.size_.slice() : undefined,
-                opacity: this.getOpacity(),
-                scale: this.getScale(),
-                snapToPixel: this.getSnapToPixel(),
-                rotation: this.getRotation(),
-                rotateWithView: this.getRotateWithView()
-            });
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.style.Icon.prototype.getAnchor = function() {
-            if (this.normalizedAnchor_) {
-                return this.normalizedAnchor_;
-            }
-            var anchor = this.anchor_;
-            var size = this.getSize();
-            if (this.anchorXUnits_ == ol.style.IconAnchorUnits.FRACTION ||
-                this.anchorYUnits_ == ol.style.IconAnchorUnits.FRACTION) {
-                if (!size) {
-                    return null;
-                }
-                anchor = this.anchor_.slice();
-                if (this.anchorXUnits_ == ol.style.IconAnchorUnits.FRACTION) {
-                    anchor[0] *= size[0];
-                }
-                if (this.anchorYUnits_ == ol.style.IconAnchorUnits.FRACTION) {
-                    anchor[1] *= size[1];
-                }
-            }
-
-            if (this.anchorOrigin_ != ol.style.IconOrigin.TOP_LEFT) {
-                if (!size) {
-                    return null;
-                }
-                if (anchor === this.anchor_) {
-                    anchor = this.anchor_.slice();
-                }
-                if (this.anchorOrigin_ == ol.style.IconOrigin.TOP_RIGHT ||
-                    this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
-                    anchor[0] = -anchor[0] + size[0];
-                }
-                if (this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_LEFT ||
-                    this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
-                    anchor[1] = -anchor[1] + size[1];
-                }
-            }
-            this.normalizedAnchor_ = anchor;
-            return this.normalizedAnchor_;
-        };
-
-
-        /**
-         * Get the icon color.
-         * @return {ol.Color} Color.
-         * @api
-         */
-        ol.style.Icon.prototype.getColor = function() {
-            return this.color_;
-        };
-
-
-        /**
-         * Get the image icon.
-         * @param {number} pixelRatio Pixel ratio.
-         * @return {Image|HTMLCanvasElement} Image or Canvas element.
-         * @override
-         * @api
-         */
-        ol.style.Icon.prototype.getImage = function(pixelRatio) {
-            return this.iconImage_.getImage(pixelRatio);
-        };
-
-
-        /**
-         * @override
-         */
-        ol.style.Icon.prototype.getImageSize = function() {
-            return this.iconImage_.getSize();
-        };
-
-
-        /**
-         * @override
-         */
-        ol.style.Icon.prototype.getHitDetectionImageSize = function() {
-            return this.getImageSize();
-        };
-
-
-        /**
-         * @override
-         */
-        ol.style.Icon.prototype.getImageState = function() {
-            return this.iconImage_.getImageState();
-        };
-
-
-        /**
-         * @override
-         */
-        ol.style.Icon.prototype.getHitDetectionImage = function(pixelRatio) {
-            return this.iconImage_.getHitDetectionImage(pixelRatio);
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.style.Icon.prototype.getOrigin = function() {
-            if (this.origin_) {
-                return this.origin_;
-            }
-            var offset = this.offset_;
-
-            if (this.offsetOrigin_ != ol.style.IconOrigin.TOP_LEFT) {
-                var size = this.getSize();
-                var iconImageSize = this.iconImage_.getSize();
-                if (!size || !iconImageSize) {
-                    return null;
-                }
-                offset = offset.slice();
-                if (this.offsetOrigin_ == ol.style.IconOrigin.TOP_RIGHT ||
-                    this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
-                    offset[0] = iconImageSize[0] - size[0] - offset[0];
-                }
-                if (this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_LEFT ||
-                    this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
-                    offset[1] = iconImageSize[1] - size[1] - offset[1];
-                }
-            }
-            this.origin_ = offset;
-            return this.origin_;
-        };
-
-
-        /**
-         * Get the image URL.
-         * @return {string|undefined} Image src.
-         * @api
-         */
-        ol.style.Icon.prototype.getSrc = function() {
-            return this.iconImage_.getSrc();
-        };
-
-
-        /**
-         * @inheritDoc
-         * @api
-         */
-        ol.style.Icon.prototype.getSize = function() {
-            return !this.size_ ? this.iconImage_.getSize() : this.size_;
-        };
-
-
-        /**
-         * @override
-         */
-        ol.style.Icon.prototype.listenImageChange = function(listener, thisArg) {
-            return ol.events.listen(this.iconImage_, ol.events.EventType.CHANGE,
-                listener, thisArg);
-        };
-
-
-        /**
-         * Load not yet loaded URI.
-         * When rendering a feature with an icon style, the vector renderer will
-         * automatically call this method. However, you might want to call this
-         * method yourself for preloading or other purposes.
-         * @override
-         * @api
-         */
-        ol.style.Icon.prototype.load = function() {
-            this.iconImage_.load();
-        };
-
-
-        /**
-         * @override
-         */
-        ol.style.Icon.prototype.unlistenImageChange = function(listener, thisArg) {
-            ol.events.unlisten(this.iconImage_, ol.events.EventType.CHANGE,
-                listener, thisArg);
-        };
-
-        ol.style.Text = function(opt_options) {
-            var options = opt_options || {};
-            this.font_ = options.font;
-            this.rotation_ = options.rotation;
-            this.rotateWithView_ = options.rotateWithView;
-            this.scale_ = options.scale;
-            this.text_ = options.text;
-            this.textAlign_ = options.textAlign;
-            this.textBaseline_ = options.textBaseline;
-            this.fill_ = options.fill !== undefined ? options.fill :
-                new ol.style.Fill({color: ol.style.Text.DEFAULT_FILL_COLOR_});
-            this.maxAngle_ = options.maxAngle !== undefined ? options.maxAngle : Math.PI / 4;
-            this.placement_ = options.placement !== undefined ? options.placement : ol.style.TextPlacement.POINT;
-
-            //TODO Use options.overflow directly after removing @deprecated exceedLength
-            var overflow = options.overflow === undefined ? options.exceedLength : options.overflow;
-
-            this.overflow_ = overflow !== undefined ? overflow : false;
-            this.stroke_ = options.stroke !== undefined ? options.stroke : null;
-            this.offsetX_ = options.offsetX !== undefined ? options.offsetX : 0;
-            this.offsetY_ = options.offsetY !== undefined ? options.offsetY : 0;
-            this.backgroundFill_ = options.backgroundFill ? options.backgroundFill : null;
-            this.backgroundStroke_ = options.backgroundStroke ? options.backgroundStroke : null;
-            this.padding_ = options.padding === undefined ? null : options.padding;
-        };
-
-        ol.style.Text.DEFAULT_FILL_COLOR_ = '#333';
-        ol.style.Text.prototype.clone = function() {
-            return new ol.style.Text({
-                font: this.getFont(),
-                placement: this.getPlacement(),
-                maxAngle: this.getMaxAngle(),
-                overflow: this.getOverflow(),
-                rotation: this.getRotation(),
-                rotateWithView: this.getRotateWithView(),
-                scale: this.getScale(),
-                text: this.getText(),
-                textAlign: this.getTextAlign(),
-                textBaseline: this.getTextBaseline(),
-                fill: this.getFill() ? this.getFill().clone() : undefined,
-                stroke: this.getStroke() ? this.getStroke().clone() : undefined,
-                offsetX: this.getOffsetX(),
-                offsetY: this.getOffsetY()
-            });
-        };
-
-        ol.style.Text.prototype.getOverflow = function() {
-            return this.overflow_;
-        };
-
-        ol.style.Text.prototype.getFont = function() {
-            return this.font_;
-        };
-
-        ol.style.Text.prototype.getMaxAngle = function() {
-            return this.maxAngle_;
-        };
-
-        ol.style.Text.prototype.getPlacement = function() {
-            return this.placement_;
-        };
-
-        ol.style.Text.prototype.getOffsetX = function() {
-            return this.offsetX_;
-        };
-
-        ol.style.Text.prototype.getOffsetY = function() {
-            return this.offsetY_;
-        };
-
-        ol.style.Text.prototype.getFill = function() {
-            return this.fill_;
-        };
-
-        ol.style.Text.prototype.getRotateWithView = function() {
-            return this.rotateWithView_;
-        };
-
-        ol.style.Text.prototype.getRotation = function() {
-            return this.rotation_;
-        };
-
-        ol.style.Text.prototype.getScale = function() {
-            return this.scale_;
-        };
-
-        ol.style.Text.prototype.getStroke = function() {
-            return this.stroke_;
-        };
-
-        ol.style.Text.prototype.getText = function() {
-            return this.text_;
-        };
-
-        ol.style.Text.prototype.getTextAlign = function() {
-            return this.textAlign_;
-        };
-
-        ol.style.Text.prototype.getTextBaseline = function() {
-            return this.textBaseline_;
-        };
-
-        ol.style.Text.prototype.getBackgroundFill = function() {
-            return this.backgroundFill_;
-        };
-
-        ol.style.Text.prototype.getBackgroundStroke = function() {
-            return this.backgroundStroke_;
-        };
-
-        ol.style.Text.prototype.getPadding = function() {
-            return this.padding_;
-        };
-
-        ol.style.Text.prototype.setOverflow = function(overflow) {
-            this.overflow_ = overflow;
-        };
-
-        ol.style.Text.prototype.setFont = function(font) {
-            this.font_ = font;
-        };
-
-        ol.style.Text.prototype.setMaxAngle = function(maxAngle) {
-            this.maxAngle_ = maxAngle;
-        };
-
-        ol.style.Text.prototype.setOffsetX = function(offsetX) {
-            this.offsetX_ = offsetX;
-        };
-
-        ol.style.Text.prototype.setOffsetY = function(offsetY) {
-            this.offsetY_ = offsetY;
-        };
-
-        ol.style.Text.prototype.setPlacement = function(placement) {
-            this.placement_ = placement;
-        };
-
-        ol.style.Text.prototype.setFill = function(fill) {
-            this.fill_ = fill;
-        };
-
-        ol.style.Text.prototype.setRotation = function(rotation) {
-            this.rotation_ = rotation;
-        };
-
-        ol.style.Text.prototype.setScale = function(scale) {
-            this.scale_ = scale;
-        };
-
-        ol.style.Text.prototype.setStroke = function(stroke) {
-            this.stroke_ = stroke;
-        };
-
-        ol.style.Text.prototype.setText = function(text) {
-            this.text_ = text;
-        };
-
-        ol.style.Text.prototype.setTextAlign = function(textAlign) {
-            this.textAlign_ = textAlign;
-        };
-
-        ol.style.Text.prototype.setTextBaseline = function(textBaseline) {
-            this.textBaseline_ = textBaseline;
-        };
-
-        ol.style.Text.prototype.setBackgroundFill = function(fill) {
-            this.backgroundFill_ = fill;
-        };
-
-        ol.style.Text.prototype.setBackgroundStroke = function(stroke) {
-            this.backgroundStroke_ = stroke;
-        };
-
-        ol.style.Text.prototype.setPadding = function(padding) {
-            this.padding_ = padding;
-        };
-
-        ol.style.Style = function(opt_options) {
-
-            var options = opt_options || {};
-
-            /**
-             * @private
-             * @type {string|ol.geom.Geometry|ol.StyleGeometryFunction}
-             */
-            this.geometry_ = null;
-
-            /**
-             * @private
-             * @type {!ol.StyleGeometryFunction}
-             */
-            this.geometryFunction_ = ol.style.Style.defaultGeometryFunction;
-
-            if (options.geometry !== undefined) {
-                this.setGeometry(options.geometry);
-            }
-
-            /**
-             * @private
-             * @type {ol.style.Fill}
-             */
-            this.fill_ = options.fill !== undefined ? options.fill : null;
-
-            /**
-             * @private
-             * @type {ol.style.Image}
-             */
-            this.image_ = options.image !== undefined ? options.image : null;
-
-            /**
-             * @private
-             * @type {ol.StyleRenderFunction|null}
-             */
-            this.renderer_ = options.renderer !== undefined ? options.renderer : null;
-
-            /**
-             * @private
-             * @type {ol.style.Stroke}
-             */
-            this.stroke_ = options.stroke !== undefined ? options.stroke : null;
-
-            /**
-             * @private
-             * @type {ol.style.Text}
-             */
-            this.text_ = options.text !== undefined ? options.text : null;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.zIndex_ = options.zIndex;
-
-        };
-
-
-        /**
-         * Clones the style.
-         * @return {ol.style.Style} The cloned style.
-         * @api
-         */
-        ol.style.Style.prototype.clone = function() {
-            var geometry = this.getGeometry();
-            if (geometry && geometry.clone) {
-                geometry = geometry.clone();
-            }
-            return new ol.style.Style({
-                geometry: geometry,
-                fill: this.getFill() ? this.getFill().clone() : undefined,
-                image: this.getImage() ? this.getImage().clone() : undefined,
-                stroke: this.getStroke() ? this.getStroke().clone() : undefined,
-                text: this.getText() ? this.getText().clone() : undefined,
-                zIndex: this.getZIndex()
-            });
-        };
-
-
-        /**
-         * Get the custom renderer function that was configured with
-         * {@link #setRenderer} or the `renderer` constructor option.
-         * @return {ol.StyleRenderFunction|null} Custom renderer function.
-         * @api
-         */
-        ol.style.Style.prototype.getRenderer = function() {
-            return this.renderer_;
-        };
-
-
-        /**
-         * Sets a custom renderer function for this style. When set, `fill`, `stroke`
-         * and `image` options of the style will be ignored.
-         * @param {ol.StyleRenderFunction|null} renderer Custom renderer function.
-         * @api
-         */
-        ol.style.Style.prototype.setRenderer = function(renderer) {
-            this.renderer_ = renderer;
-        };
-
-
-        /**
-         * Get the geometry to be rendered.
-         * @return {string|ol.geom.Geometry|ol.StyleGeometryFunction}
-         * Feature property or geometry or function that returns the geometry that will
-         * be rendered with this style.
-         * @api
-         */
-        ol.style.Style.prototype.getGeometry = function() {
-            return this.geometry_;
-        };
-
-
-        /**
-         * Get the function used to generate a geometry for rendering.
-         * @return {!ol.StyleGeometryFunction} Function that is called with a feature
-         * and returns the geometry to render instead of the feature's geometry.
-         * @api
-         */
-        ol.style.Style.prototype.getGeometryFunction = function() {
-            return this.geometryFunction_;
-        };
-
-
-        /**
-         * Get the fill style.
-         * @return {ol.style.Fill} Fill style.
-         * @api
-         */
-        ol.style.Style.prototype.getFill = function() {
-            return this.fill_;
-        };
-
-
-        /**
-         * Set the fill style.
-         * @param {ol.style.Fill} fill Fill style.
-         * @api
-         */
-        ol.style.Style.prototype.setFill = function(fill) {
-            this.fill_ = fill;
-        };
-
-
-        /**
-         * Get the image style.
-         * @return {ol.style.Image} Image style.
-         * @api
-         */
-        ol.style.Style.prototype.getImage = function() {
-            return this.image_;
-        };
-
-
-        /**
-         * Set the image style.
-         * @param {ol.style.Image} image Image style.
-         * @api
-         */
-        ol.style.Style.prototype.setImage = function(image) {
-            this.image_ = image;
-        };
-
-
-        /**
-         * Get the stroke style.
-         * @return {ol.style.Stroke} Stroke style.
-         * @api
-         */
-        ol.style.Style.prototype.getStroke = function() {
-            return this.stroke_;
-        };
-
-
-        /**
-         * Set the stroke style.
-         * @param {ol.style.Stroke} stroke Stroke style.
-         * @api
-         */
-        ol.style.Style.prototype.setStroke = function(stroke) {
-            this.stroke_ = stroke;
-        };
-
-
-        /**
-         * Get the text style.
-         * @return {ol.style.Text} Text style.
-         * @api
-         */
-        ol.style.Style.prototype.getText = function() {
-            return this.text_;
-        };
-
-
-        /**
-         * Set the text style.
-         * @param {ol.style.Text} text Text style.
-         * @api
-         */
-        ol.style.Style.prototype.setText = function(text) {
-            this.text_ = text;
-        };
-
-
-        /**
-         * Get the z-index for the style.
-         * @return {number|undefined} ZIndex.
-         * @api
-         */
-        ol.style.Style.prototype.getZIndex = function() {
-            return this.zIndex_;
-        };
-
-
-        /**
-         * Set a geometry that is rendered instead of the feature's geometry.
-         *
-         * @param {string|ol.geom.Geometry|ol.StyleGeometryFunction} geometry
-         *     Feature property or geometry or function returning a geometry to render
-         *     for this style.
-         * @api
-         */
-        ol.style.Style.prototype.setGeometry = function(geometry) {
-            if (typeof geometry === 'function') {
-                this.geometryFunction_ = geometry;
-            } else if (typeof geometry === 'string') {
-                this.geometryFunction_ = function(feature) {
-                    return /** @type {ol.geom.Geometry} */ (feature.get(geometry));
-                };
-            } else if (!geometry) {
-                this.geometryFunction_ = ol.style.Style.defaultGeometryFunction;
-            } else if (geometry !== undefined) {
-                this.geometryFunction_ = function() {
-                    return /** @type {ol.geom.Geometry} */ (geometry);
-                };
-            }
-            this.geometry_ = geometry;
-        };
-
-
-        /**
-         * Set the z-index.
-         *
-         * @param {number|undefined} zIndex ZIndex.
-         * @api
-         */
-        ol.style.Style.prototype.setZIndex = function(zIndex) {
-            this.zIndex_ = zIndex;
-        };
-
-
-        /**
-         * Convert the provided object into a style function.  Functions passed through
-         * unchanged.  Arrays of ol.style.Style or single style objects wrapped in a
-         * new style function.
-         * @param {ol.StyleFunction|Array.<ol.style.Style>|ol.style.Style} obj
-         *     A style function, a single style, or an array of styles.
-         * @return {ol.StyleFunction} A style function.
-         */
-        ol.style.Style.createFunction = function(obj) {
-            var styleFunction;
-
-            if (typeof obj === 'function') {
-                styleFunction = obj;
-            } else {
-                /**
-                 * @type {Array.<ol.style.Style>}
-                 */
-                var styles;
-                if (Array.isArray(obj)) {
-                    styles = obj;
-                } else {
-                    ol.asserts.assert(obj instanceof ol.style.Style,
-                        41); // Expected an `ol.style.Style` or an array of `ol.style.Style`
-                    styles = [obj];
-                }
-                styleFunction = function() {
-                    return styles;
-                };
-            }
-            return styleFunction;
-        };
-
-
-        /**
-         * @type {Array.<ol.style.Style>}
-         * @private
-         */
-        ol.style.Style.default_ = null;
-
-
-        /**
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         * @param {number} resolution Resolution.
-         * @return {Array.<ol.style.Style>} Style.
-         */
-        ol.style.Style.defaultFunction = function(feature, resolution) {
-            // We don't use an immediately-invoked function
-            // and a closure so we don't get an error at script evaluation time in
-            // browsers that do not support Canvas. (ol.style.Circle does
-            // canvas.getContext('2d') at construction time, which will cause an.error
-            // in such browsers.)
-            if (!ol.style.Style.default_) {
-                var fill = new ol.style.Fill({
-                    color: 'rgba(255,255,255,0.4)'
-                });
-                var stroke = new ol.style.Stroke({
-                    color: '#3399CC',
-                    width: 1.25
-                });
-                ol.style.Style.default_ = [
-                    new ol.style.Style({
-                        image: new ol.style.Circle({
-                            fill: fill,
-                            stroke: stroke,
-                            radius: 5
-                        }),
-                        fill: fill,
-                        stroke: stroke
-                    })
-                ];
-            }
-            return ol.style.Style.default_;
-        };
-
-
-        /**
-         * Default styles for editing features.
-         * @return {Object.<ol.geom.GeometryType, Array.<ol.style.Style>>} Styles
-         */
-        ol.style.Style.createDefaultEditing = function() {
-            /** @type {Object.<ol.geom.GeometryType, Array.<ol.style.Style>>} */
-            var styles = {};
-            var white = [255, 255, 255, 1];
-            var blue = [0, 153, 255, 1];
-            var width = 3;
-            styles[ol.geom.GeometryType.POLYGON] = [
-                new ol.style.Style({
-                    fill: new ol.style.Fill({
-                        color: [255, 255, 255, 0.5]
-                    })
-                })
-            ];
-            styles[ol.geom.GeometryType.MULTI_POLYGON] =
-                styles[ol.geom.GeometryType.POLYGON];
-
-            styles[ol.geom.GeometryType.LINE_STRING] = [
-                new ol.style.Style({
-                    stroke: new ol.style.Stroke({
-                        color: white,
-                        width: width + 2
-                    })
-                }),
-                new ol.style.Style({
-                    stroke: new ol.style.Stroke({
-                        color: blue,
-                        width: width
-                    })
-                })
-            ];
-            styles[ol.geom.GeometryType.MULTI_LINE_STRING] =
-                styles[ol.geom.GeometryType.LINE_STRING];
-
-            styles[ol.geom.GeometryType.CIRCLE] =
-                styles[ol.geom.GeometryType.POLYGON].concat(
-                    styles[ol.geom.GeometryType.LINE_STRING]
-                );
-
-
-            styles[ol.geom.GeometryType.POINT] = [
-                new ol.style.Style({
-                    image: new ol.style.Circle({
-                        radius: width * 2,
-                        fill: new ol.style.Fill({
-                            color: blue
-                        }),
-                        stroke: new ol.style.Stroke({
-                            color: white,
-                            width: width / 2
-                        })
-                    }),
-                    zIndex: Infinity
-                })
-            ];
-            styles[ol.geom.GeometryType.MULTI_POINT] =
-                styles[ol.geom.GeometryType.POINT];
-
-            styles[ol.geom.GeometryType.GEOMETRY_COLLECTION] =
-                styles[ol.geom.GeometryType.POLYGON].concat(
-                    styles[ol.geom.GeometryType.LINE_STRING],
-                    styles[ol.geom.GeometryType.POINT]
-                );
-
-            return styles;
-        };
-
-
-        /**
-         * Function that is called with a feature and returns its default geometry.
-         * @param {ol.Feature|ol.render.Feature} feature Feature to get the geometry
-         *     for.
-         * @return {ol.geom.Geometry|ol.render.Feature|undefined} Geometry to render.
-         */
-        ol.style.Style.defaultGeometryFunction = function(feature) {
-            return feature.getGeometry();
-        };
-
-
-        ol.ext = {};
-        ol.ext.rbush = function() {};
-
-        (function() {(function (exports) {
-
-            var quickselect_1 = quickselect;
-            var default_1 = quickselect;
-            function quickselect(arr, k, left, right, compare) {
-                quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
-            }
-            function quickselectStep(arr, k, left, right, compare) {
-                while (right > left) {
-                    if (right - left > 600) {
-                        var n = right - left + 1;
-                        var m = k - left + 1;
-                        var z = Math.log(n);
-                        var s = 0.5 * Math.exp(2 * z / 3);
-                        var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
-                        var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
-                        var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
-                        quickselectStep(arr, k, newLeft, newRight, compare);
-                    }
-                    var t = arr[k];
-                    var i = left;
-                    var j = right;
-                    swap(arr, left, k);
-                    if (compare(arr[right], t) > 0) swap(arr, left, right);
-                    while (i < j) {
-                        swap(arr, i, j);
-                        i++;
-                        j--;
-                        while (compare(arr[i], t) < 0) i++;
-                        while (compare(arr[j], t) > 0) j--;
-                    }
-                    if (compare(arr[left], t) === 0) swap(arr, left, j);
-                    else {
-                        j++;
-                        swap(arr, j, right);
-                    }
-                    if (j <= k) left = j + 1;
-                    if (k <= j) right = j - 1;
-                }
-            }
-            function swap(arr, i, j) {
-                var tmp = arr[i];
-                arr[i] = arr[j];
-                arr[j] = tmp;
-            }
-            function defaultCompare(a, b) {
-                return a < b ? -1 : a > b ? 1 : 0;
-            }
-            quickselect_1.default = default_1;
-
-            var rbush_1 = rbush;
-            function rbush(maxEntries, format) {
-                if (!(this instanceof rbush)) return new rbush(maxEntries, format);
-                this._maxEntries = Math.max(4, maxEntries || 9);
-                this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
-                if (format) {
-                    this._initFormat(format);
-                }
-                this.clear();
-            }
-            rbush.prototype = {
-                all: function () {
-                    return this._all(this.data, []);
-                },
-                search: function (bbox) {
-                    var node = this.data,
-                        result = [],
-                        toBBox = this.toBBox;
-                    if (!intersects(bbox, node)) return result;
-                    var nodesToSearch = [],
-                        i, len, child, childBBox;
-                    while (node) {
-                        for (i = 0, len = node.children.length; i < len; i++) {
-                            child = node.children[i];
-                            childBBox = node.leaf ? toBBox(child) : child;
-                            if (intersects(bbox, childBBox)) {
-                                if (node.leaf) result.push(child);
-                                else if (contains(bbox, childBBox)) this._all(child, result);
-                                else nodesToSearch.push(child);
-                            }
-                        }
-                        node = nodesToSearch.pop();
-                    }
-                    return result;
-                },
-                collides: function (bbox) {
-                    var node = this.data,
-                        toBBox = this.toBBox;
-                    if (!intersects(bbox, node)) return false;
-                    var nodesToSearch = [],
-                        i, len, child, childBBox;
-                    while (node) {
-                        for (i = 0, len = node.children.length; i < len; i++) {
-                            child = node.children[i];
-                            childBBox = node.leaf ? toBBox(child) : child;
-                            if (intersects(bbox, childBBox)) {
-                                if (node.leaf || contains(bbox, childBBox)) return true;
-                                nodesToSearch.push(child);
-                            }
-                        }
-                        node = nodesToSearch.pop();
-                    }
-                    return false;
-                },
-                load: function (data) {
-                    if (!(data && data.length)) return this;
-                    if (data.length < this._minEntries) {
-                        for (var i = 0, len = data.length; i < len; i++) {
-                            this.insert(data[i]);
-                        }
-                        return this;
-                    }
-                    var node = this._build(data.slice(), 0, data.length - 1, 0);
-                    if (!this.data.children.length) {
-                        this.data = node;
-                    } else if (this.data.height === node.height) {
-                        this._splitRoot(this.data, node);
-                    } else {
-                        if (this.data.height < node.height) {
-                            var tmpNode = this.data;
-                            this.data = node;
-                            node = tmpNode;
-                        }
-                        this._insert(node, this.data.height - node.height - 1, true);
-                    }
-                    return this;
-                },
-                insert: function (item) {
-                    if (item) this._insert(item, this.data.height - 1);
-                    return this;
-                },
-                clear: function () {
-                    this.data = createNode([]);
-                    return this;
-                },
-                remove: function (item, equalsFn) {
-                    if (!item) return this;
-                    var node = this.data,
-                        bbox = this.toBBox(item),
-                        path = [],
-                        indexes = [],
-                        i, parent, index, goingUp;
-                    while (node || path.length) {
-                        if (!node) {
-                            node = path.pop();
-                            parent = path[path.length - 1];
-                            i = indexes.pop();
-                            goingUp = true;
-                        }
-                        if (node.leaf) {
-                            index = findItem(item, node.children, equalsFn);
-                            if (index !== -1) {
-                                node.children.splice(index, 1);
-                                path.push(node);
-                                this._condense(path);
-                                return this;
-                            }
-                        }
-                        if (!goingUp && !node.leaf && contains(node, bbox)) {
-                            path.push(node);
-                            indexes.push(i);
-                            i = 0;
-                            parent = node;
-                            node = node.children[0];
-                        } else if (parent) {
-                            i++;
-                            node = parent.children[i];
-                            goingUp = false;
-                        } else node = null;
-                    }
-                    return this;
-                },
-                toBBox: function (item) { return item; },
-                compareMinX: compareNodeMinX,
-                compareMinY: compareNodeMinY,
-                toJSON: function () { return this.data; },
-                fromJSON: function (data) {
-                    this.data = data;
-                    return this;
-                },
-                _all: function (node, result) {
-                    var nodesToSearch = [];
-                    while (node) {
-                        if (node.leaf) result.push.apply(result, node.children);
-                        else nodesToSearch.push.apply(nodesToSearch, node.children);
-                        node = nodesToSearch.pop();
-                    }
-                    return result;
-                },
-                _build: function (items, left, right, height) {
-                    var N = right - left + 1,
-                        M = this._maxEntries,
-                        node;
-                    if (N <= M) {
-                        node = createNode(items.slice(left, right + 1));
-                        calcBBox(node, this.toBBox);
-                        return node;
-                    }
-                    if (!height) {
-                        height = Math.ceil(Math.log(N) / Math.log(M));
-                        M = Math.ceil(N / Math.pow(M, height - 1));
-                    }
-                    node = createNode([]);
-                    node.leaf = false;
-                    node.height = height;
-                    var N2 = Math.ceil(N / M),
-                        N1 = N2 * Math.ceil(Math.sqrt(M)),
-                        i, j, right2, right3;
-                    multiSelect(items, left, right, N1, this.compareMinX);
-                    for (i = left; i <= right; i += N1) {
-                        right2 = Math.min(i + N1 - 1, right);
-                        multiSelect(items, i, right2, N2, this.compareMinY);
-                        for (j = i; j <= right2; j += N2) {
-                            right3 = Math.min(j + N2 - 1, right2);
-                            node.children.push(this._build(items, j, right3, height - 1));
-                        }
-                    }
-                    calcBBox(node, this.toBBox);
-                    return node;
-                },
-                _chooseSubtree: function (bbox, node, level, path) {
-                    var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
-                    while (true) {
-                        path.push(node);
-                        if (node.leaf || path.length - 1 === level) break;
-                        minArea = minEnlargement = Infinity;
-                        for (i = 0, len = node.children.length; i < len; i++) {
-                            child = node.children[i];
-                            area = bboxArea(child);
-                            enlargement = enlargedArea(bbox, child) - area;
-                            if (enlargement < minEnlargement) {
-                                minEnlargement = enlargement;
-                                minArea = area < minArea ? area : minArea;
-                                targetNode = child;
-                            } else if (enlargement === minEnlargement) {
-                                if (area < minArea) {
-                                    minArea = area;
-                                    targetNode = child;
-                                }
-                            }
-                        }
-                        node = targetNode || node.children[0];
-                    }
-                    return node;
-                },
-                _insert: function (item, level, isNode) {
-                    var toBBox = this.toBBox,
-                        bbox = isNode ? item : toBBox(item),
-                        insertPath = [];
-                    var node = this._chooseSubtree(bbox, this.data, level, insertPath);
-                    node.children.push(item);
-                    extend(node, bbox);
-                    while (level >= 0) {
-                        if (insertPath[level].children.length > this._maxEntries) {
-                            this._split(insertPath, level);
-                            level--;
-                        } else break;
-                    }
-                    this._adjustParentBBoxes(bbox, insertPath, level);
-                },
-                _split: function (insertPath, level) {
-                    var node = insertPath[level],
-                        M = node.children.length,
-                        m = this._minEntries;
-                    this._chooseSplitAxis(node, m, M);
-                    var splitIndex = this._chooseSplitIndex(node, m, M);
-                    var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
-                    newNode.height = node.height;
-                    newNode.leaf = node.leaf;
-                    calcBBox(node, this.toBBox);
-                    calcBBox(newNode, this.toBBox);
-                    if (level) insertPath[level - 1].children.push(newNode);
-                    else this._splitRoot(node, newNode);
-                },
-                _splitRoot: function (node, newNode) {
-                    this.data = createNode([node, newNode]);
-                    this.data.height = node.height + 1;
-                    this.data.leaf = false;
-                    calcBBox(this.data, this.toBBox);
-                },
-                _chooseSplitIndex: function (node, m, M) {
-                    var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
-                    minOverlap = minArea = Infinity;
-                    for (i = m; i <= M - m; i++) {
-                        bbox1 = distBBox(node, 0, i, this.toBBox);
-                        bbox2 = distBBox(node, i, M, this.toBBox);
-                        overlap = intersectionArea(bbox1, bbox2);
-                        area = bboxArea(bbox1) + bboxArea(bbox2);
-                        if (overlap < minOverlap) {
-                            minOverlap = overlap;
-                            index = i;
-                            minArea = area < minArea ? area : minArea;
-                        } else if (overlap === minOverlap) {
-                            if (area < minArea) {
-                                minArea = area;
-                                index = i;
-                            }
-                        }
-                    }
-                    return index;
-                },
-                _chooseSplitAxis: function (node, m, M) {
-                    var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
-                        compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
-                        xMargin = this._allDistMargin(node, m, M, compareMinX),
-                        yMargin = this._allDistMargin(node, m, M, compareMinY);
-                    if (xMargin < yMargin) node.children.sort(compareMinX);
-                },
-                _allDistMargin: function (node, m, M, compare) {
-                    node.children.sort(compare);
-                    var toBBox = this.toBBox,
-                        leftBBox = distBBox(node, 0, m, toBBox),
-                        rightBBox = distBBox(node, M - m, M, toBBox),
-                        margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
-                        i, child;
-                    for (i = m; i < M - m; i++) {
-                        child = node.children[i];
-                        extend(leftBBox, node.leaf ? toBBox(child) : child);
-                        margin += bboxMargin(leftBBox);
-                    }
-                    for (i = M - m - 1; i >= m; i--) {
-                        child = node.children[i];
-                        extend(rightBBox, node.leaf ? toBBox(child) : child);
-                        margin += bboxMargin(rightBBox);
-                    }
-                    return margin;
-                },
-                _adjustParentBBoxes: function (bbox, path, level) {
-                    for (var i = level; i >= 0; i--) {
-                        extend(path[i], bbox);
-                    }
-                },
-                _condense: function (path) {
-                    for (var i = path.length - 1, siblings; i >= 0; i--) {
-                        if (path[i].children.length === 0) {
-                            if (i > 0) {
-                                siblings = path[i - 1].children;
-                                siblings.splice(siblings.indexOf(path[i]), 1);
-                            } else this.clear();
-                        } else calcBBox(path[i], this.toBBox);
-                    }
-                },
-                _initFormat: function (format) {
-                    var compareArr = ['return a', ' - b', ';'];
-                    this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
-                    this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
-                    this.toBBox = new Function('a',
-                        'return {minX: a' + format[0] +
-                            ', minY: a' + format[1] +
-                            ', maxX: a' + format[2] +
-                            ', maxY: a' + format[3] + '};');
-                }
-            };
-            function findItem(item, items, equalsFn) {
-                if (!equalsFn) return items.indexOf(item);
-                for (var i = 0; i < items.length; i++) {
-                    if (equalsFn(item, items[i])) return i;
-                }
-                return -1;
-            }
-            function calcBBox(node, toBBox) {
-                distBBox(node, 0, node.children.length, toBBox, node);
-            }
-            function distBBox(node, k, p, toBBox, destNode) {
-                if (!destNode) destNode = createNode(null);
-                destNode.minX = Infinity;
-                destNode.minY = Infinity;
-                destNode.maxX = -Infinity;
-                destNode.maxY = -Infinity;
-                for (var i = k, child; i < p; i++) {
-                    child = node.children[i];
-                    extend(destNode, node.leaf ? toBBox(child) : child);
-                }
-                return destNode;
-            }
-            function extend(a, b) {
-                a.minX = Math.min(a.minX, b.minX);
-                a.minY = Math.min(a.minY, b.minY);
-                a.maxX = Math.max(a.maxX, b.maxX);
-                a.maxY = Math.max(a.maxY, b.maxY);
-                return a;
-            }
-            function compareNodeMinX(a, b) { return a.minX - b.minX; }
-            function compareNodeMinY(a, b) { return a.minY - b.minY; }
-            function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
-            function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
-            function enlargedArea(a, b) {
-                return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
-                    (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
-            }
-            function intersectionArea(a, b) {
-                var minX = Math.max(a.minX, b.minX),
-                    minY = Math.max(a.minY, b.minY),
-                    maxX = Math.min(a.maxX, b.maxX),
-                    maxY = Math.min(a.maxY, b.maxY);
-                return Math.max(0, maxX - minX) *
-                    Math.max(0, maxY - minY);
-            }
-            function contains(a, b) {
-                return a.minX <= b.minX &&
-                    a.minY <= b.minY &&
-                    b.maxX <= a.maxX &&
-                    b.maxY <= a.maxY;
-            }
-            function intersects(a, b) {
-                return b.minX <= a.maxX &&
-                    b.minY <= a.maxY &&
-                    b.maxX >= a.minX &&
-                    b.maxY >= a.minY;
-            }
-            function createNode(children) {
-                return {
-                    children: children,
-                    height: 1,
-                    leaf: true,
-                    minX: Infinity,
-                    minY: Infinity,
-                    maxX: -Infinity,
-                    maxY: -Infinity
-                };
-            }
-            function multiSelect(arr, left, right, n, compare) {
-                var stack = [left, right],
-                    mid;
-                while (stack.length) {
-                    right = stack.pop();
-                    left = stack.pop();
-                    if (right - left <= n) continue;
-                    mid = left + Math.ceil((right - left) / n / 2) * n;
-                    quickselect_1(arr, mid, left, right, compare);
-                    stack.push(left, mid, mid, right);
-                }
-            }
-
-            exports['default'] = rbush_1;
-
-        }((this.rbush = this.rbush || {})));}).call(ol.ext);
-        ol.ext.rbush = ol.ext.rbush.default;
-
-        ol.render = {};
-
-        /**
-         * Context for drawing geometries.  A vector context is available on render
-         * events and does not need to be constructed directly.
-         * @constructor
-         * @abstract
-         * @struct
-         * @api
-         */
-        ol.render.VectorContext = function() {
-        };
-
-        ol.render.VectorContext.prototype.drawCustom = function(geometry, feature, renderer) {};
-        ol.render.VectorContext.prototype.drawGeometry = function(geometry) {};
-        ol.render.VectorContext.prototype.setStyle = function(style) {};
-        ol.render.VectorContext.prototype.drawCircle = function(circleGeometry, feature) {};
-        ol.render.VectorContext.prototype.drawFeature = function(feature, style) {};
-        ol.render.VectorContext.prototype.drawGeometryCollection = function(geometryCollectionGeometry, feature) {};
-        ol.render.VectorContext.prototype.drawLineString = function(lineStringGeometry, feature) {};
-        ol.render.VectorContext.prototype.drawMultiLineString = function(multiLineStringGeometry, feature) {};
-        ol.render.VectorContext.prototype.drawMultiPoint = function(multiPointGeometry, feature) {};
-        ol.render.VectorContext.prototype.drawMultiPolygon = function(multiPolygonGeometry, feature) {};
-        ol.render.VectorContext.prototype.drawPoint = function(pointGeometry, feature) {};
-        ol.render.VectorContext.prototype.drawPolygon = function(polygonGeometry, feature) {};
-        ol.render.VectorContext.prototype.drawText = function(geometry, feature) {};
-        ol.render.VectorContext.prototype.setFillStrokeStyle = function(fillStyle, strokeStyle) {};
-        ol.render.VectorContext.prototype.setImageStyle = function(imageStyle, opt_declutterGroup) {};
-        ol.render.VectorContext.prototype.setTextStyle = function(textStyle, opt_declutterGroup) {};
-
-        ol.render.ReplayGroup = {};
-
-        ol.render.ReplayGroup = function() {};
-
-        ol.render.ReplayGroup.prototype.getReplay = function(zIndex, replayType) {};
-
-        ol.render.ReplayGroup.prototype.isEmpty = function() {};
-
-        ol.render.ReplayType = {
-            CIRCLE: 'Circle',
-            DEFAULT: 'Default',
-            IMAGE: 'Image',
-            LINE_STRING: 'LineString',
-            POLYGON: 'Polygon',
-            TEXT: 'Text'
-        };
-
-        ol.geom.flat.length = {};
-
-        ol.geom.flat.length.lineString = function(flatCoordinates, offset, end, stride) {
-            var x1 = flatCoordinates[offset];
-            var y1 = flatCoordinates[offset + 1];
-            var length = 0;
-            var i;
-            for (i = offset + stride; i < end; i += stride) {
-                var x2 = flatCoordinates[i];
-                var y2 = flatCoordinates[i + 1];
-                length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
-                x1 = x2;
-                y1 = y2;
-            }
-            return length;
-        };
-
-        ol.geom.flat.length.linearRing = function(flatCoordinates, offset, end, stride) {
-            var perimeter =
-                ol.geom.flat.length.lineString(flatCoordinates, offset, end, stride);
-            var dx = flatCoordinates[end - stride] - flatCoordinates[offset];
-            var dy = flatCoordinates[end - stride + 1] - flatCoordinates[offset + 1];
-            perimeter += Math.sqrt(dx * dx + dy * dy);
-            return perimeter;
-        };
-
-        ol.geom.flat.textpath = {};
-
-        ol.geom.flat.textpath.lineString = function(
-            flatCoordinates, offset, end, stride, text, measure, startM, maxAngle) {
-            var result = [];
-
-            // Keep text upright
-            var reverse = flatCoordinates[offset] > flatCoordinates[end - stride];
-
-            var numChars = text.length;
-
-            var x1 = flatCoordinates[offset];
-            var y1 = flatCoordinates[offset + 1];
-            offset += stride;
-            var x2 = flatCoordinates[offset];
-            var y2 = flatCoordinates[offset + 1];
-            var segmentM = 0;
-            var segmentLength = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
-
-            var chunk = '';
-            var chunkLength = 0;
-            var data, index, previousAngle;
-            for (var i = 0; i < numChars; ++i) {
-                index = reverse ? numChars - i - 1 : i;
-                var char = text.charAt(index);
-                chunk = reverse ? char + chunk : chunk + char;
-                var charLength = measure(chunk) - chunkLength;
-                chunkLength += charLength;
-                var charM = startM + charLength / 2;
-                while (offset < end - stride && segmentM + segmentLength < charM) {
-                    x1 = x2;
-                    y1 = y2;
-                    offset += stride;
-                    x2 = flatCoordinates[offset];
-                    y2 = flatCoordinates[offset + 1];
-                    segmentM += segmentLength;
-                    segmentLength = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
-                }
-                var segmentPos = charM - segmentM;
-                var angle = Math.atan2(y2 - y1, x2 - x1);
-                if (reverse) {
-                    angle += angle > 0 ? -Math.PI : Math.PI;
-                }
-                if (previousAngle !== undefined) {
-                    var delta = angle - previousAngle;
-                    delta += (delta > Math.PI) ? -2 * Math.PI : (delta < -Math.PI) ? 2 * Math.PI : 0;
-                    if (Math.abs(delta) > maxAngle) {
-                        return null;
-                    }
-                }
-                var interpolate = segmentPos / segmentLength;
-                var x = ol.math.lerp(x1, x2, interpolate);
-                var y = ol.math.lerp(y1, y2, interpolate);
-                if (previousAngle == angle) {
-                    if (reverse) {
-                        data[0] = x;
-                        data[1] = y;
-                        data[2] = charLength / 2;
-                    }
-                    data[4] = chunk;
-                } else {
-                    chunk = char;
-                    chunkLength = charLength;
-                    data = [x, y, charLength / 2, angle, chunk];
-                    if (reverse) {
-                        result.unshift(data);
-                    } else {
-                        result.push(data);
-                    }
-                    previousAngle = angle;
-                }
-                startM += charLength;
-            }
-            return result;
-        };
-
-
-        ol.structs.LRUCache = function(opt_highWaterMark) {
-            ol.events.EventTarget.call(this);
-            this.highWaterMark = opt_highWaterMark !== undefined ? opt_highWaterMark : 2048;
-            this.count_ = 0;
-            this.entries_ = {};
-            this.oldest_ = null;
-            this.newest_ = null;
-        };
-
-        ol.inherits(ol.structs.LRUCache, ol.events.EventTarget);
-
-        ol.structs.LRUCache.prototype.canExpireCache = function() {
-            return this.getCount() > this.highWaterMark;
-        };
-
-        ol.structs.LRUCache.prototype.clear = function() {
-            this.count_ = 0;
-            this.entries_ = {};
-            this.oldest_ = null;
-            this.newest_ = null;
-            this.dispatchEvent(ol.events.EventType.CLEAR);
-        };
-
-        ol.structs.LRUCache.prototype.containsKey = function(key) {
-            return this.entries_.hasOwnProperty(key);
-        };
-
-        ol.structs.LRUCache.prototype.forEach = function(f, opt_this) {
-            var entry = this.oldest_;
-            while (entry) {
-                f.call(opt_this, entry.value_, entry.key_, this);
-                entry = entry.newer;
-            }
-        };
-
-        ol.structs.LRUCache.prototype.get = function(key) {
-            var entry = this.entries_[key];
-            ol.asserts.assert(entry !== undefined,
-                15); // Tried to get a value for a key that does not exist in the cache
-            if (entry === this.newest_) {
-                return entry.value_;
-            } else if (entry === this.oldest_) {
-                this.oldest_ = /** @type {ol.LRUCacheEntry} */ (this.oldest_.newer);
-                this.oldest_.older = null;
-            } else {
-                entry.newer.older = entry.older;
-                entry.older.newer = entry.newer;
-            }
-            entry.newer = null;
-            entry.older = this.newest_;
-            this.newest_.newer = entry;
-            this.newest_ = entry;
-            return entry.value_;
-        };
-
-        ol.structs.LRUCache.prototype.remove = function(key) {
-            var entry = this.entries_[key];
-            ol.asserts.assert(entry !== undefined, 15); // Tried to get a value for a key that does not exist in the cache
-            if (entry === this.newest_) {
-                this.newest_ = /** @type {ol.LRUCacheEntry} */ (entry.older);
-                if (this.newest_) {
-                    this.newest_.newer = null;
-                }
-            } else if (entry === this.oldest_) {
-                this.oldest_ = /** @type {ol.LRUCacheEntry} */ (entry.newer);
-                if (this.oldest_) {
-                    this.oldest_.older = null;
-                }
-            } else {
-                entry.newer.older = entry.older;
-                entry.older.newer = entry.newer;
-            }
-            delete this.entries_[key];
-            --this.count_;
-            return entry.value_;
-        };
-
-        ol.structs.LRUCache.prototype.getCount = function() {
-            return this.count_;
-        };
-
-        ol.structs.LRUCache.prototype.getKeys = function() {
-            var keys = new Array(this.count_);
-            var i = 0;
-            var entry;
-            for (entry = this.newest_; entry; entry = entry.older) {
-                keys[i++] = entry.key_;
-            }
-            return keys;
-        };
-
-        ol.structs.LRUCache.prototype.getValues = function() {
-            var values = new Array(this.count_);
-            var i = 0;
-            var entry;
-            for (entry = this.newest_; entry; entry = entry.older) {
-                values[i++] = entry.value_;
-            }
-            return values;
-        };
-
-        ol.structs.LRUCache.prototype.peekLast = function() {
-            return this.oldest_.value_;
-        };
-
-        ol.structs.LRUCache.prototype.peekLastKey = function() {
-            return this.oldest_.key_;
-        };
-
-        ol.structs.LRUCache.prototype.peekFirstKey = function() {
-            return this.newest_.key_;
-        };
-
-        ol.structs.LRUCache.prototype.pop = function() {
-            var entry = this.oldest_;
-            delete this.entries_[entry.key_];
-            if (entry.newer) {
-                entry.newer.older = null;
-            }
-            this.oldest_ = /** @type {ol.LRUCacheEntry} */ (entry.newer);
-            if (!this.oldest_) {
-                this.newest_ = null;
-            }
-            --this.count_;
-            return entry.value_;
-        };
-
-        ol.structs.LRUCache.prototype.replace = function(key, value) {
-            this.get(key);  // update `newest_`
-            this.entries_[key].value_ = value;
-        };
-
-        ol.structs.LRUCache.prototype.set = function(key, value) {
-            ol.asserts.assert(!(key in this.entries_),
-                16); // Tried to set a value for a key that is used already
-            var entry = /** @type {ol.LRUCacheEntry} */ ({
-                key_: key,
-                newer: null,
-                older: this.newest_,
-                value_: value
-            });
-            if (!this.newest_) {
-                this.oldest_ = entry;
-            } else {
-                this.newest_.newer = entry;
-            }
-            this.newest_ = entry;
-            this.entries_[key] = entry;
-            ++this.count_;
-        };
-
-        ol.structs.LRUCache.prototype.prune = function() {
-            while (this.canExpireCache()) {
-                this.pop();
-            }
-        };
-
-        ol.render.canvas = {};
-        ol.render.canvas.defaultFont = '10px sans-serif';
-        ol.render.canvas.defaultFillStyle = [0, 0, 0, 1];
-        ol.render.canvas.defaultLineCap = 'round';
-        ol.render.canvas.defaultLineDash = [];
-        ol.render.canvas.defaultLineDashOffset = 0;
-        ol.render.canvas.defaultLineJoin = 'round';
-        ol.render.canvas.defaultMiterLimit = 10;
-        ol.render.canvas.defaultStrokeStyle = [0, 0, 0, 1];
-        ol.render.canvas.defaultTextAlign = 'center';
-        ol.render.canvas.defaultTextBaseline = 'middle';
-        ol.render.canvas.defaultPadding = [0, 0, 0, 0];
-        ol.render.canvas.defaultLineWidth = 1;
-        ol.render.canvas.labelCache = new ol.structs.LRUCache();
-        ol.render.canvas.checkedFonts_ = {};
-        ol.render.canvas.measureContext_ = null;
-        ol.render.canvas.textHeights_ = {};
-
-        /**
-         * Clears the label cache when a font becomes available.
-         * @param {string} fontSpec CSS font spec.
-         */
-        ol.render.canvas.checkFont = (function() {
-            var retries = 60;
-            var checked = ol.render.canvas.checkedFonts_;
-            var labelCache = ol.render.canvas.labelCache;
-            var font = '32px monospace';
-            var text = 'wmytzilWMYTZIL@#/&?$%10';
-            var interval, referenceWidth;
-
-            function isAvailable(fontFamily) {
-                var context = ol.render.canvas.getMeasureContext();
-                context.font = font;
-                referenceWidth = context.measureText(text).width;
-                var available = true;
-                if (fontFamily != 'monospace') {
-                    context.font = '32px ' + fontFamily + ',monospace';
-                    var width = context.measureText(text).width;
-                    // If width and referenceWidth are the same, then the 'monospace'
-                    // fallback was used instead of the font we wanted, so the font is not
-                    // available.
-                    available = width != referenceWidth;
-                }
-                return available;
-            }
-
-            function check() {
-                var done = true;
-                for (var font in checked) {
-                    if (checked[font] < retries) {
-                        if (isAvailable(font)) {
-                            checked[font] = retries;
-                            ol.obj.clear(ol.render.canvas.textHeights_);
-                            // Make sure that loaded fonts are picked up by Safari
-                            ol.render.canvas.measureContext_ = null;
-                            labelCache.clear();
-                        } else {
-                            ++checked[font];
-                            done = false;
-                        }
-                    }
-                }
-                if (done) {
-                    window.clearInterval(interval);
-                    interval = undefined;
-                }
-            }
-
-            return function(fontSpec) {
-                var fontFamilies = ol.css.getFontFamilies(fontSpec);
-                if (!fontFamilies) {
-                    return;
-                }
-                for (var i = 0, ii = fontFamilies.length; i < ii; ++i) {
-                    var fontFamily = fontFamilies[i];
-                    if (!(fontFamily in checked)) {
-                        checked[fontFamily] = retries;
-                        if (!isAvailable(fontFamily)) {
-                            checked[fontFamily] = 0;
-                            if (interval === undefined) {
-                                interval = window.setInterval(check, 32);
-                            }
-                        }
-                    }
-                }
-            };
-        })();
-
-
-        /**
-         * @return {CanvasRenderingContext2D} Measure context.
-         */
-        ol.render.canvas.getMeasureContext = function() {
-            var context = ol.render.canvas.measureContext_;
-            if (!context) {
-                context = ol.render.canvas.measureContext_ = ol.dom.createCanvasContext2D(1, 1);
-            }
-            return context;
-        };
-
-
-        /**
-         * @param {string} font Font to use for measuring.
-         * @return {ol.Size} Measurement.
-         */
-        ol.render.canvas.measureTextHeight = (function() {
-            var heights = ol.render.canvas.textHeights_;
-            return function(font) {
-                var height = heights[font];
-                if (height == undefined) {
-    //                if (!span) {
-    //                    span = document.createElement('span');
-    //                    span.textContent = 'M';
-    //                    span.style.margin = span.style.padding = '0 !important';
-    //                    span.style.position = 'absolute !important';
-    //                    span.style.left = '-99999px !important';
-    //                }
-    //                span.style.font = font;
-    //                document.body.appendChild(span);
-    //                height = heights[font] = span.offsetHeight;
-    //                document.body.removeChild(span);
-                    height = heights[font] = 19; // FIXME sunyl
-                }
-                return height;
-            };
-        })();
-
-
-        /**
-         * @param {string} font Font.
-         * @param {string} text Text.
-         * @return {number} Width.
-         */
-        ol.render.canvas.measureTextWidth = function(font, text) {
-            var measureContext = ol.render.canvas.getMeasureContext();
-            if (font != measureContext.font) {
-                measureContext.font = font;
-            }
-            return measureContext.measureText(text).width;
-        };
-
-
-        /**
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {number} rotation Rotation.
-         * @param {number} offsetX X offset.
-         * @param {number} offsetY Y offset.
-         */
-        ol.render.canvas.rotateAtOffset = function(context, rotation, offsetX, offsetY) {
-            if (rotation !== 0) {
-                context.translate(offsetX, offsetY);
-                context.rotate(rotation);
-                context.translate(-offsetX, -offsetY);
-            }
-        };
-
-
-        ol.render.canvas.resetTransform_ = ol.transform.create();
-
-
-        /**
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {ol.Transform|null} transform Transform.
-         * @param {number} opacity Opacity.
-         * @param {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement} image Image.
-         * @param {number} originX Origin X.
-         * @param {number} originY Origin Y.
-         * @param {number} w Width.
-         * @param {number} h Height.
-         * @param {number} x X.
-         * @param {number} y Y.
-         * @param {number} scale Scale.
-         */
-        ol.render.canvas.drawImage = function(context,
-                                              transform, opacity, image, originX, originY, w, h, x, y, scale) {
-            var alpha;
-            if (opacity != 1) {
-                alpha = context.globalAlpha;
-                context.globalAlpha = alpha * opacity;
-            }
-            if (transform) {
-                context.setTransform.apply(context, transform);
-            }
-
-            context.drawImage(image, originX, originY, w, h, x, y, w * scale, h * scale);
-
-            if (alpha) {
-                context.globalAlpha = alpha;
-            }
-            if (transform) {
-                context.setTransform.apply(context, ol.render.canvas.resetTransform_);
-            }
-        };
-
-
-        /**
-         * @enum {number}
-         */
-        ol.render.canvas.Instruction = {
-            BEGIN_GEOMETRY: 0,
-            BEGIN_PATH: 1,
-            CIRCLE: 2,
-            CLOSE_PATH: 3,
-            CUSTOM: 4,
-            DRAW_CHARS: 5,
-            DRAW_IMAGE: 6,
-            END_GEOMETRY: 7,
-            FILL: 8,
-            MOVE_TO_LINE_TO: 9,
-            SET_FILL_STYLE: 10,
-            SET_STROKE_STYLE: 11,
-            STROKE: 12
-        };
-
-        ol.render.replay = {};
-
-        ol.render.replay.ORDER = [
-            ol.render.ReplayType.POLYGON,
-            ol.render.ReplayType.CIRCLE,
-            ol.render.ReplayType.LINE_STRING,
-            ol.render.ReplayType.IMAGE,
-            ol.render.ReplayType.TEXT,
-            ol.render.ReplayType.DEFAULT
-        ];
-
-        ol.render.replay.TEXT_ALIGN = {};
-        ol.render.replay.TEXT_ALIGN['left'] = 0;
-        ol.render.replay.TEXT_ALIGN['end'] = 0;
-        ol.render.replay.TEXT_ALIGN['center'] = 0.5;
-        ol.render.replay.TEXT_ALIGN['right'] = 1;
-        ol.render.replay.TEXT_ALIGN['start'] = 1;
-        ol.render.replay.TEXT_ALIGN['top'] = 0;
-        ol.render.replay.TEXT_ALIGN['middle'] = 0.5;
-        ol.render.replay.TEXT_ALIGN['hanging'] = 0.2;
-        ol.render.replay.TEXT_ALIGN['alphabetic'] = 0.8;
-        ol.render.replay.TEXT_ALIGN['ideographic'] = 0.8;
-        ol.render.replay.TEXT_ALIGN['bottom'] = 1;
-
-
-        ol.render.canvas.Replay = function(tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree) {
-            ol.render.VectorContext.call(this);
-
-            /**
-             * @type {?}
-             */
-            this.declutterTree = declutterTree;
-
-            /**
-             * @private
-             * @type {ol.Extent}
-             */
-            this.tmpExtent_ = ol.extent.createEmpty();
-
-            /**
-             * @protected
-             * @type {number}
-             */
-            this.tolerance = tolerance;
-
-            /**
-             * @protected
-             * @const
-             * @type {ol.Extent}
-             */
-            this.maxExtent = maxExtent;
-
-            /**
-             * @protected
-             * @type {boolean}
-             */
-            this.overlaps = overlaps;
-
-            /**
-             * @protected
-             * @type {number}
-             */
-            this.pixelRatio = pixelRatio;
-
-            /**
-             * @protected
-             * @type {number}
-             */
-            this.maxLineWidth = 0;
-
-            /**
-             * @protected
-             * @const
-             * @type {number}
-             */
-            this.resolution = resolution;
-
-            /**
-             * @private
-             * @type {ol.Coordinate}
-             */
-            this.fillOrigin_;
-
-            /**
-             * @private
-             * @type {Array.<*>}
-             */
-            this.beginGeometryInstruction1_ = null;
-
-            /**
-             * @private
-             * @type {Array.<*>}
-             */
-            this.beginGeometryInstruction2_ = null;
-
-            /**
-             * @private
-             * @type {ol.Extent}
-             */
-            this.bufferedMaxExtent_ = null;
-
-            /**
-             * @protected
-             * @type {Array.<*>}
-             */
-            this.instructions = [];
-
-            /**
-             * @protected
-             * @type {Array.<number>}
-             */
-            this.coordinates = [];
-
-            /**
-             * @private
-             * @type {Object.<number,ol.Coordinate|Array.<ol.Coordinate>|Array.<Array.<ol.Coordinate>>>}
-             */
-            this.coordinateCache_ = {};
-
-            /**
-             * @private
-             * @type {!ol.Transform}
-             */
-            this.renderedTransform_ = ol.transform.create();
-
-            /**
-             * @protected
-             * @type {Array.<*>}
-             */
-            this.hitDetectionInstructions = [];
-
-            /**
-             * @private
-             * @type {Array.<number>}
-             */
-            this.pixelCoordinates_ = null;
-
-            /**
-             * @protected
-             * @type {ol.CanvasFillStrokeState}
-             */
-            this.state = /** @type {ol.CanvasFillStrokeState} */ ({});
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.viewRotation_ = 0;
-
-            /**
-             * @private
-             * @type {!ol.Transform}
-             */
-            this.tmpLocalTransform_ = ol.transform.create();
-
-            /**
-             * @private
-             * @type {!ol.Transform}
-             */
-            this.resetTransform_ = ol.transform.create();
-        };
-        ol.inherits(ol.render.canvas.Replay, ol.render.VectorContext);
-
-
-        /**
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {ol.Coordinate} p1 1st point of the background box.
-         * @param {ol.Coordinate} p2 2nd point of the background box.
-         * @param {ol.Coordinate} p3 3rd point of the background box.
-         * @param {ol.Coordinate} p4 4th point of the background box.
-         * @param {Array.<*>} fillInstruction Fill instruction.
-         * @param {Array.<*>} strokeInstruction Stroke instruction.
-         */
-        ol.render.canvas.Replay.prototype.replayTextBackground_ = function(context, p1, p2, p3, p4,
-                                                                           fillInstruction, strokeInstruction) {
-            context.beginPath();
-            context.moveTo.apply(context, p1);
-            context.lineTo.apply(context, p2);
-            context.lineTo.apply(context, p3);
-            context.lineTo.apply(context, p4);
-            context.lineTo.apply(context, p1);
-            if (fillInstruction) {
-                this.fillOrigin_ = /** @type {Array.<number>} */ (fillInstruction[2]);
-                this.fill_(context);
-            }
-            if (strokeInstruction) {
-                this.setStrokeStyle_(context, /** @type {Array.<*>} */ (strokeInstruction));
-                context.stroke();
-            }
-        };
-
-
-        /**
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {number} x X.
-         * @param {number} y Y.
-         * @param {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement} image Image.
-         * @param {number} anchorX Anchor X.
-         * @param {number} anchorY Anchor Y.
-         * @param {ol.DeclutterGroup} declutterGroup Declutter group.
-         * @param {number} height Height.
-         * @param {number} opacity Opacity.
-         * @param {number} originX Origin X.
-         * @param {number} originY Origin Y.
-         * @param {number} rotation Rotation.
-         * @param {number} scale Scale.
-         * @param {boolean} snapToPixel Snap to pixel.
-         * @param {number} width Width.
-         * @param {Array.<number>} padding Padding.
-         * @param {Array.<*>} fillInstruction Fill instruction.
-         * @param {Array.<*>} strokeInstruction Stroke instruction.
-         */
-        ol.render.canvas.Replay.prototype.replayImage_ = function(context, x, y, image,
-                                                                  anchorX, anchorY, declutterGroup, height, opacity, originX, originY,
-                                                                  rotation, scale, snapToPixel, width, padding, fillInstruction, strokeInstruction) {
-            var fillStroke = fillInstruction || strokeInstruction;
-            var localTransform = this.tmpLocalTransform_;
-            anchorX *= scale;
-            anchorY *= scale;
-            x -= anchorX;
-            y -= anchorY;
-            if (snapToPixel) {
-                x = Math.round(x);
-                y = Math.round(y);
-            }
-
-            var w = (width + originX > image.width) ? image.width - originX : width;
-            var h = (height + originY > image.height) ? image.height - originY : height;
-            var box = this.tmpExtent_;
-            var boxW = padding[3] + w * scale + padding[1];
-            var boxH = padding[0] + h * scale + padding[2];
-            var boxX = x - padding[3];
-            var boxY = y - padding[0];
-
-            /** @type {ol.Coordinate} */
-            var p1;
-            /** @type {ol.Coordinate} */
-            var p2;
-            /** @type {ol.Coordinate} */
-            var p3;
-            /** @type {ol.Coordinate} */
-            var p4;
-            if (fillStroke || rotation !== 0) {
-                p1 = [boxX, boxY];
-                p2 = [boxX + boxW, boxY];
-                p3 = [boxX + boxW, boxY + boxH];
-                p4 = [boxX, boxY + boxH];
-            }
-
-            var transform = null;
-            if (rotation !== 0) {
-                var centerX = x + anchorX;
-                var centerY = y + anchorY;
-                transform = ol.transform.compose(localTransform,
-                    centerX, centerY, 1, 1, rotation, -centerX, -centerY);
-
-                ol.extent.createOrUpdateEmpty(box);
-                ol.extent.extendCoordinate(box, ol.transform.apply(localTransform, p1));
-                ol.extent.extendCoordinate(box, ol.transform.apply(localTransform, p2));
-                ol.extent.extendCoordinate(box, ol.transform.apply(localTransform, p3));
-                ol.extent.extendCoordinate(box, ol.transform.apply(localTransform, p4));
-            } else {
-                ol.extent.createOrUpdate(boxX, boxY, boxX + boxW, boxY + boxH, box);
-            }
-            var canvas = context.canvas;
-            var intersects = box[0] <= canvas.width && box[2] >= 0 && box[1] <= canvas.height && box[3] >= 0;
-            if (declutterGroup) {
-                if (!intersects && declutterGroup[4] == 1) {
-                    return;
-                }
-                ol.extent.extend(declutterGroup, box);
-                var declutterArgs = intersects ?
-                    [context, transform ? transform.slice(0) : null, opacity, image, originX, originY, w, h, x, y, scale] :
-                    null;
-                if (declutterArgs && fillStroke) {
-                    declutterArgs.push(fillInstruction, strokeInstruction, p1, p2, p3, p4);
-                }
-                declutterGroup.push(declutterArgs);
-            } else if (intersects) {
-                if (fillStroke) {
-                    this.replayTextBackground_(context, p1, p2, p3, p4,
-                        /** @type {Array.<*>} */ (fillInstruction),
-                        /** @type {Array.<*>} */ (strokeInstruction));
-                }
-                ol.render.canvas.drawImage(context, transform, opacity, image, originX, originY, w, h, x, y, scale);
-            }
-        };
-
-
-        /**
-         * @protected
-         * @param {Array.<number>} dashArray Dash array.
-         * @return {Array.<number>} Dash array with pixel ratio applied
-         */
-        ol.render.canvas.Replay.prototype.applyPixelRatio = function(dashArray) {
-            var pixelRatio = this.pixelRatio;
-            return pixelRatio == 1 ? dashArray : dashArray.map(function(dash) {
-                return dash * pixelRatio;
-            });
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @param {boolean} closed Last input coordinate equals first.
-         * @param {boolean} skipFirst Skip first coordinate.
-         * @protected
-         * @return {number} My end.
-         */
-        ol.render.canvas.Replay.prototype.appendFlatCoordinates = function(flatCoordinates, offset, end, stride, closed, skipFirst) {
-
-            var myEnd = this.coordinates.length;
-            var extent = this.getBufferedMaxExtent();
-            if (skipFirst) {
-                offset += stride;
-            }
-            var lastCoord = [flatCoordinates[offset], flatCoordinates[offset + 1]];
-            var nextCoord = [NaN, NaN];
-            var skipped = true;
-
-            var i, lastRel, nextRel;
-            for (i = offset + stride; i < end; i += stride) {
-                nextCoord[0] = flatCoordinates[i];
-                nextCoord[1] = flatCoordinates[i + 1];
-                nextRel = ol.extent.coordinateRelationship(extent, nextCoord);
-                if (nextRel !== lastRel) {
-                    if (skipped) {
-                        this.coordinates[myEnd++] = lastCoord[0];
-                        this.coordinates[myEnd++] = lastCoord[1];
-                    }
-                    this.coordinates[myEnd++] = nextCoord[0];
-                    this.coordinates[myEnd++] = nextCoord[1];
-                    skipped = false;
-                } else if (nextRel === ol.extent.Relationship.INTERSECTING) {
-                    this.coordinates[myEnd++] = nextCoord[0];
-                    this.coordinates[myEnd++] = nextCoord[1];
-                    skipped = false;
-                } else {
-                    skipped = true;
-                }
-                lastCoord[0] = nextCoord[0];
-                lastCoord[1] = nextCoord[1];
-                lastRel = nextRel;
-            }
-
-            // Last coordinate equals first or only one point to append:
-            if ((closed && skipped) || i === offset + stride) {
-                this.coordinates[myEnd++] = lastCoord[0];
-                this.coordinates[myEnd++] = lastCoord[1];
-            }
-            return myEnd;
-        };
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<number>} ends Ends.
-         * @param {number} stride Stride.
-         * @param {Array.<number>} replayEnds Replay ends.
-         * @return {number} Offset.
-         */
-        ol.render.canvas.Replay.prototype.drawCustomCoordinates_ = function(flatCoordinates, offset, ends, stride, replayEnds) {
-            for (var i = 0, ii = ends.length; i < ii; ++i) {
-                var end = ends[i];
-                var replayEnd = this.appendFlatCoordinates(flatCoordinates, offset, end, stride, false, false);
-                replayEnds.push(replayEnd);
-                offset = end;
-            }
-            return offset;
-        };
-
-
-        /**
-         * @inheritDoc.
-         */
-        ol.render.canvas.Replay.prototype.drawCustom = function(geometry, feature, renderer) {
-            this.beginGeometry(geometry, feature);
-            var type = geometry.getType();
-            var stride = geometry.getStride();
-            var replayBegin = this.coordinates.length;
-            var flatCoordinates, replayEnd, replayEnds, replayEndss;
-            var offset;
-            if (type == ol.geom.GeometryType.MULTI_POLYGON) {
-                geometry = /** @type {ol.geom.MultiPolygon} */ (geometry);
-                flatCoordinates = geometry.getOrientedFlatCoordinates();
-                replayEndss = [];
-                var endss = geometry.getEndss();
-                offset = 0;
-                for (var i = 0, ii = endss.length; i < ii; ++i) {
-                    var myEnds = [];
-                    offset = this.drawCustomCoordinates_(flatCoordinates, offset, endss[i], stride, myEnds);
-                    replayEndss.push(myEnds);
-                }
-                this.instructions.push([ol.render.canvas.Instruction.CUSTOM,
-                    replayBegin, replayEndss, geometry, renderer, ol.geom.flat.inflate.coordinatesss]);
-            } else if (type == ol.geom.GeometryType.POLYGON || type == ol.geom.GeometryType.MULTI_LINE_STRING) {
-                replayEnds = [];
-                flatCoordinates = (type == ol.geom.GeometryType.POLYGON) ?
-                /** @type {ol.geom.Polygon} */ (geometry).getOrientedFlatCoordinates() :
-                    geometry.getFlatCoordinates();
-                offset = this.drawCustomCoordinates_(flatCoordinates, 0,
-                    /** @type {ol.geom.Polygon|ol.geom.MultiLineString} */ (geometry).getEnds(),
-                    stride, replayEnds);
-                this.instructions.push([ol.render.canvas.Instruction.CUSTOM,
-                    replayBegin, replayEnds, geometry, renderer, ol.geom.flat.inflate.coordinatess]);
-            } else if (type == ol.geom.GeometryType.LINE_STRING || type == ol.geom.GeometryType.MULTI_POINT) {
-                flatCoordinates = geometry.getFlatCoordinates();
-                replayEnd = this.appendFlatCoordinates(
-                    flatCoordinates, 0, flatCoordinates.length, stride, false, false);
-                this.instructions.push([ol.render.canvas.Instruction.CUSTOM,
-                    replayBegin, replayEnd, geometry, renderer, ol.geom.flat.inflate.coordinates]);
-            } else if (type == ol.geom.GeometryType.POINT) {
-                flatCoordinates = geometry.getFlatCoordinates();
-                this.coordinates.push(flatCoordinates[0], flatCoordinates[1]);
-                replayEnd = this.coordinates.length;
-                this.instructions.push([ol.render.canvas.Instruction.CUSTOM,
-                    replayBegin, replayEnd, geometry, renderer]);
-            }
-            this.endGeometry(geometry, feature);
-        };
-
-
-        /**
-         * @protected
-         * @param {ol.geom.Geometry|ol.render.Feature} geometry Geometry.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         */
-        ol.render.canvas.Replay.prototype.beginGeometry = function(geometry, feature) {
-            this.beginGeometryInstruction1_ =
-                [ol.render.canvas.Instruction.BEGIN_GEOMETRY, feature, 0];
-            this.instructions.push(this.beginGeometryInstruction1_);
-            this.beginGeometryInstruction2_ =
-                [ol.render.canvas.Instruction.BEGIN_GEOMETRY, feature, 0];
-            this.hitDetectionInstructions.push(this.beginGeometryInstruction2_);
-        };
-
-
-        /**
-         * @private
-         * @param {CanvasRenderingContext2D} context Context.
-         */
-        ol.render.canvas.Replay.prototype.fill_ = function(context) {
-            if (this.fillOrigin_) {
-                var origin = ol.transform.apply(this.renderedTransform_, this.fillOrigin_.slice());
-                context.translate(origin[0], origin[1]);
-                context.rotate(this.viewRotation_);
-            }
-            context.fill();
-            if (this.fillOrigin_) {
-                context.setTransform.apply(context, ol.render.canvas.resetTransform_);
-            }
-        };
-
-
-        /**
-         * @private
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {Array.<*>} instruction Instruction.
-         */
-        ol.render.canvas.Replay.prototype.setStrokeStyle_ = function(context, instruction) {
-            context.strokeStyle = /** @type {ol.ColorLike} */ (instruction[1]);
-            context.lineWidth = /** @type {number} */ (instruction[2]);
-            context.lineCap = /** @type {string} */ (instruction[3]);
-            context.lineJoin = /** @type {string} */ (instruction[4]);
-            context.miterLimit = /** @type {number} */ (instruction[5]);
-            if (ol.has.CANVAS_LINE_DASH) {
-                context.lineDashOffset = /** @type {number} */ (instruction[7]);
-                context.setLineDash(/** @type {Array.<number>} */ (instruction[6]));
-            }
-        };
-
-
-        /**
-         * @param {ol.DeclutterGroup} declutterGroup Declutter group.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         */
-        ol.render.canvas.Replay.prototype.renderDeclutter_ = function(declutterGroup, feature) {
-            if (declutterGroup && declutterGroup.length > 5) {
-                var groupCount = declutterGroup[4];
-                if (groupCount == 1 || groupCount == declutterGroup.length - 5) {
-                    /** @type {ol.RBushEntry} */
-                    var box = {
-                        minX: /** @type {number} */ (declutterGroup[0]),
-                        minY: /** @type {number} */ (declutterGroup[1]),
-                        maxX: /** @type {number} */ (declutterGroup[2]),
-                        maxY: /** @type {number} */ (declutterGroup[3]),
-                        value: feature
-                    };
-                    if (!this.declutterTree.collides(box)) {
-                        this.declutterTree.insert(box);
-                        var drawImage = ol.render.canvas.drawImage;
-                        for (var j = 5, jj = declutterGroup.length; j < jj; ++j) {
-                            var declutterData = /** @type {Array} */ (declutterGroup[j]);
-                            if (declutterData) {
-                                if (declutterData.length > 11) {
-                                    this.replayTextBackground_(declutterData[0],
-                                        declutterData[13], declutterData[14], declutterData[15], declutterData[16],
-                                        declutterData[11], declutterData[12]);
-                                }
-                                drawImage.apply(undefined, declutterData);
-                            }
-                        }
-                    }
-                    declutterGroup.length = 5;
-                    ol.extent.createOrUpdateEmpty(declutterGroup);
-                }
-            }
-        };
-
-
-        /**
-         * @private
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {ol.Transform} transform Transform.
-         * @param {Object.<string, boolean>} skippedFeaturesHash Ids of features
-         *     to skip.
-         * @param {Array.<*>} instructions Instructions array.
-         * @param {function((ol.Feature|ol.render.Feature)): T|undefined}
-         *     featureCallback Feature callback.
-         * @param {ol.Extent=} opt_hitExtent Only check features that intersect this
-         *     extent.
-         * @return {T|undefined} Callback result.
-         * @template T
-         */
-        ol.render.canvas.Replay.prototype.replay_ = function(
-            context, transform, skippedFeaturesHash,
-            instructions, featureCallback, opt_hitExtent) {
-            /** @type {Array.<number>} */
-            var pixelCoordinates;
-            if (this.pixelCoordinates_ && ol.array.equals(transform, this.renderedTransform_)) {
-                pixelCoordinates = this.pixelCoordinates_;
-            } else {
-                if (!this.pixelCoordinates_) {
-                    this.pixelCoordinates_ = [];
-                }
-                pixelCoordinates = ol.geom.flat.transform.transform2D(
-                    this.coordinates, 0, this.coordinates.length, 2,
-                    transform, this.pixelCoordinates_);
-                ol.transform.setFromArray(this.renderedTransform_, transform);
-            }
-            var skipFeatures = !ol.obj.isEmpty(skippedFeaturesHash);
-            var i = 0; // instruction index
-            var ii = instructions.length; // end of instructions
-            var d = 0; // data index
-            var dd; // end of per-instruction data
-            var anchorX, anchorY, prevX, prevY, roundX, roundY, declutterGroup, image;
-            var pendingFill = 0;
-            var pendingStroke = 0;
-            var lastFillInstruction = null;
-            var lastStrokeInstruction = null;
-            var coordinateCache = this.coordinateCache_;
-            var viewRotation = this.viewRotation_;
-
-            var state = /** @type {olx.render.State} */ ({
-                context: context,
-                pixelRatio: this.pixelRatio,
-                resolution: this.resolution,
-                rotation: viewRotation
-            });
-
-            // When the batch size gets too big, performance decreases. 200 is a good
-            // balance between batch size and number of fill/stroke instructions.
-            var batchSize =
-                this.instructions != instructions || this.overlaps ? 0 : 200;
-            while (i < ii) {
-                var instruction = instructions[i];
-                var type = /** @type {ol.render.canvas.Instruction} */ (instruction[0]);
-                var /** @type {ol.Feature|ol.render.Feature} */ feature, x, y;
-                switch (type) {
-                    case ol.render.canvas.Instruction.BEGIN_GEOMETRY:
-                        feature = /** @type {ol.Feature|ol.render.Feature} */ (instruction[1]);
-                        if ((skipFeatures &&
-                            skippedFeaturesHash[ol.getUid(feature).toString()]) ||
-                            !feature.getGeometry()) {
-                            i = /** @type {number} */ (instruction[2]);
-                        } else if (opt_hitExtent !== undefined && !ol.extent.intersects(
-                            opt_hitExtent, feature.getGeometry().getExtent())) {
-                            i = /** @type {number} */ (instruction[2]) + 1;
-                        } else {
-                            ++i;
-                        }
-                        break;
-                    case ol.render.canvas.Instruction.BEGIN_PATH:
-                        if (pendingFill > batchSize) {
-                            this.fill_(context);
-                            pendingFill = 0;
-                        }
-                        if (pendingStroke > batchSize) {
-                            context.stroke();
-                            pendingStroke = 0;
-                        }
-                        if (!pendingFill && !pendingStroke) {
-                            context.beginPath();
-                            prevX = prevY = NaN;
-                        }
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.CIRCLE:
-                        d = /** @type {number} */ (instruction[1]);
-                        var x1 = pixelCoordinates[d];
-                        var y1 = pixelCoordinates[d + 1];
-                        var x2 = pixelCoordinates[d + 2];
-                        var y2 = pixelCoordinates[d + 3];
-                        var dx = x2 - x1;
-                        var dy = y2 - y1;
-                        var r = Math.sqrt(dx * dx + dy * dy);
-                        context.moveTo(x1 + r, y1);
-                        context.arc(x1, y1, r, 0, 2 * Math.PI, true);
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.CLOSE_PATH:
-                        context.closePath();
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.CUSTOM:
-                        d = /** @type {number} */ (instruction[1]);
-                        dd = instruction[2];
-                        var geometry = /** @type {ol.geom.SimpleGeometry} */ (instruction[3]);
-                        var renderer = instruction[4];
-                        var fn = instruction.length == 6 ? instruction[5] : undefined;
-                        state.geometry = geometry;
-                        state.feature = feature;
-                        if (!(i in coordinateCache)) {
-                            coordinateCache[i] = [];
-                        }
-                        var coords = coordinateCache[i];
-                        if (fn) {
-                            fn(pixelCoordinates, d, dd, 2, coords);
-                        } else {
-                            coords[0] = pixelCoordinates[d];
-                            coords[1] = pixelCoordinates[d + 1];
-                            coords.length = 2;
-                        }
-                        renderer(coords, state);
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.DRAW_IMAGE:
-                        d = /** @type {number} */ (instruction[1]);
-                        dd = /** @type {number} */ (instruction[2]);
-                        image =  /** @type {HTMLCanvasElement|HTMLVideoElement|Image} */
-                            (instruction[3]);
-                        // Remaining arguments in DRAW_IMAGE are in alphabetical order
-                        anchorX = /** @type {number} */ (instruction[4]);
-                        anchorY = /** @type {number} */ (instruction[5]);
-                        declutterGroup = featureCallback ? null : /** @type {ol.DeclutterGroup} */ (instruction[6]);
-                        var height = /** @type {number} */ (instruction[7]);
-                        var opacity = /** @type {number} */ (instruction[8]);
-                        var originX = /** @type {number} */ (instruction[9]);
-                        var originY = /** @type {number} */ (instruction[10]);
-                        var rotateWithView = /** @type {boolean} */ (instruction[11]);
-                        var rotation = /** @type {number} */ (instruction[12]);
-                        var scale = /** @type {number} */ (instruction[13]);
-                        var snapToPixel = /** @type {boolean} */ (instruction[14]);
-                        var width = /** @type {number} */ (instruction[15]);
-
-                        var padding, backgroundFill, backgroundStroke;
-                        if (instruction.length > 16) {
-                            padding = /** @type {Array.<number>} */ (instruction[16]);
-                            backgroundFill = /** @type {boolean} */ (instruction[17]);
-                            backgroundStroke = /** @type {boolean} */ (instruction[18]);
-                        } else {
-                            padding = ol.render.canvas.defaultPadding;
-                            backgroundFill = backgroundStroke = false;
-                        }
-
-                        if (rotateWithView) {
-                            rotation += viewRotation;
-                        }
-                        for (; d < dd; d += 2) {
-                            this.replayImage_(context,
-                                pixelCoordinates[d], pixelCoordinates[d + 1], image, anchorX, anchorY,
-                                declutterGroup, height, opacity, originX, originY, rotation, scale,
-                                snapToPixel, width, padding,
-                                backgroundFill ? /** @type {Array.<*>} */ (lastFillInstruction) : null,
-                                backgroundStroke ? /** @type {Array.<*>} */ (lastStrokeInstruction) : null);
-                        }
-                        this.renderDeclutter_(declutterGroup, feature);
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.DRAW_CHARS:
-                        var begin = /** @type {number} */ (instruction[1]);
-                        var end = /** @type {number} */ (instruction[2]);
-                        var baseline = /** @type {number} */ (instruction[3]);
-                        declutterGroup = featureCallback ? null : /** @type {ol.DeclutterGroup} */ (instruction[4]);
-                        var overflow = /** @type {number} */ (instruction[5]);
-                        var fillKey = /** @type {string} */ (instruction[6]);
-                        var maxAngle = /** @type {number} */ (instruction[7]);
-                        var measure = /** @type {function(string):number} */ (instruction[8]);
-                        var offsetY = /** @type {number} */ (instruction[9]);
-                        var strokeKey = /** @type {string} */ (instruction[10]);
-                        var strokeWidth =  /** @type {number} */ (instruction[11]);
-                        var text = /** @type {string} */ (instruction[12]);
-                        var textKey = /** @type {string} */ (instruction[13]);
-                        var textScale = /** @type {number} */ (instruction[14]);
-
-                        var pathLength = ol.geom.flat.length.lineString(pixelCoordinates, begin, end, 2);
-                        var textLength = measure(text);
-                        if (overflow || textLength <= pathLength) {
-                            var textAlign = /** @type {ol.render.canvas.TextReplay} */ (this).textStates[textKey].textAlign;
-                            var startM = (pathLength - textLength) * ol.render.replay.TEXT_ALIGN[textAlign];
-                            var parts = ol.geom.flat.textpath.lineString(
-                                pixelCoordinates, begin, end, 2, text, measure, startM, maxAngle);
-                            if (parts) {
-                                var c, cc, chars, label, part;
-                                if (strokeKey) {
-                                    for (c = 0, cc = parts.length; c < cc; ++c) {
-                                        part = parts[c]; // x, y, anchorX, rotation, chunk
-                                        chars = /** @type {string} */ (part[4]);
-                                        label = /** @type {ol.render.canvas.TextReplay} */ (this).getImage(chars, textKey, '', strokeKey);
-                                        anchorX = /** @type {number} */ (part[2]) + strokeWidth;
-                                        anchorY = baseline * label.height + (0.5 - baseline) * 2 * strokeWidth - offsetY;
-                                        this.replayImage_(context,
-                                            /** @type {number} */ (part[0]), /** @type {number} */ (part[1]), label,
-                                            anchorX, anchorY, declutterGroup, label.height, 1, 0, 0,
-                                            /** @type {number} */ (part[3]), textScale, false, label.width,
-                                            ol.render.canvas.defaultPadding, null, null);
-                                    }
-                                }
-                                if (fillKey) {
-                                    for (c = 0, cc = parts.length; c < cc; ++c) {
-                                        part = parts[c]; // x, y, anchorX, rotation, chunk
-                                        chars = /** @type {string} */ (part[4]);
-                                        label = /** @type {ol.render.canvas.TextReplay} */ (this).getImage(chars, textKey, fillKey, '');
-                                        anchorX = /** @type {number} */ (part[2]);
-                                        anchorY = baseline * label.height - offsetY;
-                                        this.replayImage_(context,
-                                            /** @type {number} */ (part[0]), /** @type {number} */ (part[1]), label,
-                                            anchorX, anchorY, declutterGroup, label.height, 1, 0, 0,
-                                            /** @type {number} */ (part[3]), textScale, false, label.width,
-                                            ol.render.canvas.defaultPadding, null, null);
-                                    }
-                                }
-                            }
-                        }
-                        this.renderDeclutter_(declutterGroup, feature);
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.END_GEOMETRY:
-                        if (featureCallback !== undefined) {
-                            feature = /** @type {ol.Feature|ol.render.Feature} */ (instruction[1]);
-                            var result = featureCallback(feature);
-                            if (result) {
-                                return result;
-                            }
-                        }
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.FILL:
-                        if (batchSize) {
-                            pendingFill++;
-                        } else {
-                            this.fill_(context);
-                        }
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.MOVE_TO_LINE_TO:
-                        d = /** @type {number} */ (instruction[1]);
-                        dd = /** @type {number} */ (instruction[2]);
-                        x = pixelCoordinates[d];
-                        y = pixelCoordinates[d + 1];
-                        roundX = (x + 0.5) | 0;
-                        roundY = (y + 0.5) | 0;
-                        if (roundX !== prevX || roundY !== prevY) {
-                            context.moveTo(x, y);
-                            prevX = roundX;
-                            prevY = roundY;
-                        }
-                        for (d += 2; d < dd; d += 2) {
-                            x = pixelCoordinates[d];
-                            y = pixelCoordinates[d + 1];
-                            roundX = (x + 0.5) | 0;
-                            roundY = (y + 0.5) | 0;
-                            if (d == dd - 2 || roundX !== prevX || roundY !== prevY) {
-                                context.lineTo(x, y);
-                                prevX = roundX;
-                                prevY = roundY;
-                            }
-                        }
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.SET_FILL_STYLE:
-                        lastFillInstruction = instruction;
-                        this.fillOrigin_ = instruction[2];
-
-                        if (pendingFill) {
-                            this.fill_(context);
-                            pendingFill = 0;
-                            if (pendingStroke) {
-                                context.stroke();
-                                pendingStroke = 0;
-                            }
-                        }
-
-                        context.fillStyle = /** @type {ol.ColorLike} */ (instruction[1]);
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.SET_STROKE_STYLE:
-                        lastStrokeInstruction = instruction;
-                        if (pendingStroke) {
-                            context.stroke();
-                            pendingStroke = 0;
-                        }
-                        this.setStrokeStyle_(context, /** @type {Array.<*>} */ (instruction));
-                        ++i;
-                        break;
-                    case ol.render.canvas.Instruction.STROKE:
-                        if (batchSize) {
-                            pendingStroke++;
-                        } else {
-                            context.stroke();
-                        }
-                        ++i;
-                        break;
-                    default:
-                        ++i; // consume the instruction anyway, to avoid an infinite loop
-                        break;
-                }
-            }
-            if (pendingFill) {
-                this.fill_(context);
-            }
-            if (pendingStroke) {
-                context.stroke();
-            }
-            return undefined;
-        };
-
-
-        /**
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {ol.Transform} transform Transform.
-         * @param {number} viewRotation View rotation.
-         * @param {Object.<string, boolean>} skippedFeaturesHash Ids of features
-         *     to skip.
-         */
-        ol.render.canvas.Replay.prototype.replay = function(
-            context, transform, viewRotation, skippedFeaturesHash) {
-            this.viewRotation_ = viewRotation;
-            this.replay_(context, transform,
-                skippedFeaturesHash, this.instructions, undefined, undefined);
-        };
-
-
-        /**
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {ol.Transform} transform Transform.
-         * @param {number} viewRotation View rotation.
-         * @param {Object.<string, boolean>} skippedFeaturesHash Ids of features
-         *     to skip.
-         * @param {function((ol.Feature|ol.render.Feature)): T=} opt_featureCallback
-         *     Feature callback.
-         * @param {ol.Extent=} opt_hitExtent Only check features that intersect this
-         *     extent.
-         * @return {T|undefined} Callback result.
-         * @template T
-         */
-        ol.render.canvas.Replay.prototype.replayHitDetection = function(
-            context, transform, viewRotation, skippedFeaturesHash,
-            opt_featureCallback, opt_hitExtent) {
-            this.viewRotation_ = viewRotation;
-            return this.replay_(context, transform, skippedFeaturesHash,
-                this.hitDetectionInstructions, opt_featureCallback, opt_hitExtent);
-        };
-
-
-        /**
-         * Reverse the hit detection instructions.
-         */
-        ol.render.canvas.Replay.prototype.reverseHitDetectionInstructions = function() {
-            var hitDetectionInstructions = this.hitDetectionInstructions;
-            // step 1 - reverse array
-            hitDetectionInstructions.reverse();
-            // step 2 - reverse instructions within geometry blocks
-            var i;
-            var n = hitDetectionInstructions.length;
-            var instruction;
-            var type;
-            var begin = -1;
-            for (i = 0; i < n; ++i) {
-                instruction = hitDetectionInstructions[i];
-                type = /** @type {ol.render.canvas.Instruction} */ (instruction[0]);
-                if (type == ol.render.canvas.Instruction.END_GEOMETRY) {
-                    begin = i;
-                } else if (type == ol.render.canvas.Instruction.BEGIN_GEOMETRY) {
-                    instruction[2] = i;
-                    ol.array.reverseSubArray(this.hitDetectionInstructions, begin, i);
-                    begin = -1;
-                }
-            }
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.Replay.prototype.setFillStrokeStyle = function(fillStyle, strokeStyle) {
-            var state = this.state;
-            if (fillStyle) {
-                var fillStyleColor = fillStyle.getColor();
-                state.fillStyle = ol.colorlike.asColorLike(fillStyleColor ?
-                    fillStyleColor : ol.render.canvas.defaultFillStyle);
-            } else {
-                state.fillStyle = undefined;
-            }
-            if (strokeStyle) {
-                var strokeStyleColor = strokeStyle.getColor();
-                state.strokeStyle = ol.colorlike.asColorLike(strokeStyleColor ?
-                    strokeStyleColor : ol.render.canvas.defaultStrokeStyle);
-                var strokeStyleLineCap = strokeStyle.getLineCap();
-                state.lineCap = strokeStyleLineCap !== undefined ?
-                    strokeStyleLineCap : ol.render.canvas.defaultLineCap;
-                var strokeStyleLineDash = strokeStyle.getLineDash();
-                state.lineDash = strokeStyleLineDash ?
-                    strokeStyleLineDash.slice() : ol.render.canvas.defaultLineDash;
-                var strokeStyleLineDashOffset = strokeStyle.getLineDashOffset();
-                state.lineDashOffset = strokeStyleLineDashOffset ?
-                    strokeStyleLineDashOffset : ol.render.canvas.defaultLineDashOffset;
-                var strokeStyleLineJoin = strokeStyle.getLineJoin();
-                state.lineJoin = strokeStyleLineJoin !== undefined ?
-                    strokeStyleLineJoin : ol.render.canvas.defaultLineJoin;
-                var strokeStyleWidth = strokeStyle.getWidth();
-                state.lineWidth = strokeStyleWidth !== undefined ?
-                    strokeStyleWidth : ol.render.canvas.defaultLineWidth;
-                var strokeStyleMiterLimit = strokeStyle.getMiterLimit();
-                state.miterLimit = strokeStyleMiterLimit !== undefined ?
-                    strokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit;
-
-                if (state.lineWidth > this.maxLineWidth) {
-                    this.maxLineWidth = state.lineWidth;
-                    // invalidate the buffered max extent cache
-                    this.bufferedMaxExtent_ = null;
-                }
-            } else {
-                state.strokeStyle = undefined;
-                state.lineCap = undefined;
-                state.lineDash = null;
-                state.lineDashOffset = undefined;
-                state.lineJoin = undefined;
-                state.lineWidth = undefined;
-                state.miterLimit = undefined;
-            }
-        };
-
-
-        /**
-         * @param {ol.CanvasFillStrokeState} state State.
-         * @param {ol.geom.Geometry|ol.render.Feature} geometry Geometry.
-         */
-        ol.render.canvas.Replay.prototype.applyFill = function(state, geometry) {
-            var fillStyle = state.fillStyle;
-            var fillInstruction = [ol.render.canvas.Instruction.SET_FILL_STYLE, fillStyle];
-            if (typeof fillStyle !== 'string') {
-                var fillExtent = geometry.getExtent();
-                fillInstruction.push([fillExtent[0], fillExtent[3]]);
-            }
-            this.instructions.push(fillInstruction);
-        };
-
-
-        /**
-         * @param {ol.CanvasFillStrokeState} state State.
-         */
-        ol.render.canvas.Replay.prototype.applyStroke = function(state) {
-            this.instructions.push([
-                ol.render.canvas.Instruction.SET_STROKE_STYLE,
-                state.strokeStyle, state.lineWidth * this.pixelRatio, state.lineCap,
-                state.lineJoin, state.miterLimit,
-                this.applyPixelRatio(state.lineDash), state.lineDashOffset * this.pixelRatio
-            ]);
-        };
-
-
-        /**
-         * @param {ol.CanvasFillStrokeState} state State.
-         * @param {function(this:ol.render.canvas.Replay, ol.CanvasFillStrokeState, (ol.geom.Geometry|ol.render.Feature))} applyFill Apply fill.
-         * @param {ol.geom.Geometry|ol.render.Feature} geometry Geometry.
-         */
-        ol.render.canvas.Replay.prototype.updateFillStyle = function(state, applyFill, geometry) {
-            var fillStyle = state.fillStyle;
-            if (typeof fillStyle !== 'string' || state.currentFillStyle != fillStyle) {
-                applyFill.call(this, state, geometry);
-                state.currentFillStyle = fillStyle;
-            }
-        };
-
-
-        /**
-         * @param {ol.CanvasFillStrokeState} state State.
-         * @param {function(this:ol.render.canvas.Replay, ol.CanvasFillStrokeState)} applyStroke Apply stroke.
-         */
-        ol.render.canvas.Replay.prototype.updateStrokeStyle = function(state, applyStroke) {
-            var strokeStyle = state.strokeStyle;
-            var lineCap = state.lineCap;
-            var lineDash = state.lineDash;
-            var lineDashOffset = state.lineDashOffset;
-            var lineJoin = state.lineJoin;
-            var lineWidth = state.lineWidth;
-            var miterLimit = state.miterLimit;
-            if (state.currentStrokeStyle != strokeStyle ||
-                state.currentLineCap != lineCap ||
-                (lineDash != state.currentLineDash && !ol.array.equals(state.currentLineDash, lineDash)) ||
-                state.currentLineDashOffset != lineDashOffset ||
-                state.currentLineJoin != lineJoin ||
-                state.currentLineWidth != lineWidth ||
-                state.currentMiterLimit != miterLimit) {
-                applyStroke.call(this, state);
-                state.currentStrokeStyle = strokeStyle;
-                state.currentLineCap = lineCap;
-                state.currentLineDash = lineDash;
-                state.currentLineDashOffset = lineDashOffset;
-                state.currentLineJoin = lineJoin;
-                state.currentLineWidth = lineWidth;
-                state.currentMiterLimit = miterLimit;
-            }
-        };
-
-
-        /**
-         * @param {ol.geom.Geometry|ol.render.Feature} geometry Geometry.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         */
-        ol.render.canvas.Replay.prototype.endGeometry = function(geometry, feature) {
-            this.beginGeometryInstruction1_[2] = this.instructions.length;
-            this.beginGeometryInstruction1_ = null;
-            this.beginGeometryInstruction2_[2] = this.hitDetectionInstructions.length;
-            this.beginGeometryInstruction2_ = null;
-            var endGeometryInstruction =
-                [ol.render.canvas.Instruction.END_GEOMETRY, feature];
-            this.instructions.push(endGeometryInstruction);
-            this.hitDetectionInstructions.push(endGeometryInstruction);
-        };
-
-
-        /**
-         * FIXME empty description for jsdoc
-         */
-        ol.render.canvas.Replay.prototype.finish = ol.nullFunction;
-
-
-        /**
-         * Get the buffered rendering extent.  Rendering will be clipped to the extent
-         * provided to the constructor.  To account for symbolizers that may intersect
-         * this extent, we calculate a buffered extent (e.g. based on stroke width).
-         * @return {ol.Extent} The buffered rendering extent.
-         * @protected
-         */
-        ol.render.canvas.Replay.prototype.getBufferedMaxExtent = function() {
-            if (!this.bufferedMaxExtent_) {
-                this.bufferedMaxExtent_ = ol.extent.clone(this.maxExtent);
-                if (this.maxLineWidth > 0) {
-                    var width = this.resolution * (this.maxLineWidth + 1) / 2;
-                    ol.extent.buffer(this.bufferedMaxExtent_, width, this.bufferedMaxExtent_);
-                }
-            }
-            return this.bufferedMaxExtent_;
-        };
-
-        /**
-         * @constructor
-         * @extends {ol.render.canvas.Replay}
-         * @param {number} tolerance Tolerance.
-         * @param {ol.Extent} maxExtent Maximum extent.
-         * @param {number} resolution Resolution.
-         * @param {number} pixelRatio Pixel ratio.
-         * @param {boolean} overlaps The replay can have overlapping geometries.
-         * @param {?} declutterTree Declutter tree.
-         * @struct
-         */
-        ol.render.canvas.ImageReplay = function(
-            tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree) {
-            ol.render.canvas.Replay.call(this,
-                tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree);
-
-            /**
-             * @private
-             * @type {ol.DeclutterGroup}
-             */
-            this.declutterGroup_ = null;
-
-            /**
-             * @private
-             * @type {HTMLCanvasElement|HTMLVideoElement|Image}
-             */
-            this.hitDetectionImage_ = null;
-
-            /**
-             * @private
-             * @type {HTMLCanvasElement|HTMLVideoElement|Image}
-             */
-            this.image_ = null;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.anchorX_ = undefined;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.anchorY_ = undefined;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.height_ = undefined;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.opacity_ = undefined;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.originX_ = undefined;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.originY_ = undefined;
-
-            /**
-             * @private
-             * @type {boolean|undefined}
-             */
-            this.rotateWithView_ = undefined;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.rotation_ = undefined;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.scale_ = undefined;
-
-            /**
-             * @private
-             * @type {boolean|undefined}
-             */
-            this.snapToPixel_ = undefined;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.width_ = undefined;
-
-        };
-        ol.inherits(ol.render.canvas.ImageReplay, ol.render.canvas.Replay);
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @private
-         * @return {number} My end.
-         */
-        ol.render.canvas.ImageReplay.prototype.drawCoordinates_ = function(flatCoordinates, offset, end, stride) {
-            return this.appendFlatCoordinates(
-                flatCoordinates, offset, end, stride, false, false);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.ImageReplay.prototype.drawPoint = function(pointGeometry, feature) {
-            if (!this.image_) {
-                return;
-            }
-            this.beginGeometry(pointGeometry, feature);
-            var flatCoordinates = pointGeometry.getFlatCoordinates();
-            var stride = pointGeometry.getStride();
-            var myBegin = this.coordinates.length;
-            var myEnd = this.drawCoordinates_(
-                flatCoordinates, 0, flatCoordinates.length, stride);
-            this.instructions.push([
-                ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.image_,
-                // Remaining arguments to DRAW_IMAGE are in alphabetical order
-                this.anchorX_, this.anchorY_, this.declutterGroup_, this.height_, this.opacity_,
-                this.originX_, this.originY_, this.rotateWithView_, this.rotation_,
-                this.scale_ * this.pixelRatio, this.snapToPixel_, this.width_
-            ]);
-            this.hitDetectionInstructions.push([
-                ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd,
-                this.hitDetectionImage_,
-                // Remaining arguments to DRAW_IMAGE are in alphabetical order
-                this.anchorX_, this.anchorY_, this.declutterGroup_, this.height_, this.opacity_,
-                this.originX_, this.originY_, this.rotateWithView_, this.rotation_,
-                this.scale_, this.snapToPixel_, this.width_
-            ]);
-            this.endGeometry(pointGeometry, feature);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.ImageReplay.prototype.drawMultiPoint = function(multiPointGeometry, feature) {
-            if (!this.image_) {
-                return;
-            }
-            this.beginGeometry(multiPointGeometry, feature);
-            var flatCoordinates = multiPointGeometry.getFlatCoordinates();
-            var stride = multiPointGeometry.getStride();
-            var myBegin = this.coordinates.length;
-            var myEnd = this.drawCoordinates_(
-                flatCoordinates, 0, flatCoordinates.length, stride);
-            this.instructions.push([
-                ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.image_,
-                // Remaining arguments to DRAW_IMAGE are in alphabetical order
-                this.anchorX_, this.anchorY_, this.declutterGroup_, this.height_, this.opacity_,
-                this.originX_, this.originY_, this.rotateWithView_, this.rotation_,
-                this.scale_ * this.pixelRatio, this.snapToPixel_, this.width_
-            ]);
-            this.hitDetectionInstructions.push([
-                ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd,
-                this.hitDetectionImage_,
-                // Remaining arguments to DRAW_IMAGE are in alphabetical order
-                this.anchorX_, this.anchorY_, this.declutterGroup_, this.height_, this.opacity_,
-                this.originX_, this.originY_, this.rotateWithView_, this.rotation_,
-                this.scale_, this.snapToPixel_, this.width_
-            ]);
-            this.endGeometry(multiPointGeometry, feature);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.ImageReplay.prototype.finish = function() {
-            this.reverseHitDetectionInstructions();
-            // FIXME this doesn't really protect us against further calls to draw*Geometry
-            this.anchorX_ = undefined;
-            this.anchorY_ = undefined;
-            this.hitDetectionImage_ = null;
-            this.image_ = null;
-            this.height_ = undefined;
-            this.scale_ = undefined;
-            this.opacity_ = undefined;
-            this.originX_ = undefined;
-            this.originY_ = undefined;
-            this.rotateWithView_ = undefined;
-            this.rotation_ = undefined;
-            this.snapToPixel_ = undefined;
-            this.width_ = undefined;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.ImageReplay.prototype.setImageStyle = function(imageStyle, declutterGroup) {
-            var anchor = imageStyle.getAnchor();
-            var size = imageStyle.getSize();
-            var hitDetectionImage = imageStyle.getHitDetectionImage(1);
-            var image = imageStyle.getImage(1);
-            var origin = imageStyle.getOrigin();
-            this.anchorX_ = anchor[0];
-            this.anchorY_ = anchor[1];
-            this.declutterGroup_ = /** @type {ol.DeclutterGroup} */ (declutterGroup);
-            this.hitDetectionImage_ = hitDetectionImage;
-            this.image_ = image;
-            this.height_ = size[1];
-            this.opacity_ = imageStyle.getOpacity();
-            this.originX_ = origin[0];
-            this.originY_ = origin[1];
-            this.rotateWithView_ = imageStyle.getRotateWithView();
-            this.rotation_ = imageStyle.getRotation();
-            this.scale_ = imageStyle.getScale();
-            this.snapToPixel_ = imageStyle.getSnapToPixel();
-            this.width_ = size[0];
-        };
-
-        /**
-         * @constructor
-         * @extends {ol.render.canvas.Replay}
-         * @param {number} tolerance Tolerance.
-         * @param {ol.Extent} maxExtent Maximum extent.
-         * @param {number} resolution Resolution.
-         * @param {number} pixelRatio Pixel ratio.
-         * @param {boolean} overlaps The replay can have overlapping geometries.
-         * @param {?} declutterTree Declutter tree.
-         * @struct
-         */
-        ol.render.canvas.LineStringReplay = function(
-            tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree) {
-            ol.render.canvas.Replay.call(this,
-                tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree);
-        };
-        ol.inherits(ol.render.canvas.LineStringReplay, ol.render.canvas.Replay);
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {number} end End.
-         * @param {number} stride Stride.
-         * @private
-         * @return {number} end.
-         */
-        ol.render.canvas.LineStringReplay.prototype.drawFlatCoordinates_ = function(flatCoordinates, offset, end, stride) {
-            var myBegin = this.coordinates.length;
-            var myEnd = this.appendFlatCoordinates(
-                flatCoordinates, offset, end, stride, false, false);
-            var moveToLineToInstruction =
-                [ol.render.canvas.Instruction.MOVE_TO_LINE_TO, myBegin, myEnd];
-            this.instructions.push(moveToLineToInstruction);
-            this.hitDetectionInstructions.push(moveToLineToInstruction);
-            return end;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.LineStringReplay.prototype.drawLineString = function(lineStringGeometry, feature) {
-            var state = this.state;
-            var strokeStyle = state.strokeStyle;
-            var lineWidth = state.lineWidth;
-            if (strokeStyle === undefined || lineWidth === undefined) {
-                return;
-            }
-            this.updateStrokeStyle(state, this.applyStroke);
-            this.beginGeometry(lineStringGeometry, feature);
-            this.hitDetectionInstructions.push([
-                ol.render.canvas.Instruction.SET_STROKE_STYLE,
-                state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
-                state.miterLimit, state.lineDash, state.lineDashOffset
-            ], [
-                ol.render.canvas.Instruction.BEGIN_PATH
-            ]);
-            var flatCoordinates = lineStringGeometry.getFlatCoordinates();
-            var stride = lineStringGeometry.getStride();
-            this.drawFlatCoordinates_(flatCoordinates, 0, flatCoordinates.length, stride);
-            this.hitDetectionInstructions.push([ol.render.canvas.Instruction.STROKE]);
-            this.endGeometry(lineStringGeometry, feature);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.LineStringReplay.prototype.drawMultiLineString = function(multiLineStringGeometry, feature) {
-            var state = this.state;
-            var strokeStyle = state.strokeStyle;
-            var lineWidth = state.lineWidth;
-            if (strokeStyle === undefined || lineWidth === undefined) {
-                return;
-            }
-            this.updateStrokeStyle(state, this.applyStroke);
-            this.beginGeometry(multiLineStringGeometry, feature);
-            this.hitDetectionInstructions.push([
-                ol.render.canvas.Instruction.SET_STROKE_STYLE,
-                state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
-                state.miterLimit, state.lineDash, state.lineDashOffset
-            ], [
-                ol.render.canvas.Instruction.BEGIN_PATH
-            ]);
-            var ends = multiLineStringGeometry.getEnds();
-            var flatCoordinates = multiLineStringGeometry.getFlatCoordinates();
-            var stride = multiLineStringGeometry.getStride();
-            var offset = 0;
-            var i, ii;
-            for (i = 0, ii = ends.length; i < ii; ++i) {
-                offset = this.drawFlatCoordinates_(
-                    flatCoordinates, offset, ends[i], stride);
-            }
-            this.hitDetectionInstructions.push([ol.render.canvas.Instruction.STROKE]);
-            this.endGeometry(multiLineStringGeometry, feature);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.LineStringReplay.prototype.finish = function() {
-            var state = this.state;
-            if (state.lastStroke != undefined && state.lastStroke != this.coordinates.length) {
-                this.instructions.push([ol.render.canvas.Instruction.STROKE]);
-            }
-            this.reverseHitDetectionInstructions();
-            this.state = null;
-        };
-
-
-        /**
-         * @inheritDoc.
-         */
-        ol.render.canvas.LineStringReplay.prototype.applyStroke = function(state) {
-            if (state.lastStroke != undefined && state.lastStroke != this.coordinates.length) {
-                this.instructions.push([ol.render.canvas.Instruction.STROKE]);
-                state.lastStroke = this.coordinates.length;
-            }
-            state.lastStroke = 0;
-            ol.render.canvas.Replay.prototype.applyStroke.call(this, state);
-            this.instructions.push([ol.render.canvas.Instruction.BEGIN_PATH]);
-        };
-
-        /**
-         * @constructor
-         * @extends {ol.render.canvas.Replay}
-         * @param {number} tolerance Tolerance.
-         * @param {ol.Extent} maxExtent Maximum extent.
-         * @param {number} resolution Resolution.
-         * @param {number} pixelRatio Pixel ratio.
-         * @param {boolean} overlaps The replay can have overlapping geometries.
-         * @param {?} declutterTree Declutter tree.
-         * @struct
-         */
-        ol.render.canvas.PolygonReplay = function(
-            tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree) {
-            ol.render.canvas.Replay.call(this,
-                tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree);
-        };
-        ol.inherits(ol.render.canvas.PolygonReplay, ol.render.canvas.Replay);
-
-
-        /**
-         * @param {Array.<number>} flatCoordinates Flat coordinates.
-         * @param {number} offset Offset.
-         * @param {Array.<number>} ends Ends.
-         * @param {number} stride Stride.
-         * @private
-         * @return {number} End.
-         */
-        ol.render.canvas.PolygonReplay.prototype.drawFlatCoordinatess_ = function(flatCoordinates, offset, ends, stride) {
-            var state = this.state;
-            var fill = state.fillStyle !== undefined;
-            var stroke = state.strokeStyle != undefined;
-            var numEnds = ends.length;
-            var beginPathInstruction = [ol.render.canvas.Instruction.BEGIN_PATH];
-            this.instructions.push(beginPathInstruction);
-            this.hitDetectionInstructions.push(beginPathInstruction);
-            for (var i = 0; i < numEnds; ++i) {
-                var end = ends[i];
-                var myBegin = this.coordinates.length;
-                var myEnd = this.appendFlatCoordinates(
-                    flatCoordinates, offset, end, stride, true, !stroke);
-                var moveToLineToInstruction =
-                    [ol.render.canvas.Instruction.MOVE_TO_LINE_TO, myBegin, myEnd];
-                this.instructions.push(moveToLineToInstruction);
-                this.hitDetectionInstructions.push(moveToLineToInstruction);
-                if (stroke) {
-                    // Performance optimization: only call closePath() when we have a stroke.
-                    // Otherwise the ring is closed already (see appendFlatCoordinates above).
-                    var closePathInstruction = [ol.render.canvas.Instruction.CLOSE_PATH];
-                    this.instructions.push(closePathInstruction);
-                    this.hitDetectionInstructions.push(closePathInstruction);
-                }
-                offset = end;
-            }
-            var fillInstruction = [ol.render.canvas.Instruction.FILL];
-            this.hitDetectionInstructions.push(fillInstruction);
-            if (fill) {
-                this.instructions.push(fillInstruction);
-            }
-            if (stroke) {
-                var strokeInstruction = [ol.render.canvas.Instruction.STROKE];
-                this.instructions.push(strokeInstruction);
-                this.hitDetectionInstructions.push(strokeInstruction);
-            }
-            return offset;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.PolygonReplay.prototype.drawCircle = function(circleGeometry, feature) {
-            var state = this.state;
-            var fillStyle = state.fillStyle;
-            var strokeStyle = state.strokeStyle;
-            if (fillStyle === undefined && strokeStyle === undefined) {
-                return;
-            }
-            this.setFillStrokeStyles_(circleGeometry);
-            this.beginGeometry(circleGeometry, feature);
-            // always fill the circle for hit detection
-            this.hitDetectionInstructions.push([
-                ol.render.canvas.Instruction.SET_FILL_STYLE,
-                ol.color.asString(ol.render.canvas.defaultFillStyle)
-            ]);
-            if (state.strokeStyle !== undefined) {
-                this.hitDetectionInstructions.push([
-                    ol.render.canvas.Instruction.SET_STROKE_STYLE,
-                    state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
-                    state.miterLimit, state.lineDash, state.lineDashOffset
-                ]);
-            }
-            var flatCoordinates = circleGeometry.getFlatCoordinates();
-            var stride = circleGeometry.getStride();
-            var myBegin = this.coordinates.length;
-            this.appendFlatCoordinates(
-                flatCoordinates, 0, flatCoordinates.length, stride, false, false);
-            var beginPathInstruction = [ol.render.canvas.Instruction.BEGIN_PATH];
-            var circleInstruction = [ol.render.canvas.Instruction.CIRCLE, myBegin];
-            this.instructions.push(beginPathInstruction, circleInstruction);
-            this.hitDetectionInstructions.push(beginPathInstruction, circleInstruction);
-            var fillInstruction = [ol.render.canvas.Instruction.FILL];
-            this.hitDetectionInstructions.push(fillInstruction);
-            if (state.fillStyle !== undefined) {
-                this.instructions.push(fillInstruction);
-            }
-            if (state.strokeStyle !== undefined) {
-                var strokeInstruction = [ol.render.canvas.Instruction.STROKE];
-                this.instructions.push(strokeInstruction);
-                this.hitDetectionInstructions.push(strokeInstruction);
-            }
-            this.endGeometry(circleGeometry, feature);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.PolygonReplay.prototype.drawPolygon = function(polygonGeometry, feature) {
-            var state = this.state;
-            this.setFillStrokeStyles_(polygonGeometry);
-            this.beginGeometry(polygonGeometry, feature);
-            // always fill the polygon for hit detection
-            this.hitDetectionInstructions.push([
-                ol.render.canvas.Instruction.SET_FILL_STYLE,
-                ol.color.asString(ol.render.canvas.defaultFillStyle)]
-            );
-            if (state.strokeStyle !== undefined) {
-                this.hitDetectionInstructions.push([
-                    ol.render.canvas.Instruction.SET_STROKE_STYLE,
-                    state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
-                    state.miterLimit, state.lineDash, state.lineDashOffset
-                ]);
-            }
-            var ends = polygonGeometry.getEnds();
-            var flatCoordinates = polygonGeometry.getOrientedFlatCoordinates();
-            var stride = polygonGeometry.getStride();
-            this.drawFlatCoordinatess_(flatCoordinates, 0, ends, stride);
-            this.endGeometry(polygonGeometry, feature);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.PolygonReplay.prototype.drawMultiPolygon = function(multiPolygonGeometry, feature) {
-            var state = this.state;
-            var fillStyle = state.fillStyle;
-            var strokeStyle = state.strokeStyle;
-            if (fillStyle === undefined && strokeStyle === undefined) {
-                return;
-            }
-            this.setFillStrokeStyles_(multiPolygonGeometry);
-            this.beginGeometry(multiPolygonGeometry, feature);
-            // always fill the multi-polygon for hit detection
-            this.hitDetectionInstructions.push([
-                ol.render.canvas.Instruction.SET_FILL_STYLE,
-                ol.color.asString(ol.render.canvas.defaultFillStyle)
-            ]);
-            if (state.strokeStyle !== undefined) {
-                this.hitDetectionInstructions.push([
-                    ol.render.canvas.Instruction.SET_STROKE_STYLE,
-                    state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
-                    state.miterLimit, state.lineDash, state.lineDashOffset
-                ]);
-            }
-            var endss = multiPolygonGeometry.getEndss();
-            var flatCoordinates = multiPolygonGeometry.getOrientedFlatCoordinates();
-            var stride = multiPolygonGeometry.getStride();
-            var offset = 0;
-            var i, ii;
-            for (i = 0, ii = endss.length; i < ii; ++i) {
-                offset = this.drawFlatCoordinatess_(
-                    flatCoordinates, offset, endss[i], stride);
-            }
-            this.endGeometry(multiPolygonGeometry, feature);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.PolygonReplay.prototype.finish = function() {
-            this.reverseHitDetectionInstructions();
-            this.state = null;
-            // We want to preserve topology when drawing polygons.  Polygons are
-            // simplified using quantization and point elimination. However, we might
-            // have received a mix of quantized and non-quantized geometries, so ensure
-            // that all are quantized by quantizing all coordinates in the batch.
-            var tolerance = this.tolerance;
-            if (tolerance !== 0) {
-                var coordinates = this.coordinates;
-                var i, ii;
-                for (i = 0, ii = coordinates.length; i < ii; ++i) {
-                    coordinates[i] = ol.geom.flat.simplify.snap(coordinates[i], tolerance);
-                }
-            }
-        };
-
-
-        /**
-         * @private
-         * @param {ol.geom.Geometry|ol.render.Feature} geometry Geometry.
-         */
-        ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyles_ = function(geometry) {
-            var state = this.state;
-            var fillStyle = state.fillStyle;
-            if (fillStyle !== undefined) {
-                this.updateFillStyle(state, this.applyFill, geometry);
-            }
-            if (state.strokeStyle !== undefined) {
-                this.updateStrokeStyle(state, this.applyStroke);
-            }
-        };
-
-        ol.geom.flat.straightchunk = {};
-        ol.geom.flat.straightchunk.lineString = function(maxAngle, flatCoordinates, offset, end, stride) {
-            var chunkStart = offset;
-            var chunkEnd = offset;
-            var chunkM = 0;
-            var m = 0;
-            var start = offset;
-            var acos, i, m12, m23, x1, y1, x12, y12, x23, y23;
-            for (i = offset; i < end; i += stride) {
-                var x2 = flatCoordinates[i];
-                var y2 = flatCoordinates[i + 1];
-                if (x1 !== undefined) {
-                    x23 = x2 - x1;
-                    y23 = y2 - y1;
-                    m23 = Math.sqrt(x23 * x23 + y23 * y23);
-                    if (x12 !== undefined) {
-                        m += m12;
-                        acos = Math.acos((x12 * x23 + y12 * y23) / (m12 * m23));
-                        if (acos > maxAngle) {
-                            if (m > chunkM) {
-                                chunkM = m;
-                                chunkStart = start;
-                                chunkEnd = i;
-                            }
-                            m = 0;
-                            start = i - stride;
-                        }
-                    }
-                    m12 = m23;
-                    x12 = x23;
-                    y12 = y23;
-                }
-                x1 = x2;
-                y1 = y2;
-            }
-            m += m23;
-            return m > chunkM ? [start, i] : [chunkStart, chunkEnd];
-        };
-
-        ol.style.TextPlacement = {
-            POINT: 'point',
-            LINE: 'line'
-        };
-
-        ol.render.canvas.TextReplay = function(
-            tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree) {
-            ol.render.canvas.Replay.call(this,
-                tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree);
-
-            /**
-             * @private
-             * @type {ol.DeclutterGroup}
-             */
-            this.declutterGroup_;
-
-            /**
-             * @private
-             * @type {Array.<HTMLCanvasElement>}
-             */
-            this.labels_ = null;
-
-            /**
-             * @private
-             * @type {string}
-             */
-            this.text_ = '';
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.textOffsetX_ = 0;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.textOffsetY_ = 0;
-
-            /**
-             * @private
-             * @type {boolean|undefined}
-             */
-            this.textRotateWithView_ = undefined;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.textRotation_ = 0;
-
-            /**
-             * @private
-             * @type {?ol.CanvasFillState}
-             */
-            this.textFillState_ = null;
-
-            /**
-             * @type {Object.<string, ol.CanvasFillState>}
-             */
-            this.fillStates = {};
-
-            /**
-             * @private
-             * @type {?ol.CanvasStrokeState}
-             */
-            this.textStrokeState_ = null;
-
-            /**
-             * @type {Object.<string, ol.CanvasStrokeState>}
-             */
-            this.strokeStates = {};
-
-            /**
-             * @private
-             * @type {ol.CanvasTextState}
-             */
-            this.textState_ = /** @type {ol.CanvasTextState} */ ({});
-
-            /**
-             * @type {Object.<string, ol.CanvasTextState>}
-             */
-            this.textStates = {};
-
-            /**
-             * @private
-             * @type {string}
-             */
-            this.textKey_ = '';
-
-            /**
-             * @private
-             * @type {string}
-             */
-            this.fillKey_ = '';
-
-            /**
-             * @private
-             * @type {string}
-             */
-            this.strokeKey_ = '';
-
-            /**
-             * @private
-             * @type {Object.<string, Object.<string, number>>}
-             */
-            this.widths_ = {};
-
-            var labelCache = ol.render.canvas.labelCache;
-            labelCache.prune();
-
-        };
-        ol.inherits(ol.render.canvas.TextReplay, ol.render.canvas.Replay);
-
-
-        /**
-         * @param {string} font Font to use for measuring.
-         * @param {Array.<string>} lines Lines to measure.
-         * @param {Array.<number>} widths Array will be populated with the widths of
-         * each line.
-         * @return {number} Width of the whole text.
-         */
-        ol.render.canvas.TextReplay.measureTextWidths = function(font, lines, widths) {
-            var numLines = lines.length;
-            var width = 0;
-            var currentWidth, i;
-            for (i = 0; i < numLines; ++i) {
-                currentWidth = ol.render.canvas.measureTextWidth(font, lines[i]);
-                width = Math.max(width, currentWidth);
-                widths.push(currentWidth);
-            }
-            return width;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.TextReplay.prototype.drawText = function(geometry, feature) {
-            var fillState = this.textFillState_;
-            var strokeState = this.textStrokeState_;
-            var textState = this.textState_;
-            if (this.text_ === '' || !textState || (!fillState && !strokeState)) {
-                return;
-            }
-
-            var begin = this.coordinates.length;
-
-            var geometryType = geometry.getType();
-            var flatCoordinates = null;
-            var end = 2;
-            var stride = 2;
-            var i, ii;
-
-            if (textState.placement === ol.style.TextPlacement.LINE) {
-                if (!ol.extent.intersects(this.getBufferedMaxExtent(), geometry.getExtent())) {
-                    return;
-                }
-                var ends;
-                flatCoordinates = geometry.getFlatCoordinates();
-                stride = geometry.getStride();
-                if (geometryType == ol.geom.GeometryType.LINE_STRING) {
-                    ends = [flatCoordinates.length];
-                } else if (geometryType == ol.geom.GeometryType.MULTI_LINE_STRING) {
-                    ends = geometry.getEnds();
-                } else if (geometryType == ol.geom.GeometryType.POLYGON) {
-                    ends = geometry.getEnds().slice(0, 1);
-                } else if (geometryType == ol.geom.GeometryType.MULTI_POLYGON) {
-                    var endss = geometry.getEndss();
-                    ends = [];
-                    for (i = 0, ii = endss.length; i < ii; ++i) {
-                        ends.push(endss[i][0]);
-                    }
-                }
-                this.beginGeometry(geometry, feature);
-                var textAlign = textState.textAlign;
-                var flatOffset = 0;
-                var flatEnd;
-                for (var o = 0, oo = ends.length; o < oo; ++o) {
-                    if (textAlign == undefined) {
-                        var range = ol.geom.flat.straightchunk.lineString(
-                            textState.maxAngle, flatCoordinates, flatOffset, ends[o], stride);
-                        flatOffset = range[0];
-                        flatEnd = range[1];
-                    } else {
-                        flatEnd = ends[o];
-                    }
-                    for (i = flatOffset; i < flatEnd; i += stride) {
-                        this.coordinates.push(flatCoordinates[i], flatCoordinates[i + 1]);
-                    }
-                    end = this.coordinates.length;
-                    flatOffset = ends[o];
-                    this.drawChars_(begin, end, this.declutterGroup_);
-                    begin = end;
-                }
-                this.endGeometry(geometry, feature);
-
-            } else {
-                var label = this.getImage(this.text_, this.textKey_, this.fillKey_, this.strokeKey_);
-                var width = label.width / this.pixelRatio;
-                switch (geometryType) {
-                    case ol.geom.GeometryType.POINT:
-                    case ol.geom.GeometryType.MULTI_POINT:
-                        flatCoordinates = geometry.getFlatCoordinates();
-                        end = flatCoordinates.length;
-                        break;
-                    case ol.geom.GeometryType.LINE_STRING:
-                        flatCoordinates = /** @type {ol.geom.LineString} */ (geometry).getFlatMidpoint();
-                        break;
-                    case ol.geom.GeometryType.CIRCLE:
-                        flatCoordinates = /** @type {ol.geom.Circle} */ (geometry).getCenter();
-                        break;
-                    case ol.geom.GeometryType.MULTI_LINE_STRING:
-                        flatCoordinates = /** @type {ol.geom.MultiLineString} */ (geometry).getFlatMidpoints();
-                        end = flatCoordinates.length;
-                        break;
-                    case ol.geom.GeometryType.POLYGON:
-                        flatCoordinates = /** @type {ol.geom.Polygon} */ (geometry).getFlatInteriorPoint();
-                        if (!textState.overflow && flatCoordinates[2] / this.resolution < width) {
-                            return;
-                        }
-                        stride = 3;
-                        break;
-                    case ol.geom.GeometryType.MULTI_POLYGON:
-                        var interiorPoints = /** @type {ol.geom.MultiPolygon} */ (geometry).getFlatInteriorPoints();
-                        flatCoordinates = [];
-                        for (i = 0, ii = interiorPoints.length; i < ii; i += 3) {
-                            if (textState.overflow || interiorPoints[i + 2] / this.resolution >= width) {
-                                flatCoordinates.push(interiorPoints[i], interiorPoints[i + 1]);
-                            }
-                        }
-                        end = flatCoordinates.length;
-                        if (end == 0) {
-                            return;
-                        }
-                        break;
-                }
-                end = this.appendFlatCoordinates(flatCoordinates, 0, end, stride, false, false);
-                this.beginGeometry(geometry, feature);
-                if (textState.backgroundFill || textState.backgroundStroke) {
-                    this.setFillStrokeStyle(textState.backgroundFill, textState.backgroundStroke);
-                    this.updateFillStyle(this.state, this.applyFill, geometry);
-                    this.updateStrokeStyle(this.state, this.applyStroke);
-                }
-                this.drawTextImage_(label, begin, end);
-                this.endGeometry(geometry, feature);
-            }
-        };
-
-
-        /**
-         * @param {string} text Text.
-         * @param {string} textKey Text style key.
-         * @param {string} fillKey Fill style key.
-         * @param {string} strokeKey Stroke style key.
-         * @return {HTMLCanvasElement} Image.
-         */
-        ol.render.canvas.TextReplay.prototype.getImage = function(text, textKey, fillKey, strokeKey) {
-            var label;
-            var key = strokeKey + textKey + text + fillKey + this.pixelRatio;
-
-            var labelCache = ol.render.canvas.labelCache;
-            if (!labelCache.containsKey(key)) {
-                var strokeState = strokeKey ? this.strokeStates[strokeKey] || this.textStrokeState_ : null;
-                var fillState = fillKey ? this.fillStates[fillKey] || this.textFillState_ : null;
-                var textState = this.textStates[textKey] || this.textState_;
-                var pixelRatio = this.pixelRatio;
-                var scale = textState.scale * pixelRatio;
-                var align =  ol.render.replay.TEXT_ALIGN[textState.textAlign || ol.render.canvas.defaultTextAlign];
-                var strokeWidth = strokeKey && strokeState.lineWidth ? strokeState.lineWidth : 0;
-
-                var lines = text.split('\n');
-                var numLines = lines.length;
-                var widths = [];
-                var width = ol.render.canvas.TextReplay.measureTextWidths(textState.font, lines, widths);
-                var lineHeight = ol.render.canvas.measureTextHeight(textState.font);
-                var height = lineHeight * numLines;
-                var renderWidth = (width + strokeWidth);
-                var context = ol.dom.createCanvasContext2D(
-                    Math.ceil(renderWidth * scale),
-                    Math.ceil((height + strokeWidth) * scale));
-                label = context.canvas;
-                labelCache.set(key, label);
-                if (scale != 1) {
-                    context.scale(scale, scale);
-                }
-                context.font = textState.font;
-                if (strokeKey) {
-                    context.strokeStyle = strokeState.strokeStyle;
-                    context.lineWidth = strokeWidth * (ol.has.SAFARI ? scale : 1);
-                    context.lineCap = strokeState.lineCap;
-                    context.lineJoin = strokeState.lineJoin;
-                    context.miterLimit = strokeState.miterLimit;
-                    if (ol.has.CANVAS_LINE_DASH && strokeState.lineDash.length) {
-                        context.setLineDash(strokeState.lineDash);
-                        context.lineDashOffset = strokeState.lineDashOffset;
-                    }
-                }
-                if (fillKey) {
-                    context.fillStyle = fillState.fillStyle;
-                }
-                context.textBaseline = 'middle';
-                context.textAlign = 'center';
-                var leftRight = (0.5 - align);
-                var x = align * label.width / scale + leftRight * strokeWidth;
-                var i;
-                if (strokeKey) {
-                    for (i = 0; i < numLines; ++i) {
-                        context.strokeText(lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight);
-                    }
-                }
-                if (fillKey) {
-                    for (i = 0; i < numLines; ++i) {
-                        context.fillText(lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight);
-                    }
-                }
-            }
-            return labelCache.get(key);
-        };
-
-
-        /**
-         * @private
-         * @param {HTMLCanvasElement} label Label.
-         * @param {number} begin Begin.
-         * @param {number} end End.
-         */
-        ol.render.canvas.TextReplay.prototype.drawTextImage_ = function(label, begin, end) {
-            var textState = this.textState_;
-            var strokeState = this.textStrokeState_;
-            var pixelRatio = this.pixelRatio;
-            var align = ol.render.replay.TEXT_ALIGN[textState.textAlign || ol.render.canvas.defaultTextAlign];
-            var baseline = ol.render.replay.TEXT_ALIGN[textState.textBaseline];
-            var strokeWidth = strokeState && strokeState.lineWidth ? strokeState.lineWidth : 0;
-
-            var anchorX = align * label.width / pixelRatio + 2 * (0.5 - align) * strokeWidth;
-            var anchorY = baseline * label.height / pixelRatio + 2 * (0.5 - baseline) * strokeWidth;
-            this.instructions.push([ol.render.canvas.Instruction.DRAW_IMAGE, begin, end,
-                label, (anchorX - this.textOffsetX_) * pixelRatio, (anchorY - this.textOffsetY_) * pixelRatio,
-                this.declutterGroup_, label.height, 1, 0, 0, this.textRotateWithView_, this.textRotation_,
-                1, true, label.width,
-                textState.padding == ol.render.canvas.defaultPadding ?
-                    ol.render.canvas.defaultPadding : textState.padding.map(function(p) {
-                    return p * pixelRatio;
-                }),
-                !!textState.backgroundFill, !!textState.backgroundStroke
-            ]);
-            this.hitDetectionInstructions.push([ol.render.canvas.Instruction.DRAW_IMAGE, begin, end,
-                label, (anchorX - this.textOffsetX_) * pixelRatio, (anchorY - this.textOffsetY_) * pixelRatio,
-                this.declutterGroup_, label.height, 1, 0, 0, this.textRotateWithView_, this.textRotation_,
-                1 / pixelRatio, true, label.width, textState.padding,
-                !!textState.backgroundFill, !!textState.backgroundStroke
-            ]);
-        };
-
-
-        /**
-         * @private
-         * @param {number} begin Begin.
-         * @param {number} end End.
-         * @param {ol.DeclutterGroup} declutterGroup Declutter group.
-         */
-        ol.render.canvas.TextReplay.prototype.drawChars_ = function(begin, end, declutterGroup) {
-            var strokeState = this.textStrokeState_;
-            var textState = this.textState_;
-            var fillState = this.textFillState_;
-
-            var strokeKey = this.strokeKey_;
-            if (strokeState) {
-                if (!(strokeKey in this.strokeStates)) {
-                    this.strokeStates[strokeKey] = /** @type {ol.CanvasStrokeState} */ ({
-                        strokeStyle: strokeState.strokeStyle,
-                        lineCap: strokeState.lineCap,
-                        lineDashOffset: strokeState.lineDashOffset,
-                        lineWidth: strokeState.lineWidth,
-                        lineJoin: strokeState.lineJoin,
-                        miterLimit: strokeState.miterLimit,
-                        lineDash: strokeState.lineDash
-                    });
-                }
-            }
-            var textKey = this.textKey_;
-            if (!(this.textKey_ in this.textStates)) {
-                this.textStates[this.textKey_] = /** @type {ol.CanvasTextState} */ ({
-                    font: textState.font,
-                    textAlign: textState.textAlign || ol.render.canvas.defaultTextAlign,
-                    scale: textState.scale
-                });
-            }
-            var fillKey = this.fillKey_;
-            if (fillState) {
-                if (!(fillKey in this.fillStates)) {
-                    this.fillStates[fillKey] = /** @type {ol.CanvasFillState} */ ({
-                        fillStyle: fillState.fillStyle
-                    });
-                }
-            }
-
-            var pixelRatio = this.pixelRatio;
-            var baseline = ol.render.replay.TEXT_ALIGN[textState.textBaseline];
-
-            var offsetY = this.textOffsetY_ * pixelRatio;
-            var text = this.text_;
-            var font = textState.font;
-            var textScale = textState.scale;
-            var strokeWidth = strokeState ? strokeState.lineWidth * textScale / 2 : 0;
-            var widths = this.widths_[font];
-            if (!widths) {
-                this.widths_[font] = widths = {};
-            }
-            this.instructions.push([ol.render.canvas.Instruction.DRAW_CHARS,
-                begin, end, baseline, declutterGroup,
-                textState.overflow, fillKey, textState.maxAngle,
-                function(text) {
-                    var width = widths[text];
-                    if (!width) {
-                        width = widths[text] = ol.render.canvas.measureTextWidth(font, text);
-                    }
-                    return width * textScale * pixelRatio;
-                },
-                offsetY, strokeKey, strokeWidth * pixelRatio, text, textKey, 1
-            ]);
-            this.hitDetectionInstructions.push([ol.render.canvas.Instruction.DRAW_CHARS,
-                begin, end, baseline, declutterGroup,
-                textState.overflow, fillKey, textState.maxAngle,
-                function(text) {
-                    var width = widths[text];
-                    if (!width) {
-                        width = widths[text] = ol.render.canvas.measureTextWidth(font, text);
-                    }
-                    return width * textScale;
-                },
-                offsetY, strokeKey, strokeWidth, text, textKey, 1 / pixelRatio
-            ]);
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.TextReplay.prototype.setTextStyle = function(textStyle, declutterGroup) {
-            var textState, fillState, strokeState;
-            if (!textStyle) {
-                this.text_ = '';
-            } else {
-                this.declutterGroup_ = /** @type {ol.DeclutterGroup} */ (declutterGroup);
-
-                var textFillStyle = textStyle.getFill();
-                if (!textFillStyle) {
-                    fillState = this.textFillState_ = null;
-                } else {
-                    fillState = this.textFillState_;
-                    if (!fillState) {
-                        fillState = this.textFillState_ = /** @type {ol.CanvasFillState} */ ({});
-                    }
-                    fillState.fillStyle = ol.colorlike.asColorLike(
-                        textFillStyle.getColor() || ol.render.canvas.defaultFillStyle);
-                }
-
-                var textStrokeStyle = textStyle.getStroke();
-                if (!textStrokeStyle) {
-                    strokeState = this.textStrokeState_ = null;
-                } else {
-                    strokeState = this.textStrokeState_;
-                    if (!strokeState) {
-                        strokeState = this.textStrokeState_ = /** @type {ol.CanvasStrokeState} */ ({});
-                    }
-                    var lineDash = textStrokeStyle.getLineDash();
-                    var lineDashOffset = textStrokeStyle.getLineDashOffset();
-                    var lineWidth = textStrokeStyle.getWidth();
-                    var miterLimit = textStrokeStyle.getMiterLimit();
-                    strokeState.lineCap = textStrokeStyle.getLineCap() || ol.render.canvas.defaultLineCap;
-                    strokeState.lineDash = lineDash ? lineDash.slice() : ol.render.canvas.defaultLineDash;
-                    strokeState.lineDashOffset =
-                        lineDashOffset === undefined ? ol.render.canvas.defaultLineDashOffset : lineDashOffset;
-                    strokeState.lineJoin = textStrokeStyle.getLineJoin() || ol.render.canvas.defaultLineJoin;
-                    strokeState.lineWidth =
-                        lineWidth === undefined ? ol.render.canvas.defaultLineWidth : lineWidth;
-                    strokeState.miterLimit =
-                        miterLimit === undefined ? ol.render.canvas.defaultMiterLimit : miterLimit;
-                    strokeState.strokeStyle = ol.colorlike.asColorLike(
-                        textStrokeStyle.getColor() || ol.render.canvas.defaultStrokeStyle);
-                }
-
-                textState = this.textState_;
-                var font = textStyle.getFont() || ol.render.canvas.defaultFont;
-                //ol.render.canvas.checkFont(font);  // FIXME sunyl
-                var textScale = textStyle.getScale();
-                textState.overflow = textStyle.getOverflow();
-                textState.font = font;
-                textState.maxAngle = textStyle.getMaxAngle();
-                textState.placement = textStyle.getPlacement();
-                textState.textAlign = textStyle.getTextAlign();
-                textState.textBaseline = textStyle.getTextBaseline() || ol.render.canvas.defaultTextBaseline;
-                textState.backgroundFill = textStyle.getBackgroundFill();
-                textState.backgroundStroke = textStyle.getBackgroundStroke();
-                textState.padding = textStyle.getPadding() || ol.render.canvas.defaultPadding;
-                textState.scale = textScale === undefined ? 1 : textScale;
-
-                var textOffsetX = textStyle.getOffsetX();
-                var textOffsetY = textStyle.getOffsetY();
-                var textRotateWithView = textStyle.getRotateWithView();
-                var textRotation = textStyle.getRotation();
-                this.text_ = textStyle.getText() || '';
-                this.textOffsetX_ = textOffsetX === undefined ? 0 : textOffsetX;
-                this.textOffsetY_ = textOffsetY === undefined ? 0 : textOffsetY;
-                this.textRotateWithView_ = textRotateWithView === undefined ? false : textRotateWithView;
-                this.textRotation_ = textRotation === undefined ? 0 : textRotation;
-
-                this.strokeKey_ = strokeState ?
-                    (typeof strokeState.strokeStyle == 'string' ? strokeState.strokeStyle : ol.getUid(strokeState.strokeStyle)) +
-                        strokeState.lineCap + strokeState.lineDashOffset + '|' + strokeState.lineWidth +
-                        strokeState.lineJoin + strokeState.miterLimit + '[' + strokeState.lineDash.join() + ']' :
-                    '';
-                this.textKey_ = textState.font + textState.scale + (textState.textAlign || '?');
-                this.fillKey_ = fillState ?
-                    (typeof fillState.fillStyle == 'string' ? fillState.fillStyle : ('|' + ol.getUid(fillState.fillStyle))) :
-                    '';
-            }
-        };
-
-        /**
-         * @constructor
-         * @extends {ol.render.ReplayGroup}
-         * @param {number} tolerance Tolerance.
-         * @param {ol.Extent} maxExtent Max extent.
-         * @param {number} resolution Resolution.
-         * @param {number} pixelRatio Pixel ratio.
-         * @param {boolean} overlaps The replay group can have overlapping geometries.
-         * @param {?} declutterTree Declutter tree
-         * for declutter processing in postrender.
-         * @param {number=} opt_renderBuffer Optional rendering buffer.
-         * @struct
-         */
-        ol.render.canvas.ReplayGroup = function(
-            tolerance, maxExtent, resolution, pixelRatio, overlaps, declutterTree, opt_renderBuffer) {
-            ol.render.ReplayGroup.call(this);
-
-            /**
-             * Declutter tree.
-             * @private
-             */
-            this.declutterTree_ = declutterTree;
-
-            /**
-             * @type {ol.DeclutterGroup}
-             * @private
-             */
-            this.declutterGroup_ = null;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.tolerance_ = tolerance;
-
-            /**
-             * @private
-             * @type {ol.Extent}
-             */
-            this.maxExtent_ = maxExtent;
-
-            /**
-             * @private
-             * @type {boolean}
-             */
-            this.overlaps_ = overlaps;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.pixelRatio_ = pixelRatio;
-
-            /**
-             * @private
-             * @type {number}
-             */
-            this.resolution_ = resolution;
-
-            /**
-             * @private
-             * @type {number|undefined}
-             */
-            this.renderBuffer_ = opt_renderBuffer;
-
-            /**
-             * @private
-             * @type {!Object.<string,
-       *        Object.<ol.render.ReplayType, ol.render.canvas.Replay>>}
-             */
-            this.replaysByZIndex_ = {};
-
-            /**
-             * @private
-             * @type {CanvasRenderingContext2D}
-             */
-            // FIXME
-            this.hitDetectionContext_ = null;
-
-            /**
-             * @private
-             * @type {ol.Transform}
-             */
-            this.hitDetectionTransform_ = ol.transform.create();
-        };
-        ol.inherits(ol.render.canvas.ReplayGroup, ol.render.ReplayGroup);
-
-
-        /**
-         * This cache is used for storing calculated pixel circles for increasing performance.
-         * It is a static property to allow each Replaygroup to access it.
-         * @type {Object.<number, Array.<Array.<(boolean|undefined)>>>}
-         * @private
-         */
-        ol.render.canvas.ReplayGroup.circleArrayCache_ = {
-            0: [[true]]
-        };
-
-
-        /**
-         * This method fills a row in the array from the given coordinate to the
-         * middle with `true`.
-         * @param {Array.<Array.<(boolean|undefined)>>} array The array that will be altered.
-         * @param {number} x X coordinate.
-         * @param {number} y Y coordinate.
-         * @private
-         */
-        ol.render.canvas.ReplayGroup.fillCircleArrayRowToMiddle_ = function(array, x, y) {
-            var i;
-            var radius = Math.floor(array.length / 2);
-            if (x >= radius) {
-                for (i = radius; i < x; i++) {
-                    array[i][y] = true;
-                }
-            } else if (x < radius) {
-                for (i = x + 1; i < radius; i++) {
-                    array[i][y] = true;
-                }
-            }
-        };
-
-
-        /**
-         * This methods creates a circle inside a fitting array. Points inside the
-         * circle are marked by true, points on the outside are undefined.
-         * It uses the midpoint circle algorithm.
-         * A cache is used to increase performance.
-         * @param {number} radius Radius.
-         * @returns {Array.<Array.<(boolean|undefined)>>} An array with marked circle points.
-         * @private
-         */
-        ol.render.canvas.ReplayGroup.getCircleArray_ = function(radius) {
-            if (ol.render.canvas.ReplayGroup.circleArrayCache_[radius] !== undefined) {
-                return ol.render.canvas.ReplayGroup.circleArrayCache_[radius];
-            }
-
-            var arraySize = radius * 2 + 1;
-            var arr = new Array(arraySize);
-            for (var i = 0; i < arraySize; i++) {
-                arr[i] = new Array(arraySize);
-            }
-
-            var x = radius;
-            var y = 0;
-            var error = 0;
-
-            while (x >= y) {
-                ol.render.canvas.ReplayGroup.fillCircleArrayRowToMiddle_(arr, radius + x, radius + y);
-                ol.render.canvas.ReplayGroup.fillCircleArrayRowToMiddle_(arr, radius + y, radius + x);
-                ol.render.canvas.ReplayGroup.fillCircleArrayRowToMiddle_(arr, radius - y, radius + x);
-                ol.render.canvas.ReplayGroup.fillCircleArrayRowToMiddle_(arr, radius - x, radius + y);
-                ol.render.canvas.ReplayGroup.fillCircleArrayRowToMiddle_(arr, radius - x, radius - y);
-                ol.render.canvas.ReplayGroup.fillCircleArrayRowToMiddle_(arr, radius - y, radius - x);
-                ol.render.canvas.ReplayGroup.fillCircleArrayRowToMiddle_(arr, radius + y, radius - x);
-                ol.render.canvas.ReplayGroup.fillCircleArrayRowToMiddle_(arr, radius + x, radius - y);
-
-                y++;
-                error += 1 + 2 * y;
-                if (2 * (error - x) + 1 > 0) {
-                    x -= 1;
-                    error += 1 - 2 * x;
-                }
-            }
-
-            ol.render.canvas.ReplayGroup.circleArrayCache_[radius] = arr;
-            return arr;
-        };
-
-
-        /**
-         * @param {!Object.<string, Array.<*>>} declutterReplays Declutter replays.
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {number} rotation Rotation.
-         */
-        ol.render.canvas.ReplayGroup.replayDeclutter = function(declutterReplays, context, rotation) {
-            var zs = Object.keys(declutterReplays).map(Number).sort(ol.array.numberSafeCompareFunction);
-            var skippedFeatureUids = {};
-            for (var z = 0, zz = zs.length; z < zz; ++z) {
-                var replayData = declutterReplays[zs[z].toString()];
-                for (var i = 0, ii = replayData.length; i < ii;) {
-                    var replay = replayData[i++];
-                    var transform = replayData[i++];
-                    replay.replay(context, transform, rotation, skippedFeatureUids);
-                }
-            }
-        };
-
-
-        /**
-         * @param {boolean} group Group with previous replay.
-         * @return {ol.DeclutterGroup} Declutter instruction group.
-         */
-        ol.render.canvas.ReplayGroup.prototype.addDeclutter = function(group) {
-            var declutter = null;
-            if (this.declutterTree_) {
-                if (group) {
-                    declutter = this.declutterGroup_;
-                    /** @type {number} */ (declutter[4])++;
-                } else {
-                    declutter = this.declutterGroup_ = ol.extent.createEmpty();
-                    declutter.push(1);
-                }
-            }
-            return declutter;
-        };
-
-
-        /**
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {ol.Transform} transform Transform.
-         */
-        ol.render.canvas.ReplayGroup.prototype.clip = function(context, transform) {
-            var flatClipCoords = this.getClipCoords(transform);
-            context.beginPath();
-            context.moveTo(flatClipCoords[0], flatClipCoords[1]);
-            context.lineTo(flatClipCoords[2], flatClipCoords[3]);
-            context.lineTo(flatClipCoords[4], flatClipCoords[5]);
-            context.lineTo(flatClipCoords[6], flatClipCoords[7]);
-            context.clip();
-        };
-
-
-        /**
-         * @param {Array.<ol.render.ReplayType>} replays Replays.
-         * @return {boolean} Has replays of the provided types.
-         */
-        ol.render.canvas.ReplayGroup.prototype.hasReplays = function(replays) {
-            for (var zIndex in this.replaysByZIndex_) {
-                var candidates = this.replaysByZIndex_[zIndex];
-                for (var i = 0, ii = replays.length; i < ii; ++i) {
-                    if (replays[i] in candidates) {
-                        return true;
-                    }
-                }
-            }
-            return false;
-        };
-
-
-        /**
-         * FIXME empty description for jsdoc
-         */
-        ol.render.canvas.ReplayGroup.prototype.finish = function() {
-            var zKey;
-            for (zKey in this.replaysByZIndex_) {
-                var replays = this.replaysByZIndex_[zKey];
-                var replayKey;
-                for (replayKey in replays) {
-                    replays[replayKey].finish();
-                }
-            }
-        };
-
-
-        /**
-         * @param {ol.Coordinate} coordinate Coordinate.
-         * @param {number} resolution Resolution.
-         * @param {number} rotation Rotation.
-         * @param {number} hitTolerance Hit tolerance in pixels.
-         * @param {Object.<string, boolean>} skippedFeaturesHash Ids of features
-         *     to skip.
-         * @param {function((ol.Feature|ol.render.Feature)): T} callback Feature
-         *     callback.
-         * @param {Object.<string, ol.DeclutterGroup>} declutterReplays Declutter
-         *     replays.
-         * @return {T|undefined} Callback result.
-         * @template T
-         */
-        ol.render.canvas.ReplayGroup.prototype.forEachFeatureAtCoordinate = function(
-            coordinate, resolution, rotation, hitTolerance, skippedFeaturesHash, callback, declutterReplays) {
-
-            hitTolerance = Math.round(hitTolerance);
-            var contextSize = hitTolerance * 2 + 1;
-            var transform = ol.transform.compose(this.hitDetectionTransform_,
-                hitTolerance + 0.5, hitTolerance + 0.5,
-                1 / resolution, -1 / resolution,
-                -rotation,
-                -coordinate[0], -coordinate[1]);
-            var context = this.hitDetectionContext_;
-
-            if (context.canvas.width !== contextSize || context.canvas.height !== contextSize) {
-                context.canvas.width = contextSize;
-                context.canvas.height = contextSize;
-            } else {
-                context.clearRect(0, 0, contextSize, contextSize);
-            }
-
-            /**
-             * @type {ol.Extent}
-             */
-            var hitExtent;
-            if (this.renderBuffer_ !== undefined) {
-                hitExtent = ol.extent.createEmpty();
-                ol.extent.extendCoordinate(hitExtent, coordinate);
-                ol.extent.buffer(hitExtent, resolution * (this.renderBuffer_ + hitTolerance), hitExtent);
-            }
-
-            var mask = ol.render.canvas.ReplayGroup.getCircleArray_(hitTolerance);
-            var declutteredFeatures;
-            if (this.declutterTree_) {
-                declutteredFeatures = this.declutterTree_.all().map(function(entry) {
-                    return entry.value;
-                });
-            }
-
-            var replayType;
-
-            /**
-             * @param {ol.Feature|ol.render.Feature} feature Feature.
-             * @return {?} Callback result.
-             */
-            function featureCallback(feature) {
-                var imageData = context.getImageData(0, 0, contextSize, contextSize).data;
-                for (var i = 0; i < contextSize; i++) {
-                    for (var j = 0; j < contextSize; j++) {
-                        if (mask[i][j]) {
-                            if (imageData[(j * contextSize + i) * 4 + 3] > 0) {
-                                var result;
-                                if (!(declutteredFeatures && (replayType == ol.render.ReplayType.IMAGE || replayType == ol.render.ReplayType.TEXT)) ||
-                                    declutteredFeatures.indexOf(feature) !== -1) {
-                                    result = callback(feature);
-                                }
-                                if (result) {
-                                    return result;
-                                } else {
-                                    context.clearRect(0, 0, contextSize, contextSize);
-                                    return undefined;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-
-            /** @type {Array.<number>} */
-            var zs = Object.keys(this.replaysByZIndex_).map(Number);
-            zs.sort(ol.array.numberSafeCompareFunction);
-
-            var i, j, replays, replay, result;
-            for (i = zs.length - 1; i >= 0; --i) {
-                var zIndexKey = zs[i].toString();
-                replays = this.replaysByZIndex_[zIndexKey];
-                for (j = ol.render.replay.ORDER.length - 1; j >= 0; --j) {
-                    replayType = ol.render.replay.ORDER[j];
-                    replay = replays[replayType];
-                    if (replay !== undefined) {
-                        if (declutterReplays &&
-                            (replayType == ol.render.ReplayType.IMAGE || replayType == ol.render.ReplayType.TEXT)) {
-                            var declutter = declutterReplays[zIndexKey];
-                            if (!declutter) {
-                                declutterReplays[zIndexKey] = [replay, transform.slice(0)];
-                            } else {
-                                declutter.push(replay, transform.slice(0));
-                            }
-                        } else {
-                            result = replay.replayHitDetection(context, transform, rotation,
-                                skippedFeaturesHash, featureCallback, hitExtent);
-                            if (result) {
-                                return result;
-                            }
-                        }
-                    }
-                }
-            }
-            return undefined;
-        };
-
-
-        /**
-         * @param {ol.Transform} transform Transform.
-         * @return {Array.<number>} Clip coordinates.
-         */
-        ol.render.canvas.ReplayGroup.prototype.getClipCoords = function(transform) {
-            var maxExtent = this.maxExtent_;
-            var minX = maxExtent[0];
-            var minY = maxExtent[1];
-            var maxX = maxExtent[2];
-            var maxY = maxExtent[3];
-            var flatClipCoords = [minX, minY, minX, maxY, maxX, maxY, maxX, minY];
-            ol.geom.flat.transform.transform2D(
-                flatClipCoords, 0, 8, 2, transform, flatClipCoords);
-            return flatClipCoords;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.ReplayGroup.prototype.getReplay = function(zIndex, replayType) {
-            var zIndexKey = zIndex !== undefined ? zIndex.toString() : '0';
-            var replays = this.replaysByZIndex_[zIndexKey];
-            if (replays === undefined) {
-                replays = {};
-                this.replaysByZIndex_[zIndexKey] = replays;
-            }
-            var replay = replays[replayType];
-            if (replay === undefined) {
-                var Constructor = ol.render.canvas.ReplayGroup.BATCH_CONSTRUCTORS_[replayType];
-                replay = new Constructor(this.tolerance_, this.maxExtent_,
-                    this.resolution_, this.pixelRatio_, this.overlaps_, this.declutterTree_);
-                replays[replayType] = replay;
-            }
-            return replay;
-        };
-
-
-        /**
-         * @return {Object.<string, Object.<ol.render.ReplayType, ol.render.canvas.Replay>>} Replays.
-         */
-        ol.render.canvas.ReplayGroup.prototype.getReplays = function() {
-            return this.replaysByZIndex_;
-        };
-
-
-        /**
-         * @inheritDoc
-         */
-        ol.render.canvas.ReplayGroup.prototype.isEmpty = function() {
-            return ol.obj.isEmpty(this.replaysByZIndex_);
-        };
-
-
-        /**
-         * @param {CanvasRenderingContext2D} context Context.
-         * @param {ol.Transform} transform Transform.
-         * @param {number} viewRotation View rotation.
-         * @param {Object.<string, boolean>} skippedFeaturesHash Ids of features
-         *     to skip.
-         * @param {Array.<ol.render.ReplayType>=} opt_replayTypes Ordered replay types
-         *     to replay. Default is {@link ol.render.replay.ORDER}
-         * @param {Object.<string, ol.DeclutterGroup>=} opt_declutterReplays Declutter
-         *     replays.
-         */
-        ol.render.canvas.ReplayGroup.prototype.replay = function(context,
-                                                                 transform, viewRotation, skippedFeaturesHash, opt_replayTypes, opt_declutterReplays) {
-
-            /** @type {Array.<number>} */
-            var zs = Object.keys(this.replaysByZIndex_).map(Number);
-            zs.sort(ol.array.numberSafeCompareFunction);
-
-            // setup clipping so that the parts of over-simplified geometries are not
-            // visible outside the current extent when panning
-            context.save();
-            this.clip(context, transform);
-
-            var replayTypes = opt_replayTypes ? opt_replayTypes : ol.render.replay.ORDER;
-            var i, ii, j, jj, replays, replay;
-            for (i = 0, ii = zs.length; i < ii; ++i) {
-                var zIndexKey = zs[i].toString();
-                replays = this.replaysByZIndex_[zIndexKey];
-                for (j = 0, jj = replayTypes.length; j < jj; ++j) {
-                    var replayType = replayTypes[j];
-                    replay = replays[replayType];
-                    if (replay !== undefined) {
-                        if (opt_declutterReplays &&
-                            (replayType == ol.render.ReplayType.IMAGE || replayType == ol.render.ReplayType.TEXT)) {
-                            var declutter = opt_declutterReplays[zIndexKey];
-                            if (!declutter) {
-                                opt_declutterReplays[zIndexKey] = [replay, transform.slice(0)];
-                            } else {
-                                declutter.push(replay, transform.slice(0));
-                            }
-                        } else {
-                            replay.replay(context, transform, viewRotation, skippedFeaturesHash);
-                        }
-                    }
-                }
-            }
-
-            context.restore();
-        };
-
-
-        /**
-         * @const
-         * @private
-         * @type {Object.<ol.render.ReplayType,
-     *                function(new: ol.render.canvas.Replay, number, ol.Extent,
-     *                number, number, boolean, Array.<ol.DeclutterGroup>)>}
-         */
-        ol.render.canvas.ReplayGroup.BATCH_CONSTRUCTORS_ = {
-            'Circle': ol.render.canvas.PolygonReplay,
-            'Default': ol.render.canvas.Replay,
-            'Image': ol.render.canvas.ImageReplay,
-            'LineString': ol.render.canvas.LineStringReplay,
-            'Polygon': ol.render.canvas.PolygonReplay,
-            'Text': ol.render.canvas.TextReplay
-        };
-
-        ol.renderer = {};
-        ol.renderer.vector = {};
-
-        /**
-         * @param {ol.Feature|ol.render.Feature} feature1 Feature 1.
-         * @param {ol.Feature|ol.render.Feature} feature2 Feature 2.
-         * @return {number} Order.
-         */
-        ol.renderer.vector.defaultOrder = function(feature1, feature2) {
-            return ol.getUid(feature1) - ol.getUid(feature2);
-        };
-
-
-        /**
-         * @param {number} resolution Resolution.
-         * @param {number} pixelRatio Pixel ratio.
-         * @return {number} Squared pixel tolerance.
-         */
-        ol.renderer.vector.getSquaredTolerance = function(resolution, pixelRatio) {
-            var tolerance = ol.renderer.vector.getTolerance(resolution, pixelRatio);
-            return tolerance * tolerance;
-        };
-
-
-        /**
-         * @param {number} resolution Resolution.
-         * @param {number} pixelRatio Pixel ratio.
-         * @return {number} Pixel tolerance.
-         */
-        ol.renderer.vector.getTolerance = function(resolution, pixelRatio) {
-            return ol.SIMPLIFY_TOLERANCE * resolution / pixelRatio;
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.geom.Circle} geometry Geometry.
-         * @param {ol.style.Style} style Style.
-         * @param {ol.Feature} feature Feature.
-         * @private
-         */
-        ol.renderer.vector.renderCircleGeometry_ = function(replayGroup, geometry, style, feature) {
-            var fillStyle = style.getFill();
-            var strokeStyle = style.getStroke();
-            if (fillStyle || strokeStyle) {
-                var circleReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.CIRCLE);
-                circleReplay.setFillStrokeStyle(fillStyle, strokeStyle);
-                circleReplay.drawCircle(geometry, feature);
-            }
-            var textStyle = style.getText();
-            if (textStyle) {
-                var textReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.TEXT);
-                textReplay.setTextStyle(textStyle, replayGroup.addDeclutter(false));
-                textReplay.drawText(geometry, feature);
-            }
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         * @param {ol.style.Style} style Style.
-         * @param {number} squaredTolerance Squared tolerance.
-         * @param {function(this: T, ol.events.Event)} listener Listener function.
-         * @param {T} thisArg Value to use as `this` when executing `listener`.
-         * @return {boolean} `true` if style is loading.
-         * @template T
-         */
-        ol.renderer.vector.renderFeature = function(
-            replayGroup, feature, style, squaredTolerance, listener, thisArg) {
-            var loading = false;
-            var imageStyle, imageState;
-            imageStyle = style.getImage();
-            if (imageStyle) {
-                imageState = imageStyle.getImageState();
-                if (imageState == ol.ImageState.LOADED ||
-                    imageState == ol.ImageState.ERROR) {
-                    imageStyle.unlistenImageChange(listener, thisArg);
-                } else {
-                    if (imageState == ol.ImageState.IDLE) {
-                        imageStyle.load();
-                    }
-                    imageState = imageStyle.getImageState();
-                    imageStyle.listenImageChange(listener, thisArg);
-                    loading = true;
-                }
-            }
-            ol.renderer.vector.renderFeature_(replayGroup, feature, style,
-                squaredTolerance);
-
-            return loading;
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         * @param {ol.style.Style} style Style.
-         * @param {number} squaredTolerance Squared tolerance.
-         * @private
-         */
-        ol.renderer.vector.renderFeature_ = function(
-            replayGroup, feature, style, squaredTolerance) {
-            var geometry = style.getGeometryFunction()(feature);
-            if (!geometry) {
-                return;
-            }
-            var simplifiedGeometry = geometry.getSimplifiedGeometry(squaredTolerance);
-            var renderer = style.getRenderer();
-            if (renderer) {
-                ol.renderer.vector.renderGeometry_(replayGroup, simplifiedGeometry, style, feature);
-            } else {
-                var geometryRenderer =
-                    ol.renderer.vector.GEOMETRY_RENDERERS_[simplifiedGeometry.getType()];
-                geometryRenderer(replayGroup, simplifiedGeometry, style, feature);
-            }
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.geom.Geometry} geometry Geometry.
-         * @param {ol.style.Style} style Style.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         * @private
-         */
-        ol.renderer.vector.renderGeometry_ = function(replayGroup, geometry, style, feature) {
-            if (geometry.getType() == ol.geom.GeometryType.GEOMETRY_COLLECTION) {
-                var geometries = /** @type {ol.geom.GeometryCollection} */ (geometry).getGeometries();
-                for (var i = 0, ii = geometries.length; i < ii; ++i) {
-                    ol.renderer.vector.renderGeometry_(replayGroup, geometries[i], style, feature);
-                }
-                return;
-            }
-            var replay = replayGroup.getReplay(style.getZIndex(), ol.render.ReplayType.DEFAULT);
-            replay.drawCustom(/** @type {ol.geom.SimpleGeometry} */ (geometry), feature, style.getRenderer());
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.geom.GeometryCollection} geometry Geometry.
-         * @param {ol.style.Style} style Style.
-         * @param {ol.Feature} feature Feature.
-         * @private
-         */
-        ol.renderer.vector.renderGeometryCollectionGeometry_ = function(replayGroup, geometry, style, feature) {
-            var geometries = geometry.getGeometriesArray();
-            var i, ii;
-            for (i = 0, ii = geometries.length; i < ii; ++i) {
-                var geometryRenderer =
-                    ol.renderer.vector.GEOMETRY_RENDERERS_[geometries[i].getType()];
-                geometryRenderer(replayGroup, geometries[i], style, feature);
-            }
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.geom.LineString|ol.render.Feature} geometry Geometry.
-         * @param {ol.style.Style} style Style.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         * @private
-         */
-        ol.renderer.vector.renderLineStringGeometry_ = function(replayGroup, geometry, style, feature) {
-            var strokeStyle = style.getStroke();
-            if (strokeStyle) {
-                var lineStringReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.LINE_STRING);
-                lineStringReplay.setFillStrokeStyle(null, strokeStyle);
-                lineStringReplay.drawLineString(geometry, feature);
-            }
-            var textStyle = style.getText();
-            if (textStyle) {
-                var textReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.TEXT);
-                textReplay.setTextStyle(textStyle, replayGroup.addDeclutter(false));
-                textReplay.drawText(geometry, feature);
-            }
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.geom.MultiLineString|ol.render.Feature} geometry Geometry.
-         * @param {ol.style.Style} style Style.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         * @private
-         */
-        ol.renderer.vector.renderMultiLineStringGeometry_ = function(replayGroup, geometry, style, feature) {
-            var strokeStyle = style.getStroke();
-            if (strokeStyle) {
-                var lineStringReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.LINE_STRING);
-                lineStringReplay.setFillStrokeStyle(null, strokeStyle);
-                lineStringReplay.drawMultiLineString(geometry, feature);
-            }
-            var textStyle = style.getText();
-            if (textStyle) {
-                var textReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.TEXT);
-                textReplay.setTextStyle(textStyle, replayGroup.addDeclutter(false));
-                textReplay.drawText(geometry, feature);
-            }
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.geom.MultiPolygon} geometry Geometry.
-         * @param {ol.style.Style} style Style.
-         * @param {ol.Feature} feature Feature.
-         * @private
-         */
-        ol.renderer.vector.renderMultiPolygonGeometry_ = function(replayGroup, geometry, style, feature) {
-            var fillStyle = style.getFill();
-            var strokeStyle = style.getStroke();
-            if (strokeStyle || fillStyle) {
-                var polygonReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.POLYGON);
-                polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle);
-                polygonReplay.drawMultiPolygon(geometry, feature);
-            }
-            var textStyle = style.getText();
-            if (textStyle) {
-                var textReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.TEXT);
-                textReplay.setTextStyle(textStyle, replayGroup.addDeclutter(false));
-                textReplay.drawText(geometry, feature);
-            }
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.geom.Point|ol.render.Feature} geometry Geometry.
-         * @param {ol.style.Style} style Style.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         * @private
-         */
-        ol.renderer.vector.renderPointGeometry_ = function(replayGroup, geometry, style, feature) {
-            var imageStyle = style.getImage();
-            if (imageStyle) {
-                if (imageStyle.getImageState() != ol.ImageState.LOADED) {
-                    return;
-                }
-                var imageReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.IMAGE);
-                imageReplay.setImageStyle(imageStyle, replayGroup.addDeclutter(false));
-                imageReplay.drawPoint(geometry, feature);
-            }
-            var textStyle = style.getText();
-            if (textStyle) {
-                var textReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.TEXT);
-                textReplay.setTextStyle(textStyle, replayGroup.addDeclutter(!!imageStyle));
-                textReplay.drawText(geometry, feature);
-            }
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.geom.MultiPoint|ol.render.Feature} geometry Geometry.
-         * @param {ol.style.Style} style Style.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         * @private
-         */
-        ol.renderer.vector.renderMultiPointGeometry_ = function(replayGroup, geometry, style, feature) {
-            var imageStyle = style.getImage();
-            if (imageStyle) {
-                if (imageStyle.getImageState() != ol.ImageState.LOADED) {
-                    return;
-                }
-                var imageReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.IMAGE);
-                imageReplay.setImageStyle(imageStyle, replayGroup.addDeclutter(false));
-                imageReplay.drawMultiPoint(geometry, feature);
-            }
-            var textStyle = style.getText();
-            if (textStyle) {
-                var textReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.TEXT);
-                textReplay.setTextStyle(textStyle, replayGroup.addDeclutter(!!imageStyle));
-                textReplay.drawText(geometry, feature);
-            }
-        };
-
-
-        /**
-         * @param {ol.render.ReplayGroup} replayGroup Replay group.
-         * @param {ol.geom.Polygon|ol.render.Feature} geometry Geometry.
-         * @param {ol.style.Style} style Style.
-         * @param {ol.Feature|ol.render.Feature} feature Feature.
-         * @private
-         */
-        ol.renderer.vector.renderPolygonGeometry_ = function(replayGroup, geometry, style, feature) {
-            var fillStyle = style.getFill();
-            var strokeStyle = style.getStroke();
-            if (fillStyle || strokeStyle) {
-                var polygonReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.POLYGON);
-                polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle);
-                polygonReplay.drawPolygon(geometry, feature);
-            }
-            var textStyle = style.getText();
-            if (textStyle) {
-                var textReplay = replayGroup.getReplay(
-                    style.getZIndex(), ol.render.ReplayType.TEXT);
-                textReplay.setTextStyle(textStyle, replayGroup.addDeclutter(false));
-                textReplay.drawText(geometry, feature);
-            }
-        };
-
-
-        /**
-         * @const
-         * @private
-         * @type {Object.<ol.geom.GeometryType,
-     *                function(ol.render.ReplayGroup, ol.geom.Geometry,
-     *                         ol.style.Style, Object)>}
-         */
-        ol.renderer.vector.GEOMETRY_RENDERERS_ = {
-            'Point': ol.renderer.vector.renderPointGeometry_,
-            'LineString': ol.renderer.vector.renderLineStringGeometry_,
-            'Polygon': ol.renderer.vector.renderPolygonGeometry_,
-            'MultiPoint': ol.renderer.vector.renderMultiPointGeometry_,
-            'MultiLineString': ol.renderer.vector.renderMultiLineStringGeometry_,
-            'MultiPolygon': ol.renderer.vector.renderMultiPolygonGeometry_,
-            'GeometryCollection': ol.renderer.vector.renderGeometryCollectionGeometry_,
-            'Circle': ol.renderer.vector.renderCircleGeometry_
-        };
-
-    var spriteImageCanvas = {};
-
-    var mvtStyleClass = new MvtStyle(ol, true);
-    var mvtRenderer2D = new MvtRenderer2D({
-        mvtStyle: mvtStyleClass,
-        openlayer: ol,
-        useOffscreen: true
-    });
-
-    function MVTWorker(parameters, transferableObjects) {
-        var canvas = new OffscreenCanvas(parameters.canvasWidth, parameters.canvasWidth);
-        var idCanvas = new OffscreenCanvas(parameters.canvasWidth, parameters.canvasWidth);
-        var pbfData = parameters.pbfData;
-        var layers = parameters.layers;
-        var transform = parameters.transform;
-        var squaredTolerance = parameters.squaredTolerance;
-        var spriteImageDatas = parameters.spriteImageDatas;
-        var keepProperties = parameters.keepProperties;
-        var tileLevel = parameters.tileLevel;
-        var needSourceLayerNames = parameters.needSourceLayerNames;
-        var selectEnabled = parameters.selectEnabled;
-        var featureProperties = {};
-
-        try {
-            var mvtParser = new ol.format.MVT({
-                featureClass: ol.Feature
-            });
-            var features = mvtParser.readFeatures(pbfData, {
-                needSourceLayerNames: needSourceLayerNames
-            });
-            var renderResult = mvtRenderer2D.renderFeatures({
-                colorCanvas: canvas,
-                idCanvas: idCanvas,
-                transform: transform,
-                layers: layers,
-                features: features,
-                tileLevel: tileLevel,
-                spriteImageCanvas: spriteImageCanvas,
-                spriteImageDatas: spriteImageDatas,
-                squaredTolerance: squaredTolerance,
-                selectEnabled: selectEnabled,
-                showBillboard: false
-            });
-
-            if (keepProperties) {
-                var featuresToRender = renderResult.idFeatures;
-                var featuresToRenderLength = featuresToRender.length;
-                for (var i = 0; i < featuresToRenderLength; i++) {
-                    var feature = featuresToRender[i];
-                    var featureID = getFeatureID$1(feature);
-                    var propertiesWithoutGeometry = feature.getProperties();
-                    if (when.defined(propertiesWithoutGeometry.geometry)) {
-                        delete propertiesWithoutGeometry.geometry;
-                    }
-                    featureProperties[featureID] = propertiesWithoutGeometry;
-                }
-            }
-        }
-        catch (err) {
-        }
-
-        var imageBitmap = canvas.transferToImageBitmap();
-        var idImageBitmap = selectEnabled ? idCanvas.transferToImageBitmap() : null;
-        transferableObjects.push(imageBitmap);
-        return {
-            buffer: imageBitmap,
-            idBuffer: idImageBitmap,
-            properties: featureProperties
-        };
-    }
-
-    function getFeatureID$1(feature) {
-        var id = feature.getId();
-        // 只在颜色中记录256*256*256这么大范围的ID,超过这个范围的ID舍去
-        var discard = Math.floor(id / 16777216);
-        id = id - discard * 16777216;
-        return id;
-    }
-
-    var MVTWorker$1 = createTaskProcessorWorker(MVTWorker);
-
-    return MVTWorker$1;
-
-});
diff --git a/public/libs/Cesium/Workers/Math-61ede240.js b/public/libs/Cesium/Workers/Math-61ede240.js
deleted file mode 100644
index b9cd778..0000000
--- a/public/libs/Cesium/Workers/Math-61ede240.js
+++ /dev/null
@@ -1,1250 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281'], function (exports, when, Check) { 'use strict';
-
-  /*
-    I've wrapped Makoto Matsumoto and Takuji Nishimura's code in a namespace
-    so it's better encapsulated. Now you can have multiple random number generators
-    and they won't stomp all over eachother's state.
-
-    If you want to use this as a substitute for Math.random(), use the random()
-    method like so:
-
-    var m = new MersenneTwister();
-    var randomNumber = m.random();
-
-    You can also call the other genrand_{foo}() methods on the instance.
-
-    If you want to use a specific seed in order to get a repeatable random
-    sequence, pass an integer into the constructor:
-
-    var m = new MersenneTwister(123);
-
-    and that will always produce the same random sequence.
-
-    Sean McCullough (banksean@gmail.com)
-  */
-
-  /*
-     A C-program for MT19937, with initialization improved 2002/1/26.
-     Coded by Takuji Nishimura and Makoto Matsumoto.
-
-     Before using, initialize the state by using init_genrand(seed)
-     or init_by_array(init_key, key_length).
-  */
-  /**
-  @license
-  mersenne-twister.js - https://gist.github.com/banksean/300494
-
-     Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
-     All rights reserved.
-
-     Redistribution and use in source and binary forms, with or without
-     modification, are permitted provided that the following conditions
-     are met:
-
-       1. Redistributions of source code must retain the above copyright
-          notice, this list of conditions and the following disclaimer.
-
-       2. Redistributions in binary form must reproduce the above copyright
-          notice, this list of conditions and the following disclaimer in the
-          documentation and/or other materials provided with the distribution.
-
-       3. The names of its contributors may not be used to endorse or promote
-          products derived from this software without specific prior written
-          permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-     A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-     EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-     PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-     PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-     LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-     NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  */
-  /*
-     Any feedback is very welcome.
-     http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
-     email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
-  */
-
-  var MersenneTwister = function(seed) {
-    if (seed == undefined) {
-      seed = new Date().getTime();
-    }
-    /* Period parameters */
-    this.N = 624;
-    this.M = 397;
-    this.MATRIX_A = 0x9908b0df;   /* constant vector a */
-    this.UPPER_MASK = 0x80000000; /* most significant w-r bits */
-    this.LOWER_MASK = 0x7fffffff; /* least significant r bits */
-
-    this.mt = new Array(this.N); /* the array for the state vector */
-    this.mti=this.N+1; /* mti==N+1 means mt[N] is not initialized */
-
-    this.init_genrand(seed);
-  };
-
-  /* initializes mt[N] with a seed */
-  MersenneTwister.prototype.init_genrand = function(s) {
-    this.mt[0] = s >>> 0;
-    for (this.mti=1; this.mti<this.N; this.mti++) {
-        var s = this.mt[this.mti-1] ^ (this.mt[this.mti-1] >>> 30);
-     this.mt[this.mti] = (((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253)
-    + this.mti;
-        /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
-        /* In the previous versions, MSBs of the seed affect   */
-        /* only MSBs of the array mt[].                        */
-        /* 2002/01/09 modified by Makoto Matsumoto             */
-        this.mt[this.mti] >>>= 0;
-        /* for >32 bit machines */
-    }
-  };
-
-  /* initialize by an array with array-length */
-  /* init_key is the array for initializing keys */
-  /* key_length is its length */
-  /* slight change for C++, 2004/2/26 */
-  //MersenneTwister.prototype.init_by_array = function(init_key, key_length) {
-  //  var i, j, k;
-  //  this.init_genrand(19650218);
-  //  i=1; j=0;
-  //  k = (this.N>key_length ? this.N : key_length);
-  //  for (; k; k--) {
-  //    var s = this.mt[i-1] ^ (this.mt[i-1] >>> 30)
-  //    this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1664525) << 16) + ((s & 0x0000ffff) * 1664525)))
-  //      + init_key[j] + j; /* non linear */
-  //    this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */
-  //    i++; j++;
-  //    if (i>=this.N) { this.mt[0] = this.mt[this.N-1]; i=1; }
-  //    if (j>=key_length) j=0;
-  //  }
-  //  for (k=this.N-1; k; k--) {
-  //    var s = this.mt[i-1] ^ (this.mt[i-1] >>> 30);
-  //    this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1566083941) << 16) + (s & 0x0000ffff) * 1566083941))
-  //      - i; /* non linear */
-  //    this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */
-  //    i++;
-  //    if (i>=this.N) { this.mt[0] = this.mt[this.N-1]; i=1; }
-  //  }
-  //
-  //  this.mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */
-  //}
-
-  /* generates a random number on [0,0xffffffff]-interval */
-  MersenneTwister.prototype.genrand_int32 = function() {
-    var y;
-    var mag01 = new Array(0x0, this.MATRIX_A);
-    /* mag01[x] = x * MATRIX_A  for x=0,1 */
-
-    if (this.mti >= this.N) { /* generate N words at one time */
-      var kk;
-
-      if (this.mti == this.N+1)   /* if init_genrand() has not been called, */
-        this.init_genrand(5489); /* a default initial seed is used */
-
-      for (kk=0;kk<this.N-this.M;kk++) {
-        y = (this.mt[kk]&this.UPPER_MASK)|(this.mt[kk+1]&this.LOWER_MASK);
-        this.mt[kk] = this.mt[kk+this.M] ^ (y >>> 1) ^ mag01[y & 0x1];
-      }
-      for (;kk<this.N-1;kk++) {
-        y = (this.mt[kk]&this.UPPER_MASK)|(this.mt[kk+1]&this.LOWER_MASK);
-        this.mt[kk] = this.mt[kk+(this.M-this.N)] ^ (y >>> 1) ^ mag01[y & 0x1];
-      }
-      y = (this.mt[this.N-1]&this.UPPER_MASK)|(this.mt[0]&this.LOWER_MASK);
-      this.mt[this.N-1] = this.mt[this.M-1] ^ (y >>> 1) ^ mag01[y & 0x1];
-
-      this.mti = 0;
-    }
-
-    y = this.mt[this.mti++];
-
-    /* Tempering */
-    y ^= (y >>> 11);
-    y ^= (y << 7) & 0x9d2c5680;
-    y ^= (y << 15) & 0xefc60000;
-    y ^= (y >>> 18);
-
-    return y >>> 0;
-  };
-
-  /* generates a random number on [0,0x7fffffff]-interval */
-  //MersenneTwister.prototype.genrand_int31 = function() {
-  //  return (this.genrand_int32()>>>1);
-  //}
-
-  /* generates a random number on [0,1]-real-interval */
-  //MersenneTwister.prototype.genrand_real1 = function() {
-  //  return this.genrand_int32()*(1.0/4294967295.0);
-  //  /* divided by 2^32-1 */
-  //}
-
-  /* generates a random number on [0,1)-real-interval */
-  MersenneTwister.prototype.random = function() {
-    return this.genrand_int32()*(1.0/4294967296.0);
-    /* divided by 2^32 */
-  };
-
-  /**
-   * Math functions.
-   *
-   * @exports CesiumMath
-   * @alias Math
-   */
-  var CesiumMath = {};
-
-  CesiumMath.Radius = 6378137.0;
-
-  /**
-   * 0.1
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON1 = 0.1;
-
-  /**
-   * 0.01
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON2 = 0.01;
-
-  /**
-   * 0.001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON3 = 0.001;
-
-  /**
-   * 0.0001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON4 = 0.0001;
-
-  /**
-   * 0.00001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON5 = 0.00001;
-
-  /**
-   * 0.000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON6 = 0.000001;
-
-  /**
-   * 0.0000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON7 = 0.0000001;
-
-  /**
-   * 0.00000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON8 = 0.00000001;
-
-  /**
-   * 0.000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON9 = 0.000000001;
-
-  /**
-   * 0.0000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON10 = 0.0000000001;
-
-  /**
-   * 0.00000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON11 = 0.00000000001;
-
-  /**
-   * 0.000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON12 = 0.000000000001;
-
-  /**
-   * 0.0000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON13 = 0.0000000000001;
-
-  /**
-   * 0.00000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON14 = 0.00000000000001;
-
-  /**
-   * 0.000000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON15 = 0.000000000000001;
-
-  /**
-   * 0.0000000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON16 = 0.0000000000000001;
-
-  /**
-   * 0.00000000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON17 = 0.00000000000000001;
-
-  /**
-   * 0.000000000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON18 = 0.000000000000000001;
-
-  /**
-   * 0.0000000000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON19 = 0.0000000000000000001;
-
-  /**
-   * 0.00000000000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON20 = 0.00000000000000000001;
-
-  /**
-   * 0.000000000000000000001
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.EPSILON21 = 0.000000000000000000001;
-
-  /**
-   * The gravitational parameter of the Earth in meters cubed
-   * per second squared as defined by the WGS84 model: 3.986004418e14
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.GRAVITATIONALPARAMETER = 3.986004418e14;
-
-  /**
-   * Radius of the sun in meters: 6.955e8
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.SOLAR_RADIUS = 6.955e8;
-
-  /**
-   * The mean radius of the moon, according to the "Report of the IAU/IAG Working Group on
-   * Cartographic Coordinates and Rotational Elements of the Planets and satellites: 2000",
-   * Celestial Mechanics 82: 83-110, 2002.
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.LUNAR_RADIUS = 1737400.0;
-
-  /**
-   * 64 * 1024
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.SIXTY_FOUR_KILOBYTES = 64 * 1024;
-
-  /**
-   * Returns the sign of the value; 1 if the value is positive, -1 if the value is
-   * negative, or 0 if the value is 0.
-   *
-   * @function
-   * @param {Number} value The value to return the sign of.
-   * @returns {Number} The sign of value.
-   */
-  CesiumMath.sign = when.defaultValue(Math.sign, function sign(value) {
-      value = +value; // coerce to number
-      if (value === 0 || value !== value) {
-          // zero or NaN
-          return value;
-      }
-      return value > 0 ? 1 : -1;
-  });
-
-  /**
-   * Returns 1.0 if the given value is positive or zero, and -1.0 if it is negative.
-   * This is similar to {@link CesiumMath#sign} except that returns 1.0 instead of
-   * 0.0 when the input value is 0.0.
-   * @param {Number} value The value to return the sign of.
-   * @returns {Number} The sign of value.
-   */
-  CesiumMath.signNotZero = function(value) {
-      return value < 0.0 ? -1.0 : 1.0;
-  };
-
-  /**
-   * Converts a scalar value in the range [-1.0, 1.0] to a SNORM in the range [0, rangeMax]
-   * @param {Number} value The scalar value in the range [-1.0, 1.0]
-   * @param {Number} [rangeMax=255] The maximum value in the mapped range, 255 by default.
-   * @returns {Number} A SNORM value, where 0 maps to -1.0 and rangeMax maps to 1.0.
-   *
-   * @see CesiumMath.fromSNorm
-   */
-  CesiumMath.toSNorm = function(value, rangeMax) {
-      rangeMax = when.defaultValue(rangeMax, 255);
-      return Math.round((CesiumMath.clamp(value, -1.0, 1.0) * 0.5 + 0.5) * rangeMax);
-  };
-
-  /**
-   * Converts a SNORM value in the range [0, rangeMax] to a scalar in the range [-1.0, 1.0].
-   * @param {Number} value SNORM value in the range [0, 255]
-   * @param {Number} [rangeMax=255] The maximum value in the SNORM range, 255 by default.
-   * @returns {Number} Scalar in the range [-1.0, 1.0].
-   *
-   * @see CesiumMath.toSNorm
-   */
-  CesiumMath.fromSNorm = function(value, rangeMax) {
-      rangeMax = when.defaultValue(rangeMax, 255);
-      return CesiumMath.clamp(value, 0.0, rangeMax) / rangeMax * 2.0 - 1.0;
-  };
-
-  /**
-   * Converts a scalar value in the range [rangeMinimum, rangeMaximum] to a scalar in the range [0.0, 1.0]
-   * @param {Number} value The scalar value in the range [rangeMinimum, rangeMaximum]
-   * @param {Number} rangeMinimum The minimum value in the mapped range.
-   * @param {Number} rangeMaximum The maximum value in the mapped range.
-   * @returns {Number} A scalar value, where rangeMinimum maps to 0.0 and rangeMaximum maps to 1.0.
-   */
-  CesiumMath.normalize = function(value, rangeMinimum, rangeMaximum) {
-      rangeMaximum = Math.max(rangeMaximum - rangeMinimum, 0.0);
-      return rangeMaximum === 0.0 ? 0.0 : CesiumMath.clamp((value - rangeMinimum) / rangeMaximum, 0.0, 1.0);
-  };
-
-  /**
-   * Returns the hyperbolic sine of a number.
-   * The hyperbolic sine of <em>value</em> is defined to be
-   * (<em>e<sup>x</sup>&nbsp;-&nbsp;e<sup>-x</sup></em>)/2.0
-   * where <i>e</i> is Euler's number, approximately 2.71828183.
-   *
-   * <p>Special cases:
-   *   <ul>
-   *     <li>If the argument is NaN, then the result is NaN.</li>
-   *
-   *     <li>If the argument is infinite, then the result is an infinity
-   *     with the same sign as the argument.</li>
-   *
-   *     <li>If the argument is zero, then the result is a zero with the
-   *     same sign as the argument.</li>
-   *   </ul>
-   *</p>
-   *
-   * @function
-   * @param {Number} value The number whose hyperbolic sine is to be returned.
-   * @returns {Number} The hyperbolic sine of <code>value</code>.
-   */
-  CesiumMath.sinh = when.defaultValue(Math.sinh, function sinh(value) {
-      return (Math.exp(value) - Math.exp(-value)) / 2.0;
-  });
-
-  /**
-   * Returns the hyperbolic cosine of a number.
-   * The hyperbolic cosine of <strong>value</strong> is defined to be
-   * (<em>e<sup>x</sup>&nbsp;+&nbsp;e<sup>-x</sup></em>)/2.0
-   * where <i>e</i> is Euler's number, approximately 2.71828183.
-   *
-   * <p>Special cases:
-   *   <ul>
-   *     <li>If the argument is NaN, then the result is NaN.</li>
-   *
-   *     <li>If the argument is infinite, then the result is positive infinity.</li>
-   *
-   *     <li>If the argument is zero, then the result is 1.0.</li>
-   *   </ul>
-   *</p>
-   *
-   * @function
-   * @param {Number} value The number whose hyperbolic cosine is to be returned.
-   * @returns {Number} The hyperbolic cosine of <code>value</code>.
-   */
-  CesiumMath.cosh = when.defaultValue(Math.cosh, function cosh(value) {
-      return (Math.exp(value) + Math.exp(-value)) / 2.0;
-  });
-
-  /**
-   * Computes the linear interpolation of two values.
-   *
-   * @param {Number} p The start value to interpolate.
-   * @param {Number} q The end value to interpolate.
-   * @param {Number} time The time of interpolation generally in the range <code>[0.0, 1.0]</code>.
-   * @returns {Number} The linearly interpolated value.
-   *
-   * @example
-   * var n = Cesium.Math.lerp(0.0, 2.0, 0.5); // returns 1.0
-   */
-  CesiumMath.lerp = function(p, q, time) {
-      return ((1.0 - time) * p) + (time * q);
-  };
-
-  /**
-   * pi
-   *
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.PI = Math.PI;
-
-  /**
-   * 1/pi
-   *
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.ONE_OVER_PI = 1.0 / Math.PI;
-
-  /**
-   * pi/2
-   *
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.PI_OVER_TWO = Math.PI / 2.0;
-
-  /**
-   * pi/3
-   *
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.PI_OVER_THREE = Math.PI / 3.0;
-
-  /**
-   * pi/4
-   *
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.PI_OVER_FOUR = Math.PI / 4.0;
-
-  /**
-   * pi/6
-   *
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.PI_OVER_SIX = Math.PI / 6.0;
-
-  /**
-   * 3pi/2
-   *
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.THREE_PI_OVER_TWO = 3.0 * Math.PI / 2.0;
-
-  /**
-   * 2pi
-   *
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.TWO_PI = 2.0 * Math.PI;
-
-  /**
-   * 1/2pi
-   *
-   * @type {Number}
-   * @constant
-   */
-  CesiumMath.ONE_OVER_TWO_PI = 1.0 / (2.0 * Math.PI);
-
-  /**
-   * The number of radians in a degree.
-   *
-   * @type {Number}
-   * @constant
-   * @default Math.PI / 180.0
-   */
-  CesiumMath.RADIANS_PER_DEGREE = Math.PI / 180.0;
-
-  /**
-   * The number of degrees in a radian.
-   *
-   * @type {Number}
-   * @constant
-   * @default 180.0 / Math.PI
-   */
-  CesiumMath.DEGREES_PER_RADIAN = 180.0 / Math.PI;
-
-  /**
-   * The number of radians in an arc second.
-   *
-   * @type {Number}
-   * @constant
-   * @default {@link CesiumMath.RADIANS_PER_DEGREE} / 3600.0
-   */
-  CesiumMath.RADIANS_PER_ARCSECOND = CesiumMath.RADIANS_PER_DEGREE / 3600.0;
-
-  /**
-   * Converts degrees to radians.
-   * @param {Number} degrees The angle to convert in degrees.
-   * @returns {Number} The corresponding angle in radians.
-   */
-  CesiumMath.toRadians = function(degrees) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(degrees)) {
-          throw new Check.DeveloperError('degrees is required.');
-      }
-      //>>includeEnd('debug');
-      return degrees * CesiumMath.RADIANS_PER_DEGREE;
-  };
-
-  /**
-   * Converts radians to degrees.
-   * @param {Number} radians The angle to convert in radians.
-   * @returns {Number} The corresponding angle in degrees.
-   */
-  CesiumMath.toDegrees = function(radians) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(radians)) {
-          throw new Check.DeveloperError('radians is required.');
-      }
-      //>>includeEnd('debug');
-      return radians * CesiumMath.DEGREES_PER_RADIAN;
-  };
-
-  /**
-   * Converts a longitude value, in radians, to the range [<code>-Math.PI</code>, <code>Math.PI</code>).
-   *
-   * @param {Number} angle The longitude value, in radians, to convert to the range [<code>-Math.PI</code>, <code>Math.PI</code>).
-   * @returns {Number} The equivalent longitude value in the range [<code>-Math.PI</code>, <code>Math.PI</code>).
-   *
-   * @example
-   * // Convert 270 degrees to -90 degrees longitude
-   * var longitude = Cesium.Math.convertLongitudeRange(Cesium.Math.toRadians(270.0));
-   */
-  CesiumMath.convertLongitudeRange = function(angle) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(angle)) {
-          throw new Check.DeveloperError('angle is required.');
-      }
-      //>>includeEnd('debug');
-      var twoPi = CesiumMath.TWO_PI;
-
-      var simplified = angle - Math.floor(angle / twoPi) * twoPi;
-
-      if (simplified < -Math.PI) {
-          return simplified + twoPi;
-      }
-      if (simplified >= Math.PI) {
-          return simplified - twoPi;
-      }
-
-      return simplified;
-  };
-
-  /**
-   * Convenience function that clamps a latitude value, in radians, to the range [<code>-Math.PI/2</code>, <code>Math.PI/2</code>).
-   * Useful for sanitizing data before use in objects requiring correct range.
-   *
-   * @param {Number} angle The latitude value, in radians, to clamp to the range [<code>-Math.PI/2</code>, <code>Math.PI/2</code>).
-   * @returns {Number} The latitude value clamped to the range [<code>-Math.PI/2</code>, <code>Math.PI/2</code>).
-   *
-   * @example
-   * // Clamp 108 degrees latitude to 90 degrees latitude
-   * var latitude = Cesium.Math.clampToLatitudeRange(Cesium.Math.toRadians(108.0));
-   */
-  CesiumMath.clampToLatitudeRange = function(angle) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(angle)) {
-          throw new Check.DeveloperError('angle is required.');
-      }
-      //>>includeEnd('debug');
-
-      return CesiumMath.clamp(angle, -1*CesiumMath.PI_OVER_TWO, CesiumMath.PI_OVER_TWO);
-  };
-
-  /**
-   * Produces an angle in the range -Pi <= angle <= Pi which is equivalent to the provided angle.
-   *
-   * @param {Number} angle in radians
-   * @returns {Number} The angle in the range [<code>-CesiumMath.PI</code>, <code>CesiumMath.PI</code>].
-   */
-  CesiumMath.negativePiToPi = function(angle) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(angle)) {
-          throw new Check.DeveloperError('angle is required.');
-      }
-      //>>includeEnd('debug');
-      return CesiumMath.zeroToTwoPi(angle + CesiumMath.PI) - CesiumMath.PI;
-  };
-
-  /**
-   * Produces an angle in the range 0 <= angle <= 2Pi which is equivalent to the provided angle.
-   *
-   * @param {Number} angle in radians
-   * @returns {Number} The angle in the range [0, <code>CesiumMath.TWO_PI</code>].
-   */
-  CesiumMath.zeroToTwoPi = function(angle) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(angle)) {
-          throw new Check.DeveloperError('angle is required.');
-      }
-      //>>includeEnd('debug');
-      var mod = CesiumMath.mod(angle, CesiumMath.TWO_PI);
-      if (Math.abs(mod) < CesiumMath.EPSILON14 && Math.abs(angle) > CesiumMath.EPSILON14) {
-          return CesiumMath.TWO_PI;
-      }
-      return mod;
-  };
-
-  /**
-   * The modulo operation that also works for negative dividends.
-   *
-   * @param {Number} m The dividend.
-   * @param {Number} n The divisor.
-   * @returns {Number} The remainder.
-   */
-  CesiumMath.mod = function(m, n) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(m)) {
-          throw new Check.DeveloperError('m is required.');
-      }
-      if (!when.defined(n)) {
-          throw new Check.DeveloperError('n is required.');
-      }
-      //>>includeEnd('debug');
-      return ((m % n) + n) % n;
-  };
-
-  /**
-   * Determines if two values are equal using an absolute or relative tolerance test. This is useful
-   * to avoid problems due to roundoff error when comparing floating-point values directly. The values are
-   * first compared using an absolute tolerance test. If that fails, a relative tolerance test is performed.
-   * Use this test if you are unsure of the magnitudes of left and right.
-   *
-   * @param {Number} left The first value to compare.
-   * @param {Number} right The other value to compare.
-   * @param {Number} relativeEpsilon The maximum inclusive delta between <code>left</code> and <code>right</code> for the relative tolerance test.
-   * @param {Number} [absoluteEpsilon=relativeEpsilon] The maximum inclusive delta between <code>left</code> and <code>right</code> for the absolute tolerance test.
-   * @returns {Boolean} <code>true</code> if the values are equal within the epsilon; otherwise, <code>false</code>.
-   *
-   * @example
-   * var a = Cesium.Math.equalsEpsilon(0.0, 0.01, Cesium.Math.EPSILON2); // true
-   * var b = Cesium.Math.equalsEpsilon(0.0, 0.1, Cesium.Math.EPSILON2);  // false
-   * var c = Cesium.Math.equalsEpsilon(3699175.1634344, 3699175.2, Cesium.Math.EPSILON7); // true
-   * var d = Cesium.Math.equalsEpsilon(3699175.1634344, 3699175.2, Cesium.Math.EPSILON9); // false
-   */
-  CesiumMath.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(left)) {
-          throw new Check.DeveloperError('left is required.');
-      }
-      if (!when.defined(right)) {
-          throw new Check.DeveloperError('right is required.');
-      }
-      if (!when.defined(relativeEpsilon)) {
-          throw new Check.DeveloperError('relativeEpsilon is required.');
-      }
-      //>>includeEnd('debug');
-      absoluteEpsilon = when.defaultValue(absoluteEpsilon, relativeEpsilon);
-      var absDiff = Math.abs(left - right);
-      return absDiff <= absoluteEpsilon || absDiff <= relativeEpsilon * Math.max(Math.abs(left), Math.abs(right));
-  };
-
-  /**
-   * Determines if the left value is less than the right value. If the two values are within
-   * <code>absoluteEpsilon</code> of each other, they are considered equal and this function returns false.
-   *
-   * @param {Number} left The first number to compare.
-   * @param {Number} right The second number to compare.
-   * @param {Number} absoluteEpsilon The absolute epsilon to use in comparison.
-   * @returns {Boolean} <code>true</code> if <code>left</code> is less than <code>right</code> by more than
-   *          <code>absoluteEpsilon<code>. <code>false</code> if <code>left</code> is greater or if the two
-   *          values are nearly equal.
-   */
-  CesiumMath.lessThan = function(left, right, absoluteEpsilon) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(left)) {
-          throw new Check.DeveloperError('first is required.');
-      }
-      if (!when.defined(right)) {
-          throw new Check.DeveloperError('second is required.');
-      }
-      if (!when.defined(absoluteEpsilon)) {
-          throw new Check.DeveloperError('relativeEpsilon is required.');
-      }
-      //>>includeEnd('debug');
-      return left - right < -absoluteEpsilon;
-  };
-
-  /**
-   * Determines if the left value is less than or equal to the right value. If the two values are within
-   * <code>absoluteEpsilon</code> of each other, they are considered equal and this function returns true.
-   *
-   * @param {Number} left The first number to compare.
-   * @param {Number} right The second number to compare.
-   * @param {Number} absoluteEpsilon The absolute epsilon to use in comparison.
-   * @returns {Boolean} <code>true</code> if <code>left</code> is less than <code>right</code> or if the
-   *          the values are nearly equal.
-   */
-  CesiumMath.lessThanOrEquals = function(left, right, absoluteEpsilon) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(left)) {
-          throw new Check.DeveloperError('first is required.');
-      }
-      if (!when.defined(right)) {
-          throw new Check.DeveloperError('second is required.');
-      }
-      if (!when.defined(absoluteEpsilon)) {
-          throw new Check.DeveloperError('relativeEpsilon is required.');
-      }
-      //>>includeEnd('debug');
-      return left - right < absoluteEpsilon;
-  };
-
-  /**
-   * Determines if the left value is greater the right value. If the two values are within
-   * <code>absoluteEpsilon</code> of each other, they are considered equal and this function returns false.
-   *
-   * @param {Number} left The first number to compare.
-   * @param {Number} right The second number to compare.
-   * @param {Number} absoluteEpsilon The absolute epsilon to use in comparison.
-   * @returns {Boolean} <code>true</code> if <code>left</code> is greater than <code>right</code> by more than
-   *          <code>absoluteEpsilon<code>. <code>false</code> if <code>left</code> is less or if the two
-   *          values are nearly equal.
-   */
-  CesiumMath.greaterThan = function(left, right, absoluteEpsilon) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(left)) {
-          throw new Check.DeveloperError('first is required.');
-      }
-      if (!when.defined(right)) {
-          throw new Check.DeveloperError('second is required.');
-      }
-      if (!when.defined(absoluteEpsilon)) {
-          throw new Check.DeveloperError('relativeEpsilon is required.');
-      }
-      //>>includeEnd('debug');
-      return left - right > absoluteEpsilon;
-  };
-
-  /**
-   * Determines if the left value is greater than or equal to the right value. If the two values are within
-   * <code>absoluteEpsilon</code> of each other, they are considered equal and this function returns true.
-   *
-   * @param {Number} left The first number to compare.
-   * @param {Number} right The second number to compare.
-   * @param {Number} absoluteEpsilon The absolute epsilon to use in comparison.
-   * @returns {Boolean} <code>true</code> if <code>left</code> is greater than <code>right</code> or if the
-   *          the values are nearly equal.
-   */
-  CesiumMath.greaterThanOrEquals = function(left, right, absoluteEpsilon) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(left)) {
-          throw new Check.DeveloperError('first is required.');
-      }
-      if (!when.defined(right)) {
-          throw new Check.DeveloperError('second is required.');
-      }
-      if (!when.defined(absoluteEpsilon)) {
-          throw new Check.DeveloperError('relativeEpsilon is required.');
-      }
-      //>>includeEnd('debug');
-      return left - right > -absoluteEpsilon;
-  };
-
-  var factorials = [1];
-
-  /**
-   * Computes the factorial of the provided number.
-   *
-   * @param {Number} n The number whose factorial is to be computed.
-   * @returns {Number} The factorial of the provided number or undefined if the number is less than 0.
-   *
-   * @exception {DeveloperError} A number greater than or equal to 0 is required.
-   *
-   *
-   * @example
-   * //Compute 7!, which is equal to 5040
-   * var computedFactorial = Cesium.Math.factorial(7);
-   *
-   * @see {@link http://en.wikipedia.org/wiki/Factorial|Factorial on Wikipedia}
-   */
-  CesiumMath.factorial = function(n) {
-      //>>includeStart('debug', pragmas.debug);
-      if (typeof n !== 'number' || n < 0) {
-          throw new Check.DeveloperError('A number greater than or equal to 0 is required.');
-      }
-      //>>includeEnd('debug');
-
-      var length = factorials.length;
-      if (n >= length) {
-          var sum = factorials[length - 1];
-          for (var i = length; i <= n; i++) {
-              var next = sum * i;
-              factorials.push(next);
-              sum = next;
-          }
-      }
-      return factorials[n];
-  };
-
-  /**
-   * Increments a number with a wrapping to a minimum value if the number exceeds the maximum value.
-   *
-   * @param {Number} [n] The number to be incremented.
-   * @param {Number} [maximumValue] The maximum incremented value before rolling over to the minimum value.
-   * @param {Number} [minimumValue=0.0] The number reset to after the maximum value has been exceeded.
-   * @returns {Number} The incremented number.
-   *
-   * @exception {DeveloperError} Maximum value must be greater than minimum value.
-   *
-   * @example
-   * var n = Cesium.Math.incrementWrap(5, 10, 0); // returns 6
-   * var n = Cesium.Math.incrementWrap(10, 10, 0); // returns 0
-   */
-  CesiumMath.incrementWrap = function(n, maximumValue, minimumValue) {
-      minimumValue = when.defaultValue(minimumValue, 0.0);
-
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(n)) {
-          throw new Check.DeveloperError('n is required.');
-      }
-      if (maximumValue <= minimumValue) {
-          throw new Check.DeveloperError('maximumValue must be greater than minimumValue.');
-      }
-      //>>includeEnd('debug');
-
-      ++n;
-      if (n > maximumValue) {
-          n = minimumValue;
-      }
-      return n;
-  };
-
-  /**
-   * Determines if a positive integer is a power of two.
-   *
-   * @param {Number} n The positive integer to test.
-   * @returns {Boolean} <code>true</code> if the number if a power of two; otherwise, <code>false</code>.
-   *
-   * @exception {DeveloperError} A number greater than or equal to 0 is required.
-   *
-   * @example
-   * var t = Cesium.Math.isPowerOfTwo(16); // true
-   * var f = Cesium.Math.isPowerOfTwo(20); // false
-   */
-  CesiumMath.isPowerOfTwo = function(n) {
-      //>>includeStart('debug', pragmas.debug);
-      if (typeof n !== 'number' || n < 0) {
-          throw new Check.DeveloperError('A number greater than or equal to 0 is required.');
-      }
-      //>>includeEnd('debug');
-
-      return (n !== 0) && ((n & (n - 1)) === 0);
-  };
-
-  /**
-   * Computes the next power-of-two integer greater than or equal to the provided positive integer.
-   *
-   * @param {Number} n The positive integer to test.
-   * @returns {Number} The next power-of-two integer.
-   *
-   * @exception {DeveloperError} A number greater than or equal to 0 is required.
-   *
-   * @example
-   * var n = Cesium.Math.nextPowerOfTwo(29); // 32
-   * var m = Cesium.Math.nextPowerOfTwo(32); // 32
-   */
-  CesiumMath.nextPowerOfTwo = function(n) {
-      //>>includeStart('debug', pragmas.debug);
-      if (typeof n !== 'number' || n < 0) {
-          throw new Check.DeveloperError('A number greater than or equal to 0 is required.');
-      }
-      //>>includeEnd('debug');
-
-      // From http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
-      --n;
-      n |= n >> 1;
-      n |= n >> 2;
-      n |= n >> 4;
-      n |= n >> 8;
-      n |= n >> 16;
-      ++n;
-
-      return n;
-  };
-
-  /**
-   * Constraint a value to lie between two values.
-   *
-   * @param {Number} value The value to constrain.
-   * @param {Number} min The minimum value.
-   * @param {Number} max The maximum value.
-   * @returns {Number} The value clamped so that min <= value <= max.
-   */
-  CesiumMath.clamp = function(value, min, max) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(value)) {
-          throw new Check.DeveloperError('value is required');
-      }
-      if (!when.defined(min)) {
-          throw new Check.DeveloperError('min is required.');
-      }
-      if (!when.defined(max)) {
-          throw new Check.DeveloperError('max is required.');
-      }
-      //>>includeEnd('debug');
-      return value < min ? min : value > max ? max : value;
-  };
-
-  var randomNumberGenerator = new MersenneTwister();
-
-  /**
-   * Sets the seed used by the random number generator
-   * in {@link CesiumMath#nextRandomNumber}.
-   *
-   * @param {Number} seed An integer used as the seed.
-   */
-  CesiumMath.setRandomNumberSeed = function(seed) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(seed)) {
-          throw new Check.DeveloperError('seed is required.');
-      }
-      //>>includeEnd('debug');
-
-      randomNumberGenerator = new MersenneTwister(seed);
-  };
-
-  /**
-   * Generates a random floating point number in the range of [0.0, 1.0)
-   * using a Mersenne twister.
-   *
-   * @returns {Number} A random number in the range of [0.0, 1.0).
-   *
-   * @see CesiumMath.setRandomNumberSeed
-   * @see {@link http://en.wikipedia.org/wiki/Mersenne_twister|Mersenne twister on Wikipedia}
-   */
-  CesiumMath.nextRandomNumber = function() {
-      return randomNumberGenerator.random();
-  };
-
-  /**
-   * Generates a random number between two numbers.
-   *
-   * @param {Number} min The minimum value.
-   * @param {Number} max The maximum value.
-   * @returns {Number} A random number between the min and max.
-   */
-  CesiumMath.randomBetween = function(min, max) {
-      return CesiumMath.nextRandomNumber() * (max - min) + min;
-  };
-
-  /**
-   * Computes <code>Math.acos(value)</code>, but first clamps <code>value</code> to the range [-1.0, 1.0]
-   * so that the function will never return NaN.
-   *
-   * @param {Number} value The value for which to compute acos.
-   * @returns {Number} The acos of the value if the value is in the range [-1.0, 1.0], or the acos of -1.0 or 1.0,
-   *          whichever is closer, if the value is outside the range.
-   */
-  CesiumMath.acosClamped = function(value) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(value)) {
-          throw new Check.DeveloperError('value is required.');
-      }
-      //>>includeEnd('debug');
-      return Math.acos(CesiumMath.clamp(value, -1.0, 1.0));
-  };
-
-  /**
-   * Computes <code>Math.asin(value)</code>, but first clamps <code>value</code> to the range [-1.0, 1.0]
-   * so that the function will never return NaN.
-   *
-   * @param {Number} value The value for which to compute asin.
-   * @returns {Number} The asin of the value if the value is in the range [-1.0, 1.0], or the asin of -1.0 or 1.0,
-   *          whichever is closer, if the value is outside the range.
-   */
-  CesiumMath.asinClamped = function(value) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(value)) {
-          throw new Check.DeveloperError('value is required.');
-      }
-      //>>includeEnd('debug');
-      return Math.asin(CesiumMath.clamp(value, -1.0, 1.0));
-  };
-
-  /**
-   * Finds the chord length between two points given the circle's radius and the angle between the points.
-   *
-   * @param {Number} angle The angle between the two points.
-   * @param {Number} radius The radius of the circle.
-   * @returns {Number} The chord length.
-   */
-  CesiumMath.chordLength = function(angle, radius) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(angle)) {
-          throw new Check.DeveloperError('angle is required.');
-      }
-      if (!when.defined(radius)) {
-          throw new Check.DeveloperError('radius is required.');
-      }
-      //>>includeEnd('debug');
-      return 2.0 * radius * Math.sin(angle * 0.5);
-  };
-
-  /**
-   * Finds the logarithm of a number to a base.
-   *
-   * @param {Number} number The number.
-   * @param {Number} base The base.
-   * @returns {Number} The result.
-   */
-  CesiumMath.logBase = function(number, base) {
-      //>>includeStart('debug', pragmas.debug);
-      if (!when.defined(number)) {
-          throw new Check.DeveloperError('number is required.');
-      }
-      if (!when.defined(base)) {
-          throw new Check.DeveloperError('base is required.');
-      }
-      //>>includeEnd('debug');
-      return Math.log(number) / Math.log(base);
-  };
-
-  /**
-   * Finds the cube root of a number.
-   * Returns NaN if <code>number</code> is not provided.
-   *
-   * @function
-   * @param {Number} [number] The number.
-   * @returns {Number} The result.
-   */
-  CesiumMath.cbrt = when.defaultValue(Math.cbrt, function cbrt(number) {
-      var result = Math.pow(Math.abs(number), 1.0 / 3.0);
-      return number < 0.0 ? -result : result;
-  });
-
-  /**
-   * Finds the base 2 logarithm of a number.
-   *
-   * @function
-   * @param {Number} number The number.
-   * @returns {Number} The result.
-   */
-  CesiumMath.log2 = when.defaultValue(Math.log2, function log2(number) {
-      return Math.log(number) * Math.LOG2E;
-  });
-
-  /**
-   * @private
-   */
-  CesiumMath.fog = function(distanceToCamera, density) {
-      var scalar = distanceToCamera * density;
-      return 1.0 - Math.exp(-(scalar * scalar));
-  };
-
-  /**
-   * Computes a fast approximation of Atan for input in the range [-1, 1].
-   *
-   * Based on Michal Drobot's approximation from ShaderFastLibs,
-   * which in turn is based on "Efficient approximations for the arctangent function,"
-   * Rajan, S. Sichun Wang Inkol, R. Joyal, A., May 2006.
-   * Adapted from ShaderFastLibs under MIT License.
-   *
-   * @param {Number} x An input number in the range [-1, 1]
-   * @returns {Number} An approximation of atan(x)
-   */
-  CesiumMath.fastApproximateAtan = function(x) {
-      //>>includeStart('debug', pragmas.debug);
-      Check.Check.typeOf.number('x', x);
-      //>>includeEnd('debug');
-
-      return x * (-0.1784 * Math.abs(x) - 0.0663 * x * x + 1.0301);
-  };
-
-  /**
-   * Computes a fast approximation of Atan2(x, y) for arbitrary input scalars.
-   *
-   * Range reduction math based on nvidia's cg reference implementation: http://developer.download.nvidia.com/cg/atan2.html
-   *
-   * @param {Number} x An input number that isn't zero if y is zero.
-   * @param {Number} y An input number that isn't zero if x is zero.
-   * @returns {Number} An approximation of atan2(x, y)
-   */
-  CesiumMath.fastApproximateAtan2 = function(x, y) {
-      //>>includeStart('debug', pragmas.debug);
-      Check.Check.typeOf.number('x', x);
-      Check.Check.typeOf.number('y', y);
-      //>>includeEnd('debug');
-
-      // atan approximations are usually only reliable over [-1, 1]
-      // So reduce the range by flipping whether x or y is on top based on which is bigger.
-      var opposite;
-      var adjacent;
-      var t = Math.abs(x); // t used as swap and atan result.
-      opposite = Math.abs(y);
-      adjacent = Math.max(t, opposite);
-      opposite = Math.min(t, opposite);
-
-      var oppositeOverAdjacent = opposite / adjacent;
-      //>>includeStart('debug', pragmas.debug);
-      if (isNaN(oppositeOverAdjacent)) {
-          throw new Check.DeveloperError('either x or y must be nonzero');
-      }
-      //>>includeEnd('debug');
-      t = CesiumMath.fastApproximateAtan(oppositeOverAdjacent);
-
-      // Undo range reduction
-      t = Math.abs(y) > Math.abs(x) ? CesiumMath.PI_OVER_TWO - t : t;
-      t = x < 0.0 ?  CesiumMath.PI - t : t;
-      t = y < 0.0 ? -t : t;
-      return t;
-  };
-
-  exports.CesiumMath = CesiumMath;
-
-});
diff --git a/public/libs/Cesium/Workers/OrientedBoundingBox-0ede1598.js b/public/libs/Cesium/Workers/OrientedBoundingBox-0ede1598.js
deleted file mode 100644
index 639166d..0000000
--- a/public/libs/Cesium/Workers/OrientedBoundingBox-0ede1598.js
+++ /dev/null
@@ -1,822 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Plane-8390418f', './EllipsoidTangentPlane-e324bfa4'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Plane, EllipsoidTangentPlane) { 'use strict';
-
-    /**
-         * Creates an instance of an OrientedBoundingBox.
-         * An OrientedBoundingBox of some object is a closed and convex cuboid. It can provide a tighter bounding volume than {@link BoundingSphere} or {@link AxisAlignedBoundingBox} in many cases.
-         * @alias OrientedBoundingBox
-         * @constructor
-         *
-         * @param {Cartesian3} [center=Cartesian3.ZERO] The center of the box.
-         * @param {Matrix3} [halfAxes=Matrix3.ZERO] The three orthogonal half-axes of the bounding box.
-         *                                          Equivalently, the transformation matrix, to rotate and scale a 0x0x0
-         *                                          cube centered at the origin.
-         *
-         *
-         * @example
-         * // Create an OrientedBoundingBox using a transformation matrix, a position where the box will be translated, and a scale.
-         * var center = new Cesium.Cartesian3(1.0, 0.0, 0.0);
-         * var halfAxes = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(1.0, 3.0, 2.0), new Cesium.Matrix3());
-         *
-         * var obb = new Cesium.OrientedBoundingBox(center, halfAxes);
-         *
-         * @see BoundingSphere
-         * @see BoundingRectangle
-         */
-        function OrientedBoundingBox(center, halfAxes) {
-            /**
-             * The center of the box.
-             * @type {Cartesian3}
-             * @default {@link Cartesian3.ZERO}
-             */
-            this.center = Cartographic.Cartesian3.clone(when.defaultValue(center, Cartographic.Cartesian3.ZERO));
-            /**
-             * The transformation matrix, to rotate the box to the right position.
-             * @type {Matrix3}
-             * @default {@link Matrix3.ZERO}
-             */
-            this.halfAxes = BoundingSphere.Matrix3.clone(when.defaultValue(halfAxes, BoundingSphere.Matrix3.ZERO));
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        OrientedBoundingBox.packedLength = Cartographic.Cartesian3.packedLength + BoundingSphere.Matrix3.packedLength;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {OrientedBoundingBox} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        OrientedBoundingBox.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            Cartographic.Cartesian3.pack(value.center, array, startingIndex);
-            BoundingSphere.Matrix3.pack(value.halfAxes, array, startingIndex + Cartographic.Cartesian3.packedLength);
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {OrientedBoundingBox} [result] The object into which to store the result.
-         * @returns {OrientedBoundingBox} The modified result parameter or a new OrientedBoundingBox instance if one was not provided.
-         */
-        OrientedBoundingBox.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new OrientedBoundingBox();
-            }
-
-            Cartographic.Cartesian3.unpack(array, startingIndex, result.center);
-            BoundingSphere.Matrix3.unpack(array, startingIndex + Cartographic.Cartesian3.packedLength, result.halfAxes);
-            return result;
-        };
-
-        var scratchCartesian1 = new Cartographic.Cartesian3();
-        var scratchCartesian2 = new Cartographic.Cartesian3();
-        var scratchCartesian3 = new Cartographic.Cartesian3();
-        var scratchCartesian4 = new Cartographic.Cartesian3();
-        var scratchCartesian5 = new Cartographic.Cartesian3();
-        var scratchCartesian6 = new Cartographic.Cartesian3();
-        var scratchCovarianceResult = new BoundingSphere.Matrix3();
-        var scratchEigenResult = {
-            unitary : new BoundingSphere.Matrix3(),
-            diagonal : new BoundingSphere.Matrix3()
-        };
-
-        /**
-         * Computes an instance of an OrientedBoundingBox of the given positions.
-         * This is an implementation of Stefan Gottschalk's Collision Queries using Oriented Bounding Boxes solution (PHD thesis).
-         * Reference: http://gamma.cs.unc.edu/users/gottschalk/main.pdf
-         *
-         * @param {Cartesian3[]} [positions] List of {@link Cartesian3} points that the bounding box will enclose.
-         * @param {OrientedBoundingBox} [result] The object onto which to store the result.
-         * @returns {OrientedBoundingBox} The modified result parameter or a new OrientedBoundingBox instance if one was not provided.
-         *
-         * @example
-         * // Compute an object oriented bounding box enclosing two points.
-         * var box = Cesium.OrientedBoundingBox.fromPoints([new Cesium.Cartesian3(2, 0, 0), new Cesium.Cartesian3(-2, 0, 0)]);
-         */
-        OrientedBoundingBox.fromPoints = function(positions, result) {
-            if (!when.defined(result)) {
-                result = new OrientedBoundingBox();
-            }
-
-            if (!when.defined(positions) || positions.length === 0) {
-                result.halfAxes = BoundingSphere.Matrix3.ZERO;
-                result.center = Cartographic.Cartesian3.ZERO;
-                return result;
-            }
-
-            var i;
-            var length = positions.length;
-
-            var meanPoint = Cartographic.Cartesian3.clone(positions[0], scratchCartesian1);
-            for (i = 1; i < length; i++) {
-                Cartographic.Cartesian3.add(meanPoint, positions[i], meanPoint);
-            }
-            var invLength = 1.0 / length;
-            Cartographic.Cartesian3.multiplyByScalar(meanPoint, invLength, meanPoint);
-
-            var exx = 0.0;
-            var exy = 0.0;
-            var exz = 0.0;
-            var eyy = 0.0;
-            var eyz = 0.0;
-            var ezz = 0.0;
-            var p;
-
-            for (i = 0; i < length; i++) {
-                p = Cartographic.Cartesian3.subtract(positions[i], meanPoint, scratchCartesian2);
-                exx += p.x * p.x;
-                exy += p.x * p.y;
-                exz += p.x * p.z;
-                eyy += p.y * p.y;
-                eyz += p.y * p.z;
-                ezz += p.z * p.z;
-            }
-
-            exx *= invLength;
-            exy *= invLength;
-            exz *= invLength;
-            eyy *= invLength;
-            eyz *= invLength;
-            ezz *= invLength;
-
-            var covarianceMatrix = scratchCovarianceResult;
-            covarianceMatrix[0] = exx;
-            covarianceMatrix[1] = exy;
-            covarianceMatrix[2] = exz;
-            covarianceMatrix[3] = exy;
-            covarianceMatrix[4] = eyy;
-            covarianceMatrix[5] = eyz;
-            covarianceMatrix[6] = exz;
-            covarianceMatrix[7] = eyz;
-            covarianceMatrix[8] = ezz;
-
-            var eigenDecomposition = BoundingSphere.Matrix3.computeEigenDecomposition(covarianceMatrix, scratchEigenResult);
-            var rotation = BoundingSphere.Matrix3.clone(eigenDecomposition.unitary, result.halfAxes);
-
-            var v1 = BoundingSphere.Matrix3.getColumn(rotation, 0, scratchCartesian4);
-            var v2 = BoundingSphere.Matrix3.getColumn(rotation, 1, scratchCartesian5);
-            var v3 = BoundingSphere.Matrix3.getColumn(rotation, 2, scratchCartesian6);
-
-            var u1 = -Number.MAX_VALUE;
-            var u2 = -Number.MAX_VALUE;
-            var u3 = -Number.MAX_VALUE;
-            var l1 = Number.MAX_VALUE;
-            var l2 = Number.MAX_VALUE;
-            var l3 = Number.MAX_VALUE;
-
-            for (i = 0; i < length; i++) {
-                p = positions[i];
-                u1 = Math.max(Cartographic.Cartesian3.dot(v1, p), u1);
-                u2 = Math.max(Cartographic.Cartesian3.dot(v2, p), u2);
-                u3 = Math.max(Cartographic.Cartesian3.dot(v3, p), u3);
-
-                l1 = Math.min(Cartographic.Cartesian3.dot(v1, p), l1);
-                l2 = Math.min(Cartographic.Cartesian3.dot(v2, p), l2);
-                l3 = Math.min(Cartographic.Cartesian3.dot(v3, p), l3);
-            }
-
-            v1 = Cartographic.Cartesian3.multiplyByScalar(v1, 0.5 * (l1 + u1), v1);
-            v2 = Cartographic.Cartesian3.multiplyByScalar(v2, 0.5 * (l2 + u2), v2);
-            v3 = Cartographic.Cartesian3.multiplyByScalar(v3, 0.5 * (l3 + u3), v3);
-
-            var center = Cartographic.Cartesian3.add(v1, v2, result.center);
-            Cartographic.Cartesian3.add(center, v3, center);
-
-            var scale = scratchCartesian3;
-            scale.x = u1 - l1;
-            scale.y = u2 - l2;
-            scale.z = u3 - l3;
-            Cartographic.Cartesian3.multiplyByScalar(scale, 0.5, scale);
-            BoundingSphere.Matrix3.multiplyByScale(result.halfAxes, scale, result.halfAxes);
-
-            return result;
-        };
-
-        var scratchOffset = new Cartographic.Cartesian3();
-        var scratchScale = new Cartographic.Cartesian3();
-        function fromPlaneExtents(planeOrigin, planeXAxis, planeYAxis, planeZAxis, minimumX, maximumX, minimumY, maximumY, minimumZ, maximumZ, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(minimumX) ||
-                !when.defined(maximumX) ||
-                !when.defined(minimumY) ||
-                !when.defined(maximumY) ||
-                !when.defined(minimumZ) ||
-                !when.defined(maximumZ)) {
-                throw new Check.DeveloperError('all extents (minimum/maximum X/Y/Z) are required.');
-            }
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new OrientedBoundingBox();
-            }
-
-            var halfAxes = result.halfAxes;
-            BoundingSphere.Matrix3.setColumn(halfAxes, 0, planeXAxis, halfAxes);
-            BoundingSphere.Matrix3.setColumn(halfAxes, 1, planeYAxis, halfAxes);
-            BoundingSphere.Matrix3.setColumn(halfAxes, 2, planeZAxis, halfAxes);
-
-            var centerOffset = scratchOffset;
-            centerOffset.x = (minimumX + maximumX) / 2.0;
-            centerOffset.y = (minimumY + maximumY) / 2.0;
-            centerOffset.z = (minimumZ + maximumZ) / 2.0;
-
-            var scale = scratchScale;
-            scale.x = (maximumX - minimumX) / 2.0;
-            scale.y = (maximumY - minimumY) / 2.0;
-            scale.z = (maximumZ - minimumZ) / 2.0;
-
-            var center = result.center;
-            centerOffset = BoundingSphere.Matrix3.multiplyByVector(halfAxes, centerOffset, centerOffset);
-            Cartographic.Cartesian3.add(planeOrigin, centerOffset, center);
-            BoundingSphere.Matrix3.multiplyByScale(halfAxes, scale, halfAxes);
-
-            return result;
-        }
-
-        var scratchRectangleCenterCartographic = new Cartographic.Cartographic();
-        var scratchRectangleCenter = new Cartographic.Cartesian3();
-        var scratchPerimeterCartographicNC = new Cartographic.Cartographic();
-        var scratchPerimeterCartographicNW = new Cartographic.Cartographic();
-        var scratchPerimeterCartographicCW = new Cartographic.Cartographic();
-        var scratchPerimeterCartographicSW = new Cartographic.Cartographic();
-        var scratchPerimeterCartographicSC = new Cartographic.Cartographic();
-        var scratchPerimeterCartesianNC = new Cartographic.Cartesian3();
-        var scratchPerimeterCartesianNW = new Cartographic.Cartesian3();
-        var scratchPerimeterCartesianCW = new Cartographic.Cartesian3();
-        var scratchPerimeterCartesianSW = new Cartographic.Cartesian3();
-        var scratchPerimeterCartesianSC = new Cartographic.Cartesian3();
-        var scratchPerimeterProjectedNC = new Cartesian2.Cartesian2();
-        var scratchPerimeterProjectedNW = new Cartesian2.Cartesian2();
-        var scratchPerimeterProjectedCW = new Cartesian2.Cartesian2();
-        var scratchPerimeterProjectedSW = new Cartesian2.Cartesian2();
-        var scratchPerimeterProjectedSC = new Cartesian2.Cartesian2();
-
-        var scratchPlaneOrigin = new Cartographic.Cartesian3();
-        var scratchPlaneNormal = new Cartographic.Cartesian3();
-        var scratchPlaneXAxis = new Cartographic.Cartesian3();
-        var scratchHorizonCartesian = new Cartographic.Cartesian3();
-        var scratchHorizonProjected = new Cartesian2.Cartesian2();
-        var scratchMaxY = new Cartographic.Cartesian3();
-        var scratchMinY = new Cartographic.Cartesian3();
-        var scratchZ = new Cartographic.Cartesian3();
-        var scratchPlane = new Plane.Plane(Cartographic.Cartesian3.UNIT_X, 0.0);
-
-        /**
-         * Computes an OrientedBoundingBox that bounds a {@link Rectangle} on the surface of an {@link Ellipsoid}.
-         * There are no guarantees about the orientation of the bounding box.
-         *
-         * @param {Rectangle} rectangle The cartographic rectangle on the surface of the ellipsoid.
-         * @param {Number} [minimumHeight=0.0] The minimum height (elevation) within the tile.
-         * @param {Number} [maximumHeight=0.0] The maximum height (elevation) within the tile.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the rectangle is defined.
-         * @param {OrientedBoundingBox} [result] The object onto which to store the result.
-         * @returns {OrientedBoundingBox} The modified result parameter or a new OrientedBoundingBox instance if none was provided.
-         *
-         * @exception {DeveloperError} rectangle.width must be between 0 and pi.
-         * @exception {DeveloperError} rectangle.height must be between 0 and pi.
-         * @exception {DeveloperError} ellipsoid must be an ellipsoid of revolution (<code>radii.x == radii.y</code>)
-         */
-        OrientedBoundingBox.fromRectangle = function(rectangle, minimumHeight, maximumHeight, ellipsoid, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(rectangle)) {
-                throw new Check.DeveloperError('rectangle is required');
-            }
-            if (rectangle.width < 0.0 || rectangle.width > _Math.CesiumMath.TWO_PI) {
-                throw new Check.DeveloperError('Rectangle width must be between 0 and 2*pi');
-            }
-            if (rectangle.height < 0.0 || rectangle.height > _Math.CesiumMath.PI) {
-                throw new Check.DeveloperError('Rectangle height must be between 0 and pi');
-            }
-            if (when.defined(ellipsoid) && !_Math.CesiumMath.equalsEpsilon(ellipsoid.radii.x, ellipsoid.radii.y, _Math.CesiumMath.EPSILON15)) {
-                throw new Check.DeveloperError('Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)');
-            }
-            //>>includeEnd('debug');
-
-            minimumHeight = when.defaultValue(minimumHeight, 0.0);
-            maximumHeight = when.defaultValue(maximumHeight, 0.0);
-            ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-            var minX, maxX, minY, maxY, minZ, maxZ, plane;
-
-            if (rectangle.width <= _Math.CesiumMath.PI) {
-                // The bounding box will be aligned with the tangent plane at the center of the rectangle.
-                var tangentPointCartographic = Cartesian2.Rectangle.center(rectangle, scratchRectangleCenterCartographic);
-                var tangentPoint = ellipsoid.cartographicToCartesian(tangentPointCartographic, scratchRectangleCenter);
-                var tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(tangentPoint, ellipsoid);
-                plane = tangentPlane.plane;
-
-                // If the rectangle spans the equator, CW is instead aligned with the equator (because it sticks out the farthest at the equator).
-                var lonCenter = tangentPointCartographic.longitude;
-                var latCenter = (rectangle.south < 0.0 && rectangle.north > 0.0) ? 0.0 : tangentPointCartographic.latitude;
-
-                // Compute XY extents using the rectangle at maximum height
-                var perimeterCartographicNC = Cartographic.Cartographic.fromRadians(lonCenter, rectangle.north, maximumHeight, scratchPerimeterCartographicNC);
-                var perimeterCartographicNW = Cartographic.Cartographic.fromRadians(rectangle.west, rectangle.north, maximumHeight, scratchPerimeterCartographicNW);
-                var perimeterCartographicCW = Cartographic.Cartographic.fromRadians(rectangle.west, latCenter, maximumHeight, scratchPerimeterCartographicCW);
-                var perimeterCartographicSW = Cartographic.Cartographic.fromRadians(rectangle.west, rectangle.south, maximumHeight, scratchPerimeterCartographicSW);
-                var perimeterCartographicSC = Cartographic.Cartographic.fromRadians(lonCenter, rectangle.south, maximumHeight, scratchPerimeterCartographicSC);
-
-                var perimeterCartesianNC = ellipsoid.cartographicToCartesian(perimeterCartographicNC, scratchPerimeterCartesianNC);
-                var perimeterCartesianNW = ellipsoid.cartographicToCartesian(perimeterCartographicNW, scratchPerimeterCartesianNW);
-                var perimeterCartesianCW = ellipsoid.cartographicToCartesian(perimeterCartographicCW, scratchPerimeterCartesianCW);
-                var perimeterCartesianSW = ellipsoid.cartographicToCartesian(perimeterCartographicSW, scratchPerimeterCartesianSW);
-                var perimeterCartesianSC = ellipsoid.cartographicToCartesian(perimeterCartographicSC, scratchPerimeterCartesianSC);
-
-                var perimeterProjectedNC = tangentPlane.projectPointToNearestOnPlane(perimeterCartesianNC, scratchPerimeterProjectedNC);
-                var perimeterProjectedNW = tangentPlane.projectPointToNearestOnPlane(perimeterCartesianNW, scratchPerimeterProjectedNW);
-                var perimeterProjectedCW = tangentPlane.projectPointToNearestOnPlane(perimeterCartesianCW, scratchPerimeterProjectedCW);
-                var perimeterProjectedSW = tangentPlane.projectPointToNearestOnPlane(perimeterCartesianSW, scratchPerimeterProjectedSW);
-                var perimeterProjectedSC = tangentPlane.projectPointToNearestOnPlane(perimeterCartesianSC, scratchPerimeterProjectedSC);
-
-                minX = Math.min(perimeterProjectedNW.x, perimeterProjectedCW.x, perimeterProjectedSW.x);
-                maxX = -minX; // symmetrical
-
-                maxY = Math.max(perimeterProjectedNW.y, perimeterProjectedNC.y);
-                minY = Math.min(perimeterProjectedSW.y, perimeterProjectedSC.y);
-
-                // Compute minimum Z using the rectangle at minimum height, since it will be deeper than the maximum height
-                perimeterCartographicNW.height = perimeterCartographicSW.height = minimumHeight;
-                perimeterCartesianNW = ellipsoid.cartographicToCartesian(perimeterCartographicNW, scratchPerimeterCartesianNW);
-                perimeterCartesianSW = ellipsoid.cartographicToCartesian(perimeterCartographicSW, scratchPerimeterCartesianSW);
-
-                minZ = Math.min(Plane.Plane.getPointDistance(plane, perimeterCartesianNW), Plane.Plane.getPointDistance(plane, perimeterCartesianSW));
-                maxZ = maximumHeight;  // Since the tangent plane touches the surface at height = 0, this is okay
-
-                return fromPlaneExtents(tangentPlane.origin, tangentPlane.xAxis, tangentPlane.yAxis, tangentPlane.zAxis, minX, maxX, minY, maxY, minZ, maxZ, result);
-            }
-
-            // Handle the case where rectangle width is greater than PI (wraps around more than half the ellipsoid).
-            var fullyAboveEquator = rectangle.south > 0.0;
-            var fullyBelowEquator = rectangle.north < 0.0;
-            var latitudeNearestToEquator = fullyAboveEquator ? rectangle.south : (fullyBelowEquator ? rectangle.north : 0.0);
-            var centerLongitude = Cartesian2.Rectangle.center(rectangle, scratchRectangleCenterCartographic).longitude;
-
-            // Plane is located at the rectangle's center longitude and the rectangle's latitude that is closest to the equator. It rotates around the Z axis.
-            // This results in a better fit than the obb approach for smaller rectangles, which orients with the rectangle's center normal.
-            var planeOrigin = Cartographic.Cartesian3.fromRadians(centerLongitude, latitudeNearestToEquator, maximumHeight, ellipsoid, scratchPlaneOrigin);
-            planeOrigin.z = 0.0; // center the plane on the equator to simpify plane normal calculation
-            var isPole = Math.abs(planeOrigin.x) < _Math.CesiumMath.EPSILON10 && Math.abs(planeOrigin.y) < _Math.CesiumMath.EPSILON10;
-            var planeNormal = !isPole ? Cartographic.Cartesian3.normalize(planeOrigin, scratchPlaneNormal) : Cartographic.Cartesian3.UNIT_X;
-            var planeYAxis = Cartographic.Cartesian3.UNIT_Z;
-            var planeXAxis = Cartographic.Cartesian3.cross(planeNormal, planeYAxis, scratchPlaneXAxis);
-            plane = Plane.Plane.fromPointNormal(planeOrigin, planeNormal, scratchPlane);
-
-            // Get the horizon point relative to the center. This will be the farthest extent in the plane's X dimension.
-            var horizonCartesian = Cartographic.Cartesian3.fromRadians(centerLongitude + _Math.CesiumMath.PI_OVER_TWO, latitudeNearestToEquator, maximumHeight, ellipsoid, scratchHorizonCartesian);
-            maxX = Cartographic.Cartesian3.dot(Plane.Plane.projectPointOntoPlane(plane, horizonCartesian, scratchHorizonProjected), planeXAxis);
-            minX = -maxX; // symmetrical
-
-            // Get the min and max Y, using the height that will give the largest extent
-            maxY = Cartographic.Cartesian3.fromRadians(0.0, rectangle.north, fullyBelowEquator ? minimumHeight : maximumHeight, ellipsoid, scratchMaxY).z;
-            minY = Cartographic.Cartesian3.fromRadians(0.0, rectangle.south, fullyAboveEquator ? minimumHeight : maximumHeight, ellipsoid, scratchMinY).z;
-
-            var farZ = Cartographic.Cartesian3.fromRadians(rectangle.east, latitudeNearestToEquator, maximumHeight, ellipsoid, scratchZ);
-            minZ = Plane.Plane.getPointDistance(plane, farZ);
-            maxZ = 0.0; // plane origin starts at maxZ already
-
-            // min and max are local to the plane axes
-            return fromPlaneExtents(planeOrigin, planeXAxis, planeYAxis, planeNormal, minX, maxX, minY, maxY, minZ, maxZ, result);
-        };
-
-        /**
-         * Duplicates a OrientedBoundingBox instance.
-         *
-         * @param {OrientedBoundingBox} box The bounding box to duplicate.
-         * @param {OrientedBoundingBox} [result] The object onto which to store the result.
-         * @returns {OrientedBoundingBox} The modified result parameter or a new OrientedBoundingBox instance if none was provided. (Returns undefined if box is undefined)
-         */
-        OrientedBoundingBox.clone = function(box, result) {
-            if (!when.defined(box)) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                return new OrientedBoundingBox(box.center, box.halfAxes);
-            }
-
-            Cartographic.Cartesian3.clone(box.center, result.center);
-            BoundingSphere.Matrix3.clone(box.halfAxes, result.halfAxes);
-
-            return result;
-        };
-
-        /**
-         * Determines which side of a plane the oriented bounding box is located.
-         *
-         * @param {OrientedBoundingBox} box The oriented bounding box to test.
-         * @param {Plane} plane The plane to test against.
-         * @returns {Intersect} {@link Intersect.INSIDE} if the entire box is on the side of the plane
-         *                      the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is
-         *                      on the opposite side, and {@link Intersect.INTERSECTING} if the box
-         *                      intersects the plane.
-         */
-        OrientedBoundingBox.intersectPlane = function(box, plane) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(box)) {
-                throw new Check.DeveloperError('box is required.');
-            }
-
-            if (!when.defined(plane)) {
-                throw new Check.DeveloperError('plane is required.');
-            }
-            //>>includeEnd('debug');
-
-            var center = box.center;
-            var normal = plane.normal;
-            var halfAxes = box.halfAxes;
-            var normalX = normal.x, normalY = normal.y, normalZ = normal.z;
-            // plane is used as if it is its normal; the first three components are assumed to be normalized
-            var radEffective = Math.abs(normalX * halfAxes[BoundingSphere.Matrix3.COLUMN0ROW0] + normalY * halfAxes[BoundingSphere.Matrix3.COLUMN0ROW1] + normalZ * halfAxes[BoundingSphere.Matrix3.COLUMN0ROW2]) +
-                               Math.abs(normalX * halfAxes[BoundingSphere.Matrix3.COLUMN1ROW0] + normalY * halfAxes[BoundingSphere.Matrix3.COLUMN1ROW1] + normalZ * halfAxes[BoundingSphere.Matrix3.COLUMN1ROW2]) +
-                               Math.abs(normalX * halfAxes[BoundingSphere.Matrix3.COLUMN2ROW0] + normalY * halfAxes[BoundingSphere.Matrix3.COLUMN2ROW1] + normalZ * halfAxes[BoundingSphere.Matrix3.COLUMN2ROW2]);
-            var distanceToPlane = Cartographic.Cartesian3.dot(normal, center) + plane.distance;
-
-            if (distanceToPlane <= -radEffective) {
-                // The entire box is on the negative side of the plane normal
-                return BoundingSphere.Intersect.OUTSIDE;
-            } else if (distanceToPlane >= radEffective) {
-                // The entire box is on the positive side of the plane normal
-                return BoundingSphere.Intersect.INSIDE;
-            }
-            return BoundingSphere.Intersect.INTERSECTING;
-        };
-
-        var scratchCartesianU = new Cartographic.Cartesian3();
-        var scratchCartesianV = new Cartographic.Cartesian3();
-        var scratchCartesianW = new Cartographic.Cartesian3();
-        var scratchPPrime = new Cartographic.Cartesian3();
-
-        /**
-         * Computes the estimated distance squared from the closest point on a bounding box to a point.
-         *
-         * @param {OrientedBoundingBox} box The box.
-         * @param {Cartesian3} cartesian The point
-         * @returns {Number} The estimated distance squared from the bounding sphere to the point.
-         *
-         * @example
-         * // Sort bounding boxes from back to front
-         * boxes.sort(function(a, b) {
-         *     return Cesium.OrientedBoundingBox.distanceSquaredTo(b, camera.positionWC) - Cesium.OrientedBoundingBox.distanceSquaredTo(a, camera.positionWC);
-         * });
-         */
-        OrientedBoundingBox.distanceSquaredTo = function(box, cartesian) {
-            // See Geometric Tools for Computer Graphics 10.4.2
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(box)) {
-                throw new Check.DeveloperError('box is required.');
-            }
-            if (!when.defined(cartesian)) {
-                throw new Check.DeveloperError('cartesian is required.');
-            }
-            //>>includeEnd('debug');
-
-            var offset = Cartographic.Cartesian3.subtract(cartesian, box.center, scratchOffset);
-
-            var halfAxes = box.halfAxes;
-            var u = BoundingSphere.Matrix3.getColumn(halfAxes, 0, scratchCartesianU);
-            var v = BoundingSphere.Matrix3.getColumn(halfAxes, 1, scratchCartesianV);
-            var w = BoundingSphere.Matrix3.getColumn(halfAxes, 2, scratchCartesianW);
-
-            var uHalf = Cartographic.Cartesian3.magnitude(u);
-            var vHalf = Cartographic.Cartesian3.magnitude(v);
-            var wHalf = Cartographic.Cartesian3.magnitude(w);
-
-            Cartographic.Cartesian3.normalize(u, u);
-            Cartographic.Cartesian3.normalize(v, v);
-            Cartographic.Cartesian3.normalize(w, w);
-
-            var pPrime = scratchPPrime;
-            pPrime.x = Cartographic.Cartesian3.dot(offset, u);
-            pPrime.y = Cartographic.Cartesian3.dot(offset, v);
-            pPrime.z = Cartographic.Cartesian3.dot(offset, w);
-
-            var distanceSquared = 0.0;
-            var d;
-
-            if (pPrime.x < -uHalf) {
-                d = pPrime.x + uHalf;
-                distanceSquared += d * d;
-            } else if (pPrime.x > uHalf) {
-                d = pPrime.x - uHalf;
-                distanceSquared += d * d;
-            }
-
-            if (pPrime.y < -vHalf) {
-                d = pPrime.y + vHalf;
-                distanceSquared += d * d;
-            } else if (pPrime.y > vHalf) {
-                d = pPrime.y - vHalf;
-                distanceSquared += d * d;
-            }
-
-            if (pPrime.z < -wHalf) {
-                d = pPrime.z + wHalf;
-                distanceSquared += d * d;
-            } else if (pPrime.z > wHalf) {
-                d = pPrime.z - wHalf;
-                distanceSquared += d * d;
-            }
-
-            return distanceSquared;
-        };
-
-        var scratchCorner = new Cartographic.Cartesian3();
-        var scratchToCenter = new Cartographic.Cartesian3();
-
-        /**
-         * The distances calculated by the vector from the center of the bounding box to position projected onto direction.
-         * <br>
-         * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the
-         * closest and farthest planes from position that intersect the bounding box.
-         *
-         * @param {OrientedBoundingBox} box The bounding box to calculate the distance to.
-         * @param {Cartesian3} position The position to calculate the distance from.
-         * @param {Cartesian3} direction The direction from position.
-         * @param {Interval} [result] A Interval to store the nearest and farthest distances.
-         * @returns {Interval} The nearest and farthest distances on the bounding box from position in direction.
-         */
-        OrientedBoundingBox.computePlaneDistances = function(box, position, direction, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(box)) {
-                throw new Check.DeveloperError('box is required.');
-            }
-
-            if (!when.defined(position)) {
-                throw new Check.DeveloperError('position is required.');
-            }
-
-            if (!when.defined(direction)) {
-                throw new Check.DeveloperError('direction is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere.Interval();
-            }
-
-            var minDist = Number.POSITIVE_INFINITY;
-            var maxDist = Number.NEGATIVE_INFINITY;
-
-            var center = box.center;
-            var halfAxes = box.halfAxes;
-
-            var u = BoundingSphere.Matrix3.getColumn(halfAxes, 0, scratchCartesianU);
-            var v = BoundingSphere.Matrix3.getColumn(halfAxes, 1, scratchCartesianV);
-            var w = BoundingSphere.Matrix3.getColumn(halfAxes, 2, scratchCartesianW);
-
-            // project first corner
-            var corner = Cartographic.Cartesian3.add(u, v, scratchCorner);
-            Cartographic.Cartesian3.add(corner, w, corner);
-            Cartographic.Cartesian3.add(corner, center, corner);
-
-            var toCenter = Cartographic.Cartesian3.subtract(corner, position, scratchToCenter);
-            var mag = Cartographic.Cartesian3.dot(direction, toCenter);
-
-            minDist = Math.min(mag, minDist);
-            maxDist = Math.max(mag, maxDist);
-
-            // project second corner
-            Cartographic.Cartesian3.add(center, u, corner);
-            Cartographic.Cartesian3.add(corner, v, corner);
-            Cartographic.Cartesian3.subtract(corner, w, corner);
-
-            Cartographic.Cartesian3.subtract(corner, position, toCenter);
-            mag = Cartographic.Cartesian3.dot(direction, toCenter);
-
-            minDist = Math.min(mag, minDist);
-            maxDist = Math.max(mag, maxDist);
-
-            // project third corner
-            Cartographic.Cartesian3.add(center, u, corner);
-            Cartographic.Cartesian3.subtract(corner, v, corner);
-            Cartographic.Cartesian3.add(corner, w, corner);
-
-            Cartographic.Cartesian3.subtract(corner, position, toCenter);
-            mag = Cartographic.Cartesian3.dot(direction, toCenter);
-
-            minDist = Math.min(mag, minDist);
-            maxDist = Math.max(mag, maxDist);
-
-            // project fourth corner
-            Cartographic.Cartesian3.add(center, u, corner);
-            Cartographic.Cartesian3.subtract(corner, v, corner);
-            Cartographic.Cartesian3.subtract(corner, w, corner);
-
-            Cartographic.Cartesian3.subtract(corner, position, toCenter);
-            mag = Cartographic.Cartesian3.dot(direction, toCenter);
-
-            minDist = Math.min(mag, minDist);
-            maxDist = Math.max(mag, maxDist);
-
-            // project fifth corner
-            Cartographic.Cartesian3.subtract(center, u, corner);
-            Cartographic.Cartesian3.add(corner, v, corner);
-            Cartographic.Cartesian3.add(corner, w, corner);
-
-            Cartographic.Cartesian3.subtract(corner, position, toCenter);
-            mag = Cartographic.Cartesian3.dot(direction, toCenter);
-
-            minDist = Math.min(mag, minDist);
-            maxDist = Math.max(mag, maxDist);
-
-            // project sixth corner
-            Cartographic.Cartesian3.subtract(center, u, corner);
-            Cartographic.Cartesian3.add(corner, v, corner);
-            Cartographic.Cartesian3.subtract(corner, w, corner);
-
-            Cartographic.Cartesian3.subtract(corner, position, toCenter);
-            mag = Cartographic.Cartesian3.dot(direction, toCenter);
-
-            minDist = Math.min(mag, minDist);
-            maxDist = Math.max(mag, maxDist);
-
-            // project seventh corner
-            Cartographic.Cartesian3.subtract(center, u, corner);
-            Cartographic.Cartesian3.subtract(corner, v, corner);
-            Cartographic.Cartesian3.add(corner, w, corner);
-
-            Cartographic.Cartesian3.subtract(corner, position, toCenter);
-            mag = Cartographic.Cartesian3.dot(direction, toCenter);
-
-            minDist = Math.min(mag, minDist);
-            maxDist = Math.max(mag, maxDist);
-
-            // project eighth corner
-            Cartographic.Cartesian3.subtract(center, u, corner);
-            Cartographic.Cartesian3.subtract(corner, v, corner);
-            Cartographic.Cartesian3.subtract(corner, w, corner);
-
-            Cartographic.Cartesian3.subtract(corner, position, toCenter);
-            mag = Cartographic.Cartesian3.dot(direction, toCenter);
-
-            minDist = Math.min(mag, minDist);
-            maxDist = Math.max(mag, maxDist);
-
-            result.start = minDist;
-            result.stop = maxDist;
-            return result;
-        };
-
-        var scratchBoundingSphere = new BoundingSphere.BoundingSphere();
-
-        /**
-         * Determines whether or not a bounding box is hidden from view by the occluder.
-         *
-         * @param {OrientedBoundingBox} box The bounding box surrounding the occludee object.
-         * @param {Occluder} occluder The occluder.
-         * @returns {Boolean} <code>true</code> if the box is not visible; otherwise <code>false</code>.
-         */
-        OrientedBoundingBox.isOccluded = function(box, occluder) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(box)) {
-                throw new Check.DeveloperError('box is required.');
-            }
-            if (!when.defined(occluder)) {
-                throw new Check.DeveloperError('occluder is required.');
-            }
-            //>>includeEnd('debug');
-
-            var sphere = BoundingSphere.BoundingSphere.fromOrientedBoundingBox(box, scratchBoundingSphere);
-
-            return !occluder.isBoundingSphereVisible(sphere);
-        };
-
-        /**
-         * Determines which side of a plane the oriented bounding box is located.
-         *
-         * @param {Plane} plane The plane to test against.
-         * @returns {Intersect} {@link Intersect.INSIDE} if the entire box is on the side of the plane
-         *                      the normal is pointing, {@link Intersect.OUTSIDE} if the entire box is
-         *                      on the opposite side, and {@link Intersect.INTERSECTING} if the box
-         *                      intersects the plane.
-         */
-        OrientedBoundingBox.prototype.intersectPlane = function(plane) {
-            return OrientedBoundingBox.intersectPlane(this, plane);
-        };
-
-        /**
-         * Computes the estimated distance squared from the closest point on a bounding box to a point.
-         *
-         * @param {Cartesian3} cartesian The point
-         * @returns {Number} The estimated distance squared from the bounding sphere to the point.
-         *
-         * @example
-         * // Sort bounding boxes from back to front
-         * boxes.sort(function(a, b) {
-         *     return b.distanceSquaredTo(camera.positionWC) - a.distanceSquaredTo(camera.positionWC);
-         * });
-         */
-        OrientedBoundingBox.prototype.distanceSquaredTo = function(cartesian) {
-            return OrientedBoundingBox.distanceSquaredTo(this, cartesian);
-        };
-
-        /**
-         * The distances calculated by the vector from the center of the bounding box to position projected onto direction.
-         * <br>
-         * If you imagine the infinite number of planes with normal direction, this computes the smallest distance to the
-         * closest and farthest planes from position that intersect the bounding box.
-         *
-         * @param {Cartesian3} position The position to calculate the distance from.
-         * @param {Cartesian3} direction The direction from position.
-         * @param {Interval} [result] A Interval to store the nearest and farthest distances.
-         * @returns {Interval} The nearest and farthest distances on the bounding box from position in direction.
-         */
-        OrientedBoundingBox.prototype.computePlaneDistances = function(position, direction, result) {
-            return OrientedBoundingBox.computePlaneDistances(this, position, direction, result);
-        };
-
-        /**
-         * Determines whether or not a bounding box is hidden from view by the occluder.
-         *
-         * @param {Occluder} occluder The occluder.
-         * @returns {Boolean} <code>true</code> if the sphere is not visible; otherwise <code>false</code>.
-         */
-        OrientedBoundingBox.prototype.isOccluded = function(occluder) {
-            return OrientedBoundingBox.isOccluded(this, occluder);
-        };
-
-        /**
-         * Compares the provided OrientedBoundingBox componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {OrientedBoundingBox} left The first OrientedBoundingBox.
-         * @param {OrientedBoundingBox} right The second OrientedBoundingBox.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        OrientedBoundingBox.equals = function(left, right) {
-            return (left === right) ||
-                    ((when.defined(left)) &&
-                     (when.defined(right)) &&
-                     Cartographic.Cartesian3.equals(left.center, right.center) &&
-                     BoundingSphere.Matrix3.equals(left.halfAxes, right.halfAxes));
-        };
-
-        /**
-         * Duplicates this OrientedBoundingBox instance.
-         *
-         * @param {OrientedBoundingBox} [result] The object onto which to store the result.
-         * @returns {OrientedBoundingBox} The modified result parameter or a new OrientedBoundingBox instance if one was not provided.
-         */
-        OrientedBoundingBox.prototype.clone = function(result) {
-            return OrientedBoundingBox.clone(this, result);
-        };
-
-        /**
-         * Compares this OrientedBoundingBox against the provided OrientedBoundingBox componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {OrientedBoundingBox} [right] The right hand side OrientedBoundingBox.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        OrientedBoundingBox.prototype.equals = function(right) {
-            return OrientedBoundingBox.equals(this, right);
-        };
-
-    exports.OrientedBoundingBox = OrientedBoundingBox;
-
-});
diff --git a/public/libs/Cesium/Workers/PixelFormat-e6d821ed.js b/public/libs/Cesium/Workers/PixelFormat-e6d821ed.js
deleted file mode 100644
index 9e84b37..0000000
--- a/public/libs/Cesium/Workers/PixelFormat-e6d821ed.js
+++ /dev/null
@@ -1,491 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './WebGLConstants-4c11ee5f'], function (exports, when, WebGLConstants) { 'use strict';
-
-    /**
-         * Describes a compressed texture and contains a compressed texture buffer.
-         * @alias CompressedTextureBuffer
-         * @constructor
-         *
-         * @param {PixelFormat} internalFormat The pixel format of the compressed texture.
-         * @param {Number} width The width of the texture.
-         * @param {Number} height The height of the texture.
-         * @param {Uint8Array} buffer The compressed texture buffer.
-         */
-        function CompressedTextureBuffer(internalFormat, width, height, buffer) {
-            this._format = internalFormat;
-            this._width = width;
-            this._height = height;
-            this._buffer =  buffer;
-        }
-
-        Object.defineProperties(CompressedTextureBuffer.prototype, {
-            /**
-             * The format of the compressed texture.
-             * @type PixelFormat
-             * @readonly
-             * @memberof CompressedTextureBuffer.prototype
-             */
-            internalFormat : {
-                get : function() {
-                    return this._format;
-                }
-            },
-            /**
-             * The width of the texture.
-             * @type Number
-             * @readonly
-             * @memberof CompressedTextureBuffer.prototype
-             */
-            width : {
-                get : function() {
-                    return this._width;
-                }
-            },
-            /**
-             * The height of the texture.
-             * @type Number
-             * @readonly
-             * @memberof CompressedTextureBuffer.prototype
-             */
-            height : {
-                get : function() {
-                    return this._height;
-                }
-            },
-            /**
-             * The compressed texture buffer.
-             * @type Uint8Array
-             * @readonly
-             * @memberof CompressedTextureBuffer.prototype
-             */
-            bufferView : {
-                get : function() {
-                    return this._buffer;
-                }
-            }
-        });
-
-        /**
-         * Creates a shallow clone of a compressed texture buffer.
-         *
-         * @param {CompressedTextureBuffer} object The compressed texture buffer to be cloned.
-         * @return {CompressedTextureBuffer} A shallow clone of the compressed texture buffer.
-         */
-        CompressedTextureBuffer.clone = function(object) {
-            if (!when.defined(object)) {
-                return undefined;
-            }
-
-            return new CompressedTextureBuffer(object._format, object._width, object._height, object._buffer);
-        };
-
-        /**
-         * Creates a shallow clone of this compressed texture buffer.
-         *
-         * @return {CompressedTextureBuffer} A shallow clone of the compressed texture buffer.
-         */
-        CompressedTextureBuffer.prototype.clone = function() {
-            return CompressedTextureBuffer.clone(this);
-        };
-
-    /**
-     * @private
-     */
-    var PixelDatatype = {
-        UNSIGNED_BYTE : WebGLConstants.WebGLConstants.UNSIGNED_BYTE,
-        UNSIGNED_SHORT : WebGLConstants.WebGLConstants.UNSIGNED_SHORT,
-        UNSIGNED_INT : WebGLConstants.WebGLConstants.UNSIGNED_INT,
-        FLOAT : WebGLConstants.WebGLConstants.FLOAT,
-        HALF_FLOAT : WebGLConstants.WebGLConstants.HALF_FLOAT_OES,
-        UNSIGNED_INT_24_8 : WebGLConstants.WebGLConstants.UNSIGNED_INT_24_8,
-        UNSIGNED_SHORT_4_4_4_4 : WebGLConstants.WebGLConstants.UNSIGNED_SHORT_4_4_4_4,
-        UNSIGNED_SHORT_5_5_5_1 : WebGLConstants.WebGLConstants.UNSIGNED_SHORT_5_5_5_1,
-        UNSIGNED_SHORT_5_6_5 : WebGLConstants.WebGLConstants.UNSIGNED_SHORT_5_6_5,
-
-        isPacked : function(pixelDatatype) {
-            return pixelDatatype === PixelDatatype.UNSIGNED_INT_24_8 ||
-                   pixelDatatype === PixelDatatype.UNSIGNED_SHORT_4_4_4_4 ||
-                   pixelDatatype === PixelDatatype.UNSIGNED_SHORT_5_5_5_1 ||
-                   pixelDatatype === PixelDatatype.UNSIGNED_SHORT_5_6_5;
-        },
-
-        sizeInBytes : function(pixelDatatype) {
-            switch (pixelDatatype) {
-                case PixelDatatype.UNSIGNED_BYTE:
-                    return 1;
-                case PixelDatatype.UNSIGNED_SHORT:
-                case PixelDatatype.UNSIGNED_SHORT_4_4_4_4:
-                case PixelDatatype.UNSIGNED_SHORT_5_5_5_1:
-                case PixelDatatype.UNSIGNED_SHORT_5_6_5:
-                case PixelDatatype.HALF_FLOAT:
-                    return 2;
-                case PixelDatatype.UNSIGNED_INT:
-                case PixelDatatype.FLOAT:
-                case PixelDatatype.UNSIGNED_INT_24_8:
-                    return 4;
-            }
-        },
-
-        validate : function(pixelDatatype) {
-            return ((pixelDatatype === PixelDatatype.UNSIGNED_BYTE) ||
-                    (pixelDatatype === PixelDatatype.UNSIGNED_SHORT) ||
-                    (pixelDatatype === PixelDatatype.UNSIGNED_INT) ||
-                    (pixelDatatype === PixelDatatype.FLOAT) ||
-                    (pixelDatatype === PixelDatatype.HALF_FLOAT) ||
-                    (pixelDatatype === PixelDatatype.UNSIGNED_INT_24_8) ||
-                    (pixelDatatype === PixelDatatype.UNSIGNED_SHORT_4_4_4_4) ||
-                    (pixelDatatype === PixelDatatype.UNSIGNED_SHORT_5_5_5_1) ||
-                    (pixelDatatype === PixelDatatype.UNSIGNED_SHORT_5_6_5));
-        }
-    };
-
-    /**
-     * The format of a pixel, i.e., the number of components it has and what they represent.
-     *
-     * @exports PixelFormat
-     */
-    var PixelFormat = {
-        /**
-         * A pixel format containing a depth value.
-         *
-         * @type {Number}
-         * @constant
-         */
-        DEPTH_COMPONENT : WebGLConstants.WebGLConstants.DEPTH_COMPONENT,
-
-        /**
-         * A pixel format containing a depth and stencil value, most often used with {@link PixelDatatype.UNSIGNED_INT_24_8}.
-         *
-         * @type {Number}
-         * @constant
-         */
-        DEPTH_STENCIL : WebGLConstants.WebGLConstants.DEPTH_STENCIL,
-
-        /**
-         * A pixel format containing an alpha channel.
-         *
-         * @type {Number}
-         * @constant
-         */
-        ALPHA : WebGLConstants.WebGLConstants.ALPHA,
-
-        /**
-         * A pixel format containing red, green, and blue channels.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGB : WebGLConstants.WebGLConstants.RGB,
-
-        /**
-         * A pixel format containing red, green, blue, and alpha channels.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGBA : WebGLConstants.WebGLConstants.RGBA,
-
-        /**
-         * A pixel format containing a luminance (intensity) channel.
-         *
-         * @type {Number}
-         * @constant
-         */
-        LUMINANCE : WebGLConstants.WebGLConstants.LUMINANCE,
-
-        /**
-         * A pixel format containing luminance (intensity) and alpha channels.
-         *
-         * @type {Number}
-         * @constant
-         */
-        LUMINANCE_ALPHA : WebGLConstants.WebGLConstants.LUMINANCE_ALPHA,
-
-        /**
-         * A pixel format containing red, green, and blue channels that is DXT1 compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGB_DXT1 : WebGLConstants.WebGLConstants.COMPRESSED_RGB_S3TC_DXT1_EXT,
-
-        /**
-         * A pixel format containing red, green, blue, and alpha channels that is DXT1 compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGBA_DXT1 : WebGLConstants.WebGLConstants.COMPRESSED_RGBA_S3TC_DXT1_EXT,
-
-        /**
-         * A pixel format containing red, green, blue, and alpha channels that is DXT3 compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGBA_DXT3 : WebGLConstants.WebGLConstants.COMPRESSED_RGBA_S3TC_DXT3_EXT,
-
-        /**
-         * A pixel format containing red, green, blue, and alpha channels that is DXT5 compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGBA_DXT5 : WebGLConstants.WebGLConstants.COMPRESSED_RGBA_S3TC_DXT5_EXT,
-
-        /**
-         * A pixel format containing red, green, and blue channels that is PVR 4bpp compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGB_PVRTC_4BPPV1 : WebGLConstants.WebGLConstants.COMPRESSED_RGB_PVRTC_4BPPV1_IMG,
-
-        /**
-         * A pixel format containing red, green, and blue channels that is PVR 2bpp compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGB_PVRTC_2BPPV1 : WebGLConstants.WebGLConstants.COMPRESSED_RGB_PVRTC_2BPPV1_IMG,
-
-        /**
-         * A pixel format containing red, green, blue, and alpha channels that is PVR 4bpp compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGBA_PVRTC_4BPPV1 : WebGLConstants.WebGLConstants.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,
-
-        /**
-         * A pixel format containing red, green, blue, and alpha channels that is PVR 2bpp compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGBA_PVRTC_2BPPV1 : WebGLConstants.WebGLConstants.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,
-
-        /**
-         * A pixel format containing red, green, and blue channels that is ETC1 compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        RGB_ETC1 : WebGLConstants.WebGLConstants.COMPRESSED_RGB_ETC1_WEBGL,
-
-        /**
-         * @private
-         */
-        componentsLength : function(pixelFormat) {
-            switch (pixelFormat) {
-                case PixelFormat.RGB:
-                    return 3;
-                case PixelFormat.RGBA:
-                    return 4;
-                case PixelFormat.LUMINANCE_ALPHA:
-                    return 2;
-                case PixelFormat.ALPHA:
-                case PixelFormat.LUMINANCE:
-                    return 1;
-                default:
-                    return 1;
-            }
-        },
-
-        /**
-         * @private
-         */
-        validate : function(pixelFormat) {
-            return pixelFormat === PixelFormat.DEPTH_COMPONENT ||
-                   pixelFormat === PixelFormat.DEPTH_STENCIL ||
-                   pixelFormat === PixelFormat.ALPHA ||
-                   pixelFormat === PixelFormat.RGB ||
-                   pixelFormat === PixelFormat.RGBA ||
-                   pixelFormat === PixelFormat.LUMINANCE ||
-                   pixelFormat === PixelFormat.LUMINANCE_ALPHA ||
-                   pixelFormat === PixelFormat.RGB_DXT1 ||
-                   pixelFormat === PixelFormat.RGBA_DXT1 ||
-                   pixelFormat === PixelFormat.RGBA_DXT3 ||
-                   pixelFormat === PixelFormat.RGBA_DXT5 ||
-                   pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 ||
-                   pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 ||
-                   pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 ||
-                   pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 ||
-                   pixelFormat === PixelFormat.RGB_ETC1;
-        },
-
-        /**
-         * @private
-         */
-        isColorFormat : function(pixelFormat) {
-            return pixelFormat === PixelFormat.ALPHA ||
-                   pixelFormat === PixelFormat.RGB ||
-                   pixelFormat === PixelFormat.RGBA ||
-                   pixelFormat === PixelFormat.LUMINANCE ||
-                   pixelFormat === PixelFormat.LUMINANCE_ALPHA;
-        },
-
-        /**
-         * @private
-         */
-        isDepthFormat : function(pixelFormat) {
-            return pixelFormat === PixelFormat.DEPTH_COMPONENT ||
-                   pixelFormat === PixelFormat.DEPTH_STENCIL;
-        },
-
-        /**
-         * @private
-         */
-        isCompressedFormat : function(pixelFormat) {
-            return pixelFormat === PixelFormat.RGB_DXT1 ||
-                   pixelFormat === PixelFormat.RGBA_DXT1 ||
-                   pixelFormat === PixelFormat.RGBA_DXT3 ||
-                   pixelFormat === PixelFormat.RGBA_DXT5 ||
-                   pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 ||
-                   pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 ||
-                   pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 ||
-                   pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 ||
-                   pixelFormat === PixelFormat.RGB_ETC1;
-        },
-
-        /**
-         * @private
-         */
-        isDXTFormat : function(pixelFormat) {
-            return pixelFormat === PixelFormat.RGB_DXT1 ||
-                   pixelFormat === PixelFormat.RGBA_DXT1 ||
-                   pixelFormat === PixelFormat.RGBA_DXT3 ||
-                   pixelFormat === PixelFormat.RGBA_DXT5;
-        },
-
-        /**
-         * @private
-         */
-        isPVRTCFormat : function(pixelFormat) {
-            return pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 ||
-                   pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 ||
-                   pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 ||
-                   pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1;
-        },
-
-        /**
-         * @private
-         */
-        isETC1Format : function(pixelFormat) {
-            return pixelFormat === PixelFormat.RGB_ETC1;
-        },
-
-        /**
-         * @private
-         */
-        compressedTextureSizeInBytes : function(pixelFormat, width, height) {
-            switch (pixelFormat) {
-                case PixelFormat.RGB_DXT1:
-                case PixelFormat.RGBA_DXT1:
-                case PixelFormat.RGB_ETC1:
-                    return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;
-
-                case PixelFormat.RGBA_DXT3:
-                case PixelFormat.RGBA_DXT5:
-                    return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;
-
-                case PixelFormat.RGB_PVRTC_4BPPV1:
-                case PixelFormat.RGBA_PVRTC_4BPPV1:
-                    return Math.floor((Math.max(width, 8) * Math.max(height, 8) * 4 + 7) / 8);
-
-                case PixelFormat.RGB_PVRTC_2BPPV1:
-                case PixelFormat.RGBA_PVRTC_2BPPV1:
-                    return Math.floor((Math.max(width, 16) * Math.max(height, 8) * 2 + 7) / 8);
-
-                default:
-                    return 0;
-            }
-        },
-
-        /**
-         * @private
-         */
-        textureSizeInBytes : function(pixelFormat, pixelDatatype, width, height) {
-            var componentsLength = PixelFormat.componentsLength(pixelFormat);
-            if (PixelDatatype.isPacked(pixelDatatype)) {
-                componentsLength = 1;
-            }
-            return componentsLength * PixelDatatype.sizeInBytes(pixelDatatype) * width * height;
-        },
-
-        /**
-         * @private
-         */
-        alignmentInBytes : function(pixelFormat, pixelDatatype, width) {
-            var mod = PixelFormat.textureSizeInBytes(pixelFormat, pixelDatatype, width, 1) % 4;
-            return mod === 0 ? 4 : (mod === 2 ? 2 : 1);
-        },
-
-        /**
-         * @private
-         */
-        createTypedArray : function(pixelFormat, pixelDatatype, width, height) {
-            var constructor;
-            var sizeInBytes = PixelDatatype.sizeInBytes(pixelDatatype);
-            if (sizeInBytes === Uint8Array.BYTES_PER_ELEMENT) {
-                constructor = Uint8Array;
-            } else if (sizeInBytes === Uint16Array.BYTES_PER_ELEMENT) {
-                constructor = Uint16Array;
-            } else if (sizeInBytes === Float32Array.BYTES_PER_ELEMENT && pixelDatatype === PixelDatatype.FLOAT) {
-                constructor = Float32Array;
-            } else {
-                constructor = Uint32Array;
-            }
-
-            var size = PixelFormat.componentsLength(pixelFormat) * width * height;
-            return new constructor(size);
-        },
-
-        /**
-         * @private
-         */
-        flipY : function(bufferView, pixelFormat, pixelDatatype, width, height) {
-            if (height === 1) {
-                return bufferView;
-            }
-            var flipped = PixelFormat.createTypedArray(pixelFormat, pixelDatatype, width, height);
-            var numberOfComponents = PixelFormat.componentsLength(pixelFormat);
-            var textureWidth = width * numberOfComponents;
-            for (var i = 0; i < height; ++i) {
-                var row = i * height * numberOfComponents;
-                var flippedRow = (height - i - 1) * height * numberOfComponents;
-                for (var j = 0; j < textureWidth; ++j) {
-                    flipped[flippedRow + j] = bufferView[row + j];
-                }
-            }
-            return flipped;
-        }
-    };
-
-    var PixelFormat$1 = Object.freeze(PixelFormat);
-
-    exports.CompressedTextureBuffer = CompressedTextureBuffer;
-    exports.PixelFormat = PixelFormat$1;
-
-});
diff --git a/public/libs/Cesium/Workers/Plane-8390418f.js b/public/libs/Cesium/Workers/Plane-8390418f.js
deleted file mode 100644
index 6706874..0000000
--- a/public/libs/Cesium/Workers/Plane-8390418f.js
+++ /dev/null
@@ -1,279 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './BoundingSphere-775c5788'], function (exports, when, Check, _Math, Cartographic, BoundingSphere) { 'use strict';
-
-    /**
-         * A plane in Hessian Normal Form defined by
-         * <pre>
-         * ax + by + cz + d = 0
-         * </pre>
-         * where (a, b, c) is the plane's <code>normal</code>, d is the signed
-         * <code>distance</code> to the plane, and (x, y, z) is any point on
-         * the plane.
-         *
-         * @alias Plane
-         * @constructor
-         *
-         * @param {Cartesian3} normal The plane's normal (normalized).
-         * @param {Number} distance The shortest distance from the origin to the plane.  The sign of
-         * <code>distance</code> determines which side of the plane the origin
-         * is on.  If <code>distance</code> is positive, the origin is in the half-space
-         * in the direction of the normal; if negative, the origin is in the half-space
-         * opposite to the normal; if zero, the plane passes through the origin.
-         *
-         * @example
-         * // The plane x=0
-         * var plane = new Cesium.Plane(Cesium.Cartesian3.UNIT_X, 0.0);
-         *
-         * @exception {DeveloperError} Normal must be normalized
-         */
-        function Plane(normal, distance) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('normal', normal);
-            if (!_Math.CesiumMath.equalsEpsilon(Cartographic.Cartesian3.magnitude(normal), 1.0, _Math.CesiumMath.EPSILON6)) {
-                throw new Check.DeveloperError('normal must be normalized.');
-            }
-            Check.Check.typeOf.number('distance', distance);
-            //>>includeEnd('debug');
-
-            /**
-             * The plane's normal.
-             *
-             * @type {Cartesian3}
-             */
-            this.normal = Cartographic.Cartesian3.clone(normal);
-
-            /**
-             * The shortest distance from the origin to the plane.  The sign of
-             * <code>distance</code> determines which side of the plane the origin
-             * is on.  If <code>distance</code> is positive, the origin is in the half-space
-             * in the direction of the normal; if negative, the origin is in the half-space
-             * opposite to the normal; if zero, the plane passes through the origin.
-             *
-             * @type {Number}
-             */
-            this.distance = distance;
-        }
-
-        /**
-         * Creates a plane from a normal and a point on the plane.
-         *
-         * @param {Cartesian3} point The point on the plane.
-         * @param {Cartesian3} normal The plane's normal (normalized).
-         * @param {Plane} [result] The object onto which to store the result.
-         * @returns {Plane} A new plane instance or the modified result parameter.
-         *
-         * @example
-         * var point = Cesium.Cartesian3.fromDegrees(-72.0, 40.0);
-         * var normal = ellipsoid.geodeticSurfaceNormal(point);
-         * var tangentPlane = Cesium.Plane.fromPointNormal(point, normal);
-         *
-         * @exception {DeveloperError} Normal must be normalized
-         */
-        Plane.fromPointNormal = function(point, normal, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('point', point);
-            Check.Check.typeOf.object('normal', normal);
-            if (!_Math.CesiumMath.equalsEpsilon(Cartographic.Cartesian3.magnitude(normal), 1.0, _Math.CesiumMath.EPSILON6)) {
-                throw new Check.DeveloperError('normal must be normalized.');
-            }
-            //>>includeEnd('debug');
-
-            var distance = -Cartographic.Cartesian3.dot(normal, point);
-
-            if (!when.defined(result)) {
-                return new Plane(normal, distance);
-            }
-
-            Cartographic.Cartesian3.clone(normal, result.normal);
-            result.distance = distance;
-            return result;
-        };
-
-        var scratchNormal = new Cartographic.Cartesian3();
-        /**
-         * Creates a plane from the general equation
-         *
-         * @param {Cartesian4} coefficients The plane's normal (normalized).
-         * @param {Plane} [result] The object onto which to store the result.
-         * @returns {Plane} A new plane instance or the modified result parameter.
-         *
-         * @exception {DeveloperError} Normal must be normalized
-         */
-        Plane.fromCartesian4 = function(coefficients, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('coefficients', coefficients);
-            //>>includeEnd('debug');
-
-            var normal = Cartographic.Cartesian3.fromCartesian4(coefficients, scratchNormal);
-            var distance = coefficients.w;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!_Math.CesiumMath.equalsEpsilon(Cartographic.Cartesian3.magnitude(normal), 1.0, _Math.CesiumMath.EPSILON6)) {
-                throw new Check.DeveloperError('normal must be normalized.');
-            }
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Plane(normal, distance);
-            }
-            Cartographic.Cartesian3.clone(normal, result.normal);
-            result.distance = distance;
-            return result;
-        };
-
-        /**
-         * Computes the signed shortest distance of a point to a plane.
-         * The sign of the distance determines which side of the plane the point
-         * is on.  If the distance is positive, the point is in the half-space
-         * in the direction of the normal; if negative, the point is in the half-space
-         * opposite to the normal; if zero, the plane passes through the point.
-         *
-         * @param {Plane} plane The plane.
-         * @param {Cartesian3} point The point.
-         * @returns {Number} The signed shortest distance of the point to the plane.
-         */
-        Plane.getPointDistance = function(plane, point) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('plane', plane);
-            Check.Check.typeOf.object('point', point);
-            //>>includeEnd('debug');
-
-            return Cartographic.Cartesian3.dot(plane.normal, point) + plane.distance;
-        };
-
-        var scratchCartesian = new Cartographic.Cartesian3();
-        /**
-         * Projects a point onto the plane.
-         * @param {Plane} plane The plane to project the point onto
-         * @param {Cartesian3} point The point to project onto the plane
-         * @param {Cartesian3} [result] The result point.  If undefined, a new Cartesian3 will be created.
-         * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
-         */
-        Plane.projectPointOntoPlane = function(plane, point, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('plane', plane);
-            Check.Check.typeOf.object('point', point);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            // projectedPoint = point - (normal.point + scale) * normal
-            var pointDistance = Plane.getPointDistance(plane, point);
-            var scaledNormal = Cartographic.Cartesian3.multiplyByScalar(plane.normal, pointDistance, scratchCartesian);
-
-            return Cartographic.Cartesian3.subtract(point, scaledNormal, result);
-        };
-
-        var scratchPosition = new Cartographic.Cartesian3();
-        /**
-         * Transforms the plane by the given transformation matrix.
-         *
-         * @param {Plane} plane The plane.
-         * @param {Matrix4} transform The transformation matrix.
-         * @param {Plane} [result] The object into which to store the result.
-         * @returns {Plane} The plane transformed by the given transformation matrix.
-         */
-        Plane.transform = function(plane, transform, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('plane', plane);
-            Check.Check.typeOf.object('transform', transform);
-            //>>includeEnd('debug');
-
-            BoundingSphere.Matrix4.multiplyByPointAsVector(transform, plane.normal, scratchNormal);
-            Cartographic.Cartesian3.normalize(scratchNormal, scratchNormal);
-
-            Cartographic.Cartesian3.multiplyByScalar(plane.normal, -plane.distance, scratchPosition);
-            BoundingSphere.Matrix4.multiplyByPoint(transform, scratchPosition, scratchPosition);
-
-            return Plane.fromPointNormal(scratchPosition, scratchNormal, result);
-        };
-
-        /**
-         * Duplicates a Plane instance.
-         *
-         * @param {Plane} plane The plane to duplicate.
-         * @param {Plane} [result] The object onto which to store the result.
-         * @returns {Plane} The modified result parameter or a new Plane instance if one was not provided.
-         */
-        Plane.clone = function(plane, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('plane', plane);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new Plane(plane.normal, plane.distance);
-            }
-
-            Cartographic.Cartesian3.clone(plane.normal, result.normal);
-            result.distance = plane.distance;
-
-            return result;
-        };
-
-        /**
-         * Compares the provided Planes by normal and distance and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Plane} left The first plane.
-         * @param {Plane} right The second plane.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        Plane.equals = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            return (left.distance === right.distance) && Cartographic.Cartesian3.equals(left.normal, right.normal);
-        };
-
-        /**
-         * A constant initialized to the XY plane passing through the origin, with normal in positive Z.
-         *
-         * @type {Plane}
-         * @constant
-         */
-        Plane.ORIGIN_XY_PLANE = Object.freeze(new Plane(Cartographic.Cartesian3.UNIT_Z, 0.0));
-
-        /**
-         * A constant initialized to the YZ plane passing through the origin, with normal in positive X.
-         *
-         * @type {Plane}
-         * @constant
-         */
-        Plane.ORIGIN_YZ_PLANE = Object.freeze(new Plane(Cartographic.Cartesian3.UNIT_X, 0.0));
-
-        /**
-         * A constant initialized to the ZX plane passing through the origin, with normal in positive Y.
-         *
-         * @type {Plane}
-         * @constant
-         */
-        Plane.ORIGIN_ZX_PLANE = Object.freeze(new Plane(Cartographic.Cartesian3.UNIT_Y, 0.0));
-
-    exports.Plane = Plane;
-
-});
diff --git a/public/libs/Cesium/Workers/PolygonGeometryLibrary-9cc18cc2.js b/public/libs/Cesium/Workers/PolygonGeometryLibrary-9cc18cc2.js
deleted file mode 100644
index a726f57..0000000
--- a/public/libs/Cesium/Workers/PolygonGeometryLibrary-9cc18cc2.js
+++ /dev/null
@@ -1,707 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './Transforms-a1cf7267', './GeometryAttributes-aacecde6', './GeometryPipeline-245a05d7', './IndexDatatype-9435b55f', './arrayRemoveDuplicates-f0b089b1', './ArcType-66bc286a', './EllipsoidRhumbLine-f161e674', './PolygonPipeline-fd46002b'], function (exports, when, _Math, Cartographic, Cartesian2, BoundingSphere, ComponentDatatype, GeometryAttribute, PrimitiveType, Transforms, GeometryAttributes, GeometryPipeline, IndexDatatype, arrayRemoveDuplicates, ArcType, EllipsoidRhumbLine, PolygonPipeline) { 'use strict';
-
-    /**
-         * A queue that can enqueue items at the end, and dequeue items from the front.
-         *
-         * @alias Queue
-         * @constructor
-         */
-        function Queue() {
-            this._array = [];
-            this._offset = 0;
-            this._length = 0;
-        }
-
-        Object.defineProperties(Queue.prototype, {
-            /**
-             * The length of the queue.
-             *
-             * @memberof Queue.prototype
-             *
-             * @type {Number}
-             * @readonly
-             */
-            length : {
-                get : function() {
-                    return this._length;
-                }
-            }
-        });
-
-        /**
-         * Enqueues the specified item.
-         *
-         * @param {*} item The item to enqueue.
-         */
-        Queue.prototype.enqueue = function(item) {
-            this._array.push(item);
-            this._length++;
-        };
-
-        /**
-         * Dequeues an item.  Returns undefined if the queue is empty.
-         *
-         * @returns {*} The the dequeued item.
-         */
-        Queue.prototype.dequeue = function() {
-            if (this._length === 0) {
-                return undefined;
-            }
-
-            var array = this._array;
-            var offset = this._offset;
-            var item = array[offset];
-            array[offset] = undefined;
-
-            offset++;
-            if ((offset > 10) && (offset * 2 > array.length)) {
-                //compact array
-                this._array = array.slice(offset);
-                offset = 0;
-            }
-
-            this._offset = offset;
-            this._length--;
-
-            return item;
-        };
-
-        /**
-         * Returns the item at the front of the queue.  Returns undefined if the queue is empty.
-         *
-         * @returns {*} The item at the front of the queue.
-         */
-        Queue.prototype.peek = function() {
-            if (this._length === 0) {
-                return undefined;
-            }
-
-            return this._array[this._offset];
-        };
-
-        /**
-         * Check whether this queue contains the specified item.
-         *
-         * @param {*} item The item to search for.
-         */
-        Queue.prototype.contains = function(item) {
-            return this._array.indexOf(item) !== -1;
-        };
-
-        /**
-         * Remove all items from the queue.
-         */
-        Queue.prototype.clear = function() {
-            this._array.length = this._offset = this._length = 0;
-        };
-
-        /**
-         * Sort the items in the queue in-place.
-         *
-         * @param {Queue~Comparator} compareFunction A function that defines the sort order.
-         */
-        Queue.prototype.sort = function(compareFunction) {
-            if (this._offset > 0) {
-                //compact array
-                this._array = this._array.slice(this._offset);
-                this._offset = 0;
-            }
-
-            this._array.sort(compareFunction);
-        };
-
-    /**
-         * @private
-         */
-        var PolygonGeometryLibrary = {};
-
-        PolygonGeometryLibrary.computeHierarchyPackedLength = function(polygonHierarchy) {
-            var numComponents = 0;
-            var stack = [polygonHierarchy];
-            while (stack.length > 0) {
-                var hierarchy = stack.pop();
-                if (!when.defined(hierarchy)) {
-                    continue;
-                }
-
-                numComponents += 2;
-
-                var positions = hierarchy.positions;
-                var holes = hierarchy.holes;
-
-                if (when.defined(positions)) {
-                    numComponents += positions.length * Cartographic.Cartesian3.packedLength;
-                }
-
-                if (when.defined(holes)) {
-                    var length = holes.length;
-                    for (var i = 0; i < length; ++i) {
-                        stack.push(holes[i]);
-                    }
-                }
-            }
-
-            return numComponents;
-        };
-
-        PolygonGeometryLibrary.packPolygonHierarchy = function(polygonHierarchy, array, startingIndex) {
-            var stack = [polygonHierarchy];
-            while (stack.length > 0) {
-                var hierarchy = stack.pop();
-                if (!when.defined(hierarchy)) {
-                    continue;
-                }
-
-                var positions = hierarchy.positions;
-                var holes = hierarchy.holes;
-
-                array[startingIndex++] = when.defined(positions) ? positions.length : 0;
-                array[startingIndex++] = when.defined(holes) ? holes.length : 0;
-
-                if (when.defined(positions)) {
-                    var positionsLength = positions.length;
-                    for (var i = 0; i < positionsLength; ++i, startingIndex += 3) {
-                        Cartographic.Cartesian3.pack(positions[i], array, startingIndex);
-                    }
-                }
-
-                if (when.defined(holes)) {
-                    var holesLength = holes.length;
-                    for (var j = 0; j < holesLength; ++j) {
-                        stack.push(holes[j]);
-                    }
-                }
-            }
-
-            return startingIndex;
-        };
-
-        PolygonGeometryLibrary.unpackPolygonHierarchy = function(array, startingIndex) {
-            var positionsLength = array[startingIndex++];
-            var holesLength = array[startingIndex++];
-
-            var positions = new Array(positionsLength);
-            var holes = holesLength > 0 ? new Array(holesLength) : undefined;
-
-            for (var i = 0; i < positionsLength; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                positions[i] = Cartographic.Cartesian3.unpack(array, startingIndex);
-            }
-
-            for (var j = 0; j < holesLength; ++j) {
-                holes[j] = PolygonGeometryLibrary.unpackPolygonHierarchy(array, startingIndex);
-                startingIndex = holes[j].startingIndex;
-                delete holes[j].startingIndex;
-            }
-
-            return {
-                positions : positions,
-                holes : holes,
-                startingIndex : startingIndex
-            };
-        };
-
-        var distanceScratch = new Cartographic.Cartesian3();
-        function getPointAtDistance(p0, p1, distance, length) {
-            Cartographic.Cartesian3.subtract(p1, p0, distanceScratch);
-            Cartographic.Cartesian3.multiplyByScalar(distanceScratch, distance / length, distanceScratch);
-            Cartographic.Cartesian3.add(p0, distanceScratch, distanceScratch);
-            return [distanceScratch.x, distanceScratch.y, distanceScratch.z];
-        }
-
-        PolygonGeometryLibrary.subdivideLineCount = function(p0, p1, minDistance) {
-            var distance = Cartographic.Cartesian3.distance(p0, p1);
-            var n = distance / minDistance;
-            var countDivide = Math.max(0, Math.ceil(_Math.CesiumMath.log2(n)));
-            return Math.pow(2, countDivide);
-        };
-
-        var scratchCartographic0 = new Cartographic.Cartographic();
-        var scratchCartographic1 = new Cartographic.Cartographic();
-        var scratchCartographic2 = new Cartographic.Cartographic();
-        var scratchCartesian0 = new Cartographic.Cartesian3();
-        PolygonGeometryLibrary.subdivideRhumbLineCount = function(ellipsoid, p0, p1, minDistance) {
-            var c0 = ellipsoid.cartesianToCartographic(p0, scratchCartographic0);
-            var c1 = ellipsoid.cartesianToCartographic(p1, scratchCartographic1);
-            var rhumb = new EllipsoidRhumbLine.EllipsoidRhumbLine(c0, c1, ellipsoid);
-            var n = rhumb.surfaceDistance / minDistance;
-            var countDivide = Math.max(0, Math.ceil(_Math.CesiumMath.log2(n)));
-            return Math.pow(2, countDivide);
-        };
-
-        PolygonGeometryLibrary.subdivideLine = function(p0, p1, minDistance, result) {
-            var numVertices = PolygonGeometryLibrary.subdivideLineCount(p0, p1, minDistance);
-            var length = Cartographic.Cartesian3.distance(p0, p1);
-            var distanceBetweenVertices = length / numVertices;
-
-            if (!when.defined(result)) {
-                result = [];
-            }
-
-            var positions = result;
-            positions.length = numVertices * 3;
-
-            var index = 0;
-            for ( var i = 0; i < numVertices; i++) {
-                var p = getPointAtDistance(p0, p1, i * distanceBetweenVertices, length);
-                positions[index++] = p[0];
-                positions[index++] = p[1];
-                positions[index++] = p[2];
-            }
-
-            return positions;
-        };
-
-        PolygonGeometryLibrary.subdivideRhumbLine = function(ellipsoid, p0, p1, minDistance, result) {
-            var c0 = ellipsoid.cartesianToCartographic(p0, scratchCartographic0);
-            var c1 = ellipsoid.cartesianToCartographic(p1, scratchCartographic1);
-            var rhumb = new EllipsoidRhumbLine.EllipsoidRhumbLine(c0, c1, ellipsoid);
-
-            var n = rhumb.surfaceDistance / minDistance;
-            var countDivide = Math.max(0, Math.ceil(_Math.CesiumMath.log2(n)));
-            var numVertices = Math.pow(2, countDivide);
-            var distanceBetweenVertices = rhumb.surfaceDistance / numVertices;
-
-            if (!when.defined(result)) {
-                result = [];
-            }
-
-            var positions = result;
-            positions.length = numVertices * 3;
-
-            var index = 0;
-            for ( var i = 0; i < numVertices; i++) {
-                var c = rhumb.interpolateUsingSurfaceDistance(i * distanceBetweenVertices, scratchCartographic2);
-                var p = ellipsoid.cartographicToCartesian(c, scratchCartesian0);
-                positions[index++] = p.x;
-                positions[index++] = p.y;
-                positions[index++] = p.z;
-            }
-
-            return positions;
-        };
-
-        var scaleToGeodeticHeightN1 = new Cartographic.Cartesian3();
-        var scaleToGeodeticHeightN2 = new Cartographic.Cartesian3();
-        var scaleToGeodeticHeightP1 = new Cartographic.Cartesian3();
-        var scaleToGeodeticHeightP2 = new Cartographic.Cartesian3();
-
-        PolygonGeometryLibrary.scaleToGeodeticHeightExtruded = function(geometry, maxHeight, minHeight, ellipsoid, perPositionHeight) {
-            ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-            var n1 = scaleToGeodeticHeightN1;
-            var n2 = scaleToGeodeticHeightN2;
-            var p = scaleToGeodeticHeightP1;
-            var p2 = scaleToGeodeticHeightP2;
-
-            if (when.defined(geometry) && when.defined(geometry.attributes) && when.defined(geometry.attributes.position)) {
-                var positions = geometry.attributes.position.values;
-                var length = positions.length / 2;
-
-                for ( var i = 0; i < length; i += 3) {
-                    Cartographic.Cartesian3.fromArray(positions, i, p);
-
-                    ellipsoid.geodeticSurfaceNormal(p, n1);
-                    p2 = ellipsoid.scaleToGeodeticSurface(p, p2);
-                    n2 = Cartographic.Cartesian3.multiplyByScalar(n1, minHeight, n2);
-                    n2 = Cartographic.Cartesian3.add(p2, n2, n2);
-                    positions[i + length] = n2.x;
-                    positions[i + 1 + length] = n2.y;
-                    positions[i + 2 + length] = n2.z;
-
-                    if (perPositionHeight) {
-                        p2 = Cartographic.Cartesian3.clone(p, p2);
-                    }
-                    n2 = Cartographic.Cartesian3.multiplyByScalar(n1, maxHeight, n2);
-                    n2 = Cartographic.Cartesian3.add(p2, n2, n2);
-                    positions[i] = n2.x;
-                    positions[i + 1] = n2.y;
-                    positions[i + 2] = n2.z;
-                }
-            }
-            return geometry;
-        };
-
-        PolygonGeometryLibrary.polygonOutlinesFromHierarchy = function(polygonHierarchy, scaleToEllipsoidSurface, ellipsoid) {
-            // create from a polygon hierarchy
-            // Algorithm adapted from http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf
-            var polygons = [];
-            var queue = new Queue();
-            queue.enqueue(polygonHierarchy);
-            var i;
-            var j;
-            var length;
-            while (queue.length !== 0) {
-                var outerNode = queue.dequeue();
-                var outerRing = outerNode.positions;
-                if (scaleToEllipsoidSurface) {
-                    length = outerRing.length;
-                    for (i = 0; i < length; i++) {
-                        ellipsoid.scaleToGeodeticSurface(outerRing[i], outerRing[i]);
-                    }
-                }
-                outerRing = arrayRemoveDuplicates.arrayRemoveDuplicates(outerRing, Cartographic.Cartesian3.equalsEpsilon, true);
-                if (outerRing.length < 3) {
-                    continue;
-                }
-
-                var numChildren = outerNode.holes ? outerNode.holes.length : 0;
-                // The outer polygon contains inner polygons
-                for (i = 0; i < numChildren; i++) {
-                    var hole = outerNode.holes[i];
-                    var holePositions = hole.positions;
-                    if (scaleToEllipsoidSurface) {
-                        length = holePositions.length;
-                        for (j = 0; j < length; ++j) {
-                            ellipsoid.scaleToGeodeticSurface(holePositions[j], holePositions[j]);
-                        }
-                    }
-                    holePositions = arrayRemoveDuplicates.arrayRemoveDuplicates(holePositions, Cartographic.Cartesian3.equalsEpsilon, true);
-                    if (holePositions.length < 3) {
-                        continue;
-                    }
-                    polygons.push(holePositions);
-
-                    var numGrandchildren = 0;
-                    if (when.defined(hole.holes)) {
-                        numGrandchildren = hole.holes.length;
-                    }
-
-                    for (j = 0; j < numGrandchildren; j++) {
-                        queue.enqueue(hole.holes[j]);
-                    }
-                }
-
-                polygons.push(outerRing);
-            }
-
-            return polygons;
-        };
-
-        PolygonGeometryLibrary.polygonsFromHierarchy = function(polygonHierarchy, projectPointsTo2D, scaleToEllipsoidSurface, ellipsoid) {
-            // create from a polygon hierarchy
-            // Algorithm adapted from http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf
-            var hierarchy = [];
-            var polygons = [];
-
-            var queue = new Queue();
-            queue.enqueue(polygonHierarchy);
-
-            while (queue.length !== 0) {
-                var outerNode = queue.dequeue();
-                var outerRing = outerNode.positions;
-                var holes = outerNode.holes;
-
-                var i;
-                var length;
-                var tempOutRing = outerRing.slice();
-                if (scaleToEllipsoidSurface) {
-                    length = outerRing.length;
-                    for (i = 0; i < length; i++) {
-                        ellipsoid.scaleToGeodeticSurface(outerRing[i], tempOutRing[i]);
-                    }
-                }
-
-                outerRing = arrayRemoveDuplicates.arrayRemoveDuplicates(tempOutRing, Cartographic.Cartesian3.equalsEpsilon, true);
-                if (outerRing.length < 3) {
-                    continue;
-                }
-
-                var positions2D = projectPointsTo2D(outerRing);
-                if (!when.defined(positions2D)) {
-                    continue;
-                }
-                var holeIndices = [];
-
-                var originalWindingOrder = PolygonPipeline.PolygonPipeline.computeWindingOrder2D(positions2D);
-                if (originalWindingOrder === PolygonPipeline.WindingOrder.CLOCKWISE) {
-                    positions2D.reverse();
-                    outerRing = outerRing.slice().reverse();
-                }
-
-                var positions = outerRing.slice();
-                var numChildren = when.defined(holes) ? holes.length : 0;
-                var polygonHoles = [];
-                var j;
-
-                for (i = 0; i < numChildren; i++) {
-                    var hole = holes[i];
-                    var holePositions = hole.positions;
-                    if (scaleToEllipsoidSurface) {
-                        length = holePositions.length;
-                        for (j = 0; j < length; ++j) {
-                            ellipsoid.scaleToGeodeticSurface(holePositions[j], holePositions[j]);
-                        }
-                    }
-
-                    holePositions = arrayRemoveDuplicates.arrayRemoveDuplicates(holePositions, Cartographic.Cartesian3.equalsEpsilon, true);
-                    if (holePositions.length < 3) {
-                        continue;
-                    }
-
-                    var holePositions2D = projectPointsTo2D(holePositions);
-                    if (!when.defined(holePositions2D)) {
-                        continue;
-                    }
-
-                    originalWindingOrder = PolygonPipeline.PolygonPipeline.computeWindingOrder2D(holePositions2D);
-                    if (originalWindingOrder === PolygonPipeline.WindingOrder.CLOCKWISE) {
-                        holePositions2D.reverse();
-                        holePositions = holePositions.slice().reverse();
-                    }
-
-                    polygonHoles.push(holePositions);
-                    holeIndices.push(positions.length);
-                    positions = positions.concat(holePositions);
-                    positions2D = positions2D.concat(holePositions2D);
-
-                    var numGrandchildren = 0;
-                    if (when.defined(hole.holes)) {
-                        numGrandchildren = hole.holes.length;
-                    }
-
-                    for (j = 0; j < numGrandchildren; j++) {
-                        queue.enqueue(hole.holes[j]);
-                    }
-                }
-
-                hierarchy.push({
-                    outerRing : outerRing,
-                    holes : polygonHoles
-                });
-                polygons.push({
-                    positions : positions,
-                    positions2D : positions2D,
-                    holes : holeIndices
-                });
-            }
-
-            return {
-                hierarchy : hierarchy,
-                polygons : polygons
-            };
-        };
-
-        var computeBoundingRectangleCartesian2 = new Cartesian2.Cartesian2();
-        var computeBoundingRectangleCartesian3 = new Cartographic.Cartesian3();
-        var computeBoundingRectangleQuaternion = new Transforms.Quaternion();
-        var computeBoundingRectangleMatrix3 = new BoundingSphere.Matrix3();
-        PolygonGeometryLibrary.computeBoundingRectangle = function (planeNormal, projectPointTo2D, positions, angle, result) {
-            var rotation = Transforms.Quaternion.fromAxisAngle(planeNormal, angle, computeBoundingRectangleQuaternion);
-            var textureMatrix = BoundingSphere.Matrix3.fromQuaternion(rotation, computeBoundingRectangleMatrix3);
-
-            var minX = Number.POSITIVE_INFINITY;
-            var maxX = Number.NEGATIVE_INFINITY;
-            var minY = Number.POSITIVE_INFINITY;
-            var maxY = Number.NEGATIVE_INFINITY;
-
-            var length = positions.length;
-            for ( var i = 0; i < length; ++i) {
-                var p = Cartographic.Cartesian3.clone(positions[i], computeBoundingRectangleCartesian3);
-                BoundingSphere.Matrix3.multiplyByVector(textureMatrix, p, p);
-                var st = projectPointTo2D(p, computeBoundingRectangleCartesian2);
-
-                if (when.defined(st)) {
-                    minX = Math.min(minX, st.x);
-                    maxX = Math.max(maxX, st.x);
-
-                    minY = Math.min(minY, st.y);
-                    maxY = Math.max(maxY, st.y);
-                }
-            }
-
-            result.x = minX;
-            result.y = minY;
-            result.width = maxX - minX;
-            result.height = maxY - minY;
-            return result;
-        };
-
-        PolygonGeometryLibrary.createGeometryFromPositions = function(ellipsoid, polygon, granularity, perPositionHeight, vertexFormat, arcType) {
-            var indices = PolygonPipeline.PolygonPipeline.triangulate(polygon.positions2D, polygon.holes);
-
-            /* If polygon is completely unrenderable, just use the first three vertices */
-            if (indices.length < 3) {
-                indices = [0, 1, 2];
-            }
-
-            var positions = polygon.positions;
-
-            if (perPositionHeight) {
-                var length = positions.length;
-                var flattenedPositions = new Array(length * 3);
-                var index = 0;
-                for ( var i = 0; i < length; i++) {
-                    var p = positions[i];
-                    flattenedPositions[index++] = p.x;
-                    flattenedPositions[index++] = p.y;
-                    flattenedPositions[index++] = p.z;
-                }
-                var geometry = new GeometryAttribute.Geometry({
-                    attributes : {
-                        position : new GeometryAttribute.GeometryAttribute({
-                            componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                            componentsPerAttribute : 3,
-                            values : flattenedPositions
-                        })
-                    },
-                    indices : indices,
-                    primitiveType : PrimitiveType.PrimitiveType.TRIANGLES
-                });
-
-                if (vertexFormat.normal) {
-                    return GeometryPipeline.GeometryPipeline.computeNormal(geometry);
-                }
-
-                return geometry;
-            }
-
-            if (arcType === ArcType.ArcType.GEODESIC) {
-                return PolygonPipeline.PolygonPipeline.computeSubdivision(ellipsoid, positions, indices, granularity);
-            } else if (arcType === ArcType.ArcType.RHUMB) {
-                return PolygonPipeline.PolygonPipeline.computeRhumbLineSubdivision(ellipsoid, positions, indices, granularity);
-            }
-        };
-
-        var computeWallIndicesSubdivided = [];
-        var p1Scratch = new Cartographic.Cartesian3();
-        var p2Scratch = new Cartographic.Cartesian3();
-
-        PolygonGeometryLibrary.computeWallGeometry = function(positions, ellipsoid, granularity, perPositionHeight, arcType) {
-            var edgePositions;
-            var topEdgeLength;
-            var i;
-            var p1;
-            var p2;
-
-            var length = positions.length;
-            var index = 0;
-
-            if (!perPositionHeight) {
-                var minDistance = _Math.CesiumMath.chordLength(granularity, ellipsoid.maximumRadius);
-
-                var numVertices = 0;
-                if (arcType === ArcType.ArcType.GEODESIC) {
-                    for (i = 0; i < length; i++) {
-                        numVertices += PolygonGeometryLibrary.subdivideLineCount(positions[i], positions[(i + 1) % length], minDistance);
-                    }
-                } else if (arcType === ArcType.ArcType.RHUMB) {
-                    for (i = 0; i < length; i++) {
-                        numVertices += PolygonGeometryLibrary.subdivideRhumbLineCount(ellipsoid, positions[i], positions[(i + 1) % length], minDistance);
-                    }
-                }
-
-                topEdgeLength = (numVertices + length) * 3;
-                edgePositions = new Array(topEdgeLength * 2);
-                for (i = 0; i < length; i++) {
-                    p1 = positions[i];
-                    p2 = positions[(i + 1) % length];
-
-                    var tempPositions;
-                    if (arcType === ArcType.ArcType.GEODESIC) {
-                        tempPositions = PolygonGeometryLibrary.subdivideLine(p1, p2, minDistance, computeWallIndicesSubdivided);
-                    } else if (arcType === ArcType.ArcType.RHUMB) {
-                        tempPositions = PolygonGeometryLibrary.subdivideRhumbLine(ellipsoid, p1, p2, minDistance, computeWallIndicesSubdivided);
-                    }
-                    var tempPositionsLength = tempPositions.length;
-                    for (var j = 0; j < tempPositionsLength; ++j, ++index) {
-                        edgePositions[index] = tempPositions[j];
-                        edgePositions[index + topEdgeLength] = tempPositions[j];
-                    }
-
-                    edgePositions[index] = p2.x;
-                    edgePositions[index + topEdgeLength] = p2.x;
-                    ++index;
-
-                    edgePositions[index] = p2.y;
-                    edgePositions[index + topEdgeLength] = p2.y;
-                    ++index;
-
-                    edgePositions[index] = p2.z;
-                    edgePositions[index + topEdgeLength] = p2.z;
-                    ++index;
-                }
-            } else {
-                topEdgeLength = length * 3 * 2;
-                edgePositions = new Array(topEdgeLength * 2);
-                for (i = 0; i < length; i++) {
-                    p1 = positions[i];
-                    p2 = positions[(i + 1) % length];
-                    edgePositions[index] = edgePositions[index + topEdgeLength] = p1.x;
-                    ++index;
-                    edgePositions[index] = edgePositions[index + topEdgeLength] = p1.y;
-                    ++index;
-                    edgePositions[index] = edgePositions[index + topEdgeLength] = p1.z;
-                    ++index;
-                    edgePositions[index] = edgePositions[index + topEdgeLength] = p2.x;
-                    ++index;
-                    edgePositions[index] = edgePositions[index + topEdgeLength] = p2.y;
-                    ++index;
-                    edgePositions[index] = edgePositions[index + topEdgeLength] = p2.z;
-                    ++index;
-                }
-            }
-
-            length = edgePositions.length;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(length / 3, length - positions.length * 6);
-            var edgeIndex = 0;
-            length /= 6;
-
-            for (i = 0; i < length; i++) {
-                var UL = i;
-                var UR = UL + 1;
-                var LL = UL + length;
-                var LR = LL + 1;
-
-                p1 = Cartographic.Cartesian3.fromArray(edgePositions, UL * 3, p1Scratch);
-                p2 = Cartographic.Cartesian3.fromArray(edgePositions, UR * 3, p2Scratch);
-                if (Cartographic.Cartesian3.equalsEpsilon(p1, p2, _Math.CesiumMath.EPSILON10, _Math.CesiumMath.EPSILON10)) {
-                    //skip corner
-                    continue;
-                }
-
-                indices[edgeIndex++] = UL;
-                indices[edgeIndex++] = LL;
-                indices[edgeIndex++] = UR;
-                indices[edgeIndex++] = UR;
-                indices[edgeIndex++] = LL;
-                indices[edgeIndex++] = LR;
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : new GeometryAttributes.GeometryAttributes({
-                    position : new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                        componentsPerAttribute : 3,
-                        values : edgePositions
-                    })
-                }),
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES
-            });
-        };
-
-    exports.PolygonGeometryLibrary = PolygonGeometryLibrary;
-
-});
diff --git a/public/libs/Cesium/Workers/PolygonPipeline-fd46002b.js b/public/libs/Cesium/Workers/PolygonPipeline-fd46002b.js
deleted file mode 100644
index 766253d..0000000
--- a/public/libs/Cesium/Workers/PolygonPipeline-fd46002b.js
+++ /dev/null
@@ -1,454 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6'], function (exports, when, Check, _Math, Cartographic, Cartesian2, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, EllipsoidRhumbLine, earcut2_2_1) { 'use strict';
-
-    /**
-         * Winding order defines the order of vertices for a triangle to be considered front-facing.
-         *
-         * @exports WindingOrder
-         */
-        var WindingOrder = {
-            /**
-             * Vertices are in clockwise order.
-             *
-             * @type {Number}
-             * @constant
-             */
-            CLOCKWISE : WebGLConstants.WebGLConstants.CW,
-
-            /**
-             * Vertices are in counter-clockwise order.
-             *
-             * @type {Number}
-             * @constant
-             */
-            COUNTER_CLOCKWISE : WebGLConstants.WebGLConstants.CCW,
-
-            /**
-             * @private
-             */
-            validate : function(windingOrder) {
-                return windingOrder === WindingOrder.CLOCKWISE ||
-                       windingOrder === WindingOrder.COUNTER_CLOCKWISE;
-            }
-        };
-    var WindingOrder$1 = Object.freeze(WindingOrder);
-
-    var scaleToGeodeticHeightN = new Cartographic.Cartesian3();
-        var scaleToGeodeticHeightP = new Cartographic.Cartesian3();
-
-        /**
-         * @private
-         */
-        var PolygonPipeline = {};
-
-        /**
-         * @exception {DeveloperError} At least three positions are required.
-         */
-        PolygonPipeline.computeArea2D = function(positions) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('positions', positions);
-            Check.Check.typeOf.number.greaterThanOrEquals('positions.length', positions.length, 3);
-            //>>includeEnd('debug');
-
-            var length = positions.length;
-            var area = 0.0;
-
-            for ( var i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) {
-                var v0 = positions[i0];
-                var v1 = positions[i1];
-
-                area += (v0.x * v1.y) - (v1.x * v0.y);
-            }
-
-            return area * 0.5;
-        };
-
-        /**
-         * @returns {WindingOrder} The winding order.
-         *
-         * @exception {DeveloperError} At least three positions are required.
-         */
-        PolygonPipeline.computeWindingOrder2D = function(positions) {
-            var area = PolygonPipeline.computeArea2D(positions);
-            return (area > 0.0) ? WindingOrder$1.COUNTER_CLOCKWISE : WindingOrder$1.CLOCKWISE;
-        };
-
-        /**
-         * Triangulate a polygon.
-         *
-         * @param {Cartesian2[]} positions Cartesian2 array containing the vertices of the polygon
-         * @param {Number[]} [holes] An array of the staring indices of the holes.
-         * @returns {Number[]} Index array representing triangles that fill the polygon
-         */
-        PolygonPipeline.triangulate = function(positions, holes) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('positions', positions);
-            //>>includeEnd('debug');
-
-            var flattenedPositions = Cartesian2.Cartesian2.packArray(positions);
-            return earcut2_2_1.earcut(flattenedPositions, holes, 2);
-        };
-
-        var subdivisionV0Scratch = new Cartographic.Cartesian3();
-        var subdivisionV1Scratch = new Cartographic.Cartesian3();
-        var subdivisionV2Scratch = new Cartographic.Cartesian3();
-        var subdivisionS0Scratch = new Cartographic.Cartesian3();
-        var subdivisionS1Scratch = new Cartographic.Cartesian3();
-        var subdivisionS2Scratch = new Cartographic.Cartesian3();
-        var subdivisionMidScratch = new Cartographic.Cartesian3();
-
-        /**
-         * Subdivides positions and raises points to the surface of the ellipsoid.
-         *
-         * @param {Ellipsoid} ellipsoid The ellipsoid the polygon in on.
-         * @param {Cartesian3[]} positions An array of {@link Cartesian3} positions of the polygon.
-         * @param {Number[]} indices An array of indices that determines the triangles in the polygon.
-         * @param {Number} [granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         *
-         * @exception {DeveloperError} At least three indices are required.
-         * @exception {DeveloperError} The number of indices must be divisable by three.
-         * @exception {DeveloperError} Granularity must be greater than zero.
-         */
-        PolygonPipeline.computeSubdivision = function(ellipsoid, positions, indices, granularity, hasHeight) {
-            hasHeight = when.defaultValue(hasHeight, false);
-            granularity = when.defaultValue(granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('ellipsoid', ellipsoid);
-            Check.Check.defined('positions', positions);
-            Check.Check.defined('indices', indices);
-            Check.Check.typeOf.number.greaterThanOrEquals('indices.length', indices.length, 3);
-            Check.Check.typeOf.number.equals('indices.length % 3', '0', indices.length % 3, 0);
-            Check.Check.typeOf.number.greaterThan('granularity', granularity, 0.0);
-            //>>includeEnd('debug');
-
-            // triangles that need (or might need) to be subdivided.
-            var triangles = indices.slice(0);
-
-            // New positions due to edge splits are appended to the positions list.
-            var i;
-            var length = positions.length;
-            var subdividedPositions = new Array(length * 3);
-            var q = 0;
-            for (i = 0; i < length; i++) {
-                var item = positions[i];
-                subdividedPositions[q++] = item.x;
-                subdividedPositions[q++] = item.y;
-                subdividedPositions[q++] = item.z;
-            }
-
-            var subdividedIndices = [];
-
-            // Used to make sure shared edges are not split more than once.
-            var edges = {};
-
-            var radius = ellipsoid.maximumRadius;
-            var minDistance = _Math.CesiumMath.chordLength(granularity, radius);
-            var minDistanceSqrd = minDistance * minDistance;
-
-            while (triangles.length > 0) {
-                var i2 = triangles.pop();
-                var i1 = triangles.pop();
-                var i0 = triangles.pop();
-
-                var v0 = Cartographic.Cartesian3.fromArray(subdividedPositions, i0 * 3, subdivisionV0Scratch);
-                var v1 = Cartographic.Cartesian3.fromArray(subdividedPositions, i1 * 3, subdivisionV1Scratch);
-                var v2 = Cartographic.Cartesian3.fromArray(subdividedPositions, i2 * 3, subdivisionV2Scratch);
-
-                var s0 = hasHeight ? v0 : Cartographic.Cartesian3.multiplyByScalar(Cartographic.Cartesian3.normalize(v0, subdivisionS0Scratch), radius, subdivisionS0Scratch);
-                var s1 = hasHeight ? v1 : Cartographic.Cartesian3.multiplyByScalar(Cartographic.Cartesian3.normalize(v1, subdivisionS1Scratch), radius, subdivisionS1Scratch);
-                var s2 = hasHeight ? v2 : Cartographic.Cartesian3.multiplyByScalar(Cartographic.Cartesian3.normalize(v2, subdivisionS2Scratch), radius, subdivisionS2Scratch);
-        
-                var g0 = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(s0, s1, subdivisionMidScratch));
-                var g1 = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(s1, s2, subdivisionMidScratch));
-                var g2 = Cartographic.Cartesian3.magnitudeSquared(Cartographic.Cartesian3.subtract(s2, s0, subdivisionMidScratch));
-
-                var max = Math.max(g0, g1, g2);
-                var edge;
-                var mid;
-
-                // if the max length squared of a triangle edge is greater than the chord length of squared
-                // of the granularity, subdivide the triangle
-                if (max > minDistanceSqrd) {
-                    if (g0 === max) {
-                        edge = Math.min(i0, i1) + ' ' + Math.max(i0, i1);
-
-                        i = edges[edge];
-                        if (!when.defined(i)) {
-                            mid = Cartographic.Cartesian3.add(v0, v1, subdivisionMidScratch);
-                            Cartographic.Cartesian3.multiplyByScalar(mid, 0.5, mid);
-                            subdividedPositions.push(mid.x, mid.y, mid.z);
-                            i = subdividedPositions.length / 3 - 1;
-                            edges[edge] = i;
-                        }
-
-                        triangles.push(i0, i, i2);
-                        triangles.push(i, i1, i2);
-                    } else if (g1 === max) {
-                        edge = Math.min(i1, i2) + ' ' + Math.max(i1, i2);
-
-                        i = edges[edge];
-                        if (!when.defined(i)) {
-                            mid = Cartographic.Cartesian3.add(v1, v2, subdivisionMidScratch);
-                            Cartographic.Cartesian3.multiplyByScalar(mid, 0.5, mid);
-                            subdividedPositions.push(mid.x, mid.y, mid.z);
-                            i = subdividedPositions.length / 3 - 1;
-                            edges[edge] = i;
-                        }
-
-                        triangles.push(i1, i, i0);
-                        triangles.push(i, i2, i0);
-                    } else if (g2 === max) {
-                        edge = Math.min(i2, i0) + ' ' + Math.max(i2, i0);
-
-                        i = edges[edge];
-                        if (!when.defined(i)) {
-                            mid = Cartographic.Cartesian3.add(v2, v0, subdivisionMidScratch);
-                            Cartographic.Cartesian3.multiplyByScalar(mid, 0.5, mid);
-                            subdividedPositions.push(mid.x, mid.y, mid.z);
-                            i = subdividedPositions.length / 3 - 1;
-                            edges[edge] = i;
-                        }
-
-                        triangles.push(i2, i, i1);
-                        triangles.push(i, i0, i1);
-                    }
-                } else {
-                    subdividedIndices.push(i0);
-                    subdividedIndices.push(i1);
-                    subdividedIndices.push(i2);
-                }
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : {
-                    position : new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                        componentsPerAttribute : 3,
-                        values : subdividedPositions
-                    })
-                },
-                indices : subdividedIndices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES
-            });
-        };
-
-        var subdivisionC0Scratch = new Cartographic.Cartographic();
-        var subdivisionC1Scratch = new Cartographic.Cartographic();
-        var subdivisionC2Scratch = new Cartographic.Cartographic();
-        var subdivisionCartographicScratch = new Cartographic.Cartographic();
-
-        /**
-         * Subdivides positions on rhumb lines and raises points to the surface of the ellipsoid.
-         *
-         * @param {Ellipsoid} ellipsoid The ellipsoid the polygon in on.
-         * @param {Cartesian3[]} positions An array of {@link Cartesian3} positions of the polygon.
-         * @param {Number[]} indices An array of indices that determines the triangles in the polygon.
-         * @param {Number} [granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         *
-         * @exception {DeveloperError} At least three indices are required.
-         * @exception {DeveloperError} The number of indices must be divisable by three.
-         * @exception {DeveloperError} Granularity must be greater than zero.
-         */
-        PolygonPipeline.computeRhumbLineSubdivision = function(ellipsoid, positions, indices, granularity) {
-            granularity = when.defaultValue(granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('ellipsoid', ellipsoid);
-            Check.Check.defined('positions', positions);
-            Check.Check.defined('indices', indices);
-            Check.Check.typeOf.number.greaterThanOrEquals('indices.length', indices.length, 3);
-            Check.Check.typeOf.number.equals('indices.length % 3', '0', indices.length % 3, 0);
-            Check.Check.typeOf.number.greaterThan('granularity', granularity, 0.0);
-            //>>includeEnd('debug');
-
-            // triangles that need (or might need) to be subdivided.
-            var triangles = indices.slice(0);
-
-            // New positions due to edge splits are appended to the positions list.
-            var i;
-            var length = positions.length;
-            var subdividedPositions = new Array(length * 3);
-            var q = 0;
-            for (i = 0; i < length; i++) {
-                var item = positions[i];
-                subdividedPositions[q++] = item.x;
-                subdividedPositions[q++] = item.y;
-                subdividedPositions[q++] = item.z;
-            }
-
-            var subdividedIndices = [];
-
-            // Used to make sure shared edges are not split more than once.
-            var edges = {};
-
-            var radius = ellipsoid.maximumRadius;
-            var minDistance = _Math.CesiumMath.chordLength(granularity, radius);
-
-            var rhumb0 = new EllipsoidRhumbLine.EllipsoidRhumbLine(undefined, undefined, ellipsoid);
-            var rhumb1 = new EllipsoidRhumbLine.EllipsoidRhumbLine(undefined, undefined, ellipsoid);
-            var rhumb2 = new EllipsoidRhumbLine.EllipsoidRhumbLine(undefined, undefined, ellipsoid);
-
-            while (triangles.length > 0) {
-                var i2 = triangles.pop();
-                var i1 = triangles.pop();
-                var i0 = triangles.pop();
-
-                var v0 = Cartographic.Cartesian3.fromArray(subdividedPositions, i0 * 3, subdivisionV0Scratch);
-                var v1 = Cartographic.Cartesian3.fromArray(subdividedPositions, i1 * 3, subdivisionV1Scratch);
-                var v2 = Cartographic.Cartesian3.fromArray(subdividedPositions, i2 * 3, subdivisionV2Scratch);
-
-                var c0 = ellipsoid.cartesianToCartographic(v0, subdivisionC0Scratch);
-                var c1 = ellipsoid.cartesianToCartographic(v1, subdivisionC1Scratch);
-                var c2 = ellipsoid.cartesianToCartographic(v2, subdivisionC2Scratch);
-
-                rhumb0.setEndPoints(c0, c1);
-                var g0 = rhumb0.surfaceDistance;
-                rhumb1.setEndPoints(c1, c2);
-                var g1 = rhumb1.surfaceDistance;
-                rhumb2.setEndPoints(c2, c0);
-                var g2 = rhumb2.surfaceDistance;
-
-                var max = Math.max(g0, g1, g2);
-                var edge;
-                var mid;
-                var midHeight;
-                var midCartesian3;
-
-                // if the max length squared of a triangle edge is greater than granularity, subdivide the triangle
-                if (max > minDistance) {
-                    if (g0 === max) {
-                        edge = Math.min(i0, i1) + ' ' + Math.max(i0, i1);
-
-                        i = edges[edge];
-                        if (!when.defined(i)) {
-                            mid = rhumb0.interpolateUsingFraction(0.5, subdivisionCartographicScratch);
-                            midHeight = (c0.height + c1.height) * 0.5;
-                            midCartesian3 = Cartographic.Cartesian3.fromRadians(mid.longitude, mid.latitude, midHeight, ellipsoid, subdivisionMidScratch);
-                            subdividedPositions.push(midCartesian3.x, midCartesian3.y, midCartesian3.z);
-                            i = subdividedPositions.length / 3 - 1;
-                            edges[edge] = i;
-                        }
-
-                        triangles.push(i0, i, i2);
-                        triangles.push(i, i1, i2);
-                    } else if (g1 === max) {
-                        edge = Math.min(i1, i2) + ' ' + Math.max(i1, i2);
-
-                        i = edges[edge];
-                        if (!when.defined(i)) {
-                            mid = rhumb1.interpolateUsingFraction(0.5, subdivisionCartographicScratch);
-                            midHeight = (c1.height + c2.height) * 0.5;
-                            midCartesian3 = Cartographic.Cartesian3.fromRadians(mid.longitude, mid.latitude, midHeight, ellipsoid, subdivisionMidScratch);
-                            subdividedPositions.push(midCartesian3.x, midCartesian3.y, midCartesian3.z);
-                            i = subdividedPositions.length / 3 - 1;
-                            edges[edge] = i;
-                        }
-
-                        triangles.push(i1, i, i0);
-                        triangles.push(i, i2, i0);
-                    } else if (g2 === max) {
-                        edge = Math.min(i2, i0) + ' ' + Math.max(i2, i0);
-
-                        i = edges[edge];
-                        if (!when.defined(i)) {
-                            mid = rhumb2.interpolateUsingFraction(0.5, subdivisionCartographicScratch);
-                            midHeight = (c2.height + c0.height) * 0.5;
-                            midCartesian3 = Cartographic.Cartesian3.fromRadians(mid.longitude, mid.latitude, midHeight, ellipsoid, subdivisionMidScratch);
-                            subdividedPositions.push(midCartesian3.x, midCartesian3.y, midCartesian3.z);
-                            i = subdividedPositions.length / 3 - 1;
-                            edges[edge] = i;
-                        }
-
-                        triangles.push(i2, i, i1);
-                        triangles.push(i, i0, i1);
-                    }
-                } else {
-                    subdividedIndices.push(i0);
-                    subdividedIndices.push(i1);
-                    subdividedIndices.push(i2);
-                }
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : {
-                    position : new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                        componentsPerAttribute : 3,
-                        values : subdividedPositions
-                    })
-                },
-                indices : subdividedIndices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES
-            });
-        };
-
-        /**
-         * Scales each position of a geometry's position attribute to a height, in place.
-         *
-         * @param {Number[]} positions The array of numbers representing the positions to be scaled
-         * @param {Number} [height=0.0] The desired height to add to the positions
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie.
-         * @param {Boolean} [scaleToSurface=true] <code>true</code> if the positions need to be scaled to the surface before the height is added.
-         * @returns {Number[]} The input array of positions, scaled to height
-         */
-        PolygonPipeline.scaleToGeodeticHeight = function(positions, height, ellipsoid, scaleToSurface) {
-            ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-            var n = scaleToGeodeticHeightN;
-            var p = scaleToGeodeticHeightP;
-
-            height = when.defaultValue(height, 0.0);
-            scaleToSurface = when.defaultValue(scaleToSurface, true);
-
-            if (when.defined(positions)) {
-                var length = positions.length;
-
-                for ( var i = 0; i < length; i += 3) {
-                    Cartographic.Cartesian3.fromArray(positions, i, p);
-
-                    if (scaleToSurface) {
-                        p = ellipsoid.scaleToGeodeticSurface(p, p);
-                    }
-
-                    if (height !== 0) {
-                        n = ellipsoid.geodeticSurfaceNormal(p, n);
-
-                        Cartographic.Cartesian3.multiplyByScalar(n, height, n);
-                        Cartographic.Cartesian3.add(p, n, p);
-                    }
-
-                    positions[i] = p.x;
-                    positions[i + 1] = p.y;
-                    positions[i + 2] = p.z;
-                }
-            }
-
-            return positions;
-        };
-
-    exports.PolygonPipeline = PolygonPipeline;
-    exports.WindingOrder = WindingOrder$1;
-
-});
diff --git a/public/libs/Cesium/Workers/PolylinePipeline-a9f32196.js b/public/libs/Cesium/Workers/PolylinePipeline-a9f32196.js
deleted file mode 100644
index 1d53b88..0000000
--- a/public/libs/Cesium/Workers/PolylinePipeline-a9f32196.js
+++ /dev/null
@@ -1,496 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './IntersectionTests-397d9494', './Plane-8390418f', './EllipsoidRhumbLine-f161e674', './EllipsoidGeodesic-84507801'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, IntersectionTests, Plane, EllipsoidRhumbLine, EllipsoidGeodesic) { 'use strict';
-
-    /**
-         * @private
-         */
-        var PolylinePipeline = {};
-
-        PolylinePipeline.numberOfPoints = function(p0, p1, minDistance) {
-            var distance = Cartographic.Cartesian3.distance(p0, p1);
-            return Math.ceil(distance / minDistance);
-        };
-
-        PolylinePipeline.numberOfPointsRhumbLine = function(p0, p1, granularity) {
-            var radiansDistanceSquared = Math.pow((p0.longitude - p1.longitude), 2) + Math.pow((p0.latitude - p1.latitude), 2);
-            return Math.ceil(Math.sqrt(radiansDistanceSquared / (granularity * granularity)));
-        };
-
-        var cartoScratch = new Cartographic.Cartographic();
-        PolylinePipeline.extractHeights = function(positions, ellipsoid) {
-            var length = positions.length;
-            var heights = new Array(length);
-            for (var i = 0; i < length; i++) {
-                var p = positions[i];
-                heights[i] = ellipsoid.cartesianToCartographic(p, cartoScratch).height;
-            }
-            return heights;
-        };
-
-        var wrapLongitudeInversMatrix = new BoundingSphere.Matrix4();
-        var wrapLongitudeOrigin = new Cartographic.Cartesian3();
-        var wrapLongitudeXZNormal = new Cartographic.Cartesian3();
-        var wrapLongitudeXZPlane = new Plane.Plane(Cartographic.Cartesian3.UNIT_X, 0.0);
-        var wrapLongitudeYZNormal = new Cartographic.Cartesian3();
-        var wrapLongitudeYZPlane = new Plane.Plane(Cartographic.Cartesian3.UNIT_X, 0.0);
-        var wrapLongitudeIntersection = new Cartographic.Cartesian3();
-        var wrapLongitudeOffset = new Cartographic.Cartesian3();
-
-        var subdivideHeightsScratchArray = [];
-
-        function subdivideHeights(numPoints, h0, h1) {
-            var heights = subdivideHeightsScratchArray;
-            heights.length = numPoints;
-
-            var i;
-            if (h0 === h1) {
-                for (i = 0; i < numPoints; i++) {
-                    heights[i] = h0;
-                }
-                return heights;
-            }
-
-            var dHeight = h1 - h0;
-            var heightPerVertex = dHeight / numPoints;
-
-            for (i = 0; i < numPoints; i++) {
-                var h = h0 + i*heightPerVertex;
-                heights[i] = h;
-            }
-
-            return heights;
-        }
-
-        function subdivideHeightsBySin(numPoints, hMax) {
-            var heights = subdivideHeightsScratchArray;
-            heights.length = numPoints;
-
-            for (var i = 0; i < numPoints; i++) {
-                heights[i] = hMax * Math.sin(Math.PI * i/numPoints);
-            }
-
-            return heights;
-        }
-
-        var carto1 = new Cartographic.Cartographic();
-        var carto2 = new Cartographic.Cartographic();
-        var cartesian = new Cartographic.Cartesian3();
-        var scaleFirst = new Cartographic.Cartesian3();
-        var scaleLast = new Cartographic.Cartesian3();
-        var ellipsoidGeodesic = new EllipsoidGeodesic.EllipsoidGeodesic();
-        var ellipsoidRhumb = new EllipsoidRhumbLine.EllipsoidRhumbLine();
-
-        //Returns subdivided line scaled to ellipsoid surface starting at p1 and ending at p2.
-        //Result includes p1, but not include p2.  This function is called for a sequence of line segments,
-        //and this prevents duplication of end point.
-        function generateCartesianArc(p0, p1, minDistance, ellipsoid, h0, h1, array, offset, hMax) {
-            var first = ellipsoid.scaleToGeodeticSurface(p0, scaleFirst);
-            var last = ellipsoid.scaleToGeodeticSurface(p1, scaleLast);
-            var numPoints = PolylinePipeline.numberOfPoints(p0, p1, minDistance);
-            var start = ellipsoid.cartesianToCartographic(first, carto1);
-            var end = ellipsoid.cartesianToCartographic(last, carto2);
-            var heights = subdivideHeights(numPoints, h0, h1);
-            if(hMax >0.0){
-                heights = subdivideHeightsBySin(numPoints, hMax);
-            }
-
-            ellipsoidGeodesic.setEndPoints(start, end);
-            var surfaceDistanceBetweenPoints = ellipsoidGeodesic.surfaceDistance / numPoints;
-
-            var index = offset;
-            start.height = h0;
-            var cart = ellipsoid.cartographicToCartesian(start, cartesian);
-            Cartographic.Cartesian3.pack(cart, array, index);
-            index += 3;
-
-            for (var i = 1; i < numPoints; i++) {
-                var carto = ellipsoidGeodesic.interpolateUsingSurfaceDistance(i * surfaceDistanceBetweenPoints, carto2);
-                carto.height = heights[i];
-                cart = ellipsoid.cartographicToCartesian(carto, cartesian);
-                Cartographic.Cartesian3.pack(cart, array, index);
-                index += 3;
-            }
-
-            return index;
-        }
-
-        //Returns subdivided line scaled to ellipsoid surface starting at p1 and ending at p2.
-        //Result includes p1, but not include p2.  This function is called for a sequence of line segments,
-        //and this prevents duplication of end point.
-        function generateCartesianRhumbArc(p0, p1, granularity, ellipsoid, h0, h1, array, offset) {
-            var first = ellipsoid.scaleToGeodeticSurface(p0, scaleFirst);
-            var last = ellipsoid.scaleToGeodeticSurface(p1, scaleLast);
-            var start = ellipsoid.cartesianToCartographic(first, carto1);
-            var end = ellipsoid.cartesianToCartographic(last, carto2);
-
-            var numPoints = PolylinePipeline.numberOfPointsRhumbLine(start, end, granularity);
-            var heights = subdivideHeights(numPoints, h0, h1);
-
-            if (!ellipsoidRhumb.ellipsoid.equals(ellipsoid)) {
-                ellipsoidRhumb = new EllipsoidRhumbLine.EllipsoidRhumbLine(undefined, undefined, ellipsoid);
-            }
-            ellipsoidRhumb.setEndPoints(start, end);
-            var surfaceDistanceBetweenPoints = ellipsoidRhumb.surfaceDistance / numPoints;
-
-            var index = offset;
-            start.height = h0;
-            var cart = ellipsoid.cartographicToCartesian(start, cartesian);
-            Cartographic.Cartesian3.pack(cart, array, index);
-            index += 3;
-
-            for (var i = 1; i < numPoints; i++) {
-                var carto = ellipsoidRhumb.interpolateUsingSurfaceDistance(i * surfaceDistanceBetweenPoints, carto2);
-                carto.height = heights[i];
-                cart = ellipsoid.cartographicToCartesian(carto, cartesian);
-                Cartographic.Cartesian3.pack(cart, array, index);
-                index += 3;
-            }
-
-            return index;
-        }
-
-        /**
-         * Breaks a {@link Polyline} into segments such that it does not cross the &plusmn;180 degree meridian of an ellipsoid.
-         *
-         * @param {Cartesian3[]} positions The polyline's Cartesian positions.
-         * @param {Matrix4} [modelMatrix=Matrix4.IDENTITY] The polyline's model matrix. Assumed to be an affine
-         * transformation matrix, where the upper left 3x3 elements are a rotation matrix, and
-         * the upper three elements in the fourth column are the translation.  The bottom row is assumed to be [0, 0, 0, 1].
-         * The matrix is not verified to be in the proper form.
-         * @returns {Object} An object with a <code>positions</code> property that is an array of positions and a
-         * <code>segments</code> property.
-         *
-         *
-         * @example
-         * var polylines = new Cesium.PolylineCollection();
-         * var polyline = polylines.add(...);
-         * var positions = polyline.positions;
-         * var modelMatrix = polylines.modelMatrix;
-         * var segments = Cesium.PolylinePipeline.wrapLongitude(positions, modelMatrix);
-         *
-         * @see PolygonPipeline.wrapLongitude
-         * @see Polyline
-         * @see PolylineCollection
-         */
-        PolylinePipeline.wrapLongitude = function(positions, modelMatrix) {
-            var cartesians = [];
-            var segments = [];
-
-            if (when.defined(positions) && positions.length > 0) {
-                modelMatrix = when.defaultValue(modelMatrix, BoundingSphere.Matrix4.IDENTITY);
-                var inverseModelMatrix = BoundingSphere.Matrix4.inverseTransformation(modelMatrix, wrapLongitudeInversMatrix);
-
-                var origin = BoundingSphere.Matrix4.multiplyByPoint(inverseModelMatrix, Cartographic.Cartesian3.ZERO, wrapLongitudeOrigin);
-                var xzNormal = Cartographic.Cartesian3.normalize(BoundingSphere.Matrix4.multiplyByPointAsVector(inverseModelMatrix, Cartographic.Cartesian3.UNIT_Y, wrapLongitudeXZNormal), wrapLongitudeXZNormal);
-                var xzPlane = Plane.Plane.fromPointNormal(origin, xzNormal, wrapLongitudeXZPlane);
-                var yzNormal = Cartographic.Cartesian3.normalize(BoundingSphere.Matrix4.multiplyByPointAsVector(inverseModelMatrix, Cartographic.Cartesian3.UNIT_X, wrapLongitudeYZNormal), wrapLongitudeYZNormal);
-                var yzPlane = Plane.Plane.fromPointNormal(origin, yzNormal, wrapLongitudeYZPlane);
-
-                var count = 1;
-                cartesians.push(Cartographic.Cartesian3.clone(positions[0]));
-                var prev = cartesians[0];
-
-                var length = positions.length;
-                for (var i = 1; i < length; ++i) {
-                    var cur = positions[i];
-
-                    // intersects the IDL if either endpoint is on the negative side of the yz-plane
-                    if (Plane.Plane.getPointDistance(yzPlane, prev) < 0.0 || Plane.Plane.getPointDistance(yzPlane, cur) < 0.0) {
-                        // and intersects the xz-plane
-                        var intersection = IntersectionTests.IntersectionTests.lineSegmentPlane(prev, cur, xzPlane, wrapLongitudeIntersection);
-                        if (when.defined(intersection)) {
-                            // move point on the xz-plane slightly away from the plane
-                            var offset = Cartographic.Cartesian3.multiplyByScalar(xzNormal, 5.0e-9, wrapLongitudeOffset);
-                            if (Plane.Plane.getPointDistance(xzPlane, prev) < 0.0) {
-                                Cartographic.Cartesian3.negate(offset, offset);
-                            }
-
-                            cartesians.push(Cartographic.Cartesian3.add(intersection, offset, new Cartographic.Cartesian3()));
-                            segments.push(count + 1);
-
-                            Cartographic.Cartesian3.negate(offset, offset);
-                            cartesians.push(Cartographic.Cartesian3.add(intersection, offset, new Cartographic.Cartesian3()));
-                            count = 1;
-                        }
-                    }
-
-                    cartesians.push(Cartographic.Cartesian3.clone(positions[i]));
-                    count++;
-
-                    prev = cur;
-                }
-
-                segments.push(count);
-            }
-
-            return {
-                positions : cartesians,
-                lengths : segments
-            };
-        };
-
-        /**
-         * Subdivides polyline and raises all points to the specified height.  Returns an array of numbers to represent the positions.
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions.
-         * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position.
-         * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie.
-         * @returns {Number[]} A new array of positions of type {Number} that have been subdivided and raised to the surface of the ellipsoid.
-         *
-         * @example
-         * var positions = Cesium.Cartesian3.fromDegreesArray([
-         *   -105.0, 40.0,
-         *   -100.0, 38.0,
-         *   -105.0, 35.0,
-         *   -100.0, 32.0
-         * ]);
-         * var surfacePositions = Cesium.PolylinePipeline.generateArc({
-         *   positons: positions
-         * });
-         */
-        PolylinePipeline.generateArc = function(options) {
-            if (!when.defined(options)) {
-                options = {};
-            }
-            var positions = options.positions;
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(positions)) {
-                throw new Check.DeveloperError('options.positions is required.');
-            }
-            //>>includeEnd('debug');
-
-            var length = positions.length;
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var height = when.defaultValue(options.height, 0);
-            var hasHeightArray = Array.isArray(height);
-
-            if (length < 1) {
-                return [];
-            } else if (length === 1) {
-                var p = ellipsoid.scaleToGeodeticSurface(positions[0], scaleFirst);
-                height = hasHeightArray ? height[0] : height;
-                if (height !== 0) {
-                    var n = ellipsoid.geodeticSurfaceNormal(p, cartesian);
-                    Cartographic.Cartesian3.multiplyByScalar(n, height, n);
-                    Cartographic.Cartesian3.add(p, n, p);
-                }
-
-                return [p.x, p.y, p.z];
-            }
-
-            var minDistance = options.minDistance;
-            if (!when.defined(minDistance)) {
-                var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-                minDistance = _Math.CesiumMath.chordLength(granularity, ellipsoid.maximumRadius);
-            }
-
-            var numPoints = 0;
-            var i;
-
-            for (i = 0; i < length -1; i++) {
-                numPoints += PolylinePipeline.numberOfPoints(positions[i], positions[i+1], minDistance);
-            }
-
-            var hMax = options.hMax;
-
-            var arrayLength = (numPoints + 1) * 3;
-            var newPositions = new Array(arrayLength);
-            var offset = 0;
-
-            for (i = 0; i < length - 1; i++) {
-                var p0 = positions[i];
-                var p1 = positions[i + 1];
-
-                var h0 = hasHeightArray ? height[i] : height;
-                var h1 = hasHeightArray ? height[i + 1] : height;
-
-                offset = generateCartesianArc(p0, p1, minDistance, ellipsoid, h0, h1, newPositions, offset, hMax);
-            }
-
-            subdivideHeightsScratchArray.length = 0;
-
-            var lastPoint = positions[length - 1];
-            var carto = ellipsoid.cartesianToCartographic(lastPoint, carto1);
-            carto.height = hasHeightArray ? height[length - 1] : height;
-            var cart = ellipsoid.cartographicToCartesian(carto, cartesian);
-            Cartographic.Cartesian3.pack(cart, newPositions, arrayLength - 3);
-
-            return newPositions;
-        };
-
-        var scratchCartographic0 = new Cartographic.Cartographic();
-        var scratchCartographic1 = new Cartographic.Cartographic();
-
-        /**
-         * Subdivides polyline and raises all points to the specified height using Rhumb lines.  Returns an array of numbers to represent the positions.
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions.
-         * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position.
-         * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie.
-         * @returns {Number[]} A new array of positions of type {Number} that have been subdivided and raised to the surface of the ellipsoid.
-         *
-         * @example
-         * var positions = Cesium.Cartesian3.fromDegreesArray([
-         *   -105.0, 40.0,
-         *   -100.0, 38.0,
-         *   -105.0, 35.0,
-         *   -100.0, 32.0
-         * ]);
-         * var surfacePositions = Cesium.PolylinePipeline.generateRhumbArc({
-         *   positons: positions
-         * });
-         */
-        PolylinePipeline.generateRhumbArc = function(options) {
-            if (!when.defined(options)) {
-                options = {};
-            }
-            var positions = options.positions;
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(positions)) {
-                throw new Check.DeveloperError('options.positions is required.');
-            }
-            //>>includeEnd('debug');
-
-            var length = positions.length;
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var height = when.defaultValue(options.height, 0);
-            var hasHeightArray = Array.isArray(height);
-
-            if (length < 1) {
-                return [];
-            } else if (length === 1) {
-                var p = ellipsoid.scaleToGeodeticSurface(positions[0], scaleFirst);
-                height = hasHeightArray ? height[0] : height;
-                if (height !== 0) {
-                    var n = ellipsoid.geodeticSurfaceNormal(p, cartesian);
-                    Cartographic.Cartesian3.multiplyByScalar(n, height, n);
-                    Cartographic.Cartesian3.add(p, n, p);
-                }
-
-                return [p.x, p.y, p.z];
-            }
-
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-
-            var numPoints = 0;
-            var i;
-
-            var c0 = ellipsoid.cartesianToCartographic(positions[0], scratchCartographic0);
-            var c1;
-            for (i = 0; i < length - 1; i++) {
-                c1 = ellipsoid.cartesianToCartographic(positions[i + 1], scratchCartographic1);
-                numPoints += PolylinePipeline.numberOfPointsRhumbLine(c0, c1, granularity);
-                c0 = Cartographic.Cartographic.clone(c1, scratchCartographic0);
-            }
-
-            var arrayLength = (numPoints + 1) * 3;
-            var newPositions = new Array(arrayLength);
-            var offset = 0;
-
-            for (i = 0; i < length - 1; i++) {
-                var p0 = positions[i];
-                var p1 = positions[i + 1];
-
-                var h0 = hasHeightArray ? height[i] : height;
-                var h1 = hasHeightArray ? height[i + 1] : height;
-
-                offset = generateCartesianRhumbArc(p0, p1, granularity, ellipsoid, h0, h1, newPositions, offset);
-            }
-
-            subdivideHeightsScratchArray.length = 0;
-
-            var lastPoint = positions[length - 1];
-            var carto = ellipsoid.cartesianToCartographic(lastPoint, carto1);
-            carto.height = hasHeightArray ? height[length - 1] : height;
-            var cart = ellipsoid.cartographicToCartesian(carto, cartesian);
-            Cartographic.Cartesian3.pack(cart, newPositions, arrayLength - 3);
-
-            return newPositions;
-        };
-
-        /**
-         * Subdivides polyline and raises all points to the specified height. Returns an array of new {Cartesian3} positions.
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions.
-         * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position.
-         * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie.
-         * @returns {Cartesian3[]} A new array of cartesian3 positions that have been subdivided and raised to the surface of the ellipsoid.
-         *
-         * @example
-         * var positions = Cesium.Cartesian3.fromDegreesArray([
-         *   -105.0, 40.0,
-         *   -100.0, 38.0,
-         *   -105.0, 35.0,
-         *   -100.0, 32.0
-         * ]);
-         * var surfacePositions = Cesium.PolylinePipeline.generateCartesianArc({
-         *   positons: positions
-         * });
-         */
-        PolylinePipeline.generateCartesianArc = function(options) {
-            var numberArray = PolylinePipeline.generateArc(options);
-            var size = numberArray.length/3;
-            var newPositions = new Array(size);
-            for (var i = 0; i < size; i++) {
-                newPositions[i] = Cartographic.Cartesian3.unpack(numberArray, i*3);
-            }
-            return newPositions;
-        };
-
-        /**
-         * Subdivides polyline and raises all points to the specified height using Rhumb Lines. Returns an array of new {Cartesian3} positions.
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions.
-         * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position.
-         * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie.
-         * @returns {Cartesian3[]} A new array of cartesian3 positions that have been subdivided and raised to the surface of the ellipsoid.
-         *
-         * @example
-         * var positions = Cesium.Cartesian3.fromDegreesArray([
-         *   -105.0, 40.0,
-         *   -100.0, 38.0,
-         *   -105.0, 35.0,
-         *   -100.0, 32.0
-         * ]);
-         * var surfacePositions = Cesium.PolylinePipeline.generateCartesianRhumbArc({
-         *   positons: positions
-         * });
-         */
-        PolylinePipeline.generateCartesianRhumbArc = function(options) {
-            var numberArray = PolylinePipeline.generateRhumbArc(options);
-            var size = numberArray.length/3;
-            var newPositions = new Array(size);
-            for (var i = 0; i < size; i++) {
-                newPositions[i] = Cartographic.Cartesian3.unpack(numberArray, i*3);
-            }
-            return newPositions;
-        };
-
-    exports.PolylinePipeline = PolylinePipeline;
-
-});
diff --git a/public/libs/Cesium/Workers/PolylineVolumeGeometryLibrary-5bb7662e.js b/public/libs/Cesium/Workers/PolylineVolumeGeometryLibrary-5bb7662e.js
deleted file mode 100644
index dcfa323..0000000
--- a/public/libs/Cesium/Workers/PolylineVolumeGeometryLibrary-5bb7662e.js
+++ /dev/null
@@ -1,628 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './Transforms-a1cf7267', './EllipsoidTangentPlane-e324bfa4', './PolylinePipeline-a9f32196'], function (exports, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, Transforms, EllipsoidTangentPlane, PolylinePipeline) { 'use strict';
-
-    /**
-         * Style options for corners.
-         *
-         * @demo The {@link https://sandcastle.cesium.com/index.html?src=Corridor.html&label=Geometries|Corridor Demo}
-         * demonstrates the three corner types, as used by {@link CorridorGraphics}.
-         *
-         * @exports CornerType
-         */
-        var CornerType = {
-            /**
-             * <img src="Images/CornerTypeRounded.png" style="vertical-align: middle;" width="186" height="189" />
-             *
-             * Corner has a smooth edge.
-             * @type {Number}
-             * @constant
-             */
-            ROUNDED : 0,
-
-            /**
-             * <img src="Images/CornerTypeMitered.png" style="vertical-align: middle;" width="186" height="189" />
-             *
-             * Corner point is the intersection of adjacent edges.
-             * @type {Number}
-             * @constant
-             */
-            MITERED : 1,
-
-            /**
-             * <img src="Images/CornerTypeBeveled.png" style="vertical-align: middle;" width="186" height="189" />
-             *
-             * Corner is clipped.
-             * @type {Number}
-             * @constant
-             */
-            BEVELED : 2
-        };
-    var CornerType$1 = Object.freeze(CornerType);
-
-    var scratch2Array = [new Cartographic.Cartesian3(), new Cartographic.Cartesian3()];
-        var scratchCartesian1 = new Cartographic.Cartesian3();
-        var scratchCartesian2 = new Cartographic.Cartesian3();
-        var scratchCartesian3 = new Cartographic.Cartesian3();
-        var scratchCartesian4 = new Cartographic.Cartesian3();
-        var scratchCartesian5 = new Cartographic.Cartesian3();
-        var scratchCartesian6 = new Cartographic.Cartesian3();
-        var scratchCartesian7 = new Cartographic.Cartesian3();
-        var scratchCartesian8 = new Cartographic.Cartesian3();
-        var scratchCartesian9 = new Cartographic.Cartesian3();
-
-        var scratch1 = new Cartographic.Cartesian3();
-        var scratch2 = new Cartographic.Cartesian3();
-
-        /**
-         * @private
-         */
-        var PolylineVolumeGeometryLibrary = {};
-
-        var cartographic = new Cartographic.Cartographic();
-        function scaleToSurface(positions, ellipsoid) {
-            var heights = new Array(positions.length);
-            for (var i = 0; i < positions.length; i++) {
-                var pos = positions[i];
-                cartographic = ellipsoid.cartesianToCartographic(pos, cartographic);
-                heights[i] = cartographic.height;
-                positions[i] = ellipsoid.scaleToGeodeticSurface(pos, pos);
-            }
-            return heights;
-        }
-
-        function subdivideHeights(points, h0, h1, granularity) {
-            var p0 = points[0];
-            var p1 = points[1];
-            var angleBetween = Cartographic.Cartesian3.angleBetween(p0, p1);
-            var numPoints = Math.ceil(angleBetween / granularity);
-            var heights = new Array(numPoints);
-            var i;
-            if (h0 === h1) {
-                for (i = 0; i < numPoints; i++) {
-                    heights[i] = h0;
-                }
-                heights.push(h1);
-                return heights;
-            }
-
-            var dHeight = h1 - h0;
-            var heightPerVertex = dHeight / (numPoints);
-
-            for (i = 1; i < numPoints; i++) {
-                var h = h0 + i * heightPerVertex;
-                heights[i] = h;
-            }
-
-            heights[0] = h0;
-            heights.push(h1);
-            return heights;
-        }
-
-        var nextScratch = new Cartographic.Cartesian3();
-        var prevScratch = new Cartographic.Cartesian3();
-
-        function computeRotationAngle(start, end, position, ellipsoid) {
-            var tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(position, ellipsoid);
-            var next = tangentPlane.projectPointOntoPlane(Cartographic.Cartesian3.add(position, start, nextScratch), nextScratch);
-            var prev = tangentPlane.projectPointOntoPlane(Cartographic.Cartesian3.add(position, end, prevScratch), prevScratch);
-            var angle = Cartesian2.Cartesian2.angleBetween(next, prev);
-
-            return (prev.x * next.y - prev.y * next.x >= 0.0) ? -angle : angle;
-        }
-
-        var negativeX = new Cartographic.Cartesian3(-1, 0, 0);
-        var transform = BoundingSphere.Matrix4.clone(BoundingSphere.Matrix4.IDENTITY);
-        var translation = new BoundingSphere.Matrix4();
-        var rotationZ = new BoundingSphere.Matrix3();
-        var scaleMatrix = BoundingSphere.Matrix3.IDENTITY.clone();
-        var westScratch = new Cartographic.Cartesian3();
-        var finalPosScratch = new Cartesian4.Cartesian4();
-        var heightCartesian = new Cartographic.Cartesian3();
-        function addPosition(center, left, shape, finalPositions, ellipsoid, height, xScalar, repeat) {
-            var west = westScratch;
-            var finalPosition = finalPosScratch;
-            transform = Transforms.Transforms.eastNorthUpToFixedFrame(center, ellipsoid, transform);
-
-            west = BoundingSphere.Matrix4.multiplyByPointAsVector(transform, negativeX, west);
-            west = Cartographic.Cartesian3.normalize(west, west);
-            var angle = computeRotationAngle(west, left, center, ellipsoid);
-            rotationZ = BoundingSphere.Matrix3.fromRotationZ(angle, rotationZ);
-
-            heightCartesian.z = height;
-            transform = BoundingSphere.Matrix4.multiplyTransformation(transform, BoundingSphere.Matrix4.fromRotationTranslation(rotationZ, heightCartesian, translation), transform);
-            var scale = scaleMatrix;
-            scale[0] = xScalar;
-
-            for (var j = 0; j < repeat; j++) {
-                for (var i = 0; i < shape.length; i += 3) {
-                    finalPosition = Cartographic.Cartesian3.fromArray(shape, i, finalPosition);
-                    finalPosition = BoundingSphere.Matrix3.multiplyByVector(scale, finalPosition, finalPosition);
-                    finalPosition = BoundingSphere.Matrix4.multiplyByPoint(transform, finalPosition, finalPosition);
-                    finalPositions.push(finalPosition.x, finalPosition.y, finalPosition.z);
-                }
-            }
-
-            return finalPositions;
-        }
-
-        function addPositionLocal(center, left, shape, finalPositions, ellipsoid, height, xScalar, repeat, enuInverse) {
-            var west = westScratch;
-            var finalPosition = finalPosScratch;
-            transform = Transforms.Transforms.eastNorthUpToFixedFrame(center, ellipsoid, transform);
-            west = BoundingSphere.Matrix4.multiplyByPointAsVector(transform, negativeX, west);
-            west = Cartographic.Cartesian3.normalize(west, west);
-            var angle = computeRotationAngle(west, left, center, ellipsoid);
-            rotationZ = BoundingSphere.Matrix3.fromRotationZ(angle, rotationZ);
-
-            heightCartesian.z = height;
-            transform = BoundingSphere.Matrix4.multiplyTransformation(transform, BoundingSphere.Matrix4.fromRotationTranslation(rotationZ, heightCartesian, translation), transform);
-            var scale = scaleMatrix;
-            scale[0] = xScalar;
-
-            for (var j = 0; j < repeat; j++) {
-                for (var i = 0; i < shape.length; i += 3) {
-                    finalPosition = Cartographic.Cartesian3.fromArray(shape, i, finalPosition);
-                    finalPosition = BoundingSphere.Matrix3.multiplyByVector(scale, finalPosition, finalPosition);
-                    finalPosition = BoundingSphere.Matrix4.multiplyByPoint(transform, finalPosition, finalPosition);
-                    finalPosition = BoundingSphere.Matrix4.multiplyByPoint(enuInverse, finalPosition, finalPosition);
-                    finalPositions.push(finalPosition.x, finalPosition.y, finalPosition.z);
-                }
-            }
-
-            return finalPositions;
-        }
-
-        var centerScratch = new Cartographic.Cartesian3();
-        function addPositions(centers, left, shape, finalPositions, ellipsoid, heights, xScalar) {
-            for (var i = 0; i < centers.length; i += 3) {
-                var center = Cartographic.Cartesian3.fromArray(centers, i, centerScratch);
-                finalPositions = addPosition(center, left, shape, finalPositions, ellipsoid, heights[i / 3], xScalar, 1);
-            }
-            return finalPositions;
-        }
-
-        function addLocalPositions(centers, left, shape, finalPositions, ellipsoid, heights, xScalar, enuInverse) {
-            for (var i = 0; i < centers.length; i += 3) {
-                var center = Cartographic.Cartesian3.fromArray(centers, i, centerScratch);
-                finalPositions = addPositionLocal(center, left, shape, finalPositions, ellipsoid, heights[i / 3], xScalar, 1, enuInverse);
-            }
-            return finalPositions;
-        }
-
-        function convertShapeTo3DDuplicate(shape2D, boundingRectangle) { //orientate 2D shape to XZ plane center at (0, 0, 0), duplicate points
-            var length = shape2D.length;
-            var shape = new Array(length * 6);
-            var index = 0;
-            var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
-            var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
-
-            var point = shape2D[0];
-            shape[index++] = point.x - xOffset;
-            shape[index++] = 0.0;
-            shape[index++] = point.y - yOffset;
-            for (var i = 1; i < length; i++) {
-                point = shape2D[i];
-                var x = point.x - xOffset;
-                var z = point.y - yOffset;
-                shape[index++] = x;
-                shape[index++] = 0.0;
-                shape[index++] = z;
-
-                shape[index++] = x;
-                shape[index++] = 0.0;
-                shape[index++] = z;
-            }
-            point = shape2D[0];
-            shape[index++] = point.x - xOffset;
-            shape[index++] = 0.0;
-            shape[index++] = point.y - yOffset;
-
-            return shape;
-        }
-
-        function convertShapeTo3D(shape2D, boundingRectangle) { //orientate 2D shape to XZ plane center at (0, 0, 0)
-            var length = shape2D.length;
-            var shape = new Array(length * 3);
-            var index = 0;
-            var xOffset = boundingRectangle.x + boundingRectangle.width / 2;
-            var yOffset = boundingRectangle.y + boundingRectangle.height / 2;
-
-            for (var i = 0; i < length; i++) {
-                shape[index++] = shape2D[i].x - xOffset;
-                shape[index++] = 0;
-                shape[index++] = shape2D[i].y - yOffset;
-            }
-
-            return shape;
-        }
-
-        var quaterion = new Transforms.Quaternion();
-        var startPointScratch = new Cartographic.Cartesian3();
-        var rotMatrix = new BoundingSphere.Matrix3();
-        function computeRoundCorner(pivot, startPoint, endPoint, cornerType, leftIsOutside, ellipsoid, finalPositions, shape, height, duplicatePoints) {
-            var angle = Cartographic.Cartesian3.angleBetween(Cartographic.Cartesian3.subtract(startPoint, pivot, scratch1), Cartographic.Cartesian3.subtract(endPoint, pivot, scratch2));
-            var granularity = (cornerType === CornerType$1.BEVELED) ? 0 : Math.ceil(angle / _Math.CesiumMath.toRadians(5));
-
-            var m;
-            if (leftIsOutside) {
-                m = BoundingSphere.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(Cartographic.Cartesian3.negate(pivot, scratch1), angle / (granularity + 1), quaterion), rotMatrix);
-            } else {
-                m = BoundingSphere.Matrix3.fromQuaternion(Transforms.Quaternion.fromAxisAngle(pivot, angle / (granularity + 1), quaterion), rotMatrix);
-            }
-
-            var left;
-            var surfacePoint;
-            startPoint = Cartographic.Cartesian3.clone(startPoint, startPointScratch);
-            if (granularity > 0) {
-                var repeat = duplicatePoints ? 2 : 1;
-                for (var i = 0; i < granularity; i++) {
-                    startPoint = BoundingSphere.Matrix3.multiplyByVector(m, startPoint, startPoint);
-                    left = Cartographic.Cartesian3.subtract(startPoint, pivot, scratch1);
-                    left = Cartographic.Cartesian3.normalize(left, left);
-                    if (!leftIsOutside) {
-                        left = Cartographic.Cartesian3.negate(left, left);
-                    }
-                    surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
-                    finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, repeat);
-                }
-            } else {
-                left = Cartographic.Cartesian3.subtract(startPoint, pivot, scratch1);
-                left = Cartographic.Cartesian3.normalize(left, left);
-                if (!leftIsOutside) {
-                    left = Cartographic.Cartesian3.negate(left, left);
-                }
-                surfacePoint = ellipsoid.scaleToGeodeticSurface(startPoint, scratch2);
-                finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, 1);
-
-                endPoint = Cartographic.Cartesian3.clone(endPoint, startPointScratch);
-                left = Cartographic.Cartesian3.subtract(endPoint, pivot, scratch1);
-                left = Cartographic.Cartesian3.normalize(left, left);
-                if (!leftIsOutside) {
-                    left = Cartographic.Cartesian3.negate(left, left);
-                }
-                surfacePoint = ellipsoid.scaleToGeodeticSurface(endPoint, scratch2);
-                finalPositions = addPosition(surfacePoint, left, shape, finalPositions, ellipsoid, height, 1, 1);
-            }
-
-            return finalPositions;
-        }
-
-        PolylineVolumeGeometryLibrary.removeDuplicatesFromShape = function(shapePositions) {
-            var length = shapePositions.length;
-            var cleanedPositions = [];
-            for (var i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) {
-                var v0 = shapePositions[i0];
-                var v1 = shapePositions[i1];
-
-                if (!Cartesian2.Cartesian2.equals(v0, v1)) {
-                    cleanedPositions.push(v1); // Shallow copy!
-                }
-            }
-
-            return cleanedPositions;
-        };
-
-        PolylineVolumeGeometryLibrary.angleIsGreaterThanPi = function(forward, backward, position, ellipsoid) {
-            var tangentPlane = new EllipsoidTangentPlane.EllipsoidTangentPlane(position, ellipsoid);
-            var next = tangentPlane.projectPointOntoPlane(Cartographic.Cartesian3.add(position, forward, nextScratch), nextScratch);
-            var prev = tangentPlane.projectPointOntoPlane(Cartographic.Cartesian3.add(position, backward, prevScratch), prevScratch);
-
-            return ((prev.x * next.y) - (prev.y * next.x)) >= 0.0;
-        };
-
-        var scratchForwardProjection = new Cartographic.Cartesian3();
-        var scratchBackwardProjection = new Cartographic.Cartesian3();
-
-        PolylineVolumeGeometryLibrary.computePositions = function(positions, shape2D, boundingRectangle, geometry, duplicatePoints) {
-            var ellipsoid = geometry._ellipsoid;
-            var heights = scaleToSurface(positions, ellipsoid);
-            var granularity = geometry._granularity;
-            var cornerType = geometry._cornerType;
-            var shapeForSides = duplicatePoints ? convertShapeTo3DDuplicate(shape2D, boundingRectangle) : convertShapeTo3D(shape2D, boundingRectangle);
-            var shapeForEnds = duplicatePoints ? convertShapeTo3D(shape2D, boundingRectangle) : undefined;
-            var heightOffset = boundingRectangle.height / 2;
-            var width = boundingRectangle.width / 2;
-            var length = positions.length;
-            var finalPositions = [];
-            var ends = duplicatePoints ? [] : undefined;
-
-            var forward = scratchCartesian1;
-            var backward = scratchCartesian2;
-            var cornerDirection = scratchCartesian3;
-            var surfaceNormal = scratchCartesian4;
-            var pivot = scratchCartesian5;
-            var start = scratchCartesian6;
-            var end = scratchCartesian7;
-            var left = scratchCartesian8;
-            var previousPosition = scratchCartesian9;
-
-            var position = positions[0];
-            var nextPosition = positions[1];
-            surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
-            forward = Cartographic.Cartesian3.subtract(nextPosition, position, forward);
-            forward = Cartographic.Cartesian3.normalize(forward, forward);
-            left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
-            left = Cartographic.Cartesian3.normalize(left, left);
-            var h0 = heights[0];
-            var h1 = heights[1];
-            if (duplicatePoints) {
-                ends = addPosition(position, left, shapeForEnds, ends, ellipsoid, h0 + heightOffset, 1, 1);
-            }
-            previousPosition = Cartographic.Cartesian3.clone(position, previousPosition);
-            position = nextPosition;
-            backward = Cartographic.Cartesian3.negate(forward, backward);
-            var subdividedHeights;
-            var subdividedPositions;
-            for (var i = 1; i < length - 1; i++) {
-                var repeat = duplicatePoints ? 2 : 1;
-                nextPosition = positions[i + 1];
-                forward = Cartographic.Cartesian3.subtract(nextPosition, position, forward);
-                forward = Cartographic.Cartesian3.normalize(forward, forward);
-                cornerDirection = Cartographic.Cartesian3.add(forward, backward, cornerDirection);
-                cornerDirection = Cartographic.Cartesian3.normalize(cornerDirection, cornerDirection);
-                surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
-
-                var forwardProjection = Cartographic.Cartesian3.multiplyByScalar(surfaceNormal, Cartographic.Cartesian3.dot(forward, surfaceNormal), scratchForwardProjection);
-                Cartographic.Cartesian3.subtract(forward, forwardProjection, forwardProjection);
-                Cartographic.Cartesian3.normalize(forwardProjection, forwardProjection);
-
-                var backwardProjection = Cartographic.Cartesian3.multiplyByScalar(surfaceNormal, Cartographic.Cartesian3.dot(backward, surfaceNormal), scratchBackwardProjection);
-                Cartographic.Cartesian3.subtract(backward, backwardProjection, backwardProjection);
-                Cartographic.Cartesian3.normalize(backwardProjection, backwardProjection);
-
-                var doCorner = !_Math.CesiumMath.equalsEpsilon(Math.abs(Cartographic.Cartesian3.dot(forwardProjection, backwardProjection)), 1.0, _Math.CesiumMath.EPSILON7);
-
-                if (doCorner) {
-                    cornerDirection = Cartographic.Cartesian3.cross(cornerDirection, surfaceNormal, cornerDirection);
-                    cornerDirection = Cartographic.Cartesian3.cross(surfaceNormal, cornerDirection, cornerDirection);
-                    cornerDirection = Cartographic.Cartesian3.normalize(cornerDirection, cornerDirection);
-                    var scalar = 1 / Math.max(0.25, (Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.cross(cornerDirection, backward, scratch1))));
-                    var leftIsOutside = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(forward, backward, position, ellipsoid);
-                    if (leftIsOutside) {
-                        pivot = Cartographic.Cartesian3.add(position, Cartographic.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
-                        start = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, width, start), start);
-                        scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
-                        scratch2Array[1] = Cartographic.Cartesian3.clone(start, scratch2Array[1]);
-                        subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
-                        subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
-                            positions: scratch2Array,
-                            granularity: granularity,
-                            ellipsoid: ellipsoid
-                        });
-                        finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
-                        left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
-                        left = Cartographic.Cartesian3.normalize(left, left);
-                        end = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, width, end), end);
-                        if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
-                            computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
-                        } else {
-                            cornerDirection = Cartographic.Cartesian3.negate(cornerDirection, cornerDirection);
-                            finalPositions = addPosition(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat);
-                        }
-                        previousPosition = Cartographic.Cartesian3.clone(end, previousPosition);
-                    } else {
-                        pivot = Cartographic.Cartesian3.add(position, Cartographic.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
-                        start = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, -width, start), start);
-                        scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
-                        scratch2Array[1] = Cartographic.Cartesian3.clone(start, scratch2Array[1]);
-                        subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
-                        subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
-                            positions: scratch2Array,
-                            granularity: granularity,
-                            ellipsoid: ellipsoid
-                        });
-                        finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
-                        left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
-                        left = Cartographic.Cartesian3.normalize(left, left);
-                        end = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, -width, end), end);
-                        if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
-                            computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
-                        } else {
-                            finalPositions = addPosition(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat);
-                        }
-                        previousPosition = Cartographic.Cartesian3.clone(end, previousPosition);
-                    }
-                    backward = Cartographic.Cartesian3.negate(forward, backward);
-                } else {
-                    finalPositions = addPosition(previousPosition, left, shapeForSides, finalPositions, ellipsoid, h0 + heightOffset, 1, 1);
-                    previousPosition = position;
-                }
-                h0 = h1;
-                h1 = heights[i + 1];
-                position = nextPosition;
-            }
-
-            scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
-            scratch2Array[1] = Cartographic.Cartesian3.clone(position, scratch2Array[1]);
-            subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
-            subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
-                positions: scratch2Array,
-                granularity: granularity,
-                ellipsoid: ellipsoid
-            });
-            finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
-            if (duplicatePoints) {
-                ends = addPosition(position, left, shapeForEnds, ends, ellipsoid, h1 + heightOffset, 1, 1);
-            }
-
-            length = finalPositions.length;
-            var posLength = duplicatePoints ? length + ends.length : length;
-            var combinedPositions = new Float64Array(posLength);
-            combinedPositions.set(finalPositions);
-            if (duplicatePoints) {
-                combinedPositions.set(ends, length);
-            }
-
-            return combinedPositions;
-        };
-
-        PolylineVolumeGeometryLibrary.computeLocalPositions = function(positions, shape2D, boundingRectangle, geometry, duplicatePoints, enuCenter) {
-            var ellipsoid = geometry._ellipsoid;
-            var heights = scaleToSurface(positions, ellipsoid);
-            var granularity = geometry._granularity;
-            var cornerType = geometry._cornerType;
-            var shapeForSides = duplicatePoints ? convertShapeTo3DDuplicate(shape2D, boundingRectangle) : convertShapeTo3D(shape2D, boundingRectangle);
-            var shapeForEnds = duplicatePoints ? convertShapeTo3D(shape2D, boundingRectangle) : undefined;
-            var heightOffset = 0; //保证放样模型处于放样点的中心点
-            var width = boundingRectangle.width / 2;
-            var length = positions.length;
-            var finalPositions = [];
-            var ends = duplicatePoints ? [] : undefined;
-
-            var forward = scratchCartesian1;
-            var backward = scratchCartesian2;
-            var cornerDirection = scratchCartesian3;
-            var surfaceNormal = scratchCartesian4;
-            var pivot = scratchCartesian5;
-            var start = scratchCartesian6;
-            var end = scratchCartesian7;
-            var left = scratchCartesian8;
-            var previousPosition = scratchCartesian9;
-
-            var enu = Transforms.Transforms.eastNorthUpToFixedFrame(enuCenter, ellipsoid, new BoundingSphere.Matrix4());
-            var enuInverse = BoundingSphere.Matrix4.inverse(enu, new BoundingSphere.Matrix4());
-            var position = positions[0];
-            var nextPosition = positions[1];
-            surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
-            forward = Cartographic.Cartesian3.subtract(nextPosition, position, forward);
-            forward = Cartographic.Cartesian3.normalize(forward, forward);
-            left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
-            left = Cartographic.Cartesian3.normalize(left, left);
-            var h0 = heights[0];
-            var h1 = heights[1];
-            if (duplicatePoints) {
-                ends = addPositionLocal(position, left, shapeForEnds, ends, ellipsoid, h0 + heightOffset, 1, 1, enuInverse);
-            }
-            previousPosition = Cartographic.Cartesian3.clone(position, previousPosition);
-            position = nextPosition;
-            backward = Cartographic.Cartesian3.negate(forward, backward);
-            var subdividedHeights;
-            var subdividedPositions;
-            for (var i = 1; i < length - 1; i++) {
-                var repeat = duplicatePoints ? 2 : 1;
-                nextPosition = positions[i + 1];
-                forward = Cartographic.Cartesian3.subtract(nextPosition, position, forward);
-                forward = Cartographic.Cartesian3.normalize(forward, forward);
-                cornerDirection = Cartographic.Cartesian3.add(forward, backward, cornerDirection);
-                cornerDirection = Cartographic.Cartesian3.normalize(cornerDirection, cornerDirection);
-                surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, surfaceNormal);
-
-                var forwardProjection = Cartographic.Cartesian3.multiplyByScalar(surfaceNormal, Cartographic.Cartesian3.dot(forward, surfaceNormal), scratchForwardProjection);
-                Cartographic.Cartesian3.subtract(forward, forwardProjection, forwardProjection);
-                Cartographic.Cartesian3.normalize(forwardProjection, forwardProjection);
-
-                var backwardProjection = Cartographic.Cartesian3.multiplyByScalar(surfaceNormal, Cartographic.Cartesian3.dot(backward, surfaceNormal), scratchBackwardProjection);
-                Cartographic.Cartesian3.subtract(backward, backwardProjection, backwardProjection);
-                Cartographic.Cartesian3.normalize(backwardProjection, backwardProjection);
-
-                var doCorner = !_Math.CesiumMath.equalsEpsilon(Math.abs(Cartographic.Cartesian3.dot(forwardProjection, backwardProjection)), 1.0, _Math.CesiumMath.EPSILON7);
-
-                if (doCorner) {
-                    cornerDirection = Cartographic.Cartesian3.cross(cornerDirection, surfaceNormal, cornerDirection);
-                    cornerDirection = Cartographic.Cartesian3.cross(surfaceNormal, cornerDirection, cornerDirection);
-                    cornerDirection = Cartographic.Cartesian3.normalize(cornerDirection, cornerDirection);
-                    var scalar = 1 / Math.max(0.25, (Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.cross(cornerDirection, backward, scratch1))));
-                    var leftIsOutside = PolylineVolumeGeometryLibrary.angleIsGreaterThanPi(forward, backward, position, ellipsoid);
-                    if (leftIsOutside) {
-                        pivot = Cartographic.Cartesian3.add(position, Cartographic.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
-                        start = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, width, start), start);
-                        scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
-                        scratch2Array[1] = Cartographic.Cartesian3.clone(start, scratch2Array[1]);
-                        subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
-                        subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
-                            positions: scratch2Array,
-                            granularity: granularity,
-                            ellipsoid: ellipsoid
-                        });
-                        finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1, fromEnu);
-                        left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
-                        left = Cartographic.Cartesian3.normalize(left, left);
-                        end = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, width, end), end);
-                        if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
-                            computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
-                        } else {
-                            cornerDirection = Cartographic.Cartesian3.negate(cornerDirection, cornerDirection);
-                            finalPositions = addPositionLocal(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat, enuInverse);
-                        }
-                        previousPosition = Cartographic.Cartesian3.clone(end, previousPosition);
-                    } else {
-                        pivot = Cartographic.Cartesian3.add(position, Cartographic.Cartesian3.multiplyByScalar(cornerDirection, scalar * width, cornerDirection), pivot);
-                        start = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, -width, start), start);
-                        scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
-                        scratch2Array[1] = Cartographic.Cartesian3.clone(start, scratch2Array[1]);
-                        subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
-                        subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
-                            positions: scratch2Array,
-                            granularity: granularity,
-                            ellipsoid: ellipsoid
-                        });
-                        finalPositions = addPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1);
-                        left = Cartographic.Cartesian3.cross(surfaceNormal, forward, left);
-                        left = Cartographic.Cartesian3.normalize(left, left);
-                        end = Cartographic.Cartesian3.add(pivot, Cartographic.Cartesian3.multiplyByScalar(left, -width, end), end);
-                        if (cornerType === CornerType$1.ROUNDED || cornerType === CornerType$1.BEVELED) {
-                            computeRoundCorner(pivot, start, end, cornerType, leftIsOutside, ellipsoid, finalPositions, shapeForSides, h1 + heightOffset, duplicatePoints);
-                        } else {
-                            finalPositions = addPositionLocal(position, cornerDirection, shapeForSides, finalPositions, ellipsoid, h1 + heightOffset, scalar, repeat, enuInverse);
-                        }
-                        previousPosition = Cartographic.Cartesian3.clone(end, previousPosition);
-                    }
-                    backward = Cartographic.Cartesian3.negate(forward, backward);
-                } else {
-                    finalPositions = addPositionLocal(previousPosition, left, shapeForSides, finalPositions, ellipsoid, h0 + heightOffset, 1, 1, enuInverse);
-                    previousPosition = position;
-                }
-                h0 = h1;
-                h1 = heights[i + 1];
-                position = nextPosition;
-            }
-
-            scratch2Array[0] = Cartographic.Cartesian3.clone(previousPosition, scratch2Array[0]);
-            scratch2Array[1] = Cartographic.Cartesian3.clone(position, scratch2Array[1]);
-            subdividedHeights = subdivideHeights(scratch2Array, h0 + heightOffset, h1 + heightOffset, granularity);
-            subdividedPositions = PolylinePipeline.PolylinePipeline.generateArc({
-                positions: scratch2Array,
-                granularity: granularity,
-                ellipsoid: ellipsoid
-            });
-            finalPositions = addLocalPositions(subdividedPositions, left, shapeForSides, finalPositions, ellipsoid, subdividedHeights, 1, enuInverse);
-            if (duplicatePoints) {
-                ends = addPositionLocal(position, left, shapeForEnds, ends, ellipsoid, h1 + heightOffset, 1, 1, enuInverse);
-            }
-
-            length = finalPositions.length;
-            var posLength = duplicatePoints ? length + ends.length : length;
-            var combinedPositions = new Float64Array(posLength);
-            combinedPositions.set(finalPositions);
-            if (duplicatePoints) {
-                combinedPositions.set(ends, length);
-            }
-
-            return combinedPositions;
-        };
-
-    exports.CornerType = CornerType$1;
-    exports.PolylineVolumeGeometryLibrary = PolylineVolumeGeometryLibrary;
-
-});
diff --git a/public/libs/Cesium/Workers/PrimitivePipeline-c9b56b34.js b/public/libs/Cesium/Workers/PrimitivePipeline-c9b56b34.js
deleted file mode 100644
index 0e9032b..0000000
--- a/public/libs/Cesium/Workers/PrimitivePipeline-c9b56b34.js
+++ /dev/null
@@ -1,850 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Cartesian2-85064f09', './BoundingSphere-775c5788', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './GeometryAttributes-aacecde6', './GeometryPipeline-245a05d7', './IndexDatatype-9435b55f', './WebMercatorProjection-80c70558'], function (exports, when, Check, Cartesian2, BoundingSphere, ComponentDatatype, GeometryAttribute, GeometryAttributes, GeometryPipeline, IndexDatatype, WebMercatorProjection) { 'use strict';
-
-    /**
-         * Value and type information for per-instance geometry attribute that determines the geometry instance offset
-         *
-         * @alias OffsetGeometryInstanceAttribute
-         * @constructor
-         *
-         * @param {Number} [x=0] The x translation
-         * @param {Number} [y=0] The y translation
-         * @param {Number} [z=0] The z translation
-         *
-         * @private
-         *
-         * @see GeometryInstance
-         * @see GeometryInstanceAttribute
-         */
-        function OffsetGeometryInstanceAttribute(x, y, z) {
-            x = when.defaultValue(x, 0);
-            y = when.defaultValue(y, 0);
-            z = when.defaultValue(z, 0);
-
-            /**
-             * The values for the attributes stored in a typed array.
-             *
-             * @type Float32Array
-             */
-            this.value = new Float32Array([x, y, z]);
-        }
-
-        Object.defineProperties(OffsetGeometryInstanceAttribute.prototype, {
-            /**
-             * The datatype of each component in the attribute, e.g., individual elements in
-             * {@link OffsetGeometryInstanceAttribute#value}.
-             *
-             * @memberof OffsetGeometryInstanceAttribute.prototype
-             *
-             * @type {ComponentDatatype}
-             * @readonly
-             *
-             * @default {@link ComponentDatatype.FLOAT}
-             */
-            componentDatatype : {
-                get : function() {
-                    return ComponentDatatype.ComponentDatatype.FLOAT;
-                }
-            },
-
-            /**
-             * The number of components in the attributes, i.e., {@link OffsetGeometryInstanceAttribute#value}.
-             *
-             * @memberof OffsetGeometryInstanceAttribute.prototype
-             *
-             * @type {Number}
-             * @readonly
-             *
-             * @default 3
-             */
-            componentsPerAttribute : {
-                get : function() {
-                    return 3;
-                }
-            },
-
-            /**
-             * When <code>true</code> and <code>componentDatatype</code> is an integer format,
-             * indicate that the components should be mapped to the range [0, 1] (unsigned)
-             * or [-1, 1] (signed) when they are accessed as floating-point for rendering.
-             *
-             * @memberof OffsetGeometryInstanceAttribute.prototype
-             *
-             * @type {Boolean}
-             * @readonly
-             *
-             * @default false
-             */
-            normalize : {
-                get : function() {
-                    return false;
-                }
-            }
-        });
-
-        /**
-         * Creates a new {@link OffsetGeometryInstanceAttribute} instance given the provided an enabled flag and {@link DistanceDisplayCondition}.
-         *
-         * @param {Cartesian3} offset The cartesian offset
-         * @returns {OffsetGeometryInstanceAttribute} The new {@link OffsetGeometryInstanceAttribute} instance.
-         */
-        OffsetGeometryInstanceAttribute.fromCartesian3 = function(offset) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('offset', offset);
-            //>>includeEnd('debug');
-
-            return new OffsetGeometryInstanceAttribute(offset.x, offset.y, offset.z);
-        };
-
-        /**
-         * Converts a distance display condition to a typed array that can be used to assign a distance display condition attribute.
-         *
-         * @param {Cartesian3} offset The cartesian offset
-         * @param {Float32Array} [result] The array to store the result in, if undefined a new instance will be created.
-         * @returns {Float32Array} The modified result parameter or a new instance if result was undefined.
-         *
-         * @example
-         * var attributes = primitive.getGeometryInstanceAttributes('an id');
-         * attributes.modelMatrix = Cesium.OffsetGeometryInstanceAttribute.toValue(modelMatrix, attributes.modelMatrix);
-         */
-        OffsetGeometryInstanceAttribute.toValue = function(offset, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('offset', offset);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Float32Array([offset.x, offset.y, offset.z]);
-            }
-
-            result[0] = offset.x;
-            result[1] = offset.y;
-            result[2] = offset.z;
-            return result;
-        };
-
-    function transformToWorldCoordinates(instances, primitiveModelMatrix, scene3DOnly) {
-        var toWorld = !scene3DOnly;
-        var length = instances.length;
-        var i;
-
-        if (!toWorld && (length > 1)) {
-            var modelMatrix = instances[0].modelMatrix;
-
-            for (i = 1; i < length; ++i) {
-                if (!BoundingSphere.Matrix4.equals(modelMatrix, instances[i].modelMatrix)) {
-                    toWorld = true;
-                    break;
-                }
-            }
-        }
-
-        if (toWorld) {
-            for (i = 0; i < length; ++i) {
-                if (when.defined(instances[i].geometry)) {
-                    GeometryPipeline.GeometryPipeline.transformToWorldCoordinates(instances[i]);
-                }
-            }
-        } else {
-            // Leave geometry in local coordinate system; auto update model-matrix.
-            BoundingSphere.Matrix4.multiplyTransformation(primitiveModelMatrix, instances[0].modelMatrix, primitiveModelMatrix);
-        }
-    }
-
-    function addGeometryBatchId(geometry, batchId) {
-        var attributes = geometry.attributes;
-        var positionAttr = attributes.position;
-        var numberOfComponents = positionAttr.values.length / positionAttr.componentsPerAttribute;
-
-        attributes.batchId = new GeometryAttribute.GeometryAttribute({
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            componentsPerAttribute : 1,
-            values : new Float32Array(numberOfComponents)
-        });
-
-        var values = attributes.batchId.values;
-        for (var j = 0; j < numberOfComponents; ++j) {
-            values[j] = batchId;
-        }
-    }
-
-    function addBatchIds(instances) {
-        var length = instances.length;
-
-        for (var i = 0; i < length; ++i) {
-            var instance = instances[i];
-            if (when.defined(instance.geometry)) {
-                addGeometryBatchId(instance.geometry, i);
-            } else if (when.defined(instance.westHemisphereGeometry) && when.defined(instance.eastHemisphereGeometry)) {
-                addGeometryBatchId(instance.westHemisphereGeometry, i);
-                addGeometryBatchId(instance.eastHemisphereGeometry, i);
-            }
-        }
-    }
-
-    function geometryPipeline(parameters) {
-        var instances = parameters.instances;
-        var projection = parameters.projection;
-        var uintIndexSupport = parameters.elementIndexUintSupported;
-        var scene3DOnly = parameters.scene3DOnly;
-        var vertexCacheOptimize = parameters.vertexCacheOptimize;
-        var compressVertices = parameters.compressVertices;
-        var modelMatrix = parameters.modelMatrix;
-
-        var i;
-        var geometry;
-        var primitiveType;
-        var length = instances.length;
-
-        for (i = 0; i < length; ++i) {
-            if (when.defined(instances[i].geometry)) {
-                primitiveType = instances[i].geometry.primitiveType;
-                break;
-            }
-        }
-
-        //>>includeStart('debug', pragmas.debug);
-        for (i = 1; i < length; ++i) {
-            if (when.defined(instances[i].geometry) && instances[i].geometry.primitiveType !== primitiveType) {
-                throw new Check.DeveloperError('All instance geometries must have the same primitiveType.');
-            }
-        }
-        //>>includeEnd('debug');
-
-        // Unify to world coordinates before combining.
-        transformToWorldCoordinates(instances, modelMatrix, scene3DOnly);
-
-        // Clip to IDL
-        if (!scene3DOnly) {
-            for (i = 0; i < length; ++i) {
-                if (when.defined(instances[i].geometry)) {
-                    GeometryPipeline.GeometryPipeline.splitLongitude(instances[i]);
-                }
-            }
-        }
-
-        addBatchIds(instances);
-
-        // Optimize for vertex shader caches
-        if (vertexCacheOptimize) {
-            for (i = 0; i < length; ++i) {
-                var instance = instances[i];
-                if (when.defined(instance.geometry)) {
-                    GeometryPipeline.GeometryPipeline.reorderForPostVertexCache(instance.geometry);
-                    GeometryPipeline.GeometryPipeline.reorderForPreVertexCache(instance.geometry);
-                } else if (when.defined(instance.westHemisphereGeometry) && when.defined(instance.eastHemisphereGeometry)) {
-                    GeometryPipeline.GeometryPipeline.reorderForPostVertexCache(instance.westHemisphereGeometry);
-                    GeometryPipeline.GeometryPipeline.reorderForPreVertexCache(instance.westHemisphereGeometry);
-
-                    GeometryPipeline.GeometryPipeline.reorderForPostVertexCache(instance.eastHemisphereGeometry);
-                    GeometryPipeline.GeometryPipeline.reorderForPreVertexCache(instance.eastHemisphereGeometry);
-                }
-            }
-        }
-
-        // Combine into single geometry for better rendering performance.
-        var geometries = GeometryPipeline.GeometryPipeline.combineInstances(instances);
-
-        length = geometries.length;
-        for (i = 0; i < length; ++i) {
-            geometry = geometries[i];
-
-            // Split positions for GPU RTE
-            var attributes = geometry.attributes;
-            var name;
-            if (!scene3DOnly) {
-                for (name in attributes) {
-                    if (attributes.hasOwnProperty(name) && attributes[name].componentDatatype === ComponentDatatype.ComponentDatatype.DOUBLE) {
-                        var name3D = name + '3D';
-                        var name2D = name + '2D';
-
-                        // Compute 2D positions
-                        GeometryPipeline.GeometryPipeline.projectTo2D(geometry, name, name3D, name2D, projection);
-                        if (when.defined(geometry.boundingSphere) && name === 'position') {
-                            geometry.boundingSphereCV = BoundingSphere.BoundingSphere.fromVertices(geometry.attributes.position2D.values);
-                        }
-
-                        GeometryPipeline.GeometryPipeline.encodeAttribute(geometry, name3D, name3D + 'High', name3D + 'Low');
-                        GeometryPipeline.GeometryPipeline.encodeAttribute(geometry, name2D, name2D + 'High', name2D + 'Low');
-                    }
-                }
-            } else {
-                for (name in attributes) {
-                    if (attributes.hasOwnProperty(name) && attributes[name].componentDatatype === ComponentDatatype.ComponentDatatype.DOUBLE) {
-                        GeometryPipeline.GeometryPipeline.encodeAttribute(geometry, name, name + '3DHigh', name + '3DLow');
-                    }
-                }
-            }
-
-            // oct encode and pack normals, compress texture coordinates
-            if (compressVertices) {
-                GeometryPipeline.GeometryPipeline.compressVertices(geometry);
-            }
-        }
-
-        if (!uintIndexSupport) {
-            // Break into multiple geometries to fit within unsigned short indices if needed
-            var splitGeometries = [];
-            length = geometries.length;
-            for (i = 0; i < length; ++i) {
-                geometry = geometries[i];
-                splitGeometries = splitGeometries.concat(GeometryPipeline.GeometryPipeline.fitToUnsignedShortIndices(geometry));
-            }
-
-            geometries = splitGeometries;
-        }
-
-        return geometries;
-    }
-
-    function createPickOffsets(instances, geometryName, geometries, pickOffsets) {
-        var offset;
-        var indexCount;
-        var geometryIndex;
-
-        var offsetIndex = pickOffsets.length - 1;
-        if (offsetIndex >= 0) {
-            var pickOffset = pickOffsets[offsetIndex];
-            offset = pickOffset.offset + pickOffset.count;
-            geometryIndex = pickOffset.index;
-            indexCount = geometries[geometryIndex].indices.length;
-        } else {
-            offset = 0;
-            geometryIndex = 0;
-            indexCount = geometries[geometryIndex].indices.length;
-        }
-
-        var length = instances.length;
-        for (var i = 0; i < length; ++i) {
-            var instance = instances[i];
-            var geometry = instance[geometryName];
-            if (!when.defined(geometry)) {
-                continue;
-            }
-
-            var count = geometry.indices.length;
-
-            if (offset + count > indexCount) {
-                offset = 0;
-                indexCount = geometries[++geometryIndex].indices.length;
-            }
-
-            pickOffsets.push({
-                index : geometryIndex,
-                offset : offset,
-                count : count
-            });
-            offset += count;
-        }
-    }
-
-    function createInstancePickOffsets(instances, geometries) {
-        var pickOffsets = [];
-        createPickOffsets(instances, 'geometry', geometries, pickOffsets);
-        createPickOffsets(instances, 'westHemisphereGeometry', geometries, pickOffsets);
-        createPickOffsets(instances, 'eastHemisphereGeometry', geometries, pickOffsets);
-        return pickOffsets;
-    }
-
-    /**
-     * @private
-     */
-    var PrimitivePipeline = {};
-
-    /**
-     * @private
-     */
-    PrimitivePipeline.combineGeometry = function(parameters) {
-        var geometries;
-        var attributeLocations;
-        var instances = parameters.instances;
-        var length = instances.length;
-        var pickOffsets;
-
-        var offsetInstanceExtend;
-        var hasOffset = false;
-        if (length > 0) {
-            geometries = geometryPipeline(parameters);
-            if (geometries.length > 0) {
-                attributeLocations = GeometryPipeline.GeometryPipeline.createAttributeLocations(geometries[0]);
-                if (parameters.createPickOffsets) {
-                    pickOffsets = createInstancePickOffsets(instances, geometries);
-                }
-            }
-            if (when.defined(instances[0].attributes) && when.defined(instances[0].attributes.offset)) {
-                offsetInstanceExtend = new Array(length);
-                hasOffset = true;
-            }
-        }
-
-        var boundingSpheres = new Array(length);
-        var boundingSpheresCV = new Array(length);
-        for (var i = 0; i < length; ++i) {
-            var instance = instances[i];
-            var geometry = instance.geometry;
-            if (when.defined(geometry)) {
-                boundingSpheres[i] = geometry.boundingSphere;
-                boundingSpheresCV[i] = geometry.boundingSphereCV;
-                if (hasOffset) {
-                    offsetInstanceExtend[i] = instance.geometry.offsetAttribute;
-                }
-            }
-
-            var eastHemisphereGeometry = instance.eastHemisphereGeometry;
-            var westHemisphereGeometry = instance.westHemisphereGeometry;
-            if (when.defined(eastHemisphereGeometry) && when.defined(westHemisphereGeometry)) {
-                if (when.defined(eastHemisphereGeometry.boundingSphere) && when.defined(westHemisphereGeometry.boundingSphere)) {
-                    boundingSpheres[i] = BoundingSphere.BoundingSphere.union(eastHemisphereGeometry.boundingSphere, westHemisphereGeometry.boundingSphere);
-                }
-                if (when.defined(eastHemisphereGeometry.boundingSphereCV) && when.defined(westHemisphereGeometry.boundingSphereCV)) {
-                    boundingSpheresCV[i] = BoundingSphere.BoundingSphere.union(eastHemisphereGeometry.boundingSphereCV, westHemisphereGeometry.boundingSphereCV);
-                }
-            }
-        }
-
-        return {
-            geometries : geometries,
-            modelMatrix : parameters.modelMatrix,
-            attributeLocations : attributeLocations,
-            pickOffsets : pickOffsets,
-            offsetInstanceExtend : offsetInstanceExtend,
-            boundingSpheres : boundingSpheres,
-            boundingSpheresCV : boundingSpheresCV
-        };
-    };
-
-    function transferGeometry(geometry, transferableObjects) {
-        var attributes = geometry.attributes;
-        for (var name in attributes) {
-            if (attributes.hasOwnProperty(name)) {
-                var attribute = attributes[name];
-
-                if (when.defined(attribute) && when.defined(attribute.values)) {
-                    transferableObjects.push(attribute.values.buffer);
-                }
-            }
-        }
-
-        if (when.defined(geometry.indices)) {
-            transferableObjects.push(geometry.indices.buffer);
-        }
-    }
-
-    function transferGeometries(geometries, transferableObjects) {
-        var length = geometries.length;
-        for (var i = 0; i < length; ++i) {
-            transferGeometry(geometries[i], transferableObjects);
-        }
-    }
-
-    // This function was created by simplifying packCreateGeometryResults into a count-only operation.
-    function countCreateGeometryResults(items) {
-        var count = 1;
-        var length = items.length;
-        for (var i = 0; i < length; i++) {
-            var geometry = items[i];
-            ++count;
-
-            if (!when.defined(geometry)) {
-                continue;
-            }
-
-            var attributes = geometry.attributes;
-
-            count += 7 + 2 * BoundingSphere.BoundingSphere.packedLength + (when.defined(geometry.indices) ? geometry.indices.length : 0);
-
-            for (var property in attributes) {
-                if (attributes.hasOwnProperty(property) && when.defined(attributes[property])) {
-                    var attribute = attributes[property];
-                    count += 5 + attribute.values.length;
-                }
-            }
-        }
-
-        return count;
-    }
-
-    /**
-     * @private
-     */
-    PrimitivePipeline.packCreateGeometryResults = function(items, transferableObjects) {
-        var packedData = new Float64Array(countCreateGeometryResults(items));
-        var stringTable = [];
-        var stringHash = {};
-
-        var length = items.length;
-        var count = 0;
-        packedData[count++] = length;
-        for (var i = 0; i < length; i++) {
-            var geometry = items[i];
-
-            var validGeometry = when.defined(geometry);
-            packedData[count++] = validGeometry ? 1.0 : 0.0;
-
-            if (!validGeometry) {
-                continue;
-            }
-
-            packedData[count++] = geometry.primitiveType;
-            packedData[count++] = geometry.geometryType;
-            packedData[count++] = when.defaultValue(geometry.offsetAttribute, -1);
-
-            var validBoundingSphere = when.defined(geometry.boundingSphere) ? 1.0 : 0.0;
-            packedData[count++] = validBoundingSphere;
-            if (validBoundingSphere) {
-                BoundingSphere.BoundingSphere.pack(geometry.boundingSphere, packedData, count);
-            }
-
-            count += BoundingSphere.BoundingSphere.packedLength;
-
-            var validBoundingSphereCV = when.defined(geometry.boundingSphereCV) ? 1.0 : 0.0;
-            packedData[count++] = validBoundingSphereCV;
-            if (validBoundingSphereCV) {
-                BoundingSphere.BoundingSphere.pack(geometry.boundingSphereCV, packedData, count);
-            }
-
-            count += BoundingSphere.BoundingSphere.packedLength;
-
-            var attributes = geometry.attributes;
-            var attributesToWrite = [];
-            for (var property in attributes) {
-                if (attributes.hasOwnProperty(property) && when.defined(attributes[property])) {
-                    attributesToWrite.push(property);
-                    if (!when.defined(stringHash[property])) {
-                        stringHash[property] = stringTable.length;
-                        stringTable.push(property);
-                    }
-                }
-            }
-
-            packedData[count++] = attributesToWrite.length;
-            for (var q = 0; q < attributesToWrite.length; q++) {
-                var name = attributesToWrite[q];
-                var attribute = attributes[name];
-                packedData[count++] = stringHash[name];
-                packedData[count++] = attribute.componentDatatype;
-                packedData[count++] = attribute.componentsPerAttribute;
-                packedData[count++] = attribute.normalize ? 1 : 0;
-                packedData[count++] = attribute.values.length;
-                packedData.set(attribute.values, count);
-                count += attribute.values.length;
-            }
-
-            var indicesLength = when.defined(geometry.indices) ? geometry.indices.length : 0;
-            packedData[count++] = indicesLength;
-
-            if (indicesLength > 0) {
-                packedData.set(geometry.indices, count);
-                count += indicesLength;
-            }
-        }
-
-        transferableObjects.push(packedData.buffer);
-
-        return {
-            stringTable : stringTable,
-            packedData : packedData
-        };
-    };
-
-    /**
-     * @private
-     */
-    PrimitivePipeline.unpackCreateGeometryResults = function(createGeometryResult) {
-        var stringTable = createGeometryResult.stringTable;
-        var packedGeometry = createGeometryResult.packedData;
-
-        var i;
-        var result = new Array(packedGeometry[0]);
-        var resultIndex = 0;
-
-        var packedGeometryIndex = 1;
-        while (packedGeometryIndex < packedGeometry.length) {
-            var valid = packedGeometry[packedGeometryIndex++] === 1.0;
-            if (!valid) {
-                result[resultIndex++] = undefined;
-                continue;
-            }
-
-            var primitiveType = packedGeometry[packedGeometryIndex++];
-            var geometryType = packedGeometry[packedGeometryIndex++];
-            var offsetAttribute = packedGeometry[packedGeometryIndex++];
-            if (offsetAttribute === -1) {
-                offsetAttribute = undefined;
-            }
-
-            var boundingSphere;
-            var boundingSphereCV;
-
-            var validBoundingSphere = packedGeometry[packedGeometryIndex++] === 1.0;
-            if (validBoundingSphere) {
-                boundingSphere = BoundingSphere.BoundingSphere.unpack(packedGeometry, packedGeometryIndex);
-            }
-
-            packedGeometryIndex += BoundingSphere.BoundingSphere.packedLength;
-
-            var validBoundingSphereCV = packedGeometry[packedGeometryIndex++] === 1.0;
-            if (validBoundingSphereCV) {
-                boundingSphereCV = BoundingSphere.BoundingSphere.unpack(packedGeometry, packedGeometryIndex);
-            }
-
-            packedGeometryIndex += BoundingSphere.BoundingSphere.packedLength;
-
-            var length;
-            var values;
-            var componentsPerAttribute;
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            var numAttributes = packedGeometry[packedGeometryIndex++];
-            for (i = 0; i < numAttributes; i++) {
-                var name = stringTable[packedGeometry[packedGeometryIndex++]];
-                var componentDatatype = packedGeometry[packedGeometryIndex++];
-                componentsPerAttribute = packedGeometry[packedGeometryIndex++];
-                var normalize = packedGeometry[packedGeometryIndex++] !== 0;
-
-                length = packedGeometry[packedGeometryIndex++];
-                values = ComponentDatatype.ComponentDatatype.createTypedArray(componentDatatype, length);
-                for (var valuesIndex = 0; valuesIndex < length; valuesIndex++) {
-                    values[valuesIndex] = packedGeometry[packedGeometryIndex++];
-                }
-
-                attributes[name] = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : componentDatatype,
-                    componentsPerAttribute : componentsPerAttribute,
-                    normalize : normalize,
-                    values : values
-                });
-            }
-
-            var indices;
-            length = packedGeometry[packedGeometryIndex++];
-
-            if (length > 0) {
-                var numberOfVertices = values.length / componentsPerAttribute;
-                indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfVertices, length);
-                for (i = 0; i < length; i++) {
-                    indices[i] = packedGeometry[packedGeometryIndex++];
-                }
-            }
-
-            result[resultIndex++] = new GeometryAttribute.Geometry({
-                primitiveType : primitiveType,
-                geometryType : geometryType,
-                boundingSphere : boundingSphere,
-                boundingSphereCV : boundingSphereCV,
-                indices : indices,
-                attributes : attributes,
-                offsetAttribute: offsetAttribute
-            });
-        }
-
-        return result;
-    };
-
-    function packInstancesForCombine(instances, transferableObjects) {
-        var length = instances.length;
-        var packedData = new Float64Array(1 + (length * 19));
-        var count = 0;
-        packedData[count++] = length;
-        for (var i = 0; i < length; i++) {
-            var instance = instances[i];
-            BoundingSphere.Matrix4.pack(instance.modelMatrix, packedData, count);
-            count += BoundingSphere.Matrix4.packedLength;
-            if (when.defined(instance.attributes) && when.defined(instance.attributes.offset)) {
-                var values = instance.attributes.offset.value;
-                packedData[count] = values[0];
-                packedData[count + 1] = values[1];
-                packedData[count + 2] = values[2];
-            }
-            count += 3;
-        }
-        transferableObjects.push(packedData.buffer);
-
-        return packedData;
-    }
-
-    function unpackInstancesForCombine(data) {
-        var packedInstances = data;
-        var result = new Array(packedInstances[0]);
-        var count = 0;
-
-        var i = 1;
-        while (i < packedInstances.length) {
-            var modelMatrix = BoundingSphere.Matrix4.unpack(packedInstances, i);
-            var attributes;
-            i += BoundingSphere.Matrix4.packedLength;
-            if (when.defined(packedInstances[i])) {
-                attributes = {
-                    offset : new OffsetGeometryInstanceAttribute(packedInstances[i], packedInstances[i + 1], packedInstances[i + 2])
-                };
-            }
-            i += 3;
-
-            result[count++] = {
-                modelMatrix : modelMatrix,
-                attributes : attributes
-            };
-        }
-
-        return result;
-    }
-
-    /**
-     * @private
-     */
-    PrimitivePipeline.packCombineGeometryParameters = function(parameters, transferableObjects) {
-        var createGeometryResults = parameters.createGeometryResults;
-        var length = createGeometryResults.length;
-
-        for (var i = 0; i < length; i++) {
-            transferableObjects.push(createGeometryResults[i].packedData.buffer);
-        }
-
-        return {
-            createGeometryResults : parameters.createGeometryResults,
-            packedInstances : packInstancesForCombine(parameters.instances, transferableObjects),
-            ellipsoid : parameters.ellipsoid,
-            isGeographic : parameters.projection instanceof BoundingSphere.GeographicProjection,
-            elementIndexUintSupported : parameters.elementIndexUintSupported,
-            scene3DOnly : parameters.scene3DOnly,
-            vertexCacheOptimize : parameters.vertexCacheOptimize,
-            compressVertices : parameters.compressVertices,
-            modelMatrix : parameters.modelMatrix,
-            createPickOffsets : parameters.createPickOffsets
-        };
-    };
-
-    /**
-     * @private
-     */
-    PrimitivePipeline.unpackCombineGeometryParameters = function(packedParameters) {
-        var instances = unpackInstancesForCombine(packedParameters.packedInstances);
-        var createGeometryResults = packedParameters.createGeometryResults;
-        var length = createGeometryResults.length;
-        var instanceIndex = 0;
-
-        for (var resultIndex = 0; resultIndex < length; resultIndex++) {
-            var geometries = PrimitivePipeline.unpackCreateGeometryResults(createGeometryResults[resultIndex]);
-            var geometriesLength = geometries.length;
-            for (var geometryIndex = 0; geometryIndex < geometriesLength; geometryIndex++) {
-                var geometry = geometries[geometryIndex];
-                var instance = instances[instanceIndex];
-                instance.geometry = geometry;
-                ++instanceIndex;
-            }
-        }
-
-        var ellipsoid = Cartesian2.Ellipsoid.clone(packedParameters.ellipsoid);
-        var projection = packedParameters.isGeographic ? new BoundingSphere.GeographicProjection(ellipsoid) : new WebMercatorProjection.WebMercatorProjection(ellipsoid);
-
-        return {
-            instances : instances,
-            ellipsoid : ellipsoid,
-            projection : projection,
-            elementIndexUintSupported : packedParameters.elementIndexUintSupported,
-            scene3DOnly : packedParameters.scene3DOnly,
-            vertexCacheOptimize : packedParameters.vertexCacheOptimize,
-            compressVertices : packedParameters.compressVertices,
-            modelMatrix : BoundingSphere.Matrix4.clone(packedParameters.modelMatrix),
-            createPickOffsets : packedParameters.createPickOffsets
-        };
-    };
-
-    function packBoundingSpheres(boundingSpheres) {
-        var length = boundingSpheres.length;
-        var bufferLength = 1 + (BoundingSphere.BoundingSphere.packedLength + 1) * length;
-        var buffer = new Float32Array(bufferLength);
-
-        var bufferIndex = 0;
-        buffer[bufferIndex++] = length;
-
-        for (var i = 0; i < length; ++i) {
-            var bs = boundingSpheres[i];
-            if (!when.defined(bs)) {
-                buffer[bufferIndex++] = 0.0;
-            } else {
-                buffer[bufferIndex++] = 1.0;
-                BoundingSphere.BoundingSphere.pack(boundingSpheres[i], buffer, bufferIndex);
-            }
-            bufferIndex += BoundingSphere.BoundingSphere.packedLength;
-        }
-
-        return buffer;
-    }
-
-    function unpackBoundingSpheres(buffer) {
-        var result = new Array(buffer[0]);
-        var count = 0;
-
-        var i = 1;
-        while (i < buffer.length) {
-            if (buffer[i++] === 1.0) {
-                result[count] = BoundingSphere.BoundingSphere.unpack(buffer, i);
-            }
-            ++count;
-            i += BoundingSphere.BoundingSphere.packedLength;
-        }
-
-        return result;
-    }
-
-    /**
-     * @private
-     */
-    PrimitivePipeline.packCombineGeometryResults = function(results, transferableObjects) {
-        if (when.defined(results.geometries)) {
-            transferGeometries(results.geometries, transferableObjects);
-        }
-
-        var packedBoundingSpheres = packBoundingSpheres(results.boundingSpheres);
-        var packedBoundingSpheresCV = packBoundingSpheres(results.boundingSpheresCV);
-        transferableObjects.push(packedBoundingSpheres.buffer, packedBoundingSpheresCV.buffer);
-
-        return {
-            geometries : results.geometries,
-            attributeLocations : results.attributeLocations,
-            modelMatrix : results.modelMatrix,
-            pickOffsets : results.pickOffsets,
-            offsetInstanceExtend: results.offsetInstanceExtend,
-            boundingSpheres : packedBoundingSpheres,
-            boundingSpheresCV : packedBoundingSpheresCV
-        };
-    };
-
-    /**
-     * @private
-     */
-    PrimitivePipeline.unpackCombineGeometryResults = function(packedResult) {
-        return {
-            geometries : packedResult.geometries,
-            attributeLocations : packedResult.attributeLocations,
-            modelMatrix : packedResult.modelMatrix,
-            pickOffsets : packedResult.pickOffsets,
-            offsetInstanceExtend: packedResult.offsetInstanceExtend,
-            boundingSpheres : unpackBoundingSpheres(packedResult.boundingSpheres),
-            boundingSpheresCV : unpackBoundingSpheres(packedResult.boundingSpheresCV)
-        };
-    };
-
-    exports.PrimitivePipeline = PrimitivePipeline;
-
-});
diff --git a/public/libs/Cesium/Workers/PrimitiveType-97893bc7.js b/public/libs/Cesium/Workers/PrimitiveType-97893bc7.js
deleted file mode 100644
index 0b8c3a1..0000000
--- a/public/libs/Cesium/Workers/PrimitiveType-97893bc7.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './WebGLConstants-4c11ee5f'], function (exports, WebGLConstants) { 'use strict';
-
-    /**
-         * The type of a geometric primitive, i.e., points, lines, and triangles.
-         *
-         * @exports PrimitiveType
-         */
-        var PrimitiveType = {
-            /**
-             * Points primitive where each vertex (or index) is a separate point.
-             *
-             * @type {Number}
-             * @constant
-             */
-            POINTS : WebGLConstants.WebGLConstants.POINTS,
-
-            /**
-             * Lines primitive where each two vertices (or indices) is a line segment.  Line segments are not necessarily connected.
-             *
-             * @type {Number}
-             * @constant
-             */
-            LINES : WebGLConstants.WebGLConstants.LINES,
-
-            /**
-             * Line loop primitive where each vertex (or index) after the first connects a line to
-             * the previous vertex, and the last vertex implicitly connects to the first.
-             *
-             * @type {Number}
-             * @constant
-             */
-            LINE_LOOP : WebGLConstants.WebGLConstants.LINE_LOOP,
-
-            /**
-             * Line strip primitive where each vertex (or index) after the first connects a line to the previous vertex.
-             *
-             * @type {Number}
-             * @constant
-             */
-            LINE_STRIP : WebGLConstants.WebGLConstants.LINE_STRIP,
-
-            /**
-             * Triangles primitive where each three vertices (or indices) is a triangle.  Triangles do not necessarily share edges.
-             *
-             * @type {Number}
-             * @constant
-             */
-            TRIANGLES : WebGLConstants.WebGLConstants.TRIANGLES,
-
-            /**
-             * Triangle strip primitive where each vertex (or index) after the first two connect to
-             * the previous two vertices forming a triangle.  For example, this can be used to model a wall.
-             *
-             * @type {Number}
-             * @constant
-             */
-            TRIANGLE_STRIP : WebGLConstants.WebGLConstants.TRIANGLE_STRIP,
-
-            /**
-             * Triangle fan primitive where each vertex (or index) after the first two connect to
-             * the previous vertex and the first vertex forming a triangle.  For example, this can be used
-             * to model a cone or circle.
-             *
-             * @type {Number}
-             * @constant
-             */
-            TRIANGLE_FAN : WebGLConstants.WebGLConstants.TRIANGLE_FAN,
-
-            /**
-             * @private
-             */
-            validate : function(primitiveType) {
-                return primitiveType === PrimitiveType.POINTS ||
-                       primitiveType === PrimitiveType.LINES ||
-                       primitiveType === PrimitiveType.LINE_LOOP ||
-                       primitiveType === PrimitiveType.LINE_STRIP ||
-                       primitiveType === PrimitiveType.TRIANGLES ||
-                       primitiveType === PrimitiveType.TRIANGLE_STRIP ||
-                       primitiveType === PrimitiveType.TRIANGLE_FAN;
-            }
-        };
-    var PrimitiveType$1 = Object.freeze(PrimitiveType);
-
-    exports.PrimitiveType = PrimitiveType$1;
-
-});
diff --git a/public/libs/Cesium/Workers/RectangleGeometryLibrary-e7665732.js b/public/libs/Cesium/Workers/RectangleGeometryLibrary-e7665732.js
deleted file mode 100644
index 51c0ea0..0000000
--- a/public/libs/Cesium/Workers/RectangleGeometryLibrary-e7665732.js
+++ /dev/null
@@ -1,240 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './GeometryAttribute-ed9d707f'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, GeometryAttribute) { 'use strict';
-
-    var cos = Math.cos;
-        var sin = Math.sin;
-        var sqrt = Math.sqrt;
-
-        /**
-         * @private
-         */
-        var RectangleGeometryLibrary = {};
-
-        /**
-         * @private
-         */
-        RectangleGeometryLibrary.computePosition = function(computedOptions, ellipsoid, computeST, row, col, position, st) {
-            var radiiSquared = ellipsoid.radiiSquared;
-            var nwCorner = computedOptions.nwCorner;
-            var rectangle = computedOptions.boundingRectangle;
-
-            var stLatitude = nwCorner.latitude - computedOptions.granYCos * row + col * computedOptions.granXSin;
-            var cosLatitude = cos(stLatitude);
-            var nZ = sin(stLatitude);
-            var kZ = radiiSquared.z * nZ;
-
-            var stLongitude = nwCorner.longitude + row * computedOptions.granYSin + col * computedOptions.granXCos;
-            var nX = cosLatitude * cos(stLongitude);
-            var nY = cosLatitude * sin(stLongitude);
-
-            var kX = radiiSquared.x * nX;
-            var kY = radiiSquared.y * nY;
-
-            var gamma = sqrt((kX * nX) + (kY * nY) + (kZ * nZ));
-
-            position.x = kX / gamma;
-            position.y = kY / gamma;
-            position.z = kZ / gamma;
-
-            if (computeST) {
-                var stNwCorner = computedOptions.stNwCorner;
-                if (when.defined(stNwCorner)) {
-                    stLatitude = stNwCorner.latitude - computedOptions.stGranYCos * row + col * computedOptions.stGranXSin;
-                    stLongitude = stNwCorner.longitude + row * computedOptions.stGranYSin + col * computedOptions.stGranXCos;
-
-                    st.x = (stLongitude - computedOptions.stWest) * computedOptions.lonScalar;
-                    st.y = (stLatitude - computedOptions.stSouth) * computedOptions.latScalar;
-                } else {
-                    st.x = (stLongitude - rectangle.west) * computedOptions.lonScalar;
-                    st.y = (stLatitude - rectangle.south) * computedOptions.latScalar;
-                }
-            }
-        };
-
-        var rotationMatrixScratch = new GeometryAttribute.Matrix2();
-        var nwCartesian = new Cartographic.Cartesian3();
-        var centerScratch = new Cartographic.Cartographic();
-        var centerCartesian = new Cartographic.Cartesian3();
-        var proj = new BoundingSphere.GeographicProjection();
-
-        function getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height) {
-            var cosRotation = Math.cos(rotation);
-            var granYCos = granularityY * cosRotation;
-            var granXCos = granularityX * cosRotation;
-
-            var sinRotation = Math.sin(rotation);
-            var granYSin = granularityY * sinRotation;
-            var granXSin = granularityX * sinRotation;
-
-            nwCartesian = proj.project(nwCorner, nwCartesian);
-
-            nwCartesian = Cartographic.Cartesian3.subtract(nwCartesian, centerCartesian, nwCartesian);
-            var rotationMatrix = GeometryAttribute.Matrix2.fromRotation(rotation, rotationMatrixScratch);
-            nwCartesian = GeometryAttribute.Matrix2.multiplyByVector(rotationMatrix, nwCartesian, nwCartesian);
-            nwCartesian = Cartographic.Cartesian3.add(nwCartesian, centerCartesian, nwCartesian);
-            nwCorner = proj.unproject(nwCartesian, nwCorner);
-
-            width -= 1;
-            height -= 1;
-
-            var latitude = nwCorner.latitude;
-            var latitude0 = latitude + width * granXSin;
-            var latitude1 = latitude - granYCos * height;
-            var latitude2 = latitude - granYCos * height + width * granXSin;
-
-            var north = Math.max(latitude, latitude0, latitude1, latitude2);
-            var south = Math.min(latitude, latitude0, latitude1, latitude2);
-
-            var longitude = nwCorner.longitude;
-            var longitude0 = longitude + width * granXCos;
-            var longitude1 = longitude + height * granYSin;
-            var longitude2 = longitude + height * granYSin + width * granXCos;
-
-            var east = Math.max(longitude, longitude0, longitude1, longitude2);
-            var west = Math.min(longitude, longitude0, longitude1, longitude2);
-
-            return {
-                north: north,
-                south: south,
-                east: east,
-                west: west,
-                granYCos : granYCos,
-                granYSin : granYSin,
-                granXCos : granXCos,
-                granXSin : granXSin,
-                nwCorner : nwCorner
-            };
-        }
-
-        /**
-         * @private
-         */
-        RectangleGeometryLibrary.computeOptions = function(rectangle, granularity, rotation, stRotation, boundingRectangleScratch, nwCornerResult, stNwCornerResult) {
-            var east = rectangle.east;
-            var west = rectangle.west;
-            var north = rectangle.north;
-            var south = rectangle.south;
-
-            var northCap = false;
-            var southCap = false;
-
-            if (north === _Math.CesiumMath.PI_OVER_TWO) {
-                northCap = true;
-            }
-            if (south === -_Math.CesiumMath.PI_OVER_TWO) {
-                southCap = true;
-            }
-
-            var width;
-            var height;
-            var granularityX;
-            var granularityY;
-            var dx;
-            var dy = north - south;
-            if (west > east) {
-                dx = (_Math.CesiumMath.TWO_PI - west + east);
-            } else {
-                dx = east - west;
-            }
-
-            width = Math.ceil(dx / granularity) + 1;
-            height = Math.ceil(dy / granularity) + 1;
-            granularityX = dx / (width - 1);
-            granularityY = dy / (height - 1);
-
-            var nwCorner = Cartesian2.Rectangle.northwest(rectangle, nwCornerResult);
-            var center = Cartesian2.Rectangle.center(rectangle, centerScratch);
-            if (rotation !== 0 || stRotation !== 0) {
-                if (center.longitude < nwCorner.longitude) {
-                    center.longitude += _Math.CesiumMath.TWO_PI;
-                }
-                centerCartesian = proj.project(center, centerCartesian);
-            }
-
-            var granYCos = granularityY;
-            var granXCos = granularityX;
-            var granYSin = 0.0;
-            var granXSin = 0.0;
-
-            var boundingRectangle = Cartesian2.Rectangle.clone(rectangle, boundingRectangleScratch);
-
-            var computedOptions = {
-                granYCos : granYCos,
-                granYSin : granYSin,
-                granXCos : granXCos,
-                granXSin : granXSin,
-                nwCorner : nwCorner,
-                boundingRectangle : boundingRectangle,
-                width: width,
-                height: height,
-                northCap: northCap,
-                southCap: southCap
-            };
-
-            if (rotation !== 0) {
-                var rotationOptions = getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height);
-                north = rotationOptions.north;
-                south = rotationOptions.south;
-                east = rotationOptions.east;
-                west = rotationOptions.west;
-
-                //>>includeStart('debug', pragmas.debug);
-                if (north < -_Math.CesiumMath.PI_OVER_TWO || north > _Math.CesiumMath.PI_OVER_TWO ||
-                    south < -_Math.CesiumMath.PI_OVER_TWO || south > _Math.CesiumMath.PI_OVER_TWO) {
-                    throw new Check.DeveloperError('Rotated rectangle is invalid.  It crosses over either the north or south pole.');
-                }
-                //>>includeEnd('debug')
-
-                computedOptions.granYCos = rotationOptions.granYCos;
-                computedOptions.granYSin = rotationOptions.granYSin;
-                computedOptions.granXCos = rotationOptions.granXCos;
-                computedOptions.granXSin = rotationOptions.granXSin;
-
-                boundingRectangle.north = north;
-                boundingRectangle.south = south;
-                boundingRectangle.east = east;
-                boundingRectangle.west = west;
-            }
-
-            if (stRotation !== 0) {
-                rotation = rotation - stRotation;
-                var stNwCorner = Cartesian2.Rectangle.northwest(boundingRectangle, stNwCornerResult);
-
-                var stRotationOptions = getRotationOptions(stNwCorner, rotation, granularityX, granularityY, center, width, height);
-
-                computedOptions.stGranYCos =  stRotationOptions.granYCos;
-                computedOptions.stGranXCos = stRotationOptions.granXCos;
-                computedOptions.stGranYSin = stRotationOptions.granYSin;
-                computedOptions.stGranXSin = stRotationOptions.granXSin;
-                computedOptions.stNwCorner = stNwCorner;
-                computedOptions.stWest = stRotationOptions.west;
-                computedOptions.stSouth = stRotationOptions.south;
-            }
-
-            return computedOptions;
-        };
-
-    exports.RectangleGeometryLibrary = RectangleGeometryLibrary;
-
-});
diff --git a/public/libs/Cesium/Workers/RuntimeError-ba10bc3e.js b/public/libs/Cesium/Workers/RuntimeError-ba10bc3e.js
deleted file mode 100644
index e1b203c..0000000
--- a/public/libs/Cesium/Workers/RuntimeError-ba10bc3e.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60'], function (exports, when) { 'use strict';
-
-    /**
-         * Constructs an exception object that is thrown due to an error that can occur at runtime, e.g.,
-         * out of memory, could not compile shader, etc.  If a function may throw this
-         * exception, the calling code should be prepared to catch it.
-         * <br /><br />
-         * On the other hand, a {@link DeveloperError} indicates an exception due
-         * to a developer error, e.g., invalid argument, that usually indicates a bug in the
-         * calling code.
-         *
-         * @alias RuntimeError
-         * @constructor
-         * @extends Error
-         *
-         * @param {String} [message] The error message for this exception.
-         *
-         * @see DeveloperError
-         */
-        function RuntimeError(message) {
-            /**
-             * 'RuntimeError' indicating that this exception was thrown due to a runtime error.
-             * @type {String}
-             * @readonly
-             */
-            this.name = 'RuntimeError';
-
-            /**
-             * The explanation for why this exception was thrown.
-             * @type {String}
-             * @readonly
-             */
-            this.message = message;
-
-            //Browsers such as IE don't have a stack property until you actually throw the error.
-            var stack;
-            try {
-                throw new Error();
-            } catch (e) {
-                stack = e.stack;
-            }
-
-            /**
-             * The stack trace of this exception, if available.
-             * @type {String}
-             * @readonly
-             */
-            this.stack = stack;
-        }
-
-        if (when.defined(Object.create)) {
-            RuntimeError.prototype = Object.create(Error.prototype);
-            RuntimeError.prototype.constructor = RuntimeError;
-        }
-
-        RuntimeError.prototype.toString = function() {
-            var str = this.name + ': ' + this.message;
-
-            if (when.defined(this.stack)) {
-                str += '\n' + this.stack.toString();
-            }
-
-            return str;
-        };
-
-    exports.RuntimeError = RuntimeError;
-
-});
diff --git a/public/libs/Cesium/Workers/S3MBTilesParser.js b/public/libs/Cesium/Workers/S3MBTilesParser.js
deleted file mode 100644
index 24edee4..0000000
--- a/public/libs/Cesium/Workers/S3MBTilesParser.js
+++ /dev/null
@@ -1,2288 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './buildModuleUrl-e7952659', './IndexDatatype-9435b55f', './createTaskProcessorWorker', './arrayFill-9766fb2e', './BoundingRectangle-dc808c42', './Color-69f1845f', './pako_inflate-8ea163f9', './S3MCompressType-ab31efd1', './unzip-b0fc9445', './PixelFormat-e6d821ed'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, PrimitiveType, FeatureDetection, buildModuleUrl, IndexDatatype, createTaskProcessorWorker, arrayFill, BoundingRectangle, Color, pako_inflate, S3MCompressType, unzip, PixelFormat) { 'use strict';
-
-    /**
-         * Create a shallow copy of an array from begin to end.
-         *
-         * @param {Array} array The array to fill.
-         * @param {Number} [begin=0] The index to start at.
-         * @param {Number} [end=array.length] The index to end at which is not included.
-         *
-         * @returns {Array} The resulting array.
-         * @private
-         */
-        function arraySlice(array, begin, end) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            if (when.defined(begin)) {
-                Check.Check.typeOf.number('begin', begin);
-            }
-            if (when.defined(end)) {
-                Check.Check.typeOf.number('end', end);
-            }
-            //>>includeEnd('debug');
-
-            if (typeof array.slice === 'function') {
-                return array.slice(begin, end);
-            }
-
-            var copy = Array.prototype.slice.call(array, begin, end);
-            var typedArrayTypes = FeatureDetection.FeatureDetection.typedArrayTypes;
-            var length = typedArrayTypes.length;
-            for (var i = 0; i < length; ++i) {
-                if (array instanceof typedArrayTypes[i]) {
-                    copy = new typedArrayTypes[i](copy);
-                    break;
-                }
-            }
-
-            return copy;
-        }
-
-    function S3MDracoDecode() {
-    }
-
-    var draco;
-
-    function decodeIndexArray(dracoGeometry, dracoDecoder) {
-        var numPoints = dracoGeometry.num_points();
-        var numFaces = dracoGeometry.num_faces();
-        var faceIndices = new draco.DracoInt32Array();
-        var numIndices = numFaces * 3;
-        var indexArray = IndexDatatype.IndexDatatype.createTypedArray(numPoints, numIndices);
-
-        var offset = 0;
-        for (var i = 0; i < numFaces; ++i) {
-            dracoDecoder.GetFaceFromMesh(dracoGeometry, i, faceIndices);
-            indexArray[offset + 0] = faceIndices.GetValue(0);
-            indexArray[offset + 1] = faceIndices.GetValue(1);
-            indexArray[offset + 2] = faceIndices.GetValue(2);
-            offset += 3;
-        }
-
-        var indexDataType = IndexDatatype.IndexDatatype.UNSIGNED_SHORT;
-        if (indexArray instanceof Uint32Array) {
-            indexDataType = IndexDatatype.IndexDatatype.UNSIGNED_INT;
-        }
-
-        draco.destroy(faceIndices);
-        return {
-            typedArray : indexArray,
-            numberOfIndices : numIndices,
-            indexDataType : indexDataType
-        };
-    }
-
-
-    function decodeQuantizedDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, quantization, vertexArrayLength) {
-        var vertexArray;
-        var attributeData;
-        if (quantization.quantizationBits <= 8) {
-            attributeData = new draco.DracoUInt8Array();
-            vertexArray = new Uint8Array(vertexArrayLength);
-            dracoDecoder.GetAttributeUInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-        } else {
-            attributeData = new draco.DracoUInt16Array();
-            vertexArray = new Uint16Array(vertexArrayLength);
-            dracoDecoder.GetAttributeUInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-        }
-
-        for (var i = 0; i < vertexArrayLength; ++i) {
-            vertexArray[i] = attributeData.GetValue(i);
-        }
-
-        draco.destroy(attributeData);
-        return vertexArray;
-    }
-
-    function decodeDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, vertexArrayLength) {
-        var vertexArray;
-        var attributeData;
-
-        // Some attribute types are casted down to 32 bit since Draco only returns 32 bit values
-        switch (dracoAttribute.data_type()) {
-            case 1: case 11: // DT_INT8 or DT_BOOL
-            attributeData = new draco.DracoInt8Array();
-            vertexArray = new Int8Array(vertexArrayLength);
-            dracoDecoder.GetAttributeInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-            break;
-            case 2: // DT_UINT8
-                attributeData = new draco.DracoUInt8Array();
-                vertexArray = new Uint8Array(vertexArrayLength);
-                dracoDecoder.GetAttributeUInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-                break;
-            case 3: // DT_INT16
-                attributeData = new draco.DracoInt16Array();
-                vertexArray = new Int16Array(vertexArrayLength);
-                dracoDecoder.GetAttributeInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-                break;
-            case 4: // DT_UINT16
-                attributeData = new draco.DracoUInt16Array();
-                vertexArray = new Uint16Array(vertexArrayLength);
-                dracoDecoder.GetAttributeUInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-                break;
-            case 5: case 7: // DT_INT32 or DT_INT64
-            attributeData = new draco.DracoInt32Array();
-            vertexArray = new Int32Array(vertexArrayLength);
-            dracoDecoder.GetAttributeInt32ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-            break;
-            case 6: case 8: // DT_UINT32 or DT_UINT64
-            attributeData = new draco.DracoUInt32Array();
-            vertexArray = new Uint32Array(vertexArrayLength);
-            dracoDecoder.GetAttributeUInt32ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-            break;
-            case 9: case 10: // DT_FLOAT32 or DT_FLOAT64
-            attributeData = new draco.DracoFloat32Array();
-            vertexArray = new Float32Array(vertexArrayLength);
-            dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-            break;
-        }
-
-        for (var i = 0; i < vertexArrayLength; ++i) {
-            vertexArray[i] = attributeData.GetValue(i);
-        }
-
-        draco.destroy(attributeData);
-        return vertexArray;
-    }
-
-    function decodeAttribute(dracoGeometry, dracoDecoder, dracoAttribute) {
-        var numPoints = dracoGeometry.num_points();
-        var numComponents = dracoAttribute.num_components();
-
-        var quantization;
-        var transform = new draco.AttributeQuantizationTransform();
-        if (transform.InitFromAttribute(dracoAttribute)) {
-            var minValues = new Array(numComponents);
-            for (var i = 0; i < numComponents; ++i) {
-                minValues[i] = transform.min_value(i);
-            }
-            quantization = {
-                quantizationBits : transform.quantization_bits(),
-                minValues : minValues,
-                range : transform.range(),
-                octEncoded : false
-            };
-        }
-        draco.destroy(transform);
-
-        transform = new draco.AttributeOctahedronTransform();
-        if (transform.InitFromAttribute(dracoAttribute)) {
-            quantization = {
-                quantizationBits : transform.quantization_bits(),
-                octEncoded : true
-            };
-        }
-        draco.destroy(transform);
-
-        var vertexArrayLength = numPoints * numComponents;
-        var vertexArray;
-        if (when.defined(quantization)) {
-            vertexArray = decodeQuantizedDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, quantization, vertexArrayLength);
-        } else {
-            vertexArray = decodeDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, vertexArrayLength);
-        }
-
-        var componentDatatype = ComponentDatatype.ComponentDatatype.fromTypedArray(vertexArray);
-
-        return {
-            array : vertexArray,
-            data : {
-                componentsPerAttribute : numComponents,
-                componentDatatype : componentDatatype,
-                byteOffset : dracoAttribute.byte_offset(),
-                byteStride : ComponentDatatype.ComponentDatatype.getSizeInBytes(componentDatatype) * numComponents,
-                normalized : dracoAttribute.normalized(),
-                quantization : quantization
-            }
-        };
-    }
-
-    function decodeAllAttributes(dracoGeometry, dracoDecoder, vertexPackage, vertexUniqueIDs){
-        var attributes = vertexPackage.vertexAttributes;
-        var attrLocation = vertexPackage.attrLocation;
-        vertexPackage.nCompressOptions = 0;
-        if(when.defined(vertexUniqueIDs.posUniqueID) && vertexUniqueIDs.posUniqueID >= 0){
-            vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_Vertex;
-            var posAttribute = dracoDecoder.GetAttribute(dracoGeometry, vertexUniqueIDs.posUniqueID);
-            var posAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, posAttribute);
-            var componentsPerAttribute = posAttributeData.data.componentsPerAttribute;
-            vertexPackage.verticesCount = posAttributeData.array.length / componentsPerAttribute;
-            vertexPackage.vertCompressConstant = posAttributeData.data.quantization.range / (1 << posAttributeData.data.quantization.quantizationBits);
-            var minValuesArray = posAttributeData.data.quantization.minValues;
-            vertexPackage.minVerticesValue = new Cartesian4.Cartesian4(minValuesArray[0], minValuesArray[1], minValuesArray[2], 1.0);
-            if(componentsPerAttribute > 3){
-                vertexPackage.minVerticesValue.w = minValuesArray[3];
-            }
-            attrLocation['aPosition'] = attributes.length;
-            attributes.push({
-                index: attrLocation['aPosition'],
-                typedArray: posAttributeData.array,
-                componentsPerAttribute: componentsPerAttribute,
-                componentDatatype: posAttributeData.data.componentDatatype,
-                offsetInBytes: posAttributeData.data.byteOffset,
-                strideInBytes: posAttributeData.data.byteStride,
-                normalize: posAttributeData.data.normalized
-            });
-        }
-        if(when.defined(vertexUniqueIDs.normalUniqueID) && vertexUniqueIDs.normalUniqueID >= 0){
-            vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_Normal;
-            var normalAttribute = dracoDecoder.GetAttribute(dracoGeometry, vertexUniqueIDs.normalUniqueID);
-            var normalAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, normalAttribute);
-            var normalQuantization = normalAttributeData.data.quantization;
-            vertexPackage.normalRangeConstant = (1 << normalQuantization.quantizationBits) - 1.0;
-            attrLocation['aNormal'] = attributes.length;
-            attributes.push({
-                index: attrLocation['aNormal'],
-                typedArray: normalAttributeData.array,
-                componentsPerAttribute: normalAttributeData.data.componentsPerAttribute,
-                componentDatatype: normalAttributeData.data.componentDatatype,
-                offsetInBytes: normalAttributeData.data.byteOffset,
-                strideInBytes: normalAttributeData.data.byteStride,
-                normalize: normalAttributeData.data.normalized
-            });
-        }
-        if(when.defined(vertexUniqueIDs.colorUniqueID) && vertexUniqueIDs.colorUniqueID >= 0){
-            vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_VertexColor;
-            var colorAttribute = dracoDecoder.GetAttribute(dracoGeometry, vertexUniqueIDs.colorUniqueID);
-            var colorAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, colorAttribute);
-            attrLocation['aColor'] = attributes.length;
-            attributes.push({
-                index: attrLocation['aColor'],
-                typedArray: colorAttributeData.array,
-                componentsPerAttribute: colorAttributeData.data.componentsPerAttribute,
-                componentDatatype: colorAttributeData.data.componentDatatype,
-                offsetInBytes: colorAttributeData.data.byteOffset,
-                strideInBytes: colorAttributeData.data.byteStride,
-                normalize: colorAttributeData.data.normalized
-            });
-        }
-
-        for(var i = 0 ; i < vertexUniqueIDs.texCoordUniqueIDs.length; i++){
-            vertexPackage.texCoordCompressConstant = [];
-            vertexPackage.minTexCoordValue = [];
-            var texCoordUniqueID = vertexUniqueIDs.texCoordUniqueIDs[i];
-            if(texCoordUniqueID < 0){
-                continue;
-            }
-            var texCoordAttribute = dracoDecoder.GetAttribute(dracoGeometry, texCoordUniqueID);
-            var texAttributeData = decodeAttribute(dracoGeometry, dracoDecoder, texCoordAttribute);
-            if(when.defined(texAttributeData.data.quantization)){
-                vertexPackage.nCompressOptions |= S3MCompressType.VertexCompressOption.SVC_TexutreCoord;
-                vertexPackage.texCoordCompressConstant.push(texAttributeData.data.quantization.range / (1 << texAttributeData.data.quantization.quantizationBits));
-                var minValuesArray = texAttributeData.data.quantization.minValues;
-                vertexPackage.minTexCoordValue.push(new Cartesian2.Cartesian2(minValuesArray[0], minValuesArray[1]));
-            }
-            var attName = 'aTexCoord' + i;
-            attrLocation[attName] = attributes.length;
-            attributes.push({
-                index: attrLocation[attName],
-                typedArray: texAttributeData.array,
-                componentsPerAttribute: texAttributeData.data.componentsPerAttribute,
-                componentDatatype: texAttributeData.data.componentDatatype,
-                offsetInBytes: texAttributeData.data.byteOffset,
-                strideInBytes: texAttributeData.data.byteStride,
-                normalize: texAttributeData.data.normalized
-            });
-        }
-    }
-
-    S3MDracoDecode.dracoDecodePointCloud = function(dracoLib, dataBuffer, byteLength, vertexPackage, vertexUniqueIDs){
-        draco = dracoLib;
-        var dracoDecoder = new draco.Decoder();
-
-        // Skip all parameter types except generic
-        var attributesToSkip = ['POSITION', 'NORMAL', 'COLOR'];
-        for (var i = 0; i < attributesToSkip.length; ++i) {
-            dracoDecoder.SkipAttributeTransform(draco[attributesToSkip[i]]);
-        }
-
-        var buffer = new draco.DecoderBuffer();
-        buffer.Init(dataBuffer, byteLength);
-
-        var geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
-        if (geometryType !== draco.POINT_CLOUD) {
-            throw new RuntimeError.RuntimeError('Draco geometry type must be POINT_CLOUD.');
-        }
-
-        var dracoPointCloud = new draco.PointCloud();
-        var decodingStatus = dracoDecoder.DecodeBufferToPointCloud(buffer, dracoPointCloud);
-        if (!decodingStatus.ok() || dracoPointCloud.ptr === 0) {
-            throw new RuntimeError.RuntimeError('Error decoding draco point cloud: ' + decodingStatus.error_msg());
-        }
-
-        draco.destroy(buffer);
-
-        decodeAllAttributes(dracoPointCloud, dracoDecoder, vertexPackage, vertexUniqueIDs);
-
-        draco.destroy(dracoPointCloud);
-        draco.destroy(dracoDecoder);
-    };
-
-    S3MDracoDecode.dracoDecodeMesh = function(dracoLib, dataBuffer, byteLength, vertexPackage, indexPackage, vertexUniqueIDs){
-        draco = dracoLib;
-        var dracoDecoder = new draco.Decoder();
-
-        // Skip all parameter types except generic
-        var attributesToSkip = ['POSITION', 'NORMAL', 'COLOR', 'TEX_COORD'];
-        for (var i = 0; i < attributesToSkip.length; ++i) {
-            dracoDecoder.SkipAttributeTransform(draco[attributesToSkip[i]]);
-        }
-
-        var buffer = new draco.DecoderBuffer();
-        buffer.Init(dataBuffer, byteLength);
-
-        var geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
-        if (geometryType !== draco.TRIANGULAR_MESH) {
-            throw new RuntimeError.RuntimeError('Unsupported draco mesh geometry type.');
-        }
-
-        var dracoGeometry = new draco.Mesh();
-        var decodingStatus = dracoDecoder.DecodeBufferToMesh(buffer, dracoGeometry);
-        if (!decodingStatus.ok() || dracoGeometry.ptr === 0) {
-            throw new RuntimeError.RuntimeError('Error decoding draco mesh geometry: ' + decodingStatus.error_msg());
-        }
-        draco.destroy(buffer);
-
-        decodeAllAttributes(dracoGeometry, dracoDecoder, vertexPackage, vertexUniqueIDs);
-
-        var indexArray = decodeIndexArray(dracoGeometry, dracoDecoder);
-        indexPackage.indicesTypedArray = indexArray.typedArray;
-        indexPackage.indicesCount = indexArray.numberOfIndices;
-        indexPackage.indexType = indexArray.indexDataType;
-        indexPackage.primitiveType = PrimitiveType.PrimitiveType.TRIANGLES;
-
-        draco.destroy(dracoGeometry);
-        draco.destroy(dracoDecoder);
-    };
-
-    var VERSION = {
-        S3M : 49,
-        S3M4 : 1
-    };
-
-    var S3MVersion = Object.freeze(VERSION);
-
-    var CRN_FORMAT = {
-        cCRNFmtInvalid: -1,
-
-        cCRNFmtDXT1: 0,
-        // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS.
-        cCRNFmtDXT3: 1,
-        cCRNFmtDXT5: 2
-
-        // Crunch supports more formats than this, but we can't use them here.
-    };
-
-    // Mapping of Crunch formats to DXT formats.
-    var DXT_FORMAT_MAP = {};
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.PixelFormat.RGB_DXT1;
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.PixelFormat.RGBA_DXT3;
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.PixelFormat.RGBA_DXT5;
-
-    var dst;
-    var dxtData;
-    var cachedDstSize = 0;
-
-    var crunch;
-    var crunchInitialized = false;
-
-    // Copy an array of bytes into or out of the emscripten heap.
-    function arrayBufferCopy(src, dst, dstByteOffset, numBytes) {
-        var i;
-        var dst32Offset = dstByteOffset / 4;
-        var tail = (numBytes % 4);
-        var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4);
-        var dst32 = new Uint32Array(dst.buffer);
-        for (i = 0; i < src32.length; i++) {
-            dst32[dst32Offset + i] = src32[i];
-        }
-        for (i = numBytes - tail; i < numBytes; i++) {
-            dst[dstByteOffset + i] = src[i];
-        }
-    }
-
-    /**
-     * @private
-     */
-    function convertCRNToDXT(parameters, transferableObjects) {
-        // Copy the contents of the arrayBuffer into emscriptens heap.
-        var arrayBuffer = parameters.data;
-        var srcSize = arrayBuffer.byteLength;
-        var bytes = new Uint8Array(arrayBuffer);
-        var src = crunch._malloc(srcSize);
-        arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize);
-
-        // Determine what type of compressed data the file contains.
-        var crnFormat = crunch._crn_get_dxt_format(src, srcSize);
-        var format = DXT_FORMAT_MAP[crnFormat];
-        if (!when.defined(format)) {
-            throw new RuntimeError.RuntimeError('Unsupported compressed format.');
-        }
-
-        // Gather basic metrics about the DXT data.
-        var levels = crunch._crn_get_levels(src, srcSize);
-        var width = crunch._crn_get_width(src, srcSize);
-        var height = crunch._crn_get_height(src, srcSize);
-
-        // Determine the size of the decoded DXT data.
-        var dstSize = 0;
-        var i;
-        for (i = 0; i < levels; ++i) {
-            dstSize += PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width >> i, height >> i);
-        }
-
-        // Allocate enough space on the emscripten heap to hold the decoded DXT data
-        // or reuse the existing allocation if a previous call to this function has
-        // already acquired a large enough buffer.
-        if(cachedDstSize < dstSize) {
-            if(when.defined(dst)) {
-                crunch._free(dst);
-            }
-            dst = crunch._malloc(dstSize);
-            dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize);
-            cachedDstSize = dstSize;
-        }
-
-        // Decompress the DXT data from the Crunch file into the allocated space.
-        crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels);
-
-        // Release the crunch file data from the emscripten heap.
-        crunch._free(src);
-
-        var bOutMipMapData = when.defaultValue(parameters.bMipMap, false);
-        if(bOutMipMapData){
-            var dXTDataMipMap = dxtData.slice(0, dstSize);
-            transferableObjects.push(dXTDataMipMap.buffer);
-            return new PixelFormat.CompressedTextureBuffer(format, width, height, dXTDataMipMap);
-        }
-        else {
-            // Mipmaps are unsupported, so copy the level 0 texture
-            // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap.
-            var length = PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width, height);
-
-            // Get a copy of the 0th mip level. dxtData will exceed length when there are more mip levels.
-            // Equivalent to dxtData.slice(0, length), which is not supported in IE11
-            var level0DXTDataView = dxtData.subarray(0, length);
-            var level0DXTData = new Uint8Array(length);
-            level0DXTData.set(level0DXTDataView, 0);
-
-            transferableObjects.push(level0DXTData.buffer);
-            return new PixelFormat.CompressedTextureBuffer(format, width, height, level0DXTData);
-        }
-    }
-
-    var S3MBVertexOptions = {
-        SVO_HasInstSelInfo: 1
-    };
-
-    var S3MBVertexTag = {
-        SV_Unkown: 0,
-        SV_Standard: 1,
-        SV_Compressed: 2,
-        SV_DracoCompressed: 3
-    };
-
-    var dracoLib;
-    var colorScratch = new Color.Color();
-    var CLAMP_GROUND_LINE_PASS_NAME = "ClampGroundAndObjectLinePass";
-    var unzipwasmReady = false;
-    if (when.defined(unzip.unzip)) {
-        unzip.unzip.onRuntimeInitialized = function () {
-            unzipwasmReady = true;
-        };
-        var unzipwasm = unzip.unzip.cwrap('unzip', 'number', ['number', 'number', 'number', 'number']);
-        var freec = unzip.unzip.cwrap('freePointer', null, ['number']);
-    }
-    function Bound3D(left,bottom,right,top,minHeight,maxHeight){
-        this.left = left;
-        this.bottom = bottom;
-        this.right = right;
-        this.top = top;
-        this.minHeight = minHeight;
-        this.maxHeight = maxHeight;
-        this.width = right-left;
-        this.length = top - bottom;
-        this.height = maxHeight - minHeight;
-    }
-    function loadStream(dataView, dataBuffer, byteOffset) {
-        var newByteOffset = byteOffset;
-        var streamSize = dataView.getUint32(newByteOffset, true);
-        newByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var bufferByteOffset = newByteOffset;
-            var buffer = new Uint8Array(dataBuffer, newByteOffset, streamSize);
-        newByteOffset += streamSize * Uint8Array.BYTES_PER_ELEMENT;
-        return {
-            dataViewByteOffset: bufferByteOffset,
-            byteOffset: newByteOffset,
-            buffer: buffer
-        };
-    }
-
-    function loadString(dataView, viewByteOffset, typedArray, bufferByteOffset) {
-        var stringLength = dataView.getUint32(bufferByteOffset + viewByteOffset, true);
-        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var stringBuffer = typedArray.subarray(bufferByteOffset, bufferByteOffset + stringLength);
-        var strResult = S3MCompressType.getStringFromTypedArray(stringBuffer);
-        bufferByteOffset += stringLength;
-        return {
-            string: strResult,
-            bytesOffset: bufferByteOffset
-        }
-    }
-
-    function loadTexCoord(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage, isOldVersion) {
-        var newBytesOffset = bufferByteOffset;
-        var nTexCount = view.getUint16(bufferByteOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-
-        if (!isOldVersion) {
-            newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        }
-
-        for (var i = 0; i < nTexCount; i++) {
-            var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var nDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-            var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-            if (nDimension == 20 || nDimension == 35) ;
-            else {
-                var byteLength = nTexCoordCount * nDimension * Float32Array.BYTES_PER_ELEMENT;
-                var texCoordBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-                newBytesOffset += byteLength;
-                var str = 'aTexCoord' + i;
-                var attributes = vertexPackage.vertexAttributes;
-                var attrLocation = vertexPackage.attrLocation;
-                attrLocation[str] = attributes.length;
-                attributes.push({
-                    index: attrLocation[str],
-                    typedArray: texCoordBuffer,
-                    componentsPerAttribute: nDimension,
-                    componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                    offsetInBytes: 0,
-                    strideInBytes: nDimension * Float32Array.BYTES_PER_ELEMENT,
-                    normalize: false
-                });
-            }
-        }
-        return {
-            bytesOffset: newBytesOffset
-        };
-    }
-
-    function loadCompressTexCoord(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage) {
-        vertexPackage.texCoordCompressConstant = [];
-        vertexPackage.minTexCoordValue = [];
-        var newBytesOffset = bufferByteOffset;
-        var nTexCount = view.getUint16(bufferByteOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        var texIndex = 0;
-        for (var i = 0; i < nTexCount; i++) {
-            var bNeedTexCoordZ = view.getUint8(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
-            newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 3;
-            var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var nDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-            var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-
-            var texCoordCompressConstant = view.getFloat32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-            vertexPackage.texCoordCompressConstant.push(texCoordCompressConstant);
-
-            var minTexCoordValue = new Cartesian4.Cartesian4();
-            minTexCoordValue.x = view.getFloat32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-            minTexCoordValue.y = view.getFloat32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-            minTexCoordValue.z = view.getFloat32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-            minTexCoordValue.w = view.getFloat32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-            vertexPackage.minTexCoordValue.push(minTexCoordValue);
-
-            var byteLength = nTexCoordCount * nDimension * Int16Array.BYTES_PER_ELEMENT;
-            var texCoordBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-            newBytesOffset += byteLength;
-            var align = newBytesOffset % 4;
-            if (align !== 0) {
-                newBytesOffset += (4 - align);
-            }
-
-
-            var str = 'aTexCoord' + texIndex;
-            var attributes = vertexPackage.vertexAttributes;
-            var attrLocation = vertexPackage.attrLocation;
-            attrLocation[str] = attributes.length;
-            attributes.push({
-                index: attrLocation[str],
-                typedArray: texCoordBuffer,
-                componentsPerAttribute: nDimension,
-                componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
-                offsetInBytes: 0,
-                strideInBytes: nDimension * Int16Array.BYTES_PER_ELEMENT,
-                normalize: false
-            });
-
-            if (bNeedTexCoordZ) {
-                byteLength = nTexCoordCount * Float32Array.BYTES_PER_ELEMENT;
-                var texCoordZBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-                newBytesOffset += byteLength;
-                vertexPackage.texCoordZMatrix = true;
-                str = 'aTexCoordZ' + texIndex;
-                attrLocation[str] = attributes.length;
-                attributes.push({
-                    index: attrLocation[str],
-                    typedArray: texCoordZBuffer,
-                    componentsPerAttribute: 1,
-                    componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                    offsetInBytes: 0,
-                    strideInBytes: Float32Array.BYTES_PER_ELEMENT,
-                    normalize: false
-                });
-            }
-            texIndex++;
-        }
-        return {
-            bytesOffset: newBytesOffset
-        };
-    }
-
-    function loadInstanceInfo(view, typedArray, bufferByteOffset, viewByteOffset, vertexPackage) {
-        var newBytesOffset = bufferByteOffset;
-        var nInstanceInfo = view.getUint16(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        var attributes = vertexPackage.vertexAttributes;
-        var attrLocation = vertexPackage.attrLocation;
-
-        for (var iIndex = 0; iIndex < nInstanceInfo; iIndex++) {
-            var nTexCoordCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var nTexDimensions = view.getUint16(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-            var nTexCoordStride = view.getUint16(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-
-            var byteLength = nTexCoordCount * nTexDimensions * Float32Array.BYTES_PER_ELEMENT;
-            if (nTexDimensions === 17 || nTexDimensions === 29) {
-                var instanceBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-                vertexPackage.instanceCount = nTexCoordCount;
-                vertexPackage.instanceMode = nTexDimensions;
-                vertexPackage.instanceBuffer = instanceBuffer;
-                vertexPackage.instanceIndex = 1;
-                var byteStride;
-                if (nTexDimensions === 17) {
-                    byteStride = Float32Array.BYTES_PER_ELEMENT * 17;
-                    attrLocation['uv2'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv2'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 0,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-
-                    attrLocation['uv3'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv3'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-
-                    attrLocation['uv4'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv4'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-
-                    attrLocation['secondary_colour'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['secondary_colour'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-
-                    attrLocation['uv6'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv6'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        normalize: true,
-                        offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                }
-                else if (nTexDimensions === 29) {
-                    byteStride = Float32Array.BYTES_PER_ELEMENT * 29;
-                    attrLocation['uv1'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv1'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 0,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1,
-                        byteLength: byteLength
-                    });
-                    attrLocation['uv2'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv2'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv3'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv3'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv4'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv4'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv5'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv5'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv6'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv6'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 20 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv7'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv7'],
-                        componentsPerAttribute: 3,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 24 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['secondary_colour'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['secondary_colour'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        normalize: true,
-                        offsetInBytes: 27 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv9'] = attributes.length;
-                    attributes.push({
-                        index: attrLocation['uv9'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        normalize: true,
-                        offsetInBytes: 28 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                }
-            }
-            else {
-                var valueCount = nTexCoordCount * nTexDimensions;
-                vertexPackage.instanceBounds = new Float32Array(valueCount);
-                for (var k = 0; k < valueCount; k++) {
-                    vertexPackage.instanceBounds[k] = view.getFloat32(newBytesOffset + viewByteOffset + k * Float32Array.BYTES_PER_ELEMENT, true);
-                }
-            }
-            newBytesOffset += byteLength;
-        }
-        return {
-            bytesOffset: newBytesOffset
-        };
-    }
-
-    function loadVertex(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
-        var newBytesOffset = bufferByteOffset;
-        var nVerticesCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-        vertexPackage.verticesCount = nVerticesCount;
-        newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if (nVerticesCount <= 0) {
-            return {
-                bytesOffset: newBytesOffset
-            };
-        }
-        var nVertexDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        var nVertexStride = view.getUint16(newBytesOffset + viewByteOffset, true);
-        nVertexStride = nVertexDimension * Float32Array.BYTES_PER_ELEMENT;
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-
-        var byteLength = nVerticesCount * nVertexDimension * Float32Array.BYTES_PER_ELEMENT;
-        var vertexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-        newBytesOffset += byteLength;
-
-        var attributes = vertexPackage.vertexAttributes;
-        var attrLocation = vertexPackage.attrLocation;
-        attrLocation['aPosition'] = attributes.length;
-        attributes.push({
-            index: attrLocation['aPosition'],
-            typedArray: vertexBuffer,
-            componentsPerAttribute: nVertexDimension,
-            componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-            offsetInBytes: 0,
-            strideInBytes: nVertexStride,
-            normalize: false
-        });
-        return {
-            bytesOffset: newBytesOffset
-        }
-    }
-
-    function loadCompressVertex(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
-        var newBytesOffset = bufferByteOffset;
-        var nVerticesCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-        vertexPackage.verticesCount = nVerticesCount;
-        newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if (nVerticesCount <= 0) {
-            return {
-                bytesOffset: newBytesOffset
-            };
-        }
-        var nVertexDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        var nVertexStride = view.getUint16(newBytesOffset + viewByteOffset, true);
-        nVertexStride = nVertexDimension * Int16Array.BYTES_PER_ELEMENT;
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-
-        var fVertCompressConstant = view.getFloat32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-        var minVerticesValue = new Cartesian4.Cartesian4();
-        minVerticesValue.x = view.getFloat32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-        minVerticesValue.y = view.getFloat32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-        minVerticesValue.z = view.getFloat32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-        minVerticesValue.w = view.getFloat32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Float32Array.BYTES_PER_ELEMENT;
-
-        vertexPackage.vertCompressConstant = fVertCompressConstant;
-        vertexPackage.minVerticesValue = minVerticesValue;
-
-        var byteLength = nVerticesCount * nVertexDimension * Int16Array.BYTES_PER_ELEMENT;
-        var vertexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-        newBytesOffset += byteLength;
-
-        var attributes = vertexPackage.vertexAttributes;
-        var attrLocation = vertexPackage.attrLocation;
-        attrLocation['aPosition'] = attributes.length;
-        attributes.push({
-            index: attrLocation['aPosition'],
-            typedArray: vertexBuffer,
-            componentsPerAttribute: nVertexDimension,
-            componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
-            offsetInBytes: 0,
-            strideInBytes: nVertexStride,
-            normalize: false
-        });
-        return {
-            bytesOffset: newBytesOffset
-        }
-    }
-
-    function loadNormal(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
-        var newBytesOffset = bufferByteOffset;
-        var nNormalCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if (nNormalCount <= 0) {
-            return {
-                bytesOffset: newBytesOffset
-            };
-        }
-        var nNormalDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        var nNormalStride = view.getUint16(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        var byteLength = nNormalCount * nNormalDimension * Float32Array.BYTES_PER_ELEMENT;
-        var normalBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-        newBytesOffset += byteLength;
-        if (!vertexPackage.ignoreNormal) {
-            var attributes = vertexPackage.vertexAttributes;
-            var attrLocation = vertexPackage.attrLocation;
-            attrLocation['aNormal'] = attributes.length;
-            attributes.push({
-                index: attrLocation['aNormal'],
-                typedArray: normalBuffer,
-                componentsPerAttribute: nNormalDimension,
-                componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                offsetInBytes: 0,
-                strideInBytes: nNormalStride,
-                normalize: false
-            });
-        }
-        return {
-            bytesOffset: newBytesOffset
-        }
-    }
-
-    function loadCompressNormal(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
-        var newBytesOffset = bufferByteOffset;
-        var nNormalCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if (nNormalCount <= 0) {
-            return {
-                bytesOffset: newBytesOffset
-            };
-        }
-        var nNormalDimension = view.getUint16(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        var nNormalStride = view.getUint16(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        var byteLength = nNormalCount * 2 * Int16Array.BYTES_PER_ELEMENT;
-        var normalBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-        newBytesOffset += byteLength;
-        if (!vertexPackage.ignoreNormal) {
-            var attributes = vertexPackage.vertexAttributes;
-            var attrLocation = vertexPackage.attrLocation;
-            attrLocation['aNormal'] = attributes.length;
-            attributes.push({
-                index: attrLocation['aNormal'],
-                typedArray: normalBuffer,
-                componentsPerAttribute: 2,
-                componentDatatype: ComponentDatatype.ComponentDatatype.SHORT,
-                offsetInBytes: 0,
-                strideInBytes: nNormalStride,
-                normalize: false
-            });
-        }
-        return {
-            bytesOffset: newBytesOffset
-        }
-    }
-
-    function loadVertexColor(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
-        var newBytesOffset = bufferByteOffset;
-        var nColorCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var verticesCount = vertexPackage.verticesCount;
-        var vertexColor;
-        if (nColorCount > 0) {
-            var colorStride = view.getUint16(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-            newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2;
-            var byteLength = nColorCount * Uint8Array.BYTES_PER_ELEMENT * 4;
-            vertexColor = arraySlice(typedArray, newBytesOffset, newBytesOffset + byteLength);
-            newBytesOffset += byteLength;
-            var attributes = vertexPackage.vertexAttributes;
-            var attrLocation = vertexPackage.attrLocation;
-            attrLocation['aColor'] = attributes.length;
-            attributes.push({
-                index: attrLocation['aColor'],
-                typedArray: vertexColor,
-                componentsPerAttribute: 4,
-                componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                offsetInBytes: 0,
-                strideInBytes: 4,
-                normalize: true
-            });
-        }
-
-        return {
-            bytesOffset: newBytesOffset
-        };
-    }
-
-    function loadSecondColor(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage) {
-        var newBytesOffset = bufferByteOffset;
-        var nSecondColorCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if (nSecondColorCount <= 0) {
-            return {
-                bytesOffset: newBytesOffset
-            };
-        }
-        var secondColorStride = view.getUint16(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-        newBytesOffset += Uint8Array.BYTES_PER_ELEMENT * 2;
-        var byteLength = nSecondColorCount * Uint8Array.BYTES_PER_ELEMENT * 4;
-        newBytesOffset += byteLength;
-        return {
-            bytesOffset: newBytesOffset
-        };
-    }
-
-    function loadIndexPackage(typedArray, view, viewByteOffset, bufferByteOffset) {
-        var newBytesOffset = bufferByteOffset;
-        var arrIndexPackage = [];
-        var nIndexPackageCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-        newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        for (var k = 0; k < nIndexPackageCount; k++) {
-            var indexPackage = {};
-            var nIndexCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var enIndexType = view.getUint8(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
-            var bUseIndex = view.getUint8(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
-            var operationType = view.getUint8(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
-            newBytesOffset += Uint8Array.BYTES_PER_ELEMENT;
-            if (nIndexCount > 0) {
-                var byteLength = 0;
-                var indexBuffer = null;
-                if (enIndexType === 1 || enIndexType === 3) {
-                    byteLength = nIndexCount * Uint32Array.BYTES_PER_ELEMENT;
-                    indexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-                }
-                else {
-                    byteLength = nIndexCount * Uint16Array.BYTES_PER_ELEMENT;
-                    indexBuffer = typedArray.subarray(newBytesOffset, newBytesOffset + byteLength);
-                    if (nIndexCount % 2 != 0) {
-                        byteLength += 2;
-                    }
-                }
-                indexPackage.indicesTypedArray = indexBuffer;
-                newBytesOffset += byteLength;
-            }
-            indexPackage.indicesCount = nIndexCount;
-            indexPackage.indexType = enIndexType;
-            indexPackage.primitiveType = operationType;
-
-            var arrPassName = [];
-            var nPassNameCount = view.getUint32(newBytesOffset + viewByteOffset, true);
-            newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            for (var passIndex = 0; passIndex < nPassNameCount; passIndex++) {
-                var res = loadString(view, viewByteOffset, typedArray, newBytesOffset);
-                var strPassName = res.string;
-                newBytesOffset = res.bytesOffset;
-                arrPassName.push(strPassName);
-                indexPackage.materialCode = strPassName;
-            }
-            arrIndexPackage.push(indexPackage);
-
-            var align = newBytesOffset % 4;
-            if (align !== 0) {
-                var nReserved = 4 - newBytesOffset % 4;
-                newBytesOffset += nReserved;
-            }
-        }
-        return {
-            bytesOffset: newBytesOffset,
-            arrIndexPackage: arrIndexPackage
-        };
-    }
-
-    function loadCompressSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion) {
-        var newBytesOffset = bufferByteOffset;
-        var nCompressOptions = view.getUint32(newBytesOffset + viewByteOffset, true);
-        vertexPackage.nCompressOptions = nCompressOptions;
-        var result;
-        newBytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_Vertex) == S3MCompressType.VertexCompressOption.SVC_Vertex) {
-            result = loadCompressVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
-            newBytesOffset = result.bytesOffset;
-        }
-        else {
-            result = loadVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
-            newBytesOffset = result.bytesOffset;
-        }
-
-        if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_Normal) == S3MCompressType.VertexCompressOption.SVC_Normal) {
-            result = loadCompressNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
-            newBytesOffset = result.bytesOffset;
-        }
-        else {
-            result = loadNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
-            newBytesOffset = result.bytesOffset;
-        }
-
-        result = loadVertexColor(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
-        newBytesOffset = result.bytesOffset;
-
-        result = loadSecondColor(typedArray, view, viewByteOffset, newBytesOffset);
-        newBytesOffset = result.bytesOffset;
-
-        if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_TexutreCoord) == S3MCompressType.VertexCompressOption.SVC_TexutreCoord) {
-            result = loadCompressTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
-            newBytesOffset = result.bytesOffset;
-        }
-        else {
-            result = loadTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage, isOldVersion);
-            newBytesOffset = result.bytesOffset;
-        }
-
-        if ((nCompressOptions & S3MCompressType.VertexCompressOption.SVC_TexutreCoordIsW) == S3MCompressType.VertexCompressOption.SVC_TexutreCoordIsW) {
-            vertexPackage.textureCoordIsW = true;
-        }
-
-        result = loadInstanceInfo(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
-        newBytesOffset = result.bytesOffset;
-
-        return {
-            bytesOffset: newBytesOffset
-        }
-    }
-
-    function loadStandardSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion) {
-        var newBytesOffset = bufferByteOffset;
-        var result;
-        result = loadVertex(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
-        newBytesOffset = result.bytesOffset;
-
-        result = loadNormal(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
-        newBytesOffset = result.bytesOffset;
-
-        result = loadVertexColor(typedArray, view, viewByteOffset, newBytesOffset, vertexPackage);
-        newBytesOffset = result.bytesOffset;
-
-        result = loadSecondColor(typedArray, view, viewByteOffset, newBytesOffset);
-        newBytesOffset = result.bytesOffset;
-
-        result = loadTexCoord(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage, isOldVersion);
-        newBytesOffset = result.bytesOffset;
-
-        result = loadInstanceInfo(view, typedArray, newBytesOffset, viewByteOffset, vertexPackage);
-        newBytesOffset = result.bytesOffset;
-
-        return {
-            bytesOffset: newBytesOffset
-        }
-    }
-
-    function isClampGroundLinePass(arrIndexPackage) {
-        if (arrIndexPackage.length === 0) {
-            return false;
-        }
-        return arrIndexPackage[0].materialCode === CLAMP_GROUND_LINE_PASS_NAME;
-    }
-
-    function loadSkeletonEntities(skeletonBuffer, view, viewByteOffset, needCreateEdge, geoPackage, isOldVersion, transferableObjects) {
-        var typedArray = skeletonBuffer;
-        var bufferByteOffset = 0;
-        var nCount = view.getUint32(bufferByteOffset + viewByteOffset, true);
-        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-        for (var i = 0; i < nCount; i++) {
-            // S3MB头名字长度
-            var result = loadString(view, viewByteOffset, typedArray, bufferByteOffset);
-            var strGeometryName = result.string;
-            bufferByteOffset = result.bytesOffset;
-            var align = bufferByteOffset % 4;
-            if (align !== 0) {
-                bufferByteOffset += (4 - align);
-            }
-
-            var nTagValue = S3MBVertexTag.SV_Unkown;
-            nTagValue = view.getUint32(bufferByteOffset + viewByteOffset, true);
-            bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
-
-            var vertexPackage = {};
-            vertexPackage.vertexAttributes = [];
-            vertexPackage.attrLocation = {};
-            vertexPackage.instanceCount = 0;
-            vertexPackage.instanceMode = 0;
-            vertexPackage.instanceIndex = -1;
-            vertexPackage.ignoreNormal = geoPackage.ignoreNormal;
-
-            if (nTagValue == S3MBVertexTag.SV_DracoCompressed) {
-                var vertexUniqueIDs = {};
-                vertexUniqueIDs.posUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
-                bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
-                vertexUniqueIDs.normalUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
-                bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
-                vertexUniqueIDs.colorUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
-                bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
-                vertexUniqueIDs.secondColorUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
-                bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
-
-                var nTextureCoord = view.getUint16(bufferByteOffset + viewByteOffset, true);
-                bufferByteOffset += Int16Array.BYTES_PER_ELEMENT;
-
-                var texCoordUniqueIDs = [];
-                for (var nTexCoordIdx = 0; nTexCoordIdx < nTextureCoord; nTexCoordIdx++) {
-                    var nTexCoordUniqueID = view.getInt32(bufferByteOffset + viewByteOffset, true);
-                    texCoordUniqueIDs.push(nTexCoordUniqueID);
-                    bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
-                }
-                vertexUniqueIDs.texCoordUniqueIDs = texCoordUniqueIDs;
-
-                var nIndexPackageCount = view.getInt32(bufferByteOffset + viewByteOffset, true);
-                bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
-                var arrIndexPackage = [];
-                // 目前只支持单索引
-                var indexPackage = {};
-                if (nIndexPackageCount > 0) {
-                    var res = loadString(view, viewByteOffset, typedArray, bufferByteOffset);
-                    var strPassName = res.string;
-                    bufferByteOffset = res.bytesOffset;
-                    indexPackage.materialCode = strPassName;
-                    arrIndexPackage.push(indexPackage);
-                }
-
-                var nDracoBufferSize = view.getUint32(bufferByteOffset + viewByteOffset, true);
-                bufferByteOffset += Int32Array.BYTES_PER_ELEMENT;
-                var dataBuffer = arraySlice(typedArray, bufferByteOffset, bufferByteOffset + nDracoBufferSize);
-                if (nIndexPackageCount > 0) {
-                    S3MDracoDecode.dracoDecodeMesh(dracoLib, dataBuffer, nDracoBufferSize, vertexPackage, indexPackage, vertexUniqueIDs);
-                }
-                else {
-                    S3MDracoDecode.dracoDecodePointCloud(dracoLib, dataBuffer, nDracoBufferSize, vertexPackage, vertexUniqueIDs);
-                }
-
-                bufferByteOffset += nDracoBufferSize;
-                geoPackage[strGeometryName] = {
-                    vertexPackage: vertexPackage,
-                    arrIndexPackage: arrIndexPackage
-                };
-            }
-            else {
-                if (nTagValue == S3MBVertexTag.SV_Standard) {
-                    result = loadStandardSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion);
-                    bufferByteOffset = result.bytesOffset;
-                }
-                else if (nTagValue == S3MBVertexTag.SV_Compressed) {
-                    result = loadCompressSkeleton(typedArray, view, viewByteOffset, bufferByteOffset, vertexPackage, isOldVersion);
-                    bufferByteOffset = result.bytesOffset;
-                }
-
-                result = loadIndexPackage(typedArray, view, viewByteOffset, bufferByteOffset);
-                var arrIndexPackage = result.arrIndexPackage;
-                if (isClampGroundLinePass(arrIndexPackage)) {
-                    vertexPackage.clampRegionEdge = true;
-                }
-
-                var edgeGeometry;
-                if (needCreateEdge) {
-                    edgeGeometry = S3MCompressType.S3MEdgeProcessor.createEdgeData(vertexPackage, arrIndexPackage, transferableObjects);
-                }
-
-                bufferByteOffset = result.bytesOffset;
-                geoPackage[strGeometryName] = {
-                    vertexPackage: vertexPackage,
-                    arrIndexPackage: arrIndexPackage,
-                    edgeGeometry: edgeGeometry
-                };
-            }
-        }
-    }
-
-    function loadGeodeEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset) {
-        var geode = {};
-        var skeletonNames = [];
-        var geoMatrix = new BoundingSphere.Matrix4();
-        var typedArray = shellBuffer;
-        for (var matIndex = 0; matIndex < 16; matIndex++) {
-            geoMatrix[matIndex] = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
-            bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
-        }
-        geode.matrix = geoMatrix;
-        geode.skeletonNames = skeletonNames;
-        var nSkeletonCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-        for (var i = 0; i < nSkeletonCount; i++) {
-            var res = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
-            var strSkeletonName = res.string;
-            bufferByteOffset = res.bytesOffset;
-            skeletonNames.push(strSkeletonName);
-        }
-        return {
-            byteOffset: bufferByteOffset,
-            geode: geode
-        }
-    }
-
-    function removeUnusedStringTileName(oldTileName) {
-        var index = oldTileName.indexOf('Geometry');
-        if (index === -1) {
-            return oldTileName;
-        }
-        var ignoreString = oldTileName.substring(index, oldTileName.length);
-        return oldTileName.replace(ignoreString, '');
-    }
-
-    function loadPageLODEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset) {
-        var pageLOD = {};
-        var dbDis = view.getFloat32(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Float32Array.BYTES_PER_ELEMENT;
-        var uRangeMode = view.getUint16(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Uint16Array.BYTES_PER_ELEMENT;
-        pageLOD.rangeMode = uRangeMode;
-        pageLOD.rangeList = dbDis;
-
-        var boundingSphereCenter = new Cartographic.Cartesian3();
-        boundingSphereCenter.x = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
-        boundingSphereCenter.y = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
-        boundingSphereCenter.z = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
-        var radius = view.getFloat64(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Float64Array.BYTES_PER_ELEMENT;
-        pageLOD.boundingSphere = new BoundingSphere.BoundingSphere(boundingSphereCenter, radius);
-
-        var typedArray = shellBuffer;
-        var res = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
-        var strChildTile = res.string;
-        bufferByteOffset = res.bytesOffset;
-
-        strChildTile = strChildTile.replace(/(\.s3mblock)|(\.s3mbz)|(\.s3mb)/gi, '');
-        strChildTile = removeUnusedStringTileName(strChildTile);
-
-        pageLOD.childTile = strChildTile;
-        pageLOD.geodes = [];
-        var nGeodeCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-        for (var i = 0; i < nGeodeCount; i++) {
-            var res = loadGeodeEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset);
-            bufferByteOffset = res.byteOffset;
-            pageLOD.geodes.push(res.geode);
-        }
-        return {
-            pageLOD: pageLOD,
-            bytesOffset: bufferByteOffset
-        }
-    }
-
-    function loadShellEntites(shellBuffer, view, dataViewByteOffset) {
-        var bufferByteOffset = 0;
-        var groupNode = {};
-        var pageLods = [];
-        var nCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-        for (var i = 0; i < nCount; i++) {
-            var res = loadPageLODEntities(shellBuffer, view, bufferByteOffset, dataViewByteOffset);
-            bufferByteOffset = res.bytesOffset;
-            pageLods.push(res.pageLOD);
-        }
-        groupNode.pageLods = pageLods;
-        return groupNode;
-    }
-
-    function loadTextureEntities(supportCompressType, textureDataBuffer, dataView, dataViewByteOffset, texturePackage, transferableObjects) {
-        var bufferByteOffset = 0;
-        var nTextureCount = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-        for (var i = 0; i < nTextureCount; i++) {
-            var res = loadString(dataView, dataViewByteOffset, textureDataBuffer, bufferByteOffset);
-            var strTextureName = res.string;
-            bufferByteOffset = res.bytesOffset;
-            var align = bufferByteOffset % 4;
-            if (align !== 0) {
-                bufferByteOffset += (4 - align);
-            }
-
-            var nLevel = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var width = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var height = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var compressType = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var nSize = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var pixelFormat = dataView.getUint32(bufferByteOffset + dataViewByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-
-            var textureData = textureDataBuffer.subarray(bufferByteOffset, bufferByteOffset + nSize);
-            bufferByteOffset += nSize;
-
-            var imageTypedArray = null;
-            if (compressType === S3MCompressType.S3MCompressType.enrS3TCDXTN && supportCompressType != 1) {
-                S3MCompressType.DXTTextureDecode.decode(imageTypedArray, width, height, textureData, pixelFormat);
-                if (pixelFormat > S3MCompressType.S3MPixelFormat.BGR || pixelFormat === S3MCompressType.S3MPixelFormat.LUMINANCE_ALPHA) {
-                    imageTypedArray = new Uint8Array(width * height * 4);
-                }
-                else {
-                    imageTypedArray = new Uint16Array(width * height);
-                }
-                S3MCompressType.DXTTextureDecode.decode(imageTypedArray, width, height, textureData, pixelFormat);
-                transferableObjects.push(imageTypedArray.buffer);
-                compressType = 0;
-            }
-            else {
-                imageTypedArray = textureData;
-            }
-
-            texturePackage[strTextureName] = {
-                id: strTextureName,
-                width: width,
-                height: height,
-                compressType: compressType,
-                nFormat: pixelFormat,
-                imageBuffer: imageTypedArray
-            };
-        }
-    }
-
-    function createTexBatchIdAttribute(vertexPackage, typedArray, texUnitIndex) {
-        var vertexAttributes = vertexPackage.vertexAttributes;
-        var attrLocation = vertexPackage.attrLocation;
-        var len = vertexAttributes.length;
-        attrLocation['aTextureBatchId' + texUnitIndex] = len;
-        vertexAttributes.push({
-            index: len,
-            typedArray: typedArray,
-            componentsPerAttribute: 1,
-            componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-            offsetInBytes: 0,
-            strideInBytes: 0
-        });
-    }
-
-    function createTextureBatch(rootInfo, geoPackages, subTexInfos, batchIdsMap) {
-        var len = subTexInfos.length;
-        for(var i = 0;i < len;i++){
-            var subInfo = subTexInfos[i];
-            var subName = subInfo.subName.split('_')[0];
-            var subVertexOffsetArr = subInfo.subVertexOffsetArr;
-            for(var j = 0;j < subVertexOffsetArr.length;j++){
-                var subVertexOffsetInfo = subVertexOffsetArr[j];
-                var geoName = subVertexOffsetInfo.geoName;
-                var offset = subVertexOffsetInfo.offset;
-                var count = subVertexOffsetInfo.count;
-                var texUnitIndex = subVertexOffsetInfo.texUnitIndex;
-                var vertexPackage = geoPackages[geoName].vertexPackage;
-                var verticesCount = vertexPackage.verticesCount;
-                var batchIdsObj = batchIdsMap[geoName];
-                if(!when.defined(batchIdsObj)){
-                    batchIdsObj = batchIdsMap[geoName] = {};
-                }
-
-                var batchIds = batchIdsObj[texUnitIndex];
-                if(!when.defined(batchIds)){
-                    batchIds = batchIdsObj[texUnitIndex] = new Float32Array(verticesCount);
-                    arrayFill.arrayFill(batchIds, -1);
-                }
-
-                var batchId = when.defined(rootInfo) ? rootInfo[subName] : i;
-                arrayFill.arrayFill(batchIds, batchId, offset, offset + count);
-            }
-        }
-    }
-
-    function loadTextureEntitiesForBlock(geoPackages, rootMap, ancestorMap, isRoot, supportCompressType, textureDataBuffer, dataView, dataViewByteOffset, texturePackage, transferableObjects) {
-        var bufferByteOffset = dataViewByteOffset;
-        var nTextureCount = dataView.getUint32(bufferByteOffset, true);
-        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var batchIdsMap = {};
-        for (var i = 0; i < nTextureCount; i++) {
-            var len = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var curTextureName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
-            bufferByteOffset += len;
-
-            var align = bufferByteOffset % 4;
-            if (align !== 0) {
-                bufferByteOffset += (4 - align);
-            }
-
-            var nLevel = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-
-            var isSaveData = dataView.getUint8(bufferByteOffset, true);
-            bufferByteOffset += Uint8Array.BYTES_PER_ELEMENT;
-
-            var width = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-
-            var height = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-
-            var compressType = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-
-            var size = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-
-            var format = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var textureData;
-            if(isRoot){
-                var offset = bufferByteOffset - dataViewByteOffset;
-                textureData = textureDataBuffer.subarray(offset, offset + size);
-                bufferByteOffset += size;
-            }
-
-            var childTexCount = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var childrenTexNames = [];
-            for(var j = 0;j < childTexCount;j++){
-                len = dataView.getUint32(bufferByteOffset, true);
-                bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                var childTexName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
-                bufferByteOffset += len;
-                childrenTexNames.push(childTexName);
-                ancestorMap[childTexName] = curTextureName;
-            }
-
-            var requestNameCount = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var requestNames = [];
-            for(j = 0;j < requestNameCount;j++){
-                len = dataView.getUint32(bufferByteOffset, true);
-                bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                var reqName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
-                bufferByteOffset += len;
-                requestNames.push(reqName);
-            }
-
-            var subTexCount = dataView.getUint32(bufferByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var subTexInfos = [];
-            var rootInfo = undefined;
-            var rootName = curTextureName;
-            if(isRoot){
-                rootInfo = rootMap[curTextureName] = {};
-            }
-            else{
-                var parent = ancestorMap[curTextureName];
-                rootName = parent;
-                while(when.defined(parent)){
-                    rootName = parent;
-                    parent = ancestorMap[parent];
-                }
-
-                if(when.defined(rootName)){
-                    rootInfo = rootMap[rootName];
-                }
-
-            }
-            var decream = 0;
-            for(j = 0;j < subTexCount;j++){
-                len = dataView.getUint32(bufferByteOffset, true);
-                bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                var subName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
-                bufferByteOffset += len;
-                if(isRoot){
-                    var firstName = subName.split('_')[0];
-                    if(!when.defined(rootInfo[firstName])){
-                        rootInfo[firstName] = j - decream;
-                    }
-                    else{
-                        decream++;
-                    }
-                }
-
-                var offsetX = dataView.getUint32(bufferByteOffset, true);
-                bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                var offsetY = dataView.getUint32(bufferByteOffset, true);
-                bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                var subWidth = dataView.getUint32(bufferByteOffset, true);
-                bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                var subHeight = dataView.getUint32(bufferByteOffset, true);
-                bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                var geoCount = dataView.getUint32(bufferByteOffset, true);
-                bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                var subVertexOffsetArr = [];
-                for(var k = 0;k < geoCount;k++){
-                    len = dataView.getUint32(bufferByteOffset, true);
-                    bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    var geoName = S3MCompressType.getStringFromTypedArray(textureDataBuffer, bufferByteOffset - dataViewByteOffset, len);
-                    bufferByteOffset += len;
-                    var vertexOffset = dataView.getUint32(bufferByteOffset, true);
-                    bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    var vertexCount = dataView.getUint32(bufferByteOffset, true);
-                    bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    var texUnitIndex = dataView.getUint32(bufferByteOffset, true);
-                    bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    subVertexOffsetArr.push({
-                        geoName : geoName,
-                        offset : vertexOffset,
-                        count : vertexCount,
-                        texUnitIndex : texUnitIndex
-                    });
-                }
-
-                subTexInfos.push({
-                    subName : subName,
-                    offsetX : offsetX,
-                    offsetY : offsetY,
-                    width : subWidth,
-                    height : subHeight,
-                    subVertexOffsetArr : subVertexOffsetArr
-                });
-            }
-
-            createTextureBatch(rootInfo, geoPackages, subTexInfos, batchIdsMap);
-
-            if(when.defined(textureData) && compressType === S3MCompressType.S3MPixelFormat.CRN_DXT5 && crunchInitialized){
-                textureData = convertCRNToDXT({data : textureData}, transferableObjects).bufferView;
-            }
-
-            texturePackage[curTextureName] = {
-                isLeaf : childTexCount === 0,
-                id: curTextureName,
-                rootTextureName : rootName,
-                width : width,
-                height : height,
-                compressType : compressType,
-                size : size,
-                format : format,
-                textureData : textureData,
-                subTexInfos : subTexInfos,
-                requestNames : requestNames
-            };
-        }
-
-        for(var geoName in batchIdsMap){
-            if(batchIdsMap.hasOwnProperty(geoName)){
-                var vertexPackage = geoPackages[geoName].vertexPackage;
-                var obj = batchIdsMap[geoName];
-                for(var texUnitIndex in obj){
-                    if(obj.hasOwnProperty(texUnitIndex)){
-                        var batchIds = obj[texUnitIndex];
-                        createTexBatchIdAttribute(vertexPackage, batchIds, texUnitIndex);
-                    }
-                }
-            }
-        }
-    }
-
-    function createBatchIdAttribute(vertexPackage, typedArray, instanceDivisor) {
-        var vertexAttributes = vertexPackage.vertexAttributes;
-        var attrLocation = vertexPackage.attrLocation;
-        var len = vertexAttributes.length;
-        var attrName = instanceDivisor === 1 ? 'instanceId' : 'batchId';
-        attrLocation[attrName] = len;
-        vertexAttributes.push({
-            index: len,
-            typedArray: typedArray,
-            componentsPerAttribute: 1,
-            componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-            offsetInBytes: 0,
-            strideInBytes: 0,
-            instanceDivisor: instanceDivisor
-        });
-    }
-
-    var LEFT_16 = 65536;
-    function loadSelectionInfo(selectionInfoBuffer, view, dataViewByteOffset, geoPackage) {
-        var bufferByteOffset = 0;
-        var typedArray = selectionInfoBuffer;
-        var nGeometryCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-        for (var i = 0; i < nGeometryCount; i++) {
-            // S3MB头名字长度
-            var result = loadString(view, dataViewByteOffset, typedArray, bufferByteOffset);
-            var strGeometryName = result.string;
-            bufferByteOffset = result.bytesOffset;
-            var nSelectInfoCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-            bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var pickInfo = {};
-            geoPackage[strGeometryName].pickInfo = pickInfo;
-            // 非实例化的选择信息
-            var bInstanced = geoPackage[strGeometryName].vertexPackage.instanceIndex;
-            if (bInstanced == -1) {
-                var batchIds = new Float32Array(geoPackage[strGeometryName].vertexPackage.verticesCount);
-                for (var j = 0; j < nSelectInfoCount; j++) {
-                    var nDictID = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-                    bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    var nSize = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-                    bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    var vertexCount = 0, vertexColorOffset = 0;
-                    pickInfo[nDictID] = {
-                        batchId: j
-                    };
-                    for (var k = 0; k < nSize; k++) {
-                        vertexColorOffset = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-                        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                        vertexCount = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-                        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                        arrayFill.arrayFill(batchIds, j, vertexColorOffset, vertexColorOffset + vertexCount);
-                    }
-
-                    pickInfo[nDictID].vertexColorOffset = vertexColorOffset;
-                    pickInfo[nDictID].vertexCount = vertexCount;
-                }
-                createBatchIdAttribute(geoPackage[strGeometryName].vertexPackage, batchIds, undefined);
-            }
-            else {
-                var instanceCount = geoPackage[strGeometryName].vertexPackage.instanceCount;
-                var instanceArray = geoPackage[strGeometryName].vertexPackage.instanceBuffer;
-                var instanceMode = geoPackage[strGeometryName].vertexPackage.instanceMode;
-                var instanceIds = new Float32Array(instanceCount);
-                for (var j = 0; j < nSelectInfoCount; j++) {
-                    var nDictID = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-                    bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    var nSize = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-                    bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    for (var k = 0; k < nSize; k++) {
-                        var instanceId = view.getUint32(bufferByteOffset + dataViewByteOffset, true);
-                        bufferByteOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    }
-                }
-
-                var beginOffset = instanceMode === 17 ? 16 : 28;
-                beginOffset *= Float32Array.BYTES_PER_ELEMENT;
-                for (j = 0; j < instanceCount; j++) {
-                    instanceIds[j] = j;
-                    var offset = j * instanceMode * Float32Array.BYTES_PER_ELEMENT + beginOffset;
-                    Color.Color.unpack(instanceArray, offset, colorScratch);
-                    var pickId = colorScratch.red + colorScratch.green * 256 + colorScratch.blue * LEFT_16;
-                    if (pickInfo[pickId] === undefined) {
-                        pickInfo[pickId] = {
-                            vertexColorCount: 1,
-                            instanceIds: [],
-                            vertexColorOffset: j
-                        };
-                    }
-
-                    pickInfo[pickId].instanceIds.push(j);
-                }
-
-                createBatchIdAttribute(geoPackage[strGeometryName].vertexPackage, instanceIds, 1);
-            }
-        }
-    }
-
-    function OGDCIS0(x) {
-        return (((x) < 1e-10) && ((x) > -1e-10));
-    }
-
-    function unzipWithwasm(datazip, unzipSize) {
-        var unzipsize = unzipSize || datazip.length * 4;//unzipSize;//
-        var offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize); //开辟内存
-        var tar = new Uint8Array(unzipsize);
-        unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
-        var offset1 = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * datazip.length);
-        unzip.unzip.HEAPU8.set(datazip, offset1 / Uint8Array.BYTES_PER_ELEMENT);
-        
-        var resultLen;
-        while ((resultLen = unzipwasm(offset, unzipsize, offset1, datazip.length)) == 0) {
-            freec(offset); //释放内存
-            unzipsize *= 4;
-            offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize);
-            tar = new Uint8Array(unzipsize);
-            unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
-        }
-        var res = new Uint8Array(unzip.unzip.HEAPU8.buffer, offset, resultLen);
-        datazip = null;
-        tar = null;
-        var buffer = new Uint8Array(res).buffer;
-        freec(offset);
-        freec(offset1);
-        return buffer;
-    }
-
-    function parseBuffer(oriBuffer, totalByteLength, bytesOffset, rootMap, ancestorMap, isRoot, childGroup, transferableObjects) {
-        var createEdge = false;
-        var supportCompressType = 1;
-        var fileType = 1;
-        var view = new DataView(oriBuffer);
-        var typedArray = new Uint8Array(oriBuffer);
-        var len = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var name = S3MCompressType.getStringFromTypedArray(typedArray, bytesOffset, len);
-        name = name.replace(/(\.s3mblock)|(\.s3mbz)|(\.s3mb)/gi, '');
-        bytesOffset += len;
-
-        var pagelodCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        for(var i = 0;i < pagelodCount;i++){
-            var pageLOD = {};
-            var dbDis = view.getFloat32(bytesOffset, true);
-            bytesOffset += Float32Array.BYTES_PER_ELEMENT;
-            var uRangeMode = view.getUint16(bytesOffset, true);
-            bytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-            pageLOD.rangeMode = uRangeMode;
-            pageLOD.rangeList = dbDis;
-
-            var boundingSphereCenter = {};
-            boundingSphereCenter.x = view.getFloat64(bytesOffset, true);
-            bytesOffset += Float64Array.BYTES_PER_ELEMENT;
-            boundingSphereCenter.y = view.getFloat64(bytesOffset, true);
-            bytesOffset += Float64Array.BYTES_PER_ELEMENT;
-            boundingSphereCenter.z = view.getFloat64(bytesOffset, true);
-            bytesOffset += Float64Array.BYTES_PER_ELEMENT;
-            var radius = view.getFloat64(bytesOffset, true);
-            bytesOffset += Float64Array.BYTES_PER_ELEMENT;
-            pageLOD.boundingSphere = {
-                center : boundingSphereCenter,
-                radius : radius
-            };
-
-            len = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-
-            var childTileName = S3MCompressType.getStringFromTypedArray(typedArray, bytesOffset, len);
-            bytesOffset += len;
-
-            childTileName = childTileName.replace(/(\.s3mblock)|(\.s3mbz)|(\.s3mb)/gi, '');
-            childTileName = removeUnusedStringTileName(childTileName);
-            pageLOD.childTile = childTileName;
-        }
-
-        var geoPackage = {};
-
-        var version = view.getFloat32(bytesOffset, true);
-        bytesOffset += Float32Array.BYTES_PER_ELEMENT;
-        var isOldVersion = false;
-
-        var unzipByteSize = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var byteSize = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var datazip = new Uint8Array(oriBuffer, bytesOffset, byteSize);
-
-        var oriOffset = bytesOffset + byteSize;
-        var buffer = pako_inflate.pako.inflate(datazip).buffer;
-
-        transferableObjects.push(buffer);
-        view = new DataView(buffer);
-        var typedArray = new Uint8Array(buffer);
-        bytesOffset = 0;
-
-        var nOptions = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-
-        // load Shell
-        var loadStreamResult = loadStream(view, buffer, bytesOffset);
-        var shellBuffer = loadStreamResult.buffer;
-        bytesOffset = loadStreamResult.byteOffset;
-        var groupNode = loadShellEntites(shellBuffer, view, loadStreamResult.dataViewByteOffset);
-        var align = bytesOffset % 4;
-        if (align !== 0) {
-            bytesOffset += (4 - align);
-        }
-
-        // load skeleton
-        loadStreamResult = loadStream(view, buffer, bytesOffset);
-        var skeletonBuffer = loadStreamResult.buffer;
-        loadSkeletonEntities(skeletonBuffer, view, loadStreamResult.dataViewByteOffset, createEdge, geoPackage, isOldVersion);
-        bytesOffset = loadStreamResult.byteOffset;
-
-        // load secondColor
-        loadStreamResult = loadStream(view, buffer, bytesOffset);
-        var secondColorBuffer = loadStreamResult.buffer;
-        bytesOffset = loadStreamResult.byteOffset;
-
-        // load textureData
-        loadStreamResult = loadStream(view, buffer, bytesOffset);
-        var textureDataBuffer = loadStreamResult.buffer;
-        var texturePackage = {};
-        loadTextureEntitiesForBlock(geoPackage, rootMap, ancestorMap, isRoot, supportCompressType, textureDataBuffer, view, loadStreamResult.dataViewByteOffset, texturePackage, transferableObjects);
-        bytesOffset = loadStreamResult.byteOffset;
-
-        var strJsonMaterialsLength = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var materialBuffer = typedArray.subarray(bytesOffset, bytesOffset + strJsonMaterialsLength);
-        var strJsonMaterials = S3MCompressType.getStringFromTypedArray(materialBuffer);
-        bytesOffset += strJsonMaterialsLength;
-        var matrialObj = JSON.parse(strJsonMaterials);
-
-        var bHasSelectionInfo = (nOptions & S3MBVertexOptions.SVO_HasInstSelInfo) == S3MBVertexOptions.SVO_HasInstSelInfo;
-        if (bHasSelectionInfo) {
-            loadStreamResult = loadStream(view, buffer, bytesOffset);
-            var selectionInfoBuffer = loadStreamResult.buffer;
-            loadSelectionInfo(selectionInfoBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage);
-            bytesOffset = loadStreamResult.byteOffset;
-        }
-
-
-        var pagelodList = groupNode.pageLods;
-        var isLeafNode = true;
-        for (var i = 0; i < pagelodList.length; i++) {
-            var pagelodNode = pagelodList[i];
-            isLeafNode = pagelodNode.childTile === '';
-
-            var geodeList = pagelodNode.geodes;
-            for (var m = 0; m < geodeList.length; m++) {
-                var geodeNode = geodeList[m];
-                var skeletonNames = geodeNode.skeletonNames;
-                for (var n = 0; n < skeletonNames.length; n++) {
-                    var geoName = skeletonNames[n];
-                    if (isLeafNode) {
-                        var geo = geoPackage[geoName];
-                        var vertexPackage = geo.vertexPackage;
-                        vertexPackage.boundingSphere = S3MCompressType.S3MVertexPackage.calcBoundingSphereInWorker(fileType, vertexPackage);
-                    }
-                }
-            }
-        }
-
-        childGroup[name] = {
-            result: true,
-            groupNode: groupNode,
-            geoPackage: geoPackage,
-            matrials: matrialObj,
-            texturePackage: texturePackage,
-            version: S3MVersion.S3M4,
-            rootBatchIdMap : rootMap,
-            ancestorMap : ancestorMap
-        };
-
-        if(oriOffset < totalByteLength){
-            parseBuffer(oriBuffer, totalByteLength, oriOffset, rootMap, ancestorMap, false, childGroup, transferableObjects);
-        }
-    }
-
-    function parseS3MB(parameters, transferableObjects) {
-        var buffer = parameters.buffer;
-        var bZip = parameters.isS3MZ;
-        var fileType = parameters.fileType;
-        var createEdge = parameters.createEdge;
-        var supportCompressType = parameters.supportCompressType;
-        var bVolume = parameters.bVolume;//是否是体渲染数据;
-        var bound3D = null;
-        var volBounds = null;
-        var volImageBuffer = null;
-        if(bVolume){
-            if(parameters.volbuffer.byteLength < 8){
-                bVolume = false;
-            }
-        }
-        if(bVolume){
-            var volData = parameters.volbuffer;
-            var dataZip = new Uint8Array(volData,8);
-            var volumeBuffer = pako_inflate.pako.inflate(dataZip).buffer;
-            var volVersion = new Float64Array(volumeBuffer,0,1);
-            var volFormat = new Uint32Array(volumeBuffer,48,1);
-
-            if(volVersion[0] === 0.0 || volFormat[0] === 3200 || volFormat[0] === 3201){
-                var nHeaderOffset = 0;
-                if(volVersion[0] == 0.0){
-                    nHeaderOffset = 8;
-                }
-
-                transferableObjects.push(volumeBuffer);
-                var boundsArray = new Float64Array(volumeBuffer, nHeaderOffset, 6);
-                var left = boundsArray[0];
-                var top = boundsArray[1];
-                var right = boundsArray[2];
-                var bottom = boundsArray[3];
-                var minHeight = boundsArray[4] < boundsArray[5] ? boundsArray[4] : boundsArray[5];
-                var maxHeight = boundsArray[4] > boundsArray[5] ? boundsArray[4] : boundsArray[5];
-                bound3D = new Bound3D(left, bottom, right, top, minHeight, maxHeight);
-
-                volBounds = {
-                    left: left,
-                    top: top,
-                    right: right,
-                    bottom: bottom,
-                    minHeight: minHeight,
-                    maxHeight: maxHeight,
-                    width: bound3D.width,
-                    length: bound3D.length,
-                    height: bound3D.height
-                };
-
-                // 中间空出来
-                var infoVolume = new Uint32Array(volumeBuffer, 48 + nHeaderOffset, 7);
-                var nFormat = infoVolume[0];
-                var nSideBlockCount = infoVolume[1];
-                var nBlockLength = infoVolume[2];
-                var nLength = infoVolume[3];
-                var nWidth = infoVolume[4];
-                var nHeight = infoVolume[5];
-                var nDepth = infoVolume[6];
-                var nCount = nLength * nLength * 4;
-                var image = new Uint8Array(volumeBuffer, 76 + nHeaderOffset, nCount);
-                volImageBuffer = {
-                    nFormat: nFormat,
-                    nSideBlockCount: nSideBlockCount,
-                    nBlockLength: nBlockLength,
-                    nLength: nLength,
-                    nWidth: nWidth,
-                    nHeight: nHeight,
-                    nDepth: nDepth,
-                    imageArray: image
-                };
-            }
-        }
-        var bytesOffset = 0;
-        var geoPackage = {};
-        geoPackage.ignoreNormal = parameters.ignoreNormal;
-        var rootMap = parameters.rootBatchIdMap || {};
-        var ancesotrMap = parameters.ancestorMap || {};
-        var childGroup = {};
-
-        var view = new DataView(buffer);
-        var version = view.getFloat32(bytesOffset, true);
-        bytesOffset += Float32Array.BYTES_PER_ELEMENT;
-        if(version > 2.0 && version < 2.2){
-            var count = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var totalByteLength = buffer.byteLength;
-            parseBuffer(buffer, totalByteLength, bytesOffset, rootMap, ancesotrMap, parameters.isRoot, childGroup, transferableObjects);
-            return childGroup;
-        }
-        var isOldVersion = false;
-        var unzipSize;
-        if (version === 2) {
-            unzipSize = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        }
-        if (OGDCIS0(version - 1) || OGDCIS0(version - 2)) {
-            //总字节大小
-            var byteSize = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var datazip = new Uint8Array(buffer, bytesOffset, byteSize);
-
-            if (unzipwasmReady === true) {
-                buffer = unzipWithwasm(datazip, unzipSize);
-            } else {
-                buffer = pako_inflate.pako.inflate(datazip).buffer;
-            }
-
-            transferableObjects.push(buffer);
-            view = new DataView(buffer);
-            bytesOffset = 0;
-        }
-        // 不zip压缩的解析性能,测试用
-        else if (version > 1.199 && version < 1.201) {
-            var byteSize = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            transferableObjects.push(buffer);
-        }
-        else {
-            //老版本的s3mb缓存,解析方式跟UGC保持一致
-            isOldVersion = true;
-            bytesOffset = 0;
-            var byteSize = view.getInt32(bytesOffset, true);
-            bytesOffset += Int32Array.BYTES_PER_ELEMENT;
-            bytesOffset += Uint8Array.BYTES_PER_ELEMENT * byteSize;
-
-            if (bZip) {
-                var zipSize = view.getUint32(bytesOffset, true);
-                bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-                var dataZip = new Uint8Array(buffer, bytesOffset);
-                buffer = pako_inflate.pako.inflate(dataZip).buffer;
-                transferableObjects.push(buffer);
-                view = new DataView(buffer);
-                bytesOffset = 0;
-            }
-        }
-
-        var nOptions = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-
-        // load Shell
-        var loadStreamResult = loadStream(view, buffer, bytesOffset);
-        var shellBuffer = loadStreamResult.buffer;
-        bytesOffset = loadStreamResult.byteOffset;
-        var groupNode = loadShellEntites(shellBuffer, view, loadStreamResult.dataViewByteOffset);
-        var align = bytesOffset % 4;
-        if (align !== 0) {
-            bytesOffset += (4 - align);
-        }
-
-        // load skeleton
-        loadStreamResult = loadStream(view, buffer, bytesOffset);
-        var skeletonBuffer = loadStreamResult.buffer;
-        loadSkeletonEntities(skeletonBuffer, view, loadStreamResult.dataViewByteOffset, createEdge, geoPackage, isOldVersion, transferableObjects);
-        bytesOffset = loadStreamResult.byteOffset;
-
-        // load secondColor
-        loadStreamResult = loadStream(view, buffer, bytesOffset);
-        var secondColorBuffer = loadStreamResult.buffer;
-        bytesOffset = loadStreamResult.byteOffset;
-
-        // load textureData
-        loadStreamResult = loadStream(view, buffer, bytesOffset);
-        var textureDataBuffer = loadStreamResult.buffer;
-        var texturePackage = {};
-        loadTextureEntities(supportCompressType, textureDataBuffer, view, loadStreamResult.dataViewByteOffset, texturePackage, transferableObjects);
-        bytesOffset = loadStreamResult.byteOffset;
-
-        var strJsonMaterialsLength = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var typedArray = new Uint8Array(buffer);
-        var materialBuffer = typedArray.subarray(bytesOffset, bytesOffset + strJsonMaterialsLength);
-        var strJsonMaterials = S3MCompressType.getStringFromTypedArray(materialBuffer);
-        bytesOffset += strJsonMaterialsLength;
-        var matrialObj = JSON.parse(strJsonMaterials);
-
-        var bHasSelectionInfo = (nOptions & S3MBVertexOptions.SVO_HasInstSelInfo) == S3MBVertexOptions.SVO_HasInstSelInfo;
-        if (bHasSelectionInfo) {
-            loadStreamResult = loadStream(view, buffer, bytesOffset);
-            var selectionInfoBuffer = loadStreamResult.buffer;
-            loadSelectionInfo(selectionInfoBuffer, view, loadStreamResult.dataViewByteOffset, geoPackage);
-        }
-
-
-        var pagelodList = groupNode.pageLods;
-        var isLeafNode = true;
-        for (var i = 0; i < pagelodList.length; i++) {
-            var pagelodNode = pagelodList[i];
-            isLeafNode = pagelodNode.childTile === '';
-
-            var geodeList = pagelodNode.geodes;
-            for (var m = 0; m < geodeList.length; m++) {
-                var geodeNode = geodeList[m];
-                var skeletonNames = geodeNode.skeletonNames;
-                for (var n = 0; n < skeletonNames.length; n++) {
-                    var geoName = skeletonNames[n];
-                    if (isLeafNode) {
-                        var geo = geoPackage[geoName];
-                        var vertexPackage = geo.vertexPackage;
-                        vertexPackage.boundingSphere = S3MCompressType.S3MVertexPackage.calcBoundingSphereInWorker(fileType, vertexPackage);
-                    }
-                }
-            }
-        }
-
-        return {
-            result: true,
-            groupNode: groupNode,
-            geoPackage: geoPackage,
-            matrials: matrialObj,
-            texturePackage: texturePackage,
-            version: S3MVersion.S3M4,
-            volImageBuffer:volImageBuffer,
-            volBounds:volBounds
-        };
-    }
-
-    function initWorker() {
-        if(when.defined(crunch) && when.defined(dracoLib)){
-            crunch.onRuntimeInitialized = function () {
-                crunchInitialized = true;
-            };
-
-            self.onmessage = createTaskProcessorWorker(parseS3MB);
-            self.postMessage(true);
-        }
-    }
-
-    function S3MBTilesParser(event) {
-        var data = event.data;
-
-        // Expect the first message to be to load a web assembly module
-        var wasmConfig = data.webAssemblyConfig;
-        if (when.defined(wasmConfig)) {
-            if (FeatureDetection.FeatureDetection.isInternetExplorer()) {
-                return require([buildModuleUrl.buildModuleUrl('ThirdParty/Workers/ie-webworker-promise-polyfill.js')], function (e) {
-                    self.Promise = e;
-                    if(wasmConfig.modulePath.indexOf('crunch') !== -1){
-                        return require([wasmConfig.modulePath], function (crnModule) {
-                            if (when.defined(wasmConfig.wasmBinaryFile)) {
-                                if (!when.defined(crnModule)) {
-                                    crnModule = self.Module;
-                                }
-                                crunch = crnModule;
-                                initWorker();
-                            } else {
-                                crunch = crnModule;
-                                initWorker();
-                            }
-                        });
-                    }
-
-                    return require([wasmConfig.modulePath], function (dracoModule) {
-                        if (when.defined(wasmConfig.wasmBinaryFile)) {
-                            if (!when.defined(dracoModule)) {
-                                dracoModule = self.DracoDecoderModule;
-                            }
-
-                            dracoModule(wasmConfig).then(function (compiledModule) {
-                                dracoLib = compiledModule;
-                                initWorker();
-                            });
-                        } else {
-                            dracoLib = dracoModule();
-                            initWorker();
-                        }
-                    });
-                });
-            }
-            // Require and compile WebAssembly module, or use fallback if not supported
-            if(wasmConfig.modulePath.indexOf('crunch') !== -1){
-                return require([wasmConfig.modulePath], function (crnModule) {
-                    if (when.defined(wasmConfig.wasmBinaryFile)) {
-                        if (!when.defined(crnModule)) {
-                            crnModule = self.Module;
-                        }
-                        crunch = crnModule;
-                        initWorker();
-                    } else {
-                        crunch = crnModule;
-                        initWorker();
-                    }
-                });
-            }
-
-            return require([wasmConfig.modulePath], function (dracoModule) {
-                if (when.defined(wasmConfig.wasmBinaryFile)) {
-                    if (!when.defined(dracoModule)) {
-                        dracoModule = self.DracoDecoderModule;
-                    }
-
-                    dracoModule(wasmConfig).then(function (compiledModule) {
-                        dracoLib = compiledModule;
-                        initWorker();
-                    });
-                } else {
-                    dracoLib = dracoModule();
-                    initWorker();
-                }
-            });
-        }
-    }
-    //export default createTaskProcessorWorker(S3MBTilesParser);
-
-    return S3MBTilesParser;
-
-});
diff --git a/public/libs/Cesium/Workers/S3MCompressType-ab31efd1.js b/public/libs/Cesium/Workers/S3MCompressType-ab31efd1.js
deleted file mode 100644
index 09a827b..0000000
--- a/public/libs/Cesium/Workers/S3MCompressType-ab31efd1.js
+++ /dev/null
@@ -1,2329 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './PrimitiveType-97893bc7', './IndexDatatype-9435b55f', './BoundingRectangle-dc808c42'], function (exports, when, Check, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, PrimitiveType, IndexDatatype, BoundingRectangle) { 'use strict';
-
-    /**
-         * @private
-         */
-        function getStringFromTypedArray(uint8Array, byteOffset, byteLength, codeType) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(uint8Array)) {
-                throw new Check.DeveloperError('uint8Array is required.');
-            }
-            if (byteOffset < 0) {
-                throw new Check.DeveloperError('byteOffset cannot be negative.');
-            }
-            if (byteLength < 0) {
-                throw new Check.DeveloperError('byteLength cannot be negative.');
-            }
-            if ((byteOffset + byteLength) > uint8Array.byteLength) {
-                throw new Check.DeveloperError('sub-region exceeds array bounds.');
-            }
-            //>>includeEnd('debug');
-
-            byteOffset = when.defaultValue(byteOffset, 0);
-            byteLength = when.defaultValue(byteLength, uint8Array.byteLength - byteOffset);
-            codeType = when.defaultValue(codeType, 'utf-8');
-
-            uint8Array = uint8Array.subarray(byteOffset, byteOffset + byteLength);
-
-            return getStringFromTypedArray.decode(uint8Array, codeType);
-        }
-
-        // Exposed functions for testing
-        getStringFromTypedArray.decodeWithTextDecoder = function(view, codeType) {
-            var decoder = new TextDecoder(codeType);
-            return decoder.decode(view);
-        };
-
-        getStringFromTypedArray.decodeWithFromCharCode = function(view) {
-            var result = '';
-            var codePoints = utf8Handler(view);
-            var length = codePoints.length;
-            for (var i = 0; i < length; ++i) {
-                var cp = codePoints[i];
-                if (cp <= 0xFFFF) {
-                    result += String.fromCharCode(cp);
-                } else {
-                    cp -= 0x10000;
-                    result += String.fromCharCode((cp >> 10) + 0xD800,
-                        (cp & 0x3FF) + 0xDC00);
-                }
-
-            }
-            return result;
-        };
-
-        function inRange(a, min, max) {
-            return min <= a && a <= max;
-        }
-
-        // This code is inspired by public domain code found here: https://github.com/inexorabletash/text-encoding
-        function utf8Handler(utfBytes) {
-            var codePoint = 0;
-            var bytesSeen = 0;
-            var bytesNeeded = 0;
-            var lowerBoundary = 0x80;
-            var upperBoundary = 0xBF;
-
-            var codePoints = [];
-            var length = utfBytes.length;
-            for (var i = 0; i < length; ++i) {
-                var currentByte = utfBytes[i];
-
-                // If bytesNeeded = 0, then we are starting a new character
-                if (bytesNeeded === 0) {
-                    // 1 Byte Ascii character
-                    if (inRange(currentByte, 0x00, 0x7F)) {
-                        // Return a code point whose value is byte.
-                        codePoints.push(currentByte);
-                        continue;
-                    }
-
-                    // 2 Byte character
-                    if (inRange(currentByte, 0xC2, 0xDF)) {
-                        bytesNeeded = 1;
-                        codePoint = currentByte & 0x1F;
-                        continue;
-                    }
-
-                    // 3 Byte character
-                    if (inRange(currentByte, 0xE0, 0xEF)) {
-                        // If byte is 0xE0, set utf-8 lower boundary to 0xA0.
-                        if (currentByte === 0xE0) {
-                            lowerBoundary = 0xA0;
-                        }
-                        // If byte is 0xED, set utf-8 upper boundary to 0x9F.
-                        if (currentByte === 0xED) {
-                            upperBoundary = 0x9F;
-                        }
-
-                        bytesNeeded = 2;
-                        codePoint = currentByte & 0xF;
-                        continue;
-                    }
-
-                    // 4 Byte character
-                    if (inRange(currentByte, 0xF0, 0xF4)) {
-                        // If byte is 0xF0, set utf-8 lower boundary to 0x90.
-                        if (currentByte === 0xF0) {
-                            lowerBoundary = 0x90;
-                        }
-                        // If byte is 0xF4, set utf-8 upper boundary to 0x8F.
-                        if (currentByte === 0xF4) {
-                            upperBoundary = 0x8F;
-                        }
-
-                        bytesNeeded = 3;
-                        codePoint = currentByte & 0x7;
-                        continue;
-                    }
-
-                    throw new RuntimeError.RuntimeError('String decoding failed.');
-                }
-
-                // Out of range, so ignore the first part(s) of the character and continue with this byte on its own
-                if (!inRange(currentByte, lowerBoundary, upperBoundary)) {
-                    codePoint = bytesNeeded = bytesSeen = 0;
-                    lowerBoundary = 0x80;
-                    upperBoundary = 0xBF;
-                    --i;
-                    continue;
-                }
-
-                // Set appropriate boundaries, since we've now checked byte 2 of a potential longer character
-                lowerBoundary = 0x80;
-                upperBoundary = 0xBF;
-
-                // Add byte to code point
-                codePoint = (codePoint << 6) | (currentByte & 0x3F);
-
-                // We have the correct number of bytes, so push and reset for next character
-                ++bytesSeen;
-                if (bytesSeen === bytesNeeded) {
-                    codePoints.push(codePoint);
-                    codePoint = bytesNeeded = bytesSeen = 0;
-                }
-            }
-
-            return codePoints;
-        }
-
-        if (typeof TextDecoder !== 'undefined') {
-            getStringFromTypedArray.decode = getStringFromTypedArray.decodeWithTextDecoder;
-        } else {
-            getStringFromTypedArray.decode = getStringFromTypedArray.decodeWithFromCharCode;
-        }
-
-    /**
-     * S3M像素格式
-     * @export S3MPixelFormat
-     */
-    var S3MPixelFormat = {
-        /**
-         * 8位像素,代表亮度
-         */
-        LUMINANCE_8 : 1,
-        /**
-         * 16位像素,代表亮度
-         */
-        LUMINANCE_16 : 2,
-        /**
-         * 8位像素,代表透明度
-         */
-        ALPHA : 3,
-        /**
-         * 8位像素,4位透明度4位亮度
-         */
-        ALPHA_4_LUMINANCE_4 : 4,
-        /**
-         * 16位像素,8位亮度8位透明度
-         */
-        LUMINANCE_ALPHA : 5,
-        /**
-         * 16位像素,R G B各为5 6 5
-         */
-        RGB_565 : 6,
-        /**
-         * 16位像素,B G R各为5 6 5
-         */
-        BGR565 : 7,
-        /**
-         * 24位像素,R G B各为8 8 8
-         */
-        RGB : 10,
-        /**
-         * 24位像素, B G R各为8 8 8
-         */
-        BGR : 11,
-        /**
-         * 32位像素,A R G B 各为8 8 8 8
-         */
-        ARGB : 12,
-        /**
-         * 32位像素,A B G R 各为8 8 8 8
-         */
-        ABGR : 13,
-        /**
-         * 32位像素,B G R A 各为8 8 8 8
-         */
-        BGRA : 14,
-        /**
-         * 32位像素,R G B A 各为8 8 8 8
-         */
-        WEBP : 25,
-        RGBA : 28,
-        DXT1 : 17,
-        DXT2 : 18,
-        DXT3 : 19,
-        DXT4 : 20,
-        DXT5 : 21,
-        CRN_DXT5 : 26
-    };
-
-    var S3MPixelFormat$1 = Object.freeze(S3MPixelFormat);
-
-    //! Use DXT1 compression.
-    var kDxt1 = ( 1 << 0 );
-
-    //! Use DXT3 compression.
-    var kDxt3 = ( 1 << 1 );
-
-    //! Use DXT5 compression.
-    var kDxt5 = ( 1 << 2 );
-
-    var krgb565 = ( 1 << 5 );
-
-    function Unpack565(packed0, packed1, colour, offset) {
-        var value = packed0 | (packed1 << 8);
-
-        var red = (value >> 11) & 0x1f;
-        var green = (value >> 5) & 0x3f;
-        var blue = value & 0x1f;
-
-        colour[offset + 0] = ( red << 3 ) | ( red >> 2 );
-        colour[offset + 1] = ( green << 2 ) | ( green >> 4 );
-        colour[offset + 2] = ( blue << 3 ) | ( blue >> 2 );
-        colour[offset + 3] = 255;
-
-        return value;
-    }
-
-    function DecompressColour(rgba, block, nOffset, isDxt1) {
-        var codes = new Uint8Array(16);
-
-        var a = Unpack565(block[nOffset + 0], block[nOffset + 1], codes, 0);
-        var b = Unpack565(block[nOffset + 2], block[nOffset + 3], codes, 4);
-
-        for (var i = 0; i < 3; i++) {
-            var c = codes[i];
-            var d = codes[4 + i];
-
-            if (isDxt1 && a <= b) {
-                codes[8 + i] = ( c + d ) / 2;
-                codes[12 + i] = 0;
-            }
-            else {
-                codes[8 + i] = ( 2 * c + d ) / 3;
-                codes[12 + i] = ( c + 2 * d ) / 3;
-            }
-        }
-
-        codes[8 + 3] = 255;
-        codes[12 + 3] = ( isDxt1 && a <= b ) ? 0 : 255;
-
-        var indices = new Uint8Array(16);
-        for (var i = 0; i < 4; ++i) {
-            var packed = block[nOffset + 4 + i];
-
-            indices[4 * i + 0] = packed & 0x3;
-            indices[4 * i + 1] = ( packed >> 2 ) & 0x3;
-            indices[4 * i + 2] = ( packed >> 4 ) & 0x3;
-            indices[4 * i + 3] = ( packed >> 6 ) & 0x3;
-        }
-
-        for (var i = 0; i < 16; ++i) {
-            var offset = 4 * indices[i];
-            for (var j = 0; j < 4; ++j)
-                rgba[4 * i + j] = codes[offset + j];
-        }
-
-    }
-
-    function DecompressAlphaDxt3(rgba, block, nOffset) {
-        // unpack the alpha values pairwise
-        for (var i = 0; i < 8; ++i) {
-            // quantise down to 4 bits
-            var quant = bytes[nOffset + i];
-
-            // unpack the values
-            var lo = quant & 0x0f;
-            var hi = quant & 0xf0;
-
-            // convert back up to bytes
-            rgba[8 * i + 3] = lo | ( lo << 4 );
-            rgba[8 * i + 7] = hi | ( hi >> 4 );
-        }
-    }
-
-    function DecompressAlphaDxt5(rgba, block, nOffset) {
-        var alpha0 = block[nOffset + 0];
-        var alpha1 = block[nOffset + 1];
-
-        var codes = new Uint8Array(8);
-
-        codes[0] = alpha0;
-        codes[1] = alpha1;
-        if (alpha0 <= alpha1) {
-            // use 5-alpha codebook
-            for (var i = 1; i < 5; ++i)
-                codes[1 + i] = ( ( 5 - i ) * alpha0 + i * alpha1 ) / 5;
-            codes[6] = 0;
-            codes[7] = 255;
-        }
-        else {
-            // use 7-alpha codebook
-            for (var i = 1; i < 7; ++i)
-                codes[1 + i] = ( ( 7 - i ) * alpha0 + i * alpha1 ) / 7;
-        }
-
-        var indices = new Uint8Array(16);
-        var nOffset = nOffset + 2;
-        var nBegin = 0;
-        for (var i = 0; i < 2; ++i) {
-            // grab 3 bytes
-            var value = 0;
-            for (var j = 0; j < 3; ++j) {
-                var byte = block[nOffset++];
-                value |= ( byte << 8 * j );
-            }
-
-            // unpack 8 3-bit values from it
-            for (var j = 0; j < 8; ++j) {
-                var index = ( value >> 3 * j ) & 0x7;
-                indices[nBegin++] = index;
-            }
-        }
-
-        for (var i = 0; i < 16; ++i)
-            rgba[4 * i + 3] = codes[indices[i]];
-    }
-
-    function Decompress(rgba, block, nOffset, flags) {
-        var nOffset2 = 0;
-        if (( flags & ( kDxt3 | kDxt5 ) ) != 0)
-            nOffset2 = 8;
-
-        DecompressColour(rgba, block, nOffset + nOffset2, ( flags & kDxt1 ) != 0);
-
-        if (( flags & kDxt3 ) != 0) {
-            DecompressAlphaDxt3(rgba, block, nOffset);
-        }
-        else if (( flags & kDxt5 ) != 0) {
-            DecompressAlphaDxt5(rgba, block, nOffset);
-        }
-    }
-
-    function DecompressImage565(rgb565, width, height, blocks) {
-        var c = new Uint16Array(4);
-        var dst = rgb565;
-        var m = 0;
-        var dstI = 0;
-        var i = 0;
-        var r0 = 0, g0 = 0, b0 = 0, r1 = 0, g1 = 0, b1 = 0;
-
-        var blockWidth = width / 4;
-        var blockHeight = height / 4;
-        for (var blockY = 0; blockY < blockHeight; blockY++) {
-            for (var blockX = 0; blockX < blockWidth; blockX++) {
-                i = 4 * ((blockHeight - blockY) * blockWidth + blockX);
-                c[0] = blocks[i];
-                c[1] = blocks[i + 1];
-                r0 = c[0] & 0x1f;
-                g0 = c[0] & 0x7e0;
-                b0 = c[0] & 0xf800;
-                r1 = c[1] & 0x1f;
-                g1 = c[1] & 0x7e0;
-                b1 = c[1] & 0xf800;
-                // Interpolate between c0 and c1 to get c2 and c3.    ~
-                // Note that we approximate 1/3 as 3/8 and 2/3 as 5/8 for
-                // speed.  This also appears to be what the hardware DXT
-                // decoder in many GPUs does :)
-                c[2] = ((5 * r0 + 3 * r1) >> 3)
-                    | (((5 * g0 + 3 * g1) >> 3) & 0x7e0)
-                    | (((5 * b0 + 3 * b1) >> 3) & 0xf800);
-                c[3] = ((5 * r1 + 3 * r0) >> 3)
-                    | (((5 * g1 + 3 * g0) >> 3) & 0x7e0)
-                    | (((5 * b1 + 3 * b0) >> 3) & 0xf800);
-                m = blocks[i + 2];
-                dstI = (blockY * 4) * width + blockX * 4;
-                dst[dstI] = c[m & 0x3];
-                dst[dstI + 1] = c[(m >> 2) & 0x3];
-                dst[dstI + 2] = c[(m >> 4) & 0x3];
-                dst[dstI + 3] = c[(m >> 6) & 0x3];
-                dstI += width;
-                dst[dstI] = c[(m >> 8) & 0x3];
-                dst[dstI + 1] = c[(m >> 10) & 0x3];
-                dst[dstI + 2] = c[(m >> 12) & 0x3];
-                dst[dstI + 3] = c[(m >> 14)];
-                m = blocks[i + 3];
-                dstI += width;
-                dst[dstI] = c[m & 0x3];
-                dst[dstI + 1] = c[(m >> 2) & 0x3];
-                dst[dstI + 2] = c[(m >> 4) & 0x3];
-                dst[dstI + 3] = c[(m >> 6) & 0x3];
-                dstI += width;
-                dst[dstI] = c[(m >> 8) & 0x3];
-                dst[dstI + 1] = c[(m >> 10) & 0x3];
-                dst[dstI + 2] = c[(m >> 12) & 0x3];
-                dst[dstI + 3] = c[(m >> 14)];
-            }
-        }
-        return dst;
-    }
-
-    /*! @brief Decompresses an image in memory.
-
-     @param rgba		Storage for the decompressed pixels.
-     @param width	The width of the source image.
-     @param height	The height of the source image.
-     @param blocks	The compressed DXT blocks.
-     @param flags	Compression flags.
-
-     The decompressed pixels will be written as a contiguous array of width*height
-     16 rgba values, with each component as 1 byte each. In memory this is:
-
-     { r1, g1, b1, a1, .... , rn, gn, bn, an } for n = width*height
-
-     The flags parameter should specify either kDxt1, kDxt3 or kDxt5 compression,
-     however, DXT1 will be used by default if none is specified. All other flags
-     are ignored.
-
-     Internally this function calls squish::Decompress for each block.
-     */
-    function DecompressImage(rgba, width, height, blocks, flags) {
-        var bytesPerBlock = ( ( flags & kDxt1 ) != 0 ) ? 8 : 16;
-
-        var nOffset = 0;
-        for (var y = 0; y < height; y += 4) {
-            for (var x = 0; x < width; x += 4) {
-                var targetRgba = new Uint8Array(4 * 16);
-                Decompress(targetRgba, blocks, nOffset, flags);
-
-                var nOffsetTarget = 0;
-                for (var py = 0; py < 4; ++py) {
-                    for (var px = 0; px < 4; ++px) {
-                        var sx = x + px;
-                        var sy = y + py;
-                        if (sx < width && sy < height) {
-                            // flip Y
-                            var nBegin = 4 * ( width * (height - sy) + sx );
-
-                            for (var i = 0; i < 4; ++i) {
-                                rgba[nBegin++] = targetRgba[nOffsetTarget++];
-                            }
-                        }
-                        else {
-                            nOffsetTarget += 4;
-                        }
-                    }
-                }
-
-                // advance
-                nOffset += bytesPerBlock;
-            }
-        }
-    }
-
-    function DXTTextureDecode(options){
-    }
-
-    DXTTextureDecode.decode = function(out, width, height, block, format){
-        if (out == null || block == null || height == 0 || width == 0) {
-            return;
-        }
-        var flags = 0;
-        //有alpha通道,转为RGBA,否则转为rgb565
-        if (format > S3MPixelFormat$1.BGR || format === S3MPixelFormat$1.LUMINANCE_ALPHA) {
-            flags = kDxt5;
-        }
-        else {
-            flags = kDxt1 | krgb565;
-        }
-        if ((flags & kDxt1) && (flags & krgb565)) {
-            DecompressImage565(out, width, height, block);
-        }
-        else {
-            DecompressImage(out, width, height, block, flags);
-        }
-    };
-
-    var VertexCompressOptions = {
-        SVC_Vertex : 1,	// 顶点带压缩
-        SVC_Normal : 2,	// 法线带压缩
-        SVC_VertexColor : 4, // 顶点颜色带压缩
-        SVC_SecondColor	: 8, // 顶点颜色带压缩
-        SVC_TexutreCoord : 16, // 纹理坐标带压缩
-        SVC_TexutreCoordIsW	: 32 // 纹理坐标存储的是W位信息
-    };
-
-    var VertexCompressOption = Object.freeze(VertexCompressOptions);
-
-    var DATAFILETYPE = {
-        OSGBFile : 0,
-        OSGBCacheFile : 1,
-        ClampGroundPolygon : 2,
-        ClampObjectPolygon : 3,
-        ClampGroundLine : 4,
-        ClampObjectLine : 5,
-        IconPoint : 6,
-        Text : 7,
-        PointCloudFile : 8,
-        // 动态拉伸面
-        ExtendRegion3D : 9,
-        ExtendClampPolygonCache : 10,
-
-        PolylineEffect : 11,
-        RegionEffect : 12,
-        ClampGroundAndObjectLineCache : 13,
-        ClampGroundRealtimeRasterCache : 14
-    };
-
-    var DATAFILETYPE$1 = Object.freeze(DATAFILETYPE);
-
-    function S3MVertexPackage() {
-    }
-
-    function calcBoundingSphereForInstance(vertexPackage){
-        var bSphere = new BoundingSphere.BoundingSphere();
-        var bsValues = vertexPackage.instanceBounds;
-        if(!when.defined(bsValues)) {
-            return bSphere;
-        }
-        var pntLU = new Cartographic.Cartesian3(bsValues[0],bsValues[1],bsValues[2]);
-        var pntRD = new Cartographic.Cartesian3(bsValues[3],bsValues[4],bsValues[5]);
-        var center = Cartographic.Cartesian3.lerp(pntLU,pntRD,0.5,new Cartographic.Cartesian3());
-        var radius = Cartographic.Cartesian3.distance(center,pntLU);
-        bSphere.center = center;
-        bSphere.radius = radius;
-        return bSphere;
-    }
-
-    function calcBoundingSphereForNormal(vertexPackage){
-        var bSphere = new BoundingSphere.BoundingSphere();
-        var v1 = new Cartographic.Cartesian3();
-        var positionAttr = vertexPackage.vertexAttributes[0];
-        var dim = positionAttr.componentsPerAttribute;
-        var isCompress = when.defined(vertexPackage.nCompressOptions) && (vertexPackage.nCompressOptions & VertexCompressOption.SVC_Vertex) === VertexCompressOption.SVC_Vertex;
-        var normConstant = 1.0;
-        var minVertex;
-        var vertexTypedArray;
-        if(isCompress){
-            normConstant = vertexPackage.vertCompressConstant;
-            minVertex = new Cartographic.Cartesian3(vertexPackage.minVerticesValue.x, vertexPackage.minVerticesValue.y, vertexPackage.minVerticesValue.z);
-            vertexTypedArray = new Uint16Array(positionAttr.typedArray.buffer, positionAttr.typedArray.byteOffset, positionAttr.typedArray.byteLength / 2);
-        }
-        else{
-            vertexTypedArray = new Float32Array(positionAttr.typedArray.buffer, positionAttr.typedArray.byteOffset, positionAttr.typedArray.byteLength / 4);
-        }
-
-        var vertexArray = [];
-        for(var t = 0; t < vertexPackage.verticesCount; t++){
-            Cartographic.Cartesian3.fromArray(vertexTypedArray, dim * t, v1);
-            if(isCompress){
-                v1 = Cartographic.Cartesian3.multiplyByScalar(v1, normConstant, v1);
-                v1 = Cartographic.Cartesian3.add(v1, minVertex, v1);
-            }
-            vertexArray.push(Cartographic.Cartesian3.clone(v1));
-        }
-        BoundingSphere.BoundingSphere.fromPoints(vertexArray, bSphere);
-        vertexArray.length = 0;
-        return bSphere;
-    }
-
-    function calcBoundingSphereForShadowVolume(vertexPackage){
-        var bSphere = new BoundingSphere.BoundingSphere();
-        var v1 = new Cartographic.Cartesian3();
-        var isCompress = when.defined(vertexPackage.nCompressOptions) && (vertexPackage.nCompressOptions & VertexCompressOption.SVC_Vertex) === VertexCompressOption.SVC_Vertex;
-        var positionAttr = vertexPackage.vertexAttributes[0];
-        var dim = positionAttr.componentsPerAttribute;
-        var vertexTypedArray;
-        var normConstant = 1.0;
-        var minVertex;
-        if(isCompress){
-            normConstant = vertexPackage.vertCompressConstant;
-            minVertex = new Cartographic.Cartesian3(vertexPackage.minVerticesValue.x, vertexPackage.minVerticesValue.y, vertexPackage.minVerticesValue.z);
-            vertexTypedArray = new Uint16Array(positionAttr.typedArray.buffer, positionAttr.typedArray.byteOffset, positionAttr.typedArray.byteLength / 2);
-        }
-        else{
-            vertexTypedArray = new Float32Array(positionAttr.typedArray.buffer, positionAttr.typedArray.byteOffset, positionAttr.typedArray.byteLength / 4);
-        }
-
-        var vertexArray = [];
-        for(var t = 0; t < vertexPackage.verticesCount; t++){
-            Cartographic.Cartesian3.fromArray(vertexTypedArray, dim * t, v1);
-            if(isCompress){
-                v1 = Cartographic.Cartesian3.multiplyByScalar(v1, normConstant, v1);
-                v1 = Cartographic.Cartesian3.add(v1, minVertex, v1);
-            }
-            vertexArray.push(Cartographic.Cartesian3.clone(v1));
-        }
-        BoundingSphere.BoundingSphere.fromPoints(vertexArray, bSphere);
-        vertexArray.length = 0;
-        return bSphere;
-    }
-
-    function calcBoundingRectangleForShadowVolume(vertexPackage){
-        var isCompress = when.defined(vertexPackage.nCompressOptions) && (vertexPackage.nCompressOptions & VertexCompressOption.SVC_Vertex) === VertexCompressOption.SVC_Vertex;
-        var boundingRectangle = new BoundingRectangle.BoundingRectangle();
-        var positionAttr = vertexPackage.vertexAttributes[0];
-        var dim = positionAttr.componentsPerAttribute;
-        var vertexTypedArray;
-        var normConstant = 1.0;
-        var minVertex;
-        if(isCompress){
-            normConstant = vertexPackage.vertCompressConstant;
-            minVertex = new Cartographic.Cartesian3(vertexPackage.minVerticesValue.x, vertexPackage.minVerticesValue.y, vertexPackage.minVerticesValue.z);
-            vertexTypedArray = new Uint16Array(positionAttr.typedArray.buffer, positionAttr.typedArray.byteOffset, positionAttr.typedArray.byteLength / 2);
-        }
-        else{
-            vertexTypedArray = new Float32Array(positionAttr.typedArray.buffer, positionAttr.typedArray.byteOffset, positionAttr.typedArray.byteLength / 4);
-        }
-        var vertexArray = [];
-        for(var t = 0; t < vertexPackage.verticesCount; t++){
-            var x = vertexTypedArray[dim * t];
-            var y = vertexTypedArray[dim * t + 1];
-            if(isCompress){
-                x = normConstant * x + minVertex.x;
-                y = normConstant * y + minVertex.y;
-            }
-            vertexArray.push(new Cartesian2.Cartesian2(x, y));
-        }
-        BoundingRectangle.BoundingRectangle.fromPoints(vertexArray, boundingRectangle);
-        vertexArray.length = 0;
-        return boundingRectangle;
-    }
-
-    function calcBoundingSphereForClampGroundAndObjectLineCache(vertexPackage){
-        var isCompress = when.defined(vertexPackage.nCompressOptions) && (vertexPackage.nCompressOptions & VertexCompressOption.SVC_Vertex) === VertexCompressOption.SVC_Vertex;
-        var bSphere = new BoundingSphere.BoundingSphere();
-        var v1 = new Cartographic.Cartesian3();
-        var v2 = new Cartographic.Cartesian3();
-        var positionAttr = vertexPackage.vertexAttributes[0];
-        var posDim = positionAttr.componentsPerAttribute;
-        var posAttrIndex = vertexPackage.attrLocation['aPosition'];
-        var pos = vertexPackage.vertexAttributes[posAttrIndex];
-
-        var posLowIndex = vertexPackage.attrLocation['aTexCoord5'];
-        var posLowAttr = vertexPackage.vertexAttributes[posLowIndex];
-        var posLowDim = posLowAttr.componentsPerAttribute;
-
-        var posHighTypedArray, posLowTypedArray;
-        if(isCompress){
-            posDim = 3;
-            posLowDim = 3;
-            posHighTypedArray = getPosArrayForCompress(vertexPackage, pos);
-            posLowTypedArray = getPosArrayForCompressTexCoord(vertexPackage, posLowAttr, 5);
-        }
-        else{
-            posHighTypedArray = new Float32Array(positionAttr.typedArray.buffer, positionAttr.typedArray.byteOffset, positionAttr.typedArray.byteLength / 4);
-            posLowTypedArray = new Float32Array(posLowAttr.typedArray.buffer, posLowAttr.typedArray.byteOffset, posLowAttr.typedArray.byteLength / 4);
-        }
-
-        var vertexArray = [];
-        for(var t = 0; t < vertexPackage.verticesCount; t++){
-            Cartographic.Cartesian3.fromArray(posHighTypedArray, posDim * t, v1);
-            Cartographic.Cartesian3.fromArray(posLowTypedArray, posLowDim * t, v2);
-            Cartographic.Cartesian3.add(v1, v2, v1);
-            vertexArray.push(Cartographic.Cartesian3.clone(v1));
-        }
-        BoundingSphere.BoundingSphere.fromPoints(vertexArray, bSphere);
-        vertexArray.length = 0;
-        return bSphere;
-    }
-
-    S3MVertexPackage.calcBoundingSphereInWorker = function(fileType, vertexPackage){
-        var bSphere;
-        if(vertexPackage.instanceIndex > -1){
-            bSphere = calcBoundingSphereForInstance(vertexPackage);
-        }
-        else if(when.defined(vertexPackage.clampRegionEdge)){
-            bSphere = calcBoundingSphereForClampGroundAndObjectLineCache(vertexPackage);
-        }
-        else if(fileType >= DATAFILETYPE$1.ClampGroundPolygon && fileType <= DATAFILETYPE$1.ClampObjectLine){
-            bSphere = calcBoundingSphereForShadowVolume(vertexPackage);
-        }
-        else if(fileType == DATAFILETYPE$1.ClampGroundAndObjectLineCache){
-            bSphere = calcBoundingSphereForClampGroundAndObjectLineCache(vertexPackage);
-        }
-        else{
-            bSphere = calcBoundingSphereForNormal(vertexPackage);
-        }
-        return bSphere;
-    };
-
-    S3MVertexPackage.calcBoundingSphere = function(layer, vertexPackage, modelMatrix){
-        var fileType = layer._fileType;
-        var bSphere;
-        if(vertexPackage.instanceIndex > -1){
-            bSphere = calcBoundingSphereForInstance(vertexPackage);
-        }
-        else if(when.defined(vertexPackage.clampRegionEdge)){
-            bSphere = calcBoundingSphereForClampGroundAndObjectLineCache(vertexPackage);
-        }
-        else if(fileType >= DATAFILETYPE$1.ClampGroundPolygon && fileType <= DATAFILETYPE$1.ClampObjectLine){
-            bSphere = calcBoundingSphereForShadowVolume(vertexPackage);
-        }
-        else if(fileType == DATAFILETYPE$1.ClampGroundAndObjectLineCache){
-            bSphere = calcBoundingSphereForClampGroundAndObjectLineCache(vertexPackage);
-        }
-        else{
-            bSphere = calcBoundingSphereForNormal(vertexPackage);
-        }
-        BoundingSphere.BoundingSphere.transform(bSphere, modelMatrix, bSphere);
-        return bSphere;
-    };
-
-    S3MVertexPackage.calcBoundingRectangle = function(layer, vertexPackage){
-        var fileType = layer._fileType;
-        var boundingRectangle;
-        if(fileType === DATAFILETYPE$1.ClampGroundPolygon){
-            boundingRectangle = calcBoundingRectangleForShadowVolume(vertexPackage);
-        }
-        return boundingRectangle;
-    };
-
-    function convertToCesiumPrimitiveType(s3mType){
-        var primitiveType = PrimitiveType.PrimitiveType.TRIANGLES;
-        switch(s3mType){
-            case 1 : primitiveType = PrimitiveType.PrimitiveType.POINTS;break;
-            case 2 : primitiveType = PrimitiveType.PrimitiveType.LINES;break;
-            case 3 : primitiveType = PrimitiveType.PrimitiveType.LINE_STRIP;break;
-            case 4 : primitiveType = PrimitiveType.PrimitiveType.TRIANGLES;break;
-        }
-        return primitiveType;
-    }
-
-    function createEdgeIndex(nPointCount, nSubCount, subPointCounts, nVertexCount){
-        var indexPackage = {};
-        indexPackage.indicesCount = 6 * (nPointCount - nSubCount);
-        indexPackage.indexType = nVertexCount > 65535 ? 1 : 0;
-        indexPackage.primitiveType = PrimitiveType.PrimitiveType.TRIANGLES;
-        var indicesArray;
-        if( indexPackage.indexType === 0){
-            indicesArray = new Uint16Array(indexPackage.indicesCount);
-        }
-        else{
-            indicesArray = new Uint32Array(indexPackage.indicesCount);
-        }
-
-        var nCount = 0;
-        for (var nSub = 0; nSub < nSubCount; nSub++){
-            for (var nData = 0; nData < subPointCounts[nSub] - 1; nData++){
-                indicesArray[6 * (nCount - nSub  + nData)]     = 4 * (nCount - nSub + nData);
-                indicesArray[6 * (nCount - nSub  + nData) + 1] = 4 * (nCount - nSub + nData) + 2;
-                indicesArray[6 * (nCount - nSub  + nData) + 2] = 4 * (nCount - nSub + nData) + 1;
-                indicesArray[6 * (nCount - nSub  + nData) + 3] = 4 * (nCount - nSub + nData) + 1;
-                indicesArray[6 * (nCount - nSub  + nData) + 4] = 4 * (nCount - nSub + nData) + 2;
-                indicesArray[6 * (nCount - nSub  + nData) + 5] = 4 * (nCount - nSub + nData) + 3;
-            }
-            // 点计数增加
-            nCount += subPointCounts[nSub];
-        }
-        indexPackage.indicesTypedArray = indicesArray;
-        return indexPackage;
-    }
-
-    function getPosArrayForCompress(vertexPackage, posAttr){
-        var nVertexDim = posAttr.componentsPerAttribute;
-        var normConstant = vertexPackage.vertCompressConstant;
-        var minVertex = new Cartographic.Cartesian3(vertexPackage.minVerticesValue.x, vertexPackage.minVerticesValue.y, vertexPackage.minVerticesValue.z);
-        var compressVertexArray = new Uint16Array(posAttr.typedArray.buffer, posAttr.typedArray.byteOffset, posAttr.typedArray.byteLength / 2);
-        var uncompressVertexArray = new Float32Array(vertexPackage.verticesCount * 3);
-        var x, y, z;
-        for(var t = 0; t < vertexPackage.verticesCount; t++){
-            x = compressVertexArray[nVertexDim * t] * normConstant + minVertex.x;
-            y = compressVertexArray[nVertexDim * t + 1] * normConstant + minVertex.y;
-            z = compressVertexArray[nVertexDim * t + 2] * normConstant + minVertex.z;
-            uncompressVertexArray[3 * t] = x;
-            uncompressVertexArray[3 * t + 1] = y;
-            uncompressVertexArray[3 * t + 2] = z;
-        }
-        return uncompressVertexArray;
-    }
-
-    function getPosArrayForCompressTexCoord(vertexPackage, texAttr, texIdx){
-        var nVertexDim = texAttr.componentsPerAttribute;
-        var texCoordCompressConstant = vertexPackage.texCoordCompressConstant[texIdx];
-        var minVertex = new Cartesian4.Cartesian4(vertexPackage.minTexCoordValue[texIdx].x, vertexPackage.minTexCoordValue[texIdx].y, vertexPackage.minTexCoordValue[texIdx].z, vertexPackage.minTexCoordValue[texIdx].w);
-        var compressVertexArray = new Uint16Array(texAttr.typedArray.buffer, texAttr.typedArray.byteOffset, texAttr.typedArray.byteLength / 2);
-        var uncompressVertexArray = new Float32Array(vertexPackage.verticesCount * 3);
-        var x, y, z;
-        for(var t = 0; t < vertexPackage.verticesCount; t++){
-            x = compressVertexArray[nVertexDim * t] * texCoordCompressConstant + minVertex.x;
-            y = compressVertexArray[nVertexDim * t + 1] * texCoordCompressConstant + minVertex.y;
-            z = compressVertexArray[nVertexDim * t + 2] * texCoordCompressConstant + minVertex.z;
-            uncompressVertexArray[3 * t] = x;
-            uncompressVertexArray[3 * t + 1] = y;
-            uncompressVertexArray[3 * t + 2] = z;
-        }
-        return uncompressVertexArray;
-    }
-
-    function getEdgeIndexPackage(arrIndexPackage){
-        var oldEdgeIndexPackages = [];
-        var length = arrIndexPackage.length;
-        for(var i = 0; i < length; i++){
-            var primitveTpe = convertToCesiumPrimitiveType(arrIndexPackage[i].primitiveType);
-            if(primitveTpe === PrimitiveType.PrimitiveType.LINES || primitveTpe === PrimitiveType.PrimitiveType.LINE_STRIP){
-                oldEdgeIndexPackages.push(arrIndexPackage[i]);
-            }
-        }
-        return oldEdgeIndexPackages;
-    }
-
-    function getEdgeCount(edgeIndexPackages){
-        var nSubCount = 0;
-        var length = edgeIndexPackages.length;
-        for (var k = 0; k < length; k++){
-            var indexPackage = edgeIndexPackages[k];
-            var primitveTpe = convertToCesiumPrimitiveType(indexPackage.primitiveType);
-            if(primitveTpe == PrimitiveType.PrimitiveType.LINES){
-                nSubCount += indexPackage.indicesCount / 2;
-            }
-            else if(primitveTpe == PrimitiveType.PrimitiveType.LINE_STRIP){
-                nSubCount++;
-            }
-        }
-        return nSubCount;
-    }
-
-    function getEdgePointCount(edgeIndexPackages){
-        var nPointCount = 0;
-        var length = edgeIndexPackages.length;
-        for (var k = 0; k < length; k++){
-            var indexPackage = edgeIndexPackages[k];
-            nPointCount += indexPackage.indicesCount;
-        }
-        return nPointCount;
-    }
-
-    function getEdgePointArray(posArray, nVertexDim, edgeIndexPackages){
-        var arrEdgePoint = [];
-        var i;
-        var length = edgeIndexPackages.length;
-        for(var k = 0; k < length; k++){
-            var indexPackage = edgeIndexPackages[k];
-            var indicesArray;
-            if(indexPackage.indexType === 0){
-                indicesArray = new Uint16Array(indexPackage.indicesTypedArray.buffer, indexPackage.indicesTypedArray.byteOffset,
-                    indexPackage.indicesTypedArray.byteLength / 2);
-            }
-            else{
-                indicesArray = new Uint32Array(indexPackage.indicesTypedArray.buffer, indexPackage.indicesTypedArray.byteOffset,
-                    indexPackage.indicesTypedArray.byteLength / 4);
-            }
-            var primitiveType = convertToCesiumPrimitiveType(indexPackage.primitiveType);
-            if(primitiveType == PrimitiveType.PrimitiveType.LINES){
-                for(i = 0; i < indexPackage.indicesCount; i += 2) {
-                    var segment = [];
-                    var vecPoint3DStart = new Cartographic.Cartesian3();
-                    vecPoint3DStart.x = posArray[indicesArray[i] * nVertexDim];
-                    vecPoint3DStart.y = posArray[indicesArray[i] * nVertexDim + 1];
-                    vecPoint3DStart.z = posArray[indicesArray[i] * nVertexDim + 2];
-                    segment.push(vecPoint3DStart);
-                    var vecPoint3DEnd = new Cartographic.Cartesian3();
-                    vecPoint3DEnd.x = posArray[indicesArray[i + 1] * nVertexDim];
-                    vecPoint3DEnd.y = posArray[indicesArray[i + 1] * nVertexDim + 1];
-                    vecPoint3DEnd.z = posArray[indicesArray[i + 1] * nVertexDim + 2];
-                    segment.push(vecPoint3DEnd);
-                    arrEdgePoint.push(segment);
-                }
-            }
-            else if(primitiveType == PrimitiveType.PrimitiveType.LINE_STRIP) {
-                var segment = [];
-                for(i = 0; i < indexPackage.indicesCount; i++) {
-                    var vecPoint3D = new Cartographic.Cartesian3();
-                    vecPoint3D.x = posArray[indicesArray[ i ] * nVertexDim];
-                    vecPoint3D.y = posArray[indicesArray[ i ] * nVertexDim + 1];
-                    vecPoint3D.z = posArray[indicesArray[ i ] * nVertexDim + 2];
-                    segment.push(vecPoint3D);
-                }
-                arrEdgePoint.push(segment);
-            }
-        }
-        return arrEdgePoint;
-    }
-
-    S3MVertexPackage.createEdge = function(vertexPackage, arrIndexPackage){
-        if(arrIndexPackage.length < 1){
-            return;
-        }
-        var oldEdgeIndexPackages = getEdgeIndexPackage(arrIndexPackage);
-        if(oldEdgeIndexPackages.length == 0){
-            return;
-        }
-
-        var nSubCount = getEdgeCount(oldEdgeIndexPackages);
-
-        var posAttrIndex = vertexPackage.attrLocation['aPosition'];
-        var pos = vertexPackage.vertexAttributes[posAttrIndex];
-        var isCompress = when.defined(vertexPackage.nCompressOptions) && (vertexPackage.nCompressOptions & VertexCompressOption.SVC_Vertex) === VertexCompressOption.SVC_Vertex;
-        var nVertexDim = pos.componentsPerAttribute;
-        var posArray;
-        if(isCompress){
-            nVertexDim = 3;
-            posArray = getPosArrayForCompress(vertexPackage, pos);
-        }
-        else{
-            posArray = new Float32Array(pos.typedArray.buffer, pos.typedArray.byteOffset, pos.typedArray.byteLength / 4);
-        }
-
-        var nPointCount = getEdgePointCount(oldEdgeIndexPackages);
-        var arrPoints = getEdgePointArray(posArray, nVertexDim, oldEdgeIndexPackages);
-
-        var vertexCount = 4 * nPointCount - 4 * nSubCount;
-        var edgePosArray = new Float32Array(vertexCount * 3);
-        var edgeNormalArray = new Float32Array(vertexCount * 3);
-        var edgeTex0Array = new Float32Array(vertexCount * 3);
-        var edgeTex1Array = new Int8Array(vertexCount * 2);
-
-        var nCount = 0;
-        for (var nSub = 0; nSub < nSubCount; nSub++){
-            var nSubSize = arrPoints[nSub].length;
-            for (var nData = 0; nData < nSubSize; nData++){
-                var nTempPointOffset = 4 * nCount - 4 * nSub;
-                var nTemp = nTempPointOffset * 3 + 12 * nData;
-                var vecPoint3D = arrPoints[nSub][nData];
-                if(nData != 0){
-                    edgePosArray[nTemp - 6] = vecPoint3D.x;
-                    edgePosArray[nTemp - 5] = vecPoint3D.y;
-                    edgePosArray[nTemp - 4] = vecPoint3D.z;
-
-                    edgePosArray[nTemp - 3] = vecPoint3D.x;
-                    edgePosArray[nTemp - 2] = vecPoint3D.y;
-                    edgePosArray[nTemp - 1] = vecPoint3D.z;
-                }
-                if(nData != nSubSize - 1){
-                    edgePosArray[nTemp] =	  vecPoint3D.x;
-                    edgePosArray[nTemp + 1] = vecPoint3D.y;
-                    edgePosArray[nTemp + 2] = vecPoint3D.z;
-
-                    edgePosArray[nTemp + 3] = vecPoint3D.x;
-                    edgePosArray[nTemp + 4] = vecPoint3D.y;
-                    edgePosArray[nTemp + 5] = vecPoint3D.z;
-                }
-
-                var vVertexNext = vecPoint3D;
-                if(nData + 1 < nSubSize){
-                    vVertexNext = arrPoints[nSub][nData + 1];
-                }
-                if(nData != 0){
-                    edgeTex0Array[nTemp - 6] = vVertexNext.x;
-                    edgeTex0Array[nTemp - 5] = vVertexNext.y;
-                    edgeTex0Array[nTemp - 4] = vVertexNext.z;
-
-                    edgeTex0Array[nTemp - 3] = vVertexNext.x;
-                    edgeTex0Array[nTemp - 2] = vVertexNext.y;
-                    edgeTex0Array[nTemp - 1] = vVertexNext.z;
-                }
-                if(nData != nSubSize - 1){
-                    edgeTex0Array[nTemp] =	   vVertexNext.x;
-                    edgeTex0Array[nTemp + 1] = vVertexNext.y;
-                    edgeTex0Array[nTemp + 2] = vVertexNext.z;
-
-                    edgeTex0Array[nTemp + 3] = vVertexNext.x;
-                    edgeTex0Array[nTemp + 4] = vVertexNext.y;
-                    edgeTex0Array[nTemp + 5] = vVertexNext.z;
-                }
-
-                var vVertexPrev = vecPoint3D;
-                if(nData >= 1){
-                    vVertexPrev = arrPoints[nSub][nData-1];
-                }
-                if(nData != 0){
-                    edgeNormalArray[nTemp - 6] = vVertexPrev.x;
-                    edgeNormalArray[nTemp - 5] = vVertexPrev.y;
-                    edgeNormalArray[nTemp - 4] = vVertexPrev.z;
-
-                    edgeNormalArray[nTemp - 3] = vVertexPrev.x;
-                    edgeNormalArray[nTemp - 2] = vVertexPrev.y;
-                    edgeNormalArray[nTemp - 1] = vVertexPrev.z;
-                }
-                if(nData != nSubSize - 1){
-                    edgeNormalArray[nTemp] =	 vVertexPrev.x;
-                    edgeNormalArray[nTemp + 1] = vVertexPrev.y;
-                    edgeNormalArray[nTemp + 2] = vVertexPrev.z;
-
-                    edgeNormalArray[nTemp + 3] = vVertexPrev.x;
-                    edgeNormalArray[nTemp + 4] = vVertexPrev.y;
-                    edgeNormalArray[nTemp + 5] = vVertexPrev.z;
-                }
-
-                nTemp = nTempPointOffset * 2 + 8 * nData;
-                if(nData != 0){
-                    //expandAndWidth
-                    edgeTex1Array[nTemp - 4] = -1;
-                    edgeTex1Array[nTemp - 3] = -1;
-                    edgeTex1Array[nTemp - 2] = 1;
-                    edgeTex1Array[nTemp - 1] = -1;
-                }
-                if(nData != nSubSize - 1){
-                    //expandAndWidth
-                    edgeTex1Array[nTemp] = -1;
-                    edgeTex1Array[nTemp + 1] = 1;
-                    edgeTex1Array[nTemp + 2] = 1;
-                    edgeTex1Array[nTemp + 3] = 1;
-                }
-            }
-            nCount += arrPoints[nSub].length;
-        }
-
-        var edgeVertexPackage = {};
-        edgeVertexPackage.vertexAttributes = [];
-        edgeVertexPackage.attrLocation = {};
-        var edgeAttributes = edgeVertexPackage.vertexAttributes;
-        var edgeAttrLocation = edgeVertexPackage.attrLocation;
-        edgeVertexPackage.instanceCount = 0;
-        edgeVertexPackage.instanceMode = 0;
-
-        edgeAttrLocation['aPosition'] = 0;
-        edgeAttributes.push({
-            index: edgeAttrLocation['aPosition'],
-            typedArray: edgePosArray,
-            componentsPerAttribute: 3,
-            componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-            offsetInBytes: 0,
-            strideInBytes: 3 * Float32Array.BYTES_PER_ELEMENT,
-            normalize: false
-        });
-
-        edgeAttrLocation['aNormal'] = 1;
-        edgeAttributes.push({
-            index: edgeAttrLocation['aNormal'],
-            typedArray: edgeNormalArray,
-            componentsPerAttribute: 3,
-            componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-            offsetInBytes: 0,
-            strideInBytes: 3 * Float32Array.BYTES_PER_ELEMENT,
-            normalize: false
-        });
-
-        edgeAttrLocation['aTexCoord0'] = 2;
-        edgeAttributes.push({
-            index: edgeAttrLocation['aTexCoord0'],
-            typedArray: edgeTex0Array,
-            componentsPerAttribute: 3,
-            componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-            offsetInBytes: 0,
-            strideInBytes: 3 * Float32Array.BYTES_PER_ELEMENT,
-            normalize: false
-        });
-
-        edgeAttrLocation['aTexCoord1'] = 3;
-        edgeAttributes.push({
-            index: edgeAttrLocation['aTexCoord1'],
-            typedArray: edgeTex1Array,
-            componentsPerAttribute: 2,
-            componentDatatype: ComponentDatatype.ComponentDatatype.BYTE,
-            offsetInBytes: 0,
-            strideInBytes: 2 * Int8Array.BYTES_PER_ELEMENT,
-            normalize: false
-        });
-
-        var arrPolyCount = [];
-        for(var i = 0; i < arrPoints.length; i++) {
-            arrPolyCount.push(arrPoints[i].length);
-        }
-        var edgeIndexPackage = createEdgeIndex(nPointCount, nSubCount, arrPolyCount, vertexCount);
-        return {
-            vertexPackage: edgeVertexPackage,
-            indexPackage: edgeIndexPackage
-        }
-    };
-
-    function returnTrue() {
-            return true;
-        }
-
-        /**
-         * Destroys an object.  Each of the object's functions, including functions in its prototype,
-         * is replaced with a function that throws a {@link DeveloperError}, except for the object's
-         * <code>isDestroyed</code> function, which is set to a function that returns <code>true</code>.
-         * The object's properties are removed with <code>delete</code>.
-         * <br /><br />
-         * This function is used by objects that hold native resources, e.g., WebGL resources, which
-         * need to be explicitly released.  Client code calls an object's <code>destroy</code> function,
-         * which then releases the native resource and calls <code>destroyObject</code> to put itself
-         * in a destroyed state.
-         *
-         * @exports destroyObject
-         *
-         * @param {Object} object The object to destroy.
-         * @param {String} [message] The message to include in the exception that is thrown if
-         *                           a destroyed object's function is called.
-         *
-         *
-         * @example
-         * // How a texture would destroy itself.
-         * this.destroy = function () {
-         *     _gl.deleteTexture(_texture);
-         *     return Cesium.destroyObject(this);
-         * };
-         *
-         * @see DeveloperError
-         */
-        function destroyObject(object, message) {
-            message = when.defaultValue(message, 'This object was destroyed, i.e., destroy() was called.');
-
-            function throwOnDestroyed() {
-                //>>includeStart('debug', pragmas.debug);
-                throw new Check.DeveloperError(message);
-                //>>includeEnd('debug');
-            }
-
-            for ( var key in object) {
-                if (typeof object[key] === 'function') {
-                    object[key] = throwOnDestroyed;
-                }
-            }
-
-            object.isDestroyed = returnTrue;
-
-            return undefined;
-        }
-
-    /**
-     * @private
-     */
-    var BufferUsage = {
-        STREAM_DRAW : WebGLConstants.WebGLConstants.STREAM_DRAW,
-        STATIC_DRAW : WebGLConstants.WebGLConstants.STATIC_DRAW,
-        DYNAMIC_DRAW : WebGLConstants.WebGLConstants.DYNAMIC_DRAW,
-
-        validate : function(bufferUsage) {
-            return ((bufferUsage === BufferUsage.STREAM_DRAW) ||
-            (bufferUsage === BufferUsage.STATIC_DRAW) ||
-            (bufferUsage === BufferUsage.DYNAMIC_DRAW));
-        }
-    };
-
-    /**
-     * @private
-     */
-    function Buffer(options) {
-        options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('options.context', options.context);
-
-        if (!when.defined(options.typedArray) && !when.defined(options.sizeInBytes)) {
-            throw new Check.DeveloperError('Either options.sizeInBytes or options.typedArray is required.');
-        }
-
-        if (when.defined(options.typedArray) && when.defined(options.sizeInBytes)) {
-            throw new Check.DeveloperError('Cannot pass in both options.sizeInBytes and options.typedArray.');
-        }
-
-        if (when.defined(options.typedArray)) {
-            Check.Check.typeOf.object('options.typedArray', options.typedArray);
-            Check.Check.typeOf.number('options.typedArray.byteLength', options.typedArray.byteLength);
-        }
-
-        if (!BufferUsage.validate(options.usage)) {
-            throw new Check.DeveloperError('usage is invalid.');
-        }
-        //>>includeEnd('debug');
-
-        var gl = options.context._gl;
-        var bufferTarget = options.bufferTarget;
-        var typedArray = options.typedArray;
-        var sizeInBytes = options.sizeInBytes;
-        var usage = options.usage;
-        var hasArray = when.defined(typedArray);
-
-        if (hasArray) {
-            sizeInBytes = typedArray.byteLength;
-        }
-
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.number.greaterThan('sizeInBytes', sizeInBytes, 0);
-        //>>includeEnd('debug');
-
-        var buffer = gl.createBuffer();
-        gl.bindBuffer(bufferTarget, buffer);
-        gl.bufferData(bufferTarget, hasArray ? typedArray : sizeInBytes, usage);
-        gl.bindBuffer(bufferTarget, null);
-
-        this._gl = gl;
-        this._webgl2 = options.context._webgl2;
-        this._bufferTarget = bufferTarget;
-        this._sizeInBytes = sizeInBytes;
-        this._usage = usage;
-        this._buffer = buffer;
-        this.vertexArrayDestroyable = true;
-    }
-
-    /**
-     * Creates a vertex buffer, which contains untyped vertex data in GPU-controlled memory.
-     * <br /><br />
-     * A vertex array defines the actual makeup of a vertex, e.g., positions, normals, texture coordinates,
-     * etc., by interpreting the raw data in one or more vertex buffers.
-     *
-     * @param {Object} options An object containing the following properties:
-     * @param {Context} options.context The context in which to create the buffer
-     * @param {ArrayBufferView} [options.typedArray] A typed array containing the data to copy to the buffer.
-     * @param {Number} [options.sizeInBytes] A <code>Number</code> defining the size of the buffer in bytes. Required if options.typedArray is not given.
-     * @param {BufferUsage} options.usage Specifies the expected usage pattern of the buffer. On some GL implementations, this can significantly affect performance. See {@link BufferUsage}.
-     * @returns {VertexBuffer} The vertex buffer, ready to be attached to a vertex array.
-     *
-     * @exception {DeveloperError} Must specify either <options.typedArray> or <options.sizeInBytes>, but not both.
-     * @exception {DeveloperError} The buffer size must be greater than zero.
-     * @exception {DeveloperError} Invalid <code>usage</code>.
-     *
-     *
-     * @example
-     * // Example 1. Create a dynamic vertex buffer 16 bytes in size.
-     * var buffer = Buffer.createVertexBuffer({
-     *     context : context,
-     *     sizeInBytes : 16,
-     *     usage : BufferUsage.DYNAMIC_DRAW
-     * });
-     *
-     * @example
-     * // Example 2. Create a dynamic vertex buffer from three floating-point values.
-     * // The data copied to the vertex buffer is considered raw bytes until it is
-     * // interpreted as vertices using a vertex array.
-     * var positionBuffer = buffer.createVertexBuffer({
-     *     context : context,
-     *     typedArray : new Float32Array([0, 0, 0]),
-     *     usage : BufferUsage.STATIC_DRAW
-     * });
-     *
-     * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenBuffer.xml|glGenBuffer}
-     * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindBuffer.xml|glBindBuffer} with <code>ARRAY_BUFFER</code>
-     * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBufferData.xml|glBufferData} with <code>ARRAY_BUFFER</code>
-     */
-    Buffer.createVertexBuffer = function(options) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('options.context', options.context);
-        //>>includeEnd('debug');
-
-        return new Buffer({
-            context: options.context,
-            bufferTarget: WebGLConstants.WebGLConstants.ARRAY_BUFFER,
-            typedArray: options.typedArray,
-            sizeInBytes: options.sizeInBytes,
-            usage: options.usage
-        });
-    };
-
-    /**
-     * Creates an index buffer, which contains typed indices in GPU-controlled memory.
-     * <br /><br />
-     * An index buffer can be attached to a vertex array to select vertices for rendering.
-     * <code>Context.draw</code> can render using the entire index buffer or a subset
-     * of the index buffer defined by an offset and count.
-     *
-     * @param {Object} options An object containing the following properties:
-     * @param {Context} options.context The context in which to create the buffer
-     * @param {ArrayBufferView} [options.typedArray] A typed array containing the data to copy to the buffer.
-     * @param {Number} [options.sizeInBytes] A <code>Number</code> defining the size of the buffer in bytes. Required if options.typedArray is not given.
-     * @param {BufferUsage} options.usage Specifies the expected usage pattern of the buffer. On some GL implementations, this can significantly affect performance. See {@link BufferUsage}.
-     * @param {IndexDatatype} options.indexDatatype The datatype of indices in the buffer.
-     * @returns {IndexBuffer} The index buffer, ready to be attached to a vertex array.
-     *
-     * @exception {DeveloperError} Must specify either <options.typedArray> or <options.sizeInBytes>, but not both.
-     * @exception {DeveloperError} IndexDatatype.UNSIGNED_INT requires OES_element_index_uint, which is not supported on this system. Check context.elementIndexUint.
-     * @exception {DeveloperError} The size in bytes must be greater than zero.
-     * @exception {DeveloperError} Invalid <code>usage</code>.
-     * @exception {DeveloperError} Invalid <code>indexDatatype</code>.
-     *
-     *
-     * @example
-     * // Example 1. Create a stream index buffer of unsigned shorts that is
-     * // 16 bytes in size.
-     * var buffer = Buffer.createIndexBuffer({
-     *     context : context,
-     *     sizeInBytes : 16,
-     *     usage : BufferUsage.STREAM_DRAW,
-     *     indexDatatype : IndexDatatype.UNSIGNED_SHORT
-     * });
-     *
-     * @example
-     * // Example 2. Create a static index buffer containing three unsigned shorts.
-     * var buffer = Buffer.createIndexBuffer({
-     *     context : context,
-     *     typedArray : new Uint16Array([0, 1, 2]),
-     *     usage : BufferUsage.STATIC_DRAW,
-     *     indexDatatype : IndexDatatype.UNSIGNED_SHORT
-     * });
-     *
-     * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenBuffer.xml|glGenBuffer}
-     * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindBuffer.xml|glBindBuffer} with <code>ELEMENT_ARRAY_BUFFER</code>
-     * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBufferData.xml|glBufferData} with <code>ELEMENT_ARRAY_BUFFER</code>
-     */
-    Buffer.createIndexBuffer = function(options) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('options.context', options.context);
-
-        if (!IndexDatatype.IndexDatatype.validate(options.indexDatatype)) {
-            throw new Check.DeveloperError('Invalid indexDatatype.');
-        }
-
-        if (options.indexDatatype === IndexDatatype.IndexDatatype.UNSIGNED_INT && !options.context.elementIndexUint) {
-            throw new Check.DeveloperError('IndexDatatype.UNSIGNED_INT requires OES_element_index_uint, which is not supported on this system.  Check context.elementIndexUint.');
-        }
-        //>>includeEnd('debug');
-
-        var context = options.context;
-        var indexDatatype = options.indexDatatype;
-
-        var bytesPerIndex = IndexDatatype.IndexDatatype.getSizeInBytes(indexDatatype);
-        var buffer = new Buffer({
-            context : context,
-            bufferTarget : WebGLConstants.WebGLConstants.ELEMENT_ARRAY_BUFFER,
-            typedArray : options.typedArray,
-            sizeInBytes : options.sizeInBytes,
-            usage : options.usage
-        });
-
-        var numberOfIndices = buffer.sizeInBytes / bytesPerIndex;
-
-        Object.defineProperties(buffer, {
-            indexDatatype: {
-                get : function() {
-                    return indexDatatype;
-                }
-            },
-            bytesPerIndex : {
-                get : function() {
-                    return bytesPerIndex;
-                }
-            },
-            numberOfIndices : {
-                get : function() {
-                    return numberOfIndices;
-                }
-            }
-        });
-
-        return buffer;
-    };
-
-    Object.defineProperties(Buffer.prototype, {
-        sizeInBytes : {
-            get : function() {
-                return this._sizeInBytes;
-            }
-        },
-
-        usage: {
-            get : function() {
-                return this._usage;
-            }
-        }
-    });
-
-    Buffer.prototype._getBuffer = function() {
-        return this._buffer;
-    };
-
-    Buffer.prototype.copyFromArrayView = function(arrayView, offsetInBytes) {
-        offsetInBytes = when.defaultValue(offsetInBytes, 0);
-
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('arrayView', arrayView);
-        Check.Check.typeOf.number.lessThanOrEquals('offsetInBytes + arrayView.byteLength', offsetInBytes + arrayView.byteLength, this._sizeInBytes);
-        //>>includeEnd('debug');
-
-        var gl = this._gl;
-        var target = this._bufferTarget;
-        gl.bindBuffer(target, this._buffer);
-        gl.bufferSubData(target, offsetInBytes, arrayView);
-        gl.bindBuffer(target, null);
-    };
-
-    Buffer.prototype.copyFromBuffer = function(readBuffer, readOffset, writeOffset, sizeInBytes) {
-        //>>includeStart('debug', pragmas.debug);
-        if (!this._webgl2) {
-            throw new Check.DeveloperError('A WebGL 2 context is required.');
-        }
-        if (!when.defined(readBuffer)) {
-            throw new Check.DeveloperError('readBuffer must be defined.');
-        }
-        if (!when.defined(sizeInBytes) || sizeInBytes <= 0) {
-            throw new Check.DeveloperError('sizeInBytes must be defined and be greater than zero.');
-        }
-        if (!when.defined(readOffset) || readOffset < 0 || readOffset + sizeInBytes > readBuffer._sizeInBytes) {
-            throw new Check.DeveloperError('readOffset must be greater than or equal to zero and readOffset + sizeInBytes must be less than of equal to readBuffer.sizeInBytes.');
-        }
-        if (!when.defined(writeOffset) || writeOffset < 0 || writeOffset + sizeInBytes > this._sizeInBytes) {
-            throw new Check.DeveloperError('writeOffset must be greater than or equal to zero and writeOffset + sizeInBytes must be less than of equal to this.sizeInBytes.');
-        }
-        if (this._buffer === readBuffer._buffer && ((writeOffset >= readOffset && writeOffset < readOffset + sizeInBytes) || (readOffset > writeOffset && readOffset < writeOffset + sizeInBytes))) {
-            throw new Check.DeveloperError('When readBuffer is equal to this, the ranges [readOffset + sizeInBytes) and [writeOffset, writeOffset + sizeInBytes) must not overlap.');
-        }
-        if ((this._bufferTarget === WebGLConstants.WebGLConstants.ELEMENT_ARRAY_BUFFER && readBuffer._bufferTarget !== WebGLConstants.WebGLConstants.ELEMENT_ARRAY_BUFFER) ||
-            (this._bufferTarget !== WebGLConstants.WebGLConstants.ELEMENT_ARRAY_BUFFER && readBuffer._bufferTarget === WebGLConstants.WebGLConstants.ELEMENT_ARRAY_BUFFER)) {
-            throw new Check.DeveloperError('Can not copy an index buffer into another buffer type.');
-        }
-        //>>includeEnd('debug');
-
-        var readTarget = WebGLConstants.WebGLConstants.COPY_READ_BUFFER;
-        var writeTarget = WebGLConstants.WebGLConstants.COPY_WRITE_BUFFER;
-
-        var gl = this._gl;
-        gl.bindBuffer(writeTarget, this._buffer);
-        gl.bindBuffer(readTarget, readBuffer._buffer);
-        gl.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, sizeInBytes);
-        gl.bindBuffer(writeTarget, null);
-        gl.bindBuffer(readTarget, null);
-    };
-
-    Buffer.prototype.getBufferData = function(arrayView, sourceOffset, destinationOffset, length) {
-        sourceOffset = when.defaultValue(sourceOffset, 0);
-        destinationOffset = when.defaultValue(destinationOffset, 0);
-
-        //>>includeStart('debug', pragmas.debug);
-        if (!this._webgl2) {
-            throw new Check.DeveloperError('A WebGL 2 context is required.');
-        }
-        if (!when.defined(arrayView)) {
-            throw new Check.DeveloperError('arrayView is required.');
-        }
-
-        var copyLength;
-        var elementSize;
-        var arrayLength = arrayView.byteLength;
-        if (!when.defined(length)) {
-            if (when.defined(arrayLength)) {
-                copyLength = arrayLength - destinationOffset;
-                elementSize = 1;
-            } else {
-                arrayLength = arrayView.length;
-                copyLength = arrayLength - destinationOffset;
-                elementSize = arrayView.BYTES_PER_ELEMENT;
-            }
-        } else {
-            copyLength = length;
-            if (when.defined(arrayLength)) {
-                elementSize = 1;
-            } else {
-                arrayLength = arrayView.length;
-                elementSize = arrayView.BYTES_PER_ELEMENT;
-            }
-        }
-
-        if (destinationOffset < 0 || destinationOffset > arrayLength) {
-            throw new Check.DeveloperError('destinationOffset must be greater than zero and less than the arrayView length.');
-        }
-        if (destinationOffset + copyLength > arrayLength) {
-            throw new Check.DeveloperError('destinationOffset + length must be less than or equal to the arrayViewLength.');
-        }
-        if (sourceOffset < 0 || sourceOffset > this._sizeInBytes) {
-            throw new Check.DeveloperError('sourceOffset must be greater than zero and less than the buffers size.');
-        }
-        if (sourceOffset + copyLength * elementSize > this._sizeInBytes) {
-            throw new Check.DeveloperError('sourceOffset + length must be less than the buffers size.');
-        }
-        //>>includeEnd('debug');
-
-        var gl = this._gl;
-        var target = WebGLConstants.WebGLConstants.COPY_READ_BUFFER;
-        gl.bindBuffer(target, this._buffer);
-        gl.getBufferSubData(target, sourceOffset, arrayView, destinationOffset, length);
-        gl.bindBuffer(target, null);
-    };
-
-    Buffer.prototype.isDestroyed = function() {
-        return false;
-    };
-
-    Buffer.prototype.destroy = function() {
-        this._gl.deleteBuffer(this._buffer);
-        return destroyObject(this);
-    };
-
-    /**
-     * @constructor
-     */
-    function meshProcessing() {}
-
-    meshProcessing.computeNeighbors = function (a, k) {
-        for (var c = a.length / 3, l = new Uint32Array(k + 1), g = new Uint32Array(k + 1), f = function (d, b) {
-            d < b ? l[d + 1]++ : g[b + 1]++;
-        }, b = 0; b < c; b++) {
-            var e = a[3 * b],
-                d = a[3 * b + 1],
-                m = a[3 * b + 2];
-            f(e, d);
-            f(d, m);
-            f(m, e);
-        }
-        for (b = d = e = 0; b < k; b++) m = l[b + 1],
-            f = g[b + 1],
-            l[b + 1] = e,
-            g[b + 1] = d,
-            e += m,
-            d += f;
-        for (var v = new Uint32Array(6 * c), w = l[k], f = function (d, b, f) {
-            if (d < b) {
-                var e = l[d + 1]++;
-                v[2 * e] = b;
-                v[2 * e + 1] = f;
-            } else e = g[b + 1]++,
-                v[2 * w + 2 * e] = d,
-                v[2 * w + 2 * e + 1] = f;
-        }, b = 0; b < c; b++) e = a[3 * b],
-            d = a[3 * b + 1],
-            m = a[3 * b + 2],
-            f(e, d, b),
-            f(d, m, b),
-            f(m, e, b);
-        e = function (d, b) {
-            var f = 2 * d;
-            d = b - d;
-            for (b = 1; b < d; b++) {
-                var e = v[f + 2 * b],
-                    k = v[f + 2 * b + 1],
-                    m = b - 1;
-                for (m; 0 <= m && v[f + 2 * m] > e; m--) v[f + 2 * m + 2] = v[f + 2 * m],
-                    v[f + 2 * m + 3] = v[f + 2 * m + 1];
-                v[f + 2 * m + 2] = e;
-                v[f + 2 * m + 3] = k;
-            }
-        };
-        for (b = 0; b < k; b++) e(l[b], l[b + 1]),
-            e(w + g[b], w + g[b + 1]);
-        for (var q = new Int32Array(3 * c), u = function (d, b) {
-            return d === a[3 * b] ? 0 : d === a[3 * b + 1] ? 1 : d === a[3 * b + 2] ? 2 : -1
-        }, c = function (d, b) {
-            d = u(d, b);
-            q[3 * b + d] = -1;
-        }, e = function (d, b, f, e) {
-            d = u(d, b);
-            q[3 * b + d] = e;
-            f = u(f, e);
-            q[3 * e + f] = b;
-        }, b = 0; b < k; b++) {
-            for (var d = l[b], m = l[b + 1], f = g[b], p = g[b + 1]; d < m && f < p;) {
-                var F = v[2 * d],
-                    G = v[2 * w + 2 * f];
-                F === G ? (e(b, v[2 * d + 1], G, v[2 * w + 2 * f + 1]), d++, f++) : F < G ? (c(b, v[2 * d + 1]), d++) : (c(G, v[2 * w + 2 * f + 1]), f++);
-            }
-            for (; d < m;) c(b, v[2 * d + 1]),
-                d++;
-            for (; f < p;) G = v[2 * w + 2 * f],
-                c(G, v[2 * w + 2 * f + 1]),
-                f++;
-        }
-        return q
-    };
-
-    function nextHighestPowerOfTwo(d) {
-        --d;
-        for (var b = 1; 32 > b; b <<= 1) d |= d >> b;
-        return d + 1
-    }
-
-    var g = null;
-    meshProcessing.deduplicate = function (a, k, c, h, r) {
-        void 0 === c && (c = 0);
-        void 0 === h && (h = 0);
-        void 0 === r && (r = a.byteLength / (4 * k));
-        a = new Uint32Array(a, h, r * k);
-        h = new Uint32Array(r);
-        var f = Math.floor(1.1 * r) + 1;
-        if (null == g || g.length < 2 * f) g = new Uint32Array(nextHighestPowerOfTwo(2 * f));
-        for (var b = 0; b < 2 * f; b++) g[b] = 0;
-        for (var e = 0, d = 0 !== c ? Math.ceil(7.84 * 1.96 / (c * c) * c * (1 - c)) : r, b = 0; b < r; b++) {
-            if (b === d) {
-                var m = 1 - e / b;
-                if (m + 1.96 * Math.sqrt(m * (1 - m) / b) < c) return null;
-                d *= 2;
-            }
-            for (var m = b * k, v, w = v = 0; w < k; w++) v = a[m + w] + v | 0,
-                v = v + (v << 11) + (v >>> 2) | 0;
-            v >>>= 0;
-            for (var w = v % f, q = e; 0 !== g[2 * w + 1];) {
-                if (g[2 * w] === v) {
-                    var u = g[2 * w + 1] - 1,
-                        p = u * k;
-                    a: {
-                        for (var F = 0; F < k; F++) if (a[m + F] !== a[p + F]) {
-                            p = !1;
-                            break a
-                        }
-                        p = !0;
-                    }
-                    if (p) {
-                        q = h[u];
-                        break
-                    }
-                }
-                w++;
-                w >= f && (w -= f);
-            }
-            q === e && (g[2 * w] = v, g[2 * w + 1] = b + 1, e++);
-            h[b] = q;
-        }
-        if (0 !== c && 1 - e / r < c) return null;
-        c = new Uint32Array(k * e);
-        for (b = e = 0; b < r; b++) if (h[b] === e) {
-            f = a;
-            d = b * k;
-            m = c;
-            v = e * k;
-            w = k;
-            for (q = 0; q < w; q++) m[v + q] = f[d + q];
-            e++;
-        }
-        return {
-            buffer: c.buffer,
-            indices: h,
-            uniqueCount: e
-        }
-    };
-
-    /**
-     * @constructor
-     */
-    function edgePreprocessing() {
-    }
-
-    function acos(d) {
-        return Math.acos(1 < d ? 1 : -1 > d ? -1 : d)
-    }
-
-    function deg2rad(d) {
-        return d * Math.PI / 180
-    }
-
-    // 判断相邻的两个面是否构成一个edge的角度阈值,小于此值不生成edge
-    var ANGLE_PLANAR = 4;
-    // 判断相邻的两个面是否构成明显edge的角度阈值,大于此值生成regular edge
-    var ANGLE_SIGNIFICANT_EDGE = 35;
-
-    var anglePlanar = deg2rad(ANGLE_PLANAR);
-    var angleSignificantEdge = deg2rad(ANGLE_SIGNIFICANT_EDGE);
-    var cosAngleSignificantEdge = Math.cos(angleSignificantEdge);
-    var cosAnglePlanar = Math.cos(anglePlanar);
-
-    function directionFromTo(b, f, e) {
-        var d = e.x - f.x,
-            k = e.y - f.y;
-        f = e.z - f.z;
-        e = d * d + k * k + f * f;
-        if (!e) return b.x = 0,
-            b.y = 0,
-            b.z = 0,
-            b;
-        e = 1 / Math.sqrt(e);
-        b.x = d * e;
-        b.y = k * e;
-        b.z = f * e;
-        return b;
-    }
-
-    var scratchEdge = {
-        position0 : new Cartographic.Cartesian3(),
-        position1 : new Cartographic.Cartesian3(),
-        faceNormal0 : new Cartographic.Cartesian3(),
-        faceNormal1 : new Cartographic.Cartesian3(),
-        cosAngle: 0
-    };
-
-    var scratchOrtho = new Cartographic.Cartesian3();
-    var scratchFwd =  new Cartographic.Cartesian3();
-
-    function isSilhouetteEdge(edge, anglePlanar) {
-        var angle = acos(edge.cosAngle);
-        directionFromTo(scratchFwd, edge.position1, edge.position0);
-        Cartographic.Cartesian3.cross(edge.faceNormal0, edge.faceNormal1, scratchOrtho);
-        var a = 0 < Cartographic.Cartesian3.dot(scratchOrtho, scratchFwd) ? -1 : 1;
-        return angle * a > anglePlanar;
-    }
-
-    function computEdgeInfosArray(meshData) {
-        var faceCount = meshData.faces.length / 3;
-        var faces = meshData.faces;
-        var neighbors = meshData.neighbors;
-        var totalEdgeCount = 0;
-        var faceIdx = 0;
-        for (faceIdx = 0; faceIdx < faceCount; faceIdx++){
-            var neighborFace0Index = neighbors[3 * faceIdx + 0];
-            var neighborFace1Index = neighbors[3 * faceIdx + 1];
-            var neighborFace2Index = neighbors[3 * faceIdx + 2];
-            var faceVertex0Index = faces[3 * faceIdx + 0];
-            var faceVertex1Index = faces[3 * faceIdx + 1];
-            var faceVertex2Index = faces[3 * faceIdx + 2];
-            totalEdgeCount = totalEdgeCount + (-1 === neighborFace0Index || faceVertex0Index < faceVertex1Index ? 1 : 0);
-            totalEdgeCount = totalEdgeCount + (-1 === neighborFace1Index || faceVertex1Index < faceVertex2Index ? 1 : 0);
-            totalEdgeCount = totalEdgeCount + (-1 === neighborFace2Index || faceVertex2Index < faceVertex0Index ? 1 : 0);
-        }
-        var edgeInfosArray = new Int32Array(4 * totalEdgeCount);
-        var edgeIndex = 0;
-        for (faceIdx = 0; faceIdx < faceCount; faceIdx++) {
-            var neighborFace0Index = neighbors[3 * faceIdx + 0];
-            var neighborFace1Index = neighbors[3 * faceIdx + 1];
-            var neighborFace2Index = neighbors[3 * faceIdx + 2];
-            var faceVertex0Index = faces[3 * faceIdx + 0];
-            var faceVertex1Index = faces[3 * faceIdx + 1];
-            var faceVertex2Index = faces[3 * faceIdx + 2];
-            if (-1 === neighborFace0Index || faceVertex0Index < faceVertex1Index){
-                edgeInfosArray[edgeIndex++] = faceVertex0Index;
-                edgeInfosArray[edgeIndex++] = faceVertex1Index;
-                edgeInfosArray[edgeIndex++] = faceIdx;
-                edgeInfosArray[edgeIndex++] = neighborFace0Index;
-            }
-            if (-1 === neighborFace1Index || faceVertex1Index < faceVertex2Index){
-                edgeInfosArray[edgeIndex++] = faceVertex1Index;
-                edgeInfosArray[edgeIndex++] = faceVertex2Index;
-                edgeInfosArray[edgeIndex++] = faceIdx;
-                edgeInfosArray[edgeIndex++] = neighborFace1Index;
-            }
-            if (-1 === neighborFace2Index || faceVertex2Index < faceVertex0Index){
-                edgeInfosArray[edgeIndex++] = faceVertex2Index;
-                edgeInfosArray[edgeIndex++] = faceVertex0Index;
-                edgeInfosArray[edgeIndex++] = faceIdx;
-                edgeInfosArray[edgeIndex++] = neighborFace2Index;
-            }
-        }
-        return edgeInfosArray;
-    }
-
-    var scratchV0 = new Cartographic.Cartesian3();
-    var scratchV1 = new Cartographic.Cartesian3();
-    var scratchV2 = new Cartographic.Cartesian3();
-
-    function NormalizeCartesian3(v){
-        var g = v.x * v.x + v.y * v.y + v.z * v.z;
-        if(g > 0){
-            g = 1 / Math.sqrt(g);
-            v.x *= g;
-            v.y *= g;
-            v.z *= g;
-        }
-    }
-
-    function computeFaceNormalArray(meshData) {
-        var faceCount = meshData.faces.length / 3;
-        var vertices = meshData.vertices;
-        var dim = meshData.dim;
-        var faces = meshData.faces;
-        var faceNormalArray = new Float32Array(3 * faceCount);
-        for (var faceIdx = 0; faceIdx < faceCount; faceIdx++) {
-            var vertex0Index = faces[3 * faceIdx + 0];
-            var vertex1Index = faces[3 * faceIdx + 1];
-            var vertex2Index = faces[3 * faceIdx + 2];
-
-            scratchV0.x = vertices[dim * vertex0Index];
-            scratchV0.y = vertices[dim * vertex0Index + 1];
-            scratchV0.z = vertices[dim * vertex0Index + 2];
-
-            scratchV1.x = vertices[dim * vertex1Index];
-            scratchV1.y = vertices[dim * vertex1Index + 1];
-            scratchV1.z = vertices[dim * vertex1Index + 2];
-
-            scratchV2.x = vertices[dim * vertex2Index];
-            scratchV2.y = vertices[dim * vertex2Index + 1];
-            scratchV2.z = vertices[dim * vertex2Index + 2];
-
-            Cartographic.Cartesian3.subtract(scratchV1, scratchV0, scratchV1);
-            Cartographic.Cartesian3.subtract(scratchV2, scratchV0, scratchV2);
-            Cartographic.Cartesian3.cross(scratchV1, scratchV2, scratchV0);
-            NormalizeCartesian3(scratchV0);
-            faceNormalArray[3 * faceIdx + 0] = scratchV0.x;
-            faceNormalArray[3 * faceIdx + 1] = scratchV0.y;
-            faceNormalArray[3 * faceIdx + 2] = scratchV0.z;
-        }
-        return faceNormalArray
-    }
-
-    function range(a, b) {
-        if(0 === b){
-            b = a;
-            a = 0;
-        }
-        for (var d = Array(b - a), c = a; c < b; c++) d[c - a] = c;
-        return d
-    }
-
-    edgePreprocessing.extractEdges = function (meshData) {
-        var positionValues = meshData.vertices;
-        var dim = meshData.dim;
-
-        var edge = scratchEdge;
-        var position0 = edge.position0;
-        var position1 = edge.position1;
-        var faceNormal0 = edge.faceNormal0;
-        var faceNormal1 = edge.faceNormal1;
-        var faceNormalArray = computeFaceNormalArray(meshData);
-        var edgeInfosArray = computEdgeInfosArray(meshData);
-        var edgeCount = edgeInfosArray.length / 4;
-        // vec3 position0 vec3 position1 vec3 faceNormal0
-        var regularBuffer = new Float32Array(9 * edgeCount);
-        var regularWritePos = 0;
-        // vec3 position0 vec3 position1 vec3 faceNormal0 vec3 faceNormal1
-        var silhouetteBuffer = new Float32Array(12 * edgeCount);
-        var silhouetteWritePos = 0;
-        var totalEdgeLength = 0;
-        var totalEdgeCount = 0;
-        var sortedEdgeIndexArray = range(0, edgeCount);
-        var edgeLengthArray = new Float32Array(edgeCount);
-        edgeLengthArray.forEach(function (a, curIndex, thisArray) {
-            var pos0Index = edgeInfosArray[4 * curIndex + 0];
-            var pos1Index = edgeInfosArray[4 * curIndex + 1];
-            position0.x = positionValues[pos0Index * dim];
-            position0.y = positionValues[pos0Index * dim + 1];
-            position0.z = positionValues[pos0Index * dim + 2];
-
-            position1.x = positionValues[pos1Index * dim];
-            position1.y = positionValues[pos1Index * dim + 1];
-            position1.z = positionValues[pos1Index * dim + 2];
-
-            thisArray[curIndex] = Cartographic.Cartesian3.distance(position0, position1);
-        });
-        sortedEdgeIndexArray.sort(function (a, b) {
-            return edgeLengthArray[b] - edgeLengthArray[a]
-        });
-        var regularEdgeLengths = [];
-        var silhouetteEdgeLengths = [];
-        for (var J = 0; J < edgeCount; J++) {
-            var edgeIndex = sortedEdgeIndexArray[J],
-                edgeLength = edgeLengthArray[edgeIndex],
-                position0Index = edgeInfosArray[4 * edgeIndex + 0],
-                position1Index = edgeInfosArray[4 * edgeIndex + 1],
-                neighborFaceIndex0 = edgeInfosArray[4 * edgeIndex + 2],
-                neighborFaceIndex1 = edgeInfosArray[4 * edgeIndex + 3],
-                hasOneNeighborFace = -1 === neighborFaceIndex1;
-
-            position0.x = positionValues[position0Index * dim];
-            position0.y = positionValues[position0Index * dim + 1];
-            position0.z = positionValues[position0Index * dim + 2];
-
-            position1.x = positionValues[position1Index * dim];
-            position1.y = positionValues[position1Index * dim + 1];
-            position1.z = positionValues[position1Index * dim + 2];
-
-            if (hasOneNeighborFace){
-                faceNormal0.x = faceNormalArray[3 * neighborFaceIndex0];
-                faceNormal0.y = faceNormalArray[3 * neighborFaceIndex0 + 1];
-                faceNormal0.z = faceNormalArray[3 * neighborFaceIndex0 + 2];
-                faceNormal1.x = faceNormal0.x;
-                faceNormal1.y = faceNormal0.y;
-                faceNormal1.z = faceNormal0.z;
-                edge.cosAngle =  Cartographic.Cartesian3.dot(faceNormal0, faceNormal1);
-            }
-            else{
-                faceNormal0.x = faceNormalArray[3 * neighborFaceIndex0];
-                faceNormal0.y = faceNormalArray[3 * neighborFaceIndex0 + 1];
-                faceNormal0.z = faceNormalArray[3 * neighborFaceIndex0 + 2];
-
-                faceNormal1.x = faceNormalArray[3 * neighborFaceIndex1];
-                faceNormal1.y = faceNormalArray[3 * neighborFaceIndex1 + 1];
-                faceNormal1.z = faceNormalArray[3 * neighborFaceIndex1 + 2];
-
-                edge.cosAngle =  Cartographic.Cartesian3.dot(faceNormal0, faceNormal1);
-                if(edge.cosAngle > cosAnglePlanar){
-                    continue;
-                }
-            }
-
-            totalEdgeLength += edgeLength;
-            totalEdgeCount++;
-            if(hasOneNeighborFace || edge.cosAngle < cosAngleSignificantEdge){
-                regularBuffer[regularWritePos++] = edge.position0.x;
-                regularBuffer[regularWritePos++] = edge.position0.y;
-                regularBuffer[regularWritePos++] = edge.position0.z;
-
-                regularBuffer[regularWritePos++] = edge.position1.x;
-                regularBuffer[regularWritePos++] = edge.position1.y;
-                regularBuffer[regularWritePos++] = edge.position1.z;
-
-                regularBuffer[regularWritePos++] = edge.faceNormal0.x;
-                regularBuffer[regularWritePos++] = edge.faceNormal0.y;
-                regularBuffer[regularWritePos++] = edge.faceNormal0.z;
-
-                regularEdgeLengths.push(edgeLength);
-            }
-            else{
-                if(isSilhouetteEdge(edge, anglePlanar)){
-                    silhouetteBuffer[silhouetteWritePos++] = edge.position0.x;
-                    silhouetteBuffer[silhouetteWritePos++] = edge.position0.y;
-                    silhouetteBuffer[silhouetteWritePos++] = edge.position0.z;
-
-                    silhouetteBuffer[silhouetteWritePos++] = edge.position1.x;
-                    silhouetteBuffer[silhouetteWritePos++] = edge.position1.y;
-                    silhouetteBuffer[silhouetteWritePos++] = edge.position1.z;
-
-                    silhouetteBuffer[silhouetteWritePos++] = edge.faceNormal0.x;
-                    silhouetteBuffer[silhouetteWritePos++] = edge.faceNormal0.y;
-                    silhouetteBuffer[silhouetteWritePos++] = edge.faceNormal0.z;
-
-                    silhouetteBuffer[silhouetteWritePos++] = edge.faceNormal1.x;
-                    silhouetteBuffer[silhouetteWritePos++] = edge.faceNormal1.y;
-                    silhouetteBuffer[silhouetteWritePos++] = edge.faceNormal1.z;
-
-                    silhouetteEdgeLengths.push(edgeLength);
-                }
-            }
-        }
-
-        regularBuffer = regularBuffer.slice(0, regularWritePos);
-        silhouetteBuffer = silhouetteBuffer.slice(0, silhouetteWritePos);
-
-        var averageEdgeLength = totalEdgeLength / totalEdgeCount;
-        var regularEdgeCount = regularEdgeLengths.length;
-        var silhouetteEdgeCount = silhouetteEdgeLengths.length;
-        return {
-            regular : {
-                instancesData : regularBuffer,
-                instanceCount : regularEdgeCount,
-                edgeLength : regularEdgeCount * averageEdgeLength
-            },
-            silhouette : {
-                instancesData : silhouetteBuffer,
-                instanceCount : silhouetteEdgeCount,
-                edgeLength : silhouetteEdgeCount * averageEdgeLength
-            },
-            averageEdgeLength: averageEdgeLength
-        };
-    };
-
-    /**
-     * @constructor
-     */
-    function S3MEdgeProcessor(edgeBufferWriters){
-    }
-
-    S3MEdgeProcessor.createEdgeData = function(vertexPackage, arrIndexPackage, transferableObjects){
-        if(arrIndexPackage.length == 0){
-            return null;
-        }
-
-        var indexPackage = arrIndexPackage[0];
-        var indices;
-        if(indexPackage.indexType === 0){
-            indices = new Uint16Array(indexPackage.indicesTypedArray.buffer, indexPackage.indicesTypedArray.byteOffset,
-                indexPackage.indicesTypedArray.byteLength / 2);
-        }
-        else{
-            indices = new Uint32Array(indexPackage.indicesTypedArray.buffer, indexPackage.indicesTypedArray.byteOffset,
-                indexPackage.indicesTypedArray.byteLength / 4);
-        }
-
-        var skipDeduplicate = false;
-        var edgeInformation = S3MEdgeProcessor.extractEdgeInformation(vertexPackage, skipDeduplicate, indices);
-        var edgeData = edgePreprocessing.extractEdges(edgeInformation);
-        if(when.defined(transferableObjects)){
-            if(when.defined(edgeData.regular.instancesData)){
-                transferableObjects.push(edgeData.regular.instancesData.buffer);
-            }
-            if(when.defined(edgeData.silhouette.instancesData)){
-                transferableObjects.push(edgeData.silhouette.instancesData.buffer);
-            }
-        }
-        return edgeData;
-    };
-
-    var scratchSidenessVertexBuffer = null;
-    function createEdgeSidenessVertexBuffer(context){
-        if(when.defined(scratchSidenessVertexBuffer)){
-            return scratchSidenessVertexBuffer;
-        }
-        var typedArray = new Float32Array(8);
-        var pos = 0;
-        // sideness
-        typedArray[pos++] = 0;
-        typedArray[pos++] = 0;
-
-        typedArray[pos++] = 0;
-        typedArray[pos++] = 1;
-
-        typedArray[pos++] = 1;
-        typedArray[pos++] = 1;
-
-        typedArray[pos++] = 1;
-        typedArray[pos++] = 0;
-
-        scratchSidenessVertexBuffer = Buffer.createVertexBuffer({
-            context : context,
-            typedArray : typedArray,
-            usage : BufferUsage.STATIC_DRAW
-        });
-        scratchSidenessVertexBuffer.vertexArrayDestroyable = false;
-        return scratchSidenessVertexBuffer;
-    }
-
-    function createEdgeIndexArray(){
-        var indicesTypedArray = new Uint16Array(6);
-        var pos = 0;
-        indicesTypedArray[pos++] = 2;
-        indicesTypedArray[pos++] = 1;
-        indicesTypedArray[pos++] = 0;
-        indicesTypedArray[pos++] = 3;
-        indicesTypedArray[pos++] = 2;
-        indicesTypedArray[pos++] = 0;
-        return indicesTypedArray;
-    }
-
-    var scratchIndexBuffer = null;
-    S3MEdgeProcessor.createIndexBuffer = function(context){
-        if(when.defined(scratchIndexBuffer)){
-            return scratchIndexBuffer;
-        }
-
-        scratchIndexBuffer = Buffer.createIndexBuffer({
-            context : context,
-            typedArray : createEdgeIndexArray(),
-            usage : BufferUsage.STATIC_DRAW,
-            indexDatatype : IndexDatatype.IndexDatatype.UNSIGNED_SHORT
-        });
-        scratchIndexBuffer.vertexArrayDestroyable = false;
-        return scratchIndexBuffer;
-    };
-
-    S3MEdgeProcessor.createRegularEdgeAttributes = function(context, regular){
-        if(regular.instancesData.length == 0){
-            return;
-        }
-
-        var attributeLocations = {};
-        var attributes = [];
-        regular.attributeLocations = attributeLocations;
-        regular.attributes = attributes;
-
-        var instanceBuffer = Buffer.createVertexBuffer({
-            context : context,
-            typedArray : regular.instancesData,
-            usage : BufferUsage.STATIC_DRAW
-        });
-
-        regular.instancesData = null;
-
-        var componentSizeInBytes = ComponentDatatype.ComponentDatatype.getSizeInBytes(ComponentDatatype.ComponentDatatype.FLOAT);
-
-        var sidenessVertexBuffer = createEdgeSidenessVertexBuffer(context);
-        var attIndex = 0;
-        attributeLocations['aSideness'] = attIndex++;
-        attributes.push({
-            index: attributeLocations['aSideness'],
-            vertexBuffer : sidenessVertexBuffer,
-            componentsPerAttribute: 2,
-            componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-            offsetInBytes: 0,
-            strideInBytes: ComponentDatatype.ComponentDatatype.getSizeInBytes(ComponentDatatype.ComponentDatatype.FLOAT) * 2,
-            normalize: false
-        });
-
-        // pos0 pos1 facenormal0
-        var stride = 3 + 3 + 3;
-
-        var offset = 0;
-        attributeLocations['aPosition0'] = attIndex++;
-        attributes.push({
-            index : attributeLocations['aPosition0'],
-            vertexBuffer : instanceBuffer,
-            componentsPerAttribute : 3,
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            normalize              : false,
-            offsetInBytes          : componentSizeInBytes * offset,
-            strideInBytes          :  componentSizeInBytes * stride,
-            instanceDivisor        : 1
-        });
-        offset += 3;
-
-        attributeLocations['aPosition1'] = attIndex++;
-        attributes.push({
-            index : attributeLocations['aPosition1'],
-            vertexBuffer : instanceBuffer,
-            componentsPerAttribute : 3,
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            normalize              : false,
-            offsetInBytes          : componentSizeInBytes * offset,
-            strideInBytes          : componentSizeInBytes * stride,
-            instanceDivisor        : 1
-        });
-        offset += 3;
-
-        attributeLocations['aNormal'] = attIndex++;
-        attributes.push({
-            index : attributeLocations['aNormal'],
-            vertexBuffer : instanceBuffer,
-            componentsPerAttribute : 3,
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            normalize              : true,
-            offsetInBytes          : componentSizeInBytes * offset,
-            strideInBytes          : componentSizeInBytes * stride,
-            instanceDivisor        : 1
-        });
-        offset += 3;
-    };
-
-    S3MEdgeProcessor.createSilhouetteEdgeAttributes = function(context, silhouette){
-        if(silhouette.instancesData.length == 0){
-            return;
-        }
-
-        var attributeLocations = {};
-        var attributes = [];
-        silhouette.attributeLocations = attributeLocations;
-        silhouette.attributes = attributes;
-
-        var instanceBuffer = Buffer.createVertexBuffer({
-            context : context,
-            typedArray : silhouette.instancesData,
-            usage : BufferUsage.STATIC_DRAW
-        });
-        silhouette.instancesData = null;
-
-        var componentSizeInBytes = ComponentDatatype.ComponentDatatype.getSizeInBytes(ComponentDatatype.ComponentDatatype.FLOAT);
-        var attIndex = 0;
-        attributeLocations['aSideness'] = attIndex++;
-        attributes.push({
-            index: attributeLocations['aSideness'],
-            vertexBuffer : createEdgeSidenessVertexBuffer(context),
-            componentsPerAttribute: 2,
-            componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-            offsetInBytes: 0,
-            strideInBytes: componentSizeInBytes * 2,
-            normalize: false
-        });
-
-        // pos0 pos1 facenormal0 facenormal1
-        var stride = 3 + 3 + 3 + 3;
-
-        var offset = 0;
-        attributeLocations['aPosition0'] = attIndex++;
-        attributes.push({
-            index : attributeLocations['aPosition0'],
-            vertexBuffer : instanceBuffer,
-            componentsPerAttribute : 3,
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            normalize              : false,
-            offsetInBytes          : componentSizeInBytes * offset,
-            strideInBytes          :  componentSizeInBytes * stride,
-            instanceDivisor        : 1
-        });
-        offset += 3;
-
-        attributeLocations['aPosition1'] = attIndex++;
-        attributes.push({
-            index : attributeLocations['aPosition1'],
-            vertexBuffer : instanceBuffer,
-            componentsPerAttribute : 3,
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            normalize              : false,
-            offsetInBytes          : componentSizeInBytes*offset,
-            strideInBytes          : componentSizeInBytes*stride,
-            instanceDivisor        : 1
-        });
-        offset += 3;
-
-        attributeLocations['aNormalA'] = attIndex++;
-        attributes.push({
-            index : attributeLocations['aNormalA'],
-            vertexBuffer : instanceBuffer,
-            componentsPerAttribute : 3,
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            normalize              : true,
-            offsetInBytes          : componentSizeInBytes * offset,
-            strideInBytes          : componentSizeInBytes * stride,
-            instanceDivisor        : 1
-        });
-        offset += 3;
-
-        attributeLocations['aNormalB'] = attIndex++;
-        attributes.push({
-            index : attributeLocations['aNormalB'],
-            vertexBuffer : instanceBuffer,
-            componentsPerAttribute : 3,
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            normalize              : true,
-            offsetInBytes          : componentSizeInBytes * offset,
-            strideInBytes          : componentSizeInBytes * stride,
-            instanceDivisor        : 1
-        });
-        offset += 3;
-    };
-
-    function getPosArrayForCompress$1(vertexPackage, posAttr){
-        var nVertexDim = posAttr.componentsPerAttribute;
-        var normConstant = vertexPackage.vertCompressConstant;
-        var minVertex = new Cartographic.Cartesian3(vertexPackage.minVerticesValue.x, vertexPackage.minVerticesValue.y, vertexPackage.minVerticesValue.z);
-        var compressVertexArray = new Uint16Array(posAttr.typedArray.buffer, posAttr.typedArray.byteOffset, posAttr.typedArray.byteLength / 2);
-        var uncompressVertexArray = new Float32Array(vertexPackage.verticesCount * 3);
-        var x, y, z;
-        for(var t = 0; t < vertexPackage.verticesCount; t++){
-            x = compressVertexArray[nVertexDim * t] * normConstant + minVertex.x;
-            y = compressVertexArray[nVertexDim * t + 1] * normConstant + minVertex.y;
-            z = compressVertexArray[nVertexDim * t + 2] * normConstant + minVertex.z;
-            uncompressVertexArray[3 * t] = x;
-            uncompressVertexArray[3 * t + 1] = y;
-            uncompressVertexArray[3 * t + 2] = z;
-        }
-        return uncompressVertexArray;
-    }
-
-    S3MEdgeProcessor.extractEdgeInformation = function (vertexPackage, skipDeduplicate, faces) {
-        var posAttrIndex = vertexPackage.attrLocation['aPosition'];
-        var posAttr = vertexPackage.vertexAttributes[posAttrIndex];
-
-        var isCompress = when.defined(vertexPackage.nCompressOptions) && (vertexPackage.nCompressOptions & VertexCompressOption.SVC_Vertex) === VertexCompressOption.SVC_Vertex;
-        var nVertexDim = posAttr.componentsPerAttribute;
-
-        var vertices;
-        if(isCompress){
-            nVertexDim = 3;
-            vertices = getPosArrayForCompress$1(vertexPackage, posAttr);
-        }
-        else{
-            vertices = new Float32Array(posAttr.typedArray.buffer, posAttr.typedArray.byteOffset, posAttr.typedArray.byteLength / 4);
-        }
-
-        var verticesCount = vertices.length / nVertexDim;
-
-        if (skipDeduplicate && faces){
-            var neighbors = meshProcessing.computeNeighbors(faces, verticesCount);
-            return {
-                faces: faces,
-                neighbors: neighbors,
-                vertices: vertices,
-                dim : nVertexDim
-            };
-        }
-        var totalBuffer = posAttr.typedArray.buffer;
-        var verticesBuffer;
-        if(isCompress){
-            verticesBuffer = vertices.buffer;
-        }
-        else{
-            verticesBuffer = totalBuffer.slice(posAttr.typedArray.byteOffset, posAttr.typedArray.byteOffset + posAttr.typedArray.byteLength);
-        }
-        var newVerticesAndIndices = meshProcessing.deduplicate(verticesBuffer, nVertexDim);
-        var newFaces = S3MEdgeProcessor.selectIndexData(newVerticesAndIndices.indices, faces);
-        var newNeighbors = meshProcessing.computeNeighbors(newFaces, newVerticesAndIndices.uniqueCount);
-        var newVertices = new Float32Array(newVerticesAndIndices.buffer);
-        return {
-            faces: newFaces,
-            neighbors: newNeighbors,
-            vertices: newVertices,
-            dim : nVertexDim
-        }
-    };
-
-    S3MEdgeProcessor.selectIndexData = function (indices, faces) {
-        if (faces) {
-            faces = faces.slice();
-            for (var c = 0; c < faces.length; c++){
-                faces[c] = indices[faces[c]];
-            }
-            return faces;
-        }
-        return indices;
-    };
-
-    /**
-     * S3M纹理压缩类型
-     * @export S3MCompressType
-     */
-    var S3MCompressType = {
-        /**
-         * 非压缩
-         */
-        encNONE : 0,
-        /**
-         * DXT压缩
-         */
-        enrS3TCDXTN : 14,
-        /**
-         * PVR压缩-IOS设备
-         */
-        enrPVRTPF_PVRTC2 : 19,
-        /**
-         * PVR压缩-IOS设备
-         */
-        enrPVRTPF_PVRTC : 20,
-        /**
-         * PVR压缩-IOS设备
-         */
-        enrPVRTPF_PVRTC_4bpp : 21,
-        /**
-         * ETC压缩-安卓设备
-         */
-        enrPVRTPF_ETC1 : 22
-    };
-
-    var S3MCompressType$1 = Object.freeze(S3MCompressType);
-
-    exports.DXTTextureDecode = DXTTextureDecode;
-    exports.S3MCompressType = S3MCompressType$1;
-    exports.S3MEdgeProcessor = S3MEdgeProcessor;
-    exports.S3MPixelFormat = S3MPixelFormat$1;
-    exports.S3MVertexPackage = S3MVertexPackage;
-    exports.VertexCompressOption = VertexCompressOption;
-    exports.getStringFromTypedArray = getStringFromTypedArray;
-
-});
diff --git a/public/libs/Cesium/Workers/S3MTilesParser.js b/public/libs/Cesium/Workers/S3MTilesParser.js
deleted file mode 100644
index d54e1f3..0000000
--- a/public/libs/Cesium/Workers/S3MTilesParser.js
+++ /dev/null
@@ -1,656 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './IndexDatatype-9435b55f', './createTaskProcessorWorker', './BoundingRectangle-dc808c42', './Color-69f1845f', './pako_inflate-8ea163f9', './S3MCompressType-ab31efd1'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, PrimitiveType, FeatureDetection, IndexDatatype, createTaskProcessorWorker, BoundingRectangle, Color, pako_inflate, S3MCompressType) { 'use strict';
-
-    function Bound3D(left, bottom, right, top, minHeight, maxHeight) {
-        this.left = left;
-        this.bottom = bottom;
-        this.right = right;
-        this.top = top;
-        this.minHeight = minHeight;
-        this.maxHeight = maxHeight;
-        this.width = right - left;
-        this.length = top - bottom;
-        this.height = maxHeight - minHeight;
-
-    }
-    function parseGeoPackage(geoPackage, typedArray, view, bytesOffset, needCreateEdge, transferableObjects) {
-        var geoName = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var byteLength = 0;
-        var vertexPackage = {};
-        var attributes = vertexPackage.vertexAttributes = [];
-        var attrLocation = vertexPackage.attrLocation = {};
-        vertexPackage.instanceCount = 0;
-        vertexPackage.instanceMode = 0;
-        var index = 0;
-        var nVertexOptions = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var vertexDimension = view.getUint16(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var normalDimension = vertexDimension;
-        if (vertexDimension > 4) {
-            normalDimension = vertexDimension >> 8;
-            vertexDimension = vertexDimension & 0x0f;
-        }
-        var verticesCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if (verticesCount > 0) {
-            var vertexStride = view.getUint16(bytesOffset, true);
-            vertexStride = vertexDimension * Float32Array.BYTES_PER_ELEMENT;
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            byteLength = verticesCount * vertexStride;
-            attrLocation['aPosition'] = index;
-            attributes.push({
-                index: attrLocation['aPosition'],
-                typedArray: typedArray.subarray(bytesOffset, bytesOffset + byteLength),
-                componentsPerAttribute: vertexDimension,
-                componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                offsetInBytes: 0,
-                strideInBytes: vertexStride,
-                normalize: false
-            });
-            index++;
-            bytesOffset += byteLength;
-        }
-
-        var normalCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if (normalCount > 0) {
-            var normalStride = view.getUint16(bytesOffset, true);
-            normalStride = normalDimension * Float32Array.BYTES_PER_ELEMENT;
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            byteLength = normalCount * normalStride;
-            if(!geoPackage.ignoreNormal){
-                attrLocation['aNormal'] = index;
-                attributes.push({
-                    index: attrLocation['aNormal'],
-                    typedArray: typedArray.subarray(bytesOffset, bytesOffset + byteLength),
-                    componentsPerAttribute: normalDimension,
-                    componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                    offsetInBytes: 0,
-                    strideInBytes: normalStride,
-                    normalize: false
-                });
-                index++;
-            }
-            bytesOffset += byteLength;
-        }
-
-        var vertexColorCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if (vertexColorCount > 0) {
-            var vertexColor = new Uint8Array(4 * vertexColorCount);
-            transferableObjects.push(vertexColor.buffer);
-            var vertexColorStride = view.getUint32(bytesOffset, true);
-            vertexColorStride = 4 * Float32Array.BYTES_PER_ELEMENT;
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            byteLength = vertexColorCount * vertexColorStride;
-            var oriVertexColor = new Float32Array(typedArray.buffer, bytesOffset, verticesCount * 4);
-            for (var m = 0; m < verticesCount; m++) {
-                vertexColor[4 * m] = oriVertexColor[4 * m] * 255;
-                vertexColor[4 * m + 1] = oriVertexColor[4 * m + 1] * 255;
-                vertexColor[4 * m + 2] = oriVertexColor[4 * m + 2] * 255;
-                vertexColor[4 * m + 3] = oriVertexColor[4 * m + 3] * 255;
-            }
-            bytesOffset += byteLength;
-            attrLocation['aColor'] = index;
-            attributes.push({
-                index: attrLocation['aColor'],
-                typedArray: vertexColor,
-                componentsPerAttribute: 4,
-                componentDatatype: ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                offsetInBytes: 0,
-                strideInBytes: 4,
-                normalize: true
-            });
-            index++;
-        }
-
-        var secondVertexColorCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        if (secondVertexColorCount > 0) {
-            byteLength = secondVertexColorCount * 16;
-            bytesOffset += byteLength;
-        }
-
-        var textureCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var instanceIndex = -1;
-        var texCoordCount, texCoordStride, texCoordDim;
-        for (var j = 0; j < textureCount; j++) {
-            texCoordCount = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            texCoordDim = view.getUint16(bytesOffset, true);
-            bytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-            texCoordStride = view.getUint16(bytesOffset, true);
-            bytesOffset += Uint16Array.BYTES_PER_ELEMENT;
-            byteLength = texCoordCount * texCoordDim * Float32Array.BYTES_PER_ELEMENT;
-            var texBuffer = typedArray.subarray(bytesOffset, bytesOffset + byteLength);
-            if (instanceIndex == -1 && (texCoordDim == 20 || texCoordDim == 35)) {
-                instanceIndex = j;
-                vertexPackage.instanceCount = texCoordCount;
-                vertexPackage.instanceMode = texCoordDim;
-                vertexPackage.instanceBuffer = texBuffer;
-                var byteStride;
-                if (texCoordDim === 20) {
-                    byteStride = Float32Array.BYTES_PER_ELEMENT * 20;
-                    attrLocation['uv2'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv2'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 0,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-
-                    attrLocation['uv3'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv3'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-
-                    attrLocation['uv4'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv4'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-
-                    attrLocation['secondary_colour'] = index++;
-                    attributes.push({
-                        index: attrLocation['secondary_colour'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-
-                    attrLocation['uv6'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv6'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                }
-                else if (texCoordDim === 35) {
-                    byteStride = Float32Array.BYTES_PER_ELEMENT * 35;
-                    attrLocation['uv1'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv1'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 0,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1,
-                        byteLength: byteLength
-                    });
-                    attrLocation['uv2'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv2'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 4 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv3'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv3'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 8 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv4'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv4'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 12 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv5'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv5'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 16 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv6'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv6'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 20 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv7'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv7'],
-                        componentsPerAttribute: 3,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 24 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['secondary_colour'] = index++;
-                    attributes.push({
-                        index: attrLocation['secondary_colour'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 27 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                    attrLocation['uv9'] = index++;
-                    attributes.push({
-                        index: attrLocation['uv9'],
-                        componentsPerAttribute: 4,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        normalize: false,
-                        offsetInBytes: 31 * Float32Array.BYTES_PER_ELEMENT,
-                        strideInBytes: byteStride,
-                        instanceDivisor: 1
-                    });
-                }
-            }
-            else {
-                if (instanceIndex !== -1) {
-                    vertexPackage.instanceBounds = new Float32Array(typedArray.buffer, bytesOffset, texCoordCount * texCoordDim);
-                }
-                else {
-                    var str = 'aTexCoord' + j;
-                    attrLocation[str] = index++;
-                    attributes.push({
-                        index: attrLocation[str],
-                        typedArray: texBuffer,
-                        componentsPerAttribute: texCoordDim,
-                        componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-                        offsetInBytes: 0,
-                        strideInBytes: texCoordDim * Float32Array.BYTES_PER_ELEMENT,
-                        normalize: false
-                    });
-                }
-            }
-            bytesOffset += byteLength;
-        }
-
-        vertexPackage.verticesCount = verticesCount;
-        vertexPackage.instanceIndex = instanceIndex;
-        var indexPackageSize = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var arrIndexPackage = [];
-        for (var j = 0; j < indexPackageSize; j++) {
-            var indexPackage = {};
-            var indicesCount = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var indexType = view.getUint8(bytesOffset, true);
-            bytesOffset += Uint8Array.BYTES_PER_ELEMENT;
-            var useIndex = view.getUint8(bytesOffset, true);
-            bytesOffset += Uint8Array.BYTES_PER_ELEMENT;
-            var primitiveType = view.getUint8(bytesOffset, true);
-            bytesOffset += Uint8Array.BYTES_PER_ELEMENT;
-            bytesOffset += 1;
-            indexPackage.indicesCount = indicesCount;
-            indexPackage.indexType = indexType;
-            indexPackage.primitiveType = primitiveType;
-            var indexOffset = bytesOffset;
-            if (indicesCount > 0) {
-                if (indexType == 0) {
-                    byteLength = indicesCount * Uint16Array.BYTES_PER_ELEMENT;
-                    bytesOffset += byteLength;
-                    if (indicesCount % 2 == 1) {
-                        bytesOffset += 2;
-                    }
-                }
-                else {
-                    byteLength = indicesCount * 4;
-                    bytesOffset += byteLength;
-                }
-            }
-
-            indexPackage.indicesTypedArray = typedArray.subarray(indexOffset, indexOffset + byteLength);
-            var passNameCount = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var materialCode = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT * passNameCount;
-            indexPackage.materialCode = materialCode;
-            arrIndexPackage.push(indexPackage);
-        }
-
-        var edgeGeometry;
-        if(needCreateEdge){
-            edgeGeometry = S3MCompressType.S3MEdgeProcessor.createEdgeData(vertexPackage, arrIndexPackage, transferableObjects);
-        }
-
-        geoPackage[geoName] = {
-            vertexPackage: vertexPackage,
-            arrIndexPackage: arrIndexPackage,
-            edgeGeometry : edgeGeometry
-        };
-
-        return bytesOffset;
-    }
-
-    function createBatchIdAttribute(vertexPackage, typedArray, instanceDivisor) {
-        var vertexAttributes = vertexPackage.vertexAttributes;
-        var attrLocation = vertexPackage.attrLocation;
-        var len = vertexAttributes.length;
-        var attrName = instanceDivisor === 1 ? 'instanceId' : 'batchId';
-        attrLocation[attrName] = len;
-        vertexAttributes.push({
-            index: len,
-            typedArray: typedArray,
-            componentsPerAttribute: 1,
-            componentDatatype: ComponentDatatype.ComponentDatatype.FLOAT,
-            offsetInBytes: 0,
-            strideInBytes: 0,
-            instanceDivisor : instanceDivisor
-        });
-    }
-
-    function S3MTilesParser(parameters, transferableObjects) {
-        var buffer = parameters.buffer;
-        //transferableObjects.push(buffer);
-        var supportCompressType = parameters.supportCompressType;
-        var bVolume = parameters.bVolume;//是否是体渲染数据
-        var createEdge = parameters.createEdge;
-        var bound3D = null;
-        var volBounds = null;
-        var volImageBuffer = null;
-        if (bVolume) {
-            if (parameters.volbuffer.byteLength < 8) {
-                bVolume = false;
-            }
-        }
-        if (bVolume) {
-
-            var volData = parameters.volbuffer;
-            var dataZip = new Uint8Array(volData, 8);
-            var volumeBuffer = pako_inflate.pako.inflate(dataZip).buffer;
-            var volVersion = new Float64Array(volumeBuffer, 0, 1);
-            var volFormat = new Uint32Array(volumeBuffer , 48, 1);
-
-            if(volVersion[0] === 0.0 || volFormat[0] === 3200 || volFormat[0] === 3201)
-            {
-                var nHeaderOffset = 0;
-                if(volVersion[0] === 0.0)
-                {
-                    nHeaderOffset = 8;
-                }
-
-                transferableObjects.push(volumeBuffer);
-                var boundsArray = new Float64Array(volumeBuffer, nHeaderOffset, 6);
-                var left = boundsArray[0];
-                var top = boundsArray[1];
-                var right = boundsArray[2];
-                var bottom = boundsArray[3];
-                var minHeight = boundsArray[4] < boundsArray[5] ? boundsArray[4] : boundsArray[5];
-                var maxHeight = boundsArray[4] > boundsArray[5] ? boundsArray[4] : boundsArray[5];
-                bound3D = new Bound3D(left, bottom, right, top, minHeight, maxHeight);
-
-                volBounds = {
-                    left: left,
-                    top: top,
-                    right: right,
-                    bottom: bottom,
-                    minHeight: minHeight,
-                    maxHeight: maxHeight,
-                    width: bound3D.width,
-                    length: bound3D.length,
-                    height: bound3D.height
-                };
-
-                // 中间空出来
-                var infoVolume = new Uint32Array(volumeBuffer, 48 + nHeaderOffset, 7);
-                var nFormat = infoVolume[0];
-                var nSideBlockCount = infoVolume[1];
-                var nBlockLength = infoVolume[2];
-                var nLength = infoVolume[3];
-                var nWidth = infoVolume[4];
-                var nHeight = infoVolume[5];
-                var nDepth = infoVolume[6];
-                var nCount = nLength * nLength * 4;
-                var image = new Uint8Array(volumeBuffer, 76 + nHeaderOffset, nCount);
-                volImageBuffer = {
-                    nFormat: nFormat,
-                    nSideBlockCount: nSideBlockCount,
-                    nBlockLength: nBlockLength,
-                    nLength: nLength,
-                    nWidth: nWidth,
-                    nHeight: nHeight,
-                    nDepth: nDepth,
-                    imageArray: image
-                };
-            }
-        }
-
-        var bytesOffset = 0;
-        var header = new Uint8Array(buffer, 0, 4);
-        if (header[0] !== 115 || header[1] !== 51 || header[2] !== 109) {
-            return {
-                result: false
-            };
-        }
-
-        var version = header[3];
-        var dataZip = new Uint8Array(buffer, 4);
-        var unzipBuffer = pako_inflate.pako.inflate(dataZip).buffer;
-        var typedArray = new Uint8Array(unzipBuffer);
-        transferableObjects.push(typedArray.buffer);
-        var view = new DataView(unzipBuffer);
-        var xmlSize = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var xmlBuffer = new Uint8Array(unzipBuffer, bytesOffset, xmlSize);
-        var nAlign = xmlSize % 4;
-        if(nAlign){
-            nAlign = 4 - nAlign;
-        }
-
-        bytesOffset += xmlSize + nAlign;
-
-        var xmlDoc = S3MCompressType.getStringFromTypedArray(xmlBuffer, undefined, undefined, 'gbk');
-        xmlDoc = xmlDoc.replace(new RegExp("\r\n",'gm'),'');
-        xmlDoc = xmlDoc.replace(new RegExp(":",'gm'),'');
-
-        var packageSize = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var geoCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var geoPackage = {};
-        geoPackage.ignoreNormal = parameters.ignoreNormal;
-        for (var i = 0; i < geoCount; i++) {
-            bytesOffset = parseGeoPackage(geoPackage, typedArray, view, bytesOffset, createEdge, transferableObjects);
-        }
-
-        var pickInfoPackageCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var pickColorCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        for (var i = 0; i < pickColorCount; i++) {
-            var geoName = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var pickIdsCount = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var pickInfo = {};
-            var bInstanced = geoPackage[geoName].vertexPackage.instanceIndex;
-            if (bInstanced == -1) {
-                var batchIds = new Float32Array(geoPackage[geoName].vertexPackage.verticesCount);
-                for (var j = 0; j < pickIdsCount; j++) {
-                    var pickId = view.getUint32(bytesOffset, true);
-                    bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    var size = view.getUint32(bytesOffset, true);
-                    bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    var vertexCount = 0, vertexColorOffset = 0;
-                    pickInfo[pickId] = {
-                        batchId : j
-                    };
-                    for (var k = 0; k < size; k++) {
-                        vertexColorOffset = view.getUint32(bytesOffset, true);
-                        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-                        vertexCount = view.getUint32(bytesOffset, true);
-                        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-                        if (batchIds.fill) {
-                            batchIds.fill(j, vertexColorOffset, vertexColorOffset + vertexCount);
-                        } else {
-                            var total = vertexColorOffset + vertexColorOffset;
-                            for(var m = vertexColorOffset; m < total; m++) {
-                                batchIds[m] = j;
-                            }
-                        }
-                    }
-                    pickInfo[pickId].vertexColorOffset = vertexColorOffset;
-                    pickInfo[pickId].vertexColorCount = vertexCount;
-                }
-
-                createBatchIdAttribute(geoPackage[geoName].vertexPackage, batchIds, undefined);
-            }
-            else {
-                var instanceCount = geoPackage[geoName].vertexPackage.instanceCount;
-                var instanceArray = geoPackage[geoName].vertexPackage.instanceBuffer;
-                var instanceMode = geoPackage[geoName].vertexPackage.instanceMode;
-                var instanceIds = new Float32Array(instanceCount);
-                var instanceIdIndex = 0;
-                for (var j = 0; j < pickIdsCount; j++) {
-                    var pickId = view.getUint32(bytesOffset, true);
-                    bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    var size = view.getUint32(bytesOffset, true);
-                    bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-                    for (var k = 0; k < size; k++) {
-                        var instanceId = view.getUint32(bytesOffset, true);
-                        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-                        instanceIds[instanceIdIndex] = instanceIdIndex;
-                        if(pickInfo[pickId] === undefined){
-                            pickInfo[pickId] = {
-                                vertexColorCount : 1,
-                                instanceIds : [],
-                                vertexColorOffset : instanceIdIndex
-                            };
-                        }
-                        pickInfo[pickId].instanceIds.push(instanceId);
-                        instanceIdIndex ++;
-                    }
-
-                }
-
-                createBatchIdAttribute(geoPackage[geoName].vertexPackage, instanceIds, 1);
-            }
-
-            geoPackage[geoName].pickInfo = pickInfo;
-        }
-
-        var texturePackageCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var imageCount = view.getUint32(bytesOffset, true);
-        bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-        var texturePackage = {};
-        for (var i = 0; i < imageCount; i++) {
-            var id = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var width = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var height = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var compressType = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var size = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var pixelFormat = view.getUint32(bytesOffset, true);
-            bytesOffset += Uint32Array.BYTES_PER_ELEMENT;
-            var imageTypedArray = null;
-            if (compressType === S3MCompressType.S3MCompressType.enrS3TCDXTN && supportCompressType !== 1) {
-                var pEncode = null;
-                if (pixelFormat > S3MCompressType.S3MPixelFormat.BGR || pixelFormat === S3MCompressType.S3MPixelFormat.LUMINANCE_ALPHA) {
-                    pEncode = new Uint8Array(unzipBuffer, bytesOffset, width * height);
-                    imageTypedArray = new Uint8Array(width * height * 4);
-                }
-                else {
-                    pEncode = new Uint16Array(unzipBuffer, bytesOffset, size / 2);
-                    imageTypedArray = new Uint16Array(width * height);
-                }
-                S3MCompressType.DXTTextureDecode.decode(imageTypedArray, width, height, pEncode, pixelFormat);
-                transferableObjects.push(imageTypedArray.buffer);
-                compressType = 0;
-            }
-            else {
-                imageTypedArray = new Uint8Array(unzipBuffer, bytesOffset, size);
-            }
-
-            texturePackage[id] = {
-                id: id,
-                width: width,
-                height: height,
-                compressType: compressType,
-                nFormat: pixelFormat,
-                imageBuffer: imageTypedArray
-            };
-            bytesOffset += size;
-        }
-
-        return {
-            result: true,
-            version: version,
-            xmlDoc: xmlDoc,
-            geoPackage: geoPackage,
-            texturePackage: texturePackage,
-            volImageBuffer: volImageBuffer,
-            volBounds: volBounds
-        };
-    }
-
-    var S3MTilesParser$1 = createTaskProcessorWorker(S3MTilesParser);
-
-    return S3MTilesParser$1;
-
-});
diff --git a/public/libs/Cesium/Workers/TerrainEncoding-a807a704.js b/public/libs/Cesium/Workers/TerrainEncoding-a807a704.js
deleted file mode 100644
index 8039224..0000000
--- a/public/libs/Cesium/Workers/TerrainEncoding-a807a704.js
+++ /dev/null
@@ -1,828 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './ComponentDatatype-5862616f', './AttributeCompression-84a90a13'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, ComponentDatatype, AttributeCompression) { 'use strict';
-
-    /**
-         * Determine whether or not other objects are visible or hidden behind the visible horizon defined by
-         * an {@link Ellipsoid} and a camera position.  The ellipsoid is assumed to be located at the
-         * origin of the coordinate system.  This class uses the algorithm described in the
-         * {@link https://cesium.com/blog/2013/04/25/Horizon-culling/|Horizon Culling} blog post.
-         *
-         * @alias EllipsoidalOccluder
-         *
-         * @param {Ellipsoid} ellipsoid The ellipsoid to use as an occluder.
-         * @param {Cartesian3} [cameraPosition] The coordinate of the viewer/camera.  If this parameter is not
-         *        specified, {@link EllipsoidalOccluder#cameraPosition} must be called before
-         *        testing visibility.
-         *
-         * @constructor
-         *
-         * @example
-         * // Construct an ellipsoidal occluder with radii 1.0, 1.1, and 0.9.
-         * var cameraPosition = new Cesium.Cartesian3(5.0, 6.0, 7.0);
-         * var occluderEllipsoid = new Cesium.Ellipsoid(1.0, 1.1, 0.9);
-         * var occluder = new Cesium.EllipsoidalOccluder(occluderEllipsoid, cameraPosition);
-         *
-         * @private
-         */
-        function EllipsoidalOccluder(ellipsoid, cameraPosition) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('ellipsoid', ellipsoid);
-            //>>includeEnd('debug');
-
-            this._ellipsoid = ellipsoid;
-            this._cameraPosition = new Cartographic.Cartesian3();
-            this._cameraPositionInScaledSpace = new Cartographic.Cartesian3();
-            this._distanceToLimbInScaledSpaceSquared = 0.0;
-
-            // cameraPosition fills in the above values
-            if (when.defined(cameraPosition)) {
-                this.cameraPosition = cameraPosition;
-            }
-        }
-
-        Object.defineProperties(EllipsoidalOccluder.prototype, {
-            /**
-             * Gets the occluding ellipsoid.
-             * @memberof EllipsoidalOccluder.prototype
-             * @type {Ellipsoid}
-             */
-            ellipsoid : {
-                get: function() {
-                    return this._ellipsoid;
-                }
-            },
-            /**
-             * Gets or sets the position of the camera.
-             * @memberof EllipsoidalOccluder.prototype
-             * @type {Cartesian3}
-             */
-            cameraPosition : {
-                get : function() {
-                    return this._cameraPosition;
-                },
-                set : function(cameraPosition) {
-                    // See https://cesium.com/blog/2013/04/25/Horizon-culling/
-                    var ellipsoid = this._ellipsoid;
-                    var cv = ellipsoid.transformPositionToScaledSpace(cameraPosition, this._cameraPositionInScaledSpace);
-                    var vhMagnitudeSquared = Cartographic.Cartesian3.magnitudeSquared(cv) - 1.0;
-
-                    Cartographic.Cartesian3.clone(cameraPosition, this._cameraPosition);
-                    this._cameraPositionInScaledSpace = cv;
-                    this._distanceToLimbInScaledSpaceSquared = vhMagnitudeSquared;
-                }
-            }
-        });
-
-        var scratchCartesian = new Cartographic.Cartesian3();
-
-        /**
-         * Determines whether or not a point, the <code>occludee</code>, is hidden from view by the occluder.
-         *
-         * @param {Cartesian3} occludee The point to test for visibility.
-         * @returns {Boolean} <code>true</code> if the occludee is visible; otherwise <code>false</code>.
-         *
-         * @example
-         * var cameraPosition = new Cesium.Cartesian3(0, 0, 2.5);
-         * var ellipsoid = new Cesium.Ellipsoid(1.0, 1.1, 0.9);
-         * var occluder = new Cesium.EllipsoidalOccluder(ellipsoid, cameraPosition);
-         * var point = new Cesium.Cartesian3(0, -3, -3);
-         * occluder.isPointVisible(point); //returns true
-         */
-        EllipsoidalOccluder.prototype.isPointVisible = function(occludee) {
-            var ellipsoid = this._ellipsoid;
-            var occludeeScaledSpacePosition = ellipsoid.transformPositionToScaledSpace(occludee, scratchCartesian);
-            return isScaledSpacePointVisible(occludeeScaledSpacePosition, this._cameraPositionInScaledSpace, this._distanceToLimbInScaledSpaceSquared);
-        };
-
-        /**
-         * Determines whether or not a point expressed in the ellipsoid scaled space, is hidden from view by the
-         * occluder.  To transform a Cartesian X, Y, Z position in the coordinate system aligned with the ellipsoid
-         * into the scaled space, call {@link Ellipsoid#transformPositionToScaledSpace}.
-         *
-         * @param {Cartesian3} occludeeScaledSpacePosition The point to test for visibility, represented in the scaled space.
-         * @returns {Boolean} <code>true</code> if the occludee is visible; otherwise <code>false</code>.
-         *
-         * @example
-         * var cameraPosition = new Cesium.Cartesian3(0, 0, 2.5);
-         * var ellipsoid = new Cesium.Ellipsoid(1.0, 1.1, 0.9);
-         * var occluder = new Cesium.EllipsoidalOccluder(ellipsoid, cameraPosition);
-         * var point = new Cesium.Cartesian3(0, -3, -3);
-         * var scaledSpacePoint = ellipsoid.transformPositionToScaledSpace(point);
-         * occluder.isScaledSpacePointVisible(scaledSpacePoint); //returns true
-         */
-        EllipsoidalOccluder.prototype.isScaledSpacePointVisible = function(occludeeScaledSpacePosition) {
-            return isScaledSpacePointVisible(occludeeScaledSpacePosition, this._cameraPositionInScaledSpace, this._distanceToLimbInScaledSpaceSquared);
-        };
-
-        var scratchCameraPositionInScaledSpaceShrunk = new Cartographic.Cartesian3();
-
-        /**
-         * Similar to {@link EllipsoidalOccluder#isScaledSpacePointVisible} except tests against an
-         * ellipsoid that has been shrunk by the minimum height when the minimum height is below
-         * the ellipsoid. This is intended to be used with points generated by
-         * {@link EllipsoidalOccluder#computeHorizonCullingPointPossiblyUnderEllipsoid} or
-         * {@link EllipsoidalOccluder#computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid}.
-         *
-         * @param {Cartesian3} occludeeScaledSpacePosition The point to test for visibility, represented in the scaled space of the possibly-shrunk ellipsoid.
-         * @returns {Boolean} <code>true</code> if the occludee is visible; otherwise <code>false</code>.
-         */
-        EllipsoidalOccluder.prototype.isScaledSpacePointVisiblePossiblyUnderEllipsoid = function(occludeeScaledSpacePosition, minimumHeight) {
-            var ellipsoid = this._ellipsoid;
-            var vhMagnitudeSquared;
-            var cv;
-
-            if (when.defined(minimumHeight) && minimumHeight < 0.0 && ellipsoid.minimumRadius > -minimumHeight) {
-                // This code is similar to the cameraPosition setter, but unrolled for performance because it will be called a lot.
-                cv = scratchCameraPositionInScaledSpaceShrunk;
-                cv.x = this._cameraPosition.x / (ellipsoid.radii.x + minimumHeight);
-                cv.y = this._cameraPosition.y / (ellipsoid.radii.y + minimumHeight);
-                cv.z = this._cameraPosition.z / (ellipsoid.radii.z + minimumHeight);
-                vhMagnitudeSquared = cv.x * cv.x + cv.y * cv.y + cv.z * cv.z - 1.0;
-            } else {
-                cv = this._cameraPositionInScaledSpace;
-                vhMagnitudeSquared = this._distanceToLimbInScaledSpaceSquared;
-            }
-
-            return isScaledSpacePointVisible(occludeeScaledSpacePosition, cv, vhMagnitudeSquared);
-        };
-
-        /**
-         * Computes a point that can be used for horizon culling from a list of positions.  If the point is below
-         * the horizon, all of the positions are guaranteed to be below the horizon as well.  The returned point
-         * is expressed in the ellipsoid-scaled space and is suitable for use with
-         * {@link EllipsoidalOccluder#isScaledSpacePointVisible}.
-         *
-         * @param {Cartesian3} directionToPoint The direction that the computed point will lie along.
-         *                     A reasonable direction to use is the direction from the center of the ellipsoid to
-         *                     the center of the bounding sphere computed from the positions.  The direction need not
-         *                     be normalized.
-         * @param {Cartesian3[]} positions The positions from which to compute the horizon culling point.  The positions
-         *                       must be expressed in a reference frame centered at the ellipsoid and aligned with the
-         *                       ellipsoid's axes.
-         * @param {Cartesian3} [result] The instance on which to store the result instead of allocating a new instance.
-         * @returns {Cartesian3} The computed horizon culling point, expressed in the ellipsoid-scaled space.
-         */
-        EllipsoidalOccluder.prototype.computeHorizonCullingPoint = function(directionToPoint, positions, result) {
-            return computeHorizonCullingPointFromPositions(this._ellipsoid, directionToPoint, positions, result);
-        };
-
-        var scratchEllipsoidShrunk = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-
-        /**
-         * Similar to {@link EllipsoidalOccluder#computeHorizonCullingPoint} except computes the culling
-         * point relative to an ellipsoid that has been shrunk by the minimum height when the minimum height is below
-         * the ellipsoid. The returned point is expressed in the possibly-shrunk ellipsoid-scaled space and is suitable
-         * for use with {@link EllipsoidalOccluder#isScaledSpacePointVisiblePossiblyUnderEllipsoid}.
-         *
-         * @param {Cartesian3} directionToPoint The direction that the computed point will lie along.
-         *                     A reasonable direction to use is the direction from the center of the ellipsoid to
-         *                     the center of the bounding sphere computed from the positions.  The direction need not
-         *                     be normalized.
-         * @param {Cartesian3[]} positions The positions from which to compute the horizon culling point.  The positions
-         *                       must be expressed in a reference frame centered at the ellipsoid and aligned with the
-         *                       ellipsoid's axes.
-         * @param {Number} [minimumHeight] The minimum height of all positions. If this value is undefined, all positions are assumed to be above the ellipsoid.
-         * @param {Cartesian3} [result] The instance on which to store the result instead of allocating a new instance.
-         * @returns {Cartesian3} The computed horizon culling point, expressed in the possibly-shrunk ellipsoid-scaled space.
-         */
-        EllipsoidalOccluder.prototype.computeHorizonCullingPointPossiblyUnderEllipsoid = function(directionToPoint, positions, minimumHeight, result) {
-            var possiblyShrunkEllipsoid = getPossiblyShrunkEllipsoid(this._ellipsoid, minimumHeight, scratchEllipsoidShrunk);
-            return computeHorizonCullingPointFromPositions(possiblyShrunkEllipsoid, directionToPoint, positions, result);
-        };
-        /**
-         * Computes a point that can be used for horizon culling from a list of positions.  If the point is below
-         * the horizon, all of the positions are guaranteed to be below the horizon as well.  The returned point
-         * is expressed in the ellipsoid-scaled space and is suitable for use with
-         * {@link EllipsoidalOccluder#isScaledSpacePointVisible}.
-         *
-         * @param {Cartesian3} directionToPoint The direction that the computed point will lie along.
-         *                     A reasonable direction to use is the direction from the center of the ellipsoid to
-         *                     the center of the bounding sphere computed from the positions.  The direction need not
-         *                     be normalized.
-         * @param {Number[]} vertices  The vertices from which to compute the horizon culling point.  The positions
-         *                   must be expressed in a reference frame centered at the ellipsoid and aligned with the
-         *                   ellipsoid's axes.
-         * @param {Number} [stride=3]
-         * @param {Cartesian3} [center=Cartesian3.ZERO]
-         * @param {Cartesian3} [result] The instance on which to store the result instead of allocating a new instance.
-         * @returns {Cartesian3} The computed horizon culling point, expressed in the ellipsoid-scaled space.
-         */
-        EllipsoidalOccluder.prototype.computeHorizonCullingPointFromVertices = function(directionToPoint, vertices, stride, center, result) {
-            return computeHorizonCullingPointFromVertices(this._ellipsoid, directionToPoint, vertices, stride, center, result);
-        };
-
-        /**
-         * Similar to {@link EllipsoidalOccluder#computeHorizonCullingPointFromVertices} except computes the culling
-         * point relative to an ellipsoid that has been shrunk by the minimum height when the minimum height is below
-         * the ellipsoid. The returned point is expressed in the possibly-shrunk ellipsoid-scaled space and is suitable
-         * for use with {@link EllipsoidalOccluder#isScaledSpacePointVisiblePossiblyUnderEllipsoid}.
-         *
-         * @param {Cartesian3} directionToPoint The direction that the computed point will lie along.
-         *                     A reasonable direction to use is the direction from the center of the ellipsoid to
-         *                     the center of the bounding sphere computed from the positions.  The direction need not
-         *                     be normalized.
-         * @param {Number[]} vertices  The vertices from which to compute the horizon culling point.  The positions
-         *                   must be expressed in a reference frame centered at the ellipsoid and aligned with the
-         *                   ellipsoid's axes.
-         * @param {Number} [stride=3]
-         * @param {Cartesian3} [center=Cartesian3.ZERO]
-         * @param {Number} [minimumHeight] The minimum height of all vertices. If this value is undefined, all vertices are assumed to be above the ellipsoid.
-         * @param {Cartesian3} [result] The instance on which to store the result instead of allocating a new instance.
-         * @returns {Cartesian3} The computed horizon culling point, expressed in the possibly-shrunk ellipsoid-scaled space.
-         */
-        EllipsoidalOccluder.prototype.computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid = function(directionToPoint, vertices, stride, center, minimumHeight, result) {
-            var possiblyShrunkEllipsoid = getPossiblyShrunkEllipsoid(this._ellipsoid, minimumHeight, scratchEllipsoidShrunk);
-            return computeHorizonCullingPointFromVertices(possiblyShrunkEllipsoid, directionToPoint, vertices, stride, center, result);
-        };
-
-        var subsampleScratch = [];
-
-        /**
-         * Computes a point that can be used for horizon culling of a rectangle.  If the point is below
-         * the horizon, the ellipsoid-conforming rectangle is guaranteed to be below the horizon as well.
-         * The returned point is expressed in the ellipsoid-scaled space and is suitable for use with
-         * {@link EllipsoidalOccluder#isScaledSpacePointVisible}.
-         *
-         * @param {Rectangle} rectangle The rectangle for which to compute the horizon culling point.
-         * @param {Ellipsoid} ellipsoid The ellipsoid on which the rectangle is defined.  This may be different from
-         *                    the ellipsoid used by this instance for occlusion testing.
-         * @param {Cartesian3} [result] The instance on which to store the result instead of allocating a new instance.
-         * @returns {Cartesian3} The computed horizon culling point, expressed in the ellipsoid-scaled space.
-         */
-        EllipsoidalOccluder.prototype.computeHorizonCullingPointFromRectangle = function(rectangle, ellipsoid, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            //>>includeEnd('debug');
-
-            var positions = Cartesian2.Rectangle.subsample(rectangle, ellipsoid, 0.0, subsampleScratch);
-            var bs = BoundingSphere.BoundingSphere.fromPoints(positions);
-
-            // If the bounding sphere center is too close to the center of the occluder, it doesn't make
-            // sense to try to horizon cull it.
-            if (Cartographic.Cartesian3.magnitude(bs.center) < 0.1 * ellipsoid.minimumRadius) {
-                return undefined;
-            }
-
-            return this.computeHorizonCullingPoint(bs.center, positions, result);
-        };
-
-        var scratchEllipsoidShrunkRadii = new Cartographic.Cartesian3();
-
-        function getPossiblyShrunkEllipsoid(ellipsoid, minimumHeight, result) {
-            if (when.defined(minimumHeight) && minimumHeight < 0.0 && ellipsoid.minimumRadius > -minimumHeight) {
-                var ellipsoidShrunkRadii = Cartographic.Cartesian3.fromElements(
-                    ellipsoid.radii.x + minimumHeight,
-                    ellipsoid.radii.y + minimumHeight,
-                    ellipsoid.radii.z + minimumHeight,
-                    scratchEllipsoidShrunkRadii
-                );
-                ellipsoid = Cartesian2.Ellipsoid.fromCartesian3(ellipsoidShrunkRadii, result);
-            }
-            return ellipsoid;
-        }
-
-        function computeHorizonCullingPointFromPositions(ellipsoid, directionToPoint, positions, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('directionToPoint', directionToPoint);
-            Check.Check.defined('positions', positions);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            var scaledSpaceDirectionToPoint = computeScaledSpaceDirectionToPoint(ellipsoid, directionToPoint);
-            var resultMagnitude = 0.0;
-
-            for (var i = 0, len = positions.length; i < len; ++i) {
-                var position = positions[i];
-                var candidateMagnitude = computeMagnitude(ellipsoid, position, scaledSpaceDirectionToPoint);
-                if (candidateMagnitude < 0.0) {
-                    // all points should face the same direction, but this one doesn't, so return undefined
-                    return undefined;
-                }
-                resultMagnitude = Math.max(resultMagnitude, candidateMagnitude);
-            }
-
-            return magnitudeToPoint(scaledSpaceDirectionToPoint, resultMagnitude, result);
-        }
-
-        var positionScratch = new Cartographic.Cartesian3();
-
-        function computeHorizonCullingPointFromVertices(ellipsoid, directionToPoint, vertices, stride, center, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('directionToPoint', directionToPoint);
-            Check.Check.defined('vertices', vertices);
-            Check.Check.typeOf.number('stride', stride);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartographic.Cartesian3();
-            }
-
-            stride = when.defaultValue(stride, 3);
-            center = when.defaultValue(center, Cartographic.Cartesian3.ZERO);
-            var scaledSpaceDirectionToPoint = computeScaledSpaceDirectionToPoint(ellipsoid, directionToPoint);
-            var resultMagnitude = 0.0;
-
-            for (var i = 0, len = vertices.length; i < len; i += stride) {
-                positionScratch.x = vertices[i] + center.x;
-                positionScratch.y = vertices[i + 1] + center.y;
-                positionScratch.z = vertices[i + 2] + center.z;
-
-                var candidateMagnitude = computeMagnitude(ellipsoid, positionScratch, scaledSpaceDirectionToPoint);
-                if (candidateMagnitude < 0.0) {
-                    // all points should face the same direction, but this one doesn't, so return undefined
-                    return undefined;
-                }
-                resultMagnitude = Math.max(resultMagnitude, candidateMagnitude);
-            }
-
-            return magnitudeToPoint(scaledSpaceDirectionToPoint, resultMagnitude, result);
-        }
-
-        function isScaledSpacePointVisible(occludeeScaledSpacePosition, cameraPositionInScaledSpace, distanceToLimbInScaledSpaceSquared) {
-            // See https://cesium.com/blog/2013/04/25/Horizon-culling/
-            var cv = cameraPositionInScaledSpace;
-            var vhMagnitudeSquared = distanceToLimbInScaledSpaceSquared;
-            var vt = Cartographic.Cartesian3.subtract(occludeeScaledSpacePosition, cv, scratchCartesian);
-            var vtDotVc = -Cartographic.Cartesian3.dot(vt, cv);
-            // If vhMagnitudeSquared < 0 then we are below the surface of the ellipsoid and
-            // in this case, set the culling plane to be on V.
-            var isOccluded = vhMagnitudeSquared < 0 ? vtDotVc > 0 : (vtDotVc > vhMagnitudeSquared &&
-                             vtDotVc * vtDotVc / Cartographic.Cartesian3.magnitudeSquared(vt) > vhMagnitudeSquared);
-            return !isOccluded;
-        }
-
-        var scaledSpaceScratch = new Cartographic.Cartesian3();
-        var directionScratch = new Cartographic.Cartesian3();
-
-        function computeMagnitude(ellipsoid, position, scaledSpaceDirectionToPoint) {
-            var scaledSpacePosition = ellipsoid.transformPositionToScaledSpace(position, scaledSpaceScratch);
-            var magnitudeSquared = Cartographic.Cartesian3.magnitudeSquared(scaledSpacePosition);
-            var magnitude = Math.sqrt(magnitudeSquared);
-            var direction = Cartographic.Cartesian3.divideByScalar(scaledSpacePosition, magnitude, directionScratch);
-
-            // For the purpose of this computation, points below the ellipsoid are consider to be on it instead.
-            magnitudeSquared = Math.max(1.0, magnitudeSquared);
-            magnitude = Math.max(1.0, magnitude);
-
-            var cosAlpha = Cartographic.Cartesian3.dot(direction, scaledSpaceDirectionToPoint);
-            var sinAlpha = Cartographic.Cartesian3.magnitude(Cartographic.Cartesian3.cross(direction, scaledSpaceDirectionToPoint, direction));
-            var cosBeta = 1.0 / magnitude;
-            var sinBeta = Math.sqrt(magnitudeSquared - 1.0) * cosBeta;
-
-            return 1.0 / (cosAlpha * cosBeta - sinAlpha * sinBeta);
-        }
-
-        function magnitudeToPoint(scaledSpaceDirectionToPoint, resultMagnitude, result) {
-            // The horizon culling point is undefined if there were no positions from which to compute it,
-            // the directionToPoint is pointing opposite all of the positions,  or if we computed NaN or infinity.
-            if (resultMagnitude <= 0.0 || resultMagnitude === 1.0 / 0.0 || resultMagnitude !== resultMagnitude) {
-                return undefined;
-            }
-
-            return Cartographic.Cartesian3.multiplyByScalar(scaledSpaceDirectionToPoint, resultMagnitude, result);
-        }
-
-        var directionToPointScratch = new Cartographic.Cartesian3();
-
-        function computeScaledSpaceDirectionToPoint(ellipsoid, directionToPoint) {
-            if (Cartographic.Cartesian3.equals(directionToPoint, Cartographic.Cartesian3.ZERO)) {
-                return directionToPoint;
-            }
-
-            ellipsoid.transformPositionToScaledSpace(directionToPoint, directionToPointScratch);
-            return Cartographic.Cartesian3.normalize(directionToPointScratch, directionToPointScratch);
-        }
-
-    /**
-     * This enumerated type is used to determine how the vertices of the terrain mesh are compressed.
-     *
-     * @exports TerrainQuantization
-     *
-     * @private
-     */
-    var TerrainQuantization = {
-        /**
-         * The vertices are not compressed.
-         *
-         * @type {Number}
-         * @constant
-         */
-        NONE : 0,
-
-        /**
-         * The vertices are compressed to 12 bits.
-         *
-         * @type {Number}
-         * @constant
-         */
-        BITS12 : 1
-    };
-
-    var TerrainQuantization$1 = Object.freeze(TerrainQuantization);
-
-    var cartesian3Scratch = new Cartographic.Cartesian3();
-    var cartesian3DimScratch = new Cartographic.Cartesian3();
-    var cartesian2Scratch = new Cartesian2.Cartesian2();
-    var matrix4Scratch = new BoundingSphere.Matrix4();
-    var matrix4Scratch2 = new BoundingSphere.Matrix4();
-
-    var SHIFT_LEFT_12 = Math.pow(2.0, 12.0);
-
-    /**
-     * Data used to quantize and pack the terrain mesh. The position can be unpacked for picking and all attributes
-     * are unpacked in the vertex shader.
-     *
-     * @alias TerrainEncoding
-     * @constructor
-     *
-     * @param {AxisAlignedBoundingBox} axisAlignedBoundingBox The bounds of the tile in the east-north-up coordinates at the tiles center.
-     * @param {Number} minimumHeight The minimum height.
-     * @param {Number} maximumHeight The maximum height.
-     * @param {Matrix4} fromENU The east-north-up to fixed frame matrix at the center of the terrain mesh.
-     * @param {Boolean} hasVertexNormals If the mesh has vertex normals.
-     * @param {Boolean} [hasWebMercatorT=false] true if the terrain data includes a Web Mercator texture coordinate; otherwise, false.
-     *
-     * @private
-     */
-    function TerrainEncoding(axisAlignedBoundingBox, minimumHeight, maximumHeight, fromENU, hasVertexNormals, hasWebMercatorT) {
-        var quantization = TerrainQuantization$1.NONE;
-        var center;
-        var toENU;
-        var matrix;
-
-        if (when.defined(axisAlignedBoundingBox) && when.defined(minimumHeight) && when.defined(maximumHeight) && when.defined(fromENU)) {
-            var minimum = axisAlignedBoundingBox.minimum;
-            var maximum = axisAlignedBoundingBox.maximum;
-
-            var dimensions = Cartographic.Cartesian3.subtract(maximum, minimum, cartesian3DimScratch);
-            var hDim = maximumHeight - minimumHeight;
-            var maxDim = Math.max(Cartographic.Cartesian3.maximumComponent(dimensions), hDim);
-
-            if (maxDim < SHIFT_LEFT_12 - 1.0) {
-                quantization = TerrainQuantization$1.BITS12;
-            } else {
-                quantization = TerrainQuantization$1.NONE;
-            }
-
-            quantization = TerrainQuantization$1.NONE;//防止精度损失,出现地形模型匹配不上,默认不压缩
-
-            center = axisAlignedBoundingBox.center;
-            toENU = BoundingSphere.Matrix4.inverseTransformation(fromENU, new BoundingSphere.Matrix4());
-
-            var translation = Cartographic.Cartesian3.negate(minimum, cartesian3Scratch);
-            BoundingSphere.Matrix4.multiply(BoundingSphere.Matrix4.fromTranslation(translation, matrix4Scratch), toENU, toENU);
-
-            var scale = cartesian3Scratch;
-            scale.x = 1.0 / dimensions.x;
-            scale.y = 1.0 / dimensions.y;
-            scale.z = 1.0 / dimensions.z;
-            BoundingSphere.Matrix4.multiply(BoundingSphere.Matrix4.fromScale(scale, matrix4Scratch), toENU, toENU);
-
-            matrix = BoundingSphere.Matrix4.clone(fromENU);
-            BoundingSphere.Matrix4.setTranslation(matrix, Cartographic.Cartesian3.ZERO, matrix);
-
-            fromENU = BoundingSphere.Matrix4.clone(fromENU, new BoundingSphere.Matrix4());
-
-            var translationMatrix = BoundingSphere.Matrix4.fromTranslation(minimum, matrix4Scratch);
-            var scaleMatrix =  BoundingSphere.Matrix4.fromScale(dimensions, matrix4Scratch2);
-            var st = BoundingSphere.Matrix4.multiply(translationMatrix, scaleMatrix,matrix4Scratch);
-
-            BoundingSphere.Matrix4.multiply(fromENU, st, fromENU);
-            BoundingSphere.Matrix4.multiply(matrix, st, matrix);
-        }
-
-        /**
-         * How the vertices of the mesh were compressed.
-         * @type {TerrainQuantization}
-         */
-        this.quantization = quantization;
-
-        /**
-         * The minimum height of the tile including the skirts.
-         * @type {Number}
-         */
-        this.minimumHeight = minimumHeight;
-
-        /**
-         * The maximum height of the tile.
-         * @type {Number}
-         */
-        this.maximumHeight = maximumHeight;
-
-        /**
-         * The center of the tile.
-         * @type {Cartesian3}
-         */
-        this.center = center;
-
-        /**
-         * A matrix that takes a vertex from the tile, transforms it to east-north-up at the center and scales
-         * it so each component is in the [0, 1] range.
-         * @type {Matrix4}
-         */
-        this.toScaledENU = toENU;
-
-        /**
-         * A matrix that restores a vertex transformed with toScaledENU back to the earth fixed reference frame
-         * @type {Matrix4}
-         */
-        this.fromScaledENU = fromENU;
-
-        /**
-         * The matrix used to decompress the terrain vertices in the shader for RTE rendering.
-         * @type {Matrix4}
-         */
-        this.matrix = matrix;
-
-        /**
-         * The terrain mesh contains normals.
-         * @type {Boolean}
-         */
-        this.hasVertexNormals = hasVertexNormals;
-
-        /**
-         * The terrain mesh contains a vertical texture coordinate following the Web Mercator projection.
-         * @type {Boolean}
-         */
-        this.hasWebMercatorT = when.defaultValue(hasWebMercatorT, false);
-    }
-
-    TerrainEncoding.prototype.encode = function(vertexBuffer, bufferIndex, position, uv, height, normalToPack, webMercatorT) {
-        var u = uv.x;
-        var v = uv.y;
-
-        if (this.quantization === TerrainQuantization$1.BITS12) {
-            position = BoundingSphere.Matrix4.multiplyByPoint(this.toScaledENU, position, cartesian3Scratch);
-
-            position.x = _Math.CesiumMath.clamp(position.x, 0.0, 1.0);
-            position.y = _Math.CesiumMath.clamp(position.y, 0.0, 1.0);
-            position.z = _Math.CesiumMath.clamp(position.z, 0.0, 1.0);
-
-            var hDim = this.maximumHeight - this.minimumHeight;
-            var h = _Math.CesiumMath.clamp((height - this.minimumHeight) / hDim, 0.0, 1.0);
-
-            Cartesian2.Cartesian2.fromElements(position.x, position.y, cartesian2Scratch);
-            var compressed0 = AttributeCompression.AttributeCompression.compressTextureCoordinates(cartesian2Scratch);
-
-            Cartesian2.Cartesian2.fromElements(position.z, h, cartesian2Scratch);
-            var compressed1 = AttributeCompression.AttributeCompression.compressTextureCoordinates(cartesian2Scratch);
-
-            Cartesian2.Cartesian2.fromElements(u, v, cartesian2Scratch);
-            var compressed2 = AttributeCompression.AttributeCompression.compressTextureCoordinates(cartesian2Scratch);
-
-            vertexBuffer[bufferIndex++] = compressed0;
-            vertexBuffer[bufferIndex++] = compressed1;
-            vertexBuffer[bufferIndex++] = compressed2;
-
-            if (this.hasWebMercatorT) {
-                Cartesian2.Cartesian2.fromElements(webMercatorT, 0.0, cartesian2Scratch);
-                var compressed3 = AttributeCompression.AttributeCompression.compressTextureCoordinates(cartesian2Scratch);
-                vertexBuffer[bufferIndex++] = compressed3;
-            }
-        } else {
-            Cartographic.Cartesian3.subtract(position, this.center, cartesian3Scratch);
-
-            vertexBuffer[bufferIndex++] = cartesian3Scratch.x;
-            vertexBuffer[bufferIndex++] = cartesian3Scratch.y;
-            vertexBuffer[bufferIndex++] = cartesian3Scratch.z;
-            vertexBuffer[bufferIndex++] = height;
-            vertexBuffer[bufferIndex++] = u;
-            vertexBuffer[bufferIndex++] = v;
-
-            if (this.hasWebMercatorT) {
-                vertexBuffer[bufferIndex++] = webMercatorT;
-            }
-        }
-
-        if (this.hasVertexNormals) {
-            vertexBuffer[bufferIndex++] = AttributeCompression.AttributeCompression.octPackFloat(normalToPack);
-        }
-
-        return bufferIndex;
-    };
-
-    TerrainEncoding.prototype.decodePosition = function(buffer, index, result) {
-        if (!when.defined(result)) {
-            result = new Cartographic.Cartesian3();
-        }
-
-        index *= this.getStride();
-
-        if (this.quantization === TerrainQuantization$1.BITS12) {
-            var xy = AttributeCompression.AttributeCompression.decompressTextureCoordinates(buffer[index], cartesian2Scratch);
-            result.x = xy.x;
-            result.y = xy.y;
-
-            var zh = AttributeCompression.AttributeCompression.decompressTextureCoordinates(buffer[index + 1], cartesian2Scratch);
-            result.z = zh.x;
-
-            return BoundingSphere.Matrix4.multiplyByPoint(this.fromScaledENU, result, result);
-        }
-
-        result.x = buffer[index];
-        result.y = buffer[index + 1];
-        result.z = buffer[index + 2];
-        return Cartographic.Cartesian3.add(result, this.center, result);
-    };
-
-    TerrainEncoding.prototype.decodeTextureCoordinates = function(buffer, index, result) {
-        if (!when.defined(result)) {
-            result = new Cartesian2.Cartesian2();
-        }
-
-        index *= this.getStride();
-
-        if (this.quantization === TerrainQuantization$1.BITS12) {
-            return AttributeCompression.AttributeCompression.decompressTextureCoordinates(buffer[index + 2], result);
-        }
-
-        return Cartesian2.Cartesian2.fromElements(buffer[index + 4], buffer[index + 5], result);
-    };
-
-    TerrainEncoding.prototype.decodeHeight = function(buffer, index) {
-        index *= this.getStride();
-
-        if (this.quantization === TerrainQuantization$1.BITS12) {
-            var zh = AttributeCompression.AttributeCompression.decompressTextureCoordinates(buffer[index + 1], cartesian2Scratch);
-            return zh.y * (this.maximumHeight - this.minimumHeight) + this.minimumHeight;
-        }
-
-        return buffer[index + 3];
-    };
-
-    TerrainEncoding.prototype.decodeWebMercatorT = function(buffer, index) {
-        index *= this.getStride();
-
-        if (this.quantization === TerrainQuantization$1.BITS12) {
-            return AttributeCompression.AttributeCompression.decompressTextureCoordinates(buffer[index + 3], cartesian2Scratch).x;
-        }
-
-        return buffer[index + 6];
-    };
-
-    TerrainEncoding.prototype.getOctEncodedNormal = function(buffer, index, result) {
-        var stride = this.getStride();
-        index = (index + 1) * stride - 1;
-
-        var temp = buffer[index] / 256.0;
-        var x = Math.floor(temp);
-        var y = (temp - x) * 256.0;
-
-        return Cartesian2.Cartesian2.fromElements(x, y, result);
-    };
-
-    TerrainEncoding.prototype.getStride = function() {
-        var vertexStride;
-
-        switch (this.quantization) {
-            case TerrainQuantization$1.BITS12:
-                vertexStride = 3;
-                break;
-            default:
-                vertexStride = 6;
-        }
-
-        if (this.hasWebMercatorT) {
-            ++vertexStride;
-        }
-
-        if (this.hasVertexNormals) {
-            ++vertexStride;
-        }
-
-        return vertexStride;
-    };
-
-    var attributesNone = {
-        position3DAndHeight : 0,
-        textureCoordAndEncodedNormals : 1
-    };
-    var attributes = {
-        compressed0 : 0,
-        compressed1 : 1
-    };
-
-    TerrainEncoding.prototype.getAttributes = function(buffer) {
-        var datatype = ComponentDatatype.ComponentDatatype.FLOAT;
-        var sizeInBytes = ComponentDatatype.ComponentDatatype.getSizeInBytes(datatype);
-        var stride;
-
-        if (this.quantization === TerrainQuantization$1.NONE) {
-            var position3DAndHeightLength = 4;
-            var numTexCoordComponents = 2;
-
-            if (this.hasWebMercatorT) {
-                ++numTexCoordComponents;
-            }
-
-            if (this.hasVertexNormals) {
-                ++numTexCoordComponents;
-            }
-
-            stride = (position3DAndHeightLength + numTexCoordComponents) * sizeInBytes;
-
-            return [{
-                index : attributesNone.position3DAndHeight,
-                vertexBuffer : buffer,
-                componentDatatype : datatype,
-                componentsPerAttribute : position3DAndHeightLength,
-                offsetInBytes : 0,
-                strideInBytes : stride
-            }, {
-                index : attributesNone.textureCoordAndEncodedNormals,
-                vertexBuffer : buffer,
-                componentDatatype : datatype,
-                componentsPerAttribute : numTexCoordComponents,
-                offsetInBytes : position3DAndHeightLength * sizeInBytes,
-                strideInBytes : stride
-            }];
-        }
-
-        var numCompressed0 = 3;
-        var numCompressed1 = 0;
-
-        if (this.hasWebMercatorT || this.hasVertexNormals) {
-            ++numCompressed0;
-        }
-
-        if (this.hasWebMercatorT && this.hasVertexNormals) {
-            ++numCompressed1;
-
-            stride = (numCompressed0 + numCompressed1) * sizeInBytes;
-
-            return [{
-                index : attributes.compressed0,
-                vertexBuffer : buffer,
-                componentDatatype : datatype,
-                componentsPerAttribute : numCompressed0,
-                offsetInBytes : 0,
-                strideInBytes : stride
-            }, {
-                index : attributes.compressed1,
-                vertexBuffer : buffer,
-                componentDatatype : datatype,
-                componentsPerAttribute : numCompressed1,
-                offsetInBytes : numCompressed0 * sizeInBytes,
-                strideInBytes : stride
-            }];
-        }
-        return [{
-            index : attributes.compressed0,
-            vertexBuffer : buffer,
-            componentDatatype : datatype,
-            componentsPerAttribute : numCompressed0
-        }];
-    };
-
-    TerrainEncoding.prototype.getAttributeLocations = function() {
-        if (this.quantization === TerrainQuantization$1.NONE) {
-            return attributesNone;
-        }
-        return attributes;
-    };
-
-    TerrainEncoding.clone = function(encoding, result) {
-        if (!when.defined(result)) {
-            result = new TerrainEncoding();
-        }
-
-        result.quantization = encoding.quantization;
-        result.minimumHeight = encoding.minimumHeight;
-        result.maximumHeight = encoding.maximumHeight;
-        result.center = Cartographic.Cartesian3.clone(encoding.center);
-        result.toScaledENU = BoundingSphere.Matrix4.clone(encoding.toScaledENU);
-        result.fromScaledENU = BoundingSphere.Matrix4.clone(encoding.fromScaledENU);
-        result.matrix = BoundingSphere.Matrix4.clone(encoding.matrix);
-        result.hasVertexNormals = encoding.hasVertexNormals;
-        result.hasWebMercatorT = encoding.hasWebMercatorT;
-        return result;
-    };
-
-    exports.EllipsoidalOccluder = EllipsoidalOccluder;
-    exports.TerrainEncoding = TerrainEncoding;
-
-});
diff --git a/public/libs/Cesium/Workers/Transforms-a1cf7267.js b/public/libs/Cesium/Workers/Transforms-a1cf7267.js
deleted file mode 100644
index 06c81f9..0000000
--- a/public/libs/Cesium/Workers/Transforms-a1cf7267.js
+++ /dev/null
@@ -1,4466 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './FeatureDetection-7bd32c34', './buildModuleUrl-e7952659'], function (exports, when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, FeatureDetection, buildModuleUrl) { 'use strict';
-
-    /**
-         * A set of 4-dimensional coordinates used to represent rotation in 3-dimensional space.
-         * @alias Quaternion
-         * @constructor
-         *
-         * @param {Number} [x=0.0] The X component.
-         * @param {Number} [y=0.0] The Y component.
-         * @param {Number} [z=0.0] The Z component.
-         * @param {Number} [w=0.0] The W component.
-         *
-         * @see PackableForInterpolation
-         */
-        function Quaternion(x, y, z, w) {
-            /**
-             * The X component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.x = when.defaultValue(x, 0.0);
-
-            /**
-             * The Y component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.y = when.defaultValue(y, 0.0);
-
-            /**
-             * The Z component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.z = when.defaultValue(z, 0.0);
-
-            /**
-             * The W component.
-             * @type {Number}
-             * @default 0.0
-             */
-            this.w = when.defaultValue(w, 0.0);
-        }
-
-        var fromAxisAngleScratch = new Cartographic.Cartesian3();
-
-        /**
-         * Computes a quaternion representing a rotation around an axis.
-         *
-         * @param {Cartesian3} axis The axis of rotation.
-         * @param {Number} angle The angle in radians to rotate around the axis.
-         * @param {Quaternion} [result] The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter or a new Quaternion instance if one was not provided.
-         */
-        Quaternion.fromAxisAngle = function(axis, angle, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('axis', axis);
-            Check.Check.typeOf.number('angle', angle);
-            //>>includeEnd('debug');
-
-            var halfAngle = angle / 2.0;
-            var s = Math.sin(halfAngle);
-            fromAxisAngleScratch = Cartographic.Cartesian3.normalize(axis, fromAxisAngleScratch);
-
-            var x = fromAxisAngleScratch.x * s;
-            var y = fromAxisAngleScratch.y * s;
-            var z = fromAxisAngleScratch.z * s;
-            var w = Math.cos(halfAngle);
-            if (!when.defined(result)) {
-                return new Quaternion(x, y, z, w);
-            }
-            result.x = x;
-            result.y = y;
-            result.z = z;
-            result.w = w;
-            return result;
-        };
-
-        var fromRotationMatrixNext = [1, 2, 0];
-        var fromRotationMatrixQuat = new Array(3);
-        /**
-         * Computes a Quaternion from the provided Matrix3 instance.
-         *
-         * @param {Matrix3} matrix The rotation matrix.
-         * @param {Quaternion} [result] The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter or a new Quaternion instance if one was not provided.
-         *
-         * @see Matrix3.fromQuaternion
-         */
-        Quaternion.fromRotationMatrix = function(matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('matrix', matrix);
-            //>>includeEnd('debug');
-
-            var root;
-            var x;
-            var y;
-            var z;
-            var w;
-
-            var m00 = matrix[BoundingSphere.Matrix3.COLUMN0ROW0];
-            var m11 = matrix[BoundingSphere.Matrix3.COLUMN1ROW1];
-            var m22 = matrix[BoundingSphere.Matrix3.COLUMN2ROW2];
-            var trace = m00 + m11 + m22;
-
-            if (trace > 0.0) {
-                // |w| > 1/2, may as well choose w > 1/2
-                root = Math.sqrt(trace + 1.0); // 2w
-                w = 0.5 * root;
-                root = 0.5 / root; // 1/(4w)
-
-                x = (matrix[BoundingSphere.Matrix3.COLUMN1ROW2] - matrix[BoundingSphere.Matrix3.COLUMN2ROW1]) * root;
-                y = (matrix[BoundingSphere.Matrix3.COLUMN2ROW0] - matrix[BoundingSphere.Matrix3.COLUMN0ROW2]) * root;
-                z = (matrix[BoundingSphere.Matrix3.COLUMN0ROW1] - matrix[BoundingSphere.Matrix3.COLUMN1ROW0]) * root;
-            } else {
-                // |w| <= 1/2
-                var next = fromRotationMatrixNext;
-
-                var i = 0;
-                if (m11 > m00) {
-                    i = 1;
-                }
-                if (m22 > m00 && m22 > m11) {
-                    i = 2;
-                }
-                var j = next[i];
-                var k = next[j];
-
-                root = Math.sqrt(matrix[BoundingSphere.Matrix3.getElementIndex(i, i)] - matrix[BoundingSphere.Matrix3.getElementIndex(j, j)] - matrix[BoundingSphere.Matrix3.getElementIndex(k, k)] + 1.0);
-
-                var quat = fromRotationMatrixQuat;
-                quat[i] = 0.5 * root;
-                root = 0.5 / root;
-                w = (matrix[BoundingSphere.Matrix3.getElementIndex(k, j)] - matrix[BoundingSphere.Matrix3.getElementIndex(j, k)]) * root;
-                quat[j] = (matrix[BoundingSphere.Matrix3.getElementIndex(j, i)] + matrix[BoundingSphere.Matrix3.getElementIndex(i, j)]) * root;
-                quat[k] = (matrix[BoundingSphere.Matrix3.getElementIndex(k, i)] + matrix[BoundingSphere.Matrix3.getElementIndex(i, k)]) * root;
-
-                x = -quat[0];
-                y = -quat[1];
-                z = -quat[2];
-            }
-
-            if (!when.defined(result)) {
-                return new Quaternion(x, y, z, w);
-            }
-            result.x = x;
-            result.y = y;
-            result.z = z;
-            result.w = w;
-            return result;
-        };
-
-        var scratchHPRQuaternion = new Quaternion();
-        var scratchHeadingQuaternion = new Quaternion();
-        var scratchPitchQuaternion = new Quaternion();
-        var scratchRollQuaternion = new Quaternion();
-
-        /**
-         * Computes a rotation from the given heading, pitch and roll angles. Heading is the rotation about the
-         * negative z axis. Pitch is the rotation about the negative y axis. Roll is the rotation about
-         * the positive x axis.
-         *
-         * @param {HeadingPitchRoll} headingPitchRoll The rotation expressed as a heading, pitch and roll.
-         * @param {Quaternion} [result] The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter or a new Quaternion instance if none was provided.
-         */
-        Quaternion.fromHeadingPitchRoll = function(headingPitchRoll, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('headingPitchRoll', headingPitchRoll);
-            //>>includeEnd('debug');
-
-            scratchRollQuaternion = Quaternion.fromAxisAngle(Cartographic.Cartesian3.UNIT_X, headingPitchRoll.roll, scratchHPRQuaternion);
-            scratchPitchQuaternion = Quaternion.fromAxisAngle(Cartographic.Cartesian3.UNIT_Y, -headingPitchRoll.pitch, result);
-            result = Quaternion.multiply(scratchPitchQuaternion, scratchRollQuaternion, scratchPitchQuaternion);
-            scratchHeadingQuaternion = Quaternion.fromAxisAngle(Cartographic.Cartesian3.UNIT_Z, -headingPitchRoll.heading, scratchHPRQuaternion);
-            return Quaternion.multiply(scratchHeadingQuaternion, result, result);
-        };
-
-        var sampledQuaternionAxis = new Cartographic.Cartesian3();
-        var sampledQuaternionRotation = new Cartographic.Cartesian3();
-        var sampledQuaternionTempQuaternion = new Quaternion();
-        var sampledQuaternionQuaternion0 = new Quaternion();
-        var sampledQuaternionQuaternion0Conjugate = new Quaternion();
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        Quaternion.packedLength = 4;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {Quaternion} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        Quaternion.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value.x;
-            array[startingIndex++] = value.y;
-            array[startingIndex++] = value.z;
-            array[startingIndex] = value.w;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {Quaternion} [result] The object into which to store the result.
-         * @returns {Quaternion} The modified result parameter or a new Quaternion instance if one was not provided.
-         */
-        Quaternion.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new Quaternion();
-            }
-            result.x = array[startingIndex];
-            result.y = array[startingIndex + 1];
-            result.z = array[startingIndex + 2];
-            result.w = array[startingIndex + 3];
-            return result;
-        };
-
-        /**
-         * The number of elements used to store the object into an array in its interpolatable form.
-         * @type {Number}
-         */
-        Quaternion.packedInterpolationLength = 3;
-
-        /**
-         * Converts a packed array into a form suitable for interpolation.
-         *
-         * @param {Number[]} packedArray The packed array.
-         * @param {Number} [startingIndex=0] The index of the first element to be converted.
-         * @param {Number} [lastIndex=packedArray.length] The index of the last element to be converted.
-         * @param {Number[]} result The object into which to store the result.
-         */
-        Quaternion.convertPackedArrayForInterpolation = function(packedArray, startingIndex, lastIndex, result) {
-            Quaternion.unpack(packedArray, lastIndex * 4, sampledQuaternionQuaternion0Conjugate);
-            Quaternion.conjugate(sampledQuaternionQuaternion0Conjugate, sampledQuaternionQuaternion0Conjugate);
-
-            for (var i = 0, len = lastIndex - startingIndex + 1; i < len; i++) {
-                var offset = i * 3;
-                Quaternion.unpack(packedArray, (startingIndex + i) * 4, sampledQuaternionTempQuaternion);
-
-                Quaternion.multiply(sampledQuaternionTempQuaternion, sampledQuaternionQuaternion0Conjugate, sampledQuaternionTempQuaternion);
-
-                if (sampledQuaternionTempQuaternion.w < 0) {
-                    Quaternion.negate(sampledQuaternionTempQuaternion, sampledQuaternionTempQuaternion);
-                }
-
-                Quaternion.computeAxis(sampledQuaternionTempQuaternion, sampledQuaternionAxis);
-                var angle = Quaternion.computeAngle(sampledQuaternionTempQuaternion);
-                result[offset] = sampledQuaternionAxis.x * angle;
-                result[offset + 1] = sampledQuaternionAxis.y * angle;
-                result[offset + 2] = sampledQuaternionAxis.z * angle;
-            }
-        };
-
-        /**
-         * Retrieves an instance from a packed array converted with {@link convertPackedArrayForInterpolation}.
-         *
-         * @param {Number[]} array The array previously packed for interpolation.
-         * @param {Number[]} sourceArray The original packed array.
-         * @param {Number} [firstIndex=0] The firstIndex used to convert the array.
-         * @param {Number} [lastIndex=packedArray.length] The lastIndex used to convert the array.
-         * @param {Quaternion} [result] The object into which to store the result.
-         * @returns {Quaternion} The modified result parameter or a new Quaternion instance if one was not provided.
-         */
-        Quaternion.unpackInterpolationResult = function(array, sourceArray, firstIndex, lastIndex, result) {
-            if (!when.defined(result)) {
-                result = new Quaternion();
-            }
-            Cartographic.Cartesian3.fromArray(array, 0, sampledQuaternionRotation);
-            var magnitude = Cartographic.Cartesian3.magnitude(sampledQuaternionRotation);
-
-            Quaternion.unpack(sourceArray, lastIndex * 4, sampledQuaternionQuaternion0);
-
-            if (magnitude === 0) {
-                Quaternion.clone(Quaternion.IDENTITY, sampledQuaternionTempQuaternion);
-            } else {
-                Quaternion.fromAxisAngle(sampledQuaternionRotation, magnitude, sampledQuaternionTempQuaternion);
-            }
-
-            return Quaternion.multiply(sampledQuaternionTempQuaternion, sampledQuaternionQuaternion0, result);
-        };
-
-        /**
-         * Duplicates a Quaternion instance.
-         *
-         * @param {Quaternion} quaternion The quaternion to duplicate.
-         * @param {Quaternion} [result] The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter or a new Quaternion instance if one was not provided. (Returns undefined if quaternion is undefined)
-         */
-        Quaternion.clone = function(quaternion, result) {
-            if (!when.defined(quaternion)) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                return new Quaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w);
-            }
-
-            result.x = quaternion.x;
-            result.y = quaternion.y;
-            result.z = quaternion.z;
-            result.w = quaternion.w;
-            return result;
-        };
-
-        /**
-         * Computes the conjugate of the provided quaternion.
-         *
-         * @param {Quaternion} quaternion The quaternion to conjugate.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.conjugate = function(quaternion, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('quaternion', quaternion);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = -quaternion.x;
-            result.y = -quaternion.y;
-            result.z = -quaternion.z;
-            result.w = quaternion.w;
-            return result;
-        };
-
-        /**
-         * Computes magnitude squared for the provided quaternion.
-         *
-         * @param {Quaternion} quaternion The quaternion to conjugate.
-         * @returns {Number} The magnitude squared.
-         */
-        Quaternion.magnitudeSquared = function(quaternion) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('quaternion', quaternion);
-            //>>includeEnd('debug');
-
-            return quaternion.x * quaternion.x + quaternion.y * quaternion.y + quaternion.z * quaternion.z + quaternion.w * quaternion.w;
-        };
-
-        /**
-         * Computes magnitude for the provided quaternion.
-         *
-         * @param {Quaternion} quaternion The quaternion to conjugate.
-         * @returns {Number} The magnitude.
-         */
-        Quaternion.magnitude = function(quaternion) {
-            return Math.sqrt(Quaternion.magnitudeSquared(quaternion));
-        };
-
-        /**
-         * Computes the normalized form of the provided quaternion.
-         *
-         * @param {Quaternion} quaternion The quaternion to normalize.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.normalize = function(quaternion, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var inverseMagnitude = 1.0 / Quaternion.magnitude(quaternion);
-            var x = quaternion.x * inverseMagnitude;
-            var y = quaternion.y * inverseMagnitude;
-            var z = quaternion.z * inverseMagnitude;
-            var w = quaternion.w * inverseMagnitude;
-
-            result.x = x;
-            result.y = y;
-            result.z = z;
-            result.w = w;
-            return result;
-        };
-
-        /**
-         * Computes the inverse of the provided quaternion.
-         *
-         * @param {Quaternion} quaternion The quaternion to normalize.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.inverse = function(quaternion, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var magnitudeSquared = Quaternion.magnitudeSquared(quaternion);
-            result = Quaternion.conjugate(quaternion, result);
-            return Quaternion.multiplyByScalar(result, 1.0 / magnitudeSquared, result);
-        };
-
-        /**
-         * Computes the componentwise sum of two quaternions.
-         *
-         * @param {Quaternion} left The first quaternion.
-         * @param {Quaternion} right The second quaternion.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.add = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x + right.x;
-            result.y = left.y + right.y;
-            result.z = left.z + right.z;
-            result.w = left.w + right.w;
-            return result;
-        };
-
-        /**
-         * Computes the componentwise difference of two quaternions.
-         *
-         * @param {Quaternion} left The first quaternion.
-         * @param {Quaternion} right The second quaternion.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.subtract = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = left.x - right.x;
-            result.y = left.y - right.y;
-            result.z = left.z - right.z;
-            result.w = left.w - right.w;
-            return result;
-        };
-
-        /**
-         * Negates the provided quaternion.
-         *
-         * @param {Quaternion} quaternion The quaternion to be negated.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.negate = function(quaternion, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('quaternion', quaternion);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = -quaternion.x;
-            result.y = -quaternion.y;
-            result.z = -quaternion.z;
-            result.w = -quaternion.w;
-            return result;
-        };
-
-        /**
-         * Computes the dot (scalar) product of two quaternions.
-         *
-         * @param {Quaternion} left The first quaternion.
-         * @param {Quaternion} right The second quaternion.
-         * @returns {Number} The dot product.
-         */
-        Quaternion.dot = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            //>>includeEnd('debug');
-
-            return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w;
-        };
-
-        /**
-         * Computes the product of two quaternions.
-         *
-         * @param {Quaternion} left The first quaternion.
-         * @param {Quaternion} right The second quaternion.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.multiply = function(left, right, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('left', left);
-            Check.Check.typeOf.object('right', right);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var leftX = left.x;
-            var leftY = left.y;
-            var leftZ = left.z;
-            var leftW = left.w;
-
-            var rightX = right.x;
-            var rightY = right.y;
-            var rightZ = right.z;
-            var rightW = right.w;
-
-            var x = leftW * rightX + leftX * rightW + leftY * rightZ - leftZ * rightY;
-            var y = leftW * rightY - leftX * rightZ + leftY * rightW + leftZ * rightX;
-            var z = leftW * rightZ + leftX * rightY - leftY * rightX + leftZ * rightW;
-            var w = leftW * rightW - leftX * rightX - leftY * rightY - leftZ * rightZ;
-
-            result.x = x;
-            result.y = y;
-            result.z = z;
-            result.w = w;
-            return result;
-        };
-
-        Quaternion.multiplyByVec = function(q,v, result) {
-            
-            var uv =  new Cartographic.Cartesian3();
-            var uuv = new Cartographic.Cartesian3();
-            
-            var qvec = new Cartographic.Cartesian3(q.x,q.y,q.z);
-        
-            uv = Cartographic.Cartesian3.cross(qvec,v,uv); 
-            uuv = Cartographic.Cartesian3.cross(qvec,uv,uuv);
-            
-            var uv2 = new Cartographic.Cartesian3();
-            uv2 = Cartographic.Cartesian3.multiplyByScalar(uv,2.0 * q.w,uv2);
-            
-            var uuv2 = new Cartographic.Cartesian3();
-            uuv2 = Cartographic.Cartesian3.multiplyByScalar(uv,2.0,uuv2);
-        
-            result = Cartographic.Cartesian3.add(v,uv2,result);
-            result = Cartographic.Cartesian3.add(result,uuv2,result);
-            
-            return result;
-        };
-
-        /**
-         * Multiplies the provided quaternion componentwise by the provided scalar.
-         *
-         * @param {Quaternion} quaternion The quaternion to be scaled.
-         * @param {Number} scalar The scalar to multiply with.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.multiplyByScalar = function(quaternion, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('quaternion', quaternion);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = quaternion.x * scalar;
-            result.y = quaternion.y * scalar;
-            result.z = quaternion.z * scalar;
-            result.w = quaternion.w * scalar;
-            return result;
-        };
-
-        /**
-         * Divides the provided quaternion componentwise by the provided scalar.
-         *
-         * @param {Quaternion} quaternion The quaternion to be divided.
-         * @param {Number} scalar The scalar to divide by.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.divideByScalar = function(quaternion, scalar, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('quaternion', quaternion);
-            Check.Check.typeOf.number('scalar', scalar);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            result.x = quaternion.x / scalar;
-            result.y = quaternion.y / scalar;
-            result.z = quaternion.z / scalar;
-            result.w = quaternion.w / scalar;
-            return result;
-        };
-
-        /**
-         * Computes the axis of rotation of the provided quaternion.
-         *
-         * @param {Quaternion} quaternion The quaternion to use.
-         * @param {Cartesian3} result The object onto which to store the result.
-         * @returns {Cartesian3} The modified result parameter.
-         */
-        Quaternion.computeAxis = function(quaternion, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('quaternion', quaternion);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var w = quaternion.w;
-            if (Math.abs(w - 1.0) < _Math.CesiumMath.EPSILON6) {
-                result.x = result.y = result.z = 0;
-                return result;
-            }
-
-            var scalar = 1.0 / Math.sqrt(1.0 - (w * w));
-
-            result.x = quaternion.x * scalar;
-            result.y = quaternion.y * scalar;
-            result.z = quaternion.z * scalar;
-            return result;
-        };
-
-        /**
-         * Computes the angle of rotation of the provided quaternion.
-         *
-         * @param {Quaternion} quaternion The quaternion to use.
-         * @returns {Number} The angle of rotation.
-         */
-        Quaternion.computeAngle = function(quaternion) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('quaternion', quaternion);
-            //>>includeEnd('debug');
-
-            if (Math.abs(quaternion.w - 1.0) < _Math.CesiumMath.EPSILON6) {
-                return 0.0;
-            }
-            return 2.0 * Math.acos(quaternion.w);
-        };
-
-        var lerpScratch = new Quaternion();
-        /**
-         * Computes the linear interpolation or extrapolation at t using the provided quaternions.
-         *
-         * @param {Quaternion} start The value corresponding to t at 0.0.
-         * @param {Quaternion} end The value corresponding to t at 1.0.
-         * @param {Number} t The point along t at which to interpolate.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.lerp = function(start, end, t, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('start', start);
-            Check.Check.typeOf.object('end', end);
-            Check.Check.typeOf.number('t', t);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            lerpScratch = Quaternion.multiplyByScalar(end, t, lerpScratch);
-            result = Quaternion.multiplyByScalar(start, 1.0 - t, result);
-            return Quaternion.add(lerpScratch, result, result);
-        };
-
-        var slerpEndNegated = new Quaternion();
-        var slerpScaledP = new Quaternion();
-        var slerpScaledR = new Quaternion();
-        /**
-         * Computes the spherical linear interpolation or extrapolation at t using the provided quaternions.
-         *
-         * @param {Quaternion} start The value corresponding to t at 0.0.
-         * @param {Quaternion} end The value corresponding to t at 1.0.
-         * @param {Number} t The point along t at which to interpolate.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         *
-         * @see Quaternion#fastSlerp
-         */
-        Quaternion.slerp = function(start, end, t, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('start', start);
-            Check.Check.typeOf.object('end', end);
-            Check.Check.typeOf.number('t', t);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var dot = Quaternion.dot(start, end);
-
-            // The angle between start must be acute. Since q and -q represent
-            // the same rotation, negate q to get the acute angle.
-            var r = end;
-            if (dot < 0.0) {
-                dot = -dot;
-                r = slerpEndNegated = Quaternion.negate(end, slerpEndNegated);
-            }
-
-            // dot > 0, as the dot product approaches 1, the angle between the
-            // quaternions vanishes. use linear interpolation.
-            if (1.0 - dot < _Math.CesiumMath.EPSILON6) {
-                return Quaternion.lerp(start, r, t, result);
-            }
-
-            var theta = Math.acos(dot);
-            slerpScaledP = Quaternion.multiplyByScalar(start, Math.sin((1 - t) * theta), slerpScaledP);
-            slerpScaledR = Quaternion.multiplyByScalar(r, Math.sin(t * theta), slerpScaledR);
-            result = Quaternion.add(slerpScaledP, slerpScaledR, result);
-            return Quaternion.multiplyByScalar(result, 1.0 / Math.sin(theta), result);
-        };
-
-        /**
-         * The logarithmic quaternion function.
-         *
-         * @param {Quaternion} quaternion The unit quaternion.
-         * @param {Cartesian3} result The object onto which to store the result.
-         * @returns {Cartesian3} The modified result parameter.
-         */
-        Quaternion.log = function(quaternion, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('quaternion', quaternion);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var theta = _Math.CesiumMath.acosClamped(quaternion.w);
-            var thetaOverSinTheta = 0.0;
-
-            if (theta !== 0.0) {
-                thetaOverSinTheta = theta / Math.sin(theta);
-            }
-
-            return Cartographic.Cartesian3.multiplyByScalar(quaternion, thetaOverSinTheta, result);
-        };
-
-        /**
-         * The exponential quaternion function.
-         *
-         * @param {Cartesian3} cartesian The cartesian.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         */
-        Quaternion.exp = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('cartesian', cartesian);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var theta = Cartographic.Cartesian3.magnitude(cartesian);
-            var sinThetaOverTheta = 0.0;
-
-            if (theta !== 0.0) {
-                sinThetaOverTheta = Math.sin(theta) / theta;
-            }
-
-            result.x = cartesian.x * sinThetaOverTheta;
-            result.y = cartesian.y * sinThetaOverTheta;
-            result.z = cartesian.z * sinThetaOverTheta;
-            result.w = Math.cos(theta);
-
-            return result;
-        };
-
-        var squadScratchCartesian0 = new Cartographic.Cartesian3();
-        var squadScratchCartesian1 = new Cartographic.Cartesian3();
-        var squadScratchQuaternion0 = new Quaternion();
-        var squadScratchQuaternion1 = new Quaternion();
-
-        /**
-         * Computes an inner quadrangle point.
-         * <p>This will compute quaternions that ensure a squad curve is C<sup>1</sup>.</p>
-         *
-         * @param {Quaternion} q0 The first quaternion.
-         * @param {Quaternion} q1 The second quaternion.
-         * @param {Quaternion} q2 The third quaternion.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         *
-         * @see Quaternion#squad
-         */
-        Quaternion.computeInnerQuadrangle = function(q0, q1, q2, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('q0', q0);
-            Check.Check.typeOf.object('q1', q1);
-            Check.Check.typeOf.object('q2', q2);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var qInv = Quaternion.conjugate(q1, squadScratchQuaternion0);
-            Quaternion.multiply(qInv, q2, squadScratchQuaternion1);
-            var cart0 = Quaternion.log(squadScratchQuaternion1, squadScratchCartesian0);
-
-            Quaternion.multiply(qInv, q0, squadScratchQuaternion1);
-            var cart1 = Quaternion.log(squadScratchQuaternion1, squadScratchCartesian1);
-
-            Cartographic.Cartesian3.add(cart0, cart1, cart0);
-            Cartographic.Cartesian3.multiplyByScalar(cart0, 0.25, cart0);
-            Cartographic.Cartesian3.negate(cart0, cart0);
-            Quaternion.exp(cart0, squadScratchQuaternion0);
-
-            return Quaternion.multiply(q1, squadScratchQuaternion0, result);
-        };
-
-        /**
-         * Computes the spherical quadrangle interpolation between quaternions.
-         *
-         * @param {Quaternion} q0 The first quaternion.
-         * @param {Quaternion} q1 The second quaternion.
-         * @param {Quaternion} s0 The first inner quadrangle.
-         * @param {Quaternion} s1 The second inner quadrangle.
-         * @param {Number} t The time in [0,1] used to interpolate.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         *
-         *
-         * @example
-         * // 1. compute the squad interpolation between two quaternions on a curve
-         * var s0 = Cesium.Quaternion.computeInnerQuadrangle(quaternions[i - 1], quaternions[i], quaternions[i + 1], new Cesium.Quaternion());
-         * var s1 = Cesium.Quaternion.computeInnerQuadrangle(quaternions[i], quaternions[i + 1], quaternions[i + 2], new Cesium.Quaternion());
-         * var q = Cesium.Quaternion.squad(quaternions[i], quaternions[i + 1], s0, s1, t, new Cesium.Quaternion());
-         *
-         * // 2. compute the squad interpolation as above but where the first quaternion is a end point.
-         * var s1 = Cesium.Quaternion.computeInnerQuadrangle(quaternions[0], quaternions[1], quaternions[2], new Cesium.Quaternion());
-         * var q = Cesium.Quaternion.squad(quaternions[0], quaternions[1], quaternions[0], s1, t, new Cesium.Quaternion());
-         *
-         * @see Quaternion#computeInnerQuadrangle
-         */
-        Quaternion.squad = function(q0, q1, s0, s1, t, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('q0', q0);
-            Check.Check.typeOf.object('q1', q1);
-            Check.Check.typeOf.object('s0', s0);
-            Check.Check.typeOf.object('s1', s1);
-            Check.Check.typeOf.number('t', t);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var slerp0 = Quaternion.slerp(q0, q1, t, squadScratchQuaternion0);
-            var slerp1 = Quaternion.slerp(s0, s1, t, squadScratchQuaternion1);
-            return Quaternion.slerp(slerp0, slerp1, 2.0 * t * (1.0 - t), result);
-        };
-
-        var fastSlerpScratchQuaternion = new Quaternion();
-        var opmu = 1.90110745351730037;
-        var u = FeatureDetection.FeatureDetection.supportsTypedArrays() ? new Float32Array(8) : [];
-        var v = FeatureDetection.FeatureDetection.supportsTypedArrays() ? new Float32Array(8) : [];
-        var bT = FeatureDetection.FeatureDetection.supportsTypedArrays() ? new Float32Array(8) : [];
-        var bD = FeatureDetection.FeatureDetection.supportsTypedArrays() ? new Float32Array(8) : [];
-
-        for (var i = 0; i < 7; ++i) {
-            var s = i + 1.0;
-            var t = 2.0 * s + 1.0;
-            u[i] = 1.0 / (s * t);
-            v[i] = s / t;
-        }
-
-        u[7] = opmu / (8.0 * 17.0);
-        v[7] = opmu * 8.0 / 17.0;
-
-        /**
-         * Computes the spherical linear interpolation or extrapolation at t using the provided quaternions.
-         * This implementation is faster than {@link Quaternion#slerp}, but is only accurate up to 10<sup>-6</sup>.
-         *
-         * @param {Quaternion} start The value corresponding to t at 0.0.
-         * @param {Quaternion} end The value corresponding to t at 1.0.
-         * @param {Number} t The point along t at which to interpolate.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter.
-         *
-         * @see Quaternion#slerp
-         */
-        Quaternion.fastSlerp = function(start, end, t, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('start', start);
-            Check.Check.typeOf.object('end', end);
-            Check.Check.typeOf.number('t', t);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var x = Quaternion.dot(start, end);
-
-            var sign;
-            if (x >= 0) {
-                sign = 1.0;
-            } else {
-                sign = -1.0;
-                x = -x;
-            }
-
-            var xm1 = x - 1.0;
-            var d = 1.0 - t;
-            var sqrT = t * t;
-            var sqrD = d * d;
-
-            for (var i = 7; i >= 0; --i) {
-                bT[i] = (u[i] * sqrT - v[i]) * xm1;
-                bD[i] = (u[i] * sqrD - v[i]) * xm1;
-            }
-
-            var cT = sign * t * (
-                1.0 + bT[0] * (1.0 + bT[1] * (1.0 + bT[2] * (1.0 + bT[3] * (
-                1.0 + bT[4] * (1.0 + bT[5] * (1.0 + bT[6] * (1.0 + bT[7]))))))));
-            var cD = d * (
-                1.0 + bD[0] * (1.0 + bD[1] * (1.0 + bD[2] * (1.0 + bD[3] * (
-                1.0 + bD[4] * (1.0 + bD[5] * (1.0 + bD[6] * (1.0 + bD[7]))))))));
-
-            var temp = Quaternion.multiplyByScalar(start, cD, fastSlerpScratchQuaternion);
-            Quaternion.multiplyByScalar(end, cT, result);
-            return Quaternion.add(temp, result, result);
-        };
-
-        /**
-         * Computes the spherical quadrangle interpolation between quaternions.
-         * An implementation that is faster than {@link Quaternion#squad}, but less accurate.
-         *
-         * @param {Quaternion} q0 The first quaternion.
-         * @param {Quaternion} q1 The second quaternion.
-         * @param {Quaternion} s0 The first inner quadrangle.
-         * @param {Quaternion} s1 The second inner quadrangle.
-         * @param {Number} t The time in [0,1] used to interpolate.
-         * @param {Quaternion} result The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter or a new instance if none was provided.
-         *
-         * @see Quaternion#squad
-         */
-        Quaternion.fastSquad = function(q0, q1, s0, s1, t, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('q0', q0);
-            Check.Check.typeOf.object('q1', q1);
-            Check.Check.typeOf.object('s0', s0);
-            Check.Check.typeOf.object('s1', s1);
-            Check.Check.typeOf.number('t', t);
-            Check.Check.typeOf.object('result', result);
-            //>>includeEnd('debug');
-
-            var slerp0 = Quaternion.fastSlerp(q0, q1, t, squadScratchQuaternion0);
-            var slerp1 = Quaternion.fastSlerp(s0, s1, t, squadScratchQuaternion1);
-            return Quaternion.fastSlerp(slerp0, slerp1, 2.0 * t * (1.0 - t), result);
-        };
-
-        /**
-         * Compares the provided quaternions componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Quaternion} [left] The first quaternion.
-         * @param {Quaternion} [right] The second quaternion.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        Quaternion.equals = function(left, right) {
-            return (left === right) ||
-                   ((when.defined(left)) &&
-                    (when.defined(right)) &&
-                    (left.x === right.x) &&
-                    (left.y === right.y) &&
-                    (left.z === right.z) &&
-                    (left.w === right.w));
-        };
-
-        /**
-         * Compares the provided quaternions componentwise and returns
-         * <code>true</code> if they are within the provided epsilon,
-         * <code>false</code> otherwise.
-         *
-         * @param {Quaternion} [left] The first quaternion.
-         * @param {Quaternion} [right] The second quaternion.
-         * @param {Number} epsilon The epsilon to use for equality testing.
-         * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Quaternion.equalsEpsilon = function(left, right, epsilon) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('epsilon', epsilon);
-            //>>includeEnd('debug');
-
-            return (left === right) ||
-                   ((when.defined(left)) &&
-                    (when.defined(right)) &&
-                    (Math.abs(left.x - right.x) <= epsilon) &&
-                    (Math.abs(left.y - right.y) <= epsilon) &&
-                    (Math.abs(left.z - right.z) <= epsilon) &&
-                    (Math.abs(left.w - right.w) <= epsilon));
-        };
-
-        /**
-         * An immutable Quaternion instance initialized to (0.0, 0.0, 0.0, 0.0).
-         *
-         * @type {Quaternion}
-         * @constant
-         */
-        Quaternion.ZERO = Object.freeze(new Quaternion(0.0, 0.0, 0.0, 0.0));
-
-        /**
-         * An immutable Quaternion instance initialized to (0.0, 0.0, 0.0, 1.0).
-         *
-         * @type {Quaternion}
-         * @constant
-         */
-        Quaternion.IDENTITY = Object.freeze(new Quaternion(0.0, 0.0, 0.0, 1.0));
-
-        /**
-         * Duplicates this Quaternion instance.
-         *
-         * @param {Quaternion} [result] The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter or a new Quaternion instance if one was not provided.
-         */
-        Quaternion.prototype.clone = function(result) {
-            return Quaternion.clone(this, result);
-        };
-
-        /**
-         * Compares this and the provided quaternion componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {Quaternion} [right] The right hand side quaternion.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        Quaternion.prototype.equals = function(right) {
-            return Quaternion.equals(this, right);
-        };
-
-        /**
-         * Compares this and the provided quaternion componentwise and returns
-         * <code>true</code> if they are within the provided epsilon,
-         * <code>false</code> otherwise.
-         *
-         * @param {Quaternion} [right] The right hand side quaternion.
-         * @param {Number} epsilon The epsilon to use for equality testing.
-         * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-         */
-        Quaternion.prototype.equalsEpsilon = function(right, epsilon) {
-            return Quaternion.equalsEpsilon(this, right, epsilon);
-        };
-
-        /**
-         * Returns a string representing this quaternion in the format (x, y, z, w).
-         *
-         * @returns {String} A string representing this Quaternion.
-         */
-        Quaternion.prototype.toString = function() {
-            return '(' + this.x + ', ' + this.y + ', ' + this.z + ', ' + this.w + ')';
-        };
-
-    /**
-         * Finds an item in a sorted array.
-         *
-         * @exports binarySearch
-         * @param {Array} array The sorted array to search.
-         * @param {*} itemToFind The item to find in the array.
-         * @param {binarySearch~Comparator} comparator The function to use to compare the item to
-         *        elements in the array.
-         * @returns {Number} The index of <code>itemToFind</code> in the array, if it exists.  If <code>itemToFind</code>
-         *        does not exist, the return value is a negative number which is the bitwise complement (~)
-         *        of the index before which the itemToFind should be inserted in order to maintain the
-         *        sorted order of the array.
-         *
-         * @example
-         * // Create a comparator function to search through an array of numbers.
-         * function comparator(a, b) {
-         *     return a - b;
-         * };
-         * var numbers = [0, 2, 4, 6, 8];
-         * var index = Cesium.binarySearch(numbers, 6, comparator); // 3
-         */
-        function binarySearch(array, itemToFind, comparator) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            Check.Check.defined('itemToFind', itemToFind);
-            Check.Check.defined('comparator', comparator);
-            //>>includeEnd('debug');
-
-            var low = 0;
-            var high = array.length - 1;
-            var i;
-            var comparison;
-
-            while (low <= high) {
-                i = ~~((low + high) / 2);
-                comparison = comparator(array[i], itemToFind);
-                if (comparison < 0) {
-                    low = i + 1;
-                    continue;
-                }
-                if (comparison > 0) {
-                    high = i - 1;
-                    continue;
-                }
-                return i;
-            }
-            return ~(high + 1);
-        }
-
-    /**
-         * A set of Earth Orientation Parameters (EOP) sampled at a time.
-         *
-         * @alias EarthOrientationParametersSample
-         * @constructor
-         *
-         * @param {Number} xPoleWander The pole wander about the X axis, in radians.
-         * @param {Number} yPoleWander The pole wander about the Y axis, in radians.
-         * @param {Number} xPoleOffset The offset to the Celestial Intermediate Pole (CIP) about the X axis, in radians.
-         * @param {Number} yPoleOffset The offset to the Celestial Intermediate Pole (CIP) about the Y axis, in radians.
-         * @param {Number} ut1MinusUtc The difference in time standards, UT1 - UTC, in seconds.
-         *
-         * @private
-         */
-        function EarthOrientationParametersSample(xPoleWander, yPoleWander, xPoleOffset, yPoleOffset, ut1MinusUtc) {
-            /**
-             * The pole wander about the X axis, in radians.
-             * @type {Number}
-             */
-            this.xPoleWander = xPoleWander;
-
-            /**
-             * The pole wander about the Y axis, in radians.
-             * @type {Number}
-             */
-            this.yPoleWander = yPoleWander;
-
-            /**
-             * The offset to the Celestial Intermediate Pole (CIP) about the X axis, in radians.
-             * @type {Number}
-             */
-            this.xPoleOffset = xPoleOffset;
-
-            /**
-             * The offset to the Celestial Intermediate Pole (CIP) about the Y axis, in radians.
-             * @type {Number}
-             */
-            this.yPoleOffset = yPoleOffset;
-
-            /**
-             * The difference in time standards, UT1 - UTC, in seconds.
-             * @type {Number}
-             */
-            this.ut1MinusUtc = ut1MinusUtc;
-        }
-
-    /**
-    @license
-    sprintf.js from the php.js project - https://github.com/kvz/phpjs
-    Directly from https://github.com/kvz/phpjs/blob/master/functions/strings/sprintf.js
-
-    php.js is copyright 2012 Kevin van Zonneveld.
-
-    Portions copyright Brett Zamir (http://brett-zamir.me), Kevin van Zonneveld
-    (http://kevin.vanzonneveld.net), Onno Marsman, Theriault, Michael White
-    (http://getsprink.com), Waldo Malqui Silva, Paulo Freitas, Jack, Jonas
-    Raoni Soares Silva (http://www.jsfromhell.com), Philip Peterson, Legaev
-    Andrey, Ates Goral (http://magnetiq.com), Alex, Ratheous, Martijn Wieringa,
-    Rafa? Kukawski (http://blog.kukawski.pl), lmeyrick
-    (https://sourceforge.net/projects/bcmath-js/), Nate, Philippe Baumann,
-    Enrique Gonzalez, Webtoolkit.info (http://www.webtoolkit.info/), Carlos R.
-    L. Rodrigues (http://www.jsfromhell.com), Ash Searle
-    (http://hexmen.com/blog/), Jani Hartikainen, travc, Ole Vrijenhoek,
-    Erkekjetter, Michael Grier, Rafa? Kukawski (http://kukawski.pl), Johnny
-    Mast (http://www.phpvrouwen.nl), T.Wild, d3x,
-    http://stackoverflow.com/questions/57803/how-to-convert-decimal-to-hex-in-javascript,
-    Rafa? Kukawski (http://blog.kukawski.pl/), stag019, pilus, WebDevHobo
-    (http://webdevhobo.blogspot.com/), marrtins, GeekFG
-    (http://geekfg.blogspot.com), Andrea Giammarchi
-    (http://webreflection.blogspot.com), Arpad Ray (mailto:arpad@php.net),
-    gorthaur, Paul Smith, Tim de Koning (http://www.kingsquare.nl), Joris, Oleg
-    Eremeev, Steve Hilder, majak, gettimeofday, KELAN, Josh Fraser
-    (http://onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/),
-    Marc Palau, Martin
-    (http://www.erlenwiese.de/), Breaking Par Consulting Inc
-    (http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CFB006C45F7),
-    Chris, Mirek Slugen, saulius, Alfonso Jimenez
-    (http://www.alfonsojimenez.com), Diplom@t (http://difane.com/), felix,
-    Mailfaker (http://www.weedem.fr/), Tyler Akins (http://rumkin.com), Caio
-    Ariede (http://caioariede.com), Robin, Kankrelune
-    (http://www.webfaktory.info/), Karol Kowalski, Imgen Tata
-    (http://www.myipdf.com/), mdsjack (http://www.mdsjack.bo.it), Dreamer,
-    Felix Geisendoerfer (http://www.debuggable.com/felix), Lars Fischer, AJ,
-    David, Aman Gupta, Michael White, Public Domain
-    (http://www.json.org/json2.js), Steven Levithan
-    (http://blog.stevenlevithan.com), Sakimori, Pellentesque Malesuada,
-    Thunder.m, Dj (http://phpjs.org/functions/htmlentities:425#comment_134018),
-    Steve Clay, David James, Francois, class_exists, nobbler, T. Wild, Itsacon
-    (http://www.itsacon.net/), date, Ole Vrijenhoek (http://www.nervous.nl/),
-    Fox, Raphael (Ao RUDLER), Marco, noname, Mateusz "loonquawl" Zalega, Frank
-    Forte, Arno, ger, mktime, john (http://www.jd-tech.net), Nick Kolosov
-    (http://sammy.ru), marc andreu, Scott Cariss, Douglas Crockford
-    (http://javascript.crockford.com), madipta, Slawomir Kaniecki,
-    ReverseSyntax, Nathan, Alex Wilson, kenneth, Bayron Guevara, Adam Wallner
-    (http://web2.bitbaro.hu/), paulo kuong, jmweb, Lincoln Ramsay, djmix,
-    Pyerre, Jon Hohle, Thiago Mata (http://thiagomata.blog.com), lmeyrick
-    (https://sourceforge.net/projects/bcmath-js/this.), Linuxworld, duncan,
-    Gilbert, Sanjoy Roy, Shingo, sankai, Oskar Larsson H?gfeldt
-    (http://oskar-lh.name/), Denny Wardhana, 0m3r, Everlasto, Subhasis Deb,
-    josh, jd, Pier Paolo Ramon (http://www.mastersoup.com/), P, merabi, Soren
-    Hansen, Eugene Bulkin (http://doubleaw.com/), Der Simon
-    (http://innerdom.sourceforge.net/), echo is bad, Ozh, XoraX
-    (http://www.xorax.info), EdorFaus, JB, J A R, Marc Jansen, Francesco, LH,
-    Stoyan Kyosev (http://www.svest.org/), nord_ua, omid
-    (http://phpjs.org/functions/380:380#comment_137122), Brad Touesnard, MeEtc
-    (http://yass.meetcweb.com), Peter-Paul Koch
-    (http://www.quirksmode.org/js/beat.html), Olivier Louvignes
-    (http://mg-crea.com/), T0bsn, Tim Wiel, Bryan Elliott, Jalal Berrami,
-    Martin, JT, David Randall, Thomas Beaucourt (http://www.webapp.fr), taith,
-    vlado houba, Pierre-Luc Paour, Kristof Coomans (SCK-CEN Belgian Nucleair
-    Research Centre), Martin Pool, Kirk Strobeck, Rick Waldron, Brant Messenger
-    (http://www.brantmessenger.com/), Devan Penner-Woelk, Saulo Vallory, Wagner
-    B. Soares, Artur Tchernychev, Valentina De Rosa, Jason Wong
-    (http://carrot.org/), Christoph, Daniel Esteban, strftime, Mick@el, rezna,
-    Simon Willison (http://simonwillison.net), Anton Ongson, Gabriel Paderni,
-    Marco van Oort, penutbutterjelly, Philipp Lenssen, Bjorn Roesbeke
-    (http://www.bjornroesbeke.be/), Bug?, Eric Nagel, Tomasz Wesolowski,
-    Evertjan Garretsen, Bobby Drake, Blues (http://tech.bluesmoon.info/), Luke
-    Godfrey, Pul, uestla, Alan C, Ulrich, Rafal Kukawski, Yves Sucaet,
-    sowberry, Norman "zEh" Fuchs, hitwork, Zahlii, johnrembo, Nick Callen,
-    Steven Levithan (stevenlevithan.com), ejsanders, Scott Baker, Brian Tafoya
-    (http://www.premasolutions.com/), Philippe Jausions
-    (http://pear.php.net/user/jausions), Aidan Lister
-    (http://aidanlister.com/), Rob, e-mike, HKM, ChaosNo1, metjay, strcasecmp,
-    strcmp, Taras Bogach, jpfle, Alexander Ermolaev
-    (http://snippets.dzone.com/user/AlexanderErmolaev), DxGx, kilops, Orlando,
-    dptr1988, Le Torbi, James (http://www.james-bell.co.uk/), Pedro Tainha
-    (http://www.pedrotainha.com), James, Arnout Kazemier
-    (http://www.3rd-Eden.com), Chris McMacken, gabriel paderni, Yannoo,
-    FGFEmperor, baris ozdil, Tod Gentille, Greg Frazier, jakes, 3D-GRAF, Allan
-    Jensen (http://www.winternet.no), Howard Yeend, Benjamin Lupton, davook,
-    daniel airton wermann (http://wermann.com.br), Atli T¨®r, Maximusya, Ryan
-    W Tenney (http://ryan.10e.us), Alexander M Beedie, fearphage
-    (http://http/my.opera.com/fearphage/), Nathan Sepulveda, Victor, Matteo,
-    Billy, stensi, Cord, Manish, T.J. Leahy, Riddler
-    (http://www.frontierwebdev.com/), Rafa? Kukawski, FremyCompany, Matt
-    Bradley, Tim de Koning, Luis Salazar (http://www.freaky-media.com/), Diogo
-    Resende, Rival, Andrej Pavlovic, Garagoth, Le Torbi
-    (http://www.letorbi.de/), Dino, Josep Sanz (http://www.ws3.es/), rem,
-    Russell Walker (http://www.nbill.co.uk/), Jamie Beck
-    (http://www.terabit.ca/), setcookie, Michael, YUI Library:
-    http://developer.yahoo.com/yui/docs/YAHOO.util.DateLocale.html, Blues at
-    http://hacks.bluesmoon.info/strftime/strftime.js, Ben
-    (http://benblume.co.uk/), DtTvB
-    (http://dt.in.th/2008-09-16.string-length-in-bytes.html), Andreas, William,
-    meo, incidence, Cagri Ekin, Amirouche, Amir Habibi
-    (http://www.residence-mixte.com/), Luke Smith (http://lucassmith.name),
-    Kheang Hok Chin (http://www.distantia.ca/), Jay Klehr, Lorenzo Pisani,
-    Tony, Yen-Wei Liu, Greenseed, mk.keck, Leslie Hoare, dude, booeyOH, Ben
-    Bryan
-
-    Licensed under the MIT (MIT-LICENSE.txt) 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 KEVIN VAN ZONNEVELD 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.
-    */
-
-    function sprintf () {
-      // http://kevin.vanzonneveld.net
-      // +   original by: Ash Searle (http://hexmen.com/blog/)
-      // + namespaced by: Michael White (http://getsprink.com)
-      // +    tweaked by: Jack
-      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-      // +      input by: Paulo Freitas
-      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-      // +      input by: Brett Zamir (http://brett-zamir.me)
-      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-      // +   improved by: Dj
-      // +   improved by: Allidylls
-      // *     example 1: sprintf("%01.2f", 123.1);
-      // *     returns 1: 123.10
-      // *     example 2: sprintf("[%10s]", 'monkey');
-      // *     returns 2: '[    monkey]'
-      // *     example 3: sprintf("[%'#10s]", 'monkey');
-      // *     returns 3: '[####monkey]'
-      // *     example 4: sprintf("%d", 123456789012345);
-      // *     returns 4: '123456789012345'
-      var regex = /%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuideEfFgG])/g;
-      var a = arguments,
-        i = 0,
-        format = a[i++];
-
-      // pad()
-      var pad = function (str, len, chr, leftJustify) {
-        if (!chr) {
-          chr = ' ';
-        }
-
-        var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
-        return leftJustify ? str + padding : padding + str;
-      };
-
-      // justify()
-      var justify = function (value, prefix, leftJustify, minWidth, zeroPad, customPadChar) {
-        var diff = minWidth - value.length;
-        if (diff > 0) {
-          if (leftJustify || !zeroPad) {
-            value = pad(value, minWidth, customPadChar, leftJustify);
-          } else {
-            value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
-          }
-        }
-        return value;
-      };
-
-      // formatBaseX()
-      var formatBaseX = function (value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
-        // Note: casts negative numbers to positive ones
-        var number = value >>> 0;
-        prefix = prefix && number && {
-          '2': '0b',
-          '8': '0',
-          '16': '0x'
-        }[base] || '';
-        value = prefix + pad(number.toString(base), precision || 0, '0', false);
-        return justify(value, prefix, leftJustify, minWidth, zeroPad);
-      };
-
-      // formatString()
-      var formatString = function (value, leftJustify, minWidth, precision, zeroPad, customPadChar) {
-        if (precision != null) {
-          value = value.slice(0, precision);
-        }
-        return justify(value, '', leftJustify, minWidth, zeroPad, customPadChar);
-      };
-
-      // doFormat()
-      var doFormat = function (substring, valueIndex, flags, minWidth, _, precision, type) {
-        var number;
-        var prefix;
-        var method;
-        var textTransform;
-        var value;
-
-        if (substring == '%%') {
-          return '%';
-        }
-
-        // parse flags
-        var leftJustify = false,
-          positivePrefix = '',
-          zeroPad = false,
-          prefixBaseX = false,
-          customPadChar = ' ';
-        var flagsl = flags.length;
-        for (var j = 0; flags && j < flagsl; j++) {
-          switch (flags.charAt(j)) {
-          case ' ':
-            positivePrefix = ' ';
-            break;
-          case '+':
-            positivePrefix = '+';
-            break;
-          case '-':
-            leftJustify = true;
-            break;
-          case "'":
-            customPadChar = flags.charAt(j + 1);
-            break;
-          case '0':
-            zeroPad = true;
-            break;
-          case '#':
-            prefixBaseX = true;
-            break;
-          }
-        }
-
-        // parameters may be null, undefined, empty-string or real valued
-        // we want to ignore null, undefined and empty-string values
-        if (!minWidth) {
-          minWidth = 0;
-        } else if (minWidth == '*') {
-          minWidth = +a[i++];
-        } else if (minWidth.charAt(0) == '*') {
-          minWidth = +a[minWidth.slice(1, -1)];
-        } else {
-          minWidth = +minWidth;
-        }
-
-        // Note: undocumented perl feature:
-        if (minWidth < 0) {
-          minWidth = -minWidth;
-          leftJustify = true;
-        }
-
-        if (!isFinite(minWidth)) {
-          throw new Error('sprintf: (minimum-)width must be finite');
-        }
-
-        if (!precision) {
-          precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : undefined;
-        } else if (precision == '*') {
-          precision = +a[i++];
-        } else if (precision.charAt(0) == '*') {
-          precision = +a[precision.slice(1, -1)];
-        } else {
-          precision = +precision;
-        }
-
-        // grab value using valueIndex if required?
-        value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];
-
-        switch (type) {
-        case 's':
-          return formatString(String(value), leftJustify, minWidth, precision, zeroPad, customPadChar);
-        case 'c':
-          return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
-        case 'b':
-          return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
-        case 'o':
-          return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
-        case 'x':
-          return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
-        case 'X':
-          return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
-        case 'u':
-          return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
-        case 'i':
-        case 'd':
-          number = +value || 0;
-          number = Math.round(number - number % 1); // Plain Math.round doesn't just truncate
-          prefix = number < 0 ? '-' : positivePrefix;
-          value = prefix + pad(String(Math.abs(number)), precision, '0', false);
-          return justify(value, prefix, leftJustify, minWidth, zeroPad);
-        case 'e':
-        case 'E':
-        case 'f': // Should handle locales (as per setlocale)
-        case 'F':
-        case 'g':
-        case 'G':
-          number = +value;
-          prefix = number < 0 ? '-' : positivePrefix;
-          method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
-          textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
-          value = prefix + Math.abs(number)[method](precision);
-          return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
-        default:
-          return substring;
-        }
-      };
-
-      return format.replace(regex, doFormat);
-    }
-
-    /**
-         * Represents a Gregorian date in a more precise format than the JavaScript Date object.
-         * In addition to submillisecond precision, this object can also represent leap seconds.
-         * @alias GregorianDate
-         * @constructor
-         *
-         * @see JulianDate#toGregorianDate
-         */
-        function GregorianDate(year, month, day, hour, minute, second, millisecond, isLeapSecond) {
-            /**
-             * Gets or sets the year as a whole number.
-             * @type {Number}
-             */
-            this.year = year;
-            /**
-             * Gets or sets the month as a whole number with range [1, 12].
-             * @type {Number}
-             */
-            this.month = month;
-            /**
-             * Gets or sets the day of the month as a whole number starting at 1.
-             * @type {Number}
-             */
-            this.day = day;
-            /**
-             * Gets or sets the hour as a whole number with range [0, 23].
-             * @type {Number}
-             */
-            this.hour = hour;
-            /**
-             * Gets or sets the minute of the hour as a whole number with range [0, 59].
-             * @type {Number}
-             */
-            this.minute = minute;
-            /**
-             * Gets or sets the second of the minute as a whole number with range [0, 60], with 60 representing a leap second.
-             * @type {Number}
-             */
-            this.second = second;
-            /**
-             * Gets or sets the millisecond of the second as a floating point number with range [0.0, 1000.0).
-             * @type {Number}
-             */
-            this.millisecond = millisecond;
-            /**
-             * Gets or sets whether this time is during a leap second.
-             * @type {Boolean}
-             */
-            this.isLeapSecond = isLeapSecond;
-        }
-
-    /**
-         * Determines if a given date is a leap year.
-         *
-         * @exports isLeapYear
-         *
-         * @param {Number} year The year to be tested.
-         * @returns {Boolean} True if <code>year</code> is a leap year.
-         *
-         * @example
-         * var leapYear = Cesium.isLeapYear(2000); // true
-         */
-        function isLeapYear(year) {
-            //>>includeStart('debug', pragmas.debug);
-            if (year === null || isNaN(year)) {
-                throw new Check.DeveloperError('year is required and must be a number.');
-            }
-            //>>includeEnd('debug');
-
-            return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
-        }
-
-    /**
-         * Describes a single leap second, which is constructed from a {@link JulianDate} and a
-         * numerical offset representing the number of seconds TAI is ahead of the UTC time standard.
-         * @alias LeapSecond
-         * @constructor
-         *
-         * @param {JulianDate} [date] A Julian date representing the time of the leap second.
-         * @param {Number} [offset] The cumulative number of seconds that TAI is ahead of UTC at the provided date.
-         */
-        function LeapSecond(date, offset) {
-            /**
-             * Gets or sets the date at which this leap second occurs.
-             * @type {JulianDate}
-             */
-            this.julianDate = date;
-
-            /**
-             * Gets or sets the cumulative number of seconds between the UTC and TAI time standards at the time
-             * of this leap second.
-             * @type {Number}
-             */
-            this.offset = offset;
-        }
-
-    /**
-         * Constants for time conversions like those done by {@link JulianDate}.
-         *
-         * @exports TimeConstants
-         *
-         * @see JulianDate
-         *
-         * @private
-         */
-        var TimeConstants = {
-            /**
-             * The number of seconds in one millisecond: <code>0.001</code>
-             * @type {Number}
-             * @constant
-             */
-            SECONDS_PER_MILLISECOND : 0.001,
-
-            /**
-             * The number of seconds in one minute: <code>60</code>.
-             * @type {Number}
-             * @constant
-             */
-            SECONDS_PER_MINUTE : 60.0,
-
-            /**
-             * The number of minutes in one hour: <code>60</code>.
-             * @type {Number}
-             * @constant
-             */
-            MINUTES_PER_HOUR : 60.0,
-
-            /**
-             * The number of hours in one day: <code>24</code>.
-             * @type {Number}
-             * @constant
-             */
-            HOURS_PER_DAY : 24.0,
-
-            /**
-             * The number of seconds in one hour: <code>3600</code>.
-             * @type {Number}
-             * @constant
-             */
-            SECONDS_PER_HOUR : 3600.0,
-
-            /**
-             * The number of minutes in one day: <code>1440</code>.
-             * @type {Number}
-             * @constant
-             */
-            MINUTES_PER_DAY : 1440.0,
-
-            /**
-             * The number of seconds in one day, ignoring leap seconds: <code>86400</code>.
-             * @type {Number}
-             * @constant
-             */
-            SECONDS_PER_DAY : 86400.0,
-
-            /**
-             * The number of days in one Julian century: <code>36525</code>.
-             * @type {Number}
-             * @constant
-             */
-            DAYS_PER_JULIAN_CENTURY : 36525.0,
-
-            /**
-             * One trillionth of a second.
-             * @type {Number}
-             * @constant
-             */
-            PICOSECOND : 0.000000001,
-
-            /**
-             * The number of days to subtract from a Julian date to determine the
-             * modified Julian date, which gives the number of days since midnight
-             * on November 17, 1858.
-             * @type {Number}
-             * @constant
-             */
-            MODIFIED_JULIAN_DATE_DIFFERENCE : 2400000.5
-        };
-    var TimeConstants$1 = Object.freeze(TimeConstants);
-
-    /**
-         * Provides the type of time standards which JulianDate can take as input.
-         *
-         * @exports TimeStandard
-         *
-         * @see JulianDate
-         */
-        var TimeStandard = {
-            /**
-             * Represents the coordinated Universal Time (UTC) time standard.
-             *
-             * UTC is related to TAI according to the relationship
-             * <code>UTC = TAI - deltaT</code> where <code>deltaT</code> is the number of leap
-             * seconds which have been introduced as of the time in TAI.
-             *
-             * @type {Number}
-             * @constant
-             */
-            UTC : 0,
-
-            /**
-             * Represents the International Atomic Time (TAI) time standard.
-             * TAI is the principal time standard to which the other time standards are related.
-             *
-             * @type {Number}
-             * @constant
-             */
-            TAI : 1
-        };
-    var TimeStandard$1 = Object.freeze(TimeStandard);
-
-    var gregorianDateScratch = new GregorianDate();
-        var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
-        var daysInLeapFeburary = 29;
-
-        function compareLeapSecondDates(leapSecond, dateToFind) {
-            return JulianDate.compare(leapSecond.julianDate, dateToFind.julianDate);
-        }
-
-        // we don't really need a leap second instance, anything with a julianDate property will do
-        var binarySearchScratchLeapSecond = new LeapSecond();
-
-        function convertUtcToTai(julianDate) {
-            //Even though julianDate is in UTC, we'll treat it as TAI and
-            //search the leap second table for it.
-            binarySearchScratchLeapSecond.julianDate = julianDate;
-            var leapSeconds = JulianDate.leapSeconds;
-            var index = binarySearch(leapSeconds, binarySearchScratchLeapSecond, compareLeapSecondDates);
-
-            if (index < 0) {
-                index = ~index;
-            }
-
-            if (index >= leapSeconds.length) {
-                index = leapSeconds.length - 1;
-            }
-
-            var offset = leapSeconds[index].offset;
-            if (index > 0) {
-                //Now we have the index of the closest leap second that comes on or after our UTC time.
-                //However, if the difference between the UTC date being converted and the TAI
-                //defined leap second is greater than the offset, we are off by one and need to use
-                //the previous leap second.
-                var difference = JulianDate.secondsDifference(leapSeconds[index].julianDate, julianDate);
-                if (difference > offset) {
-                    index--;
-                    offset = leapSeconds[index].offset;
-                }
-            }
-
-            JulianDate.addSeconds(julianDate, offset, julianDate);
-        }
-
-        function convertTaiToUtc(julianDate, result) {
-            binarySearchScratchLeapSecond.julianDate = julianDate;
-            var leapSeconds = JulianDate.leapSeconds;
-            var index = binarySearch(leapSeconds, binarySearchScratchLeapSecond, compareLeapSecondDates);
-            if (index < 0) {
-                index = ~index;
-            }
-
-            //All times before our first leap second get the first offset.
-            if (index === 0) {
-                return JulianDate.addSeconds(julianDate, -leapSeconds[0].offset, result);
-            }
-
-            //All times after our leap second get the last offset.
-            if (index >= leapSeconds.length) {
-                return JulianDate.addSeconds(julianDate, -leapSeconds[index - 1].offset, result);
-            }
-
-            //Compute the difference between the found leap second and the time we are converting.
-            var difference = JulianDate.secondsDifference(leapSeconds[index].julianDate, julianDate);
-
-            if (difference === 0) {
-                //The date is in our leap second table.
-                return JulianDate.addSeconds(julianDate, -leapSeconds[index].offset, result);
-            }
-
-            if (difference <= 1.0) {
-                //The requested date is during the moment of a leap second, then we cannot convert to UTC
-                return undefined;
-            }
-
-            //The time is in between two leap seconds, index is the leap second after the date
-            //we're converting, so we subtract one to get the correct LeapSecond instance.
-            return JulianDate.addSeconds(julianDate, -leapSeconds[--index].offset, result);
-        }
-
-        function setComponents(wholeDays, secondsOfDay, julianDate) {
-            var extraDays = (secondsOfDay / TimeConstants$1.SECONDS_PER_DAY) | 0;
-            wholeDays += extraDays;
-            secondsOfDay -= TimeConstants$1.SECONDS_PER_DAY * extraDays;
-
-            if (secondsOfDay < 0) {
-                wholeDays--;
-                secondsOfDay += TimeConstants$1.SECONDS_PER_DAY;
-            }
-
-            julianDate.dayNumber = wholeDays;
-            julianDate.secondsOfDay = secondsOfDay;
-            return julianDate;
-        }
-
-        function computeJulianDateComponents(year, month, day, hour, minute, second, millisecond) {
-            // Algorithm from page 604 of the Explanatory Supplement to the
-            // Astronomical Almanac (Seidelmann 1992).
-
-            var a = ((month - 14) / 12) | 0;
-            var b = year + 4800 + a;
-            var dayNumber = (((1461 * b) / 4) | 0) + (((367 * (month - 2 - 12 * a)) / 12) | 0) - (((3 * (((b + 100) / 100) | 0)) / 4) | 0) + day - 32075;
-
-            // JulianDates are noon-based
-            hour = hour - 12;
-            if (hour < 0) {
-                hour += 24;
-            }
-
-            var secondsOfDay = second + ((hour * TimeConstants$1.SECONDS_PER_HOUR) + (minute * TimeConstants$1.SECONDS_PER_MINUTE) + (millisecond * TimeConstants$1.SECONDS_PER_MILLISECOND));
-
-            if (secondsOfDay >= 43200.0) {
-                dayNumber -= 1;
-            }
-
-            return [dayNumber, secondsOfDay];
-        }
-
-        //Regular expressions used for ISO8601 date parsing.
-        //YYYY
-        var matchCalendarYear = /^(\d{4})$/;
-        //YYYY-MM (YYYYMM is invalid)
-        var matchCalendarMonth = /^(\d{4})-(\d{2})$/;
-        //YYYY-DDD or YYYYDDD
-        var matchOrdinalDate = /^(\d{4})-?(\d{3})$/;
-        //YYYY-Www or YYYYWww or YYYY-Www-D or YYYYWwwD
-        var matchWeekDate = /^(\d{4})-?W(\d{2})-?(\d{1})?$/;
-        //YYYY-MM-DD or YYYYMMDD
-        var matchCalendarDate = /^(\d{4})-?(\d{2})-?(\d{2})$/;
-        // Match utc offset
-        var utcOffset = /([Z+\-])?(\d{2})?:?(\d{2})?$/;
-        // Match hours HH or HH.xxxxx
-        var matchHours = /^(\d{2})(\.\d+)?/.source + utcOffset.source;
-        // Match hours/minutes HH:MM HHMM.xxxxx
-        var matchHoursMinutes = /^(\d{2}):?(\d{2})(\.\d+)?/.source + utcOffset.source;
-        // Match hours/minutes HH:MM:SS HHMMSS.xxxxx
-        var matchHoursMinutesSeconds = /^(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?/.source + utcOffset.source;
-
-        var iso8601ErrorMessage = 'Invalid ISO 8601 date.';
-
-        /**
-         * Represents an astronomical Julian date, which is the number of days since noon on January 1, -4712 (4713 BC).
-         * For increased precision, this class stores the whole number part of the date and the seconds
-         * part of the date in separate components.  In order to be safe for arithmetic and represent
-         * leap seconds, the date is always stored in the International Atomic Time standard
-         * {@link TimeStandard.TAI}.
-         * @alias JulianDate
-         * @constructor
-         *
-         * @param {Number} [julianDayNumber=0.0] The Julian Day Number representing the number of whole days.  Fractional days will also be handled correctly.
-         * @param {Number} [secondsOfDay=0.0] The number of seconds into the current Julian Day Number.  Fractional seconds, negative seconds and seconds greater than a day will be handled correctly.
-         * @param {TimeStandard} [timeStandard=TimeStandard.UTC] The time standard in which the first two parameters are defined.
-         */
-        function JulianDate(julianDayNumber, secondsOfDay, timeStandard) {
-            /**
-             * Gets or sets the number of whole days.
-             * @type {Number}
-             */
-            this.dayNumber = undefined;
-
-            /**
-             * Gets or sets the number of seconds into the current day.
-             * @type {Number}
-             */
-            this.secondsOfDay = undefined;
-
-            julianDayNumber = when.defaultValue(julianDayNumber, 0.0);
-            secondsOfDay = when.defaultValue(secondsOfDay, 0.0);
-            timeStandard = when.defaultValue(timeStandard, TimeStandard$1.UTC);
-
-            //If julianDayNumber is fractional, make it an integer and add the number of seconds the fraction represented.
-            var wholeDays = julianDayNumber | 0;
-            secondsOfDay = secondsOfDay + (julianDayNumber - wholeDays) * TimeConstants$1.SECONDS_PER_DAY;
-
-            setComponents(wholeDays, secondsOfDay, this);
-
-            if (timeStandard === TimeStandard$1.UTC) {
-                convertUtcToTai(this);
-            }
-        }
-
-        /**
-         * Creates a new instance from a GregorianDate.
-         *
-         * @param {GregorianDate} date A GregorianDate.
-         * @param {JulianDate} [result] An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter or a new instance if none was provided.
-         *
-         * @exception {DeveloperError} date must be a valid GregorianDate.
-         */
-        JulianDate.fromGregorianDate = function(date, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!(date instanceof GregorianDate)) {
-                throw new Check.DeveloperError('date must be a valid GregorianDate.');
-            }
-            //>>includeEnd('debug');
-
-            var components = computeJulianDateComponents(date.year, date.month, date.day, date.hour, date.minute, date.second, date.millisecond);
-            if (!when.defined(result)) {
-                return new JulianDate(components[0], components[1], TimeStandard$1.UTC);
-            }
-            setComponents(components[0], components[1], result);
-            convertUtcToTai(result);
-            return result;
-        };
-
-        /**
-         * Creates a new instance from a JavaScript Date.
-         *
-         * @param {Date} date A JavaScript Date.
-         * @param {JulianDate} [result] An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter or a new instance if none was provided.
-         *
-         * @exception {DeveloperError} date must be a valid JavaScript Date.
-         */
-        JulianDate.fromDate = function(date, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!(date instanceof Date) || isNaN(date.getTime())) {
-                throw new Check.DeveloperError('date must be a valid JavaScript Date.');
-            }
-            //>>includeEnd('debug');
-
-            var components = computeJulianDateComponents(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());
-            if (!when.defined(result)) {
-                return new JulianDate(components[0], components[1], TimeStandard$1.UTC);
-            }
-            setComponents(components[0], components[1], result);
-            convertUtcToTai(result);
-            return result;
-        };
-
-        /**
-         * Creates a new instance from a from an {@link http://en.wikipedia.org/wiki/ISO_8601|ISO 8601} date.
-         * This method is superior to <code>Date.parse</code> because it will handle all valid formats defined by the ISO 8601
-         * specification, including leap seconds and sub-millisecond times, which discarded by most JavaScript implementations.
-         *
-         * @param {String} iso8601String An ISO 8601 date.
-         * @param {JulianDate} [result] An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter or a new instance if none was provided.
-         *
-         * @exception {DeveloperError} Invalid ISO 8601 date.
-         */
-        JulianDate.fromIso8601 = function(iso8601String, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (typeof iso8601String !== 'string') {
-                throw new Check.DeveloperError(iso8601ErrorMessage);
-            }
-            //>>includeEnd('debug');
-
-            //Comma and decimal point both indicate a fractional number according to ISO 8601,
-            //start out by blanket replacing , with . which is the only valid such symbol in JS.
-            iso8601String = iso8601String.replace(',', '.');
-
-            //Split the string into its date and time components, denoted by a mandatory T
-            var tokens = iso8601String.split('T');
-            var year;
-            var month = 1;
-            var day = 1;
-            var hour = 0;
-            var minute = 0;
-            var second = 0;
-            var millisecond = 0;
-
-            //Lacking a time is okay, but a missing date is illegal.
-            var date = tokens[0];
-            var time = tokens[1];
-            var tmp;
-            var inLeapYear;
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(date)) {
-                throw new Check.DeveloperError(iso8601ErrorMessage);
-            }
-
-            var dashCount;
-            //>>includeEnd('debug');
-
-            //First match the date against possible regular expressions.
-            tokens = date.match(matchCalendarDate);
-            if (tokens !== null) {
-                //>>includeStart('debug', pragmas.debug);
-                dashCount = date.split('-').length - 1;
-                if (dashCount > 0 && dashCount !== 2) {
-                    throw new Check.DeveloperError(iso8601ErrorMessage);
-                }
-                //>>includeEnd('debug');
-                year = +tokens[1];
-                month = +tokens[2];
-                day = +tokens[3];
-            } else {
-                tokens = date.match(matchCalendarMonth);
-                if (tokens !== null) {
-                    year = +tokens[1];
-                    month = +tokens[2];
-                } else {
-                    tokens = date.match(matchCalendarYear);
-                    if (tokens !== null) {
-                        year = +tokens[1];
-                    } else {
-                        //Not a year/month/day so it must be an ordinal date.
-                        var dayOfYear;
-                        tokens = date.match(matchOrdinalDate);
-                        if (tokens !== null) {
-
-                            year = +tokens[1];
-                            dayOfYear = +tokens[2];
-                            inLeapYear = isLeapYear(year);
-
-                            //This validation is only applicable for this format.
-                            //>>includeStart('debug', pragmas.debug);
-                            if (dayOfYear < 1 || (inLeapYear && dayOfYear > 366) || (!inLeapYear && dayOfYear > 365)) {
-                                throw new Check.DeveloperError(iso8601ErrorMessage);
-                            }
-                            //>>includeEnd('debug')
-                        } else {
-                            tokens = date.match(matchWeekDate);
-                            if (tokens !== null) {
-                                //ISO week date to ordinal date from
-                                //http://en.wikipedia.org/w/index.php?title=ISO_week_date&oldid=474176775
-                                year = +tokens[1];
-                                var weekNumber = +tokens[2];
-                                var dayOfWeek = +tokens[3] || 0;
-
-                                //>>includeStart('debug', pragmas.debug);
-                                dashCount = date.split('-').length - 1;
-                                if (dashCount > 0 &&
-                                   ((!when.defined(tokens[3]) && dashCount !== 1) ||
-                                   (when.defined(tokens[3]) && dashCount !== 2))) {
-                                    throw new Check.DeveloperError(iso8601ErrorMessage);
-                                }
-                                //>>includeEnd('debug')
-
-                                var january4 = new Date(Date.UTC(year, 0, 4));
-                                dayOfYear = (weekNumber * 7) + dayOfWeek - january4.getUTCDay() - 3;
-                            } else {
-                                //None of our regular expressions succeeded in parsing the date properly.
-                                //>>includeStart('debug', pragmas.debug);
-                                throw new Check.DeveloperError(iso8601ErrorMessage);
-                                //>>includeEnd('debug')
-                            }
-                        }
-                        //Split an ordinal date into month/day.
-                        tmp = new Date(Date.UTC(year, 0, 1));
-                        tmp.setUTCDate(dayOfYear);
-                        month = tmp.getUTCMonth() + 1;
-                        day = tmp.getUTCDate();
-                    }
-                }
-            }
-
-            //Now that we have all of the date components, validate them to make sure nothing is out of range.
-            inLeapYear = isLeapYear(year);
-            //>>includeStart('debug', pragmas.debug);
-            if (month < 1 || month > 12 || day < 1 || ((month !== 2 || !inLeapYear) && day > daysInMonth[month - 1]) || (inLeapYear && month === 2 && day > daysInLeapFeburary)) {
-                throw new Check.DeveloperError(iso8601ErrorMessage);
-            }
-            //>>includeEnd('debug')
-
-            //Now move onto the time string, which is much simpler.
-            //If no time is specified, it is considered the beginning of the day, UTC to match Javascript's implementation.
-            var offsetIndex;
-            if (when.defined(time)) {
-                tokens = time.match(matchHoursMinutesSeconds);
-                if (tokens !== null) {
-                    //>>includeStart('debug', pragmas.debug);
-                    dashCount = time.split(':').length - 1;
-                    if (dashCount > 0 && dashCount !== 2 && dashCount !== 3) {
-                        throw new Check.DeveloperError(iso8601ErrorMessage);
-                    }
-                    //>>includeEnd('debug')
-
-                    hour = +tokens[1];
-                    minute = +tokens[2];
-                    second = +tokens[3];
-                    millisecond = +(tokens[4] || 0) * 1000.0;
-                    offsetIndex = 5;
-                } else {
-                    tokens = time.match(matchHoursMinutes);
-                    if (tokens !== null) {
-                        //>>includeStart('debug', pragmas.debug);
-                        dashCount = time.split(':').length - 1;
-                        if (dashCount > 2) {
-                            throw new Check.DeveloperError(iso8601ErrorMessage);
-                        }
-                        //>>includeEnd('debug')
-
-                        hour = +tokens[1];
-                        minute = +tokens[2];
-                        second = +(tokens[3] || 0) * 60.0;
-                        offsetIndex = 4;
-                    } else {
-                        tokens = time.match(matchHours);
-                        if (tokens !== null) {
-                            hour = +tokens[1];
-                            minute = +(tokens[2] || 0) * 60.0;
-                            offsetIndex = 3;
-                        } else {
-                            //>>includeStart('debug', pragmas.debug);
-                            throw new Check.DeveloperError(iso8601ErrorMessage);
-                            //>>includeEnd('debug')
-                        }
-                    }
-                }
-
-                //Validate that all values are in proper range.  Minutes and hours have special cases at 60 and 24.
-                //>>includeStart('debug', pragmas.debug);
-                if (minute >= 60 || second >= 61 || hour > 24 || (hour === 24 && (minute > 0 || second > 0 || millisecond > 0))) {
-                    throw new Check.DeveloperError(iso8601ErrorMessage);
-                }
-                //>>includeEnd('debug');
-
-                //Check the UTC offset value, if no value exists, use local time
-                //a Z indicates UTC, + or - are offsets.
-                var offset = tokens[offsetIndex];
-                var offsetHours = +(tokens[offsetIndex + 1]);
-                var offsetMinutes = +(tokens[offsetIndex + 2] || 0);
-                switch (offset) {
-                case '+':
-                    hour = hour - offsetHours;
-                    minute = minute - offsetMinutes;
-                    break;
-                case '-':
-                    hour = hour + offsetHours;
-                    minute = minute + offsetMinutes;
-                    break;
-                case 'Z':
-                    break;
-                default:
-                    minute = minute + new Date(Date.UTC(year, month - 1, day, hour, minute)).getTimezoneOffset();
-                    break;
-                }
-            }
-
-            //ISO8601 denotes a leap second by any time having a seconds component of 60 seconds.
-            //If that's the case, we need to temporarily subtract a second in order to build a UTC date.
-            //Then we add it back in after converting to TAI.
-            var isLeapSecond = second === 60;
-            if (isLeapSecond) {
-                second--;
-            }
-
-            //Even if we successfully parsed the string into its components, after applying UTC offset or
-            //special cases like 24:00:00 denoting midnight, we need to normalize the data appropriately.
-
-            //milliseconds can never be greater than 1000, and seconds can't be above 60, so we start with minutes
-            while (minute >= 60) {
-                minute -= 60;
-                hour++;
-            }
-
-            while (hour >= 24) {
-                hour -= 24;
-                day++;
-            }
-
-            tmp = (inLeapYear && month === 2) ? daysInLeapFeburary : daysInMonth[month - 1];
-            while (day > tmp) {
-                day -= tmp;
-                month++;
-
-                if (month > 12) {
-                    month -= 12;
-                    year++;
-                }
-
-                tmp = (inLeapYear && month === 2) ? daysInLeapFeburary : daysInMonth[month - 1];
-            }
-
-            //If UTC offset is at the beginning/end of the day, minutes can be negative.
-            while (minute < 0) {
-                minute += 60;
-                hour--;
-            }
-
-            while (hour < 0) {
-                hour += 24;
-                day--;
-            }
-
-            while (day < 1) {
-                month--;
-                if (month < 1) {
-                    month += 12;
-                    year--;
-                }
-
-                tmp = (inLeapYear && month === 2) ? daysInLeapFeburary : daysInMonth[month - 1];
-                day += tmp;
-            }
-
-            //Now create the JulianDate components from the Gregorian date and actually create our instance.
-            var components = computeJulianDateComponents(year, month, day, hour, minute, second, millisecond);
-
-            if (!when.defined(result)) {
-                result = new JulianDate(components[0], components[1], TimeStandard$1.UTC);
-            } else {
-                setComponents(components[0], components[1], result);
-                convertUtcToTai(result);
-            }
-
-            //If we were on a leap second, add it back.
-            if (isLeapSecond) {
-                JulianDate.addSeconds(result, 1, result);
-            }
-
-            return result;
-        };
-
-        /**
-         * Creates a new instance that represents the current system time.
-         * This is equivalent to calling <code>JulianDate.fromDate(new Date());</code>.
-         *
-         * @param {JulianDate} [result] An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter or a new instance if none was provided.
-         */
-        JulianDate.now = function(result) {
-            return JulianDate.fromDate(new Date(), result);
-        };
-
-        var toGregorianDateScratch = new JulianDate(0, 0, TimeStandard$1.TAI);
-
-        /**
-         * Creates a {@link GregorianDate} from the provided instance.
-         *
-         * @param {JulianDate} julianDate The date to be converted.
-         * @param {GregorianDate} [result] An existing instance to use for the result.
-         * @returns {GregorianDate} The modified result parameter or a new instance if none was provided.
-         */
-        JulianDate.toGregorianDate = function(julianDate, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(julianDate)) {
-                throw new Check.DeveloperError('julianDate is required.');
-            }
-            //>>includeEnd('debug');
-
-            var isLeapSecond = false;
-            var thisUtc = convertTaiToUtc(julianDate, toGregorianDateScratch);
-            if (!when.defined(thisUtc)) {
-                //Conversion to UTC will fail if we are during a leap second.
-                //If that's the case, subtract a second and convert again.
-                //JavaScript doesn't support leap seconds, so this results in second 59 being repeated twice.
-                JulianDate.addSeconds(julianDate, -1, toGregorianDateScratch);
-                thisUtc = convertTaiToUtc(toGregorianDateScratch, toGregorianDateScratch);
-                isLeapSecond = true;
-            }
-
-            var julianDayNumber = thisUtc.dayNumber;
-            var secondsOfDay = thisUtc.secondsOfDay;
-
-            if (secondsOfDay >= 43200.0) {
-                julianDayNumber += 1;
-            }
-
-            // Algorithm from page 604 of the Explanatory Supplement to the
-            // Astronomical Almanac (Seidelmann 1992).
-            var L = (julianDayNumber + 68569) | 0;
-            var N = (4 * L / 146097) | 0;
-            L = (L - (((146097 * N + 3) / 4) | 0)) | 0;
-            var I = ((4000 * (L + 1)) / 1461001) | 0;
-            L = (L - (((1461 * I) / 4) | 0) + 31) | 0;
-            var J = ((80 * L) / 2447) | 0;
-            var day = (L - (((2447 * J) / 80) | 0)) | 0;
-            L = (J / 11) | 0;
-            var month = (J + 2 - 12 * L) | 0;
-            var year = (100 * (N - 49) + I + L) | 0;
-
-            var hour = (secondsOfDay / TimeConstants$1.SECONDS_PER_HOUR) | 0;
-            var remainingSeconds = secondsOfDay - (hour * TimeConstants$1.SECONDS_PER_HOUR);
-            var minute = (remainingSeconds / TimeConstants$1.SECONDS_PER_MINUTE) | 0;
-            remainingSeconds = remainingSeconds - (minute * TimeConstants$1.SECONDS_PER_MINUTE);
-            var second = remainingSeconds | 0;
-            var millisecond = ((remainingSeconds - second) / TimeConstants$1.SECONDS_PER_MILLISECOND);
-
-            // JulianDates are noon-based
-            hour += 12;
-            if (hour > 23) {
-                hour -= 24;
-            }
-
-            //If we were on a leap second, add it back.
-            if (isLeapSecond) {
-                second += 1;
-            }
-
-            if (!when.defined(result)) {
-                return new GregorianDate(year, month, day, hour, minute, second, millisecond, isLeapSecond);
-            }
-
-            result.year = year;
-            result.month = month;
-            result.day = day;
-            result.hour = hour;
-            result.minute = minute;
-            result.second = second;
-            result.millisecond = millisecond;
-            result.isLeapSecond = isLeapSecond;
-            return result;
-        };
-
-        /**
-         * Creates a JavaScript Date from the provided instance.
-         * Since JavaScript dates are only accurate to the nearest millisecond and
-         * cannot represent a leap second, consider using {@link JulianDate.toGregorianDate} instead.
-         * If the provided JulianDate is during a leap second, the previous second is used.
-         *
-         * @param {JulianDate} julianDate The date to be converted.
-         * @returns {Date} A new instance representing the provided date.
-         */
-        JulianDate.toDate = function(julianDate) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(julianDate)) {
-                throw new Check.DeveloperError('julianDate is required.');
-            }
-            //>>includeEnd('debug');
-
-            var gDate = JulianDate.toGregorianDate(julianDate, gregorianDateScratch);
-            var second = gDate.second;
-            if (gDate.isLeapSecond) {
-                second -= 1;
-            }
-            return new Date(Date.UTC(gDate.year, gDate.month - 1, gDate.day, gDate.hour, gDate.minute, second, gDate.millisecond));
-        };
-
-        /**
-         * Creates an ISO8601 representation of the provided date.
-         *
-         * @param {JulianDate} julianDate The date to be converted.
-         * @param {Number} [precision] The number of fractional digits used to represent the seconds component.  By default, the most precise representation is used.
-         * @returns {String} The ISO8601 representation of the provided date.
-         */
-        JulianDate.toIso8601 = function(julianDate, precision) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(julianDate)) {
-                throw new Check.DeveloperError('julianDate is required.');
-            }
-            //>>includeEnd('debug');
-
-            var gDate = JulianDate.toGregorianDate(julianDate, gregorianDateScratch);
-            var year = gDate.year;
-            var month = gDate.month;
-            var day = gDate.day;
-            var hour = gDate.hour;
-            var minute = gDate.minute;
-            var second = gDate.second;
-            var millisecond = gDate.millisecond;
-
-            // special case - Iso8601.MAXIMUM_VALUE produces a string which we can't parse unless we adjust.
-            // 10000-01-01T00:00:00 is the same instant as 9999-12-31T24:00:00
-            if (year === 10000 && month === 1 && day === 1 && hour === 0 && minute === 0 && second === 0 && millisecond === 0) {
-                year = 9999;
-                month = 12;
-                day = 31;
-                hour = 24;
-            }
-
-            var millisecondStr;
-
-            if (!when.defined(precision) && millisecond !== 0) {
-                //Forces milliseconds into a number with at least 3 digits to whatever the default toString() precision is.
-                millisecondStr = (millisecond * 0.01).toString().replace('.', '');
-                return sprintf('%04d-%02d-%02dT%02d:%02d:%02d.%sZ', year, month, day, hour, minute, second, millisecondStr);
-            }
-
-            //Precision is either 0 or milliseconds is 0 with undefined precision, in either case, leave off milliseconds entirely
-            if (!when.defined(precision) || precision === 0) {
-                return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ', year, month, day, hour, minute, second);
-            }
-
-            //Forces milliseconds into a number with at least 3 digits to whatever the specified precision is.
-            millisecondStr = (millisecond * 0.01).toFixed(precision).replace('.', '').slice(0, precision);
-            return sprintf('%04d-%02d-%02dT%02d:%02d:%02d.%sZ', year, month, day, hour, minute, second, millisecondStr);
-        };
-
-        /**
-         * Duplicates a JulianDate instance.
-         *
-         * @param {JulianDate} julianDate The date to duplicate.
-         * @param {JulianDate} [result] An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter or a new instance if none was provided. Returns undefined if julianDate is undefined.
-         */
-        JulianDate.clone = function(julianDate, result) {
-            if (!when.defined(julianDate)) {
-                return undefined;
-            }
-            if (!when.defined(result)) {
-                return new JulianDate(julianDate.dayNumber, julianDate.secondsOfDay, TimeStandard$1.TAI);
-            }
-            result.dayNumber = julianDate.dayNumber;
-            result.secondsOfDay = julianDate.secondsOfDay;
-            return result;
-        };
-
-        /**
-         * Compares two instances.
-         *
-         * @param {JulianDate} left The first instance.
-         * @param {JulianDate} right The second instance.
-         * @returns {Number} A negative value if left is less than right, a positive value if left is greater than right, or zero if left and right are equal.
-         */
-        JulianDate.compare = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(left)) {
-                throw new Check.DeveloperError('left is required.');
-            }
-            if (!when.defined(right)) {
-                throw new Check.DeveloperError('right is required.');
-            }
-            //>>includeEnd('debug');
-
-            var julianDayNumberDifference = left.dayNumber - right.dayNumber;
-            if (julianDayNumberDifference !== 0) {
-                return julianDayNumberDifference;
-            }
-            return left.secondsOfDay - right.secondsOfDay;
-        };
-
-        /**
-         * Compares two instances and returns <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {JulianDate} [left] The first instance.
-         * @param {JulianDate} [right] The second instance.
-         * @returns {Boolean} <code>true</code> if the dates are equal; otherwise, <code>false</code>.
-         */
-        JulianDate.equals = function(left, right) {
-            return (left === right) ||
-                   (when.defined(left) &&
-                    when.defined(right) &&
-                    left.dayNumber === right.dayNumber &&
-                    left.secondsOfDay === right.secondsOfDay);
-        };
-
-        /**
-         * Compares two instances and returns <code>true</code> if they are within <code>epsilon</code> seconds of
-         * each other.  That is, in order for the dates to be considered equal (and for
-         * this function to return <code>true</code>), the absolute value of the difference between them, in
-         * seconds, must be less than <code>epsilon</code>.
-         *
-         * @param {JulianDate} [left] The first instance.
-         * @param {JulianDate} [right] The second instance.
-         * @param {Number} epsilon The maximum number of seconds that should separate the two instances.
-         * @returns {Boolean} <code>true</code> if the two dates are within <code>epsilon</code> seconds of each other; otherwise <code>false</code>.
-         */
-        JulianDate.equalsEpsilon = function(left, right, epsilon) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(epsilon)) {
-                throw new Check.DeveloperError('epsilon is required.');
-            }
-            //>>includeEnd('debug');
-
-            return (left === right) ||
-                   (when.defined(left) &&
-                    when.defined(right) &&
-                    Math.abs(JulianDate.secondsDifference(left, right)) <= epsilon);
-        };
-
-        /**
-         * Computes the total number of whole and fractional days represented by the provided instance.
-         *
-         * @param {JulianDate} julianDate The date.
-         * @returns {Number} The Julian date as single floating point number.
-         */
-        JulianDate.totalDays = function(julianDate) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(julianDate)) {
-                throw new Check.DeveloperError('julianDate is required.');
-            }
-            //>>includeEnd('debug');
-            return julianDate.dayNumber + (julianDate.secondsOfDay / TimeConstants$1.SECONDS_PER_DAY);
-        };
-
-        /**
-         * Computes the difference in seconds between the provided instance.
-         *
-         * @param {JulianDate} left The first instance.
-         * @param {JulianDate} right The second instance.
-         * @returns {Number} The difference, in seconds, when subtracting <code>right</code> from <code>left</code>.
-         */
-        JulianDate.secondsDifference = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(left)) {
-                throw new Check.DeveloperError('left is required.');
-            }
-            if (!when.defined(right)) {
-                throw new Check.DeveloperError('right is required.');
-            }
-            //>>includeEnd('debug');
-
-            var dayDifference = (left.dayNumber - right.dayNumber) * TimeConstants$1.SECONDS_PER_DAY;
-            return (dayDifference + (left.secondsOfDay - right.secondsOfDay));
-        };
-
-        /**
-         * Computes the difference in days between the provided instance.
-         *
-         * @param {JulianDate} left The first instance.
-         * @param {JulianDate} right The second instance.
-         * @returns {Number} The difference, in days, when subtracting <code>right</code> from <code>left</code>.
-         */
-        JulianDate.daysDifference = function(left, right) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(left)) {
-                throw new Check.DeveloperError('left is required.');
-            }
-            if (!when.defined(right)) {
-                throw new Check.DeveloperError('right is required.');
-            }
-            //>>includeEnd('debug');
-
-            var dayDifference = (left.dayNumber - right.dayNumber);
-            var secondDifference = (left.secondsOfDay - right.secondsOfDay) / TimeConstants$1.SECONDS_PER_DAY;
-            return dayDifference + secondDifference;
-        };
-
-        /**
-         * Computes the number of seconds the provided instance is ahead of UTC.
-         *
-         * @param {JulianDate} julianDate The date.
-         * @returns {Number} The number of seconds the provided instance is ahead of UTC
-         */
-        JulianDate.computeTaiMinusUtc = function(julianDate) {
-            binarySearchScratchLeapSecond.julianDate = julianDate;
-            var leapSeconds = JulianDate.leapSeconds;
-            var index = binarySearch(leapSeconds, binarySearchScratchLeapSecond, compareLeapSecondDates);
-            if (index < 0) {
-                index = ~index;
-                --index;
-                if (index < 0) {
-                    index = 0;
-                }
-            }
-            return leapSeconds[index].offset;
-        };
-
-        /**
-         * Adds the provided number of seconds to the provided date instance.
-         *
-         * @param {JulianDate} julianDate The date.
-         * @param {Number} seconds The number of seconds to add or subtract.
-         * @param {JulianDate} result An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter.
-         */
-        JulianDate.addSeconds = function(julianDate, seconds, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(julianDate)) {
-                throw new Check.DeveloperError('julianDate is required.');
-            }
-            if (!when.defined(seconds)) {
-                throw new Check.DeveloperError('seconds is required.');
-            }
-            if (!when.defined(result)) {
-                throw new Check.DeveloperError('result is required.');
-            }
-            //>>includeEnd('debug');
-
-            return setComponents(julianDate.dayNumber, julianDate.secondsOfDay + seconds, result);
-        };
-
-        /**
-         * Adds the provided number of minutes to the provided date instance.
-         *
-         * @param {JulianDate} julianDate The date.
-         * @param {Number} minutes The number of minutes to add or subtract.
-         * @param {JulianDate} result An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter.
-         */
-        JulianDate.addMinutes = function(julianDate, minutes, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(julianDate)) {
-                throw new Check.DeveloperError('julianDate is required.');
-            }
-            if (!when.defined(minutes)) {
-                throw new Check.DeveloperError('minutes is required.');
-            }
-            if (!when.defined(result)) {
-                throw new Check.DeveloperError('result is required.');
-            }
-            //>>includeEnd('debug');
-
-            var newSecondsOfDay = julianDate.secondsOfDay + (minutes * TimeConstants$1.SECONDS_PER_MINUTE);
-            return setComponents(julianDate.dayNumber, newSecondsOfDay, result);
-        };
-
-        /**
-         * Adds the provided number of hours to the provided date instance.
-         *
-         * @param {JulianDate} julianDate The date.
-         * @param {Number} hours The number of hours to add or subtract.
-         * @param {JulianDate} result An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter.
-         */
-        JulianDate.addHours = function(julianDate, hours, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(julianDate)) {
-                throw new Check.DeveloperError('julianDate is required.');
-            }
-            if (!when.defined(hours)) {
-                throw new Check.DeveloperError('hours is required.');
-            }
-            if (!when.defined(result)) {
-                throw new Check.DeveloperError('result is required.');
-            }
-            //>>includeEnd('debug');
-
-            var newSecondsOfDay = julianDate.secondsOfDay + (hours * TimeConstants$1.SECONDS_PER_HOUR);
-            return setComponents(julianDate.dayNumber, newSecondsOfDay, result);
-        };
-
-        /**
-         * Adds the provided number of days to the provided date instance.
-         *
-         * @param {JulianDate} julianDate The date.
-         * @param {Number} days The number of days to add or subtract.
-         * @param {JulianDate} result An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter.
-         */
-        JulianDate.addDays = function(julianDate, days, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(julianDate)) {
-                throw new Check.DeveloperError('julianDate is required.');
-            }
-            if (!when.defined(days)) {
-                throw new Check.DeveloperError('days is required.');
-            }
-            if (!when.defined(result)) {
-                throw new Check.DeveloperError('result is required.');
-            }
-            //>>includeEnd('debug');
-
-            var newJulianDayNumber = julianDate.dayNumber + days;
-            return setComponents(newJulianDayNumber, julianDate.secondsOfDay, result);
-        };
-
-        /**
-         * Compares the provided instances and returns <code>true</code> if <code>left</code> is earlier than <code>right</code>, <code>false</code> otherwise.
-         *
-         * @param {JulianDate} left The first instance.
-         * @param {JulianDate} right The second instance.
-         * @returns {Boolean} <code>true</code> if <code>left</code> is earlier than <code>right</code>, <code>false</code> otherwise.
-         */
-        JulianDate.lessThan = function(left, right) {
-            return JulianDate.compare(left, right) < 0;
-        };
-
-        /**
-         * Compares the provided instances and returns <code>true</code> if <code>left</code> is earlier than or equal to <code>right</code>, <code>false</code> otherwise.
-         *
-         * @param {JulianDate} left The first instance.
-         * @param {JulianDate} right The second instance.
-         * @returns {Boolean} <code>true</code> if <code>left</code> is earlier than or equal to <code>right</code>, <code>false</code> otherwise.
-         */
-        JulianDate.lessThanOrEquals = function(left, right) {
-            return JulianDate.compare(left, right) <= 0;
-        };
-
-        /**
-         * Compares the provided instances and returns <code>true</code> if <code>left</code> is later than <code>right</code>, <code>false</code> otherwise.
-         *
-         * @param {JulianDate} left The first instance.
-         * @param {JulianDate} right The second instance.
-         * @returns {Boolean} <code>true</code> if <code>left</code> is later than <code>right</code>, <code>false</code> otherwise.
-         */
-        JulianDate.greaterThan = function(left, right) {
-            return JulianDate.compare(left, right) > 0;
-        };
-
-        /**
-         * Compares the provided instances and returns <code>true</code> if <code>left</code> is later than or equal to <code>right</code>, <code>false</code> otherwise.
-         *
-         * @param {JulianDate} left The first instance.
-         * @param {JulianDate} right The second instance.
-         * @returns {Boolean} <code>true</code> if <code>left</code> is later than or equal to <code>right</code>, <code>false</code> otherwise.
-         */
-        JulianDate.greaterThanOrEquals = function(left, right) {
-            return JulianDate.compare(left, right) >= 0;
-        };
-
-        /**
-         * Duplicates this instance.
-         *
-         * @param {JulianDate} [result] An existing instance to use for the result.
-         * @returns {JulianDate} The modified result parameter or a new instance if none was provided.
-         */
-        JulianDate.prototype.clone = function(result) {
-            return JulianDate.clone(this, result);
-        };
-
-        /**
-         * Compares this and the provided instance and returns <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {JulianDate} [right] The second instance.
-         * @returns {Boolean} <code>true</code> if the dates are equal; otherwise, <code>false</code>.
-         */
-        JulianDate.prototype.equals = function(right) {
-            return JulianDate.equals(this, right);
-        };
-
-        /**
-         * Compares this and the provided instance and returns <code>true</code> if they are within <code>epsilon</code> seconds of
-         * each other.  That is, in order for the dates to be considered equal (and for
-         * this function to return <code>true</code>), the absolute value of the difference between them, in
-         * seconds, must be less than <code>epsilon</code>.
-         *
-         * @param {JulianDate} [right] The second instance.
-         * @param {Number} epsilon The maximum number of seconds that should separate the two instances.
-         * @returns {Boolean} <code>true</code> if the two dates are within <code>epsilon</code> seconds of each other; otherwise <code>false</code>.
-         */
-        JulianDate.prototype.equalsEpsilon = function(right, epsilon) {
-            return JulianDate.equalsEpsilon(this, right, epsilon);
-        };
-
-        /**
-         * Creates a string representing this date in ISO8601 format.
-         *
-         * @returns {String} A string representing this date in ISO8601 format.
-         */
-        JulianDate.prototype.toString = function() {
-            return JulianDate.toIso8601(this);
-        };
-
-        /**
-         * Gets or sets the list of leap seconds used throughout Cesium.
-         * @memberof JulianDate
-         * @type {LeapSecond[]}
-         */
-        JulianDate.leapSeconds = [
-                                   new LeapSecond(new JulianDate(2441317, 43210.0, TimeStandard$1.TAI), 10), // January 1, 1972 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2441499, 43211.0, TimeStandard$1.TAI), 11), // July 1, 1972 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2441683, 43212.0, TimeStandard$1.TAI), 12), // January 1, 1973 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2442048, 43213.0, TimeStandard$1.TAI), 13), // January 1, 1974 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2442413, 43214.0, TimeStandard$1.TAI), 14), // January 1, 1975 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2442778, 43215.0, TimeStandard$1.TAI), 15), // January 1, 1976 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2443144, 43216.0, TimeStandard$1.TAI), 16), // January 1, 1977 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2443509, 43217.0, TimeStandard$1.TAI), 17), // January 1, 1978 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2443874, 43218.0, TimeStandard$1.TAI), 18), // January 1, 1979 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2444239, 43219.0, TimeStandard$1.TAI), 19), // January 1, 1980 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2444786, 43220.0, TimeStandard$1.TAI), 20), // July 1, 1981 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2445151, 43221.0, TimeStandard$1.TAI), 21), // July 1, 1982 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2445516, 43222.0, TimeStandard$1.TAI), 22), // July 1, 1983 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2446247, 43223.0, TimeStandard$1.TAI), 23), // July 1, 1985 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2447161, 43224.0, TimeStandard$1.TAI), 24), // January 1, 1988 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2447892, 43225.0, TimeStandard$1.TAI), 25), // January 1, 1990 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2448257, 43226.0, TimeStandard$1.TAI), 26), // January 1, 1991 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2448804, 43227.0, TimeStandard$1.TAI), 27), // July 1, 1992 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2449169, 43228.0, TimeStandard$1.TAI), 28), // July 1, 1993 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2449534, 43229.0, TimeStandard$1.TAI), 29), // July 1, 1994 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2450083, 43230.0, TimeStandard$1.TAI), 30), // January 1, 1996 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2450630, 43231.0, TimeStandard$1.TAI), 31), // July 1, 1997 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2451179, 43232.0, TimeStandard$1.TAI), 32), // January 1, 1999 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2453736, 43233.0, TimeStandard$1.TAI), 33), // January 1, 2006 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2454832, 43234.0, TimeStandard$1.TAI), 34), // January 1, 2009 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2456109, 43235.0, TimeStandard$1.TAI), 35), // July 1, 2012 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2457204, 43236.0, TimeStandard$1.TAI), 36), // July 1, 2015 00:00:00 UTC
-                                   new LeapSecond(new JulianDate(2457754, 43237.0, TimeStandard$1.TAI), 37)  // January 1, 2017 00:00:00 UTC
-                                 ];
-
-    /**
-         * Specifies Earth polar motion coordinates and the difference between UT1 and UTC.
-         * These Earth Orientation Parameters (EOP) are primarily used in the transformation from
-         * the International Celestial Reference Frame (ICRF) to the International Terrestrial
-         * Reference Frame (ITRF).
-         *
-         * @alias EarthOrientationParameters
-         * @constructor
-         *
-         * @param {Object} [options] Object with the following properties:
-         * @param {Resource|String} [options.url] The URL from which to obtain EOP data.  If neither this
-         *                 parameter nor options.data is specified, all EOP values are assumed
-         *                 to be 0.0.  If options.data is specified, this parameter is
-         *                 ignored.
-         * @param {Object} [options.data] The actual EOP data.  If neither this
-         *                 parameter nor options.data is specified, all EOP values are assumed
-         *                 to be 0.0.
-         * @param {Boolean} [options.addNewLeapSeconds=true] True if leap seconds that
-         *                  are specified in the EOP data but not in {@link JulianDate.leapSeconds}
-         *                  should be added to {@link JulianDate.leapSeconds}.  False if
-         *                  new leap seconds should be handled correctly in the context
-         *                  of the EOP data but otherwise ignored.
-         *
-         * @example
-         * // An example EOP data file, EOP.json:
-         * {
-         *   "columnNames" : ["dateIso8601","modifiedJulianDateUtc","xPoleWanderRadians","yPoleWanderRadians","ut1MinusUtcSeconds","lengthOfDayCorrectionSeconds","xCelestialPoleOffsetRadians","yCelestialPoleOffsetRadians","taiMinusUtcSeconds"],
-         *   "samples" : [
-         *      "2011-07-01T00:00:00Z",55743.0,2.117957047295119e-7,2.111518721609984e-6,-0.2908948,-2.956e-4,3.393695767766752e-11,3.3452143996557983e-10,34.0,
-         *      "2011-07-02T00:00:00Z",55744.0,2.193297093339541e-7,2.115460256837405e-6,-0.29065,-1.824e-4,-8.241832578862112e-11,5.623838700870617e-10,34.0,
-         *      "2011-07-03T00:00:00Z",55745.0,2.262286080161428e-7,2.1191157519929706e-6,-0.2905572,1.9e-6,-3.490658503988659e-10,6.981317007977318e-10,34.0
-         *   ]
-         * }
-         *
-         * @example
-         * // Loading the EOP data
-         * var eop = new Cesium.EarthOrientationParameters({ url : 'Data/EOP.json' });
-         * Cesium.Transforms.earthOrientationParameters = eop;
-         *
-         * @private
-         */
-        function EarthOrientationParameters(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            this._dates = undefined;
-            this._samples = undefined;
-
-            this._dateColumn = -1;
-            this._xPoleWanderRadiansColumn = -1;
-            this._yPoleWanderRadiansColumn = -1;
-            this._ut1MinusUtcSecondsColumn = -1;
-            this._xCelestialPoleOffsetRadiansColumn = -1;
-            this._yCelestialPoleOffsetRadiansColumn = -1;
-            this._taiMinusUtcSecondsColumn = -1;
-
-            this._columnCount = 0;
-            this._lastIndex = -1;
-
-            this._downloadPromise = undefined;
-            this._dataError = undefined;
-
-            this._addNewLeapSeconds = when.defaultValue(options.addNewLeapSeconds, true);
-
-            if (when.defined(options.data)) {
-                // Use supplied EOP data.
-                onDataReady(this, options.data);
-            } else if (when.defined(options.url)) {
-                var resource = buildModuleUrl.Resource.createIfNeeded(options.url);
-
-                // Download EOP data.
-                var that = this;
-                this._downloadPromise = when.when(resource.fetchJson(), function(eopData) {
-                    onDataReady(that, eopData);
-                }, function() {
-                    that._dataError = 'An error occurred while retrieving the EOP data from the URL ' + resource.url + '.';
-                });
-            } else {
-                // Use all zeros for EOP data.
-                onDataReady(this, {
-                    'columnNames' : ['dateIso8601', 'modifiedJulianDateUtc', 'xPoleWanderRadians', 'yPoleWanderRadians', 'ut1MinusUtcSeconds', 'lengthOfDayCorrectionSeconds', 'xCelestialPoleOffsetRadians', 'yCelestialPoleOffsetRadians', 'taiMinusUtcSeconds'],
-                    'samples' : []
-                });
-            }
-        }
-
-        /**
-         * A default {@link EarthOrientationParameters} instance that returns zero for all EOP values.
-         */
-        EarthOrientationParameters.NONE = Object.freeze({
-                getPromiseToLoad : function() {
-                    return when.when();
-                },
-                compute : function(date, result) {
-                    if (!when.defined(result)) {
-                        result = new EarthOrientationParametersSample(0.0, 0.0, 0.0, 0.0, 0.0);
-                    } else {
-                        result.xPoleWander = 0.0;
-                        result.yPoleWander = 0.0;
-                        result.xPoleOffset = 0.0;
-                        result.yPoleOffset = 0.0;
-                        result.ut1MinusUtc = 0.0;
-                    }
-                    return result;
-                }
-        });
-
-        /**
-         * Gets a promise that, when resolved, indicates that the EOP data has been loaded and is
-         * ready to use.
-         *
-         * @returns {Promise} The promise.
-         *
-         * @see when
-         */
-        EarthOrientationParameters.prototype.getPromiseToLoad = function() {
-            return when.when(this._downloadPromise);
-        };
-
-        /**
-         * Computes the Earth Orientation Parameters (EOP) for a given date by interpolating.
-         * If the EOP data has not yet been download, this method returns undefined.
-         *
-         * @param {JulianDate} date The date for each to evaluate the EOP.
-         * @param {EarthOrientationParametersSample} [result] The instance to which to copy the result.
-         *        If this parameter is undefined, a new instance is created and returned.
-         * @returns {EarthOrientationParametersSample} The EOP evaluated at the given date, or
-         *          undefined if the data necessary to evaluate EOP at the date has not yet been
-         *          downloaded.
-         *
-         * @exception {RuntimeError} The loaded EOP data has an error and cannot be used.
-         *
-         * @see EarthOrientationParameters#getPromiseToLoad
-         */
-        EarthOrientationParameters.prototype.compute = function(date, result) {
-            // We cannot compute until the samples are available.
-            if (!when.defined(this._samples)) {
-                if (when.defined(this._dataError)) {
-                    throw new RuntimeError.RuntimeError(this._dataError);
-                }
-
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                result = new EarthOrientationParametersSample(0.0, 0.0, 0.0, 0.0, 0.0);
-            }
-
-            if (this._samples.length === 0) {
-                result.xPoleWander = 0.0;
-                result.yPoleWander = 0.0;
-                result.xPoleOffset = 0.0;
-                result.yPoleOffset = 0.0;
-                result.ut1MinusUtc = 0.0;
-                return result;
-            }
-
-            var dates = this._dates;
-            var lastIndex = this._lastIndex;
-
-            var before = 0;
-            var after = 0;
-            if (when.defined(lastIndex)) {
-                var previousIndexDate = dates[lastIndex];
-                var nextIndexDate = dates[lastIndex + 1];
-                var isAfterPrevious = JulianDate.lessThanOrEquals(previousIndexDate, date);
-                var isAfterLastSample = !when.defined(nextIndexDate);
-                var isBeforeNext = isAfterLastSample || JulianDate.greaterThanOrEquals(nextIndexDate, date);
-
-                if (isAfterPrevious && isBeforeNext) {
-                    before = lastIndex;
-
-                    if (!isAfterLastSample && nextIndexDate.equals(date)) {
-                        ++before;
-                    }
-                    after = before + 1;
-
-                    interpolate(this, dates, this._samples, date, before, after, result);
-                    return result;
-                }
-            }
-
-            var index = binarySearch(dates, date, JulianDate.compare, this._dateColumn);
-            if (index >= 0) {
-                // If the next entry is the same date, use the later entry.  This way, if two entries
-                // describe the same moment, one before a leap second and the other after, then we will use
-                // the post-leap second data.
-                if (index < dates.length - 1 && dates[index + 1].equals(date)) {
-                    ++index;
-                }
-                before = index;
-                after = index;
-            } else {
-                after = ~index;
-                before = after - 1;
-
-                // Use the first entry if the date requested is before the beginning of the data.
-                if (before < 0) {
-                    before = 0;
-                }
-            }
-
-            this._lastIndex = before;
-
-            interpolate(this, dates, this._samples, date, before, after, result);
-            return result;
-        };
-
-        function compareLeapSecondDates$1(leapSecond, dateToFind) {
-            return JulianDate.compare(leapSecond.julianDate, dateToFind);
-        }
-
-        function onDataReady(eop, eopData) {
-            if (!when.defined(eopData.columnNames)) {
-                eop._dataError = 'Error in loaded EOP data: The columnNames property is required.';
-                return;
-            }
-
-            if (!when.defined(eopData.samples)) {
-                eop._dataError = 'Error in loaded EOP data: The samples property is required.';
-                return;
-            }
-
-            var dateColumn = eopData.columnNames.indexOf('modifiedJulianDateUtc');
-            var xPoleWanderRadiansColumn = eopData.columnNames.indexOf('xPoleWanderRadians');
-            var yPoleWanderRadiansColumn = eopData.columnNames.indexOf('yPoleWanderRadians');
-            var ut1MinusUtcSecondsColumn = eopData.columnNames.indexOf('ut1MinusUtcSeconds');
-            var xCelestialPoleOffsetRadiansColumn = eopData.columnNames.indexOf('xCelestialPoleOffsetRadians');
-            var yCelestialPoleOffsetRadiansColumn = eopData.columnNames.indexOf('yCelestialPoleOffsetRadians');
-            var taiMinusUtcSecondsColumn = eopData.columnNames.indexOf('taiMinusUtcSeconds');
-
-            if (dateColumn < 0 || xPoleWanderRadiansColumn < 0 || yPoleWanderRadiansColumn < 0 || ut1MinusUtcSecondsColumn < 0 || xCelestialPoleOffsetRadiansColumn < 0 || yCelestialPoleOffsetRadiansColumn < 0 || taiMinusUtcSecondsColumn < 0) {
-                eop._dataError = 'Error in loaded EOP data: The columnNames property must include modifiedJulianDateUtc, xPoleWanderRadians, yPoleWanderRadians, ut1MinusUtcSeconds, xCelestialPoleOffsetRadians, yCelestialPoleOffsetRadians, and taiMinusUtcSeconds columns';
-                return;
-            }
-
-            var samples = eop._samples = eopData.samples;
-            var dates = eop._dates = [];
-
-            eop._dateColumn = dateColumn;
-            eop._xPoleWanderRadiansColumn = xPoleWanderRadiansColumn;
-            eop._yPoleWanderRadiansColumn = yPoleWanderRadiansColumn;
-            eop._ut1MinusUtcSecondsColumn = ut1MinusUtcSecondsColumn;
-            eop._xCelestialPoleOffsetRadiansColumn = xCelestialPoleOffsetRadiansColumn;
-            eop._yCelestialPoleOffsetRadiansColumn = yCelestialPoleOffsetRadiansColumn;
-            eop._taiMinusUtcSecondsColumn = taiMinusUtcSecondsColumn;
-
-            eop._columnCount = eopData.columnNames.length;
-            eop._lastIndex = undefined;
-
-            var lastTaiMinusUtc;
-
-            var addNewLeapSeconds = eop._addNewLeapSeconds;
-
-            // Convert the ISO8601 dates to JulianDates.
-            for (var i = 0, len = samples.length; i < len; i += eop._columnCount) {
-                var mjd = samples[i + dateColumn];
-                var taiMinusUtc = samples[i + taiMinusUtcSecondsColumn];
-                var day = mjd + TimeConstants$1.MODIFIED_JULIAN_DATE_DIFFERENCE;
-                var date = new JulianDate(day, taiMinusUtc, TimeStandard$1.TAI);
-                dates.push(date);
-
-                if (addNewLeapSeconds) {
-                    if (taiMinusUtc !== lastTaiMinusUtc && when.defined(lastTaiMinusUtc)) {
-                        // We crossed a leap second boundary, so add the leap second
-                        // if it does not already exist.
-                        var leapSeconds = JulianDate.leapSeconds;
-                        var leapSecondIndex = binarySearch(leapSeconds, date, compareLeapSecondDates$1);
-                        if (leapSecondIndex < 0) {
-                            var leapSecond = new LeapSecond(date, taiMinusUtc);
-                            leapSeconds.splice(~leapSecondIndex, 0, leapSecond);
-                        }
-                    }
-                    lastTaiMinusUtc = taiMinusUtc;
-                }
-            }
-        }
-
-        function fillResultFromIndex(eop, samples, index, columnCount, result) {
-            var start = index * columnCount;
-            result.xPoleWander = samples[start + eop._xPoleWanderRadiansColumn];
-            result.yPoleWander = samples[start + eop._yPoleWanderRadiansColumn];
-            result.xPoleOffset = samples[start + eop._xCelestialPoleOffsetRadiansColumn];
-            result.yPoleOffset = samples[start + eop._yCelestialPoleOffsetRadiansColumn];
-            result.ut1MinusUtc = samples[start + eop._ut1MinusUtcSecondsColumn];
-        }
-
-        function linearInterp(dx, y1, y2) {
-            return y1 + dx * (y2 - y1);
-        }
-
-        function interpolate(eop, dates, samples, date, before, after, result) {
-            var columnCount = eop._columnCount;
-
-            // First check the bounds on the EOP data
-            // If we are after the bounds of the data, return zeros.
-            // The 'before' index should never be less than zero.
-            if (after > dates.length - 1) {
-                result.xPoleWander = 0;
-                result.yPoleWander = 0;
-                result.xPoleOffset = 0;
-                result.yPoleOffset = 0;
-                result.ut1MinusUtc = 0;
-                return result;
-            }
-
-            var beforeDate = dates[before];
-            var afterDate = dates[after];
-            if (beforeDate.equals(afterDate) || date.equals(beforeDate)) {
-                fillResultFromIndex(eop, samples, before, columnCount, result);
-                return result;
-            } else if (date.equals(afterDate)) {
-                fillResultFromIndex(eop, samples, after, columnCount, result);
-                return result;
-            }
-
-            var factor = JulianDate.secondsDifference(date, beforeDate) / JulianDate.secondsDifference(afterDate, beforeDate);
-
-            var startBefore = before * columnCount;
-            var startAfter = after * columnCount;
-
-            // Handle UT1 leap second edge case
-            var beforeUt1MinusUtc = samples[startBefore + eop._ut1MinusUtcSecondsColumn];
-            var afterUt1MinusUtc = samples[startAfter + eop._ut1MinusUtcSecondsColumn];
-
-            var offsetDifference = afterUt1MinusUtc - beforeUt1MinusUtc;
-            if (offsetDifference > 0.5 || offsetDifference < -0.5) {
-                // The absolute difference between the values is more than 0.5, so we may have
-                // crossed a leap second.  Check if this is the case and, if so, adjust the
-                // afterValue to account for the leap second.  This way, our interpolation will
-                // produce reasonable results.
-                var beforeTaiMinusUtc = samples[startBefore + eop._taiMinusUtcSecondsColumn];
-                var afterTaiMinusUtc = samples[startAfter + eop._taiMinusUtcSecondsColumn];
-                if (beforeTaiMinusUtc !== afterTaiMinusUtc) {
-                    if (afterDate.equals(date)) {
-                        // If we are at the end of the leap second interval, take the second value
-                        // Otherwise, the interpolation below will yield the wrong side of the
-                        // discontinuity
-                        // At the end of the leap second, we need to start accounting for the jump
-                        beforeUt1MinusUtc = afterUt1MinusUtc;
-                    } else {
-                        // Otherwise, remove the leap second so that the interpolation is correct
-                        afterUt1MinusUtc -= afterTaiMinusUtc - beforeTaiMinusUtc;
-                    }
-                }
-            }
-
-            result.xPoleWander = linearInterp(factor, samples[startBefore + eop._xPoleWanderRadiansColumn], samples[startAfter + eop._xPoleWanderRadiansColumn]);
-            result.yPoleWander = linearInterp(factor, samples[startBefore + eop._yPoleWanderRadiansColumn], samples[startAfter + eop._yPoleWanderRadiansColumn]);
-            result.xPoleOffset = linearInterp(factor, samples[startBefore + eop._xCelestialPoleOffsetRadiansColumn], samples[startAfter + eop._xCelestialPoleOffsetRadiansColumn]);
-            result.yPoleOffset = linearInterp(factor, samples[startBefore + eop._yCelestialPoleOffsetRadiansColumn], samples[startAfter + eop._yCelestialPoleOffsetRadiansColumn]);
-            result.ut1MinusUtc = linearInterp(factor, beforeUt1MinusUtc, afterUt1MinusUtc);
-            return result;
-        }
-
-    /**
-         * A rotation expressed as a heading, pitch, and roll. Heading is the rotation about the
-         * negative z axis. Pitch is the rotation about the negative y axis. Roll is the rotation about
-         * the positive x axis.
-         * @alias HeadingPitchRoll
-         * @constructor
-         *
-         * @param {Number} [heading=0.0] The heading component in radians.
-         * @param {Number} [pitch=0.0] The pitch component in radians.
-         * @param {Number} [roll=0.0] The roll component in radians.
-         */
-        function HeadingPitchRoll(heading, pitch, roll) {
-            this.heading = when.defaultValue(heading, 0.0);
-            this.pitch = when.defaultValue(pitch, 0.0);
-            this.roll = when.defaultValue(roll, 0.0);
-        }
-
-        /**
-         * Computes the heading, pitch and roll from a quaternion (see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles )
-         *
-         * @param {Quaternion} quaternion The quaternion from which to retrieve heading, pitch, and roll, all expressed in radians.
-         * @param {HeadingPitchRoll} [result] The object in which to store the result. If not provided, a new instance is created and returned.
-         * @returns {HeadingPitchRoll} The modified result parameter or a new HeadingPitchRoll instance if one was not provided.
-         */
-        HeadingPitchRoll.fromQuaternion = function(quaternion, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(quaternion)) {
-                throw new Check.DeveloperError('quaternion is required');
-            }
-            //>>includeEnd('debug');
-            if (!when.defined(result)) {
-                result = new HeadingPitchRoll();
-            }
-            var test = 2 * (quaternion.w * quaternion.y - quaternion.z * quaternion.x);
-            var denominatorRoll = 1 - 2 * (quaternion.x * quaternion.x + quaternion.y * quaternion.y);
-            var numeratorRoll = 2 * (quaternion.w * quaternion.x + quaternion.y * quaternion.z);
-            var denominatorHeading = 1 - 2 * (quaternion.y * quaternion.y + quaternion.z * quaternion.z);
-            var numeratorHeading = 2 * (quaternion.w * quaternion.z + quaternion.x * quaternion.y);
-            result.heading = -Math.atan2(numeratorHeading, denominatorHeading);
-            result.roll = Math.atan2(numeratorRoll, denominatorRoll);
-            result.pitch = -_Math.CesiumMath.asinClamped(test);
-            return result;
-        };
-
-        /**
-         * Returns a new HeadingPitchRoll instance from angles given in degrees.
-         *
-         * @param {Number} heading the heading in degrees
-         * @param {Number} pitch the pitch in degrees
-         * @param {Number} roll the heading in degrees
-         * @param {HeadingPitchRoll} [result] The object in which to store the result. If not provided, a new instance is created and returned.
-         * @returns {HeadingPitchRoll} A new HeadingPitchRoll instance
-         */
-        HeadingPitchRoll.fromDegrees = function(heading, pitch, roll, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(heading)) {
-                throw new Check.DeveloperError('heading is required');
-            }
-            if (!when.defined(pitch)) {
-                throw new Check.DeveloperError('pitch is required');
-            }
-            if (!when.defined(roll)) {
-                throw new Check.DeveloperError('roll is required');
-            }
-            //>>includeEnd('debug');
-            if (!when.defined(result)) {
-                result = new HeadingPitchRoll();
-            }
-            result.heading = heading * _Math.CesiumMath.RADIANS_PER_DEGREE;
-            result.pitch = pitch * _Math.CesiumMath.RADIANS_PER_DEGREE;
-            result.roll = roll * _Math.CesiumMath.RADIANS_PER_DEGREE;
-            return result;
-        };
-
-        /**
-         * Duplicates a HeadingPitchRoll instance.
-         *
-         * @param {HeadingPitchRoll} headingPitchRoll The HeadingPitchRoll to duplicate.
-         * @param {HeadingPitchRoll} [result] The object onto which to store the result.
-         * @returns {HeadingPitchRoll} The modified result parameter or a new HeadingPitchRoll instance if one was not provided. (Returns undefined if headingPitchRoll is undefined)
-         */
-        HeadingPitchRoll.clone = function(headingPitchRoll, result) {
-            if (!when.defined(headingPitchRoll)) {
-                return undefined;
-            }
-            if (!when.defined(result)) {
-                return new HeadingPitchRoll(headingPitchRoll.heading, headingPitchRoll.pitch, headingPitchRoll.roll);
-            }
-            result.heading = headingPitchRoll.heading;
-            result.pitch = headingPitchRoll.pitch;
-            result.roll = headingPitchRoll.roll;
-            return result;
-        };
-
-        /**
-         * Compares the provided HeadingPitchRolls componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {HeadingPitchRoll} [left] The first HeadingPitchRoll.
-         * @param {HeadingPitchRoll} [right] The second HeadingPitchRoll.
-         * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.
-         */
-        HeadingPitchRoll.equals = function(left, right) {
-            return (left === right) ||
-                ((when.defined(left)) &&
-                    (when.defined(right)) &&
-                    (left.heading === right.heading) &&
-                    (left.pitch === right.pitch) &&
-                    (left.roll === right.roll));
-        };
-
-        /**
-         * Compares the provided HeadingPitchRolls componentwise and returns
-         * <code>true</code> if they pass an absolute or relative tolerance test,
-         * <code>false</code> otherwise.
-         *
-         * @param {HeadingPitchRoll} [left] The first HeadingPitchRoll.
-         * @param {HeadingPitchRoll} [right] The second HeadingPitchRoll.
-         * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-         * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-         * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.
-         */
-        HeadingPitchRoll.equalsEpsilon = function(left, right, relativeEpsilon, absoluteEpsilon) {
-            return (left === right) ||
-                (when.defined(left) &&
-                    when.defined(right) &&
-                    _Math.CesiumMath.equalsEpsilon(left.heading, right.heading, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(left.pitch, right.pitch, relativeEpsilon, absoluteEpsilon) &&
-                    _Math.CesiumMath.equalsEpsilon(left.roll, right.roll, relativeEpsilon, absoluteEpsilon));
-        };
-
-        /**
-         * Duplicates this HeadingPitchRoll instance.
-         *
-         * @param {HeadingPitchRoll} [result] The object onto which to store the result.
-         * @returns {HeadingPitchRoll} The modified result parameter or a new HeadingPitchRoll instance if one was not provided.
-         */
-        HeadingPitchRoll.prototype.clone = function(result) {
-            return HeadingPitchRoll.clone(this, result);
-        };
-
-        /**
-         * Compares this HeadingPitchRoll against the provided HeadingPitchRoll componentwise and returns
-         * <code>true</code> if they are equal, <code>false</code> otherwise.
-         *
-         * @param {HeadingPitchRoll} [right] The right hand side HeadingPitchRoll.
-         * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.
-         */
-        HeadingPitchRoll.prototype.equals = function(right) {
-            return HeadingPitchRoll.equals(this, right);
-        };
-
-        /**
-         * Compares this HeadingPitchRoll against the provided HeadingPitchRoll componentwise and returns
-         * <code>true</code> if they pass an absolute or relative tolerance test,
-         * <code>false</code> otherwise.
-         *
-         * @param {HeadingPitchRoll} [right] The right hand side HeadingPitchRoll.
-         * @param {Number} relativeEpsilon The relative epsilon tolerance to use for equality testing.
-         * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.
-         * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.
-         */
-        HeadingPitchRoll.prototype.equalsEpsilon = function(right, relativeEpsilon, absoluteEpsilon) {
-            return HeadingPitchRoll.equalsEpsilon(this, right, relativeEpsilon, absoluteEpsilon);
-        };
-
-        /**
-         * Creates a string representing this HeadingPitchRoll in the format '(heading, pitch, roll)' in radians.
-         *
-         * @returns {String} A string representing the provided HeadingPitchRoll in the format '(heading, pitch, roll)'.
-         */
-        HeadingPitchRoll.prototype.toString = function() {
-            return '(' + this.heading + ', ' + this.pitch + ', ' + this.roll + ')';
-        };
-
-    /**
-         * An IAU 2006 XYS value sampled at a particular time.
-         *
-         * @alias Iau2006XysSample
-         * @constructor
-         *
-         * @param {Number} x The X value.
-         * @param {Number} y The Y value.
-         * @param {Number} s The S value.
-         *
-         * @private
-         */
-        function Iau2006XysSample(x, y, s) {
-            /**
-             * The X value.
-             * @type {Number}
-             */
-            this.x = x;
-
-            /**
-             * The Y value.
-             * @type {Number}
-             */
-            this.y = y;
-
-            /**
-             * The S value.
-             * @type {Number}
-             */
-            this.s = s;
-        }
-
-    /**
-         * A set of IAU2006 XYS data that is used to evaluate the transformation between the International
-         * Celestial Reference Frame (ICRF) and the International Terrestrial Reference Frame (ITRF).
-         *
-         * @alias Iau2006XysData
-         * @constructor
-         *
-         * @param {Object} [options] Object with the following properties:
-         * @param {Resource|String} [options.xysFileUrlTemplate='Assets/IAU2006_XYS/IAU2006_XYS_{0}.json'] A template URL for obtaining the XYS data.  In the template,
-         *                 `{0}` will be replaced with the file index.
-         * @param {Number} [options.interpolationOrder=9] The order of interpolation to perform on the XYS data.
-         * @param {Number} [options.sampleZeroJulianEphemerisDate=2442396.5] The Julian ephemeris date (JED) of the
-         *                 first XYS sample.
-         * @param {Number} [options.stepSizeDays=1.0] The step size, in days, between successive XYS samples.
-         * @param {Number} [options.samplesPerXysFile=1000] The number of samples in each XYS file.
-         * @param {Number} [options.totalSamples=27426] The total number of samples in all XYS files.
-         *
-         * @private
-         */
-        function Iau2006XysData(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            this._xysFileUrlTemplate = buildModuleUrl.Resource.createIfNeeded(options.xysFileUrlTemplate);
-            this._interpolationOrder = when.defaultValue(options.interpolationOrder, 9);
-            this._sampleZeroJulianEphemerisDate = when.defaultValue(options.sampleZeroJulianEphemerisDate, 2442396.5);
-            this._sampleZeroDateTT = new JulianDate(this._sampleZeroJulianEphemerisDate, 0.0, TimeStandard$1.TAI);
-            this._stepSizeDays = when.defaultValue(options.stepSizeDays, 1.0);
-            this._samplesPerXysFile = when.defaultValue(options.samplesPerXysFile, 1000);
-            this._totalSamples = when.defaultValue(options.totalSamples, 27426);
-            this._samples = new Array(this._totalSamples * 3);
-            this._chunkDownloadsInProgress = [];
-
-            var order = this._interpolationOrder;
-
-            // Compute denominators and X values for interpolation.
-            var denom = this._denominators = new Array(order + 1);
-            var xTable = this._xTable = new Array(order + 1);
-
-            var stepN = Math.pow(this._stepSizeDays, order);
-
-            for ( var i = 0; i <= order; ++i) {
-                denom[i] = stepN;
-                xTable[i] = i * this._stepSizeDays;
-
-                for ( var j = 0; j <= order; ++j) {
-                    if (j !== i) {
-                        denom[i] *= (i - j);
-                    }
-                }
-
-                denom[i] = 1.0 / denom[i];
-            }
-
-            // Allocate scratch arrays for interpolation.
-            this._work = new Array(order + 1);
-            this._coef = new Array(order + 1);
-        }
-
-        var julianDateScratch = new JulianDate(0, 0.0, TimeStandard$1.TAI);
-
-        function getDaysSinceEpoch(xys, dayTT, secondTT) {
-            var dateTT = julianDateScratch;
-            dateTT.dayNumber = dayTT;
-            dateTT.secondsOfDay = secondTT;
-            return JulianDate.daysDifference(dateTT, xys._sampleZeroDateTT);
-        }
-
-        /**
-         * Preloads XYS data for a specified date range.
-         *
-         * @param {Number} startDayTT The Julian day number of the beginning of the interval to preload, expressed in
-         *                 the Terrestrial Time (TT) time standard.
-         * @param {Number} startSecondTT The seconds past noon of the beginning of the interval to preload, expressed in
-         *                 the Terrestrial Time (TT) time standard.
-         * @param {Number} stopDayTT The Julian day number of the end of the interval to preload, expressed in
-         *                 the Terrestrial Time (TT) time standard.
-         * @param {Number} stopSecondTT The seconds past noon of the end of the interval to preload, expressed in
-         *                 the Terrestrial Time (TT) time standard.
-         * @returns {Promise} A promise that, when resolved, indicates that the requested interval has been
-         *                    preloaded.
-         */
-        Iau2006XysData.prototype.preload = function(startDayTT, startSecondTT, stopDayTT, stopSecondTT) {
-            var startDaysSinceEpoch = getDaysSinceEpoch(this, startDayTT, startSecondTT);
-            var stopDaysSinceEpoch = getDaysSinceEpoch(this, stopDayTT, stopSecondTT);
-
-            var startIndex = (startDaysSinceEpoch / this._stepSizeDays - this._interpolationOrder / 2) | 0;
-            if (startIndex < 0) {
-                startIndex = 0;
-            }
-
-            var stopIndex = (stopDaysSinceEpoch / this._stepSizeDays - this._interpolationOrder / 2) | 0 + this._interpolationOrder;
-            if (stopIndex >= this._totalSamples) {
-                stopIndex = this._totalSamples - 1;
-            }
-
-            var startChunk = (startIndex / this._samplesPerXysFile) | 0;
-            var stopChunk = (stopIndex / this._samplesPerXysFile) | 0;
-
-            var promises = [];
-            for ( var i = startChunk; i <= stopChunk; ++i) {
-                promises.push(requestXysChunk(this, i));
-            }
-
-            return when.when.all(promises);
-        };
-
-        /**
-         * Computes the XYS values for a given date by interpolating.  If the required data is not yet downloaded,
-         * this method will return undefined.
-         *
-         * @param {Number} dayTT The Julian day number for which to compute the XYS value, expressed in
-         *                 the Terrestrial Time (TT) time standard.
-         * @param {Number} secondTT The seconds past noon of the date for which to compute the XYS value, expressed in
-         *                 the Terrestrial Time (TT) time standard.
-         * @param {Iau2006XysSample} [result] The instance to which to copy the interpolated result.  If this parameter
-         *                           is undefined, a new instance is allocated and returned.
-         * @returns {Iau2006XysSample} The interpolated XYS values, or undefined if the required data for this
-         *                             computation has not yet been downloaded.
-         *
-         * @see Iau2006XysData#preload
-         */
-        Iau2006XysData.prototype.computeXysRadians = function(dayTT, secondTT, result) {
-            var daysSinceEpoch = getDaysSinceEpoch(this, dayTT, secondTT);
-            if (daysSinceEpoch < 0.0) {
-                // Can't evaluate prior to the epoch of the data.
-                return undefined;
-            }
-
-            var centerIndex = (daysSinceEpoch / this._stepSizeDays) | 0;
-            if (centerIndex >= this._totalSamples) {
-                // Can't evaluate after the last sample in the data.
-                return undefined;
-            }
-
-            var degree = this._interpolationOrder;
-
-            var firstIndex = centerIndex - ((degree / 2) | 0);
-            if (firstIndex < 0) {
-                firstIndex = 0;
-            }
-            var lastIndex = firstIndex + degree;
-            if (lastIndex >= this._totalSamples) {
-                lastIndex = this._totalSamples - 1;
-                firstIndex = lastIndex - degree;
-                if (firstIndex < 0) {
-                    firstIndex = 0;
-                }
-            }
-
-            // Are all the samples we need present?
-            // We can assume so if the first and last are present
-            var isDataMissing = false;
-            var samples = this._samples;
-            if (!when.defined(samples[firstIndex * 3])) {
-                requestXysChunk(this, (firstIndex / this._samplesPerXysFile) | 0);
-                isDataMissing = true;
-            }
-
-            if (!when.defined(samples[lastIndex * 3])) {
-                requestXysChunk(this, (lastIndex / this._samplesPerXysFile) | 0);
-                isDataMissing = true;
-            }
-
-            if (isDataMissing) {
-                return undefined;
-            }
-
-            if (!when.defined(result)) {
-                result = new Iau2006XysSample(0.0, 0.0, 0.0);
-            } else {
-                result.x = 0.0;
-                result.y = 0.0;
-                result.s = 0.0;
-            }
-
-            var x = daysSinceEpoch - firstIndex * this._stepSizeDays;
-
-            var work = this._work;
-            var denom = this._denominators;
-            var coef = this._coef;
-            var xTable = this._xTable;
-
-            var i, j;
-            for (i = 0; i <= degree; ++i) {
-                work[i] = x - xTable[i];
-            }
-
-            for (i = 0; i <= degree; ++i) {
-                coef[i] = 1.0;
-
-                for (j = 0; j <= degree; ++j) {
-                    if (j !== i) {
-                        coef[i] *= work[j];
-                    }
-                }
-
-                coef[i] *= denom[i];
-
-                var sampleIndex = (firstIndex + i) * 3;
-                result.x += coef[i] * samples[sampleIndex++];
-                result.y += coef[i] * samples[sampleIndex++];
-                result.s += coef[i] * samples[sampleIndex];
-            }
-
-            return result;
-        };
-
-        function requestXysChunk(xysData, chunkIndex) {
-            if (xysData._chunkDownloadsInProgress[chunkIndex]) {
-                // Chunk has already been requested.
-                return xysData._chunkDownloadsInProgress[chunkIndex];
-            }
-
-            var deferred = when.when.defer();
-
-            xysData._chunkDownloadsInProgress[chunkIndex] = deferred;
-
-            var chunkUrl;
-            var xysFileUrlTemplate = xysData._xysFileUrlTemplate;
-            if (when.defined(xysFileUrlTemplate)) {
-                chunkUrl = xysFileUrlTemplate.getDerivedResource({
-                    templateValues: {
-                        '0': chunkIndex
-                    }
-                });
-            } else {
-                chunkUrl = new buildModuleUrl.Resource({
-                    url : buildModuleUrl.buildModuleUrl('Assets/IAU2006_XYS/IAU2006_XYS_' + chunkIndex + '.json')
-                });
-            }
-
-            when.when(chunkUrl.fetchJson(), function(chunk) {
-                xysData._chunkDownloadsInProgress[chunkIndex] = false;
-
-                var samples = xysData._samples;
-                var newSamples = chunk.samples;
-                var startIndex = chunkIndex * xysData._samplesPerXysFile * 3;
-
-                for ( var i = 0, len = newSamples.length; i < len; ++i) {
-                    samples[startIndex + i] = newSamples[i];
-                }
-
-                deferred.resolve();
-            });
-
-            return deferred.promise;
-        }
-
-    /**
-         * Contains functions for transforming positions to various reference frames.
-         *
-         * @exports Transforms
-         * @namespace
-         */
-        var Transforms = {};
-
-        var vectorProductLocalFrame = {
-            up : {
-                south : 'east',
-                north : 'west',
-                west : 'south',
-                east : 'north'
-            },
-            down : {
-                south : 'west',
-                north : 'east',
-                west : 'north',
-                east : 'south'
-            },
-            south : {
-                up : 'west',
-                down : 'east',
-                west : 'down',
-                east : 'up'
-            },
-            north : {
-                up : 'east',
-                down : 'west',
-                west : 'up',
-                east : 'down'
-            },
-            west : {
-                up : 'north',
-                down : 'south',
-                north : 'down',
-                south : 'up'
-            },
-            east : {
-                up : 'south',
-                down : 'north',
-                north : 'up',
-                south : 'down'
-            }
-        };
-
-        var degeneratePositionLocalFrame = {
-            north : [-1, 0, 0],
-            east : [0, 1, 0],
-            up : [0, 0, 1],
-            south : [1, 0, 0],
-            west : [0, -1, 0],
-            down : [0, 0, -1]
-        };
-
-        var localFrameToFixedFrameCache = {};
-
-        var scratchCalculateCartesian = {
-            east : new Cartographic.Cartesian3(),
-            north : new Cartographic.Cartesian3(),
-            up : new Cartographic.Cartesian3(),
-            west : new Cartographic.Cartesian3(),
-            south : new Cartographic.Cartesian3(),
-            down : new Cartographic.Cartesian3()
-        };
-        var scratchFirstCartesian = new Cartographic.Cartesian3();
-        var scratchSecondCartesian = new Cartographic.Cartesian3();
-        var scratchThirdCartesian = new Cartographic.Cartesian3();
-        /**
-        * Generates a function that computes a 4x4 transformation matrix from a reference frame
-        * centered at the provided origin to the provided ellipsoid's fixed reference frame.
-        * @param  {String} firstAxis  name of the first axis of the local reference frame. Must be
-        *  'east', 'north', 'up', 'west', 'south' or 'down'.
-        * @param  {String} secondAxis  name of the second axis of the local reference frame. Must be
-        *  'east', 'north', 'up', 'west', 'south' or 'down'.
-        * @return {localFrameToFixedFrameGenerator~resultat} The function that will computes a
-        * 4x4 transformation matrix from a reference frame, with first axis and second axis compliant with the parameters,
-        */
-        Transforms.localFrameToFixedFrameGenerator = function (firstAxis, secondAxis) {
-            if (!vectorProductLocalFrame.hasOwnProperty(firstAxis) || !vectorProductLocalFrame[firstAxis].hasOwnProperty(secondAxis)) {
-                throw new Check.DeveloperError('firstAxis and secondAxis must be east, north, up, west, south or down.');
-            }
-            var thirdAxis = vectorProductLocalFrame[firstAxis][secondAxis];
-
-            /**
-             * Computes a 4x4 transformation matrix from a reference frame
-             * centered at the provided origin to the provided ellipsoid's fixed reference frame.
-             * @callback Transforms~LocalFrameToFixedFrame
-             * @param {Cartesian3} origin The center point of the local reference frame.
-             * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.
-             * @param {Matrix4} [result] The object onto which to store the result.
-             * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if none was provided.
-             */
-            var resultat;
-            var hashAxis = firstAxis + secondAxis;
-            if (when.defined(localFrameToFixedFrameCache[hashAxis])) {
-                resultat = localFrameToFixedFrameCache[hashAxis];
-            } else {
-                resultat = function (origin, ellipsoid, result) {
-                    //>>includeStart('debug', pragmas.debug);
-                    if (!when.defined(origin)) {
-                        throw new Check.DeveloperError('origin is required.');
-                    }
-                    //>>includeEnd('debug');
-                    if (!when.defined(result)) {
-                        result = new BoundingSphere.Matrix4();
-                    }
-                    if (Cartographic.Cartesian3.equalsEpsilon(origin, Cartographic.Cartesian3.ZERO, _Math.CesiumMath.EPSILON14)) {
-                        // If x, y, and z are zero, use the degenerate local frame, which is a special case
-                        Cartographic.Cartesian3.unpack(degeneratePositionLocalFrame[firstAxis], 0, scratchFirstCartesian);
-                        Cartographic.Cartesian3.unpack(degeneratePositionLocalFrame[secondAxis], 0, scratchSecondCartesian);
-                        Cartographic.Cartesian3.unpack(degeneratePositionLocalFrame[thirdAxis], 0, scratchThirdCartesian);
-                    } else if (_Math.CesiumMath.equalsEpsilon(origin.x, 0.0, _Math.CesiumMath.EPSILON14) && _Math.CesiumMath.equalsEpsilon(origin.y, 0.0, _Math.CesiumMath.EPSILON14)) {
-                        // If x and y are zero, assume origin is at a pole, which is a special case.
-                        var sign = _Math.CesiumMath.sign(origin.z);
-
-                        Cartographic.Cartesian3.unpack(degeneratePositionLocalFrame[firstAxis], 0, scratchFirstCartesian);
-                        if (firstAxis !== 'east' && firstAxis !== 'west') {
-                            Cartographic.Cartesian3.multiplyByScalar(scratchFirstCartesian, sign, scratchFirstCartesian);
-                        }
-
-                        Cartographic.Cartesian3.unpack(degeneratePositionLocalFrame[secondAxis], 0, scratchSecondCartesian);
-                        if (secondAxis !== 'east' && secondAxis !== 'west') {
-                            Cartographic.Cartesian3.multiplyByScalar(scratchSecondCartesian, sign, scratchSecondCartesian);
-                        }
-
-                        Cartographic.Cartesian3.unpack(degeneratePositionLocalFrame[thirdAxis], 0, scratchThirdCartesian);
-                        if (thirdAxis !== 'east' && thirdAxis !== 'west') {
-                            Cartographic.Cartesian3.multiplyByScalar(scratchThirdCartesian, sign, scratchThirdCartesian);
-                        }
-                    } else {
-                        ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-                        ellipsoid.geodeticSurfaceNormal(origin, scratchCalculateCartesian.up);
-
-                        var up = scratchCalculateCartesian.up;
-                        var east = scratchCalculateCartesian.east;
-                        east.x = -origin.y;
-                        east.y = origin.x;
-                        east.z = 0.0;
-                        Cartographic.Cartesian3.normalize(east, scratchCalculateCartesian.east);
-                        Cartographic.Cartesian3.cross(up, east, scratchCalculateCartesian.north);
-
-                        Cartographic.Cartesian3.multiplyByScalar(scratchCalculateCartesian.up, -1, scratchCalculateCartesian.down);
-                        Cartographic.Cartesian3.multiplyByScalar(scratchCalculateCartesian.east, -1, scratchCalculateCartesian.west);
-                        Cartographic.Cartesian3.multiplyByScalar(scratchCalculateCartesian.north, -1, scratchCalculateCartesian.south);
-
-                        scratchFirstCartesian = scratchCalculateCartesian[firstAxis];
-                        scratchSecondCartesian = scratchCalculateCartesian[secondAxis];
-                        scratchThirdCartesian = scratchCalculateCartesian[thirdAxis];
-                    }
-                    result[0] = scratchFirstCartesian.x;
-                    result[1] = scratchFirstCartesian.y;
-                    result[2] = scratchFirstCartesian.z;
-                    result[3] = 0.0;
-                    result[4] = scratchSecondCartesian.x;
-                    result[5] = scratchSecondCartesian.y;
-                    result[6] = scratchSecondCartesian.z;
-                    result[7] = 0.0;
-                    result[8] = scratchThirdCartesian.x;
-                    result[9] = scratchThirdCartesian.y;
-                    result[10] = scratchThirdCartesian.z;
-                    result[11] = 0.0;
-                    result[12] = origin.x;
-                    result[13] = origin.y;
-                    result[14] = origin.z;
-                    result[15] = 1.0;
-                    return result;
-                };
-                localFrameToFixedFrameCache[hashAxis] = resultat;
-            }
-            return resultat;
-        };
-
-        /**
-         * Computes a 4x4 transformation matrix from a reference frame with an east-north-up axes
-         * centered at the provided origin to the provided ellipsoid's fixed reference frame.
-         * The local axes are defined as:
-         * <ul>
-         * <li>The <code>x</code> axis points in the local east direction.</li>
-         * <li>The <code>y</code> axis points in the local north direction.</li>
-         * <li>The <code>z</code> axis points in the direction of the ellipsoid surface normal which passes through the position.</li>
-         * </ul>
-         *
-         * @function
-         * @param {Cartesian3} origin The center point of the local reference frame.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.
-         * @param {Matrix4} [result] The object onto which to store the result.
-         * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if none was provided.
-         *
-         * @example
-         * // Get the transform from local east-north-up at cartographic (0.0, 0.0) to Earth's fixed frame.
-         * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0);
-         * var transform = Cesium.Transforms.eastNorthUpToFixedFrame(center);
-         */
-        Transforms.eastNorthUpToFixedFrame = Transforms.localFrameToFixedFrameGenerator('east','north');
-
-        /**
-         * Computes a 4x4 transformation matrix from a reference frame with an north-east-down axes
-         * centered at the provided origin to the provided ellipsoid's fixed reference frame.
-         * The local axes are defined as:
-         * <ul>
-         * <li>The <code>x</code> axis points in the local north direction.</li>
-         * <li>The <code>y</code> axis points in the local east direction.</li>
-         * <li>The <code>z</code> axis points in the opposite direction of the ellipsoid surface normal which passes through the position.</li>
-         * </ul>
-         *
-         * @function
-         * @param {Cartesian3} origin The center point of the local reference frame.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.
-         * @param {Matrix4} [result] The object onto which to store the result.
-         * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if none was provided.
-         *
-         * @example
-         * // Get the transform from local north-east-down at cartographic (0.0, 0.0) to Earth's fixed frame.
-         * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0);
-         * var transform = Cesium.Transforms.northEastDownToFixedFrame(center);
-         */
-        Transforms.northEastDownToFixedFrame = Transforms.localFrameToFixedFrameGenerator('north','east');
-
-        /**
-         * Computes a 4x4 transformation matrix from a reference frame with an north-up-east axes
-         * centered at the provided origin to the provided ellipsoid's fixed reference frame.
-         * The local axes are defined as:
-         * <ul>
-         * <li>The <code>x</code> axis points in the local north direction.</li>
-         * <li>The <code>y</code> axis points in the direction of the ellipsoid surface normal which passes through the position.</li>
-         * <li>The <code>z</code> axis points in the local east direction.</li>
-         * </ul>
-         *
-         * @function
-         * @param {Cartesian3} origin The center point of the local reference frame.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.
-         * @param {Matrix4} [result] The object onto which to store the result.
-         * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if none was provided.
-         *
-         * @example
-         * // Get the transform from local north-up-east at cartographic (0.0, 0.0) to Earth's fixed frame.
-         * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0);
-         * var transform = Cesium.Transforms.northUpEastToFixedFrame(center);
-         */
-        Transforms.northUpEastToFixedFrame = Transforms.localFrameToFixedFrameGenerator('north','up');
-
-        /**
-         * Computes a 4x4 transformation matrix from a reference frame with an north-west-up axes
-         * centered at the provided origin to the provided ellipsoid's fixed reference frame.
-         * The local axes are defined as:
-         * <ul>
-         * <li>The <code>x</code> axis points in the local north direction.</li>
-         * <li>The <code>y</code> axis points in the local west direction.</li>
-         * <li>The <code>z</code> axis points in the direction of the ellipsoid surface normal which passes through the position.</li>
-         * </ul>
-         *
-         * @function
-         * @param {Cartesian3} origin The center point of the local reference frame.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.
-         * @param {Matrix4} [result] The object onto which to store the result.
-         * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if none was provided.
-         *
-          * @example
-         * // Get the transform from local north-West-Up at cartographic (0.0, 0.0) to Earth's fixed frame.
-         * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0);
-         * var transform = Cesium.Transforms.northWestUpToFixedFrame(center);
-         */
-        Transforms.northWestUpToFixedFrame = Transforms.localFrameToFixedFrameGenerator('north','west');
-
-        var scratchHPRQuaternion$1 = new Quaternion();
-        var scratchScale = new Cartographic.Cartesian3(1.0, 1.0, 1.0);
-        var scratchHPRMatrix4 = new BoundingSphere.Matrix4();
-
-        /**
-         * Computes a 4x4 transformation matrix from a reference frame with axes computed from the heading-pitch-roll angles
-         * centered at the provided origin to the provided ellipsoid's fixed reference frame. Heading is the rotation from the local north
-         * direction where a positive angle is increasing eastward. Pitch is the rotation from the local east-north plane. Positive pitch angles
-         * are above the plane. Negative pitch angles are below the plane. Roll is the first rotation applied about the local east axis.
-         *
-         * @param {Cartesian3} origin The center point of the local reference frame.
-         * @param {HeadingPitchRoll} headingPitchRoll The heading, pitch, and roll.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.
-         * @param {Transforms~LocalFrameToFixedFrame} [fixedFrameTransform=Transforms.eastNorthUpToFixedFrame] A 4x4 transformation
-         *  matrix from a reference frame to the provided ellipsoid's fixed reference frame
-         * @param {Matrix4} [result] The object onto which to store the result.
-         * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if none was provided.
-         *
-         * @example
-         * // Get the transform from local heading-pitch-roll at cartographic (0.0, 0.0) to Earth's fixed frame.
-         * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0);
-         * var heading = -Cesium.Math.PI_OVER_TWO;
-         * var pitch = Cesium.Math.PI_OVER_FOUR;
-         * var roll = 0.0;
-         * var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
-         * var transform = Cesium.Transforms.headingPitchRollToFixedFrame(center, hpr);
-         */
-        Transforms.headingPitchRollToFixedFrame = function(origin, headingPitchRoll, ellipsoid, fixedFrameTransform, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object( 'HeadingPitchRoll', headingPitchRoll);
-            //>>includeEnd('debug');
-
-            fixedFrameTransform = when.defaultValue(fixedFrameTransform, Transforms.eastNorthUpToFixedFrame);
-            var hprQuaternion = Quaternion.fromHeadingPitchRoll(headingPitchRoll, scratchHPRQuaternion$1);
-            var hprMatrix = BoundingSphere.Matrix4.fromTranslationQuaternionRotationScale(Cartographic.Cartesian3.ZERO, hprQuaternion, scratchScale, scratchHPRMatrix4);
-            result = fixedFrameTransform(origin, ellipsoid, result);
-            return BoundingSphere.Matrix4.multiply(result, hprMatrix, result);
-        };
-
-        var scratchENUMatrix4 = new BoundingSphere.Matrix4();
-        var scratchHPRMatrix3 = new BoundingSphere.Matrix3();
-
-        /**
-         * Computes a quaternion from a reference frame with axes computed from the heading-pitch-roll angles
-         * centered at the provided origin. Heading is the rotation from the local north
-         * direction where a positive angle is increasing eastward. Pitch is the rotation from the local east-north plane. Positive pitch angles
-         * are above the plane. Negative pitch angles are below the plane. Roll is the first rotation applied about the local east axis.
-         *
-         * @param {Cartesian3} origin The center point of the local reference frame.
-         * @param {HeadingPitchRoll} headingPitchRoll The heading, pitch, and roll.
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.
-         * @param {Transforms~LocalFrameToFixedFrame} [fixedFrameTransform=Transforms.eastNorthUpToFixedFrame] A 4x4 transformation
-         *  matrix from a reference frame to the provided ellipsoid's fixed reference frame
-         * @param {Quaternion} [result] The object onto which to store the result.
-         * @returns {Quaternion} The modified result parameter or a new Quaternion instance if none was provided.
-         *
-         * @example
-         * // Get the quaternion from local heading-pitch-roll at cartographic (0.0, 0.0) to Earth's fixed frame.
-         * var center = Cesium.Cartesian3.fromDegrees(0.0, 0.0);
-         * var heading = -Cesium.Math.PI_OVER_TWO;
-         * var pitch = Cesium.Math.PI_OVER_FOUR;
-         * var roll = 0.0;
-         * var hpr = new HeadingPitchRoll(heading, pitch, roll);
-         * var quaternion = Cesium.Transforms.headingPitchRollQuaternion(center, hpr);
-         */
-        Transforms.headingPitchRollQuaternion = function(origin, headingPitchRoll, ellipsoid, fixedFrameTransform, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object( 'HeadingPitchRoll', headingPitchRoll);
-            //>>includeEnd('debug');
-
-            var transform = Transforms.headingPitchRollToFixedFrame(origin, headingPitchRoll, ellipsoid, fixedFrameTransform, scratchENUMatrix4);
-            var rotation = BoundingSphere.Matrix4.getMatrix3(transform, scratchHPRMatrix3);
-            return Quaternion.fromRotationMatrix(rotation, result);
-        };
-
-        var noScale = new Cartographic.Cartesian3(1.0, 1.0, 1.0);
-        var hprCenterScratch = new Cartographic.Cartesian3();
-        var ffScratch = new BoundingSphere.Matrix4();
-        var hprTransformScratch = new BoundingSphere.Matrix4();
-        var hprRotationScratch = new BoundingSphere.Matrix3();
-        var hprQuaternionScratch = new Quaternion();
-        /**
-         * Computes heading-pitch-roll angles from a transform in a particular reference frame. Heading is the rotation from the local north
-         * direction where a positive angle is increasing eastward. Pitch is the rotation from the local east-north plane. Positive pitch angles
-         * are above the plane. Negative pitch angles are below the plane. Roll is the first rotation applied about the local east axis.
-         *
-         * @param {Matrix4} transform The transform
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid whose fixed frame is used in the transformation.
-         * @param {Transforms~LocalFrameToFixedFrame} [fixedFrameTransform=Transforms.eastNorthUpToFixedFrame] A 4x4 transformation
-         *  matrix from a reference frame to the provided ellipsoid's fixed reference frame
-         * @param {HeadingPitchRoll} [result] The object onto which to store the result.
-         * @returns {HeadingPitchRoll} The modified result parameter or a new HeadingPitchRoll instance if none was provided.
-         */
-        Transforms.fixedFrameToHeadingPitchRoll = function(transform, ellipsoid, fixedFrameTransform, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('transform', transform);
-            //>>includeEnd('debug');
-
-            ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            fixedFrameTransform = when.defaultValue(fixedFrameTransform, Transforms.eastNorthUpToFixedFrame);
-            if (!when.defined(result)) {
-                result = new HeadingPitchRoll();
-            }
-
-            var center = BoundingSphere.Matrix4.getTranslation(transform, hprCenterScratch);
-            if (Cartographic.Cartesian3.equals(center, Cartographic.Cartesian3.ZERO)) {
-                result.heading = 0;
-                result.pitch = 0;
-                result.roll = 0;
-                return result;
-            }
-            var toFixedFrame = BoundingSphere.Matrix4.inverseTransformation(fixedFrameTransform(center, ellipsoid, ffScratch), ffScratch);
-            var transformCopy = BoundingSphere.Matrix4.setScale(transform, noScale, hprTransformScratch);
-            transformCopy = BoundingSphere.Matrix4.setTranslation(transformCopy, Cartographic.Cartesian3.ZERO, transformCopy);
-
-            toFixedFrame = BoundingSphere.Matrix4.multiply(toFixedFrame, transformCopy, toFixedFrame);
-            var quaternionRotation = Quaternion.fromRotationMatrix(BoundingSphere.Matrix4.getMatrix3(toFixedFrame, hprRotationScratch), hprQuaternionScratch);
-            quaternionRotation = Quaternion.normalize(quaternionRotation, quaternionRotation);
-
-            return HeadingPitchRoll.fromQuaternion(quaternionRotation, result);
-        };
-
-        var gmstConstant0 = 6 * 3600 + 41 * 60 + 50.54841;
-        var gmstConstant1 = 8640184.812866;
-        var gmstConstant2 = 0.093104;
-        var gmstConstant3 = -6.2E-6;
-        var rateCoef = 1.1772758384668e-19;
-        var wgs84WRPrecessing = 7.2921158553E-5;
-        var twoPiOverSecondsInDay = _Math.CesiumMath.TWO_PI / 86400.0;
-        var dateInUtc = new JulianDate();
-
-        /**
-         * Computes a rotation matrix to transform a point or vector from True Equator Mean Equinox (TEME) axes to the
-         * pseudo-fixed axes at a given time.  This method treats the UT1 time standard as equivalent to UTC.
-         *
-         * @param {JulianDate} date The time at which to compute the rotation matrix.
-         * @param {Matrix3} [result] The object onto which to store the result.
-         * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if none was provided.
-         *
-         * @example
-         * //Set the view to the inertial frame.
-         * scene.postUpdate.addEventListener(function(scene, time) {
-         *    var now = Cesium.JulianDate.now();
-         *    var offset = Cesium.Matrix4.multiplyByPoint(camera.transform, camera.position, new Cesium.Cartesian3());
-         *    var transform = Cesium.Matrix4.fromRotationTranslation(Cesium.Transforms.computeTemeToPseudoFixedMatrix(now));
-         *    var inverseTransform = Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4());
-         *    Cesium.Matrix4.multiplyByPoint(inverseTransform, offset, offset);
-         *    camera.lookAtTransform(transform, offset);
-         * });
-         */
-        Transforms.computeTemeToPseudoFixedMatrix = function (date, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(date)) {
-                throw new Check.DeveloperError('date is required.');
-            }
-            //>>includeEnd('debug');
-
-            // GMST is actually computed using UT1.  We're using UTC as an approximation of UT1.
-            // We do not want to use the function like convertTaiToUtc in JulianDate because
-            // we explicitly do not want to fail when inside the leap second.
-
-            dateInUtc = JulianDate.addSeconds(date, -JulianDate.computeTaiMinusUtc(date), dateInUtc);
-            var utcDayNumber = dateInUtc.dayNumber;
-            var utcSecondsIntoDay = dateInUtc.secondsOfDay;
-
-            var t;
-            var diffDays = utcDayNumber - 2451545;
-            if (utcSecondsIntoDay >= 43200.0) {
-                t = (diffDays + 0.5) / TimeConstants$1.DAYS_PER_JULIAN_CENTURY;
-            } else {
-                t = (diffDays - 0.5) / TimeConstants$1.DAYS_PER_JULIAN_CENTURY;
-            }
-
-            var gmst0 = gmstConstant0 + t * (gmstConstant1 + t * (gmstConstant2 + t * gmstConstant3));
-            var angle = (gmst0 * twoPiOverSecondsInDay) % _Math.CesiumMath.TWO_PI;
-            var ratio = wgs84WRPrecessing + rateCoef * (utcDayNumber - 2451545.5);
-            var secondsSinceMidnight = (utcSecondsIntoDay + TimeConstants$1.SECONDS_PER_DAY * 0.5) % TimeConstants$1.SECONDS_PER_DAY;
-            var gha = angle + (ratio * secondsSinceMidnight);
-            var cosGha = Math.cos(gha);
-            var sinGha = Math.sin(gha);
-
-            if (!when.defined(result)) {
-                return new BoundingSphere.Matrix3(cosGha, sinGha, 0.0,
-                                  -sinGha, cosGha, 0.0,
-                                      0.0,    0.0, 1.0);
-            }
-            result[0] = cosGha;
-            result[1] = -sinGha;
-            result[2] = 0.0;
-            result[3] = sinGha;
-            result[4] = cosGha;
-            result[5] = 0.0;
-            result[6] = 0.0;
-            result[7] = 0.0;
-            result[8] = 1.0;
-            return result;
-        };
-
-        /**
-         * The source of IAU 2006 XYS data, used for computing the transformation between the
-         * Fixed and ICRF axes.
-         * @type {Iau2006XysData}
-         *
-         * @see Transforms.computeIcrfToFixedMatrix
-         * @see Transforms.computeFixedToIcrfMatrix
-         *
-         * @private
-         */
-        Transforms.iau2006XysData = new Iau2006XysData();
-
-        /**
-         * The source of Earth Orientation Parameters (EOP) data, used for computing the transformation
-         * between the Fixed and ICRF axes.  By default, zero values are used for all EOP values,
-         * yielding a reasonable but not completely accurate representation of the ICRF axes.
-         * @type {EarthOrientationParameters}
-         *
-         * @see Transforms.computeIcrfToFixedMatrix
-         * @see Transforms.computeFixedToIcrfMatrix
-         *
-         * @private
-         */
-        Transforms.earthOrientationParameters = EarthOrientationParameters.NONE;
-
-        var ttMinusTai = 32.184;
-        var j2000ttDays = 2451545.0;
-
-        /**
-         * Preloads the data necessary to transform between the ICRF and Fixed axes, in either
-         * direction, over a given interval.  This function returns a promise that, when resolved,
-         * indicates that the preload has completed.
-         *
-         * @param {TimeInterval} timeInterval The interval to preload.
-         * @returns {Promise} A promise that, when resolved, indicates that the preload has completed
-         *          and evaluation of the transformation between the fixed and ICRF axes will
-         *          no longer return undefined for a time inside the interval.
-         *
-         *
-         * @example
-         * var interval = new Cesium.TimeInterval(...);
-         * when(Cesium.Transforms.preloadIcrfFixed(interval), function() {
-         *     // the data is now loaded
-         * });
-         *
-         * @see Transforms.computeIcrfToFixedMatrix
-         * @see Transforms.computeFixedToIcrfMatrix
-         * @see when
-         */
-        Transforms.preloadIcrfFixed = function(timeInterval) {
-            var startDayTT = timeInterval.start.dayNumber;
-            var startSecondTT = timeInterval.start.secondsOfDay + ttMinusTai;
-            var stopDayTT = timeInterval.stop.dayNumber;
-            var stopSecondTT = timeInterval.stop.secondsOfDay + ttMinusTai;
-
-            var xysPromise = Transforms.iau2006XysData.preload(startDayTT, startSecondTT, stopDayTT, stopSecondTT);
-            var eopPromise = Transforms.earthOrientationParameters.getPromiseToLoad();
-
-            return when.when.all([xysPromise, eopPromise]);
-        };
-
-        /**
-         * Computes a rotation matrix to transform a point or vector from the International Celestial
-         * Reference Frame (GCRF/ICRF) inertial frame axes to the Earth-Fixed frame axes (ITRF)
-         * at a given time.  This function may return undefined if the data necessary to
-         * do the transformation is not yet loaded.
-         *
-         * @param {JulianDate} date The time at which to compute the rotation matrix.
-         * @param {Matrix3} [result] The object onto which to store the result.  If this parameter is
-         *                  not specified, a new instance is created and returned.
-         * @returns {Matrix3} The rotation matrix, or undefined if the data necessary to do the
-         *                   transformation is not yet loaded.
-         *
-         *
-         * @example
-         * scene.postUpdate.addEventListener(function(scene, time) {
-         *   // View in ICRF.
-         *   var icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time);
-         *   if (Cesium.defined(icrfToFixed)) {
-         *     var offset = Cesium.Cartesian3.clone(camera.position);
-         *     var transform = Cesium.Matrix4.fromRotationTranslation(icrfToFixed);
-         *     camera.lookAtTransform(transform, offset);
-         *   }
-         * });
-         *
-         * @see Transforms.preloadIcrfFixed
-         */
-        Transforms.computeIcrfToFixedMatrix = function(date, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(date)) {
-                throw new Check.DeveloperError('date is required.');
-            }
-            //>>includeEnd('debug');
-            if (!when.defined(result)) {
-                result = new BoundingSphere.Matrix3();
-            }
-
-            var fixedToIcrfMtx = Transforms.computeFixedToIcrfMatrix(date, result);
-            if (!when.defined(fixedToIcrfMtx)) {
-                return undefined;
-            }
-
-            return BoundingSphere.Matrix3.transpose(fixedToIcrfMtx, result);
-        };
-
-        var xysScratch = new Iau2006XysSample(0.0, 0.0, 0.0);
-        var eopScratch = new EarthOrientationParametersSample(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
-        var rotation1Scratch = new BoundingSphere.Matrix3();
-        var rotation2Scratch = new BoundingSphere.Matrix3();
-
-        /**
-         * Computes a rotation matrix to transform a point or vector from the Earth-Fixed frame axes (ITRF)
-         * to the International Celestial Reference Frame (GCRF/ICRF) inertial frame axes
-         * at a given time.  This function may return undefined if the data necessary to
-         * do the transformation is not yet loaded.
-         *
-         * @param {JulianDate} date The time at which to compute the rotation matrix.
-         * @param {Matrix3} [result] The object onto which to store the result.  If this parameter is
-         *                  not specified, a new instance is created and returned.
-         * @returns {Matrix3} The rotation matrix, or undefined if the data necessary to do the
-         *                   transformation is not yet loaded.
-         *
-         *
-         * @example
-         * // Transform a point from the ICRF axes to the Fixed axes.
-         * var now = Cesium.JulianDate.now();
-         * var pointInFixed = Cesium.Cartesian3.fromDegrees(0.0, 0.0);
-         * var fixedToIcrf = Cesium.Transforms.computeIcrfToFixedMatrix(now);
-         * var pointInInertial = new Cesium.Cartesian3();
-         * if (Cesium.defined(fixedToIcrf)) {
-         *     pointInInertial = Cesium.Matrix3.multiplyByVector(fixedToIcrf, pointInFixed, pointInInertial);
-         * }
-         *
-         * @see Transforms.preloadIcrfFixed
-         */
-        Transforms.computeFixedToIcrfMatrix = function(date, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(date)) {
-                throw new Check.DeveloperError('date is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere.Matrix3();
-            }
-
-            // Compute pole wander
-            var eop = Transforms.earthOrientationParameters.compute(date, eopScratch);
-            if (!when.defined(eop)) {
-                return undefined;
-            }
-
-            // There is no external conversion to Terrestrial Time (TT).
-            // So use International Atomic Time (TAI) and convert using offsets.
-            // Here we are assuming that dayTT and secondTT are positive
-            var dayTT = date.dayNumber;
-            // It's possible here that secondTT could roll over 86400
-            // This does not seem to affect the precision (unit tests check for this)
-            var secondTT = date.secondsOfDay + ttMinusTai;
-
-            var xys = Transforms.iau2006XysData.computeXysRadians(dayTT, secondTT, xysScratch);
-            if (!when.defined(xys)) {
-                return undefined;
-            }
-
-            var x = xys.x + eop.xPoleOffset;
-            var y = xys.y + eop.yPoleOffset;
-
-            // Compute XYS rotation
-            var a = 1.0 / (1.0 + Math.sqrt(1.0 - x * x - y * y));
-
-            var rotation1 = rotation1Scratch;
-            rotation1[0] = 1.0 - a * x * x;
-            rotation1[3] = -a * x * y;
-            rotation1[6] = x;
-            rotation1[1] = -a * x * y;
-            rotation1[4] = 1 - a * y * y;
-            rotation1[7] = y;
-            rotation1[2] = -x;
-            rotation1[5] = -y;
-            rotation1[8] = 1 - a * (x * x + y * y);
-
-            var rotation2 = BoundingSphere.Matrix3.fromRotationZ(-xys.s, rotation2Scratch);
-            var matrixQ = BoundingSphere.Matrix3.multiply(rotation1, rotation2, rotation1Scratch);
-
-            // Similar to TT conversions above
-            // It's possible here that secondTT could roll over 86400
-            // This does not seem to affect the precision (unit tests check for this)
-            var dateUt1day = date.dayNumber;
-            var dateUt1sec = date.secondsOfDay - JulianDate.computeTaiMinusUtc(date) + eop.ut1MinusUtc;
-
-            // Compute Earth rotation angle
-            // The IERS standard for era is
-            //    era = 0.7790572732640 + 1.00273781191135448 * Tu
-            // where
-            //    Tu = JulianDateInUt1 - 2451545.0
-            // However, you get much more precision if you make the following simplification
-            //    era = a + (1 + b) * (JulianDayNumber + FractionOfDay - 2451545)
-            //    era = a + (JulianDayNumber - 2451545) + FractionOfDay + b (JulianDayNumber - 2451545 + FractionOfDay)
-            //    era = a + FractionOfDay + b (JulianDayNumber - 2451545 + FractionOfDay)
-            // since (JulianDayNumber - 2451545) represents an integer number of revolutions which will be discarded anyway.
-            var daysSinceJ2000 = dateUt1day - 2451545;
-            var fractionOfDay = dateUt1sec / TimeConstants$1.SECONDS_PER_DAY;
-            var era = 0.7790572732640 + fractionOfDay + 0.00273781191135448 * (daysSinceJ2000 + fractionOfDay);
-            era = (era % 1.0) * _Math.CesiumMath.TWO_PI;
-
-            var earthRotation = BoundingSphere.Matrix3.fromRotationZ(era, rotation2Scratch);
-
-            // pseudoFixed to ICRF
-            var pfToIcrf = BoundingSphere.Matrix3.multiply(matrixQ, earthRotation, rotation1Scratch);
-
-            // Compute pole wander matrix
-            var cosxp = Math.cos(eop.xPoleWander);
-            var cosyp = Math.cos(eop.yPoleWander);
-            var sinxp = Math.sin(eop.xPoleWander);
-            var sinyp = Math.sin(eop.yPoleWander);
-
-            var ttt = (dayTT - j2000ttDays) + secondTT / TimeConstants$1.SECONDS_PER_DAY;
-            ttt /= 36525.0;
-
-            // approximate sp value in rad
-            var sp = -47.0e-6 * ttt * _Math.CesiumMath.RADIANS_PER_DEGREE / 3600.0;
-            var cossp = Math.cos(sp);
-            var sinsp = Math.sin(sp);
-
-            var fToPfMtx = rotation2Scratch;
-            fToPfMtx[0] = cosxp * cossp;
-            fToPfMtx[1] = cosxp * sinsp;
-            fToPfMtx[2] = sinxp;
-            fToPfMtx[3] = -cosyp * sinsp + sinyp * sinxp * cossp;
-            fToPfMtx[4] = cosyp * cossp + sinyp * sinxp * sinsp;
-            fToPfMtx[5] = -sinyp * cosxp;
-            fToPfMtx[6] = -sinyp * sinsp - cosyp * sinxp * cossp;
-            fToPfMtx[7] = sinyp * cossp - cosyp * sinxp * sinsp;
-            fToPfMtx[8] = cosyp * cosxp;
-
-            return BoundingSphere.Matrix3.multiply(pfToIcrf, fToPfMtx, result);
-        };
-
-        var pointToWindowCoordinatesTemp = new Cartesian4.Cartesian4();
-
-        /**
-         * Transform a point from model coordinates to window coordinates.
-         *
-         * @param {Matrix4} modelViewProjectionMatrix The 4x4 model-view-projection matrix.
-         * @param {Matrix4} viewportTransformation The 4x4 viewport transformation.
-         * @param {Cartesian3} point The point to transform.
-         * @param {Cartesian2} [result] The object onto which to store the result.
-         * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if none was provided.
-         */
-        Transforms.pointToWindowCoordinates = function (modelViewProjectionMatrix, viewportTransformation, point, result) {
-            result = Transforms.pointToGLWindowCoordinates(modelViewProjectionMatrix, viewportTransformation, point, result);
-            result.y = 2.0 * viewportTransformation[5] - result.y;
-            return result;
-        };
-
-        /**
-         * @private
-         */
-        Transforms.pointToGLWindowCoordinates = function(modelViewProjectionMatrix, viewportTransformation, point, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(modelViewProjectionMatrix)) {
-                throw new Check.DeveloperError('modelViewProjectionMatrix is required.');
-            }
-
-            if (!when.defined(viewportTransformation)) {
-                throw new Check.DeveloperError('viewportTransformation is required.');
-            }
-
-            if (!when.defined(point)) {
-                throw new Check.DeveloperError('point is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = new Cartesian2.Cartesian2();
-            }
-
-            var tmp = pointToWindowCoordinatesTemp;
-
-            BoundingSphere.Matrix4.multiplyByVector(modelViewProjectionMatrix, Cartesian4.Cartesian4.fromElements(point.x, point.y, point.z, 1, tmp), tmp);
-            Cartesian4.Cartesian4.multiplyByScalar(tmp, 1.0 / tmp.w, tmp);
-            BoundingSphere.Matrix4.multiplyByVector(viewportTransformation, tmp, tmp);
-            return Cartesian2.Cartesian2.fromCartesian4(tmp, result);
-        };
-
-        var normalScratch = new Cartographic.Cartesian3();
-        var rightScratch = new Cartographic.Cartesian3();
-        var upScratch = new Cartographic.Cartesian3();
-
-        /**
-         * @private
-         */
-        Transforms.rotationMatrixFromPositionVelocity = function(position, velocity, ellipsoid, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(position)) {
-                throw new Check.DeveloperError('position is required.');
-            }
-
-            if (!when.defined(velocity)) {
-                throw new Check.DeveloperError('velocity is required.');
-            }
-            //>>includeEnd('debug');
-
-            var normal = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84).geodeticSurfaceNormal(position, normalScratch);
-            var right = Cartographic.Cartesian3.cross(velocity, normal, rightScratch);
-
-            if (Cartographic.Cartesian3.equalsEpsilon(right, Cartographic.Cartesian3.ZERO, _Math.CesiumMath.EPSILON6)) {
-                right = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_X, right);
-            }
-
-            var up = Cartographic.Cartesian3.cross(right, velocity, upScratch);
-            Cartographic.Cartesian3.normalize(up, up);
-            Cartographic.Cartesian3.cross(velocity, up, right);
-            Cartographic.Cartesian3.negate(right, right);
-            Cartographic.Cartesian3.normalize(right, right);
-
-            if (!when.defined(result)) {
-                result = new BoundingSphere.Matrix3();
-            }
-
-            result[0] = velocity.x;
-            result[1] = velocity.y;
-            result[2] = velocity.z;
-            result[3] = right.x;
-            result[4] = right.y;
-            result[5] = right.z;
-            result[6] = up.x;
-            result[7] = up.y;
-            result[8] = up.z;
-
-            return result;
-        };
-
-        var swizzleMatrix = new BoundingSphere.Matrix4(
-            0.0, 0.0, 1.0, 0.0,
-            1.0, 0.0, 0.0, 0.0,
-            0.0, 1.0, 0.0, 0.0,
-            0.0, 0.0, 0.0, 1.0
-        );
-
-        var scratchCartographic = new Cartographic.Cartographic();
-        var scratchCartesian3Projection = new Cartographic.Cartesian3();
-        var scratchCenter = new Cartographic.Cartesian3();
-        var scratchRotation = new BoundingSphere.Matrix3();
-        var scratchFromENU = new BoundingSphere.Matrix4();
-        var scratchToENU = new BoundingSphere.Matrix4();
-
-        /**
-         * @private
-         */
-        Transforms.basisTo2D = function(projection, matrix, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(projection)) {
-                throw new Check.DeveloperError('projection is required.');
-            }
-            if (!when.defined(matrix)) {
-                throw new Check.DeveloperError('matrix is required.');
-            }
-            if (!when.defined(result)) {
-                throw new Check.DeveloperError('result is required.');
-            }
-            //>>includeEnd('debug');
-
-            var rtcCenter = BoundingSphere.Matrix4.getTranslation(matrix, scratchCenter);
-            var ellipsoid = projection.ellipsoid;
-
-            // Get the 2D Center
-            var cartographic = ellipsoid.cartesianToCartographic(rtcCenter, scratchCartographic);
-            var projectedPosition = projection.project(cartographic, scratchCartesian3Projection);
-            Cartographic.Cartesian3.fromElements(projectedPosition.z, projectedPosition.x, projectedPosition.y, projectedPosition);
-
-            // Assuming the instance are positioned in WGS84, invert the WGS84 transform to get the local transform and then convert to 2D
-            var fromENU = Transforms.eastNorthUpToFixedFrame(rtcCenter, ellipsoid, scratchFromENU);
-            var toENU = BoundingSphere.Matrix4.inverseTransformation(fromENU, scratchToENU);
-            var rotation = BoundingSphere.Matrix4.getMatrix3(matrix, scratchRotation);
-            var local = BoundingSphere.Matrix4.multiplyByMatrix3(toENU, rotation, result);
-            BoundingSphere.Matrix4.multiply(swizzleMatrix, local, result); // Swap x, y, z for 2D
-            BoundingSphere.Matrix4.setTranslation(result, projectedPosition, result); // Use the projected center
-
-            return result;
-        };
-
-        /**
-         * @private
-         */
-        Transforms.wgs84To2DModelMatrix = function(projection, center, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(projection)) {
-                throw new Check.DeveloperError('projection is required.');
-            }
-            if (!when.defined(center)) {
-                throw new Check.DeveloperError('center is required.');
-            }
-            if (!when.defined(result)) {
-                throw new Check.DeveloperError('result is required.');
-            }
-            //>>includeEnd('debug');
-
-            var ellipsoid = projection.ellipsoid;
-
-            var fromENU = Transforms.eastNorthUpToFixedFrame(center, ellipsoid, scratchFromENU);
-            var toENU = BoundingSphere.Matrix4.inverseTransformation(fromENU, scratchToENU);
-
-            var cartographic = ellipsoid.cartesianToCartographic(center, scratchCartographic);
-            var projectedPosition = projection.project(cartographic, scratchCartesian3Projection);
-            Cartographic.Cartesian3.fromElements(projectedPosition.z, projectedPosition.x, projectedPosition.y, projectedPosition);
-
-            var translation = BoundingSphere.Matrix4.fromTranslation(projectedPosition, scratchFromENU);
-            BoundingSphere.Matrix4.multiply(swizzleMatrix, toENU, result);
-            BoundingSphere.Matrix4.multiply(translation, result, result);
-
-            return result;
-        };
-        Transforms.buildUp = function(viewPos, cartesianDir) {
-            var dir = cartesianDir.clone();
-            var up = viewPos.clone();
-            up = Cartographic.Cartesian3.normalize(up, up);
-
-            if(Math.abs(Cartographic.Cartesian3.dot(up, dir)) >= 1.0){
-                if(Math.abs(Cartographic.Cartesian3.dot(dir, Cartographic.Cartesian3.UNIT_Y)) < 1.0){
-                    up = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_Y, up);
-                }
-                else{
-                    up = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.UNIT_Z, up);
-                }
-            }
-
-            var vLeft = new Cartographic.Cartesian3();
-            Cartographic.Cartesian3.cross(up, dir, vLeft);
-            vLeft = Cartographic.Cartesian3.normalize(vLeft, vLeft);
-            Cartographic.Cartesian3.cross(dir, vLeft, up);
-            up = Cartographic.Cartesian3.normalize(up, up);
-            return up;
-        };
-
-        Transforms.getHeading = function(direction, up) {
-            var heading;
-            if (!_Math.CesiumMath.equalsEpsilon(Math.abs(direction.z), 1.0, _Math.CesiumMath.EPSILON3)) {
-                heading = Math.atan2(direction.y, direction.x) - _Math.CesiumMath.PI_OVER_TWO;
-            } else {
-                heading = Math.atan2(up.y, up.x) - _Math.CesiumMath.PI_OVER_TWO;
-            }
-
-            return _Math.CesiumMath.TWO_PI - _Math.CesiumMath.zeroToTwoPi(heading);
-        };
-
-        Transforms.convertToColumbusCartesian = function(cartesian) {
-            var projection = new BoundingSphere.GeographicProjection();
-            var ellipsoid = projection.ellipsoid;
-            var scratchCartesian = new Cartographic.Cartesian3();
-            var scratchCartographic = new Cartographic.Cartographic();
-            ellipsoid.cartesianToCartographic(cartesian, scratchCartographic);
-            projection.project(scratchCartographic, scratchCartesian);
-            return Cartographic.Cartesian3.fromElements(scratchCartesian.z, scratchCartesian.x, scratchCartesian.y);
-        };
-
-    exports.Quaternion = Quaternion;
-    exports.Transforms = Transforms;
-
-});
diff --git a/public/libs/Cesium/Workers/UnZipData.js b/public/libs/Cesium/Workers/UnZipData.js
deleted file mode 100644
index df3928f..0000000
--- a/public/libs/Cesium/Workers/UnZipData.js
+++ /dev/null
@@ -1,237 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './createTaskProcessorWorker', './pako_inflate-8ea163f9', './PixelFormat-e6d821ed'], function (when, RuntimeError, WebGLConstants, createTaskProcessorWorker, pako_inflate, PixelFormat) { 'use strict';
-
-    var CRN_FORMAT = {
-        cCRNFmtInvalid: -1,
-
-        cCRNFmtDXT1: 0,
-        // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS.
-        cCRNFmtDXT3: 1,
-        cCRNFmtDXT5: 2
-
-        // Crunch supports more formats than this, but we can't use them here.
-    };
-
-    // Mapping of Crunch formats to DXT formats.
-    var DXT_FORMAT_MAP = {};
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.PixelFormat.RGB_DXT1;
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.PixelFormat.RGBA_DXT3;
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.PixelFormat.RGBA_DXT5;
-
-    var dst;
-    var dxtData;
-    var cachedDstSize = 0;
-
-    var crunch;
-
-    // Copy an array of bytes into or out of the emscripten heap.
-    function arrayBufferCopy(src, dst, dstByteOffset, numBytes) {
-        var i;
-        var dst32Offset = dstByteOffset / 4;
-        var tail = (numBytes % 4);
-        var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4);
-        var dst32 = new Uint32Array(dst.buffer);
-        for (i = 0; i < src32.length; i++) {
-            dst32[dst32Offset + i] = src32[i];
-        }
-        for (i = numBytes - tail; i < numBytes; i++) {
-            dst[dstByteOffset + i] = src[i];
-        }
-    }
-
-    /**
-     * @private
-     */
-    function convertCRNToDXT(parameters) {
-        // Copy the contents of the arrayBuffer into emscriptens heap.
-        var arrayBuffer = parameters.data;
-        var srcSize = arrayBuffer.byteLength;
-        var bytes = new Uint8Array(arrayBuffer, parameters.offset);
-        var src = crunch._malloc(srcSize);
-        arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize);
-
-        // Determine what type of compressed data the file contains.
-        var crnFormat = crunch._crn_get_dxt_format(src, srcSize);
-        var format = DXT_FORMAT_MAP[crnFormat];
-        if (!when.defined(format)) {
-            throw new RuntimeError.RuntimeError('Unsupported compressed format.');
-        }
-
-        // Gather basic metrics about the DXT data.
-        var levels = crunch._crn_get_levels(src, srcSize);
-        var width = crunch._crn_get_width(src, srcSize);
-        var height = crunch._crn_get_height(src, srcSize);
-
-        // Determine the size of the decoded DXT data.
-        var dstSize = 0;
-        var i;
-        for (i = 0; i < levels; ++i) {
-            dstSize += PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width >> i, height >> i);
-        }
-
-        // Allocate enough space on the emscripten heap to hold the decoded DXT data
-        // or reuse the existing allocation if a previous call to this function has
-        // already acquired a large enough buffer.
-        if(cachedDstSize < dstSize) {
-            if(when.defined(dst)) {
-                crunch._free(dst);
-            }
-            dst = crunch._malloc(dstSize);
-            dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize);
-            cachedDstSize = dstSize;
-        }
-
-        // Decompress the DXT data from the Crunch file into the allocated space.
-        crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels);
-
-        // Release the crunch file data from the emscripten heap.
-        crunch._free(src);
-
-        var bOutMipMapData = when.defaultValue(parameters.bMipMap, false);
-        if(bOutMipMapData){
-            var dXTDataMipMap = dxtData.slice(0, dstSize);
-            return new PixelFormat.CompressedTextureBuffer(format, width, height, dXTDataMipMap);
-        }
-        else {
-            // Mipmaps are unsupported, so copy the level 0 texture
-            // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap.
-            var length = PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width, height);
-
-            // Get a copy of the 0th mip level. dxtData will exceed length when there are more mip levels.
-            // Equivalent to dxtData.slice(0, length), which is not supported in IE11
-            var level0DXTDataView = dxtData.subarray(0, length);
-            var level0DXTData = new Uint8Array(length);
-            level0DXTData.set(level0DXTDataView, 0);
-            return new PixelFormat.CompressedTextureBuffer(format, width, height, level0DXTData);
-        }
-    }
-
-    function unzipToCrn(arrayBuffer){
-        var view = new DataView(arrayBuffer);
-        var offset = 0;
-        var compressType = view.getUint32(offset, true);
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        var width = view.getUint32(offset, true);
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        var height = view.getUint32(offset, true);
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        var format = view.getUint32(offset, true);
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        var size = view.getUint32(offset, true);
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        var data = arrayBuffer.slice(offset, offset + size);
-        var dxtBuffer = convertCRNToDXT({
-            data : data
-        }).bufferView;
-
-        var unzipBuffer = new ArrayBuffer(offset + dxtBuffer.byteLength);
-        var bufferView = new Uint8Array(unzipBuffer);
-        var uint32BufferView = new Uint32Array(unzipBuffer);
-        offset = 0;
-        uint32BufferView[0] = compressType;
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        uint32BufferView[1] = width;
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        uint32BufferView[2] = height;
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        uint32BufferView[3] = format;
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        uint32BufferView[4] = dxtBuffer.byteLength;
-        offset += Uint32Array.BYTES_PER_ELEMENT;
-        bufferView.set(dxtBuffer, offset);
-
-        return unzipBuffer;
-    }
-
-
-    function unzip(parameters, transferableObjects) {
-        var buffers = parameters.data;
-        var unzipBuffers = [];
-        for(var i = 0;i < buffers.length;i++){
-            var bufferObj = buffers[i];
-            var unzipBuffer;
-            try{
-                var dataZip = new Uint8Array(bufferObj.zipBuffer);
-                unzipBuffer = pako_inflate.pako.inflate(dataZip).buffer;
-                if(parameters.isCRN){
-                    unzipBuffer = unzipToCrn(unzipBuffer);
-                }
-
-                transferableObjects.push(unzipBuffer);
-
-                unzipBuffers.push({
-                    unzipBuffer : unzipBuffer,
-                    name : bufferObj.name
-                });
-            }
-            catch (e){
-                if(bufferObj.unzipLength === bufferObj.zippedLength){
-                    unzipBuffer = bufferObj.zipBuffer.buffer;
-                    if(parameters.isCRN){
-                        unzipBuffer = unzipToCrn(unzipBuffer);
-                    }
-
-                    transferableObjects.push(unzipBuffer);
-
-                    unzipBuffers.push({
-                        unzipBuffer : unzipBuffer,
-                        name : bufferObj.name
-                    });
-                }
-                continue ;
-            }
-        }
-
-        return {
-            data : unzipBuffers
-        };
-    }
-
-    function initWorker() {
-        self.onmessage = createTaskProcessorWorker(unzip);
-        self.postMessage(true);
-    }
-
-    function UnZipData(event) {
-        var data = event.data;
-        var wasmConfig = data.webAssemblyConfig;
-        if (when.defined(wasmConfig)) {
-            return require([wasmConfig.modulePath], function (crnModule) {
-                if (when.defined(wasmConfig.wasmBinaryFile)) {
-                    if (!when.defined(crnModule)) {
-                        crnModule = self.Module;
-                    }
-                    crunch = crnModule;
-                    initWorker();
-                } else {
-                    crunch = crnModule;
-                    initWorker();
-                }
-            });
-        }
-    }
-
-    return UnZipData;
-
-});
diff --git a/public/libs/Cesium/Workers/UnZipTerrainData.js b/public/libs/Cesium/Workers/UnZipTerrainData.js
deleted file mode 100644
index f863a65..0000000
--- a/public/libs/Cesium/Workers/UnZipTerrainData.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './createTaskProcessorWorker', './pako_inflate-8ea163f9', './unzip-b0fc9445'], function (when, createTaskProcessorWorker, pako_inflate, unzip) { 'use strict';
-
-    var unzipwasmReady = false;
-    unzip.unzip.onRuntimeInitialized = function() {
-        unzipwasmReady = true;
-    };
-
-    var unzipwasm = unzip.unzip.cwrap('unzip', 'number', ['number', 'number', 'number', 'number']);
-    var freec = unzip.unzip.cwrap('freePointer', null, ['number']);
-    function unzipWithwasm(datazip) {
-        var unzipsize = datazip.length * 4;
-        var offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize); //开辟内存
-        var tar = new Uint8Array(unzipsize);
-        unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
-        var offset1 = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * datazip.length);
-        unzip.unzip.HEAPU8.set(datazip, offset1 / Uint8Array.BYTES_PER_ELEMENT);
-
-        var resultLen;
-        while ((resultLen = unzipwasm(offset, unzipsize, offset1, datazip.length)) == 0) {
-            freec(offset); //释放内存
-            unzipsize *= 4;
-            offset = unzip.unzip._malloc(Uint8Array.BYTES_PER_ELEMENT * unzipsize);
-            tar = new Uint8Array(unzipsize);
-            unzip.unzip.HEAPU8.set(tar, offset / Uint8Array.BYTES_PER_ELEMENT);
-        }
-        var res = new Uint8Array(unzip.unzip.HEAPU8.buffer, offset, resultLen);
-        datazip = null;
-        tar = null;
-        var buffer = new Uint8Array(res);
-        freec(offset);
-        freec(offset1);
-        return buffer;
-    }
-
-    function UnZipTerrainData(parameters, transferableObjects) {
-        var buffer = parameters.data;
-        var dataZip = new Uint8Array(buffer);
-
-        var unzipBuffer;
-        if (unzipwasmReady === true) {
-            unzipBuffer = unzipWithwasm(dataZip);
-            return {
-                data : unzipBuffer
-            };
-        } else {
-            unzipBuffer = pako_inflate.pako.inflate(dataZip).buffer;
-        }
-        
-        transferableObjects.push(unzipBuffer);
-
-        return {
-            data : new Uint8Array(unzipBuffer)
-        };
-    }
-
-    var UnZipTerrainData$1 = createTaskProcessorWorker(UnZipTerrainData);
-
-    return UnZipTerrainData$1;
-
-});
diff --git a/public/libs/Cesium/Workers/VertexFormat-fe4db402.js b/public/libs/Cesium/Workers/VertexFormat-fe4db402.js
deleted file mode 100644
index ad71186..0000000
--- a/public/libs/Cesium/Workers/VertexFormat-fe4db402.js
+++ /dev/null
@@ -1,322 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281'], function (exports, when, Check) { 'use strict';
-
-    /**
-         * A vertex format defines what attributes make up a vertex.  A VertexFormat can be provided
-         * to a {@link Geometry} to request that certain properties be computed, e.g., just position,
-         * position and normal, etc.
-         *
-         * @param {Object} [options] An object with boolean properties corresponding to VertexFormat properties as shown in the code example.
-         *
-         * @alias VertexFormat
-         * @constructor
-         *
-         * @example
-         * // Create a vertex format with position and 2D texture coordinate attributes.
-         * var format = new Cesium.VertexFormat({
-         *   position : true,
-         *   st : true
-         * });
-         *
-         * @see Geometry#attributes
-         * @see Packable
-         */
-        function VertexFormat(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            /**
-             * When <code>true</code>, the vertex has a 3D position attribute.
-             * <p>
-             * 64-bit floating-point (for precision).  3 components per attribute.
-             * </p>
-             *
-             * @type Boolean
-             *
-             * @default false
-             */
-            this.position = when.defaultValue(options.position, false);
-
-            /**
-             * When <code>true</code>, the vertex has a normal attribute (normalized), which is commonly used for lighting.
-             * <p>
-             * 32-bit floating-point.  3 components per attribute.
-             * </p>
-             *
-             * @type Boolean
-             *
-             * @default false
-             */
-            this.normal = when.defaultValue(options.normal, false);
-
-            /**
-             * When <code>true</code>, the vertex has a 2D texture coordinate attribute.
-             * <p>
-             * 32-bit floating-point.  2 components per attribute
-             * </p>
-             *
-             * @type Boolean
-             *
-             * @default false
-             */
-            this.st = when.defaultValue(options.st, false);
-
-            /**
-             * When <code>true</code>, the vertex has a bitangent attribute (normalized), which is used for tangent-space effects like bump mapping.
-             * <p>
-             * 32-bit floating-point.  3 components per attribute.
-             * </p>
-             *
-             * @type Boolean
-             *
-             * @default false
-             */
-            this.bitangent = when.defaultValue(options.bitangent, false);
-
-            /**
-             * When <code>true</code>, the vertex has a tangent attribute (normalized), which is used for tangent-space effects like bump mapping.
-             * <p>
-             * 32-bit floating-point.  3 components per attribute.
-             * </p>
-             *
-             * @type Boolean
-             *
-             * @default false
-             */
-            this.tangent = when.defaultValue(options.tangent, false);
-
-            /**
-             * When <code>true</code>, the vertex has an RGB color attribute.
-             * <p>
-             * 8-bit unsigned byte.  3 components per attribute.
-             * </p>
-             *
-             * @type Boolean
-             *
-             * @default false
-             */
-            this.color = when.defaultValue(options.color, false);
-        }
-
-        /**
-         * An immutable vertex format with only a position attribute.
-         *
-         * @type {VertexFormat}
-         * @constant
-         *
-         * @see VertexFormat#position
-         */
-        VertexFormat.POSITION_ONLY = Object.freeze(new VertexFormat({
-            position : true
-        }));
-
-        /**
-         * An immutable vertex format with position and normal attributes.
-         * This is compatible with per-instance color appearances like {@link PerInstanceColorAppearance}.
-         *
-         * @type {VertexFormat}
-         * @constant
-         *
-         * @see VertexFormat#position
-         * @see VertexFormat#normal
-         */
-        VertexFormat.POSITION_AND_NORMAL = Object.freeze(new VertexFormat({
-            position : true,
-            normal : true
-        }));
-
-        /**
-         * An immutable vertex format with position, normal, and st attributes.
-         * This is compatible with {@link MaterialAppearance} when {@link MaterialAppearance#materialSupport}
-         * is <code>TEXTURED/code>.
-         *
-         * @type {VertexFormat}
-         * @constant
-         *
-         * @see VertexFormat#position
-         * @see VertexFormat#normal
-         * @see VertexFormat#st
-         */
-        VertexFormat.POSITION_NORMAL_AND_ST = Object.freeze(new VertexFormat({
-            position : true,
-            normal : true,
-            st : true
-        }));
-
-        /**
-         * An immutable vertex format with position and st attributes.
-         * This is compatible with {@link EllipsoidSurfaceAppearance}.
-         *
-         * @type {VertexFormat}
-         * @constant
-         *
-         * @see VertexFormat#position
-         * @see VertexFormat#st
-         */
-        VertexFormat.POSITION_AND_ST = Object.freeze(new VertexFormat({
-            position : true,
-            st : true
-        }));
-
-        /**
-         * An immutable vertex format with position and color attributes.
-         *
-         * @type {VertexFormat}
-         * @constant
-         *
-         * @see VertexFormat#position
-         * @see VertexFormat#color
-         */
-        VertexFormat.POSITION_AND_COLOR = Object.freeze(new VertexFormat({
-            position : true,
-            color : true
-        }));
-
-        /**
-         * An immutable vertex format with well-known attributes: position, normal, st, tangent, and bitangent.
-         *
-         * @type {VertexFormat}
-         * @constant
-         *
-         * @see VertexFormat#position
-         * @see VertexFormat#normal
-         * @see VertexFormat#st
-         * @see VertexFormat#tangent
-         * @see VertexFormat#bitangent
-         */
-        VertexFormat.ALL = Object.freeze(new VertexFormat({
-            position : true,
-            normal : true,
-            st : true,
-            tangent  : true,
-            bitangent : true
-        }));
-
-        /**
-         * An immutable vertex format with position, normal, and st attributes.
-         * This is compatible with most appearances and materials; however
-         * normal and st attributes are not always required.  When this is
-         * known in advance, another <code>VertexFormat</code> should be used.
-         *
-         * @type {VertexFormat}
-         * @constant
-         *
-         * @see VertexFormat#position
-         * @see VertexFormat#normal
-         */
-        VertexFormat.DEFAULT = VertexFormat.POSITION_NORMAL_AND_ST;
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        VertexFormat.packedLength = 6;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {VertexFormat} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        VertexFormat.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value.position ? 1.0 : 0.0;
-            array[startingIndex++] = value.normal ? 1.0 : 0.0;
-            array[startingIndex++] = value.st ? 1.0 : 0.0;
-            array[startingIndex++] = value.tangent ? 1.0 : 0.0;
-            array[startingIndex++] = value.bitangent ? 1.0 : 0.0;
-            array[startingIndex] = value.color ? 1.0 : 0.0;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {VertexFormat} [result] The object into which to store the result.
-         * @returns {VertexFormat} The modified result parameter or a new VertexFormat instance if one was not provided.
-         */
-        VertexFormat.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            if (!when.defined(result)) {
-                result = new VertexFormat();
-            }
-
-            result.position  = array[startingIndex++] === 1.0;
-            result.normal    = array[startingIndex++] === 1.0;
-            result.st        = array[startingIndex++] === 1.0;
-            result.tangent   = array[startingIndex++] === 1.0;
-            result.bitangent = array[startingIndex++] === 1.0;
-            result.color     = array[startingIndex] === 1.0;
-            return result;
-        };
-
-        /**
-         * Duplicates a VertexFormat instance.
-         *
-         * @param {VertexFormat} vertexFormat The vertex format to duplicate.
-         * @param {VertexFormat} [result] The object onto which to store the result.
-         * @returns {VertexFormat} The modified result parameter or a new VertexFormat instance if one was not provided. (Returns undefined if vertexFormat is undefined)
-         */
-        VertexFormat.clone = function(vertexFormat, result) {
-            if (!when.defined(vertexFormat)) {
-                return undefined;
-            }
-            if (!when.defined(result)) {
-                result = new VertexFormat();
-            }
-
-            result.position = vertexFormat.position;
-            result.normal = vertexFormat.normal;
-            result.st = vertexFormat.st;
-            result.tangent = vertexFormat.tangent;
-            result.bitangent = vertexFormat.bitangent;
-            result.color = vertexFormat.color;
-            return result;
-        };
-
-    exports.VertexFormat = VertexFormat;
-
-});
diff --git a/public/libs/Cesium/Workers/WallGeometryLibrary-e09058ca.js b/public/libs/Cesium/Workers/WallGeometryLibrary-e09058ca.js
deleted file mode 100644
index 8b04284..0000000
--- a/public/libs/Cesium/Workers/WallGeometryLibrary-e09058ca.js
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Math-61ede240', './Cartographic-fe4be337', './BoundingSphere-775c5788', './Transforms-a1cf7267', './EllipsoidTangentPlane-e324bfa4', './PolygonPipeline-fd46002b', './PolylinePipeline-a9f32196'], function (exports, when, _Math, Cartographic, BoundingSphere, Transforms, EllipsoidTangentPlane, PolygonPipeline, PolylinePipeline) { 'use strict';
-
-    /**
-         * private
-         */
-        var WallGeometryLibrary = {};
-
-        function latLonEquals(c0, c1) {
-            return ((_Math.CesiumMath.equalsEpsilon(c0.latitude, c1.latitude, _Math.CesiumMath.EPSILON14)) && (_Math.CesiumMath.equalsEpsilon(c0.longitude, c1.longitude, _Math.CesiumMath.EPSILON14)));
-        }
-
-        var scratchCartographic1 = new Cartographic.Cartographic();
-        var scratchCartographic2 = new Cartographic.Cartographic();
-        function removeDuplicates(ellipsoid, positions, topHeights, bottomHeights) {
-            var length = positions.length;
-            if (length < 2) {
-                return;
-            }
-
-            var hasBottomHeights = when.defined(bottomHeights);
-            var hasTopHeights = when.defined(topHeights);
-            var hasAllZeroHeights = true;
-
-            var cleanedPositions = new Array(length);
-            var cleanedTopHeights = new Array(length);
-            var cleanedBottomHeights = new Array(length);
-
-            var v0 = positions[0];
-            cleanedPositions[0] = v0;
-
-            var c0 = ellipsoid.cartesianToCartographic(v0, scratchCartographic1);
-            if (hasTopHeights) {
-                c0.height = topHeights[0];
-            }
-
-            hasAllZeroHeights = hasAllZeroHeights && c0.height <= 0;
-
-            cleanedTopHeights[0] = c0.height;
-
-            if (hasBottomHeights) {
-                cleanedBottomHeights[0] = bottomHeights[0];
-            } else {
-                cleanedBottomHeights[0] = 0.0;
-            }
-
-            var index = 1;
-            for (var i = 1; i < length; ++i) {
-                var v1 = positions[i];
-                var c1 = ellipsoid.cartesianToCartographic(v1, scratchCartographic2);
-                if (hasTopHeights) {
-                    c1.height = topHeights[i];
-                }
-                hasAllZeroHeights = hasAllZeroHeights && c1.height <= 0;
-
-                if (!latLonEquals(c0, c1)) {
-                    cleanedPositions[index] = v1; // Shallow copy!
-                    cleanedTopHeights[index] = c1.height;
-
-                    if (hasBottomHeights) {
-                        cleanedBottomHeights[index] = bottomHeights[i];
-                    } else {
-                        cleanedBottomHeights[index] = 0.0;
-                    }
-
-                    Cartographic.Cartographic.clone(c1, c0);
-                    ++index;
-                } else if (c0.height < c1.height) {
-                    cleanedTopHeights[index - 1] = c1.height;
-                }
-            }
-
-            if (hasAllZeroHeights || index < 2) {
-                return;
-            }
-
-            cleanedPositions.length = index;
-            cleanedTopHeights.length = index;
-            cleanedBottomHeights.length = index;
-
-            return {
-                positions: cleanedPositions,
-                topHeights: cleanedTopHeights,
-                bottomHeights: cleanedBottomHeights
-            };
-        }
-
-        var positionsArrayScratch = new Array(2);
-        var heightsArrayScratch = new Array(2);
-        var generateArcOptionsScratch = {
-            positions : undefined,
-            height : undefined,
-            granularity : undefined,
-            ellipsoid : undefined
-        };
-
-        /**
-         * @private
-         */
-        WallGeometryLibrary.computePositions = function(ellipsoid, wallPositions, maximumHeights, minimumHeights, granularity, duplicateCorners, enuCenter) {
-            var o = removeDuplicates(ellipsoid, wallPositions, maximumHeights, minimumHeights);
-
-            if (!when.defined(o)) {
-                return;
-            }
-
-            var enu = Transforms.Transforms.eastNorthUpToFixedFrame(o.positions[0], ellipsoid, new BoundingSphere.Matrix4());
-            var enuInverse = BoundingSphere.Matrix4.inverse(enu, new BoundingSphere.Matrix4());
-
-            wallPositions = o.positions;
-            maximumHeights = o.topHeights;
-            minimumHeights = o.bottomHeights;
-
-            if (wallPositions.length >= 3) {
-                // Order positions counter-clockwise
-                var tangentPlane = EllipsoidTangentPlane.EllipsoidTangentPlane.fromPoints(wallPositions, ellipsoid);
-                var positions2D = tangentPlane.projectPointsOntoPlane(wallPositions);
-
-                if (PolygonPipeline.PolygonPipeline.computeWindingOrder2D(positions2D) === PolygonPipeline.WindingOrder.CLOCKWISE) {
-                    wallPositions.reverse();
-                    maximumHeights.reverse();
-                    minimumHeights.reverse();
-                }
-            }
-
-            var length = wallPositions.length;
-            var numCorners = length - 2;
-            var topPositions;
-            var bottomPositions;
-            var localTopPositions;
-            var localBottomPositions;
-
-            var minDistance = _Math.CesiumMath.chordLength(granularity, ellipsoid.maximumRadius);
-
-            var generateArcOptions = generateArcOptionsScratch;
-            generateArcOptions.minDistance = minDistance;
-            generateArcOptions.ellipsoid = ellipsoid;
-
-            if (duplicateCorners) {
-                var count = 0;
-                var i;
-
-                for (i = 0; i < length - 1; i++) {
-                    count += PolylinePipeline.PolylinePipeline.numberOfPoints(wallPositions[i], wallPositions[i+1], minDistance) + 1;
-                }
-
-                topPositions = new Float64Array(count * 3);
-                bottomPositions = new Float64Array(count * 3);
-
-                if(when.defined(enuCenter)) {
-                    localTopPositions = new Float64Array(count * 3);
-                    localBottomPositions = new Float64Array(count * 3);
-                }
-
-                var generateArcPositions = positionsArrayScratch;
-                var generateArcHeights = heightsArrayScratch;
-                generateArcOptions.positions = generateArcPositions;
-                generateArcOptions.height = generateArcHeights;
-
-                var offset = 0;
-                for (i = 0; i < length - 1; i++) {
-                    generateArcPositions[0] = wallPositions[i];
-                    generateArcPositions[1] = wallPositions[i + 1];
-
-                    generateArcHeights[0] = maximumHeights[i];
-                    generateArcHeights[1] = maximumHeights[i + 1];
-
-                    var pos = PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions);
-                    topPositions.set(pos, offset);
-                    if(when.defined(enuCenter)) {
-                        localTopPositions.set(transformToENU(pos, enuInverse), offset);
-                    }
-
-                    generateArcHeights[0] = minimumHeights[i];
-                    generateArcHeights[1] = minimumHeights[i + 1];
-
-                    bottomPositions.set(PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions), offset);
-                    if(when.defined(enuCenter)) {
-                        localBottomPositions.set(transformToENU(PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions), enuInverse), offset);
-                    }
-
-                    offset += pos.length;
-                }
-            } else {
-                generateArcOptions.positions = wallPositions;
-                generateArcOptions.height = maximumHeights;
-                topPositions = new Float64Array(PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions));
-                if(when.defined(enuCenter)) {
-                    localTopPositions = new Float64Array(transformToENU(PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions)));
-                }
-
-                generateArcOptions.height = minimumHeights;
-                bottomPositions = new Float64Array(PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions));
-                if(when.defined(enuCenter)) {
-                    localBottomPositions = new Float64Array(transformToENU(PolylinePipeline.PolylinePipeline.generateArc(generateArcOptions)));
-                }
-            }
-
-            var posObj = {
-                pos: {
-                    bottomPositions: bottomPositions,
-                    topPositions: topPositions,
-                    numCorners: numCorners
-                }
-            };
-            if(when.defined(enuCenter)) {
-                posObj.localPos = {
-                    bottomPositions: localBottomPositions,
-                    topPositions: localTopPositions,
-                    numCorners: numCorners
-                };
-            }
-            return posObj;
-        };
-        function transformToENU(pos, enuInverse) {
-            var localPos = new Array(pos.length);
-            for(var j = 0; j < pos.length; j += 3) {
-                var cartesian = new Cartographic.Cartesian3(pos[j], pos[j + 1], pos[j + 2]);
-                BoundingSphere.Matrix4.multiplyByPoint(enuInverse, cartesian, cartesian);
-                localPos[j] = cartesian.x;
-                localPos[j + 1] = cartesian.y;
-                localPos[j + 2] = cartesian.z;
-            }
-            return localPos;
-        }
-
-    exports.WallGeometryLibrary = WallGeometryLibrary;
-
-});
diff --git a/public/libs/Cesium/Workers/WebGLConstants-4c11ee5f.js b/public/libs/Cesium/Workers/WebGLConstants-4c11ee5f.js
deleted file mode 100644
index fc61023..0000000
--- a/public/libs/Cesium/Workers/WebGLConstants-4c11ee5f.js
+++ /dev/null
@@ -1,636 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports'], function (exports) { 'use strict';
-
-    /**
-         * Enum containing WebGL Constant values by name.
-         * for use without an active WebGL context, or in cases where certain constants are unavailable using the WebGL context
-         * (For example, in [Safari 9]{@link https://github.com/CesiumGS/cesium/issues/2989}).
-         *
-         * These match the constants from the [WebGL 1.0]{@link https://www.khronos.org/registry/webgl/specs/latest/1.0/}
-         * and [WebGL 2.0]{@link https://www.khronos.org/registry/webgl/specs/latest/2.0/}
-         * specifications.
-         *
-         * @exports WebGLConstants
-         */
-        var WebGLConstants = {
-            DEPTH_BUFFER_BIT : 0x00000100,
-            STENCIL_BUFFER_BIT : 0x00000400,
-            COLOR_BUFFER_BIT : 0x00004000,
-            POINTS : 0x0000,
-            LINES : 0x0001,
-            LINE_LOOP : 0x0002,
-            LINE_STRIP : 0x0003,
-            TRIANGLES : 0x0004,
-            TRIANGLE_STRIP : 0x0005,
-            TRIANGLE_FAN : 0x0006,
-            ZERO : 0,
-            ONE : 1,
-            SRC_COLOR : 0x0300,
-            ONE_MINUS_SRC_COLOR : 0x0301,
-            SRC_ALPHA : 0x0302,
-            ONE_MINUS_SRC_ALPHA : 0x0303,
-            DST_ALPHA : 0x0304,
-            ONE_MINUS_DST_ALPHA : 0x0305,
-            DST_COLOR : 0x0306,
-            ONE_MINUS_DST_COLOR : 0x0307,
-            SRC_ALPHA_SATURATE : 0x0308,
-            FUNC_ADD : 0x8006,
-            BLEND_EQUATION : 0x8009,
-            BLEND_EQUATION_RGB : 0x8009, // same as BLEND_EQUATION
-            BLEND_EQUATION_ALPHA : 0x883D,
-            FUNC_SUBTRACT : 0x800A,
-            FUNC_REVERSE_SUBTRACT : 0x800B,
-            BLEND_DST_RGB : 0x80C8,
-            BLEND_SRC_RGB : 0x80C9,
-            BLEND_DST_ALPHA : 0x80CA,
-            BLEND_SRC_ALPHA : 0x80CB,
-            CONSTANT_COLOR : 0x8001,
-            ONE_MINUS_CONSTANT_COLOR : 0x8002,
-            CONSTANT_ALPHA : 0x8003,
-            ONE_MINUS_CONSTANT_ALPHA : 0x8004,
-            BLEND_COLOR : 0x8005,
-            ARRAY_BUFFER : 0x8892,
-            ELEMENT_ARRAY_BUFFER : 0x8893,
-            ARRAY_BUFFER_BINDING : 0x8894,
-            ELEMENT_ARRAY_BUFFER_BINDING : 0x8895,
-            STREAM_DRAW : 0x88E0,
-            STATIC_DRAW : 0x88E4,
-            DYNAMIC_DRAW : 0x88E8,
-            BUFFER_SIZE : 0x8764,
-            BUFFER_USAGE : 0x8765,
-            CURRENT_VERTEX_ATTRIB : 0x8626,
-            FRONT : 0x0404,
-            BACK : 0x0405,
-            FRONT_AND_BACK : 0x0408,
-            CULL_FACE : 0x0B44,
-            BLEND : 0x0BE2,
-            DITHER : 0x0BD0,
-            STENCIL_TEST : 0x0B90,
-            DEPTH_TEST : 0x0B71,
-            SCISSOR_TEST : 0x0C11,
-            POLYGON_OFFSET_FILL : 0x8037,
-            SAMPLE_ALPHA_TO_COVERAGE : 0x809E,
-            SAMPLE_COVERAGE : 0x80A0,
-            NO_ERROR : 0,
-            INVALID_ENUM : 0x0500,
-            INVALID_VALUE : 0x0501,
-            INVALID_OPERATION : 0x0502,
-            OUT_OF_MEMORY : 0x0505,
-            CW : 0x0900,
-            CCW : 0x0901,
-            LINE_WIDTH : 0x0B21,
-            ALIASED_POINT_SIZE_RANGE : 0x846D,
-            ALIASED_LINE_WIDTH_RANGE : 0x846E,
-            CULL_FACE_MODE : 0x0B45,
-            FRONT_FACE : 0x0B46,
-            DEPTH_RANGE : 0x0B70,
-            DEPTH_WRITEMASK : 0x0B72,
-            DEPTH_CLEAR_VALUE : 0x0B73,
-            DEPTH_FUNC : 0x0B74,
-            STENCIL_CLEAR_VALUE : 0x0B91,
-            STENCIL_FUNC : 0x0B92,
-            STENCIL_FAIL : 0x0B94,
-            STENCIL_PASS_DEPTH_FAIL : 0x0B95,
-            STENCIL_PASS_DEPTH_PASS : 0x0B96,
-            STENCIL_REF : 0x0B97,
-            STENCIL_VALUE_MASK : 0x0B93,
-            STENCIL_WRITEMASK : 0x0B98,
-            STENCIL_BACK_FUNC : 0x8800,
-            STENCIL_BACK_FAIL : 0x8801,
-            STENCIL_BACK_PASS_DEPTH_FAIL : 0x8802,
-            STENCIL_BACK_PASS_DEPTH_PASS : 0x8803,
-            STENCIL_BACK_REF : 0x8CA3,
-            STENCIL_BACK_VALUE_MASK : 0x8CA4,
-            STENCIL_BACK_WRITEMASK : 0x8CA5,
-            VIEWPORT : 0x0BA2,
-            SCISSOR_BOX : 0x0C10,
-            COLOR_CLEAR_VALUE : 0x0C22,
-            COLOR_WRITEMASK : 0x0C23,
-            UNPACK_ALIGNMENT : 0x0CF5,
-            PACK_ALIGNMENT : 0x0D05,
-            MAX_TEXTURE_SIZE : 0x0D33,
-            MAX_VIEWPORT_DIMS : 0x0D3A,
-            SUBPIXEL_BITS : 0x0D50,
-            RED_BITS : 0x0D52,
-            GREEN_BITS : 0x0D53,
-            BLUE_BITS : 0x0D54,
-            ALPHA_BITS : 0x0D55,
-            DEPTH_BITS : 0x0D56,
-            STENCIL_BITS : 0x0D57,
-            POLYGON_OFFSET_UNITS : 0x2A00,
-            POLYGON_OFFSET_FACTOR : 0x8038,
-            TEXTURE_BINDING_2D : 0x8069,
-            SAMPLE_BUFFERS : 0x80A8,
-            SAMPLES : 0x80A9,
-            SAMPLE_COVERAGE_VALUE : 0x80AA,
-            SAMPLE_COVERAGE_INVERT : 0x80AB,
-            COMPRESSED_TEXTURE_FORMATS : 0x86A3,
-            DONT_CARE : 0x1100,
-            FASTEST : 0x1101,
-            NICEST : 0x1102,
-            GENERATE_MIPMAP_HINT : 0x8192,
-            BYTE : 0x1400,
-            UNSIGNED_BYTE : 0x1401,
-            SHORT : 0x1402,
-            UNSIGNED_SHORT : 0x1403,
-            INT : 0x1404,
-            UNSIGNED_INT : 0x1405,
-            FLOAT : 0x1406,
-            DEPTH_COMPONENT : 0x1902,
-            ALPHA : 0x1906,
-            RGB : 0x1907,
-            RGBA : 0x1908,
-            LUMINANCE : 0x1909,
-            LUMINANCE_ALPHA : 0x190A,
-            UNSIGNED_SHORT_4_4_4_4 : 0x8033,
-            UNSIGNED_SHORT_5_5_5_1 : 0x8034,
-            UNSIGNED_SHORT_5_6_5 : 0x8363,
-            FRAGMENT_SHADER : 0x8B30,
-            VERTEX_SHADER : 0x8B31,
-            MAX_VERTEX_ATTRIBS : 0x8869,
-            MAX_VERTEX_UNIFORM_VECTORS : 0x8DFB,
-            MAX_VARYING_VECTORS : 0x8DFC,
-            MAX_COMBINED_TEXTURE_IMAGE_UNITS : 0x8B4D,
-            MAX_VERTEX_TEXTURE_IMAGE_UNITS : 0x8B4C,
-            MAX_TEXTURE_IMAGE_UNITS : 0x8872,
-            MAX_FRAGMENT_UNIFORM_VECTORS : 0x8DFD,
-            SHADER_TYPE : 0x8B4F,
-            DELETE_STATUS : 0x8B80,
-            LINK_STATUS : 0x8B82,
-            VALIDATE_STATUS : 0x8B83,
-            ATTACHED_SHADERS : 0x8B85,
-            ACTIVE_UNIFORMS : 0x8B86,
-            ACTIVE_ATTRIBUTES : 0x8B89,
-            SHADING_LANGUAGE_VERSION : 0x8B8C,
-            CURRENT_PROGRAM : 0x8B8D,
-            NEVER : 0x0200,
-            LESS : 0x0201,
-            EQUAL : 0x0202,
-            LEQUAL : 0x0203,
-            GREATER : 0x0204,
-            NOTEQUAL : 0x0205,
-            GEQUAL : 0x0206,
-            ALWAYS : 0x0207,
-            KEEP : 0x1E00,
-            REPLACE : 0x1E01,
-            INCR : 0x1E02,
-            DECR : 0x1E03,
-            INVERT : 0x150A,
-            INCR_WRAP : 0x8507,
-            DECR_WRAP : 0x8508,
-            VENDOR : 0x1F00,
-            RENDERER : 0x1F01,
-            VERSION : 0x1F02,
-            NEAREST : 0x2600,
-            LINEAR : 0x2601,
-            NEAREST_MIPMAP_NEAREST : 0x2700,
-            LINEAR_MIPMAP_NEAREST : 0x2701,
-            NEAREST_MIPMAP_LINEAR : 0x2702,
-            LINEAR_MIPMAP_LINEAR : 0x2703,
-            TEXTURE_MAG_FILTER : 0x2800,
-            TEXTURE_MIN_FILTER : 0x2801,
-            TEXTURE_WRAP_S : 0x2802,
-            TEXTURE_WRAP_T : 0x2803,
-            TEXTURE_2D : 0x0DE1,
-            TEXTURE : 0x1702,
-            TEXTURE_CUBE_MAP : 0x8513,
-            TEXTURE_BINDING_CUBE_MAP : 0x8514,
-            TEXTURE_CUBE_MAP_POSITIVE_X : 0x8515,
-            TEXTURE_CUBE_MAP_NEGATIVE_X : 0x8516,
-            TEXTURE_CUBE_MAP_POSITIVE_Y : 0x8517,
-            TEXTURE_CUBE_MAP_NEGATIVE_Y : 0x8518,
-            TEXTURE_CUBE_MAP_POSITIVE_Z : 0x8519,
-            TEXTURE_CUBE_MAP_NEGATIVE_Z : 0x851A,
-            MAX_CUBE_MAP_TEXTURE_SIZE : 0x851C,
-            TEXTURE0 : 0x84C0,
-            TEXTURE1 : 0x84C1,
-            TEXTURE2 : 0x84C2,
-            TEXTURE3 : 0x84C3,
-            TEXTURE4 : 0x84C4,
-            TEXTURE5 : 0x84C5,
-            TEXTURE6 : 0x84C6,
-            TEXTURE7 : 0x84C7,
-            TEXTURE8 : 0x84C8,
-            TEXTURE9 : 0x84C9,
-            TEXTURE10 : 0x84CA,
-            TEXTURE11 : 0x84CB,
-            TEXTURE12 : 0x84CC,
-            TEXTURE13 : 0x84CD,
-            TEXTURE14 : 0x84CE,
-            TEXTURE15 : 0x84CF,
-            TEXTURE16 : 0x84D0,
-            TEXTURE17 : 0x84D1,
-            TEXTURE18 : 0x84D2,
-            TEXTURE19 : 0x84D3,
-            TEXTURE20 : 0x84D4,
-            TEXTURE21 : 0x84D5,
-            TEXTURE22 : 0x84D6,
-            TEXTURE23 : 0x84D7,
-            TEXTURE24 : 0x84D8,
-            TEXTURE25 : 0x84D9,
-            TEXTURE26 : 0x84DA,
-            TEXTURE27 : 0x84DB,
-            TEXTURE28 : 0x84DC,
-            TEXTURE29 : 0x84DD,
-            TEXTURE30 : 0x84DE,
-            TEXTURE31 : 0x84DF,
-            ACTIVE_TEXTURE : 0x84E0,
-            REPEAT : 0x2901,
-            CLAMP_TO_EDGE : 0x812F,
-            MIRRORED_REPEAT : 0x8370,
-            FLOAT_VEC2 : 0x8B50,
-            FLOAT_VEC3 : 0x8B51,
-            FLOAT_VEC4 : 0x8B52,
-            INT_VEC2 : 0x8B53,
-            INT_VEC3 : 0x8B54,
-            INT_VEC4 : 0x8B55,
-            BOOL : 0x8B56,
-            BOOL_VEC2 : 0x8B57,
-            BOOL_VEC3 : 0x8B58,
-            BOOL_VEC4 : 0x8B59,
-            FLOAT_MAT2 : 0x8B5A,
-            FLOAT_MAT3 : 0x8B5B,
-            FLOAT_MAT4 : 0x8B5C,
-            SAMPLER_2D : 0x8B5E,
-            SAMPLER_CUBE : 0x8B60,
-            VERTEX_ATTRIB_ARRAY_ENABLED : 0x8622,
-            VERTEX_ATTRIB_ARRAY_SIZE : 0x8623,
-            VERTEX_ATTRIB_ARRAY_STRIDE : 0x8624,
-            VERTEX_ATTRIB_ARRAY_TYPE : 0x8625,
-            VERTEX_ATTRIB_ARRAY_NORMALIZED : 0x886A,
-            VERTEX_ATTRIB_ARRAY_POINTER : 0x8645,
-            VERTEX_ATTRIB_ARRAY_BUFFER_BINDING : 0x889F,
-            IMPLEMENTATION_COLOR_READ_TYPE : 0x8B9A,
-            IMPLEMENTATION_COLOR_READ_FORMAT : 0x8B9B,
-            COMPILE_STATUS : 0x8B81,
-            LOW_FLOAT : 0x8DF0,
-            MEDIUM_FLOAT : 0x8DF1,
-            HIGH_FLOAT : 0x8DF2,
-            LOW_INT : 0x8DF3,
-            MEDIUM_INT : 0x8DF4,
-            HIGH_INT : 0x8DF5,
-            FRAMEBUFFER : 0x8D40,
-            RENDERBUFFER : 0x8D41,
-            RGBA4 : 0x8056,
-            RGB5_A1 : 0x8057,
-            RGB565 : 0x8D62,
-            DEPTH_COMPONENT16 : 0x81A5,
-            STENCIL_INDEX : 0x1901,
-            STENCIL_INDEX8 : 0x8D48,
-            DEPTH_STENCIL : 0x84F9,
-            RENDERBUFFER_WIDTH : 0x8D42,
-            RENDERBUFFER_HEIGHT : 0x8D43,
-            RENDERBUFFER_INTERNAL_FORMAT : 0x8D44,
-            RENDERBUFFER_RED_SIZE : 0x8D50,
-            RENDERBUFFER_GREEN_SIZE : 0x8D51,
-            RENDERBUFFER_BLUE_SIZE : 0x8D52,
-            RENDERBUFFER_ALPHA_SIZE : 0x8D53,
-            RENDERBUFFER_DEPTH_SIZE : 0x8D54,
-            RENDERBUFFER_STENCIL_SIZE : 0x8D55,
-            FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE : 0x8CD0,
-            FRAMEBUFFER_ATTACHMENT_OBJECT_NAME : 0x8CD1,
-            FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL : 0x8CD2,
-            FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE : 0x8CD3,
-            COLOR_ATTACHMENT0 : 0x8CE0,
-            DEPTH_ATTACHMENT : 0x8D00,
-            STENCIL_ATTACHMENT : 0x8D20,
-            DEPTH_STENCIL_ATTACHMENT : 0x821A,
-            NONE : 0,
-            FRAMEBUFFER_COMPLETE : 0x8CD5,
-            FRAMEBUFFER_INCOMPLETE_ATTACHMENT : 0x8CD6,
-            FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT : 0x8CD7,
-            FRAMEBUFFER_INCOMPLETE_DIMENSIONS : 0x8CD9,
-            FRAMEBUFFER_UNSUPPORTED : 0x8CDD,
-            FRAMEBUFFER_BINDING : 0x8CA6,
-            RENDERBUFFER_BINDING : 0x8CA7,
-            MAX_RENDERBUFFER_SIZE : 0x84E8,
-            INVALID_FRAMEBUFFER_OPERATION : 0x0506,
-            UNPACK_FLIP_Y_WEBGL : 0x9240,
-            UNPACK_PREMULTIPLY_ALPHA_WEBGL : 0x9241,
-            CONTEXT_LOST_WEBGL : 0x9242,
-            UNPACK_COLORSPACE_CONVERSION_WEBGL : 0x9243,
-            BROWSER_DEFAULT_WEBGL : 0x9244,
-
-            // WEBGL_compressed_texture_s3tc
-            COMPRESSED_RGB_S3TC_DXT1_EXT : 0x83F0,
-            COMPRESSED_RGBA_S3TC_DXT1_EXT : 0x83F1,
-            COMPRESSED_RGBA_S3TC_DXT3_EXT : 0x83F2,
-            COMPRESSED_RGBA_S3TC_DXT5_EXT : 0x83F3,
-
-            // WEBGL_compressed_texture_pvrtc
-            COMPRESSED_RGB_PVRTC_4BPPV1_IMG : 0x8C00,
-            COMPRESSED_RGB_PVRTC_2BPPV1_IMG : 0x8C01,
-            COMPRESSED_RGBA_PVRTC_4BPPV1_IMG : 0x8C02,
-            COMPRESSED_RGBA_PVRTC_2BPPV1_IMG : 0x8C03,
-
-            // WEBGL_compressed_texture_etc1
-            COMPRESSED_RGB_ETC1_WEBGL : 0x8D64,
-
-            // EXT_color_buffer_half_float
-            HALF_FLOAT_OES : 0x8D61,
-
-            // Desktop OpenGL
-            DOUBLE : 0x140A,
-
-            // WebGL 2
-            READ_BUFFER : 0x0C02,
-            UNPACK_ROW_LENGTH : 0x0CF2,
-            UNPACK_SKIP_ROWS : 0x0CF3,
-            UNPACK_SKIP_PIXELS : 0x0CF4,
-            PACK_ROW_LENGTH : 0x0D02,
-            PACK_SKIP_ROWS : 0x0D03,
-            PACK_SKIP_PIXELS : 0x0D04,
-            COLOR : 0x1800,
-            DEPTH : 0x1801,
-            STENCIL : 0x1802,
-            RED : 0x1903,
-            RGB8 : 0x8051,
-            RGBA8 : 0x8058,
-            RGB10_A2 : 0x8059,
-            TEXTURE_BINDING_3D : 0x806A,
-            UNPACK_SKIP_IMAGES : 0x806D,
-            UNPACK_IMAGE_HEIGHT : 0x806E,
-            TEXTURE_3D : 0x806F,
-            TEXTURE_WRAP_R : 0x8072,
-            MAX_3D_TEXTURE_SIZE : 0x8073,
-            UNSIGNED_INT_2_10_10_10_REV : 0x8368,
-            MAX_ELEMENTS_VERTICES : 0x80E8,
-            MAX_ELEMENTS_INDICES : 0x80E9,
-            TEXTURE_MIN_LOD : 0x813A,
-            TEXTURE_MAX_LOD : 0x813B,
-            TEXTURE_BASE_LEVEL : 0x813C,
-            TEXTURE_MAX_LEVEL : 0x813D,
-            MIN : 0x8007,
-            MAX : 0x8008,
-            DEPTH_COMPONENT24 : 0x81A6,
-            MAX_TEXTURE_LOD_BIAS : 0x84FD,
-            TEXTURE_COMPARE_MODE : 0x884C,
-            TEXTURE_COMPARE_FUNC : 0x884D,
-            CURRENT_QUERY : 0x8865,
-            QUERY_RESULT : 0x8866,
-            QUERY_RESULT_AVAILABLE : 0x8867,
-            STREAM_READ : 0x88E1,
-            STREAM_COPY : 0x88E2,
-            STATIC_READ : 0x88E5,
-            STATIC_COPY : 0x88E6,
-            DYNAMIC_READ : 0x88E9,
-            DYNAMIC_COPY : 0x88EA,
-            MAX_DRAW_BUFFERS : 0x8824,
-            DRAW_BUFFER0 : 0x8825,
-            DRAW_BUFFER1 : 0x8826,
-            DRAW_BUFFER2 : 0x8827,
-            DRAW_BUFFER3 : 0x8828,
-            DRAW_BUFFER4 : 0x8829,
-            DRAW_BUFFER5 : 0x882A,
-            DRAW_BUFFER6 : 0x882B,
-            DRAW_BUFFER7 : 0x882C,
-            DRAW_BUFFER8 : 0x882D,
-            DRAW_BUFFER9 : 0x882E,
-            DRAW_BUFFER10 : 0x882F,
-            DRAW_BUFFER11 : 0x8830,
-            DRAW_BUFFER12 : 0x8831,
-            DRAW_BUFFER13 : 0x8832,
-            DRAW_BUFFER14 : 0x8833,
-            DRAW_BUFFER15 : 0x8834,
-            MAX_FRAGMENT_UNIFORM_COMPONENTS : 0x8B49,
-            MAX_VERTEX_UNIFORM_COMPONENTS : 0x8B4A,
-            SAMPLER_3D : 0x8B5F,
-            SAMPLER_2D_SHADOW : 0x8B62,
-            FRAGMENT_SHADER_DERIVATIVE_HINT : 0x8B8B,
-            PIXEL_PACK_BUFFER : 0x88EB,
-            PIXEL_UNPACK_BUFFER : 0x88EC,
-            PIXEL_PACK_BUFFER_BINDING : 0x88ED,
-            PIXEL_UNPACK_BUFFER_BINDING : 0x88EF,
-            FLOAT_MAT2x3 : 0x8B65,
-            FLOAT_MAT2x4 : 0x8B66,
-            FLOAT_MAT3x2 : 0x8B67,
-            FLOAT_MAT3x4 : 0x8B68,
-            FLOAT_MAT4x2 : 0x8B69,
-            FLOAT_MAT4x3 : 0x8B6A,
-            SRGB : 0x8C40,
-            SRGB8 : 0x8C41,
-            SRGB8_ALPHA8 : 0x8C43,
-            COMPARE_REF_TO_TEXTURE : 0x884E,
-            RGBA32F : 0x8814,
-            RGB32F : 0x8815,
-            RGBA16F : 0x881A,
-            RGB16F : 0x881B,
-            VERTEX_ATTRIB_ARRAY_INTEGER : 0x88FD,
-            MAX_ARRAY_TEXTURE_LAYERS : 0x88FF,
-            MIN_PROGRAM_TEXEL_OFFSET : 0x8904,
-            MAX_PROGRAM_TEXEL_OFFSET : 0x8905,
-            MAX_VARYING_COMPONENTS : 0x8B4B,
-            TEXTURE_2D_ARRAY : 0x8C1A,
-            TEXTURE_BINDING_2D_ARRAY : 0x8C1D,
-            R11F_G11F_B10F : 0x8C3A,
-            UNSIGNED_INT_10F_11F_11F_REV : 0x8C3B,
-            RGB9_E5 : 0x8C3D,
-            UNSIGNED_INT_5_9_9_9_REV : 0x8C3E,
-            TRANSFORM_FEEDBACK_BUFFER_MODE : 0x8C7F,
-            MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS : 0x8C80,
-            TRANSFORM_FEEDBACK_VARYINGS : 0x8C83,
-            TRANSFORM_FEEDBACK_BUFFER_START : 0x8C84,
-            TRANSFORM_FEEDBACK_BUFFER_SIZE : 0x8C85,
-            TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN : 0x8C88,
-            RASTERIZER_DISCARD : 0x8C89,
-            MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS : 0x8C8A,
-            MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS : 0x8C8B,
-            INTERLEAVED_ATTRIBS : 0x8C8C,
-            SEPARATE_ATTRIBS : 0x8C8D,
-            TRANSFORM_FEEDBACK_BUFFER : 0x8C8E,
-            TRANSFORM_FEEDBACK_BUFFER_BINDING : 0x8C8F,
-            RGBA32UI : 0x8D70,
-            RGB32UI : 0x8D71,
-            RGBA16UI : 0x8D76,
-            RGB16UI : 0x8D77,
-            RGBA8UI : 0x8D7C,
-            RGB8UI : 0x8D7D,
-            RGBA32I : 0x8D82,
-            RGB32I : 0x8D83,
-            RGBA16I : 0x8D88,
-            RGB16I : 0x8D89,
-            RGBA8I : 0x8D8E,
-            RGB8I : 0x8D8F,
-            RED_INTEGER : 0x8D94,
-            RGB_INTEGER : 0x8D98,
-            RGBA_INTEGER : 0x8D99,
-            SAMPLER_2D_ARRAY : 0x8DC1,
-            SAMPLER_2D_ARRAY_SHADOW : 0x8DC4,
-            SAMPLER_CUBE_SHADOW : 0x8DC5,
-            UNSIGNED_INT_VEC2 : 0x8DC6,
-            UNSIGNED_INT_VEC3 : 0x8DC7,
-            UNSIGNED_INT_VEC4 : 0x8DC8,
-            INT_SAMPLER_2D : 0x8DCA,
-            INT_SAMPLER_3D : 0x8DCB,
-            INT_SAMPLER_CUBE : 0x8DCC,
-            INT_SAMPLER_2D_ARRAY : 0x8DCF,
-            UNSIGNED_INT_SAMPLER_2D : 0x8DD2,
-            UNSIGNED_INT_SAMPLER_3D : 0x8DD3,
-            UNSIGNED_INT_SAMPLER_CUBE : 0x8DD4,
-            UNSIGNED_INT_SAMPLER_2D_ARRAY : 0x8DD7,
-            DEPTH_COMPONENT32F : 0x8CAC,
-            DEPTH32F_STENCIL8 : 0x8CAD,
-            FLOAT_32_UNSIGNED_INT_24_8_REV : 0x8DAD,
-            FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING : 0x8210,
-            FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE : 0x8211,
-            FRAMEBUFFER_ATTACHMENT_RED_SIZE : 0x8212,
-            FRAMEBUFFER_ATTACHMENT_GREEN_SIZE : 0x8213,
-            FRAMEBUFFER_ATTACHMENT_BLUE_SIZE : 0x8214,
-            FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE : 0x8215,
-            FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE : 0x8216,
-            FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE : 0x8217,
-            FRAMEBUFFER_DEFAULT : 0x8218,
-            UNSIGNED_INT_24_8 : 0x84FA,
-            DEPTH24_STENCIL8 : 0x88F0,
-            UNSIGNED_NORMALIZED : 0x8C17,
-            DRAW_FRAMEBUFFER_BINDING : 0x8CA6, // Same as FRAMEBUFFER_BINDING
-            READ_FRAMEBUFFER : 0x8CA8,
-            DRAW_FRAMEBUFFER : 0x8CA9,
-            READ_FRAMEBUFFER_BINDING : 0x8CAA,
-            RENDERBUFFER_SAMPLES : 0x8CAB,
-            FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER : 0x8CD4,
-            MAX_COLOR_ATTACHMENTS : 0x8CDF,
-            COLOR_ATTACHMENT1 : 0x8CE1,
-            COLOR_ATTACHMENT2 : 0x8CE2,
-            COLOR_ATTACHMENT3 : 0x8CE3,
-            COLOR_ATTACHMENT4 : 0x8CE4,
-            COLOR_ATTACHMENT5 : 0x8CE5,
-            COLOR_ATTACHMENT6 : 0x8CE6,
-            COLOR_ATTACHMENT7 : 0x8CE7,
-            COLOR_ATTACHMENT8 : 0x8CE8,
-            COLOR_ATTACHMENT9 : 0x8CE9,
-            COLOR_ATTACHMENT10 : 0x8CEA,
-            COLOR_ATTACHMENT11 : 0x8CEB,
-            COLOR_ATTACHMENT12 : 0x8CEC,
-            COLOR_ATTACHMENT13 : 0x8CED,
-            COLOR_ATTACHMENT14 : 0x8CEE,
-            COLOR_ATTACHMENT15 : 0x8CEF,
-            FRAMEBUFFER_INCOMPLETE_MULTISAMPLE : 0x8D56,
-            MAX_SAMPLES : 0x8D57,
-            HALF_FLOAT : 0x140B,
-            RG : 0x8227,
-            RG_INTEGER : 0x8228,
-            R8 : 0x8229,
-            RG8 : 0x822B,
-            R16F : 0x822D,
-            R32F : 0x822E,
-            RG16F : 0x822F,
-            RG32F : 0x8230,
-            R8I : 0x8231,
-            R8UI : 0x8232,
-            R16I : 0x8233,
-            R16UI : 0x8234,
-            R32I : 0x8235,
-            R32UI : 0x8236,
-            RG8I : 0x8237,
-            RG8UI : 0x8238,
-            RG16I : 0x8239,
-            RG16UI : 0x823A,
-            RG32I : 0x823B,
-            RG32UI : 0x823C,
-            VERTEX_ARRAY_BINDING : 0x85B5,
-            R8_SNORM : 0x8F94,
-            RG8_SNORM : 0x8F95,
-            RGB8_SNORM : 0x8F96,
-            RGBA8_SNORM : 0x8F97,
-            SIGNED_NORMALIZED : 0x8F9C,
-            COPY_READ_BUFFER : 0x8F36,
-            COPY_WRITE_BUFFER : 0x8F37,
-            COPY_READ_BUFFER_BINDING : 0x8F36, // Same as COPY_READ_BUFFER
-            COPY_WRITE_BUFFER_BINDING : 0x8F37, // Same as COPY_WRITE_BUFFER
-            UNIFORM_BUFFER : 0x8A11,
-            UNIFORM_BUFFER_BINDING : 0x8A28,
-            UNIFORM_BUFFER_START : 0x8A29,
-            UNIFORM_BUFFER_SIZE : 0x8A2A,
-            MAX_VERTEX_UNIFORM_BLOCKS : 0x8A2B,
-            MAX_FRAGMENT_UNIFORM_BLOCKS : 0x8A2D,
-            MAX_COMBINED_UNIFORM_BLOCKS : 0x8A2E,
-            MAX_UNIFORM_BUFFER_BINDINGS : 0x8A2F,
-            MAX_UNIFORM_BLOCK_SIZE : 0x8A30,
-            MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS : 0x8A31,
-            MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS : 0x8A33,
-            UNIFORM_BUFFER_OFFSET_ALIGNMENT : 0x8A34,
-            ACTIVE_UNIFORM_BLOCKS : 0x8A36,
-            UNIFORM_TYPE : 0x8A37,
-            UNIFORM_SIZE : 0x8A38,
-            UNIFORM_BLOCK_INDEX : 0x8A3A,
-            UNIFORM_OFFSET : 0x8A3B,
-            UNIFORM_ARRAY_STRIDE : 0x8A3C,
-            UNIFORM_MATRIX_STRIDE : 0x8A3D,
-            UNIFORM_IS_ROW_MAJOR : 0x8A3E,
-            UNIFORM_BLOCK_BINDING : 0x8A3F,
-            UNIFORM_BLOCK_DATA_SIZE : 0x8A40,
-            UNIFORM_BLOCK_ACTIVE_UNIFORMS : 0x8A42,
-            UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES : 0x8A43,
-            UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER : 0x8A44,
-            UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER : 0x8A46,
-            INVALID_INDEX : 0xFFFFFFFF,
-            MAX_VERTEX_OUTPUT_COMPONENTS : 0x9122,
-            MAX_FRAGMENT_INPUT_COMPONENTS : 0x9125,
-            MAX_SERVER_WAIT_TIMEOUT : 0x9111,
-            OBJECT_TYPE : 0x9112,
-            SYNC_CONDITION : 0x9113,
-            SYNC_STATUS : 0x9114,
-            SYNC_FLAGS : 0x9115,
-            SYNC_FENCE : 0x9116,
-            SYNC_GPU_COMMANDS_COMPLETE : 0x9117,
-            UNSIGNALED : 0x9118,
-            SIGNALED : 0x9119,
-            ALREADY_SIGNALED : 0x911A,
-            TIMEOUT_EXPIRED : 0x911B,
-            CONDITION_SATISFIED : 0x911C,
-            WAIT_FAILED : 0x911D,
-            SYNC_FLUSH_COMMANDS_BIT : 0x00000001,
-            VERTEX_ATTRIB_ARRAY_DIVISOR : 0x88FE,
-            ANY_SAMPLES_PASSED : 0x8C2F,
-            ANY_SAMPLES_PASSED_CONSERVATIVE : 0x8D6A,
-            SAMPLER_BINDING : 0x8919,
-            RGB10_A2UI : 0x906F,
-            INT_2_10_10_10_REV : 0x8D9F,
-            TRANSFORM_FEEDBACK : 0x8E22,
-            TRANSFORM_FEEDBACK_PAUSED : 0x8E23,
-            TRANSFORM_FEEDBACK_ACTIVE : 0x8E24,
-            TRANSFORM_FEEDBACK_BINDING : 0x8E25,
-            COMPRESSED_R11_EAC : 0x9270,
-            COMPRESSED_SIGNED_R11_EAC : 0x9271,
-            COMPRESSED_RG11_EAC : 0x9272,
-            COMPRESSED_SIGNED_RG11_EAC : 0x9273,
-            COMPRESSED_RGB8_ETC2 : 0x9274,
-            COMPRESSED_SRGB8_ETC2 : 0x9275,
-            COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 : 0x9276,
-            COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 : 0x9277,
-            COMPRESSED_RGBA8_ETC2_EAC : 0x9278,
-            COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : 0x9279,
-            TEXTURE_IMMUTABLE_FORMAT : 0x912F,
-            MAX_ELEMENT_INDEX : 0x8D6B,
-            TEXTURE_IMMUTABLE_LEVELS : 0x82DF,
-
-            // Extensions
-            MAX_TEXTURE_MAX_ANISOTROPY_EXT : 0x84FF
-        };
-    var WebGLConstants$1 = Object.freeze(WebGLConstants);
-
-    exports.WebGLConstants = WebGLConstants$1;
-
-});
diff --git a/public/libs/Cesium/Workers/WebMercatorProjection-80c70558.js b/public/libs/Cesium/Workers/WebMercatorProjection-80c70558.js
deleted file mode 100644
index a314680..0000000
--- a/public/libs/Cesium/Workers/WebMercatorProjection-80c70558.js
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09'], function (exports, when, Check, _Math, Cartographic, Cartesian2) { 'use strict';
-
-    /**
-         * The map projection used by Google Maps, Bing Maps, and most of ArcGIS Online, EPSG:3857.  This
-         * projection use longitude and latitude expressed with the WGS84 and transforms them to Mercator using
-         * the spherical (rather than ellipsoidal) equations.
-         *
-         * @alias WebMercatorProjection
-         * @constructor
-         *
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid.
-         *
-         * @see GeographicProjection
-         */
-        function WebMercatorProjection(ellipsoid) {
-            this._ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            this._semimajorAxis = this._ellipsoid.maximumRadius;
-            this._oneOverSemimajorAxis = 1.0 / this._semimajorAxis;
-        }
-
-        Object.defineProperties(WebMercatorProjection.prototype, {
-            /**
-             * Gets the {@link Ellipsoid}.
-             *
-             * @memberof WebMercatorProjection.prototype
-             *
-             * @type {Ellipsoid}
-             * @readonly
-             */
-            ellipsoid : {
-                get : function() {
-                    return this._ellipsoid;
-                }
-            }
-        });
-
-        /**
-         * Converts a Mercator angle, in the range -PI to PI, to a geodetic latitude
-         * in the range -PI/2 to PI/2.
-         *
-         * @param {Number} mercatorAngle The angle to convert.
-         * @returns {Number} The geodetic latitude in radians.
-         */
-        WebMercatorProjection.mercatorAngleToGeodeticLatitude = function(mercatorAngle) {
-            return _Math.CesiumMath.PI_OVER_TWO - (2.0 * Math.atan(Math.exp(-mercatorAngle)));
-        };
-
-        /**
-         * Converts a geodetic latitude in radians, in the range -PI/2 to PI/2, to a Mercator
-         * angle in the range -PI to PI.
-         *
-         * @param {Number} latitude The geodetic latitude in radians.
-         * @returns {Number} The Mercator angle.
-         */
-        WebMercatorProjection.geodeticLatitudeToMercatorAngle = function(latitude) {
-            // Clamp the latitude coordinate to the valid Mercator bounds.
-            if (latitude > WebMercatorProjection.MaximumLatitude) {
-                latitude = WebMercatorProjection.MaximumLatitude;
-            } else if (latitude < -WebMercatorProjection.MaximumLatitude) {
-                latitude = -WebMercatorProjection.MaximumLatitude;
-            }
-            var sinLatitude = Math.sin(latitude);
-            return 0.5 * Math.log((1.0 + sinLatitude) / (1.0 - sinLatitude));
-        };
-
-        /**
-         * The maximum latitude (both North and South) supported by a Web Mercator
-         * (EPSG:3857) projection.  Technically, the Mercator projection is defined
-         * for any latitude up to (but not including) 90 degrees, but it makes sense
-         * to cut it off sooner because it grows exponentially with increasing latitude.
-         * The logic behind this particular cutoff value, which is the one used by
-         * Google Maps, Bing Maps, and Esri, is that it makes the projection
-         * square.  That is, the rectangle is equal in the X and Y directions.
-         *
-         * The constant value is computed by calling:
-         *    WebMercatorProjection.mercatorAngleToGeodeticLatitude(Math.PI)
-         *
-         * @type {Number}
-         */
-        WebMercatorProjection.MaximumLatitude = WebMercatorProjection.mercatorAngleToGeodeticLatitude(Math.PI);
-
-        /**
-         * Converts geodetic ellipsoid coordinates, in radians, to the equivalent Web Mercator
-         * X, Y, Z coordinates expressed in meters and returned in a {@link Cartesian3}.  The height
-         * is copied unmodified to the Z coordinate.
-         *
-         * @param {Cartographic} cartographic The cartographic coordinates in radians.
-         * @param {Cartesian3} [result] The instance to which to copy the result, or undefined if a
-         *        new instance should be created.
-         * @returns {Cartesian3} The equivalent web mercator X, Y, Z coordinates, in meters.
-         */
-        WebMercatorProjection.prototype.project = function(cartographic, result) {
-            var semimajorAxis = this._semimajorAxis;
-            var x = cartographic.longitude * semimajorAxis;
-            var y = WebMercatorProjection.geodeticLatitudeToMercatorAngle(cartographic.latitude) * semimajorAxis;
-            var z = cartographic.height;
-
-            if (!when.defined(result)) {
-                return new Cartographic.Cartesian3(x, y, z);
-            }
-
-            result.x = x;
-            result.y = y;
-            result.z = z;
-            return result;
-        };
-
-        /**
-         * Converts Web Mercator X, Y coordinates, expressed in meters, to a {@link Cartographic}
-         * containing geodetic ellipsoid coordinates.  The Z coordinate is copied unmodified to the
-         * height.
-         *
-         * @param {Cartesian3} cartesian The web mercator Cartesian position to unrproject with height (z) in meters.
-         * @param {Cartographic} [result] The instance to which to copy the result, or undefined if a
-         *        new instance should be created.
-         * @returns {Cartographic} The equivalent cartographic coordinates.
-         */
-        WebMercatorProjection.prototype.unproject = function(cartesian, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(cartesian)) {
-                throw new Check.DeveloperError('cartesian is required');
-            }
-            //>>includeEnd('debug');
-
-            var oneOverEarthSemimajorAxis = this._oneOverSemimajorAxis;
-            var longitude = cartesian.x * oneOverEarthSemimajorAxis;
-            var latitude = WebMercatorProjection.mercatorAngleToGeodeticLatitude(cartesian.y * oneOverEarthSemimajorAxis);
-            var height = cartesian.z;
-
-            if (!when.defined(result)) {
-                return new Cartographic.Cartographic(longitude, latitude, height);
-            }
-
-            result.longitude = longitude;
-            result.latitude = latitude;
-            result.height = height;
-            return result;
-        };
-
-    exports.WebMercatorProjection = WebMercatorProjection;
-
-});
diff --git a/public/libs/Cesium/Workers/arrayFill-9766fb2e.js b/public/libs/Cesium/Workers/arrayFill-9766fb2e.js
deleted file mode 100644
index c59df21..0000000
--- a/public/libs/Cesium/Workers/arrayFill-9766fb2e.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281'], function (exports, when, Check) { 'use strict';
-
-    /**
-         * Fill an array or a portion of an array with a given value.
-         *
-         * @param {Array} array The array to fill.
-         * @param {*} value The value to fill the array with.
-         * @param {Number} [start=0] The index to start filling at.
-         * @param {Number} [end=array.length] The index to end stop at.
-         *
-         * @returns {Array} The resulting array.
-         * @private
-         */
-        function arrayFill(array, value, start, end) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            Check.Check.defined('value', value);
-            if (when.defined(start)) {
-                Check.Check.typeOf.number('start', start);
-            }
-            if (when.defined(end)) {
-                Check.Check.typeOf.number('end', end);
-            }
-            //>>includeEnd('debug');
-
-            if (typeof array.fill === 'function') {
-                return array.fill(value, start, end);
-            }
-
-            var length = array.length >>> 0;
-            var relativeStart = when.defaultValue(start, 0);
-            // If negative, find wrap around position
-            var k = (relativeStart < 0) ? Math.max(length + relativeStart, 0) : Math.min(relativeStart, length);
-            var relativeEnd = when.defaultValue(end, length);
-            // If negative, find wrap around position
-            var last = (relativeEnd < 0) ? Math.max(length + relativeEnd, 0) : Math.min(relativeEnd, length);
-
-            // Fill array accordingly
-            while (k < last) {
-                array[k] = value;
-                k++;
-            }
-            return array;
-        }
-
-    exports.arrayFill = arrayFill;
-
-});
diff --git a/public/libs/Cesium/Workers/arrayRemoveDuplicates-f0b089b1.js b/public/libs/Cesium/Workers/arrayRemoveDuplicates-f0b089b1.js
deleted file mode 100644
index 3524a73..0000000
--- a/public/libs/Cesium/Workers/arrayRemoveDuplicates-f0b089b1.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './Math-61ede240'], function (exports, when, Check, _Math) { 'use strict';
-
-    var removeDuplicatesEpsilon = _Math.CesiumMath.EPSILON10;
-
-        /**
-         * Removes adjacent duplicate values in an array of values.
-         *
-         * @param {Array.<*>} [values] The array of values.
-         * @param {Function} equalsEpsilon Function to compare values with an epsilon. Boolean equalsEpsilon(left, right, epsilon).
-         * @param {Boolean} [wrapAround=false] Compare the last value in the array against the first value.
-         * @returns {Array.<*>|undefined} A new array of values with no adjacent duplicate values or the input array if no duplicates were found.
-         *
-         * @example
-         * // Returns [(1.0, 1.0, 1.0), (2.0, 2.0, 2.0), (3.0, 3.0, 3.0), (1.0, 1.0, 1.0)]
-         * var values = [
-         *     new Cesium.Cartesian3(1.0, 1.0, 1.0),
-         *     new Cesium.Cartesian3(1.0, 1.0, 1.0),
-         *     new Cesium.Cartesian3(2.0, 2.0, 2.0),
-         *     new Cesium.Cartesian3(3.0, 3.0, 3.0),
-         *     new Cesium.Cartesian3(1.0, 1.0, 1.0)];
-         * var nonDuplicatevalues = Cesium.PolylinePipeline.removeDuplicates(values, Cartesian3.equalsEpsilon);
-         *
-         * @example
-         * // Returns [(1.0, 1.0, 1.0), (2.0, 2.0, 2.0), (3.0, 3.0, 3.0)]
-         * var values = [
-         *     new Cesium.Cartesian3(1.0, 1.0, 1.0),
-         *     new Cesium.Cartesian3(1.0, 1.0, 1.0),
-         *     new Cesium.Cartesian3(2.0, 2.0, 2.0),
-         *     new Cesium.Cartesian3(3.0, 3.0, 3.0),
-         *     new Cesium.Cartesian3(1.0, 1.0, 1.0)];
-         * var nonDuplicatevalues = Cesium.PolylinePipeline.removeDuplicates(values, Cartesian3.equalsEpsilon, true);
-         *
-         * @private
-         */
-        function arrayRemoveDuplicates(values, equalsEpsilon, wrapAround) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('equalsEpsilon', equalsEpsilon);
-            //>>includeEnd('debug');
-
-            if (!when.defined(values)) {
-                return undefined;
-            }
-
-            wrapAround = when.defaultValue(wrapAround, false);
-
-            var length = values.length;
-            if (length < 2) {
-                return values;
-            }
-
-            var i;
-            var v0;
-            var v1;
-
-            for (i = 1; i < length; ++i) {
-                v0 = values[i - 1];
-                v1 = values[i];
-                if (equalsEpsilon(v0, v1, removeDuplicatesEpsilon)) {
-                    break;
-                }
-            }
-
-            if (i === length) {
-                if (wrapAround && equalsEpsilon(values[0], values[values.length - 1], removeDuplicatesEpsilon)) {
-                    return values.slice(1);
-                }
-                return values;
-            }
-
-            var cleanedvalues = values.slice(0, i);
-            for (; i < length; ++i) {
-                // v0 is set by either the previous loop, or the previous clean point.
-                v1 = values[i];
-                if (!equalsEpsilon(v0, v1, removeDuplicatesEpsilon)) {
-                    cleanedvalues.push(v1);
-                    v0 = v1;
-                }
-            }
-
-            if (wrapAround && cleanedvalues.length > 1 && equalsEpsilon(cleanedvalues[0], cleanedvalues[cleanedvalues.length - 1], removeDuplicatesEpsilon)) {
-                cleanedvalues.shift();
-            }
-
-            return cleanedvalues;
-        }
-
-    exports.arrayRemoveDuplicates = arrayRemoveDuplicates;
-
-});
diff --git a/public/libs/Cesium/Workers/buildModuleUrl-e7952659.js b/public/libs/Cesium/Workers/buildModuleUrl-e7952659.js
deleted file mode 100644
index e6515a3..0000000
--- a/public/libs/Cesium/Workers/buildModuleUrl-e7952659.js
+++ /dev/null
@@ -1,4592 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports', './when-8d13db60', './Check-70bec281', './RuntimeError-ba10bc3e'], function (exports, when, Check, RuntimeError) { 'use strict';
-
-	/**
-	 * @license
-	 *
-	 * Grauw URI utilities
-	 *
-	 * See: http://hg.grauw.nl/grauw-lib/file/tip/src/uri.js
-	 *
-	 * @author Laurens Holst (http://www.grauw.nl/)
-	 *
-	 *   Copyright 2012 Laurens Holst
-	 *
-	 *   Licensed under the Apache License, Version 2.0 (the "License");
-	 *   you may not use this file except in compliance with the License.
-	 *   You may obtain a copy of the License at
-	 *
-	 *       http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 *   Unless required by applicable law or agreed to in writing, software
-	 *   distributed under the License is distributed on an "AS IS" BASIS,
-	 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-	 *   See the License for the specific language governing permissions and
-	 *   limitations under the License.
-	 *
-	 */
-
-		/**
-		 * Constructs a URI object.
-		 * @constructor
-		 * @class Implementation of URI parsing and base URI resolving algorithm in RFC 3986.
-		 * @param {string|URI} uri A string or URI object to create the object from.
-		 */
-		function URI(uri) {
-			if (uri instanceof URI) {  // copy constructor
-				this.scheme = uri.scheme;
-				this.authority = uri.authority;
-				this.path = uri.path;
-				this.query = uri.query;
-				this.fragment = uri.fragment;
-			} else if (uri) {  // uri is URI string or cast to string
-				var c = parseRegex.exec(uri);
-				this.scheme = c[1];
-				this.authority = c[2];
-				this.path = c[3];
-				this.query = c[4];
-				this.fragment = c[5];
-			}
-		}
-		// Initial values on the prototype
-		URI.prototype.scheme    = null;
-		URI.prototype.authority = null;
-		URI.prototype.path      = '';
-		URI.prototype.query     = null;
-		URI.prototype.fragment  = null;
-
-		// Regular expression from RFC 3986 appendix B
-		var parseRegex = new RegExp('^(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?$');
-
-		/**
-		 * Returns the scheme part of the URI.
-		 * In "http://example.com:80/a/b?x#y" this is "http".
-		 */
-		URI.prototype.getScheme = function() {
-			return this.scheme;
-		};
-
-		/**
-		 * Returns the authority part of the URI.
-		 * In "http://example.com:80/a/b?x#y" this is "example.com:80".
-		 */
-		URI.prototype.getAuthority = function() {
-			return this.authority;
-		};
-
-		/**
-		 * Returns the path part of the URI.
-		 * In "http://example.com:80/a/b?x#y" this is "/a/b".
-		 * In "mailto:mike@example.com" this is "mike@example.com".
-		 */
-		URI.prototype.getPath = function() {
-			return this.path;
-		};
-
-		/**
-		 * Returns the query part of the URI.
-		 * In "http://example.com:80/a/b?x#y" this is "x".
-		 */
-		URI.prototype.getQuery = function() {
-			return this.query;
-		};
-
-		/**
-		 * Returns the fragment part of the URI.
-		 * In "http://example.com:80/a/b?x#y" this is "y".
-		 */
-		URI.prototype.getFragment = function() {
-			return this.fragment;
-		};
-
-		/**
-		 * Tests whether the URI is an absolute URI.
-		 * See RFC 3986 section 4.3.
-		 */
-		URI.prototype.isAbsolute = function() {
-			return !!this.scheme && !this.fragment;
-		};
-
-		///**
-		//* Extensive validation of the URI against the ABNF in RFC 3986
-		//*/
-		//URI.prototype.validate
-
-		/**
-		 * Tests whether the URI is a same-document reference.
-		 * See RFC 3986 section 4.4.
-		 *
-		 * To perform more thorough comparison, you can normalise the URI objects.
-		 */
-		URI.prototype.isSameDocumentAs = function(uri) {
-			return uri.scheme == this.scheme &&
-			    uri.authority == this.authority &&
-			         uri.path == this.path &&
-			        uri.query == this.query;
-		};
-
-		/**
-		 * Simple String Comparison of two URIs.
-		 * See RFC 3986 section 6.2.1.
-		 *
-		 * To perform more thorough comparison, you can normalise the URI objects.
-		 */
-		URI.prototype.equals = function(uri) {
-			return this.isSameDocumentAs(uri) && uri.fragment == this.fragment;
-		};
-
-		/**
-		 * Normalizes the URI using syntax-based normalization.
-		 * This includes case normalization, percent-encoding normalization and path segment normalization.
-		 * XXX: Percent-encoding normalization does not escape characters that need to be escaped.
-		 *      (Although that would not be a valid URI in the first place. See validate().)
-		 * See RFC 3986 section 6.2.2.
-		 */
-		URI.prototype.normalize = function() {
-			this.removeDotSegments();
-			if (this.scheme)
-				this.scheme = this.scheme.toLowerCase();
-			if (this.authority)
-				this.authority = this.authority.replace(authorityRegex, replaceAuthority).
-										replace(caseRegex, replaceCase);
-			if (this.path)
-				this.path = this.path.replace(caseRegex, replaceCase);
-			if (this.query)
-				this.query = this.query.replace(caseRegex, replaceCase);
-			if (this.fragment)
-				this.fragment = this.fragment.replace(caseRegex, replaceCase);
-		};
-
-		var caseRegex = /%[0-9a-z]{2}/gi;
-		var percentRegex = /[a-zA-Z0-9\-\._~]/;
-		var authorityRegex = /(.*@)?([^@:]*)(:.*)?/;
-
-		function replaceCase(str) {
-			var dec = unescape(str);
-			return percentRegex.test(dec) ? dec : str.toUpperCase();
-		}
-
-		function replaceAuthority(str, p1, p2, p3) {
-			return (p1 || '') + p2.toLowerCase() + (p3 || '');
-		}
-
-		/**
-		 * Resolve a relative URI (this) against a base URI.
-		 * The base URI must be an absolute URI.
-		 * See RFC 3986 section 5.2
-		 */
-		URI.prototype.resolve = function(baseURI) {
-			var uri = new URI();
-			if (this.scheme) {
-				uri.scheme = this.scheme;
-				uri.authority = this.authority;
-				uri.path = this.path;
-				uri.query = this.query;
-			} else {
-				uri.scheme = baseURI.scheme;
-				if (this.authority) {
-					uri.authority = this.authority;
-					uri.path = this.path;
-					uri.query = this.query;
-				} else {
-					uri.authority = baseURI.authority;
-					if (this.path == '') {
-						uri.path = baseURI.path;
-						uri.query = this.query || baseURI.query;
-					} else {
-						if (this.path.charAt(0) == '/') {
-							uri.path = this.path;
-							uri.removeDotSegments();
-						} else {
-							if (baseURI.authority && baseURI.path == '') {
-								uri.path = '/' + this.path;
-							} else {
-								uri.path = baseURI.path.substring(0, baseURI.path.lastIndexOf('/') + 1) + this.path;
-							}
-							uri.removeDotSegments();
-						}
-						uri.query = this.query;
-					}
-				}
-			}
-			uri.fragment = this.fragment;
-			return uri;
-		};
-
-		/**
-		 * Remove dot segments from path.
-		 * See RFC 3986 section 5.2.4
-		 * @private
-		 */
-		URI.prototype.removeDotSegments = function() {
-			var input = this.path.split('/'),
-				output = [],
-				segment,
-				absPath = input[0] == '';
-			if (absPath)
-				input.shift();
-			var sFirst = input[0] == '' ? input.shift() : null;
-			while (input.length) {
-				segment = input.shift();
-				if (segment == '..') {
-					output.pop();
-				} else if (segment != '.') {
-					output.push(segment);
-				}
-			}
-			if (segment == '.' || segment == '..')
-				output.push('');
-			if (absPath)
-				output.unshift('');
-			this.path = output.join('/');
-		};
-
-		// We don't like this function because it builds up a cache that is never cleared.
-	//	/**
-	//	 * Resolves a relative URI against an absolute base URI.
-	//	 * Convenience method.
-	//	 * @param {String} uri the relative URI to resolve
-	//	 * @param {String} baseURI the base URI (must be absolute) to resolve against
-	//	 */
-	//	URI.resolve = function(sURI, sBaseURI) {
-	//		var uri = cache[sURI] || (cache[sURI] = new URI(sURI));
-	//		var baseURI = cache[sBaseURI] || (cache[sBaseURI] = new URI(sBaseURI));
-	//		return uri.resolve(baseURI).toString();
-	//	};
-
-	//	var cache = {};
-
-		/**
-		 * Serialises the URI to a string.
-		 */
-		URI.prototype.toString = function() {
-			var result = '';
-			if (this.scheme)
-				result += this.scheme + ':';
-			if (this.authority)
-				result += '//' + this.authority;
-			result += this.path;
-			if (this.query)
-				result += '?' + this.query;
-			if (this.fragment)
-				result += '#' + this.fragment;
-			return result;
-		};
-
-	/**
-	     * @private
-	     */
-	    function appendForwardSlash(url) {
-	        if (url.length === 0 || url[url.length - 1] !== '/') {
-	            url = url + '/';
-	        }
-	        return url;
-	    }
-
-	/**
-	     * Clones an object, returning a new object containing the same properties.
-	     *
-	     * @exports clone
-	     *
-	     * @param {Object} object The object to clone.
-	     * @param {Boolean} [deep=false] If true, all properties will be deep cloned recursively.
-	     * @returns {Object} The cloned object.
-	     */
-	    function clone(object, deep) {
-	        if (object === null || typeof object !== 'object') {
-	            return object;
-	        }
-
-	        deep = when.defaultValue(deep, false);
-
-	        var result = new object.constructor();
-	        for ( var propertyName in object) {
-	            if (object.hasOwnProperty(propertyName)) {
-	                var value = object[propertyName];
-	                if (deep) {
-	                    value = clone(value, deep);
-	                }
-	                result[propertyName] = value;
-	            }
-	        }
-
-	        return result;
-	    }
-
-	/**
-	     * Merges two objects, copying their properties onto a new combined object. When two objects have the same
-	     * property, the value of the property on the first object is used.  If either object is undefined,
-	     * it will be treated as an empty object.
-	     *
-	     * @example
-	     * var object1 = {
-	     *     propOne : 1,
-	     *     propTwo : {
-	     *         value1 : 10
-	     *     }
-	     * }
-	     * var object2 = {
-	     *     propTwo : 2
-	     * }
-	     * var final = Cesium.combine(object1, object2);
-	     *
-	     * // final === {
-	     * //     propOne : 1,
-	     * //     propTwo : {
-	     * //         value1 : 10
-	     * //     }
-	     * // }
-	     *
-	     * @param {Object} [object1] The first object to merge.
-	     * @param {Object} [object2] The second object to merge.
-	     * @param {Boolean} [deep=false] Perform a recursive merge.
-	     * @returns {Object} The combined object containing all properties from both objects.
-	     *
-	     * @exports combine
-	     */
-	    function combine(object1, object2, deep) {
-	        deep = when.defaultValue(deep, false);
-
-	        var result = {};
-
-	        var object1Defined = when.defined(object1);
-	        var object2Defined = when.defined(object2);
-	        var property;
-	        var object1Value;
-	        var object2Value;
-	        if (object1Defined) {
-	            for (property in object1) {
-	                if (object1.hasOwnProperty(property)) {
-	                    object1Value = object1[property];
-	                    if (object2Defined && deep && typeof object1Value === 'object' && object2.hasOwnProperty(property)) {
-	                        object2Value = object2[property];
-	                        if (typeof object2Value === 'object') {
-	                            result[property] = combine(object1Value, object2Value, deep);
-	                        } else {
-	                            result[property] = object1Value;
-	                        }
-	                    } else {
-	                        result[property] = object1Value;
-	                    }
-	                }
-	            }
-	        }
-	        if (object2Defined) {
-	            for (property in object2) {
-	                if (object2.hasOwnProperty(property) && !result.hasOwnProperty(property)) {
-	                    object2Value = object2[property];
-	                    result[property] = object2Value;
-	                }
-	            }
-	        }
-	        return result;
-	    }
-
-	/**
-	     * Given a relative Uri and a base Uri, returns the absolute Uri of the relative Uri.
-	     * @exports getAbsoluteUri
-	     *
-	     * @param {String} relative The relative Uri.
-	     * @param {String} [base] The base Uri.
-	     * @returns {String} The absolute Uri of the given relative Uri.
-	     *
-	     * @example
-	     * //absolute Uri will be "https://test.com/awesome.png";
-	     * var absoluteUri = Cesium.getAbsoluteUri('awesome.png', 'https://test.com');
-	     */
-	    function getAbsoluteUri(relative, base) {
-	        var documentObject;
-	        if (typeof document !== 'undefined') {
-	            documentObject = document;
-	        }
-
-	        return getAbsoluteUri._implementation(relative, base, documentObject);
-	    }
-
-	    getAbsoluteUri._implementation = function(relative, base, documentObject) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(relative)) {
-	            throw new Check.DeveloperError('relative uri is required.');
-	        }
-	        //>>includeEnd('debug');
-
-	        if (!when.defined(base)) {
-	            if (typeof documentObject === 'undefined') {
-	                return relative;
-	            }
-	            base = when.defaultValue(documentObject.baseURI, documentObject.location.href);
-	        }
-
-	        var baseUri = new URI(base);
-	        var relativeUri = new URI(relative);
-	        return relativeUri.resolve(baseUri).toString();
-	    };
-
-	/**
-	     * Given a URI, returns the base path of the URI.
-	     * @exports getBaseUri
-	     *
-	     * @param {String} uri The Uri.
-	     * @param {Boolean} [includeQuery = false] Whether or not to include the query string and fragment form the uri
-	     * @returns {String} The base path of the Uri.
-	     *
-	     * @example
-	     * // basePath will be "/Gallery/";
-	     * var basePath = Cesium.getBaseUri('/Gallery/simple.czml?value=true&example=false');
-	     *
-	     * // basePath will be "/Gallery/?value=true&example=false";
-	     * var basePath = Cesium.getBaseUri('/Gallery/simple.czml?value=true&example=false', true);
-	     */
-	    function getBaseUri(uri, includeQuery) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(uri)) {
-	            throw new Check.DeveloperError('uri is required.');
-	        }
-	        //>>includeEnd('debug');
-
-	        var basePath = '';
-	        var i = uri.lastIndexOf('/');
-	        if (i !== -1) {
-	            basePath = uri.substring(0, i + 1);
-	        }
-
-	        if (!includeQuery) {
-	            return basePath;
-	        }
-
-	        uri = new URI(uri);
-	        if (when.defined(uri.query)) {
-	            basePath += '?' + uri.query;
-	        }
-	        if (when.defined(uri.fragment)){
-	            basePath += '#' + uri.fragment;
-	        }
-
-	        return basePath;
-	    }
-
-	/**
-	     * Given a URI, returns the extension of the URI.
-	     * @exports getExtensionFromUri
-	     *
-	     * @param {String} uri The Uri.
-	     * @returns {String} The extension of the Uri.
-	     *
-	     * @example
-	     * //extension will be "czml";
-	     * var extension = Cesium.getExtensionFromUri('/Gallery/simple.czml?value=true&example=false');
-	     */
-	    function getExtensionFromUri(uri) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(uri)) {
-	            throw new Check.DeveloperError('uri is required.');
-	        }
-	        //>>includeEnd('debug');
-
-	        var uriObject = new URI(uri);
-	        uriObject.normalize();
-	        var path = uriObject.path;
-	        var index = path.lastIndexOf('/');
-	        if (index !== -1) {
-	            path = path.substr(index + 1);
-	        }
-	        index = path.lastIndexOf('.');
-	        if (index === -1) {
-	            path = '';
-	        } else {
-	            path = path.substr(index + 1);
-	        }
-	        return path;
-	    }
-
-	var blobUriRegex = /^blob:/i;
-
-	    /**
-	     * Determines if the specified uri is a blob uri.
-	     *
-	     * @exports isBlobUri
-	     *
-	     * @param {String} uri The uri to test.
-	     * @returns {Boolean} true when the uri is a blob uri; otherwise, false.
-	     *
-	     * @private
-	     */
-	    function isBlobUri(uri) {
-	        //>>includeStart('debug', pragmas.debug);
-	        Check.Check.typeOf.string('uri', uri);
-	        //>>includeEnd('debug');
-
-	        return blobUriRegex.test(uri);
-	    }
-
-	var a;
-
-	    /**
-	     * Given a URL, determine whether that URL is considered cross-origin to the current page.
-	     *
-	     * @private
-	     */
-	    function isCrossOriginUrl(url) {
-	        if (!when.defined(a)) {
-	            a = document.createElement('a');
-	        }
-
-	        // copy window location into the anchor to get consistent results
-	        // when the port is default for the protocol (e.g. 80 for HTTP)
-	        a.href = window.location.href;
-
-	        // host includes both hostname and port if the port is not standard
-	        var host = a.host;
-	        var protocol = a.protocol;
-
-	        a.href = url;
-	        // IE only absolutizes href on get, not set
-	        a.href = a.href; // eslint-disable-line no-self-assign
-
-	        return protocol !== a.protocol || host !== a.host;
-	    }
-
-	var dataUriRegex = /^data:/i;
-
-	    /**
-	     * Determines if the specified uri is a data uri.
-	     *
-	     * @exports isDataUri
-	     *
-	     * @param {String} uri The uri to test.
-	     * @returns {Boolean} true when the uri is a data uri; otherwise, false.
-	     *
-	     * @private
-	     */
-	    function isDataUri(uri) {
-	        //>>includeStart('debug', pragmas.debug);
-	        Check.Check.typeOf.string('uri', uri);
-	        //>>includeEnd('debug');
-
-	        return dataUriRegex.test(uri);
-	    }
-
-	/**
-	     * @private
-	     */
-	    function loadAndExecuteScript(url) {
-	        var deferred = when.when.defer();
-	        var script = document.createElement('script');
-	        script.async = true;
-	        script.src = url;
-
-	        var head = document.getElementsByTagName('head')[0];
-	        script.onload = function() {
-	            script.onload = undefined;
-	            head.removeChild(script);
-	            deferred.resolve();
-	        };
-	        script.onerror = function(e) {
-	            deferred.reject(e);
-	        };
-
-	        head.appendChild(script);
-
-	        return deferred.promise;
-	    }
-
-	/**
-	     * Converts an object representing a set of name/value pairs into a query string,
-	     * with names and values encoded properly for use in a URL.  Values that are arrays
-	     * will produce multiple values with the same name.
-	     * @exports objectToQuery
-	     *
-	     * @param {Object} obj The object containing data to encode.
-	     * @returns {String} An encoded query string.
-	     *
-	     *
-	     * @example
-	     * var str = Cesium.objectToQuery({
-	     *     key1 : 'some value',
-	     *     key2 : 'a/b',
-	     *     key3 : ['x', 'y']
-	     * });
-	     *
-	     * @see queryToObject
-	     * // str will be:
-	     * // 'key1=some%20value&key2=a%2Fb&key3=x&key3=y'
-	     */
-	    function objectToQuery(obj, donotEncodeSpecialCharacters) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(obj)) {
-	            throw new Check.DeveloperError('obj is required.');
-	        }
-	        //>>includeEnd('debug');
-
-	        var result = '';
-	        for ( var propName in obj) {
-	            if (obj.hasOwnProperty(propName)) {
-	                var value = obj[propName];
-
-	                var part = encodeURIComponent(propName) + '=';
-	                if (Array.isArray(value)) {
-	                    for (var i = 0, len = value.length; i < len; ++i) {
-	                        if (donotEncodeSpecialCharacters === true) {
-	                            result += part + encodeURI(value[i]) + '&';
-	                        } else {
-	                            result += part + encodeURIComponent(value[i]) + '&';
-	                        }
-	                    }
-	                } else {
-	                    if (donotEncodeSpecialCharacters === true) {
-	                        result += part + encodeURI(value) + '&';
-	                    } else {
-	                        result += part + encodeURIComponent(value) + '&';
-	                    }
-	                }
-	            }
-	        }
-
-	        // trim last &
-	        result = result.slice(0, -1);
-
-	        // This function used to replace %20 with + which is more compact and readable.
-	        // However, some servers didn't properly handle + as a space.
-	        // https://github.com/CesiumGS/cesium/issues/2192
-
-	        return result;
-	    }
-
-	/**
-	     * Parses a query string into an object, where the keys and values of the object are the
-	     * name/value pairs from the query string, decoded. If a name appears multiple times,
-	     * the value in the object will be an array of values.
-	     * @exports queryToObject
-	     *
-	     * @param {String} queryString The query string.
-	     * @returns {Object} An object containing the parameters parsed from the query string.
-	     *
-	     *
-	     * @example
-	     * var obj = Cesium.queryToObject('key1=some%20value&key2=a%2Fb&key3=x&key3=y');
-	     * // obj will be:
-	     * // {
-	     * //   key1 : 'some value',
-	     * //   key2 : 'a/b',
-	     * //   key3 : ['x', 'y']
-	     * // }
-	     *
-	     * @see objectToQuery
-	     */
-	    function queryToObject(queryString) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(queryString)) {
-	            throw new Check.DeveloperError('queryString is required.');
-	        }
-	        //>>includeEnd('debug');
-
-	        var result = {};
-	        if (queryString === '') {
-	            return result;
-	        }
-	        var parts = queryString.replace(/\+/g, '%20').split(/[&;]/);
-	        for (var i = 0, len = parts.length; i < len; ++i) {
-	            var subparts = parts[i].split('=');
-	            if (subparts.length > 2) {
-	                var index = parts[i].indexOf("=");
-	                var key = parts[i].substring(0, index);
-	                var strvalue = parts[i].substring(index + 1, parts[i].length);
-	                subparts = [key, strvalue];
-	            }
-	            var name = decodeURIComponent(subparts[0]);
-	            var value = subparts[1];
-	            if (when.defined(value)) {
-	                value = decodeURIComponent(value);
-	            } else {
-	                value = '';
-	            }
-
-	            var resultValue = result[name];
-	            if (typeof resultValue === 'string') {
-	                // expand the single value to an array
-	                result[name] = [resultValue, value];
-	            } else if (Array.isArray(resultValue)) {
-	                resultValue.push(value);
-	            } else {
-	                result[name] = value;
-	            }
-	        }
-	        return result;
-	    }
-
-	/**
-	     * State of the request.
-	     *
-	     * @exports RequestState
-	     */
-	    var RequestState = {
-	        /**
-	         * Initial unissued state.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        UNISSUED : 0,
-
-	        /**
-	         * Issued but not yet active. Will become active when open slots are available.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        ISSUED : 1,
-
-	        /**
-	         * Actual http request has been sent.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        ACTIVE : 2,
-
-	        /**
-	         * Request completed successfully.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        RECEIVED : 3,
-
-	        /**
-	         * Request was cancelled, either explicitly or automatically because of low priority.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        CANCELLED : 4,
-
-	        /**
-	         * Request failed.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        FAILED : 5
-	    };
-	var RequestState$1 = Object.freeze(RequestState);
-
-	/**
-	     * An enum identifying the type of request. Used for finer grained logging and priority sorting.
-	     *
-	     * @exports RequestType
-	     */
-	    var RequestType = {
-	        /**
-	         * Terrain request.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        TERRAIN : 0,
-
-	        /**
-	         * Imagery request.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        IMAGERY : 1,
-
-	        /**
-	         * 3D Tiles request.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        TILES3D : 2,
-
-	        /**
-	         * Other request.
-	         *
-	         * @type Number
-	         * @constant
-	         */
-	        OTHER : 3,
-	        PACK : 4,
-	        BLOCK : 5,
-	        BLOCKPACK : 6
-	    };
-
-	    var RequestType$1 = Object.freeze(RequestType);
-
-	/**
-	     * Stores information for making a request. In general this does not need to be constructed directly.
-	     *
-	     * @alias Request
-	     * @constructor
-	     * @namespace
-	     * @exports Request
-	     * @param {Object} [options] An object with the following properties:
-	     * @param {String} [options.url] The url to request.
-	     * @param {Request~RequestCallback} [options.requestFunction] The function that makes the actual data request.
-	     * @param {Request~CancelCallback} [options.cancelFunction] The function that is called when the request is cancelled.
-	     * @param {Request~PriorityCallback} [options.priorityFunction] The function that is called to update the request's priority, which occurs once per frame.
-	     * @param {Number} [options.priority=0.0] The initial priority of the request.
-	     * @param {Boolean} [options.throttle=false] Whether to throttle and prioritize the request. If false, the request will be sent immediately. If true, the request will be throttled and sent based on priority.
-	     * @param {Boolean} [options.throttleByServer=false] Whether to throttle the request by server.
-	     * @param {RequestType} [options.type=RequestType.OTHER] The type of request.
-	     */
-	    function Request(options) {
-	        options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-	        var throttleByServer = when.defaultValue(options.throttleByServer, false);
-	        var throttle = when.defaultValue(options.throttle, false);
-
-	        /**
-	         * The URL to request.
-	         *
-	         * @type {String}
-	         */
-	        this.url = options.url;
-
-	        /**
-	         * The function that makes the actual data request.
-	         *
-	         * @type {Request~RequestCallback}
-	         */
-	        this.requestFunction = options.requestFunction;
-
-	        /**
-	         * The function that is called when the request is cancelled.
-	         *
-	         * @type {Request~CancelCallback}
-	         */
-	        this.cancelFunction = options.cancelFunction;
-
-	        /**
-	         * The function that is called to update the request's priority, which occurs once per frame.
-	         *
-	         * @type {Request~PriorityCallback}
-	         */
-	        this.priorityFunction = options.priorityFunction;
-
-	        /**
-	         * Priority is a unit-less value where lower values represent higher priority.
-	         * For world-based objects, this is usually the distance from the camera.
-	         * A request that does not have a priority function defaults to a priority of 0.
-	         *
-	         * If priorityFunction is defined, this value is updated every frame with the result of that call.
-	         *
-	         * @type {Number}
-	         * @default 0.0
-	         */
-	        this.priority = when.defaultValue(options.priority, 0.0);
-
-	        /**
-	         * Whether to throttle and prioritize the request. If false, the request will be sent immediately. If true, the
-	         * request will be throttled and sent based on priority.
-	         *
-	         * @type {Boolean}
-	         * @readonly
-	         *
-	         * @default false
-	         */
-	        this.throttle = throttle;
-
-	        /**
-	         * Whether to throttle the request by server. Browsers typically support about 6-8 parallel connections
-	         * for HTTP/1 servers, and an unlimited amount of connections for HTTP/2 servers. Setting this value
-	         * to <code>true</code> is preferable for requests going through HTTP/1 servers.
-	         *
-	         * @type {Boolean}
-	         * @readonly
-	         *
-	         * @default false
-	         */
-	        this.throttleByServer = throttleByServer;
-
-	        /**
-	         * Type of request.
-	         *
-	         * @type {RequestType}
-	         * @readonly
-	         *
-	         * @default RequestType.OTHER
-	         */
-	        this.type = when.defaultValue(options.type, RequestType$1.OTHER);
-
-	        /**
-	         * A key used to identify the server that a request is going to. It is derived from the url's authority and scheme.
-	         *
-	         * @type {String}
-	         *
-	         * @private
-	         */
-	        this.serverKey = undefined;
-
-	        /**
-	         * The current state of the request.
-	         *
-	         * @type {RequestState}
-	         * @readonly
-	         */
-	        this.state = RequestState$1.UNISSUED;
-
-	        /**
-	         * The requests's deferred promise.
-	         *
-	         * @type {Object}
-	         *
-	         * @private
-	         */
-	        this.deferred = undefined;
-
-	        /**
-	         * Whether the request was explicitly cancelled.
-	         *
-	         * @type {Boolean}
-	         *
-	         * @private
-	         */
-	        this.cancelled = false;
-	    }
-
-	    /**
-	     * Mark the request as cancelled.
-	     *
-	     * @private
-	     */
-	    Request.prototype.cancel = function() {
-	        this.cancelled = true;
-	    };
-
-	    /**
-	     * Duplicates a Request instance.
-	     *
-	     * @param {Request} [result] The object onto which to store the result.
-	     *
-	     * @returns {Request} The modified result parameter or a new Resource instance if one was not provided.
-	     */
-	    Request.prototype.clone = function(result) {
-	        if (!when.defined(result)) {
-	            return new Request(this);
-	        }
-
-	        result.url = this.url;
-	        result.requestFunction = this.requestFunction;
-	        result.cancelFunction = this.cancelFunction;
-	        result.priorityFunction = this.priorityFunction;
-	        result.priority = this.priority;
-	        result.throttle = this.throttle;
-	        result.throttleByServer = this.throttleByServer;
-	        result.type = this.type;
-	        result.serverKey = this.serverKey;
-
-	        // These get defaulted because the cloned request hasn't been issued
-	        result.state = this.RequestState.UNISSUED;
-	        result.deferred = undefined;
-	        result.cancelled = false;
-
-	        return result;
-	    };
-
-	/**
-	     * Parses the result of XMLHttpRequest's getAllResponseHeaders() method into
-	     * a dictionary.
-	     *
-	     * @exports parseResponseHeaders
-	     *
-	     * @param {String} headerString The header string returned by getAllResponseHeaders().  The format is
-	     *                 described here: http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders()-method
-	     * @returns {Object} A dictionary of key/value pairs, where each key is the name of a header and the corresponding value
-	     *                   is that header's value.
-	     *
-	     * @private
-	     */
-	    function parseResponseHeaders(headerString) {
-	        var headers = {};
-
-	        if (!headerString) {
-	          return headers;
-	        }
-
-	        var headerPairs = headerString.split('\u000d\u000a');
-
-	        for (var i = 0; i < headerPairs.length; ++i) {
-	          var headerPair = headerPairs[i];
-	          // Can't use split() here because it does the wrong thing
-	          // if the header value has the string ": " in it.
-	          var index = headerPair.indexOf('\u003a\u0020');
-	          if (index > 0) {
-	            var key = headerPair.substring(0, index);
-	            var val = headerPair.substring(index + 2);
-	            headers[key] = val;
-	          }
-	        }
-
-	        return headers;
-	    }
-
-	/**
-	     * An event that is raised when a request encounters an error.
-	     *
-	     * @constructor
-	     * @alias RequestErrorEvent
-	     *
-	     * @param {Number} [statusCode] The HTTP error status code, such as 404.
-	     * @param {Object} [response] The response included along with the error.
-	     * @param {String|Object} [responseHeaders] The response headers, represented either as an object literal or as a
-	     *                        string in the format returned by XMLHttpRequest's getAllResponseHeaders() function.
-	     */
-	    function RequestErrorEvent(statusCode, response, responseHeaders) {
-	        /**
-	         * The HTTP error status code, such as 404.  If the error does not have a particular
-	         * HTTP code, this property will be undefined.
-	         *
-	         * @type {Number}
-	         */
-	        this.statusCode = statusCode;
-
-	        /**
-	         * The response included along with the error.  If the error does not include a response,
-	         * this property will be undefined.
-	         *
-	         * @type {Object}
-	         */
-	        this.response = response;
-
-	        /**
-	         * The headers included in the response, represented as an object literal of key/value pairs.
-	         * If the error does not include any headers, this property will be undefined.
-	         *
-	         * @type {Object}
-	         */
-	        this.responseHeaders = responseHeaders;
-
-	        if (typeof this.responseHeaders === 'string') {
-	            this.responseHeaders = parseResponseHeaders(this.responseHeaders);
-	        }
-	    }
-
-	    /**
-	     * Creates a string representing this RequestErrorEvent.
-	     * @memberof RequestErrorEvent
-	     *
-	     * @returns {String} A string representing the provided RequestErrorEvent.
-	     */
-	    RequestErrorEvent.prototype.toString = function() {
-	        var str = 'Request has failed.';
-	        if (when.defined(this.statusCode)) {
-	            str += ' Status Code: ' + this.statusCode;
-	        }
-	        return str;
-	    };
-
-	/**
-	     * A generic utility class for managing subscribers for a particular event.
-	     * This class is usually instantiated inside of a container class and
-	     * exposed as a property for others to subscribe to.
-	     *
-	     * @alias Event
-	     * @constructor
-	     * @example
-	     * MyObject.prototype.myListener = function(arg1, arg2) {
-	     *     this.myArg1Copy = arg1;
-	     *     this.myArg2Copy = arg2;
-	     * }
-	     *
-	     * var myObjectInstance = new MyObject();
-	     * var evt = new Cesium.Event();
-	     * evt.addEventListener(MyObject.prototype.myListener, myObjectInstance);
-	     * evt.raiseEvent('1', '2');
-	     * evt.removeEventListener(MyObject.prototype.myListener);
-	     */
-	    function Event() {
-	        this._listeners = [];
-	        this._scopes = [];
-	        this._toRemove = [];
-	        this._insideRaiseEvent = false;
-	    }
-
-	    Object.defineProperties(Event.prototype, {
-	        /**
-	         * The number of listeners currently subscribed to the event.
-	         * @memberof Event.prototype
-	         * @type {Number}
-	         * @readonly
-	         */
-	        numberOfListeners : {
-	            get : function() {
-	                return this._listeners.length - this._toRemove.length;
-	            }
-	        }
-	    });
-
-	    /**
-	     * Registers a callback function to be executed whenever the event is raised.
-	     * An optional scope can be provided to serve as the <code>this</code> pointer
-	     * in which the function will execute.
-	     *
-	     * @param {Function} listener The function to be executed when the event is raised.
-	     * @param {Object} [scope] An optional object scope to serve as the <code>this</code>
-	     *        pointer in which the listener function will execute.
-	     * @returns {Event~RemoveCallback} A function that will remove this event listener when invoked.
-	     *
-	     * @see Event#raiseEvent
-	     * @see Event#removeEventListener
-	     */
-	    Event.prototype.addEventListener = function(listener, scope) {
-	        //>>includeStart('debug', pragmas.debug);
-	        Check.Check.typeOf.func('listener', listener);
-	        //>>includeEnd('debug');
-
-	        this._listeners.push(listener);
-	        this._scopes.push(scope);
-
-	        var event = this;
-	        return function() {
-	            event.removeEventListener(listener, scope);
-	        };
-	    };
-
-	    /**
-	     * Unregisters a previously registered callback.
-	     *
-	     * @param {Function} listener The function to be unregistered.
-	     * @param {Object} [scope] The scope that was originally passed to addEventListener.
-	     * @returns {Boolean} <code>true</code> if the listener was removed; <code>false</code> if the listener and scope are not registered with the event.
-	     *
-	     * @see Event#addEventListener
-	     * @see Event#raiseEvent
-	     */
-	    Event.prototype.removeEventListener = function(listener, scope) {
-	        //>>includeStart('debug', pragmas.debug);
-	        Check.Check.typeOf.func('listener', listener);
-	        //>>includeEnd('debug');
-
-	        var listeners = this._listeners;
-	        var scopes = this._scopes;
-
-	        var index = -1;
-	        for (var i = 0; i < listeners.length; i++) {
-	            if (listeners[i] === listener && scopes[i] === scope) {
-	                index = i;
-	                break;
-	            }
-	        }
-
-	        if (index !== -1) {
-	            if (this._insideRaiseEvent) {
-	                //In order to allow removing an event subscription from within
-	                //a callback, we don't actually remove the items here.  Instead
-	                //remember the index they are at and undefined their value.
-	                this._toRemove.push(index);
-	                listeners[index] = undefined;
-	                scopes[index] = undefined;
-	            } else {
-	                listeners.splice(index, 1);
-	                scopes.splice(index, 1);
-	            }
-	            return true;
-	        }
-
-	        return false;
-	    };
-
-	    function compareNumber(a,b) {
-	        return b - a;
-	    }
-
-	    /**
-	     * Raises the event by calling each registered listener with all supplied arguments.
-	     *
-	     * @param {*} arguments This method takes any number of parameters and passes them through to the listener functions.
-	     *
-	     * @see Event#addEventListener
-	     * @see Event#removeEventListener
-	     */
-	    Event.prototype.raiseEvent = function() {
-	        this._insideRaiseEvent = true;
-
-	        var i;
-	        var listeners = this._listeners;
-	        var scopes = this._scopes;
-	        var length = listeners.length;
-
-	        for (i = 0; i < length; i++) {
-	            var listener = listeners[i];
-	            if (when.defined(listener)) {
-	                listeners[i].apply(scopes[i], arguments);
-	            }
-	        }
-
-	        //Actually remove items removed in removeEventListener.
-	        var toRemove = this._toRemove;
-	        length = toRemove.length;
-	        if (length > 0) {
-	            toRemove.sort(compareNumber);
-	            for (i = 0; i < length; i++) {
-	                var index = toRemove[i];
-	                listeners.splice(index, 1);
-	                scopes.splice(index, 1);
-	            }
-	            toRemove.length = 0;
-	        }
-
-	        this._insideRaiseEvent = false;
-	    };
-
-	/**
-	     * Array implementation of a heap.
-	     *
-	     * @alias Heap
-	     * @constructor
-	     * @private
-	     *
-	     * @param {Object} options Object with the following properties:
-	     * @param {Heap~ComparatorCallback} options.comparator The comparator to use for the heap. If comparator(a, b) is less than 0, sort a to a lower index than b, otherwise sort to a higher index.
-	     */
-	    function Heap(options) {
-	        //>>includeStart('debug', pragmas.debug);
-	        Check.Check.typeOf.object('options', options);
-	        Check.Check.defined('options.comparator', options.comparator);
-	        //>>includeEnd('debug');
-
-	        this._comparator = options.comparator;
-	        this._array = [];
-	        this._length = 0;
-	        this._maximumLength = undefined;
-	    }
-
-	    Object.defineProperties(Heap.prototype, {
-	        /**
-	         * Gets the length of the heap.
-	         *
-	         * @memberof Heap.prototype
-	         *
-	         * @type {Number}
-	         * @readonly
-	         */
-	        length : {
-	            get : function() {
-	                return this._length;
-	            }
-	        },
-
-	        /**
-	         * Gets the internal array.
-	         *
-	         * @memberof Heap.prototype
-	         *
-	         * @type {Array}
-	         * @readonly
-	         */
-	        internalArray : {
-	            get : function() {
-	                return this._array;
-	            }
-	        },
-
-	        /**
-	         * Gets and sets the maximum length of the heap.
-	         *
-	         * @memberof Heap.prototype
-	         *
-	         * @type {Number}
-	         */
-	        maximumLength : {
-	            get : function() {
-	                return this._maximumLength;
-	            },
-	            set : function(value) {
-	                this._maximumLength = value;
-	                if (this._length > value && value > 0) {
-	                    this._length = value;
-	                    this._array.length = value;
-	                }
-	            }
-	        },
-
-	        /**
-	         * The comparator to use for the heap. If comparator(a, b) is less than 0, sort a to a lower index than b, otherwise sort to a higher index.
-	         *
-	         * @memberof Heap.prototype
-	         *
-	         * @type {Heap~ComparatorCallback}
-	         */
-	        comparator : {
-	            get : function() {
-	                return this._comparator;
-	            }
-	        }
-	    });
-
-	    function swap(array, a, b) {
-	        var temp = array[a];
-	        array[a] = array[b];
-	        array[b] = temp;
-	    }
-
-	    /**
-	     * Resizes the internal array of the heap.
-	     *
-	     * @param {Number} [length] The length to resize internal array to. Defaults to the current length of the heap.
-	     */
-	    Heap.prototype.reserve = function(length) {
-	        length = when.defaultValue(length, this._length);
-	        this._array.length = length;
-	    };
-
-	    /**
-	     * Update the heap so that index and all descendants satisfy the heap property.
-	     *
-	     * @param {Number} [index=0] The starting index to heapify from.
-	     */
-	    Heap.prototype.heapify = function(index) {
-	        index = when.defaultValue(index, 0);
-	        var length = this._length;
-	        var comparator = this._comparator;
-	        var array = this._array;
-	        var candidate = -1;
-	        var inserting = true;
-
-	        while (inserting) {
-	            var right = 2 * (index + 1);
-	            var left = right - 1;
-
-	            if (left < length && comparator(array[left], array[index]) < 0) {
-	                candidate = left;
-	            } else {
-	                candidate = index;
-	            }
-
-	            if (right < length && comparator(array[right], array[candidate]) < 0) {
-	                candidate = right;
-	            }
-	            if (candidate !== index) {
-	                swap(array, candidate, index);
-	                index = candidate;
-	            } else {
-	                inserting = false;
-	            }
-	        }
-	    };
-
-	    /**
-	     * Resort the heap.
-	     */
-	    Heap.prototype.resort = function() {
-	        var length = this._length;
-	        for (var i = Math.ceil(length / 2); i >= 0; --i) {
-	            this.heapify(i);
-	        }
-	    };
-
-	    /**
-	     * Insert an element into the heap. If the length would grow greater than maximumLength
-	     * of the heap, extra elements are removed.
-	     *
-	     * @param {*} element The element to insert
-	     *
-	     * @return {*} The element that was removed from the heap if the heap is at full capacity.
-	     */
-	    Heap.prototype.insert = function(element) {
-	        //>>includeStart('debug', pragmas.debug);
-	        Check.Check.defined('element', element);
-	        //>>includeEnd('debug');
-
-	        var array = this._array;
-	        var comparator = this._comparator;
-	        var maximumLength = this._maximumLength;
-
-	        var index = this._length++;
-	        if (index < array.length) {
-	            array[index] = element;
-	        } else {
-	            array.push(element);
-	        }
-
-	        while (index !== 0) {
-	            var parent = Math.floor((index - 1) / 2);
-	            if (comparator(array[index], array[parent]) < 0) {
-	                swap(array, index, parent);
-	                index = parent;
-	            } else {
-	                break;
-	            }
-	        }
-
-	        var removedElement;
-
-	        if (when.defined(maximumLength) && (this._length > maximumLength)) {
-	            removedElement = array[maximumLength];
-	            array.pop();
-	            this._length = maximumLength;
-	        }
-
-	        return removedElement;
-	    };
-
-	    /**
-	     * Remove the element specified by index from the heap and return it.
-	     *
-	     * @param {Number} [index=0] The index to remove.
-	     * @returns {*} The specified element of the heap.
-	     */
-	    Heap.prototype.pop = function(index) {
-	        index = when.defaultValue(index, 0);
-	        if (this._length === 0) {
-	            return undefined;
-	        }
-	        //>>includeStart('debug', pragmas.debug);
-	        Check.Check.typeOf.number.lessThan('index', index, this._length);
-	        //>>includeEnd('debug');
-
-	        var array = this._array;
-	        var root = array[index];
-	        swap(array, index, --this._length);
-	        array[this._length] = undefined;
-	        this.heapify(index);
-	        return root;
-	    };
-
-	/**
-	     * Gets a timestamp that can be used in measuring the time between events.  Timestamps
-	     * are expressed in milliseconds, but it is not specified what the milliseconds are
-	     * measured from.  This function uses performance.now() if it is available, or Date.now()
-	     * otherwise.
-	     *
-	     * @exports getTimestamp
-	     *
-	     * @returns {Number} The timestamp in milliseconds since some unspecified reference time.
-	     */
-	    var getTimestamp;
-
-	    if (typeof performance !== 'undefined' && typeof performance.now === 'function' && isFinite(performance.now())) {
-	        getTimestamp = function() {
-	            return performance.now();
-	        };
-	    } else {
-	        getTimestamp = function() {
-	            return Date.now();
-	        };
-	    }
-	var getTimestamp$1 = getTimestamp;
-
-	function sortRequests(a, b) {
-	    return a.priority - b.priority;
-	}
-
-	var statistics = {
-	    numberOfAttemptedRequests : 0,
-	    numberOfActiveRequests : 0,
-	    numberOfCancelledRequests : 0,
-	    numberOfCancelledActiveRequests : 0,
-	    numberOfFailedRequests : 0,
-	    numberOfActiveRequestsEver : 0,
-	    lastNumberOfActiveRequests : 0,
-	    totalRequestTime : 0
-	};
-
-	var priorityHeapLength = 20;
-	var requestHeap = new Heap({
-	    comparator : sortRequests
-	});
-	requestHeap.maximumLength = priorityHeapLength;
-	requestHeap.reserve(priorityHeapLength);
-
-	var activeRequests = [];
-	var numberOfActiveRequestsByServer = {};
-
-	var pageUri = typeof document !== 'undefined' ? new URI(document.location.href) : new URI();
-
-	var requestCompletedEvent = new Event();
-
-	/**
-	 * Tracks the number of active requests and prioritizes incoming requests.
-	 *
-	 * @exports RequestScheduler
-	 *
-	 * @private
-	 */
-	function RequestScheduler() {
-	}
-
-	RequestScheduler.statisticRequestTime = -1;
-
-	/**
-	 * The maximum number of simultaneous active requests. Un-throttled requests do not observe this limit.
-	 * @type {Number}
-	 * @default 50
-	 */
-	RequestScheduler.maximumRequests = 50;
-
-	/**
-	 * The maximum number of simultaneous active requests per server. Un-throttled requests or servers specifically
-	 * listed in requestsByServer do not observe this limit.
-	 * @type {Number}
-	 * @default 6
-	 */
-	RequestScheduler.maximumRequestsPerServer = 6;
-
-	RequestScheduler.perPacketCount = 20;//批量下载,每帧每个包的最大请求数限制,默认是20,不超过120
-
-
-	/**
-	 * A per serverKey list of overrides to use for throttling instead of maximumRequestsPerServer
-	 */
-	RequestScheduler.requestsByServer = {
-	    'api.cesium.com:443': 18,
-	    'assets.cesium.com:443': 18
-	};
-
-	/**
-	 * Specifies if the request scheduler should throttle incoming requests, or let the browser queue requests under its control.
-	 * @type {Boolean}
-	 * @default true
-	 */
-	RequestScheduler.throttleRequests = true;
-
-	/**
-	 * When true, log statistics to the console every frame
-	 * @type {Boolean}
-	 * @default false
-	 */
-	RequestScheduler.debugShowStatistics = false;
-
-	/**
-	 * An event that's raised when a request is completed.  Event handlers are passed
-	 * the error object if the request fails.
-	 *
-	 * @type {Event}
-	 * @default Event()
-	 */
-	RequestScheduler.requestCompletedEvent = requestCompletedEvent;
-
-	Object.defineProperties(RequestScheduler, {
-	    /**
-	     * Returns the statistics used by the request scheduler.
-	     *
-	     * @memberof RequestScheduler
-	     *
-	     * @type Object
-	     * @readonly
-	     */
-	    statistics : {
-	        get : function() {
-	            return statistics;
-	        }
-	    },
-
-	    /**
-	     * The maximum size of the priority heap. This limits the number of requests that are sorted by priority. Only applies to requests that are not yet active.
-	     *
-	     * @memberof RequestScheduler
-	     *
-	     * @type {Number}
-	     * @default 20
-	     */
-	    priorityHeapLength : {
-	        get : function() {
-	            return priorityHeapLength;
-	        },
-	        set : function(value) {
-	            // If the new length shrinks the heap, need to cancel some of the requests.
-	            // Since this value is not intended to be tweaked regularly it is fine to just cancel the high priority requests.
-	            if (value < priorityHeapLength) {
-	                while (requestHeap.length > value) {
-	                    var request = requestHeap.pop();
-	                    cancelRequest(request);
-	                }
-	            }
-	            priorityHeapLength = value;
-	            requestHeap.maximumLength = value;
-	            requestHeap.reserve(value);
-	        }
-	    }
-	});
-
-	function updatePriority(request) {
-	    if (when.defined(request.priorityFunction)) {
-	        request.priority = request.priorityFunction();
-	    }
-	}
-
-	function serverHasOpenSlots(serverKey) {
-	    var maxRequests = when.defaultValue(RequestScheduler.requestsByServer[serverKey], RequestScheduler.maximumRequestsPerServer);
-	    return numberOfActiveRequestsByServer[serverKey] < maxRequests;
-	}
-
-
-	RequestScheduler.packRequestGroup = {};//每帧的所有需要打包的请求 : (serverIP + provider name), value :[request, request,...]
-	RequestScheduler.packRequestPromise = {};//每帧打包请求的promise  (serverIP + provider name) : defer
-	RequestScheduler.packRequestQuadKey = {};//请求包的四叉树编码 (serverIP + provider name) : (quadkey;quadkey;...)
-	RequestScheduler.quadKeyIndex = {};//记录当前四叉树编码数组的索引
-	RequestScheduler.packRequestHeap = {};//每个图层对应一个二叉堆(serverIp + provider name) : heap
-
-	RequestScheduler.blockDefer = {};
-	RequestScheduler.blockRequest = {};
-
-	function getRequestKey(request) {
-	    if(when.defined(request.packKey)){
-	        return request.packKey;
-	    }
-
-	    request.packKey = request.serverKey + '_' + request.providerName;
-	    return request.packKey;
-	}
-
-	function getRequestBlockKey(request){
-	    if(when.defined(request.blockKey)){
-	        return request.blockKey;
-	    }
-
-	    request.blockKey = request.serverKey + '_' + request.providerName + '_' + request.quadKey + request.url.substring(request.url.indexOf("dataVersion"));
-	    return request.blockKey;
-	}
-
-	function preparePackRequest (request) {
-	    var packKey = getRequestKey(request);
-	    if(!when.defined(RequestScheduler.packRequestGroup[packKey])) {
-	        RequestScheduler.packRequestGroup[packKey] = [];
-	    }
-
-	    if(!when.defined(RequestScheduler.packRequestQuadKey[packKey])) {
-	        RequestScheduler.packRequestQuadKey[packKey] = '';
-	    }
-
-	    if(!when.defined(RequestScheduler.packRequestPromise[packKey])) {
-	        RequestScheduler.packRequestPromise[packKey] = when.when.defer();
-	    }
-
-	    if(!when.defined(RequestScheduler.quadKeyIndex[packKey])) {
-	        RequestScheduler.quadKeyIndex[packKey] = 0;
-	    }
-
-	    request.quadKeyIndex = RequestScheduler.quadKeyIndex[packKey]++;
-	    request.deferred = RequestScheduler.packRequestPromise[packKey];
-	    request.state = RequestState$1.ISSUED;
-	    RequestScheduler.packRequestGroup[packKey].push(request);
-	    return request.deferred.promise;
-	}
-
-	function prepareBlockRequest(request) {
-	    var key = getRequestBlockKey(request);
-	    var deferred = RequestScheduler.blockDefer[key];
-	    if(!when.defined(deferred)) {
-	        deferred = RequestScheduler.blockDefer[key] = when.when.defer();
-	        RequestScheduler.blockRequest[key] = request;
-	    }
-
-	    request.deferred = deferred;
-	    request.state = RequestState$1.ISSUED;
-	    return request.deferred.promise;
-	}
-
-	function clearRequestPackets() {
-	    RequestScheduler.packRequestGroup = {};
-	    RequestScheduler.packRequestPromise = {};
-	    RequestScheduler.packRequestQuadKey = {};
-	    RequestScheduler.quadKeyIndex = {};
-	}
-
-	function clearBlockRequest() {
-	    RequestScheduler.blockRequest = {};
-	}
-
-	function cancelAllRequests(requests) {
-	    for(var i = 0,j = requests.length;i < j;i++) {
-	        var request = requests[i];
-	        request.state = RequestState$1.CANCELLED;
-	    }
-	}
-
-	function combineQuadkey(reqGroup) {
-	    var quadkeys = [];
-	    var keyMap = {};
-	    for(var i = 0,j = reqGroup.length;i < j;i++){
-	        var request = reqGroup[i];
-	        if(request.cancelled){
-	            continue ;
-	        }
-	        var quadKey = request.quadKey;
-	        if(keyMap[quadKey]){
-	            continue;
-	        }
-	        keyMap[quadKey] = true;
-	        quadkeys.push(quadKey);
-	    }
-	    return quadkeys;
-	}
-
-	function startPackingRequest() {
-	    var packRequestGroup = RequestScheduler.packRequestGroup;
-	    for(var key in packRequestGroup) {
-	        if(packRequestGroup.hasOwnProperty(key)) {
-	            var reqGroup = packRequestGroup[key];
-	            if(reqGroup.length < 1) {
-	                continue ;
-	            }
-
-	            var packRequest = reqGroup[0].clone();
-	            var isTileMap = packRequest.url.indexOf("rest/maps") !== -1;
-	            packRequest.serverKey = reqGroup[0].serverKey;
-	            packRequest.state = reqGroup[0].state;
-	            var oldUrl = packRequest.url;
-
-	            var quadKeys = combineQuadkey(reqGroup);
-	            if(quadKeys.length < 1){
-	                continue ;
-	            }
-
-	            if (isTileMap) {
-	                RequestScheduler.packRequestQuadKey[key] = quadKeys.join(',');
-	            } else {
-	                RequestScheduler.packRequestQuadKey[key] = quadKeys.join(';');
-	            }
-	            
-
-	            var quadKey = RequestScheduler.packRequestQuadKey[key];
-	            if (packRequest.throttleByServer && !serverHasOpenSlots(packRequest.serverKey)) {
-	                cancelAllRequests(reqGroup);
-	                RequestScheduler.packRequestPromise[key].reject();
-	                continue;
-	            }
-
-	            packRequest.deferred = RequestScheduler.packRequestPromise[key];
-	            var uri = new URI(oldUrl);
-	            if (isTileMap) {
-	                uri.query = when.defined(uri.query) ? uri.query + '&tiles=' + quadKey : 'tiles=' + quadKey;
-	            } else {
-	                uri.query = when.defined(uri.query) ? uri.query + '&extratiles=' + quadKey : 'extratiles=' + quadKey;
-	            }
-	            
-	            packRequest.url = uri.toString();
-	            startRequest(packRequest, packRequest.url);
-	        }
-	    }
-
-	    clearRequestPackets();
-	}
-
-	function updateBlockRequest() {
-	    var blockRequest = RequestScheduler.blockRequest;
-	    for(var key in blockRequest) {
-	        if(blockRequest.hasOwnProperty(key)) {
-	            var request = blockRequest[key];
-	            startRequest(request);
-	        }
-	    }
-
-	    clearBlockRequest();
-	}
-
-	function issueRequest(request) {
-	    if (request.state === RequestState$1.UNISSUED) {
-	        request.state = RequestState$1.ISSUED;
-	        if(request.type === RequestType$1.PACK || request.type === RequestType$1.BLOCKPACK){
-	            var packKey = getRequestKey(request);
-	            if(!when.defined(RequestScheduler.packRequestPromise[packKey])) {
-	                RequestScheduler.packRequestPromise[packKey] = when.when.defer();
-	            }
-
-	            request.deferred = RequestScheduler.packRequestPromise[packKey];
-
-	        }
-	        else{
-	            request.deferred = when.when.defer();
-	        }
-	    }
-	    return request.deferred.promise;
-	}
-
-	function getRequestReceivedFunction(request) {
-	    return function(results) {
-	        if (request.state === RequestState$1.CANCELLED) {
-	            // If the data request comes back but the request is cancelled, ignore it.
-	            return;
-	        }
-	        --statistics.numberOfActiveRequests;
-	        --numberOfActiveRequestsByServer[request.serverKey];
-	        requestCompletedEvent.raiseEvent();
-	        request.state = RequestState$1.RECEIVED;
-	        request.deferred.resolve(results);
-	        request.endTime = getTimestamp$1();
-	        if(RequestScheduler.statisticRequestTime > 0 ||  request.type !== RequestType$1.OTHER) {
-	            statistics.totalRequestTime += request.endTime - request.startTime;
-	        }
-
-	        if(request.type === RequestType$1.BLOCK || request.type === RequestType$1.BLOCKPACK){
-	            var key = getRequestBlockKey(request);
-	            if(when.defined(RequestScheduler.blockDefer[key])){
-	                RequestScheduler.blockDefer[key] = undefined;
-	                delete RequestScheduler.blockDefer[key];
-	            }
-
-	        }
-	    };
-	}
-
-	function getRequestFailedFunction(request) {
-	    return function(error) {
-	        if (request.state === RequestState$1.CANCELLED) {
-	            // If the data request comes back but the request is cancelled, ignore it.
-	            return;
-	        }
-	        ++statistics.numberOfFailedRequests;
-	        --statistics.numberOfActiveRequests;
-	        --numberOfActiveRequestsByServer[request.serverKey];
-	        requestCompletedEvent.raiseEvent(error);
-	        request.state = RequestState$1.FAILED;
-	        request.deferred.reject(error);
-	    };
-	}
-
-	function startRequest(request, url) {
-	    var promise = issueRequest(request);
-	    request.state = RequestState$1.ACTIVE;
-	    activeRequests.push(request);
-	    ++statistics.numberOfActiveRequests;
-	    ++statistics.numberOfActiveRequestsEver;
-	    ++numberOfActiveRequestsByServer[request.serverKey];
-	    request.startTime = getTimestamp$1();
-	    request.requestFunction(url).then(getRequestReceivedFunction(request)).otherwise(getRequestFailedFunction(request));
-	    return promise;
-	}
-
-	function cancelRequest(request) {
-	    var active = request.state === RequestState$1.ACTIVE;
-	    request.state = RequestState$1.CANCELLED;
-	    ++statistics.numberOfCancelledRequests;
-	    request.deferred.reject();
-
-	    if (active) {
-	        --statistics.numberOfActiveRequests;
-	        --numberOfActiveRequestsByServer[request.serverKey];
-	        ++statistics.numberOfCancelledActiveRequests;
-	    }
-
-	    if (when.defined(request.cancelFunction)) {
-	        request.cancelFunction();
-	    }
-	}
-
-	function updatePackRequestHeap() {
-	    for(var key in RequestScheduler.packRequestHeap) {
-	        if(RequestScheduler.packRequestHeap.hasOwnProperty(key)) {
-	            var heap = RequestScheduler.packRequestHeap[key];
-	            var issuedRequests = heap.internalArray;
-	            var issuedLength = heap.length;
-	            for (var i = 0; i < issuedLength; ++i) {
-	                updatePriority(issuedRequests[i]);
-	            }
-	            heap.resort();
-	        }
-	    }
-	}
-
-	function packingRequest() {
-	    for(var key in RequestScheduler.packRequestHeap) {
-	        if(RequestScheduler.packRequestHeap.hasOwnProperty(key)) {
-	            var heap = RequestScheduler.packRequestHeap[key];
-	            while(heap.length > 0) {
-	                var request = heap.pop();
-	                if (request.cancelled) {
-	                    cancelRequest(request);
-	                    continue;
-	                }
-
-	                preparePackRequest(request);
-	            }
-	        }
-	    }
-
-	    startPackingRequest();
-	}
-
-	/**
-	 * Sort requests by priority and start requests.
-	 */
-	RequestScheduler.update = function() {
-	    var i;
-	    var request;
-
-	    // Loop over all active requests. Cancelled, failed, or received requests are removed from the array to make room for new requests.
-	    var removeCount = 0;
-	    var activeLength = activeRequests.length;
-	    for (i = 0; i < activeLength; ++i) {
-	        request = activeRequests[i];
-	        if (request.cancelled) {
-	            // Request was explicitly cancelled
-	            cancelRequest(request);
-	        }
-	        if (request.state !== RequestState$1.ACTIVE) {
-	            // Request is no longer active, remove from array
-	            ++removeCount;
-	            continue;
-	        }
-	        if (removeCount > 0) {
-	            // Shift back to fill in vacated slots from completed requests
-	            activeRequests[i - removeCount] = request;
-	        }
-	    }
-	    activeRequests.length -= removeCount;
-
-	    // Update priority of issued requests and resort the heap
-	    var issuedRequests = requestHeap.internalArray;
-	    var issuedLength = requestHeap.length;
-	    for (i = 0; i < issuedLength; ++i) {
-	        updatePriority(issuedRequests[i]);
-	    }
-	    requestHeap.resort();
-
-	    updatePackRequestHeap();
-	    updateBlockRequest();
-
-	    packingRequest();
-
-	    // Get the number of open slots and fill with the highest priority requests.
-	    // Un-throttled requests are automatically added to activeRequests, so activeRequests.length may exceed maximumRequests
-	    var openSlots = Math.max(RequestScheduler.maximumRequests - activeRequests.length, 0);
-	    var filledSlots = 0;
-	    while (filledSlots < openSlots && requestHeap.length > 0) {
-	        // Loop until all open slots are filled or the heap becomes empty
-	        request = requestHeap.pop();
-	        if (request.cancelled) {
-	            // Request was explicitly cancelled
-	            cancelRequest(request);
-	            continue;
-	        }
-
-	        if (request.throttleByServer && !serverHasOpenSlots(request.serverKey)) {
-	            // Open slots are available, but the request is throttled by its server. Cancel and try again later.
-	            cancelRequest(request);
-	            continue;
-	        }
-
-	        startRequest(request);
-
-	        ++filledSlots;
-	    }
-
-	    updateStatistics();
-	};
-
-	/**
-	 * Get the server key from a given url.
-	 *
-	 * @param {String} url The url.
-	 * @returns {String} The server key.
-	 */
-	RequestScheduler.getServerKey = function(url) {
-	    //>>includeStart('debug', pragmas.debug);
-	    Check.Check.typeOf.string('url', url);
-	    //>>includeEnd('debug');
-
-	    var uri = new URI(url).resolve(pageUri);
-	    uri.normalize();
-	    var serverKey = uri.authority;
-	    if (!/:/.test(serverKey)) {
-	        // If the authority does not contain a port number, add port 443 for https or port 80 for http
-	        serverKey = serverKey + ':' + (uri.scheme === 'https' ? '443' : '80');
-	    }
-
-	    var length = numberOfActiveRequestsByServer[serverKey];
-	    if (!when.defined(length)) {
-	        numberOfActiveRequestsByServer[serverKey] = 0;
-	    }
-
-	    return serverKey;
-	};
-
-	function getPackRequestHeap(request) {
-	    var packKey = getRequestKey(request);
-	    var heap = RequestScheduler.packRequestHeap[packKey];
-	    if(!when.defined(heap)) {
-	        heap = RequestScheduler.packRequestHeap[packKey] = new Heap({
-	            comparator : sortRequests
-	        });
-	        heap.maximumLength = RequestScheduler.perPacketCount;
-	        heap.reserve(priorityHeapLength);
-	    }
-
-	    return heap;
-	}
-
-	/**
-	 * Issue a request. If request.throttle is false, the request is sent immediately. Otherwise the request will be
-	 * queued and sorted by priority before being sent.
-	 *
-	 * @param {Request} request The request object.
-	 *
-	 * @returns {Promise|undefined} A Promise for the requested data, or undefined if this request does not have high enough priority to be issued.
-	 */
-	RequestScheduler.request = function(request) {
-	    //>>includeStart('debug', pragmas.debug);
-	    Check.Check.typeOf.object('request', request);
-	    Check.Check.typeOf.string('request.url', request.url);
-	    Check.Check.typeOf.func('request.requestFunction', request.requestFunction);
-	    //>>includeEnd('debug');
-
-	    if (isDataUri(request.url) || isBlobUri(request.url)) {
-	        requestCompletedEvent.raiseEvent();
-	        request.state = RequestState$1.RECEIVED;
-	        return request.requestFunction();
-	    }
-
-	    ++statistics.numberOfAttemptedRequests;
-
-	    if (!when.defined(request.serverKey)) {
-	        request.serverKey = RequestScheduler.getServerKey(request.url);
-	    }
-
-	    if(request.type === RequestType$1.BLOCK) {
-	        return prepareBlockRequest(request);
-	    }
-
-	    if (request.throttleByServer && !serverHasOpenSlots(request.serverKey)) {
-	        // Server is saturated. Try again later.
-	        return undefined;
-	    }
-
-	    if (!RequestScheduler.throttleRequests || !request.throttle) {
-	        return startRequest(request);
-	    }
-
-	    if (activeRequests.length >= RequestScheduler.maximumRequests) {
-	        // Active requests are saturated. Try again later.
-	        return undefined;
-	    }
-
-	    // Insert into the priority heap and see if a request was bumped off. If this request is the lowest
-	    // priority it will be returned.
-	    updatePriority(request);
-	    var removedRequest;
-	    if(request.type === RequestType$1.PACK || request.type === RequestType$1.BLOCKPACK) {
-	        var packRequestHeap = getPackRequestHeap(request);
-
-
-	        var inset = true;
-	        if(request.type === RequestType$1.BLOCKPACK){
-	            for(var i=0; i<packRequestHeap.length; i++){
-	                if(packRequestHeap._array[i].quadKey === request.quadKey){
-	                    request.blockRequest = packRequestHeap._array[i];
-	                    inset = false;
-	                    break;
-	                }
-	            }
-	        }
-
-	        if(inset){
-	            removedRequest = packRequestHeap.insert(request);
-	        }
-
-	    }
-	    else{
-	        removedRequest = requestHeap.insert(request);
-	    }
-
-	    if (when.defined(removedRequest)) {
-	        if (removedRequest === request) {
-	            // Request does not have high enough priority to be issued
-	            return undefined;
-	        }
-	        // A previously issued request has been bumped off the priority heap, so cancel it
-	        cancelRequest(removedRequest);
-	    }
-
-	    return issueRequest(request);
-	};
-
-	function updateStatistics() {
-	    if (!RequestScheduler.debugShowStatistics) {
-	        return;
-	    }
-
-	    if (statistics.numberOfActiveRequests === 0 && statistics.lastNumberOfActiveRequests > 0) {
-	        if (statistics.numberOfAttemptedRequests > 0) {
-	            console.log('Number of attempted requests: ' + statistics.numberOfAttemptedRequests);
-	            statistics.numberOfAttemptedRequests = 0;
-	        }
-
-	        if (statistics.numberOfCancelledRequests > 0) {
-	            console.log('Number of cancelled requests: ' + statistics.numberOfCancelledRequests);
-	            statistics.numberOfCancelledRequests = 0;
-	        }
-
-	        if (statistics.numberOfCancelledActiveRequests > 0) {
-	            console.log('Number of cancelled active requests: ' + statistics.numberOfCancelledActiveRequests);
-	            statistics.numberOfCancelledActiveRequests = 0;
-	        }
-
-	        if (statistics.numberOfFailedRequests > 0) {
-	            console.log('Number of failed requests: ' + statistics.numberOfFailedRequests);
-	            statistics.numberOfFailedRequests = 0;
-	        }
-	    }
-
-	    statistics.lastNumberOfActiveRequests = statistics.numberOfActiveRequests;
-	}
-
-	/**
-	 * For testing only. Clears any requests that may not have completed from previous tests.
-	 *
-	 * @private
-	 */
-	RequestScheduler.clearForSpecs = function() {
-	    while (requestHeap.length > 0) {
-	        var request = requestHeap.pop();
-	        cancelRequest(request);
-	    }
-	    var length = activeRequests.length;
-	    for (var i = 0; i < length; ++i) {
-	        cancelRequest(activeRequests[i]);
-	    }
-	    activeRequests.length = 0;
-	    numberOfActiveRequestsByServer = {};
-
-	    // Clear stats
-	    statistics.numberOfAttemptedRequests = 0;
-	    statistics.numberOfActiveRequests = 0;
-	    statistics.numberOfCancelledRequests = 0;
-	    statistics.numberOfCancelledActiveRequests = 0;
-	    statistics.numberOfFailedRequests = 0;
-	    statistics.numberOfActiveRequestsEver = 0;
-	    statistics.lastNumberOfActiveRequests = 0;
-	    statistics.totalRequestTime = 0;
-	};
-
-	/**
-	 * For testing only.
-	 *
-	 * @private
-	 */
-	RequestScheduler.numberOfActiveRequestsByServer = function(serverKey) {
-	    return numberOfActiveRequestsByServer[serverKey];
-	};
-
-	/**
-	 * For testing only.
-	 *
-	 * @private
-	 */
-	RequestScheduler.requestHeap = requestHeap;
-
-	/**
-	     * A singleton that contains all of the servers that are trusted. Credentials will be sent with
-	     * any requests to these servers.
-	     *
-	     * @exports TrustedServers
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     */
-	    var TrustedServers = {};
-	    var _servers = {};
-
-	    /**
-	     * Adds a trusted server to the registry
-	     *
-	     * @param {String} host The host to be added.
-	     * @param {Number} port The port used to access the host.
-	     *
-	     * @example
-	     * // Add a trusted server
-	     * TrustedServers.add('my.server.com', 80);
-	     */
-	    TrustedServers.add = function(host, port) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(host)) {
-	            throw new Check.DeveloperError('host is required.');
-	        }
-	        if (!when.defined(port) || port <= 0) {
-	            throw new Check.DeveloperError('port is required to be greater than 0.');
-	        }
-	        //>>includeEnd('debug');
-
-	        var authority = host.toLowerCase() + ':' + port;
-	        if (!when.defined(_servers[authority])) {
-	            _servers[authority] = true;
-	        }
-	    };
-
-	    /**
-	     * Removes a trusted server from the registry
-	     *
-	     * @param {String} host The host to be removed.
-	     * @param {Number} port The port used to access the host.
-	     *
-	     * @example
-	     * // Remove a trusted server
-	     * TrustedServers.remove('my.server.com', 80);
-	     */
-	    TrustedServers.remove = function(host, port) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(host)) {
-	            throw new Check.DeveloperError('host is required.');
-	        }
-	        if (!when.defined(port) || port <= 0) {
-	            throw new Check.DeveloperError('port is required to be greater than 0.');
-	        }
-	        //>>includeEnd('debug');
-
-	        var authority = host.toLowerCase() + ':' + port;
-	        if (when.defined(_servers[authority])) {
-	            delete _servers[authority];
-	        }
-	    };
-
-	    function getAuthority(url) {
-	        var uri = new URI(url);
-	        uri.normalize();
-
-	        // Removes username:password@ so we just have host[:port]
-	        var authority = uri.getAuthority();
-	        if (!when.defined(authority)) {
-	            return undefined; // Relative URL
-	        }
-
-	        if (authority.indexOf('@') !== -1) {
-	            var parts = authority.split('@');
-	            authority = parts[1];
-	        }
-
-	        // If the port is missing add one based on the scheme
-	        if (authority.indexOf(':') === -1) {
-	            var scheme = uri.getScheme();
-	            if (!when.defined(scheme)) {
-	                scheme = window.location.protocol;
-	                scheme = scheme.substring(0, scheme.length-1);
-	            }
-	            if (scheme === 'http') {
-	                authority += ':80';
-	            } else if (scheme === 'https') {
-	                authority += ':443';
-	            } else {
-	                return undefined;
-	            }
-	        }
-
-	        return authority;
-	    }
-
-	    /**
-	     * Tests whether a server is trusted or not. The server must have been added with the port if it is included in the url.
-	     *
-	     * @param {String} url The url to be tested against the trusted list
-	     *
-	     * @returns {boolean} Returns true if url is trusted, false otherwise.
-	     *
-	     * @example
-	     * // Add server
-	     * TrustedServers.add('my.server.com', 81);
-	     *
-	     * // Check if server is trusted
-	     * if (TrustedServers.contains('https://my.server.com:81/path/to/file.png')) {
-	     *     // my.server.com:81 is trusted
-	     * }
-	     * if (TrustedServers.contains('https://my.server.com/path/to/file.png')) {
-	     *     // my.server.com isn't trusted
-	     * }
-	     */
-	    TrustedServers.contains = function(url) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(url)) {
-	            throw new Check.DeveloperError('url is required.');
-	        }
-	        //>>includeEnd('debug');
-	        var authority = getAuthority(url);
-	        if (when.defined(authority) && when.defined(_servers[authority])) {
-	            return true;
-	        }
-
-	        return false;
-	    };
-
-	    /**
-	     * Clears the registry
-	     *
-	     * @example
-	     * // Remove a trusted server
-	     * TrustedServers.clear();
-	     */
-	    TrustedServers.clear = function() {
-	        _servers = {};
-	    };
-
-	var warnings = {};
-
-	    /**
-	     * Logs a one time message to the console.  Use this function instead of
-	     * <code>console.log</code> directly since this does not log duplicate messages
-	     * unless it is called from multiple workers.
-	     *
-	     * @exports oneTimeWarning
-	     *
-	     * @param {String} identifier The unique identifier for this warning.
-	     * @param {String} [message=identifier] The message to log to the console.
-	     *
-	     * @example
-	     * for(var i=0;i<foo.length;++i) {
-	     *    if (!defined(foo[i].bar)) {
-	     *       // Something that can be recovered from but may happen a lot
-	     *       oneTimeWarning('foo.bar undefined', 'foo.bar is undefined. Setting to 0.');
-	     *       foo[i].bar = 0;
-	     *       // ...
-	     *    }
-	     * }
-	     *
-	     * @private
-	     */
-	    function oneTimeWarning(identifier, message) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(identifier)) {
-	            throw new Check.DeveloperError('identifier is required.');
-	        }
-	        //>>includeEnd('debug');
-
-	        if (!when.defined(warnings[identifier])) {
-	            warnings[identifier] = true;
-	            console.warn(when.defaultValue(message, identifier));
-	        }
-	    }
-
-	    oneTimeWarning.geometryOutlines = 'Entity geometry outlines are unsupported on terrain. Outlines will be disabled. To enable outlines, disable geometry terrain clamping by explicitly setting height to 0.';
-
-	    oneTimeWarning.geometryZIndex = 'Entity geometry with zIndex are unsupported when height or extrudedHeight are defined.  zIndex will be ignored';
-
-	    oneTimeWarning.geometryHeightReference = 'Entity corridor, ellipse, polygon or rectangle with heightReference must also have a defined height.  heightReference will be ignored';
-	    oneTimeWarning.geometryExtrudedHeightReference = 'Entity corridor, ellipse, polygon or rectangle with extrudedHeightReference must also have a defined extrudedHeight.  extrudedHeightReference will be ignored';
-
-	/**
-	     * Logs a deprecation message to the console.  Use this function instead of
-	     * <code>console.log</code> directly since this does not log duplicate messages
-	     * unless it is called from multiple workers.
-	     *
-	     * @exports deprecationWarning
-	     *
-	     * @param {String} identifier The unique identifier for this deprecated API.
-	     * @param {String} message The message to log to the console.
-	     *
-	     * @example
-	     * // Deprecated function or class
-	     * function Foo() {
-	     *    deprecationWarning('Foo', 'Foo was deprecated in Cesium 1.01.  It will be removed in 1.03.  Use newFoo instead.');
-	     *    // ...
-	     * }
-	     *
-	     * // Deprecated function
-	     * Bar.prototype.func = function() {
-	     *    deprecationWarning('Bar.func', 'Bar.func() was deprecated in Cesium 1.01.  It will be removed in 1.03.  Use Bar.newFunc() instead.');
-	     *    // ...
-	     * };
-	     *
-	     * // Deprecated property
-	     * Object.defineProperties(Bar.prototype, {
-	     *     prop : {
-	     *         get : function() {
-	     *             deprecationWarning('Bar.prop', 'Bar.prop was deprecated in Cesium 1.01.  It will be removed in 1.03.  Use Bar.newProp instead.');
-	     *             // ...
-	     *         },
-	     *         set : function(value) {
-	     *             deprecationWarning('Bar.prop', 'Bar.prop was deprecated in Cesium 1.01.  It will be removed in 1.03.  Use Bar.newProp instead.');
-	     *             // ...
-	     *         }
-	     *     }
-	     * });
-	     *
-	     * @private
-	     */
-	    function deprecationWarning(identifier, message) {
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(identifier) || !when.defined(message)) {
-	            throw new Check.DeveloperError('identifier and message are required.');
-	        }
-	        //>>includeEnd('debug');
-
-	        oneTimeWarning(identifier, message);
-	    }
-
-	var xhrBlobSupported = (function() {
-	        try {
-	            var xhr = new XMLHttpRequest();
-	            xhr.open('GET', '#', true);
-	            xhr.responseType = 'blob';
-	            return xhr.responseType === 'blob';
-	        } catch (e) {
-	            return false;
-	        }
-	    })();
-
-	    /**
-	     * Parses a query string and returns the object equivalent.
-	     *
-	     * @param {Uri} uri The Uri with a query object.
-	     * @param {Resource} resource The Resource that will be assigned queryParameters.
-	     * @param {Boolean} merge If true, we'll merge with the resource's existing queryParameters. Otherwise they will be replaced.
-	     * @param {Boolean} preserveQueryParameters If true duplicate parameters will be concatenated into an array. If false, keys in uri will take precedence.
-	     *
-	     * @private
-	     */
-	    function parseQuery(uri, resource, merge, preserveQueryParameters) {
-	        var queryString = uri.query;
-	        if (!when.defined(queryString) || (queryString.length === 0)) {
-	            return {};
-	        }
-
-	        var query;
-	        // Special case we run into where the querystring is just a string, not key/value pairs
-	        if (queryString.indexOf('=') === -1) {
-	            var result = {};
-	            result[queryString] = undefined;
-	            query = result;
-	        } else {
-	            query = queryToObject(queryString);
-	        }
-
-	        if (merge) {
-	            resource._queryParameters = combineQueryParameters(query, resource._queryParameters, preserveQueryParameters);
-	        } else {
-	            resource._queryParameters = query;
-	        }
-	        uri.query = undefined;
-	    }
-
-	    /**
-	     * Converts a query object into a string.
-	     *
-	     * @param {Uri} uri The Uri object that will have the query object set.
-	     * @param {Resource} resource The resource that has queryParameters
-	     *
-	     * @private
-	     */
-	    function stringifyQuery(uri, resource) {
-	        var queryObject = resource._queryParameters;
-
-	        var keys = Object.keys(queryObject);
-
-	        // We have 1 key with an undefined value, so this is just a string, not key/value pairs
-	        if (keys.length === 1 && !when.defined(queryObject[keys[0]])) {
-	            uri.query = keys[0];
-	        } else {
-	            uri.query = objectToQuery(queryObject);
-	        }
-	    }
-
-	    /**
-	     * Clones a value if it is defined, otherwise returns the default value
-	     *
-	     * @param {*} [val] The value to clone.
-	     * @param {*} [defaultVal] The default value.
-	     *
-	     * @returns {*} A clone of val or the defaultVal.
-	     *
-	     * @private
-	     */
-	    function defaultClone(val, defaultVal) {
-	        if (!when.defined(val)) {
-	            return defaultVal;
-	        }
-
-	        return when.defined(val.clone) ? val.clone() : clone(val);
-	    }
-
-	    /**
-	     * Checks to make sure the Resource isn't already being requested.
-	     *
-	     * @param {Request} request The request to check.
-	     *
-	     * @private
-	     */
-	    function checkAndResetRequest(request) {
-	        if (request.state === RequestState$1.ISSUED || request.state === RequestState$1.ACTIVE) {
-	            throw new RuntimeError.RuntimeError('The Resource is already being fetched.');
-	        }
-
-	        request.state = RequestState$1.UNISSUED;
-	        request.deferred = undefined;
-	    }
-
-	    /**
-	     * This combines a map of query parameters.
-	     *
-	     * @param {Object} q1 The first map of query parameters. Values in this map will take precedence if preserveQueryParameters is false.
-	     * @param {Object} q2 The second map of query parameters.
-	     * @param {Boolean} preserveQueryParameters If true duplicate parameters will be concatenated into an array. If false, keys in q1 will take precedence.
-	     *
-	     * @returns {Object} The combined map of query parameters.
-	     *
-	     * @example
-	     * var q1 = {
-	     *   a: 1,
-	     *   b: 2
-	     * };
-	     * var q2 = {
-	     *   a: 3,
-	     *   c: 4
-	     * };
-	     * var q3 = {
-	     *   b: [5, 6],
-	     *   d: 7
-	     * }
-	     *
-	     * // Returns
-	     * // {
-	     * //   a: [1, 3],
-	     * //   b: 2,
-	     * //   c: 4
-	     * // };
-	     * combineQueryParameters(q1, q2, true);
-	     *
-	     * // Returns
-	     * // {
-	     * //   a: 1,
-	     * //   b: 2,
-	     * //   c: 4
-	     * // };
-	     * combineQueryParameters(q1, q2, false);
-	     *
-	     * // Returns
-	     * // {
-	     * //   a: 1,
-	     * //   b: [2, 5, 6],
-	     * //   d: 7
-	     * // };
-	     * combineQueryParameters(q1, q3, true);
-	     *
-	     * // Returns
-	     * // {
-	     * //   a: 1,
-	     * //   b: 2,
-	     * //   d: 7
-	     * // };
-	     * combineQueryParameters(q1, q3, false);
-	     *
-	     * @private
-	     */
-	    function combineQueryParameters(q1, q2, preserveQueryParameters) {
-	        if (!preserveQueryParameters) {
-	            return combine(q1, q2);
-	        }
-
-	        var result = clone(q1, true);
-	        for (var param in q2) {
-	            if (q2.hasOwnProperty(param)) {
-	                var value = result[param];
-	                var q2Value = q2[param];
-	                if (when.defined(value)) {
-	                    if (!Array.isArray(value)) {
-	                        value = result[param] = [value];
-	                    }
-
-	                    result[param] = value.concat(q2Value);
-	                } else {
-	                    result[param] = Array.isArray(q2Value) ? q2Value.slice() : q2Value;
-	                }
-	            }
-	        }
-
-	        return result;
-	    }
-
-	    /**
-	     * A resource that includes the location and any other parameters we need to retrieve it or create derived resources. It also provides the ability to retry requests.
-	     *
-	     * @alias Resource
-	     * @constructor
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     *
-	     * @example
-	     * function refreshTokenRetryCallback(resource, error) {
-	     *   if (error.statusCode === 403) {
-	     *     // 403 status code means a new token should be generated
-	     *     return getNewAccessToken()
-	     *       .then(function(token) {
-	     *         resource.queryParameters.access_token = token;
-	     *         return true;
-	     *       })
-	     *       .otherwise(function() {
-	     *         return false;
-	     *       });
-	     *   }
-	     *
-	     *   return false;
-	     * }
-	     *
-	     * var resource = new Resource({
-	     *    url: 'http://server.com/path/to/resource.json',
-	     *    proxy: new DefaultProxy('/proxy/'),
-	     *    headers: {
-	     *      'X-My-Header': 'valueOfHeader'
-	     *    },
-	     *    queryParameters: {
-	     *      'access_token': '123-435-456-000'
-	     *    },
-	     *    retryCallback: refreshTokenRetryCallback,
-	     *    retryAttempts: 1
-	     * });
-	     */
-	    function Resource(options) {
-	        options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-	        if (typeof options === 'string') {
-	            options = {
-	                url: options
-	            };
-	        }
-
-	        //>>includeStart('debug', pragmas.debug);
-	        Check.Check.typeOf.string('options.url', options.url);
-	        //>>includeEnd('debug');
-
-	        this._url = undefined;
-	        this._templateValues = defaultClone(options.templateValues, {});
-	        this._queryParameters = defaultClone(options.queryParameters, {});
-
-	        /**
-	         * Additional HTTP headers that will be sent with the request.
-	         *
-	         * @type {Object}
-	         */
-	        this.headers = defaultClone(options.headers, {});
-
-	        /**
-	         * A Request object that will be used. Intended for internal use only.
-	         *
-	         * @type {Request}
-	         */
-	        this.request = when.defaultValue(options.request, new Request());
-
-	        /**
-	         * A proxy to be used when loading the resource.
-	         *
-	         * @type {DefaultProxy}
-	         */
-	        this.proxy = options.proxy;
-
-	        /**
-	         * Function to call when a request for this resource fails. If it returns true or a Promise that resolves to true, the request will be retried.
-	         *
-	         * @type {Function}
-	         */
-	        this.retryCallback = options.retryCallback;
-
-	        /**
-	         * The number of times the retryCallback should be called before giving up.
-	         *
-	         * @type {Number}
-	         */
-	        this.retryAttempts = when.defaultValue(options.retryAttempts, 0);
-	        this._retryCount = 0;
-
-	        var uri = new URI(options.url);
-	        parseQuery(uri, this, true, true);
-
-	        // Remove the fragment as it's not sent with a request
-	        uri.fragment = undefined;
-
-	        this._url = uri.toString();
-	    }
-
-	    /**
-	     * A helper function to create a resource depending on whether we have a String or a Resource
-	     *
-	     * @param {Resource|String} resource A Resource or a String to use when creating a new Resource.
-	     *
-	     * @returns {Resource} If resource is a String, a Resource constructed with the url and options. Otherwise the resource parameter is returned.
-	     *
-	     * @private
-	     */
-	    Resource.createIfNeeded = function(resource) {
-	        if (resource instanceof Resource) {
-	            // Keep existing request object. This function is used internally to duplicate a Resource, so that it can't
-	            //  be modified outside of a class that holds it (eg. an imagery or terrain provider). Since the Request objects
-	            //  are managed outside of the providers, by the tile loading code, we want to keep the request property the same so if it is changed
-	            //  in the underlying tiling code the requests for this resource will use it.
-	            return  resource.getDerivedResource({
-	                request: resource.request
-	            });
-	        }
-
-	        if (typeof resource !== 'string') {
-	            return resource;
-	        }
-
-	        return new Resource({
-	            url: resource
-	        });
-	    };
-
-	    var supportsImageBitmapOptionsPromise;
-	    /**
-	     * A helper function to check whether createImageBitmap supports passing ImageBitmapOptions.
-	     *
-	     * @returns {Promise<Boolean>} A promise that resolves to true if this browser supports creating an ImageBitmap with options.
-	     *
-	     * @private
-	     */
-	    Resource.supportsImageBitmapOptions = function() {
-	        // Until the HTML folks figure out what to do about this, we need to actually try loading an image to
-	        // know if this browser supports passing options to the createImageBitmap function.
-	        // https://github.com/whatwg/html/pull/4248
-	        if (when.defined(supportsImageBitmapOptionsPromise)) {
-	            return supportsImageBitmapOptionsPromise;
-	        }
-
-	        if (typeof createImageBitmap !== 'function') {
-	            supportsImageBitmapOptionsPromise = when.when.resolve(false);
-	            return supportsImageBitmapOptionsPromise;
-	        }
-
-	        var imageDataUri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg==';
-
-	        supportsImageBitmapOptionsPromise = Resource.fetchBlob({
-	            url : imageDataUri
-	        })
-	            .then(function(blob) {
-	                return createImageBitmap(blob, {
-	                    imageOrientation: 'flipY',
-	                    premultiplyAlpha: 'none'
-	                });
-	            })
-	            .then(function(imageBitmap) {
-	                return true;
-	            })
-	            .otherwise(function() {
-	                return false;
-	            });
-
-	        return supportsImageBitmapOptionsPromise;
-	    };
-
-	    Object.defineProperties(Resource, {
-	        /**
-	         * Returns true if blobs are supported.
-	         *
-	         * @memberof Resource
-	         * @type {Boolean}
-	         *
-	         * @readonly
-	         */
-	        isBlobSupported : {
-	            get : function() {
-	                return xhrBlobSupported;
-	            }
-	        }
-	    });
-
-	    Object.defineProperties(Resource.prototype, {
-	        /**
-	         * Query parameters appended to the url.
-	         *
-	         * @memberof Resource.prototype
-	         * @type {Object}
-	         *
-	         * @readonly
-	         */
-	        queryParameters: {
-	            get: function() {
-	                return this._queryParameters;
-	            }
-	        },
-
-	        /**
-	         * The key/value pairs used to replace template parameters in the url.
-	         *
-	         * @memberof Resource.prototype
-	         * @type {Object}
-	         *
-	         * @readonly
-	         */
-	        templateValues: {
-	            get: function() {
-	                return this._templateValues;
-	            }
-	        },
-
-	        /**
-	         * The url to the resource with template values replaced, query string appended and encoded by proxy if one was set.
-	         *
-	         * @memberof Resource.prototype
-	         * @type {String}
-	         */
-	        url: {
-	            get: function() {
-	                return this.getUrlComponent(true, true);
-	            },
-	            set: function(value) {
-	                var uri = new URI(value);
-
-	                parseQuery(uri, this, false);
-
-	                // Remove the fragment as it's not sent with a request
-	                uri.fragment = undefined;
-
-	                this._url = uri.toString();
-	            }
-	        },
-
-	        /**
-	         * The file extension of the resource.
-	         *
-	         * @memberof Resource.prototype
-	         * @type {String}
-	         *
-	         * @readonly
-	         */
-	        extension: {
-	            get: function() {
-	                return getExtensionFromUri(this._url);
-	            }
-	        },
-
-	        /**
-	         * True if the Resource refers to a data URI.
-	         *
-	         * @memberof Resource.prototype
-	         * @type {Boolean}
-	         */
-	        isDataUri: {
-	            get: function() {
-	                return isDataUri(this._url);
-	            }
-	        },
-
-	        /**
-	         * True if the Resource refers to a blob URI.
-	         *
-	         * @memberof Resource.prototype
-	         * @type {Boolean}
-	         */
-	        isBlobUri: {
-	            get: function() {
-	                return isBlobUri(this._url);
-	            }
-	        },
-
-	        /**
-	         * True if the Resource refers to a cross origin URL.
-	         *
-	         * @memberof Resource.prototype
-	         * @type {Boolean}
-	         */
-	        isCrossOriginUrl: {
-	            get: function() {
-	                return isCrossOriginUrl(this._url);
-	            }
-	        },
-
-	        /**
-	         * True if the Resource has request headers. This is equivalent to checking if the headers property has any keys.
-	         *
-	         * @memberof Resource.prototype
-	         * @type {Boolean}
-	         */
-	        hasHeaders: {
-	            get: function() {
-	                return (Object.keys(this.headers).length > 0);
-	            }
-	        }
-	    });
-
-	    /**
-	     * Returns the url, optional with the query string and processed by a proxy.
-	     *
-	     * @param {Boolean} [query=false] If true, the query string is included.
-	     * @param {Boolean} [proxy=false] If true, the url is processed the proxy object if defined.
-	     *
-	     * @returns {String} The url with all the requested components.
-	     */
-	    Resource.prototype.getUrlComponent = function(query, proxy) {
-	        if(this.isDataUri) {
-	            return this._url;
-	        }
-
-	        var uri = new URI(this._url);
-
-	        if (query) {
-	            stringifyQuery(uri, this);
-	        }
-
-	        // objectToQuery escapes the placeholders.  Undo that.
-	        var url = uri.toString().replace(/%7B/g, '{').replace(/%7D/g, '}');
-
-	        var templateValues = this._templateValues;
-	        url = url.replace(/{(.*?)}/g, function(match, key) {
-	            var replacement = templateValues[key];
-	            if (when.defined(replacement)) {
-	                // use the replacement value from templateValues if there is one...
-	                return encodeURIComponent(replacement);
-	            }
-	            // otherwise leave it unchanged
-	            return match;
-	        });
-
-	        if (proxy && when.defined(this.proxy)) {
-	            url = this.proxy.getURL(url);
-	        }
-	        return url;
-	    };
-
-	    /**
-	     * Combines the specified object and the existing query parameters. This allows you to add many parameters at once,
-	     *  as opposed to adding them one at a time to the queryParameters property. If a value is already set, it will be replaced with the new value.
-	     *
-	     * @param {Object} params The query parameters
-	     * @param {Boolean} [useAsDefault=false] If true the params will be used as the default values, so they will only be set if they are undefined.
-	     */
-	    Resource.prototype.setQueryParameters = function(params, useAsDefault) {
-	        if (useAsDefault) {
-	            this._queryParameters = combineQueryParameters(this._queryParameters, params, false);
-	        } else {
-	            this._queryParameters = combineQueryParameters(params, this._queryParameters, false);
-	        }
-	    };
-
-	    /**
-	     * Combines the specified object and the existing query parameters. This allows you to add many parameters at once,
-	     *  as opposed to adding them one at a time to the queryParameters property.
-	     *
-	     * @param {Object} params The query parameters
-	     */
-	    Resource.prototype.appendQueryParameters = function(params) {
-	        this._queryParameters = combineQueryParameters(params, this._queryParameters, true);
-	    };
-
-	    /**
-	     * Combines the specified object and the existing template values. This allows you to add many values at once,
-	     *  as opposed to adding them one at a time to the templateValues property. If a value is already set, it will become an array and the new value will be appended.
-	     *
-	     * @param {Object} template The template values
-	     * @param {Boolean} [useAsDefault=false] If true the values will be used as the default values, so they will only be set if they are undefined.
-	     */
-	    Resource.prototype.setTemplateValues = function(template, useAsDefault) {
-	        if (useAsDefault) {
-	            this._templateValues = combine(this._templateValues, template);
-	        } else {
-	            this._templateValues = combine(template, this._templateValues);
-	        }
-	    };
-
-	    /**
-	     * Returns a resource relative to the current instance. All properties remain the same as the current instance unless overridden in options.
-	     *
-	     * @param {Object} options An object with the following properties
-	     * @param {String} [options.url]  The url that will be resolved relative to the url of the current instance.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be combined with those of the current instance.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}). These will be combined with those of the current instance.
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The function to call when loading the resource fails.
-	     * @param {Number} [options.retryAttempts] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {Boolean} [options.preserveQueryParameters=false] If true, this will keep all query parameters from the current resource and derived resource. If false, derived parameters will replace those of the current resource.
-	     *
-	     * @returns {Resource} The resource derived from the current one.
-	     */
-	    Resource.prototype.getDerivedResource = function(options) {
-	        var resource = this.clone();
-	        resource._retryCount = 0;
-
-	        if (when.defined(options.url)) {
-	            var uri = new URI(options.url);
-
-	            var preserveQueryParameters = when.defaultValue(options.preserveQueryParameters, false);
-	            parseQuery(uri, resource, true, preserveQueryParameters);
-
-	            // Remove the fragment as it's not sent with a request
-	            uri.fragment = undefined;
-
-	            resource._url = uri.resolve(new URI(getAbsoluteUri(this._url))).toString();
-	        }
-
-	        if (when.defined(options.queryParameters)) {
-	            resource._queryParameters = combine(options.queryParameters, resource._queryParameters);
-	        }
-	        if (when.defined(options.templateValues)) {
-	            resource._templateValues = combine(options.templateValues, resource.templateValues);
-	        }
-	        if (when.defined(options.headers)) {
-	            resource.headers = combine(options.headers, resource.headers);
-	        }
-	        if (when.defined(options.proxy)) {
-	            resource.proxy = options.proxy;
-	        }
-	        if (when.defined(options.request)) {
-	            resource.request = options.request;
-	        }
-	        if (when.defined(options.retryCallback)) {
-	            resource.retryCallback = options.retryCallback;
-	        }
-	        if (when.defined(options.retryAttempts)) {
-	            resource.retryAttempts = options.retryAttempts;
-	        }
-
-	        return resource;
-	    };
-
-	    /**
-	     * Called when a resource fails to load. This will call the retryCallback function if defined until retryAttempts is reached.
-	     *
-	     * @param {Error} [error] The error that was encountered.
-	     *
-	     * @returns {Promise<Boolean>} A promise to a boolean, that if true will cause the resource request to be retried.
-	     *
-	     * @private
-	     */
-	    Resource.prototype.retryOnError = function(error) {
-	        var retryCallback = this.retryCallback;
-	        if ((typeof retryCallback !== 'function') || (this._retryCount >= this.retryAttempts)) {
-	            return when.when(false);
-	        }
-
-	        var that = this;
-	        return when.when(retryCallback(this, error))
-	            .then(function(result) {
-	                ++that._retryCount;
-
-	                return result;
-	            });
-	    };
-
-	    /**
-	     * Duplicates a Resource instance.
-	     *
-	     * @param {Resource} [result] The object onto which to store the result.
-	     *
-	     * @returns {Resource} The modified result parameter or a new Resource instance if one was not provided.
-	     */
-	    Resource.prototype.clone = function(result) {
-	        if (!when.defined(result)) {
-	            result = new Resource({
-	                url : this._url
-	            });
-	        }
-
-	        result._url = this._url;
-	        result._queryParameters = clone(this._queryParameters);
-	        result._templateValues = clone(this._templateValues);
-	        result.headers = clone(this.headers);
-	        result.proxy = this.proxy;
-	        result.retryCallback = this.retryCallback;
-	        result.retryAttempts = this.retryAttempts;
-	        result._retryCount = 0;
-	        result.request = this.request.clone();
-
-	        return result;
-	    };
-
-	    /**
-	     * Returns the base path of the Resource.
-	     *
-	     * @param {Boolean} [includeQuery = false] Whether or not to include the query string and fragment form the uri
-	     *
-	     * @returns {String} The base URI of the resource
-	     */
-	    Resource.prototype.getBaseUri = function(includeQuery) {
-	        return getBaseUri(this.getUrlComponent(includeQuery), includeQuery);
-	    };
-
-	    /**
-	     * Appends a forward slash to the URL.
-	     */
-	    Resource.prototype.appendForwardSlash = function() {
-	        this._url = appendForwardSlash(this._url);
-	    };
-
-	    /**
-	     * Asynchronously loads the resource as raw binary data.  Returns a promise that will resolve to
-	     * an ArrayBuffer once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @returns {Promise.<ArrayBuffer>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     * @example
-	     * // load a single URL asynchronously
-	     * resource.fetchArrayBuffer().then(function(arrayBuffer) {
-	     *     // use the data
-	     * }).otherwise(function(error) {
-	     *     // an error occurred
-	     * });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.fetchArrayBuffer = function () {
-	        return this.fetch({
-	            responseType : 'arraybuffer'
-	        });
-	    };
-
-	    /**
-	     * Creates a Resource and calls fetchArrayBuffer() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @returns {Promise.<ArrayBuffer>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.fetchArrayBuffer = function (options) {
-	        var resource = new Resource(options);
-	        return resource.fetchArrayBuffer();
-	    };
-
-	    /**
-	     * Asynchronously loads the given resource as a blob.  Returns a promise that will resolve to
-	     * a Blob once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @returns {Promise.<Blob>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     * @example
-	     * // load a single URL asynchronously
-	     * resource.fetchBlob().then(function(blob) {
-	     *     // use the data
-	     * }).otherwise(function(error) {
-	     *     // an error occurred
-	     * });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.fetchBlob = function () {
-	        return this.fetch({
-	            responseType : 'blob'
-	        });
-	    };
-
-	    /**
-	     * Creates a Resource and calls fetchBlob() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @returns {Promise.<Blob>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.fetchBlob = function (options) {
-	        var resource = new Resource(options);
-	        return resource.fetchBlob();
-	    };
-
-	    /**
-	     * Asynchronously loads the given image resource.  Returns a promise that will resolve to
-	     * an {@link https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap|ImageBitmap} if <code>preferImageBitmap</code> is true and the browser supports <code>createImageBitmap</code> or otherwise an
-	     * {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement|Image} once loaded, or reject if the image failed to load.
-	     *
-	     * @param {Object} [options] An object with the following properties.
-	     * @param {Boolean} [options.preferBlob=false] If true, we will load the image via a blob.
-	     * @param {Boolean} [options.preferImageBitmap=false] If true, image will be decoded during fetch and an <code>ImageBitmap</code> is returned.
-	     * @param {Boolean} [options.flipY=false] If true, image will be vertically flipped during decode. Only applies if the browser supports <code>createImageBitmap</code>.
-	     * @returns {Promise.<ImageBitmap>|Promise.<Image>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * // load a single image asynchronously
-	     * resource.fetchImage().then(function(image) {
-	     *     // use the loaded image
-	     * }).otherwise(function(error) {
-	     *     // an error occurred
-	     * });
-	     *
-	     * // load several images in parallel
-	     * when.all([resource1.fetchImage(), resource2.fetchImage()]).then(function(images) {
-	     *     // images is an array containing all the loaded images
-	     * });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.fetchImage = function (options) {
-	        options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-	        var preferImageBitmap = when.defaultValue(options.preferImageBitmap, false);
-	        var preferBlob = when.defaultValue(options.preferBlob, false);
-	        var flipY = when.defaultValue(options.flipY, false);
-
-	        checkAndResetRequest(this.request);
-
-	        // We try to load the image normally if
-	        // 1. Blobs aren't supported
-	        // 2. It's a data URI
-	        // 3. It's a blob URI
-	        // 4. It doesn't have request headers and we preferBlob is false
-	        if (!xhrBlobSupported || this.isDataUri || this.isBlobUri || (!this.hasHeaders && !preferBlob)) {
-	            return fetchImage({
-	                resource: this,
-	                flipY: flipY,
-	                preferImageBitmap: preferImageBitmap
-	            });
-	        }
-
-	        var blobPromise = this.fetchBlob();
-	        if (!when.defined(blobPromise)) {
-	            return;
-	        }
-
-	        var supportsImageBitmap;
-	        var useImageBitmap;
-	        var generatedBlobResource;
-	        var generatedBlob;
-	        return Resource.supportsImageBitmapOptions()
-	            .then(function(result) {
-	                supportsImageBitmap = result;
-	                useImageBitmap = supportsImageBitmap && preferImageBitmap;
-	                return blobPromise;
-	            })
-	            .then(function(blob) {
-	                if (!when.defined(blob)) {
-	                    return;
-	                }
-	                generatedBlob = blob;
-	                if (useImageBitmap) {
-	                    return Resource.createImageBitmapFromBlob(blob, {
-	                        flipY: flipY,
-	                        premultiplyAlpha: false
-	                    });
-	                }
-	                var blobUrl = window.URL.createObjectURL(blob);
-	                generatedBlobResource = new Resource({
-	                    url: blobUrl
-	                });
-
-	                return fetchImage({
-	                    resource: generatedBlobResource,
-	                    flipY: flipY,
-	                    preferImageBitmap: false
-	                });
-	            })
-	            .then(function(image) {
-	                if (!when.defined(image)) {
-	                    return;
-	                }
-
-	                // The blob object may be needed for use by a TileDiscardPolicy,
-	                // so attach it to the image.
-	                image.blob = generatedBlob;
-
-	                if (useImageBitmap) {
-	                    return image;
-	                }
-
-	                window.URL.revokeObjectURL(generatedBlobResource.url);
-	                return image;
-	            })
-	            .otherwise(function(error) {
-	                if (when.defined(generatedBlobResource)) {
-	                    window.URL.revokeObjectURL(generatedBlobResource.url);
-	                }
-
-	                // If the blob load succeeded but the image decode failed, attach the blob
-	                // to the error object for use by a TileDiscardPolicy.
-	                // In particular, BingMapsImageryProvider uses this to detect the
-	                // zero-length response that is returned when a tile is not available.
-	                error.blob = generatedBlob;
-
-	                return when.when.reject(error);
-	            });
-	    };
-
-	    /**
-	     * Fetches an image and returns a promise to it.
-	     *
-	     * @param {Object} [options] An object with the following properties.
-	     * @param {Resource} [options.resource] Resource object that points to an image to fetch.
-	     * @param {Boolean} [options.preferImageBitmap] If true, image will be decoded during fetch and an <code>ImageBitmap</code> is returned.
-	     * @param {Boolean} [options.flipY] If true, image will be vertically flipped during decode. Only applies if the browser supports <code>createImageBitmap</code>.
-	     *
-	     * @private
-	     */
-	    function fetchImage(options) {
-	        var resource = options.resource;
-	        var flipY = options.flipY;
-	        var preferImageBitmap = options.preferImageBitmap;
-
-	        var request = resource.request;
-	        request.url = resource.url;
-	        request.requestFunction = function() {
-	            var crossOrigin = false;
-
-	            // data URIs can't have crossorigin set.
-	            if (!resource.isDataUri && !resource.isBlobUri) {
-	                crossOrigin = resource.isCrossOriginUrl;
-	            }
-
-	            var deferred = when.when.defer();
-	            Resource._Implementations.createImage(request, crossOrigin, deferred, flipY, preferImageBitmap);
-
-	            return deferred.promise;
-	        };
-
-	        var promise = RequestScheduler.request(request);
-	        if (!when.defined(promise)) {
-	            return;
-	        }
-
-	        return promise
-	            .otherwise(function(e) {
-	                // Don't retry cancelled or otherwise aborted requests
-	                if (request.state !== RequestState$1.FAILED) {
-	                    return when.when.reject(e);
-	                }
-
-	                return resource.retryOnError(e)
-	                    .then(function(retry) {
-	                        if (retry) {
-	                            // Reset request so it can try again
-	                            request.state = RequestState$1.UNISSUED;
-	                            request.deferred = undefined;
-
-	                            return fetchImage({
-	                                resource: resource,
-	                                flipY: flipY,
-	                                preferImageBitmap: preferImageBitmap
-	                            });
-	                        }
-
-	                        return when.when.reject(e);
-	                    });
-	            });
-	    }
-
-	    /**
-	     * Creates a Resource and calls fetchImage() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Boolean} [options.flipY=false] Whether to vertically flip the image during fetch and decode. Only applies when requesting an image and the browser supports <code>createImageBitmap</code>.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {Boolean} [options.preferBlob=false]  If true, we will load the image via a blob.
-	     * @param {Boolean} [options.preferImageBitmap=false] If true, image will be decoded during fetch and an <code>ImageBitmap</code> is returned.
-	     * @returns {Promise.<ImageBitmap>|Promise.<Image>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.fetchImage = function (options) {
-	        var resource = new Resource(options);
-	        return resource.fetchImage({
-	            flipY: options.flipY,
-	            preferBlob: options.preferBlob,
-	            preferImageBitmap: options.preferImageBitmap
-	        });
-	    };
-
-	    /**
-	     * Asynchronously loads the given resource as text.  Returns a promise that will resolve to
-	     * a String once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @returns {Promise.<String>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     * @example
-	     * // load text from a URL, setting a custom header
-	     * var resource = new Resource({
-	     *   url: 'http://someUrl.com/someJson.txt',
-	     *   headers: {
-	     *     'X-Custom-Header' : 'some value'
-	     *   }
-	     * });
-	     * resource.fetchText().then(function(text) {
-	     *     // Do something with the text
-	     * }).otherwise(function(error) {
-	     *     // an error occurred
-	     * });
-	     *
-	     * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest|XMLHttpRequest}
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.fetchText = function() {
-	        return this.fetch({
-	            responseType : 'text'
-	        });
-	    };
-
-	    /**
-	     * Creates a Resource and calls fetchText() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @returns {Promise.<String>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.fetchText = function (options) {
-	        var resource = new Resource(options);
-	        return resource.fetchText();
-	    };
-
-	    // note: &#42;&#47;&#42; below is */* but that ends the comment block early
-	    /**
-	     * Asynchronously loads the given resource as JSON.  Returns a promise that will resolve to
-	     * a JSON object once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. This function
-	     * adds 'Accept: application/json,&#42;&#47;&#42;;q=0.01' to the request headers, if not
-	     * already specified.
-	     *
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * resource.fetchJson().then(function(jsonData) {
-	     *     // Do something with the JSON object
-	     * }).otherwise(function(error) {
-	     *     // an error occurred
-	     * });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.fetchJson = function() {
-	        var promise = this.fetch({
-	            responseType : 'text',
-	            headers: {
-	                Accept : 'application/json,*/*;q=0.01'
-	            }
-	        });
-
-	        if (!when.defined(promise)) {
-	            return undefined;
-	        }
-
-	        return promise
-	            .then(function(value) {
-	                if (!when.defined(value)) {
-	                    return;
-	                }
-	                return JSON.parse(value);
-	            });
-	    };
-
-	    /**
-	     * Creates a Resource and calls fetchJson() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.fetchJson = function (options) {
-	        var resource = new Resource(options);
-	        return resource.fetchJson();
-	    };
-
-	    /**
-	     * Asynchronously loads the given resource as XML.  Returns a promise that will resolve to
-	     * an XML Document once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @returns {Promise.<XMLDocument>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * // load XML from a URL, setting a custom header
-	     * Cesium.loadXML('http://someUrl.com/someXML.xml', {
-	     *   'X-Custom-Header' : 'some value'
-	     * }).then(function(document) {
-	     *     // Do something with the document
-	     * }).otherwise(function(error) {
-	     *     // an error occurred
-	     * });
-	     *
-	     * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest|XMLHttpRequest}
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.fetchXML = function() {
-	        return this.fetch({
-	            responseType : 'document',
-	            overrideMimeType : 'text/xml'
-	        });
-	    };
-
-	    /**
-	     * Creates a Resource and calls fetchXML() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @returns {Promise.<XMLDocument>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.fetchXML = function (options) {
-	        var resource = new Resource(options);
-	        return resource.fetchXML();
-	    };
-
-	    /**
-	     * Requests a resource using JSONP.
-	     *
-	     * @param {String} [callbackParameterName='callback'] The callback parameter name that the server expects.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * // load a data asynchronously
-	     * resource.fetchJsonp().then(function(data) {
-	     *     // use the loaded data
-	     * }).otherwise(function(error) {
-	     *     // an error occurred
-	     * });
-	     *
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.fetchJsonp = function(callbackParameterName) {
-	        callbackParameterName = when.defaultValue(callbackParameterName, 'callback');
-
-	        checkAndResetRequest(this.request);
-
-	        //generate a unique function name
-	        var functionName;
-	        do {
-	            functionName = 'loadJsonp' + Math.random().toString().substring(2, 8);
-	        } while (when.defined(window[functionName]));
-
-	        return fetchJsonp(this, callbackParameterName, functionName);
-	    };
-
-	    function fetchJsonp(resource, callbackParameterName, functionName) {
-	        var callbackQuery = {};
-	        callbackQuery[callbackParameterName] = functionName;
-	        resource.setQueryParameters(callbackQuery);
-
-	        var request = resource.request;
-	        request.url = resource.url;
-	        request.requestFunction = function() {
-	            var deferred = when.when.defer();
-
-	            //assign a function with that name in the global scope
-	            window[functionName] = function(data) {
-	                deferred.resolve(data);
-
-	                try {
-	                    delete window[functionName];
-	                } catch (e) {
-	                    window[functionName] = undefined;
-	                }
-	            };
-
-	            Resource._Implementations.loadAndExecuteScript(resource.url, functionName, deferred);
-	            return deferred.promise;
-	        };
-
-	        var promise = RequestScheduler.request(request);
-	        if (!when.defined(promise)) {
-	            return;
-	        }
-
-	        return promise
-	            .otherwise(function(e) {
-	                if (request.state !== RequestState$1.FAILED) {
-	                    return when.when.reject(e);
-	                }
-
-	                return resource.retryOnError(e)
-	                    .then(function(retry) {
-	                        if (retry) {
-	                            // Reset request so it can try again
-	                            request.state = RequestState$1.UNISSUED;
-	                            request.deferred = undefined;
-
-	                            return fetchJsonp(resource, callbackParameterName, functionName);
-	                        }
-
-	                        return when.when.reject(e);
-	                    });
-	            });
-	    }
-
-	    /**
-	     * Creates a Resource from a URL and calls fetchJsonp() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {String} [options.callbackParameterName='callback'] The callback parameter name that the server expects.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.fetchJsonp = function (options) {
-	        var resource = new Resource(options);
-	        return resource.fetchJsonp(options.callbackParameterName);
-	    };
-
-	    /**
-	     * @private
-	     */
-	    Resource.prototype._makeRequest = function(options) {
-	        var resource = this;
-	        checkAndResetRequest(resource.request);
-
-	        var request = resource.request;
-	        request.url = resource.url;
-
-	        request.requestFunction = function(url) {
-	            var responseType = options.responseType;
-	            var headers = combine(options.headers, resource.headers);
-	            var overrideMimeType = options.overrideMimeType;
-	            var method = options.method;
-	            var data = options.data;
-	            var deferred = when.when.defer();
-	            var newUrl = when.defined(url) ? url : resource.url;
-	            var xhr = Resource._Implementations.loadWithXhr(newUrl, responseType, method, data, headers, deferred, overrideMimeType);
-	            if (when.defined(xhr) && when.defined(xhr.abort)) {
-	                request.cancelFunction = function() {
-	                    xhr.abort();
-	                };
-	            }
-	            return deferred.promise;
-	        };
-
-	        var promise = RequestScheduler.request(request);
-	        if (!when.defined(promise)) {
-	            return;
-	        }
-
-	        return promise
-	            .then(function(data) {
-	                return data;
-	            })
-	            .otherwise(function(e) {
-	                if (request.state !== RequestState$1.FAILED) {
-	                    return when.when.reject(e);
-	                }
-
-	                return resource.retryOnError(e)
-	                    .then(function(retry) {
-	                        if (retry) {
-	                            // Reset request so it can try again
-	                            request.state = RequestState$1.UNISSUED;
-	                            request.deferred = undefined;
-
-	                            return resource.fetch(options);
-	                        }
-
-	                        return when.when.reject(e);
-	                    });
-	            });
-	    };
-
-	    var dataUriRegex$1 = /^data:(.*?)(;base64)?,(.*)$/;
-
-	    function decodeDataUriText(isBase64, data) {
-	        var result = decodeURIComponent(data);
-	        if (isBase64) {
-	            return atob(result);
-	        }
-	        return result;
-	    }
-
-	    function decodeDataUriArrayBuffer(isBase64, data) {
-	        var byteString = decodeDataUriText(isBase64, data);
-	        var buffer = new ArrayBuffer(byteString.length);
-	        var view = new Uint8Array(buffer);
-	        for (var i = 0; i < byteString.length; i++) {
-	            view[i] = byteString.charCodeAt(i);
-	        }
-	        return buffer;
-	    }
-
-	    function decodeDataUri(dataUriRegexResult, responseType) {
-	        responseType = when.defaultValue(responseType, '');
-	        var mimeType = dataUriRegexResult[1];
-	        var isBase64 = !!dataUriRegexResult[2];
-	        var data = dataUriRegexResult[3];
-
-	        switch (responseType) {
-	            case '':
-	            case 'text':
-	                return decodeDataUriText(isBase64, data);
-	            case 'arraybuffer':
-	                return decodeDataUriArrayBuffer(isBase64, data);
-	            case 'blob':
-	                var buffer = decodeDataUriArrayBuffer(isBase64, data);
-	                return new Blob([buffer], {
-	                    type : mimeType
-	                });
-	            case 'document':
-	                var parser = new DOMParser();
-	                return parser.parseFromString(decodeDataUriText(isBase64, data), mimeType);
-	            case 'json':
-	                return JSON.parse(decodeDataUriText(isBase64, data));
-	            default:
-	                //>>includeStart('debug', pragmas.debug);
-	                throw new Check.DeveloperError('Unhandled responseType: ' + responseType);
-	            //>>includeEnd('debug');
-	        }
-	    }
-
-	    /**
-	     * Asynchronously loads the given resource.  Returns a promise that will resolve to
-	     * the result once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. It's recommended that you use
-	     * the more specific functions eg. fetchJson, fetchBlob, etc.
-	     *
-	     * @param {Object} [options] Object with the following properties:
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {Object} [options.headers] Additional HTTP headers to send with the request, if any.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * resource.fetch()
-	     *   .then(function(body) {
-	     *       // use the data
-	     *   }).otherwise(function(error) {
-	     *       // an error occurred
-	     *   });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.fetch = function(options) {
-	        options = defaultClone(options, {});
-	        options.method = 'GET';
-
-	        return this._makeRequest(options);
-	    };
-
-	    /**
-	     * Creates a Resource from a URL and calls fetch() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.fetch = function (options) {
-	        var resource = new Resource(options);
-	        return resource.fetch({
-	            // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch
-	            responseType: options.responseType,
-	            overrideMimeType: options.overrideMimeType
-	        });
-	    };
-
-	    /**
-	     * Asynchronously deletes the given resource.  Returns a promise that will resolve to
-	     * the result once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @param {Object} [options] Object with the following properties:
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {Object} [options.headers] Additional HTTP headers to send with the request, if any.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * resource.delete()
-	     *   .then(function(body) {
-	     *       // use the data
-	     *   }).otherwise(function(error) {
-	     *       // an error occurred
-	     *   });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.delete = function(options) {
-	        options = defaultClone(options, {});
-	        options.method = 'DELETE';
-
-	        return this._makeRequest(options);
-	    };
-
-	    /**
-	     * Creates a Resource from a URL and calls delete() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.data] Data that is posted with the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.delete = function (options) {
-	        var resource = new Resource(options);
-	        return resource.delete({
-	            // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch
-	            responseType: options.responseType,
-	            overrideMimeType: options.overrideMimeType,
-	            data: options.data
-	        });
-	    };
-
-	    /**
-	     * Asynchronously gets headers the given resource.  Returns a promise that will resolve to
-	     * the result once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @param {Object} [options] Object with the following properties:
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {Object} [options.headers] Additional HTTP headers to send with the request, if any.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * resource.head()
-	     *   .then(function(headers) {
-	     *       // use the data
-	     *   }).otherwise(function(error) {
-	     *       // an error occurred
-	     *   });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.head = function(options) {
-	        options = defaultClone(options, {});
-	        options.method = 'HEAD';
-
-	        return this._makeRequest(options);
-	    };
-
-	    /**
-	     * Creates a Resource from a URL and calls head() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.head = function (options) {
-	        var resource = new Resource(options);
-	        return resource.head({
-	            // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch
-	            responseType: options.responseType,
-	            overrideMimeType: options.overrideMimeType
-	        });
-	    };
-
-	    /**
-	     * Asynchronously gets options the given resource.  Returns a promise that will resolve to
-	     * the result once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @param {Object} [options] Object with the following properties:
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {Object} [options.headers] Additional HTTP headers to send with the request, if any.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * resource.options()
-	     *   .then(function(headers) {
-	     *       // use the data
-	     *   }).otherwise(function(error) {
-	     *       // an error occurred
-	     *   });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.options = function(options) {
-	        options = defaultClone(options, {});
-	        options.method = 'OPTIONS';
-
-	        return this._makeRequest(options);
-	    };
-
-	    /**
-	     * Creates a Resource from a URL and calls options() on it.
-	     *
-	     * @param {String|Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.options = function (options) {
-	        var resource = new Resource(options);
-	        return resource.options({
-	            // Make copy of just the needed fields because headers can be passed to both the constructor and to fetch
-	            responseType: options.responseType,
-	            overrideMimeType: options.overrideMimeType
-	        });
-	    };
-
-	    /**
-	     * Asynchronously posts data to the given resource.  Returns a promise that will resolve to
-	     * the result once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @param {Object} data Data that is posted with the resource.
-	     * @param {Object} [options] Object with the following properties:
-	     * @param {Object} [options.data] Data that is posted with the resource.
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {Object} [options.headers] Additional HTTP headers to send with the request, if any.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * resource.post(data)
-	     *   .then(function(result) {
-	     *       // use the result
-	     *   }).otherwise(function(error) {
-	     *       // an error occurred
-	     *   });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.post = function(data, options) {
-	        Check.Check.defined('data', data);
-
-	        options = defaultClone(options, {});
-	        options.method = 'POST';
-	        options.data = data;
-
-	        return this._makeRequest(options);
-	    };
-
-	    /**
-	     * Creates a Resource from a URL and calls post() on it.
-	     *
-	     * @param {Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} options.data Data that is posted with the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.post = function (options) {
-	        var resource = new Resource(options);
-	        return resource.post(options.data, {
-	            // Make copy of just the needed fields because headers can be passed to both the constructor and to post
-	            responseType: options.responseType,
-	            overrideMimeType: options.overrideMimeType
-	        });
-	    };
-
-	    /**
-	     * Asynchronously puts data to the given resource.  Returns a promise that will resolve to
-	     * the result once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @param {Object} data Data that is posted with the resource.
-	     * @param {Object} [options] Object with the following properties:
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {Object} [options.headers] Additional HTTP headers to send with the request, if any.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * resource.put(data)
-	     *   .then(function(result) {
-	     *       // use the result
-	     *   }).otherwise(function(error) {
-	     *       // an error occurred
-	     *   });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.put = function(data, options) {
-	        Check.Check.defined('data', data);
-
-	        options = defaultClone(options, {});
-	        options.method = 'PUT';
-	        options.data = data;
-
-	        return this._makeRequest(options);
-	    };
-
-	    /**
-	     * Creates a Resource from a URL and calls put() on it.
-	     *
-	     * @param {Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} options.data Data that is posted with the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.put = function (options) {
-	        var resource = new Resource(options);
-	        return resource.put(options.data, {
-	            // Make copy of just the needed fields because headers can be passed to both the constructor and to post
-	            responseType: options.responseType,
-	            overrideMimeType: options.overrideMimeType
-	        });
-	    };
-
-	    /**
-	     * Asynchronously patches data to the given resource.  Returns a promise that will resolve to
-	     * the result once loaded, or reject if the resource failed to load.  The data is loaded
-	     * using XMLHttpRequest, which means that in order to make requests to another origin,
-	     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.
-	     *
-	     * @param {Object} data Data that is posted with the resource.
-	     * @param {Object} [options] Object with the following properties:
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {Object} [options.headers] Additional HTTP headers to send with the request, if any.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     *
-	     *
-	     * @example
-	     * resource.patch(data)
-	     *   .then(function(result) {
-	     *       // use the result
-	     *   }).otherwise(function(error) {
-	     *       // an error occurred
-	     *   });
-	     *
-	     * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
-	     * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A}
-	     */
-	    Resource.prototype.patch = function(data, options) {
-	        Check.Check.defined('data', data);
-
-	        options = defaultClone(options, {});
-	        options.method = 'PATCH';
-	        options.data = data;
-
-	        return this._makeRequest(options);
-	    };
-
-	    /**
-	     * Creates a Resource from a URL and calls patch() on it.
-	     *
-	     * @param {Object} options A url or an object with the following properties
-	     * @param {String} options.url The url of the resource.
-	     * @param {Object} options.data Data that is posted with the resource.
-	     * @param {Object} [options.queryParameters] An object containing query parameters that will be sent when retrieving the resource.
-	     * @param {Object} [options.templateValues] Key/Value pairs that are used to replace template values (eg. {x}).
-	     * @param {Object} [options.headers={}] Additional HTTP headers that will be sent.
-	     * @param {DefaultProxy} [options.proxy] A proxy to be used when loading the resource.
-	     * @param {Resource~RetryCallback} [options.retryCallback] The Function to call when a request for this resource fails. If it returns true, the request will be retried.
-	     * @param {Number} [options.retryAttempts=0] The number of times the retryCallback should be called before giving up.
-	     * @param {Request} [options.request] A Request object that will be used. Intended for internal use only.
-	     * @param {String} [options.responseType] The type of response.  This controls the type of item returned.
-	     * @param {String} [options.overrideMimeType] Overrides the MIME type returned by the server.
-	     * @returns {Promise.<Object>|undefined} a promise that will resolve to the requested data when loaded. Returns undefined if <code>request.throttle</code> is true and the request does not have high enough priority.
-	     */
-	    Resource.patch = function (options) {
-	        var resource = new Resource(options);
-	        return resource.patch(options.data, {
-	            // Make copy of just the needed fields because headers can be passed to both the constructor and to post
-	            responseType: options.responseType,
-	            overrideMimeType: options.overrideMimeType
-	        });
-	    };
-
-	    /**
-	     * Contains implementations of functions that can be replaced for testing
-	     *
-	     * @private
-	     */
-	    Resource._Implementations = {};
-
-	    function loadImageElement(url, crossOrigin, deferred) {
-	        var image = new Image();
-
-	        image.onload = function() {
-	            deferred.resolve(image);
-	        };
-
-	        image.onerror = function(e) {
-	            deferred.reject(e);
-	        };
-
-	        if (crossOrigin) {
-	            if (TrustedServers.contains(url)) {
-	                image.crossOrigin = 'use-credentials';
-	            } else {
-	                image.crossOrigin = '';
-	            }
-	        }
-
-	        image.src = url;
-	    }
-
-	    Resource._Implementations.createImage = function(request, crossOrigin, deferred, flipY, preferImageBitmap) {
-	        var url = request.url;
-	        // Passing an Image to createImageBitmap will force it to run on the main thread
-	        // since DOM elements don't exist on workers. We convert it to a blob so it's non-blocking.
-	        // See:
-	        //    https://bugzilla.mozilla.org/show_bug.cgi?id=1044102#c38
-	        //    https://bugs.chromium.org/p/chromium/issues/detail?id=580202#c10
-	        Resource.supportsImageBitmapOptions()
-	            .then(function(supportsImageBitmap) {
-	                // We can only use ImageBitmap if we can flip on decode.
-	                // See: https://github.com/CesiumGS/cesium/pull/7579#issuecomment-466146898
-	                if (!(supportsImageBitmap && preferImageBitmap)) {
-	                    loadImageElement(url, crossOrigin, deferred);
-	                    return;
-	                }
-	                var responseType = 'blob';
-	                var method = 'GET';
-	                var xhrDeferred = when.when.defer();
-	                var xhr = Resource._Implementations.loadWithXhr(
-	                    url,
-	                    responseType,
-	                    method,
-	                    undefined,
-	                    undefined,
-	                    xhrDeferred,
-	                    undefined,
-	                    undefined,
-	                    undefined
-	                );
-
-	                if (when.defined(xhr) && when.defined(xhr.abort)) {
-	                    request.cancelFunction = function() {
-	                        xhr.abort();
-	                    };
-	                }
-	                return xhrDeferred.promise.then(function(blob) {
-	                    if (!when.defined(blob)) {
-	                        deferred.reject(new RuntimeError.RuntimeError('Successfully retrieved ' + url + ' but it contained no content.'));
-	                        return;
-	                    }
-
-	                    return Resource.createImageBitmapFromBlob(blob, {
-	                        flipY: flipY,
-	                        premultiplyAlpha: false
-	                    });
-	                }).then(deferred.resolve);
-	            })
-	            .otherwise(deferred.reject);
-	    };
-
-	    /**
-	     * Wrapper for createImageBitmap
-	     *
-	     * @private
-	     */
-	    Resource.createImageBitmapFromBlob = function(blob, options) {
-	        Check.Check.defined('options', options);
-	        Check.Check.typeOf.bool('options.flipY', options.flipY);
-	        Check.Check.typeOf.bool('options.premultiplyAlpha', options.premultiplyAlpha);
-
-	        return createImageBitmap(blob, {
-	            imageOrientation: options.flipY ? 'flipY' : 'none',
-	            premultiplyAlpha: options.premultiplyAlpha ? 'premultiply' : 'none'
-	        });
-	    };
-
-	    function decodeResponse(loadWithHttpResponse, responseType) {
-	        switch (responseType) {
-	          case 'text':
-	              return loadWithHttpResponse.toString('utf8');
-	          case 'json':
-	              return JSON.parse(loadWithHttpResponse.toString('utf8'));
-	          default:
-	              return new Uint8Array(loadWithHttpResponse).buffer;
-	        }
-	    }
-
-	    function loadWithHttpRequest(url, responseType, method, data, headers, deferred, overrideMimeType) {
-	        // Note: only the 'json' and 'text' responseTypes transforms the loaded buffer
-	        var URL = require('url').parse(url); // eslint-disable-line
-	        var http = URL.protocol === 'https:' ? require('https') : require('http'); // eslint-disable-line
-	        var zlib = require('zlib'); // eslint-disable-line
-	        var options = {
-	            protocol : URL.protocol,
-	            hostname : URL.hostname,
-	            port : URL.port,
-	            path : URL.path,
-	            query : URL.query,
-	            method : method,
-	            headers : headers
-	        };
-
-	        http.request(options)
-	            .on('response', function(res) {
-	                if (res.statusCode < 200 || res.statusCode >= 300) {
-	                    deferred.reject(new RequestErrorEvent(res.statusCode, res, res.headers));
-	                    return;
-	                }
-
-	                var chunkArray = [];
-	                res.on('data', function(chunk) {
-	                    chunkArray.push(chunk);
-	                });
-
-	                res.on('end', function() {
-	                    var result = Buffer.concat(chunkArray); // eslint-disable-line
-	                    if (res.headers['content-encoding'] === 'gzip') {
-	                        zlib.gunzip(result, function(error, resultUnzipped) {
-	                            if (error) {
-	                                deferred.reject(new RuntimeError.RuntimeError('Error decompressing response.'));
-	                            } else {
-	                                deferred.resolve(decodeResponse(resultUnzipped, responseType));
-	                            }
-	                        });
-	                    } else {
-	                        deferred.resolve(decodeResponse(result, responseType));
-	                    }
-	                });
-	            }).on('error', function(e) {
-	                deferred.reject(new RequestErrorEvent());
-	            }).end();
-	    }
-
-	    var noXMLHttpRequest = typeof XMLHttpRequest === 'undefined';
-	    Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) {
-	        var dataUriRegexResult = dataUriRegex$1.exec(url);
-	        if (dataUriRegexResult !== null) {
-	            deferred.resolve(decodeDataUri(dataUriRegexResult, responseType));
-	            return;
-	        }
-
-	        if (noXMLHttpRequest) {
-	            loadWithHttpRequest(url, responseType, method, data, headers, deferred);
-	            return;
-	        }
-
-	        var xhr = new XMLHttpRequest();
-
-	        if (TrustedServers.contains(url)) {
-	            xhr.withCredentials = true;
-	        }
-
-	        url = url.replace(/{/g, '%7B').replace(/}/g, '%7D');
-	        xhr.open(method, url, true);
-
-	        if (when.defined(overrideMimeType) && when.defined(xhr.overrideMimeType)) {
-	            xhr.overrideMimeType(overrideMimeType);
-	        }
-
-	        if (when.defined(headers)) {
-	            for (var key in headers) {
-	                if (headers.hasOwnProperty(key)) {
-	                    xhr.setRequestHeader(key, headers[key]);
-	                }
-	            }
-	        }
-
-	        if (when.defined(responseType)) {
-	            xhr.responseType = responseType;
-	        }
-
-	        // While non-standard, file protocol always returns a status of 0 on success
-	        var localFile = false;
-	        if (typeof url === 'string') {
-	            localFile = (url.indexOf('file://') === 0) || (typeof window !== 'undefined' && window.location.origin === 'file://');
-	        }
-
-	        xhr.onload = function() {
-	            if ((xhr.status < 200 || xhr.status >= 300) && !(localFile && xhr.status === 0)) {
-	                deferred.reject(new RequestErrorEvent(xhr.status, xhr.response, xhr.getAllResponseHeaders()));
-	                return;
-	            }
-
-	            var response = xhr.response;
-	            var browserResponseType = xhr.responseType;
-
-	            if (method === 'HEAD' || method === 'OPTIONS') {
-	                var responseHeaderString = xhr.getAllResponseHeaders();
-	                var splitHeaders = responseHeaderString.trim().split(/[\r\n]+/);
-
-	                var responseHeaders = {};
-	                splitHeaders.forEach(function (line) {
-	                    var parts = line.split(': ');
-	                    var header = parts.shift();
-	                    responseHeaders[header] = parts.join(': ');
-	                });
-
-	                deferred.resolve(responseHeaders);
-	                return;
-	            }
-
-	            //All modern browsers will go into either the first or second if block or last else block.
-	            //Other code paths support older browsers that either do not support the supplied responseType
-	            //or do not support the xhr.response property.
-	            if (xhr.status === 204) {
-	                // accept no content
-	                deferred.resolve();
-	            } else if (when.defined(response) && (!when.defined(responseType) || (browserResponseType === responseType))) {
-	                deferred.resolve(response);
-	            } else if ((responseType === 'json') && typeof response === 'string') {
-	                try {
-	                    deferred.resolve(JSON.parse(response));
-	                } catch (e) {
-	                    deferred.reject(e);
-	                }
-	            } else if ((browserResponseType === '' || browserResponseType === 'document') && when.defined(xhr.responseXML) && xhr.responseXML.hasChildNodes()) {
-	                deferred.resolve(xhr.responseXML);
-	            } else if ((browserResponseType === '' || browserResponseType === 'text') && when.defined(xhr.responseText)) {
-	                deferred.resolve(xhr.responseText);
-	            } else {
-	                deferred.reject(new RuntimeError.RuntimeError('Invalid XMLHttpRequest response type.'));
-	            }
-	        };
-
-	        xhr.onerror = function(e) {
-	            deferred.reject(new RequestErrorEvent());
-	        };
-
-	        xhr.send(data);
-
-	        return xhr;
-	    };
-
-	    Resource._Implementations.loadAndExecuteScript = function(url, functionName, deferred) {
-	        return loadAndExecuteScript(url).otherwise(deferred.reject);
-	    };
-
-	    /**
-	     * The default implementations
-	     *
-	     * @private
-	     */
-	    Resource._DefaultImplementations = {};
-	    Resource._DefaultImplementations.createImage = Resource._Implementations.createImage;
-	    Resource._DefaultImplementations.loadWithXhr = Resource._Implementations.loadWithXhr;
-	    Resource._DefaultImplementations.loadAndExecuteScript = Resource._Implementations.loadAndExecuteScript;
-
-	    /**
-	     * A resource instance initialized to the current browser location
-	     *
-	     * @type {Resource}
-	     * @constant
-	     */
-	    Resource.DEFAULT = Object.freeze(new Resource({
-	        url: (typeof document === 'undefined') ? '' : document.location.href.split('?')[0]
-	    }));
-
-	/*global CESIUM_BASE_URL*/
-
-	    var cesiumScriptRegex = /((?:.*\/)|^)Cesium\.js$/;
-	    function getBaseUrlFromCesiumScript() {
-	        var scripts = document.getElementsByTagName('script');
-	        for ( var i = 0, len = scripts.length; i < len; ++i) {
-	            var src = scripts[i].getAttribute('src');
-	            var result = cesiumScriptRegex.exec(src);
-	            if (result !== null) {
-	                return result[1];
-	            }
-	        }
-	        return undefined;
-	    }
-
-	    var a$1;
-	    function tryMakeAbsolute(url) {
-	        if (typeof document === 'undefined') {
-	            //Node.js and Web Workers. In both cases, the URL will already be absolute.
-	            return url;
-	        }
-
-	        if (!when.defined(a$1)) {
-	            a$1 = document.createElement('a');
-	        }
-	        a$1.href = url;
-
-	        // IE only absolutizes href on get, not set
-	        a$1.href = a$1.href; // eslint-disable-line no-self-assign
-	        return a$1.href;
-	    }
-
-	    var baseResource;
-	    function getCesiumBaseUrl() {
-	        if (when.defined(baseResource)) {
-	            return baseResource;
-	        }
-
-	        var baseUrlString;
-	        if (typeof CESIUM_BASE_URL !== 'undefined') {
-	            baseUrlString = CESIUM_BASE_URL;
-	        } else if (typeof define === 'object' && when.defined(define.amd) && !define.amd.toUrlUndefined && when.defined(require.toUrl)) {
-	            baseUrlString = getAbsoluteUri('..', buildModuleUrl('Core/buildModuleUrl.js'));
-	        } else {
-	            baseUrlString = getBaseUrlFromCesiumScript();
-	        }
-
-	        //>>includeStart('debug', pragmas.debug);
-	        if (!when.defined(baseUrlString)) {
-	            throw new Check.DeveloperError('Unable to determine Cesium base URL automatically, try defining a global variable called CESIUM_BASE_URL.');
-	        }
-	        //>>includeEnd('debug');
-
-	        baseResource = new Resource({
-	            url: tryMakeAbsolute(baseUrlString)
-	        });
-	        baseResource.appendForwardSlash();
-
-	        return baseResource;
-	    }
-
-	    function buildModuleUrlFromRequireToUrl(moduleID) {
-	        //moduleID will be non-relative, so require it relative to this module, in Core.
-	        return tryMakeAbsolute(require.toUrl('../' + moduleID));
-	    }
-
-	    function buildModuleUrlFromBaseUrl(moduleID) {
-	        var resource = getCesiumBaseUrl().getDerivedResource({
-	            url: moduleID
-	        });
-	        return resource.url;
-	    }
-
-	    var implementation;
-
-	    /**
-	     * Given a non-relative moduleID, returns an absolute URL to the file represented by that module ID,
-	     * using, in order of preference, require.toUrl, the value of a global CESIUM_BASE_URL, or
-	     * the base URL of the Cesium.js script.
-	     *
-	     * @private
-	     */
-	    function buildModuleUrl(moduleID) {
-	        if (!when.defined(implementation)) {
-	            //select implementation
-	            if (typeof define === 'object' && when.defined(define.amd) && !define.amd.toUrlUndefined && when.defined(require.toUrl)) {
-	                implementation = buildModuleUrlFromRequireToUrl;
-	            } else {
-	                implementation = buildModuleUrlFromBaseUrl;
-	            }
-	        }
-
-	        var url = implementation(moduleID);
-	        return url;
-	    }
-
-	    // exposed for testing
-	    buildModuleUrl._cesiumScriptRegex = cesiumScriptRegex;
-	    buildModuleUrl._buildModuleUrlFromBaseUrl = buildModuleUrlFromBaseUrl;
-	    buildModuleUrl._clearBaseResource = function() {
-	        baseResource = undefined;
-	    };
-
-	    /**
-	     * Sets the base URL for resolving modules.
-	     * @param {String} value The new base URL.
-	     */
-	    buildModuleUrl.setBaseUrl = function(value) {
-	        baseResource = Resource.DEFAULT.getDerivedResource({
-	            url: value
-	        });
-	    };
-
-	    /**
-	     * Gets the base URL for resolving modules.
-	     */
-	    buildModuleUrl.getCesiumBaseUrl = getCesiumBaseUrl;
-
-	exports.Resource = Resource;
-	exports.buildModuleUrl = buildModuleUrl;
-	exports.deprecationWarning = deprecationWarning;
-	exports.oneTimeWarning = oneTimeWarning;
-
-});
diff --git a/public/libs/Cesium/Workers/cesiumWorkerBootstrapper.js b/public/libs/Cesium/Workers/cesiumWorkerBootstrapper.js
deleted file mode 100644
index 3df1c13..0000000
--- a/public/libs/Cesium/Workers/cesiumWorkerBootstrapper.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-function setTimeout(e){e()}var requirejs,require,define;"undefined"==typeof self&&(self={}),self.onmessage=function(e){var t=e.data;require(t.loaderConfig,[t.workerModule],function(e){self.onmessage=e,CESIUM_BASE_URL=t.loaderConfig.baseUrl})},function(global){var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.1.20",commentRegExp=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/gm,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,ap=Array.prototype,isBrowser=!("undefined"==typeof window||"undefined"==typeof navigator||!window.document),isWebWorker=!isBrowser&&"undefined"!=typeof importScripts,readyRegExp=isBrowser&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;function isFunction(e){return"[object Function]"===ostring.call(e)}function isArray(e){return"[object Array]"===ostring.call(e)}function each(e,t){var i;if(e)for(i=0;i<e.length&&(!e[i]||!t(e[i],i,e));i+=1);}function eachReverse(e,t){var i;if(e)for(i=e.length-1;-1<i&&(!e[i]||!t(e[i],i,e));i-=1);}function hasProp(e,t){return hasOwn.call(e,t)}function getOwn(e,t){return hasProp(e,t)&&e[t]}function eachProp(e,t){var i;for(i in e)if(hasProp(e,i)&&t(e[i],i))break}function mixin(i,e,r,n){return e&&eachProp(e,function(e,t){!r&&hasProp(i,t)||(!n||"object"!=typeof e||!e||isArray(e)||isFunction(e)||e instanceof RegExp?i[t]=e:(i[t]||(i[t]={}),mixin(i[t],e,r,n)))}),i}function bind(e,t){return function(){return t.apply(e,arguments)}}function scripts(){return document.getElementsByTagName("script")}function defaultOnError(e){throw e}function getGlobal(e){if(!e)return e;var t=global;return each(e.split("."),function(e){t=t[e]}),t}function makeError(e,t,i,r){var n=new Error(t+"\nhttp://requirejs.org/docs/errors.html#"+e);return n.requireType=e,n.requireModules=r,i&&(n.originalError=i),n}if(void 0===define){if(void 0!==requirejs){if(isFunction(requirejs))return;cfg=requirejs,requirejs=void 0}void 0===require||isFunction(require)||(cfg=require,require=void 0),req=requirejs=function(e,t,i,r){var n,o,a=defContextName;return isArray(e)||"string"==typeof e||(o=e,isArray(t)?(e=t,t=i,i=r):e=[]),o&&o.context&&(a=o.context),(n=getOwn(contexts,a))||(n=contexts[a]=req.s.newContext(a)),o&&n.configure(o),n.require(e,t,i)},req.config=function(e){return req(e)},req.nextTick=void 0!==setTimeout?function(e){setTimeout(e,4)}:function(e){e()},require||(require=req),req.version=version,req.jsExtRegExp=/^\/|:|\?|\.js$/,req.isBrowser=isBrowser,s=req.s={contexts:contexts,newContext:newContext},req({}),each(["toUrl","undef","defined","specified"],function(t){req[t]=function(){var e=contexts[defContextName];return e.require[t].apply(e,arguments)}}),isBrowser&&(head=s.head=document.getElementsByTagName("head")[0],baseElement=document.getElementsByTagName("base")[0],baseElement&&(head=s.head=baseElement.parentNode)),req.onError=defaultOnError,req.createNode=function(e,t,i){var r=e.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");return r.type=e.scriptType||"text/javascript",r.charset="utf-8",r.async=!0,r},req.load=function(t,i,r){var e,n=t&&t.config||{};if(isBrowser)return e=req.createNode(n,i,r),n.onNodeCreated&&n.onNodeCreated(e,n,i,r),e.setAttribute("data-requirecontext",t.contextName),e.setAttribute("data-requiremodule",i),!e.attachEvent||e.attachEvent.toString&&e.attachEvent.toString().indexOf("[native code")<0||isOpera?(e.addEventListener("load",t.onScriptLoad,!1),e.addEventListener("error",t.onScriptError,!1)):(useInteractive=!0,e.attachEvent("onreadystatechange",t.onScriptLoad)),e.src=r,currentlyAddingScript=e,baseElement?head.insertBefore(e,baseElement):head.appendChild(e),currentlyAddingScript=null,e;if(isWebWorker)try{importScripts(r),t.completeLoad(i)}catch(e){t.onError(makeError("importscripts","importScripts failed for "+i+" at "+r,e,[i]))}},isBrowser&&!cfg.skipDataMain&&eachReverse(scripts(),function(e){if(head||(head=e.parentNode),dataMain=e.getAttribute("data-main"))return mainScript=dataMain,cfg.baseUrl||(mainScript=(src=mainScript.split("/")).pop(),subPath=src.length?src.join("/")+"/":"./",cfg.baseUrl=subPath),mainScript=mainScript.replace(jsSuffixRegExp,""),req.jsExtRegExp.test(mainScript)&&(mainScript=dataMain),cfg.deps=cfg.deps?cfg.deps.concat(mainScript):[mainScript],!0}),define=function(e,i,t){var r,n;"string"!=typeof e&&(t=i,i=e,e=null),isArray(i)||(t=i,i=null),!i&&isFunction(t)&&(i=[],t.length&&(t.toString().replace(commentRegExp,"").replace(cjsRequireRegExp,function(e,t){i.push(t)}),i=(1===t.length?["require"]:["require","exports","module"]).concat(i))),useInteractive&&(r=currentlyAddingScript||getInteractiveScript())&&(e||(e=r.getAttribute("data-requiremodule")),n=contexts[r.getAttribute("data-requirecontext")]),n?(n.defQueue.push([e,i,t]),n.defQueueMap[e]=!0):globalDefQueue.push([e,i,t])},define.amd={jQuery:!0},req.exec=function(text){return eval(text)},req(cfg)}function newContext(u){var i,e,l,c,d,g={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},p={},f={},r={},h=[],m={},n={},v={},x=1,b=1;function q(e,t,i){var r,n,o,a,s,u,c,d,p,f,l=t&&t.split("/"),h=g.map,m=h&&h["*"];if(e&&(u=(e=e.split("/")).length-1,g.nodeIdCompat&&jsSuffixRegExp.test(e[u])&&(e[u]=e[u].replace(jsSuffixRegExp,"")),"."===e[0].charAt(0)&&l&&(e=l.slice(0,l.length-1).concat(e)),function(e){var t,i;for(t=0;t<e.length;t++)if("."===(i=e[t]))e.splice(t,1),t-=1;else if(".."===i){if(0===t||1===t&&".."===e[2]||".."===e[t-1])continue;0<t&&(e.splice(t-1,2),t-=2)}}(e),e=e.join("/")),i&&h&&(l||m)){e:for(o=(n=e.split("/")).length;0<o;o-=1){if(s=n.slice(0,o).join("/"),l)for(a=l.length;0<a;a-=1)if((r=getOwn(h,l.slice(0,a).join("/")))&&(r=getOwn(r,s))){c=r,d=o;break e}!p&&m&&getOwn(m,s)&&(p=getOwn(m,s),f=o)}!c&&p&&(c=p,d=f),c&&(n.splice(0,d,c),e=n.join("/"))}return getOwn(g.pkgs,e)||e}function E(t){isBrowser&&each(scripts(),function(e){if(e.getAttribute("data-requiremodule")===t&&e.getAttribute("data-requirecontext")===l.contextName)return e.parentNode.removeChild(e),!0})}function w(e){var t=getOwn(g.paths,e);if(t&&isArray(t)&&1<t.length)return t.shift(),l.require.undef(e),l.makeRequire(null,{skipMap:!0})([e]),!0}function y(e){var t,i=e?e.indexOf("!"):-1;return-1<i&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function S(e,t,i,r){var n,o,a,s,u=null,c=t?t.name:null,d=e,p=!0,f="";return e||(p=!1,e="_@r"+(x+=1)),u=(s=y(e))[0],e=s[1],u&&(u=q(u,c,r),o=getOwn(m,u)),e&&(u?f=o&&o.normalize?o.normalize(e,function(e){return q(e,c,r)}):-1===e.indexOf("!")?q(e,c,r):e:(u=(s=y(f=q(e,c,r)))[0],f=s[1],i=!0,n=l.nameToUrl(f))),{prefix:u,name:f,parentMap:t,unnormalized:!!(a=!u||o||i?"":"_unnormalized"+(b+=1)),url:n,originalName:d,isDefine:p,id:(u?u+"!"+f:f)+a}}function k(e){var t=e.id,i=getOwn(p,t);return i||(i=p[t]=new l.Module(e)),i}function M(e,t,i){var r=e.id,n=getOwn(p,r);!hasProp(m,r)||n&&!n.defineEmitComplete?(n=k(e)).error&&"error"===t?i(n.error):n.on(t,i):"defined"===t&&i(m[r])}function O(i,e){var t=i.requireModules,r=!1;e?e(i):(each(t,function(e){var t=getOwn(p,e);t&&(t.error=i,t.events.error&&(r=!0,t.emit("error",i)))}),r||req.onError(i))}function j(){globalDefQueue.length&&(each(globalDefQueue,function(e){var t=e[0];"string"==typeof t&&(l.defQueueMap[t]=!0),h.push(e)}),globalDefQueue=[])}function P(e){delete p[e],delete f[e]}function R(){var e,r,t=1e3*g.waitSeconds,n=t&&l.startTime+t<(new Date).getTime(),o=[],a=[],s=!1,u=!0;if(!i){if(i=!0,eachProp(f,function(e){var t=e.map,i=t.id;if(e.enabled&&(t.isDefine||a.push(e),!e.error))if(!e.inited&&n)w(i)?s=r=!0:(o.push(i),E(i));else if(!e.inited&&e.fetched&&t.isDefine&&(s=!0,!t.prefix))return u=!1}),n&&o.length)return(e=makeError("timeout","Load timeout for modules: "+o,null,o)).contextName=l.contextName,O(e);u&&each(a,function(e){!function n(o,a,s){var e=o.map.id;o.error?o.emit("error",o.error):(a[e]=!0,each(o.depMaps,function(e,t){var i=e.id,r=getOwn(p,i);!r||o.depMatched[t]||s[i]||(getOwn(a,i)?(o.defineDep(t,m[i]),o.check()):n(r,a,s))}),s[e]=!0)}(e,{},{})}),n&&!r||!s||!isBrowser&&!isWebWorker||d||(d=setTimeout(function(){d=0,R()},50)),i=!1}}function a(e){hasProp(m,e[0])||k(S(e[0],null,!0)).init(e[1],e[2])}function o(e,t,i,r){e.detachEvent&&!isOpera?r&&e.detachEvent(r,t):e.removeEventListener(i,t,!1)}function s(e){var t=e.currentTarget||e.srcElement;return o(t,l.onScriptLoad,"load","onreadystatechange"),o(t,l.onScriptError,"error"),{node:t,id:t&&t.getAttribute("data-requiremodule")}}function A(){var e;for(j();h.length;){if(null===(e=h.shift())[0])return O(makeError("mismatch","Mismatched anonymous define() module: "+e[e.length-1]));a(e)}l.defQueueMap={}}return c={require:function(e){return e.require?e.require:e.require=l.makeRequire(e.map)},exports:function(e){if(e.usingExports=!0,e.map.isDefine)return e.exports?m[e.map.id]=e.exports:e.exports=m[e.map.id]={}},module:function(e){return e.module?e.module:e.module={id:e.map.id,uri:e.map.url,config:function(){return getOwn(g.config,e.map.id)||{}},exports:e.exports||(e.exports={})}}},(e=function(e){this.events=getOwn(r,e.id)||{},this.map=e,this.shim=getOwn(g.shim,e.id),this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={},this.depCount=0}).prototype={init:function(e,t,i,r){r=r||{},this.inited||(this.factory=t,i?this.on("error",i):this.events.error&&(i=bind(this,function(e){this.emit("error",e)})),this.depMaps=e&&e.slice(0),this.errback=i,this.inited=!0,this.ignore=r.ignore,r.enabled||this.enabled?this.enable():this.check())},defineDep:function(e,t){this.depMatched[e]||(this.depMatched[e]=!0,this.depCount-=1,this.depExports[e]=t)},fetch:function(){if(!this.fetched){this.fetched=!0,l.startTime=(new Date).getTime();var e=this.map;if(!this.shim)return e.prefix?this.callPlugin():this.load();l.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],bind(this,function(){return e.prefix?this.callPlugin():this.load()}))}},load:function(){var e=this.map.url;n[e]||(n[e]=!0,l.load(this.map.id,e))},check:function(){if(this.enabled&&!this.enabling){var t,e,i=this.map.id,r=this.depExports,n=this.exports,o=this.factory;if(this.inited){if(this.error)this.emit("error",this.error);else if(!this.defining){if(this.defining=!0,this.depCount<1&&!this.defined){if(isFunction(o)){if(this.events.error&&this.map.isDefine||req.onError!==defaultOnError)try{n=l.execCb(i,o,r,n)}catch(e){t=e}else n=l.execCb(i,o,r,n);if(this.map.isDefine&&void 0===n&&((e=this.module)?n=e.exports:this.usingExports&&(n=this.exports)),t)return t.requireMap=this.map,t.requireModules=this.map.isDefine?[this.map.id]:null,t.requireType=this.map.isDefine?"define":"require",O(this.error=t)}else n=o;this.exports=n,this.map.isDefine&&!this.ignore&&(m[i]=n,req.onResourceLoad&&req.onResourceLoad(l,this.map,this.depMaps)),P(i),this.defined=!0}this.defining=!1,this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else hasProp(l.defQueueMap,i)||this.fetch()}},callPlugin:function(){var u=this.map,c=u.id,e=S(u.prefix);this.depMaps.push(e),M(e,"defined",bind(this,function(e){var o,t,i,r=getOwn(v,this.map.id),n=this.map.name,a=this.map.parentMap?this.map.parentMap.name:null,s=l.makeRequire(u.parentMap,{enableBuildCallback:!0});return this.map.unnormalized?(e.normalize&&(n=e.normalize(n,function(e){return q(e,a,!0)})||""),M(t=S(u.prefix+"!"+n,this.map.parentMap),"defined",bind(this,function(e){this.init([],function(){return e},null,{enabled:!0,ignore:!0})})),void((i=getOwn(p,t.id))&&(this.depMaps.push(t),this.events.error&&i.on("error",bind(this,function(e){this.emit("error",e)})),i.enable()))):r?(this.map.url=l.nameToUrl(r),void this.load()):((o=bind(this,function(e){this.init([],function(){return e},null,{enabled:!0})})).error=bind(this,function(e){this.inited=!0,(this.error=e).requireModules=[c],eachProp(p,function(e){0===e.map.id.indexOf(c+"_unnormalized")&&P(e.map.id)}),O(e)}),o.fromText=bind(this,function(e,t){var i=u.name,r=S(i),n=useInteractive;t&&(e=t),n&&(useInteractive=!1),k(r),hasProp(g.config,c)&&(g.config[i]=g.config[c]);try{req.exec(e)}catch(e){return O(makeError("fromtexteval","fromText eval for "+c+" failed: "+e,e,[c]))}n&&(useInteractive=!0),this.depMaps.push(r),l.completeLoad(i),s([i],o)}),void e.load(u.name,s,o,g))})),l.enable(e,this),this.pluginMaps[e.id]=e},enable:function(){(f[this.map.id]=this).enabled=!0,this.enabling=!0,each(this.depMaps,bind(this,function(e,t){var i,r,n;if("string"==typeof e){if(e=S(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap),this.depMaps[t]=e,n=getOwn(c,e.id))return void(this.depExports[t]=n(this));this.depCount+=1,M(e,"defined",bind(this,function(e){this.undefed||(this.defineDep(t,e),this.check())})),this.errback?M(e,"error",bind(this,this.errback)):this.events.error&&M(e,"error",bind(this,function(e){this.emit("error",e)}))}i=e.id,r=p[i],hasProp(c,i)||!r||r.enabled||l.enable(e,this)})),eachProp(this.pluginMaps,bind(this,function(e){var t=getOwn(p,e.id);t&&!t.enabled&&l.enable(e,this)})),this.enabling=!1,this.check()},on:function(e,t){var i=this.events[e];i||(i=this.events[e]=[]),i.push(t)},emit:function(e,t){each(this.events[e],function(e){e(t)}),"error"===e&&delete this.events[e]}},(l={config:g,contextName:u,registry:p,defined:m,urlFetched:n,defQueue:h,defQueueMap:{},Module:e,makeModuleMap:S,nextTick:req.nextTick,onError:O,configure:function(e){e.baseUrl&&"/"!==e.baseUrl.charAt(e.baseUrl.length-1)&&(e.baseUrl+="/");var i=g.shim,r={paths:!0,bundles:!0,config:!0,map:!0};eachProp(e,function(e,t){r[t]?(g[t]||(g[t]={}),mixin(g[t],e,!0,!0)):g[t]=e}),e.bundles&&eachProp(e.bundles,function(e,t){each(e,function(e){e!==t&&(v[e]=t)})}),e.shim&&(eachProp(e.shim,function(e,t){isArray(e)&&(e={deps:e}),!e.exports&&!e.init||e.exportsFn||(e.exportsFn=l.makeShimExports(e)),i[t]=e}),g.shim=i),e.packages&&each(e.packages,function(e){var t;t=(e="string"==typeof e?{name:e}:e).name,e.location&&(g.paths[t]=e.location),g.pkgs[t]=e.name+"/"+(e.main||"main").replace(currDirRegExp,"").replace(jsSuffixRegExp,"")}),eachProp(p,function(e,t){e.inited||e.map.unnormalized||(e.map=S(t,null,!0))}),(e.deps||e.callback)&&l.require(e.deps||[],e.callback)},makeShimExports:function(t){return function(){var e;return t.init&&(e=t.init.apply(global,arguments)),e||t.exports&&getGlobal(t.exports)}},makeRequire:function(o,a){function s(e,t,i){var r,n;return a.enableBuildCallback&&t&&isFunction(t)&&(t.__requireJsBuild=!0),"string"==typeof e?isFunction(t)?O(makeError("requireargs","Invalid require call"),i):o&&hasProp(c,e)?c[e](p[o.id]):req.get?req.get(l,e,o,s):(r=S(e,o,!1,!0).id,hasProp(m,r)?m[r]:O(makeError("notloaded",'Module name "'+r+'" has not been loaded yet for context: '+u+(o?"":". Use require([])")))):(A(),l.nextTick(function(){A(),(n=k(S(null,o))).skipMap=a.skipMap,n.init(e,t,i,{enabled:!0}),R()}),s)}return a=a||{},mixin(s,{isBrowser:isBrowser,toUrl:function(e){var t,i=e.lastIndexOf("."),r=e.split("/")[0];return-1!==i&&(!("."===r||".."===r)||1<i)&&(t=e.substring(i,e.length),e=e.substring(0,i)),l.nameToUrl(q(e,o&&o.id,!0),t,!0)},defined:function(e){return hasProp(m,S(e,o,!1,!0).id)},specified:function(e){return e=S(e,o,!1,!0).id,hasProp(m,e)||hasProp(p,e)}}),o||(s.undef=function(i){j();var e=S(i,o,!0),t=getOwn(p,i);t.undefed=!0,E(i),delete m[i],delete n[e.url],delete r[i],eachReverse(h,function(e,t){e[0]===i&&h.splice(t,1)}),delete l.defQueueMap[i],t&&(t.events.defined&&(r[i]=t.events),P(i))}),s},enable:function(e){getOwn(p,e.id)&&k(e).enable()},completeLoad:function(e){var t,i,r,n=getOwn(g.shim,e)||{},o=n.exports;for(j();h.length;){if(null===(i=h.shift())[0]){if(i[0]=e,t)break;t=!0}else i[0]===e&&(t=!0);a(i)}if(l.defQueueMap={},r=getOwn(p,e),!t&&!hasProp(m,e)&&r&&!r.inited){if(!(!g.enforceDefine||o&&getGlobal(o)))return w(e)?void 0:O(makeError("nodefine","No define call for "+e,null,[e]));a([e,n.deps||[],n.exportsFn])}R()},nameToUrl:function(e,t,i){var r,n,o,a,s,u,c=getOwn(g.pkgs,e);if(c&&(e=c),u=getOwn(v,e))return l.nameToUrl(u,t,i);if(req.jsExtRegExp.test(e))a=e+(t||"");else{for(r=g.paths,o=(n=e.split("/")).length;0<o;o-=1)if(s=getOwn(r,n.slice(0,o).join("/"))){isArray(s)&&(s=s[0]),n.splice(0,o,s);break}a=n.join("/"),a=("/"===(a+=t||(/^data\:|\?/.test(a)||i?"":".js")).charAt(0)||a.match(/^[\w\+\.\-]+:/)?"":g.baseUrl)+a}return g.urlArgs?a+(-1===a.indexOf("?")?"?":"&")+g.urlArgs:a},load:function(e,t){req.load(l,e,t)},execCb:function(e,t,i,r){return t.apply(r,i)},onScriptLoad:function(e){if("load"===e.type||readyRegExp.test((e.currentTarget||e.srcElement).readyState)){interactiveScript=null;var t=s(e);l.completeLoad(t.id)}},onScriptError:function(e){var t=s(e);if(!w(t.id))return O(makeError("scripterror","Script error for: "+t.id,e,[t.id]))}}).require=l.makeRequire(),l}function getInteractiveScript(){return interactiveScript&&"interactive"===interactiveScript.readyState||eachReverse(scripts(),function(e){if("interactive"===e.readyState)return interactiveScript=e}),interactiveScript}}(this);
\ No newline at end of file
diff --git a/public/libs/Cesium/Workers/combineGeometry.js b/public/libs/Cesium/Workers/combineGeometry.js
deleted file mode 100644
index 0cd94b2..0000000
--- a/public/libs/Cesium/Workers/combineGeometry.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './PrimitivePipeline-c9b56b34', './WebMercatorProjection-80c70558', './createTaskProcessorWorker'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, PrimitivePipeline, WebMercatorProjection, createTaskProcessorWorker) { 'use strict';
-
-    function combineGeometry(packedParameters, transferableObjects) {
-        var parameters = PrimitivePipeline.PrimitivePipeline.unpackCombineGeometryParameters(packedParameters);
-        var results = PrimitivePipeline.PrimitivePipeline.combineGeometry(parameters);
-        return PrimitivePipeline.PrimitivePipeline.packCombineGeometryResults(results, transferableObjects);
-    }
-
-    var combineGeometry$1 = createTaskProcessorWorker(combineGeometry);
-
-    return combineGeometry$1;
-
-});
diff --git a/public/libs/Cesium/Workers/computeShadowRatio.js b/public/libs/Cesium/Workers/computeShadowRatio.js
deleted file mode 100644
index e6a3259..0000000
--- a/public/libs/Cesium/Workers/computeShadowRatio.js
+++ /dev/null
@@ -1,133 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian4-5af5bb24', './createTaskProcessorWorker'], function (when, Check, _Math, Cartographic, Cartesian4, createTaskProcessorWorker) { 'use strict';
-
-    var packedDepthScale = new Cartesian4.Cartesian4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 160581375.0);
-    var scratchPacked = new Cartesian4.Cartesian4();
-    var TEXTURE_SIZE = 1024;
-
-    function getShadowRadio(cartographic, bounds, extend, spacing, oriBottom, enuPoints, pixelsArray){
-        var longitude = cartographic.longitude;
-        var latitude = cartographic.latitude;
-        var height = cartographic.height;
-
-        longitude = _Math.CesiumMath.toDegrees(longitude);
-        latitude = _Math.CesiumMath.toDegrees(latitude);
-
-        if(longitude < bounds[0] || longitude > bounds[2] ||
-            latitude < bounds[1] || latitude > bounds[3]){
-            return -1;
-        }
-
-        var bUsed = false;
-        var nTexIndex = 0;
-        var minDist = spacing * 0.1;
-        for(var bottom = 0.0; bottom <= extend; bottom += spacing){
-            if(Math.abs(oriBottom + bottom - height) < minDist){
-                bUsed = true;
-                break;
-            }
-            nTexIndex++;
-        }
-
-        if(!bUsed){
-            return -1;
-        }
-
-        if(enuPoints.length < 0){
-            return -1;
-        }
-
-        bUsed = false;
-        for(var i = 0; i < enuPoints.length; i+=2){
-            var pos1 = Cartographic.Cartesian3.fromDegrees(longitude, latitude, height);
-            var pos2 = Cartographic.Cartesian3.fromDegrees(enuPoints[i + 0], enuPoints[i + 1], height);
-            var dis = Cartographic.Cartesian3.distance(pos1, pos2);
-            if(dis < minDist){
-                bUsed = true;
-                break;
-            }
-        }
-
-        if(!bUsed){
-            return -1;
-        }
-
-        var width = bounds[2] - bounds[0];
-        var height = bounds[3] - bounds[1];
-        var left = bounds[0] - width * 0.025;
-        var right = bounds[1] - height * 0.025;
-        width += width * 0.05;
-        height += height * 0.05;
-
-        var xTexcoord = parseInt((longitude - left) / width * TEXTURE_SIZE);
-        var yTexcoord = parseInt((latitude - right) / height * TEXTURE_SIZE);
-        xTexcoord = xTexcoord < 1 ? 1 : xTexcoord;
-        yTexcoord = yTexcoord < 1 ? 1 : yTexcoord;
-
-        var pixels = pixelsArray[nTexIndex];
-        var result = 0;
-        for(var i = -1; i < 2; i++){
-            for(var j = -1; j < 2; j++){
-                var offset = (TEXTURE_SIZE * (yTexcoord + j) + (xTexcoord + i)) * 4;
-                scratchPacked.x = pixels[offset];
-                scratchPacked.y = pixels[offset + 1];
-                scratchPacked.z = pixels[offset + 2];
-                scratchPacked.w = pixels[offset + 3];
-                Cartesian4.Cartesian4.divideByScalar(scratchPacked, 255.0, scratchPacked);
-                result = Math.max(result, Cartesian4.Cartesian4.dot(scratchPacked, packedDepthScale));
-            }
-        }
-
-        result = result > 0.999 ? 1.0 : result;
-        return result;
-    }
-
-    function computeShadowRatio(parameters, transferableObjects) {
-        var points = parameters.points;
-        var enuPoints = parameters.enuPoints;
-        var bounds = parameters.bounds;
-        var extend = parameters.extend;
-        var spacing = parameters.spacing;
-        var bottom = parameters.bottom;
-        var pixelsArray = parameters.pixelsArray;
-        var result = [];
-        for(var j = 0,len = points.length;j < len;j++){
-            var p = points[j];
-            var cartographic = Cartographic.Cartographic.fromCartesian(p);
-            var ratio = getShadowRadio(cartographic, bounds, extend, spacing, bottom, enuPoints, pixelsArray);
-            result.push({
-                position : Cartographic.Cartesian3.clone(p),
-                shadowRatio : ratio
-            });
-        }
-        return {
-            resultData : result
-        };
-    }
-
-    var computeShadowRatio$1 = createTaskProcessorWorker(computeShadowRatio);
-
-    return computeShadowRatio$1;
-
-});
diff --git a/public/libs/Cesium/Workers/createBoxGeometry.js b/public/libs/Cesium/Workers/createBoxGeometry.js
deleted file mode 100644
index fdc4a3d..0000000
--- a/public/libs/Cesium/Workers/createBoxGeometry.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './BoxGeometry-009c66b6'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, arrayFill, GeometryOffsetAttribute, VertexFormat, BoxGeometry) { 'use strict';
-
-    function createBoxGeometry(boxGeometry, offset) {
-        if (when.defined(offset)) {
-            boxGeometry = BoxGeometry.BoxGeometry.unpack(boxGeometry, offset);
-        }
-        return BoxGeometry.BoxGeometry.createGeometry(boxGeometry);
-    }
-
-    return createBoxGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createBoxOutlineGeometry.js b/public/libs/Cesium/Workers/createBoxOutlineGeometry.js
deleted file mode 100644
index 0bc7bc3..0000000
--- a/public/libs/Cesium/Workers/createBoxOutlineGeometry.js
+++ /dev/null
@@ -1,321 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, arrayFill, GeometryOffsetAttribute) { 'use strict';
-
-    var diffScratch = new Cartographic.Cartesian3();
-
-        /**
-         * A description of the outline of a cube centered at the origin.
-         *
-         * @alias BoxOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3} options.minimum The minimum x, y, and z coordinates of the box.
-         * @param {Cartesian3} options.maximum The maximum x, y, and z coordinates of the box.
-         *
-         * @see BoxOutlineGeometry.fromDimensions
-         * @see BoxOutlineGeometry.createGeometry
-         * @see Packable
-         *
-         * @example
-         * var box = new Cesium.BoxOutlineGeometry({
-         *   maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0),
-         *   minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0)
-         * });
-         * var geometry = Cesium.BoxOutlineGeometry.createGeometry(box);
-         */
-        function BoxOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var min = options.minimum;
-            var max = options.maximum;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('min', min);
-            Check.Check.typeOf.object('max', max);
-            if (when.defined(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                throw new Check.DeveloperError('GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry.');
-            }
-            //>>includeEnd('debug');
-
-            this._min = Cartographic.Cartesian3.clone(min);
-            this._max = Cartographic.Cartesian3.clone(max);
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createBoxOutlineGeometry';
-        }
-
-        /**
-         * Creates an outline of a cube centered at the origin given its dimensions.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3} options.dimensions The width, depth, and height of the box stored in the x, y, and z coordinates of the <code>Cartesian3</code>, respectively.
-         * @returns {BoxOutlineGeometry}
-         *
-         * @exception {DeveloperError} All dimensions components must be greater than or equal to zero.
-         *
-         *
-         * @example
-         * var box = Cesium.BoxOutlineGeometry.fromDimensions({
-         *   dimensions : new Cesium.Cartesian3(500000.0, 500000.0, 500000.0)
-         * });
-         * var geometry = Cesium.BoxOutlineGeometry.createGeometry(box);
-         *
-         * @see BoxOutlineGeometry.createGeometry
-         */
-        BoxOutlineGeometry.fromDimensions = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var dimensions = options.dimensions;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('dimensions', dimensions);
-            Check.Check.typeOf.number.greaterThanOrEquals('dimensions.x', dimensions.x, 0);
-            Check.Check.typeOf.number.greaterThanOrEquals('dimensions.y', dimensions.y, 0);
-            Check.Check.typeOf.number.greaterThanOrEquals('dimensions.z', dimensions.z, 0);
-            //>>includeEnd('debug');
-
-            var corner = Cartographic.Cartesian3.multiplyByScalar(dimensions, 0.5, new Cartographic.Cartesian3());
-
-            return new BoxOutlineGeometry({
-                minimum : Cartographic.Cartesian3.negate(corner, new Cartographic.Cartesian3()),
-                maximum : corner,
-                offsetAttribute: options.offsetAttribute
-            });
-        };
-
-        /**
-         * Creates an outline of a cube from the dimensions of an AxisAlignedBoundingBox.
-         *
-         * @param {AxisAlignedBoundingBox} boundingBox A description of the AxisAlignedBoundingBox.
-         * @returns {BoxOutlineGeometry}
-         *
-         *
-         *
-         * @example
-         * var aabb = Cesium.AxisAlignedBoundingBox.fromPoints(Cesium.Cartesian3.fromDegreesArray([
-         *      -72.0, 40.0,
-         *      -70.0, 35.0,
-         *      -75.0, 30.0,
-         *      -70.0, 30.0,
-         *      -68.0, 40.0
-         * ]));
-         * var box = Cesium.BoxOutlineGeometry.fromAxisAlignedBoundingBox(aabb);
-         *
-         *  @see BoxOutlineGeometry.createGeometry
-         */
-        BoxOutlineGeometry.fromAxisAlignedBoundingBox = function(boundingBox) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('boundindBox', boundingBox);
-            //>>includeEnd('debug');
-
-            return new BoxOutlineGeometry({
-                minimum : boundingBox.minimum,
-                maximum : boundingBox.maximum
-            });
-        };
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        BoxOutlineGeometry.packedLength = 2 * Cartographic.Cartesian3.packedLength + 1;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {BoxOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        BoxOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            Cartographic.Cartesian3.pack(value._min, array, startingIndex);
-            Cartographic.Cartesian3.pack(value._max, array, startingIndex + Cartographic.Cartesian3.packedLength);
-            array[startingIndex + (Cartographic.Cartesian3.packedLength * 2)] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchMin = new Cartographic.Cartesian3();
-        var scratchMax = new Cartographic.Cartesian3();
-        var scratchOptions = {
-            minimum : scratchMin,
-            maximum : scratchMax,
-            offsetAttribute : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {BoxOutlineGeometry} [result] The object into which to store the result.
-         * @returns {BoxOutlineGeometry} The modified result parameter or a new BoxOutlineGeometry instance if one was not provided.
-         */
-        BoxOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var min = Cartographic.Cartesian3.unpack(array, startingIndex, scratchMin);
-            var max = Cartographic.Cartesian3.unpack(array, startingIndex + Cartographic.Cartesian3.packedLength, scratchMax);
-            var offsetAttribute = array[startingIndex + Cartographic.Cartesian3.packedLength * 2];
-
-            if (!when.defined(result)) {
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-                return new BoxOutlineGeometry(scratchOptions);
-            }
-
-            result._min = Cartographic.Cartesian3.clone(min, result._min);
-            result._max = Cartographic.Cartesian3.clone(max, result._max);
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of an outline of a box, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {BoxOutlineGeometry} boxGeometry A description of the box outline.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        BoxOutlineGeometry.createGeometry = function(boxGeometry) {
-            var min = boxGeometry._min;
-            var max = boxGeometry._max;
-
-            if (Cartographic.Cartesian3.equals(min, max)) {
-                return;
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            var indices = new Uint16Array(12 * 2);
-            var positions = new Float64Array(8 * 3);
-
-            positions[0] = min.x;
-            positions[1] = min.y;
-            positions[2] = min.z;
-            positions[3] = max.x;
-            positions[4] = min.y;
-            positions[5] = min.z;
-            positions[6] = max.x;
-            positions[7] = max.y;
-            positions[8] = min.z;
-            positions[9] = min.x;
-            positions[10] = max.y;
-            positions[11] = min.z;
-
-            positions[12] = min.x;
-            positions[13] = min.y;
-            positions[14] = max.z;
-            positions[15] = max.x;
-            positions[16] = min.y;
-            positions[17] = max.z;
-            positions[18] = max.x;
-            positions[19] = max.y;
-            positions[20] = max.z;
-            positions[21] = min.x;
-            positions[22] = max.y;
-            positions[23] = max.z;
-
-            attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : positions
-            });
-
-            // top
-            indices[0] = 4;
-            indices[1] = 5;
-            indices[2] = 5;
-            indices[3] = 6;
-            indices[4] = 6;
-            indices[5] = 7;
-            indices[6] = 7;
-            indices[7] = 4;
-
-            // bottom
-            indices[8] = 0;
-            indices[9] = 1;
-            indices[10] = 1;
-            indices[11] = 2;
-            indices[12] = 2;
-            indices[13] = 3;
-            indices[14] = 3;
-            indices[15] = 0;
-
-            // left
-            indices[16] = 0;
-            indices[17] = 4;
-            indices[18] = 1;
-            indices[19] = 5;
-
-            //right
-            indices[20] = 2;
-            indices[21] = 6;
-            indices[22] = 3;
-            indices[23] = 7;
-
-            var diff = Cartographic.Cartesian3.subtract(max, min, diffScratch);
-            var radius = Cartographic.Cartesian3.magnitude(diff) * 0.5;
-
-            if (when.defined(boxGeometry._offsetAttribute)) {
-                var length = positions.length;
-                var applyOffset = new Uint8Array(length / 3);
-                var offsetValue = boxGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                arrayFill.arrayFill(applyOffset, offsetValue);
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values: applyOffset
-                });
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : new BoundingSphere.BoundingSphere(Cartographic.Cartesian3.ZERO, radius),
-                offsetAttribute : boxGeometry._offsetAttribute
-            });
-        };
-
-    function createBoxOutlineGeometry(boxGeometry, offset) {
-        if (when.defined(offset)) {
-            boxGeometry = BoxOutlineGeometry.unpack(boxGeometry, offset);
-        }
-        return BoxOutlineGeometry.createGeometry(boxGeometry);
-    }
-
-    return createBoxOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createCircleGeometry.js b/public/libs/Cesium/Workers/createCircleGeometry.js
deleted file mode 100644
index 2afabfe..0000000
--- a/public/libs/Cesium/Workers/createCircleGeometry.js
+++ /dev/null
@@ -1,214 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './EllipseGeometryLibrary-7533a967', './GeometryInstance-93a01b5d', './EllipseGeometry-185aabb4'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, arrayFill, GeometryOffsetAttribute, VertexFormat, EllipseGeometryLibrary, GeometryInstance, EllipseGeometry) { 'use strict';
-
-    /**
-         * A description of a circle on the ellipsoid. Circle geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}.
-         *
-         * @alias CircleGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3} options.center The circle's center point in the fixed frame.
-         * @param {Number} options.radius The radius in meters.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid the circle will be on.
-         * @param {Number} [options.height=0.0] The distance in meters between the circle and the ellipsoid surface.
-         * @param {Number} [options.granularity=0.02] The angular distance between points on the circle in radians.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {Number} [options.extrudedHeight=0.0] The distance in meters between the circle's extruded face and the ellipsoid surface.
-         * @param {Number} [options.stRotation=0.0] The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise.
-         *
-         * @exception {DeveloperError} radius must be greater than zero.
-         * @exception {DeveloperError} granularity must be greater than zero.
-         *
-         * @see CircleGeometry.createGeometry
-         * @see Packable
-         *
-         * @example
-         * // Create a circle.
-         * var circle = new Cesium.CircleGeometry({
-         *   center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
-         *   radius : 100000.0
-         * });
-         * var geometry = Cesium.CircleGeometry.createGeometry(circle);
-         */
-        function CircleGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var radius = options.radius;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('radius', radius);
-            //>>includeEnd('debug');
-
-            var ellipseGeometryOptions = {
-                center : options.center,
-                semiMajorAxis : radius,
-                semiMinorAxis : radius,
-                ellipsoid : options.ellipsoid,
-                height : options.height,
-                extrudedHeight : options.extrudedHeight,
-                granularity : options.granularity,
-                vertexFormat : options.vertexFormat,
-                stRotation : options.stRotation,
-                shadowVolume: options.shadowVolume
-            };
-            this._ellipseGeometry = new EllipseGeometry.EllipseGeometry(ellipseGeometryOptions);
-            this._workerName = 'createCircleGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        CircleGeometry.packedLength = EllipseGeometry.EllipseGeometry.packedLength;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {CircleGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        CircleGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            //>>includeEnd('debug');
-            return EllipseGeometry.EllipseGeometry.pack(value._ellipseGeometry, array, startingIndex);
-        };
-
-        var scratchEllipseGeometry = new EllipseGeometry.EllipseGeometry({
-            center : new Cartographic.Cartesian3(),
-            semiMajorAxis : 1.0,
-            semiMinorAxis : 1.0
-        });
-        var scratchOptions = {
-            center : new Cartographic.Cartesian3(),
-            radius : undefined,
-            ellipsoid : Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE),
-            height : undefined,
-            extrudedHeight : undefined,
-            granularity : undefined,
-            vertexFormat : new VertexFormat.VertexFormat(),
-            stRotation : undefined,
-            semiMajorAxis : undefined,
-            semiMinorAxis : undefined,
-            shadowVolume: undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {CircleGeometry} [result] The object into which to store the result.
-         * @returns {CircleGeometry} The modified result parameter or a new CircleGeometry instance if one was not provided.
-         */
-        CircleGeometry.unpack = function(array, startingIndex, result) {
-            var ellipseGeometry = EllipseGeometry.EllipseGeometry.unpack(array, startingIndex, scratchEllipseGeometry);
-            scratchOptions.center = Cartographic.Cartesian3.clone(ellipseGeometry._center, scratchOptions.center);
-            scratchOptions.ellipsoid = Cartesian2.Ellipsoid.clone(ellipseGeometry._ellipsoid, scratchOptions.ellipsoid);
-            scratchOptions.height = ellipseGeometry._height;
-            scratchOptions.extrudedHeight = ellipseGeometry._extrudedHeight;
-            scratchOptions.granularity = ellipseGeometry._granularity;
-            scratchOptions.vertexFormat = VertexFormat.VertexFormat.clone(ellipseGeometry._vertexFormat, scratchOptions.vertexFormat);
-            scratchOptions.stRotation = ellipseGeometry._stRotation;
-            scratchOptions.shadowVolume = ellipseGeometry._shadowVolume;
-
-            if (!when.defined(result)) {
-                scratchOptions.radius = ellipseGeometry._semiMajorAxis;
-                return new CircleGeometry(scratchOptions);
-            }
-
-            scratchOptions.semiMajorAxis = ellipseGeometry._semiMajorAxis;
-            scratchOptions.semiMinorAxis = ellipseGeometry._semiMinorAxis;
-            result._ellipseGeometry = new EllipseGeometry.EllipseGeometry(scratchOptions);
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of a circle on an ellipsoid, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {CircleGeometry} circleGeometry A description of the circle.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        CircleGeometry.createGeometry = function(circleGeometry) {
-            return EllipseGeometry.EllipseGeometry.createGeometry(circleGeometry._ellipseGeometry);
-        };
-
-        /**
-         * @private
-         */
-        CircleGeometry.createShadowVolume = function(circleGeometry, minHeightFunc, maxHeightFunc) {
-            var granularity = circleGeometry._ellipseGeometry._granularity;
-            var ellipsoid = circleGeometry._ellipseGeometry._ellipsoid;
-
-            var minHeight = minHeightFunc(granularity, ellipsoid);
-            var maxHeight = maxHeightFunc(granularity, ellipsoid);
-
-            return new CircleGeometry({
-                center : circleGeometry._ellipseGeometry._center,
-                radius : circleGeometry._ellipseGeometry._semiMajorAxis,
-                ellipsoid : ellipsoid,
-                stRotation : circleGeometry._ellipseGeometry._stRotation,
-                granularity : granularity,
-                extrudedHeight : minHeight,
-                height : maxHeight,
-                vertexFormat : VertexFormat.VertexFormat.POSITION_ONLY,
-                shadowVolume: true
-            });
-        };
-
-        Object.defineProperties(CircleGeometry.prototype, {
-            /**
-             * @private
-             */
-            rectangle : {
-                get : function() {
-                    return this._ellipseGeometry.rectangle;
-                }
-            },
-            /**
-             * For remapping texture coordinates when rendering CircleGeometries as GroundPrimitives.
-             * @private
-             */
-            textureCoordinateRotationPoints : {
-                get : function() {
-                    return this._ellipseGeometry.textureCoordinateRotationPoints;
-                }
-            }
-        });
-
-    function createCircleGeometry(circleGeometry, offset) {
-        if (when.defined(offset)) {
-            circleGeometry = CircleGeometry.unpack(circleGeometry, offset);
-        }
-        circleGeometry._ellipseGeometry._center = Cartographic.Cartesian3.clone(circleGeometry._ellipseGeometry._center);
-        circleGeometry._ellipseGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(circleGeometry._ellipseGeometry._ellipsoid);
-        return CircleGeometry.createGeometry(circleGeometry);
-    }
-
-    return createCircleGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createCircleOutlineGeometry.js b/public/libs/Cesium/Workers/createCircleOutlineGeometry.js
deleted file mode 100644
index 272a882..0000000
--- a/public/libs/Cesium/Workers/createCircleOutlineGeometry.js
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './EllipseGeometryLibrary-7533a967', './EllipseOutlineGeometry-9a21ac97'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, EllipseGeometryLibrary, EllipseOutlineGeometry) { 'use strict';
-
-    /**
-         * A description of the outline of a circle on the ellipsoid.
-         *
-         * @alias CircleOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3} options.center The circle's center point in the fixed frame.
-         * @param {Number} options.radius The radius in meters.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid the circle will be on.
-         * @param {Number} [options.height=0.0] The distance in meters between the circle and the ellipsoid surface.
-         * @param {Number} [options.granularity=0.02] The angular distance between points on the circle in radians.
-         * @param {Number} [options.extrudedHeight=0.0] The distance in meters between the circle's extruded face and the ellipsoid surface.
-         * @param {Number} [options.numberOfVerticalLines=16] Number of lines to draw between the top and bottom of an extruded circle.
-         *
-         * @exception {DeveloperError} radius must be greater than zero.
-         * @exception {DeveloperError} granularity must be greater than zero.
-         *
-         * @see CircleOutlineGeometry.createGeometry
-         * @see Packable
-         *
-         * @example
-         * // Create a circle.
-         * var circle = new Cesium.CircleOutlineGeometry({
-         *   center : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
-         *   radius : 100000.0
-         * });
-         * var geometry = Cesium.CircleOutlineGeometry.createGeometry(circle);
-         */
-        function CircleOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var radius = options.radius;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('radius', radius);
-            //>>includeEnd('debug');
-
-            var ellipseGeometryOptions = {
-                center : options.center,
-                semiMajorAxis : radius,
-                semiMinorAxis : radius,
-                ellipsoid : options.ellipsoid,
-                height : options.height,
-                extrudedHeight : options.extrudedHeight,
-                granularity : options.granularity,
-                numberOfVerticalLines : options.numberOfVerticalLines
-            };
-            this._ellipseGeometry = new EllipseOutlineGeometry.EllipseOutlineGeometry(ellipseGeometryOptions);
-            this._workerName = 'createCircleOutlineGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        CircleOutlineGeometry.packedLength = EllipseOutlineGeometry.EllipseOutlineGeometry.packedLength;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {CircleOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        CircleOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            //>>includeEnd('debug');
-            return EllipseOutlineGeometry.EllipseOutlineGeometry.pack(value._ellipseGeometry, array, startingIndex);
-        };
-
-        var scratchEllipseGeometry = new EllipseOutlineGeometry.EllipseOutlineGeometry({
-            center : new Cartographic.Cartesian3(),
-            semiMajorAxis : 1.0,
-            semiMinorAxis : 1.0
-        });
-        var scratchOptions = {
-            center : new Cartographic.Cartesian3(),
-            radius : undefined,
-            ellipsoid : Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE),
-            height : undefined,
-            extrudedHeight : undefined,
-            granularity : undefined,
-            numberOfVerticalLines : undefined,
-            semiMajorAxis : undefined,
-            semiMinorAxis : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {CircleOutlineGeometry} [result] The object into which to store the result.
-         * @returns {CircleOutlineGeometry} The modified result parameter or a new CircleOutlineGeometry instance if one was not provided.
-         */
-        CircleOutlineGeometry.unpack = function(array, startingIndex, result) {
-            var ellipseGeometry = EllipseOutlineGeometry.EllipseOutlineGeometry.unpack(array, startingIndex, scratchEllipseGeometry);
-            scratchOptions.center = Cartographic.Cartesian3.clone(ellipseGeometry._center, scratchOptions.center);
-            scratchOptions.ellipsoid = Cartesian2.Ellipsoid.clone(ellipseGeometry._ellipsoid, scratchOptions.ellipsoid);
-            scratchOptions.height = ellipseGeometry._height;
-            scratchOptions.extrudedHeight = ellipseGeometry._extrudedHeight;
-            scratchOptions.granularity = ellipseGeometry._granularity;
-            scratchOptions.numberOfVerticalLines = ellipseGeometry._numberOfVerticalLines;
-
-            if (!when.defined(result)) {
-                scratchOptions.radius = ellipseGeometry._semiMajorAxis;
-                return new CircleOutlineGeometry(scratchOptions);
-            }
-
-            scratchOptions.semiMajorAxis = ellipseGeometry._semiMajorAxis;
-            scratchOptions.semiMinorAxis = ellipseGeometry._semiMinorAxis;
-            result._ellipseGeometry = new EllipseOutlineGeometry.EllipseOutlineGeometry(scratchOptions);
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of an outline of a circle on an ellipsoid, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {CircleOutlineGeometry} circleGeometry A description of the circle.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        CircleOutlineGeometry.createGeometry = function(circleGeometry) {
-            return EllipseOutlineGeometry.EllipseOutlineGeometry.createGeometry(circleGeometry._ellipseGeometry);
-        };
-
-    function createCircleOutlineGeometry(circleGeometry, offset) {
-        if (when.defined(offset)) {
-            circleGeometry = CircleOutlineGeometry.unpack(circleGeometry, offset);
-        }
-        circleGeometry._ellipseGeometry._center = Cartographic.Cartesian3.clone(circleGeometry._ellipseGeometry._center);
-        circleGeometry._ellipseGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(circleGeometry._ellipseGeometry._ellipsoid);
-        return CircleOutlineGeometry.createGeometry(circleGeometry);
-    }
-
-    return createCircleOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createCoplanarPolygonGeometry.js b/public/libs/Cesium/Workers/createCoplanarPolygonGeometry.js
deleted file mode 100644
index 970e1fe..0000000
--- a/public/libs/Cesium/Workers/createCoplanarPolygonGeometry.js
+++ /dev/null
@@ -1,435 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './VertexFormat-fe4db402', './GeometryInstance-93a01b5d', './arrayRemoveDuplicates-f0b089b1', './BoundingRectangle-dc808c42', './EllipsoidTangentPlane-e324bfa4', './OrientedBoundingBox-0ede1598', './CoplanarPolygonGeometryLibrary-81d1880f', './ArcType-66bc286a', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './PolygonGeometryLibrary-9cc18cc2'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, VertexFormat, GeometryInstance, arrayRemoveDuplicates, BoundingRectangle, EllipsoidTangentPlane, OrientedBoundingBox, CoplanarPolygonGeometryLibrary, ArcType, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, PolygonGeometryLibrary) { 'use strict';
-
-    var scratchPosition = new Cartographic.Cartesian3();
-        var scratchBR = new BoundingRectangle.BoundingRectangle();
-        var stScratch = new Cartesian2.Cartesian2();
-        var textureCoordinatesOrigin = new Cartesian2.Cartesian2();
-        var scratchNormal = new Cartographic.Cartesian3();
-        var scratchTangent = new Cartographic.Cartesian3();
-        var scratchBitangent = new Cartographic.Cartesian3();
-        var centerScratch = new Cartographic.Cartesian3();
-        var axis1Scratch = new Cartographic.Cartesian3();
-        var axis2Scratch = new Cartographic.Cartesian3();
-        var quaternionScratch = new Transforms.Quaternion();
-        var textureMatrixScratch = new BoundingSphere.Matrix3();
-        var tangentRotationScratch = new BoundingSphere.Matrix3();
-        var surfaceNormalScratch = new Cartographic.Cartesian3();
-
-        function createGeometryFromPolygon(polygon, vertexFormat, boundingRectangle, stRotation, projectPointTo2D, normal, tangent, bitangent) {
-            var positions = polygon.positions;
-            var indices = PolygonPipeline.PolygonPipeline.triangulate(polygon.positions2D, polygon.holes);
-
-            /* If polygon is completely unrenderable, just use the first three vertices */
-            if (indices.length < 3) {
-                indices = [0, 1, 2];
-            }
-
-            var newIndices = IndexDatatype.IndexDatatype.createTypedArray(positions.length, indices.length);
-            newIndices.set(indices);
-
-            var textureMatrix = textureMatrixScratch;
-            if (stRotation !== 0.0) {
-                var rotation = Transforms.Quaternion.fromAxisAngle(normal, stRotation, quaternionScratch);
-                textureMatrix = BoundingSphere.Matrix3.fromQuaternion(rotation, textureMatrix);
-
-                if (vertexFormat.tangent || vertexFormat.bitangent) {
-                    rotation = Transforms.Quaternion.fromAxisAngle(normal, -stRotation, quaternionScratch);
-                    var tangentRotation = BoundingSphere.Matrix3.fromQuaternion(rotation, tangentRotationScratch);
-
-                    tangent = Cartographic.Cartesian3.normalize(BoundingSphere.Matrix3.multiplyByVector(tangentRotation, tangent, tangent), tangent);
-                    if (vertexFormat.bitangent) {
-                        bitangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(normal, tangent, bitangent), bitangent);
-                    }
-                }
-            } else {
-                textureMatrix = BoundingSphere.Matrix3.clone(BoundingSphere.Matrix3.IDENTITY, textureMatrix);
-            }
-
-            var stOrigin = textureCoordinatesOrigin;
-            if (vertexFormat.st) {
-                stOrigin.x = boundingRectangle.x;
-                stOrigin.y = boundingRectangle.y;
-            }
-
-            var length = positions.length;
-            var size = length * 3;
-            var flatPositions = new Float64Array(size);
-            var normals = vertexFormat.normal ? new Float32Array(size) : undefined;
-            var tangents = vertexFormat.tangent ? new Float32Array(size) : undefined;
-            var bitangents = vertexFormat.bitangent ? new Float32Array(size) : undefined;
-            var textureCoordinates = vertexFormat.st ? new Float32Array(length * 2) : undefined;
-
-            var positionIndex = 0;
-            var normalIndex = 0;
-            var bitangentIndex = 0;
-            var tangentIndex = 0;
-            var stIndex = 0;
-
-            for (var i = 0; i < length; i++) {
-                var position = positions[i];
-                flatPositions[positionIndex++] = position.x;
-                flatPositions[positionIndex++] = position.y;
-                flatPositions[positionIndex++] = position.z;
-
-                if (vertexFormat.st) {
-                    var p = BoundingSphere.Matrix3.multiplyByVector(textureMatrix, position, scratchPosition);
-                    var st = projectPointTo2D(p, stScratch);
-                    Cartesian2.Cartesian2.subtract(st, stOrigin, st);
-
-                    var stx = _Math.CesiumMath.clamp(st.x / boundingRectangle.width, 0, 1);
-                    var sty = _Math.CesiumMath.clamp(st.y / boundingRectangle.height, 0, 1);
-                    textureCoordinates[stIndex++] = stx;
-                    textureCoordinates[stIndex++] = sty;
-                }
-
-                if (vertexFormat.normal) {
-                    normals[normalIndex++] = normal.x;
-                    normals[normalIndex++] = normal.y;
-                    normals[normalIndex++] = normal.z;
-                }
-
-                if (vertexFormat.tangent) {
-                    tangents[tangentIndex++] = tangent.x;
-                    tangents[tangentIndex++] = tangent.y;
-                    tangents[tangentIndex++] = tangent.z;
-                }
-
-                if (vertexFormat.bitangent) {
-                    bitangents[bitangentIndex++] = bitangent.x;
-                    bitangents[bitangentIndex++] = bitangent.y;
-                    bitangents[bitangentIndex++] = bitangent.z;
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-
-            if (vertexFormat.position) {
-                attributes.position = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : flatPositions
-                });
-            }
-
-            if (vertexFormat.normal) {
-                attributes.normal = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : normals
-                });
-            }
-
-            if (vertexFormat.tangent) {
-                attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : tangents
-                });
-            }
-
-            if (vertexFormat.bitangent) {
-                attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : bitangents
-                });
-            }
-
-            if (vertexFormat.st) {
-                attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : textureCoordinates
-                });
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : newIndices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES
-            });
-        }
-
-        /**
-         * A description of a polygon composed of arbitrary coplanar positions.
-         *
-         * @alias CoplanarPolygonGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {PolygonHierarchy} options.polygonHierarchy A polygon hierarchy that can include holes.
-         * @param {Number} [options.stRotation=0.0] The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         *
-         * @example
-         * var polygon = new Cesium.CoplanarPolygonGeometry({
-         *   positions : Cesium.Cartesian3.fromDegreesArrayHeights([
-         *      -90.0, 30.0, 0.0,
-         *      -90.0, 30.0, 1000.0,
-         *      -80.0, 30.0, 1000.0,
-         *      -80.0, 30.0, 0.0
-         *   ])
-         * });
-         * var geometry = Cesium.CoplanarPolygonGeometry.createGeometry(polygon);
-         *
-         * @see CoplanarPolygonGeometry.createGeometry
-         */
-        function CoplanarPolygonGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var polygonHierarchy = options.polygonHierarchy;
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.polygonHierarchy', polygonHierarchy);
-            //>>includeEnd('debug');
-
-            var vertexFormat = when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT);
-            this._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat);
-            this._polygonHierarchy = polygonHierarchy;
-            this._stRotation = when.defaultValue(options.stRotation, 0.0);
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84));
-            this._workerName = 'createCoplanarPolygonGeometry';
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = PolygonGeometryLibrary.PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + VertexFormat.VertexFormat.packedLength + Cartesian2.Ellipsoid.packedLength + 2;
-        }
-
-        /**
-         * A description of a coplanar polygon from an array of positions.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of positions that defined the corner points of the polygon.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {Number} [options.stRotation=0.0] The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @returns {CoplanarPolygonGeometry}
-         *
-         * @example
-         * // create a polygon from points
-         * var polygon = Cesium.CoplanarPolygonGeometry.fromPositions({
-         *   positions : Cesium.Cartesian3.fromDegreesArray([
-         *     -72.0, 40.0,
-         *     -70.0, 35.0,
-         *     -75.0, 30.0,
-         *     -70.0, 30.0,
-         *     -68.0, 40.0
-         *   ])
-         * });
-         * var geometry = Cesium.PolygonGeometry.createGeometry(polygon);
-         *
-         * @see PolygonGeometry#createGeometry
-         */
-        CoplanarPolygonGeometry.fromPositions = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.positions', options.positions);
-            //>>includeEnd('debug');
-
-            var newOptions = {
-                polygonHierarchy : {
-                    positions : options.positions
-                },
-                vertexFormat : options.vertexFormat,
-                stRotation : options.stRotation,
-                ellipsoid : options.ellipsoid
-            };
-            return new CoplanarPolygonGeometry(newOptions);
-        };
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {CoplanarPolygonGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        CoplanarPolygonGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            startingIndex = PolygonGeometryLibrary.PolygonGeometryLibrary.packPolygonHierarchy(value._polygonHierarchy, array, startingIndex);
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._stRotation;
-            array[startingIndex] = value.packedLength;
-
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            polygonHierarchy : {}
-        };
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {CoplanarPolygonGeometry} [result] The object into which to store the result.
-         * @returns {CoplanarPolygonGeometry} The modified result parameter or a new CoplanarPolygonGeometry instance if one was not provided.
-         */
-        CoplanarPolygonGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var polygonHierarchy = PolygonGeometryLibrary.PolygonGeometryLibrary.unpackPolygonHierarchy(array, startingIndex);
-            startingIndex = polygonHierarchy.startingIndex;
-            delete polygonHierarchy.startingIndex;
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var stRotation = array[startingIndex++];
-            var packedLength = array[startingIndex];
-
-            if (!when.defined(result)) {
-                result = new CoplanarPolygonGeometry(scratchOptions);
-            }
-
-            result._polygonHierarchy = polygonHierarchy;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._stRotation = stRotation;
-            result.packedLength = packedLength;
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of an arbitrary coplanar polygon, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {CoplanarPolygonGeometry} polygonGeometry A description of the polygon.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        CoplanarPolygonGeometry.createGeometry = function(polygonGeometry) {
-            var vertexFormat = polygonGeometry._vertexFormat;
-            var polygonHierarchy = polygonGeometry._polygonHierarchy;
-            var stRotation = polygonGeometry._stRotation;
-
-            var outerPositions = polygonHierarchy.positions;
-            outerPositions = arrayRemoveDuplicates.arrayRemoveDuplicates(outerPositions, Cartographic.Cartesian3.equalsEpsilon, true);
-            if (outerPositions.length < 3) {
-                return;
-            }
-
-            var normal = scratchNormal;
-            var tangent = scratchTangent;
-            var bitangent = scratchBitangent;
-            var axis1 = axis1Scratch;
-            var axis2 = axis2Scratch;
-
-            var validGeometry = CoplanarPolygonGeometryLibrary.CoplanarPolygonGeometryLibrary.computeProjectTo2DArguments(outerPositions, centerScratch, axis1, axis2);
-            if (!validGeometry) {
-                return undefined;
-            }
-
-            normal = Cartographic.Cartesian3.cross(axis1, axis2, normal);
-            normal = Cartographic.Cartesian3.normalize(normal, normal);
-
-            if (!Cartographic.Cartesian3.equalsEpsilon(centerScratch, Cartographic.Cartesian3.ZERO, _Math.CesiumMath.EPSILON6)) {
-                var surfaceNormal = polygonGeometry._ellipsoid.geodeticSurfaceNormal(centerScratch, surfaceNormalScratch);
-                if (Cartographic.Cartesian3.dot(normal, surfaceNormal) < 0) {
-                    normal = Cartographic.Cartesian3.negate(normal, normal);
-                    axis1 = Cartographic.Cartesian3.negate(axis1, axis1);
-                }
-            }
-
-            var projectPoints = CoplanarPolygonGeometryLibrary.CoplanarPolygonGeometryLibrary.createProjectPointsTo2DFunction(centerScratch, axis1, axis2);
-            var projectPoint = CoplanarPolygonGeometryLibrary.CoplanarPolygonGeometryLibrary.createProjectPointTo2DFunction(centerScratch, axis1, axis2);
-
-            if (vertexFormat.tangent) {
-                tangent = Cartographic.Cartesian3.clone(axis1, tangent);
-            }
-            if (vertexFormat.bitangent) {
-                bitangent = Cartographic.Cartesian3.clone(axis2, bitangent);
-            }
-
-            var results = PolygonGeometryLibrary.PolygonGeometryLibrary.polygonsFromHierarchy(polygonHierarchy, projectPoints, false);
-            var hierarchy = results.hierarchy;
-            var polygons = results.polygons;
-
-            if (hierarchy.length === 0) {
-                return;
-            }
-            outerPositions = hierarchy[0].outerRing;
-
-            var boundingSphere = BoundingSphere.BoundingSphere.fromPoints(outerPositions);
-            var boundingRectangle = PolygonGeometryLibrary.PolygonGeometryLibrary.computeBoundingRectangle(normal, projectPoint, outerPositions, stRotation, scratchBR);
-
-            var geometries = [];
-            for (var i = 0; i < polygons.length; i++) {
-                var geometryInstance = new GeometryInstance.GeometryInstance({
-                    geometry : createGeometryFromPolygon(polygons[i], vertexFormat, boundingRectangle, stRotation, projectPoint, normal, tangent, bitangent)
-                });
-
-                geometries.push(geometryInstance);
-            }
-
-            var geometry = GeometryPipeline.GeometryPipeline.combineInstances(geometries)[0];
-            geometry.attributes.position.values = new Float64Array(geometry.attributes.position.values);
-            geometry.indices = IndexDatatype.IndexDatatype.createTypedArray(geometry.attributes.position.values.length / 3, geometry.indices);
-
-            var attributes = geometry.attributes;
-            if (!vertexFormat.position) {
-                delete attributes.position;
-            }
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : geometry.indices,
-                primitiveType : geometry.primitiveType,
-                boundingSphere : boundingSphere
-            });
-        };
-
-    function createCoplanarPolygonGeometry(polygonGeometry, offset) {
-        if (when.defined(offset)) {
-            polygonGeometry = CoplanarPolygonGeometry.unpack(polygonGeometry, offset);
-        }
-        return CoplanarPolygonGeometry.createGeometry(polygonGeometry);
-    }
-
-    return createCoplanarPolygonGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js b/public/libs/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js
deleted file mode 100644
index 5d31c44..0000000
--- a/public/libs/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js
+++ /dev/null
@@ -1,231 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './GeometryInstance-93a01b5d', './arrayRemoveDuplicates-f0b089b1', './EllipsoidTangentPlane-e324bfa4', './OrientedBoundingBox-0ede1598', './CoplanarPolygonGeometryLibrary-81d1880f', './ArcType-66bc286a', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './PolygonGeometryLibrary-9cc18cc2'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, GeometryInstance, arrayRemoveDuplicates, EllipsoidTangentPlane, OrientedBoundingBox, CoplanarPolygonGeometryLibrary, ArcType, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, PolygonGeometryLibrary) { 'use strict';
-
-    function createGeometryFromPositions(positions){
-            var length = positions.length;
-            var flatPositions = new Float64Array(length * 3);
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(length, length * 2);
-
-            var positionIndex = 0;
-            var index = 0;
-
-            for (var i = 0; i < length; i++) {
-                var position = positions[i];
-                flatPositions[positionIndex++] = position.x;
-                flatPositions[positionIndex++] = position.y;
-                flatPositions[positionIndex++] = position.z;
-
-                indices[index++] = i;
-                indices[index++] = (i + 1) % length;
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes({
-                position: new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : flatPositions
-                })
-            });
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES
-            });
-        }
-
-        /**
-         * A description of the outline of a polygon composed of arbitrary coplanar positions.
-         *
-         * @alias CoplanarPolygonOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {PolygonHierarchy} options.polygonHierarchy A polygon hierarchy that can include holes.
-         *
-         * @see CoplanarPolygonOutlineGeometry.createGeometry
-         *
-         * @example
-         * var polygonOutline = new Cesium.CoplanarPolygonOutlineGeometry({
-         *   positions : Cesium.Cartesian3.fromDegreesArrayHeights([
-         *      -90.0, 30.0, 0.0,
-         *      -90.0, 30.0, 1000.0,
-         *      -80.0, 30.0, 1000.0,
-         *      -80.0, 30.0, 0.0
-         *   ])
-         * });
-         * var geometry = Cesium.CoplanarPolygonOutlineGeometry.createGeometry(polygonOutline);
-         */
-        function CoplanarPolygonOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var polygonHierarchy = options.polygonHierarchy;
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.polygonHierarchy', polygonHierarchy);
-            //>>includeEnd('debug');
-
-            this._polygonHierarchy = polygonHierarchy;
-            this._workerName = 'createCoplanarPolygonOutlineGeometry';
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = PolygonGeometryLibrary.PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + 1;
-        }
-
-        /**
-         * A description of a coplanar polygon outline from an array of positions.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of positions that defined the corner points of the polygon.
-         * @returns {CoplanarPolygonOutlineGeometry}
-         */
-        CoplanarPolygonOutlineGeometry.fromPositions = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.positions', options.positions);
-            //>>includeEnd('debug');
-
-            var newOptions = {
-                polygonHierarchy : {
-                    positions : options.positions
-                }
-            };
-            return new CoplanarPolygonOutlineGeometry(newOptions);
-        };
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {CoplanarPolygonOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        CoplanarPolygonOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            startingIndex = PolygonGeometryLibrary.PolygonGeometryLibrary.packPolygonHierarchy(value._polygonHierarchy, array, startingIndex);
-
-            array[startingIndex] = value.packedLength;
-
-            return array;
-        };
-
-        var scratchOptions = {
-            polygonHierarchy : {}
-        };
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {CoplanarPolygonOutlineGeometry} [result] The object into which to store the result.
-         * @returns {CoplanarPolygonOutlineGeometry} The modified result parameter or a new CoplanarPolygonOutlineGeometry instance if one was not provided.
-         */
-        CoplanarPolygonOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var polygonHierarchy = PolygonGeometryLibrary.PolygonGeometryLibrary.unpackPolygonHierarchy(array, startingIndex);
-            startingIndex = polygonHierarchy.startingIndex;
-            delete polygonHierarchy.startingIndex;
-            var packedLength = array[startingIndex];
-
-            if (!when.defined(result)) {
-                result = new CoplanarPolygonOutlineGeometry(scratchOptions);
-            }
-
-            result._polygonHierarchy = polygonHierarchy;
-            result.packedLength = packedLength;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of an arbitrary coplanar polygon, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {CoplanarPolygonOutlineGeometry} polygonGeometry A description of the polygon.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        CoplanarPolygonOutlineGeometry.createGeometry = function(polygonGeometry) {
-            var polygonHierarchy = polygonGeometry._polygonHierarchy;
-
-            var outerPositions = polygonHierarchy.positions;
-            outerPositions = arrayRemoveDuplicates.arrayRemoveDuplicates(outerPositions, Cartographic.Cartesian3.equalsEpsilon, true);
-            if (outerPositions.length < 3) {
-                return;
-            }
-            var isValid = CoplanarPolygonGeometryLibrary.CoplanarPolygonGeometryLibrary.validOutline(outerPositions);
-            if (!isValid) {
-                return undefined;
-            }
-
-            var polygons = PolygonGeometryLibrary.PolygonGeometryLibrary.polygonOutlinesFromHierarchy(polygonHierarchy, false);
-
-            if (polygons.length === 0) {
-                return undefined;
-            }
-
-            var geometries = [];
-
-            for (var i = 0; i < polygons.length; i++) {
-                var geometryInstance = new GeometryInstance.GeometryInstance({
-                    geometry : createGeometryFromPositions(polygons[i])
-                });
-                geometries.push(geometryInstance);
-            }
-
-            var geometry = GeometryPipeline.GeometryPipeline.combineInstances(geometries)[0];
-            var boundingSphere = BoundingSphere.BoundingSphere.fromPoints(polygonHierarchy.positions);
-
-            return new GeometryAttribute.Geometry({
-                attributes : geometry.attributes,
-                indices : geometry.indices,
-                primitiveType : geometry.primitiveType,
-                boundingSphere : boundingSphere
-            });
-        };
-
-    function createCoplanarPolygonOutlineGeometry(polygonGeometry, offset) {
-        if (when.defined(offset)) {
-            polygonGeometry = CoplanarPolygonOutlineGeometry.unpack(polygonGeometry, offset);
-        }
-        polygonGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(polygonGeometry._ellipsoid);
-        return CoplanarPolygonOutlineGeometry.createGeometry(polygonGeometry);
-    }
-
-    return createCoplanarPolygonOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createCorridorGeometry.js b/public/libs/Cesium/Workers/createCorridorGeometry.js
deleted file mode 100644
index 88439c8..0000000
--- a/public/libs/Cesium/Workers/createCorridorGeometry.js
+++ /dev/null
@@ -1,1105 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './arrayRemoveDuplicates-f0b089b1', './EllipsoidTangentPlane-e324bfa4', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './PolylineVolumeGeometryLibrary-5bb7662e', './EllipsoidGeodesic-84507801', './PolylinePipeline-a9f32196', './CorridorGeometryLibrary-d15f4d38'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, IntersectionTests, Plane, arrayFill, GeometryOffsetAttribute, VertexFormat, arrayRemoveDuplicates, EllipsoidTangentPlane, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, PolylineVolumeGeometryLibrary, EllipsoidGeodesic, PolylinePipeline, CorridorGeometryLibrary) { 'use strict';
-
-    var cartesian1 = new Cartographic.Cartesian3();
-        var cartesian2 = new Cartographic.Cartesian3();
-        var cartesian3 = new Cartographic.Cartesian3();
-        var cartesian4 = new Cartographic.Cartesian3();
-        var cartesian5 = new Cartographic.Cartesian3();
-        var cartesian6 = new Cartographic.Cartesian3();
-
-        var scratch1 = new Cartographic.Cartesian3();
-        var scratch2 = new Cartographic.Cartesian3();
-
-        function scaleToSurface(positions, ellipsoid) {
-            for (var i = 0; i < positions.length; i++) {
-                positions[i] = ellipsoid.scaleToGeodeticSurface(positions[i], positions[i]);
-            }
-            return positions;
-        }
-
-        function addNormals(attr, normal, left, front, back, vertexFormat) {
-            var normals = attr.normals;
-            var tangents = attr.tangents;
-            var bitangents = attr.bitangents;
-            var forward = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(left, normal, scratch1), scratch1);
-            if (vertexFormat.normal) {
-                CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(normals, normal, front, back);
-            }
-            if (vertexFormat.tangent) {
-                CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(tangents, forward, front, back);
-            }
-            if (vertexFormat.bitangent) {
-                CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(bitangents, left, front, back);
-            }
-        }
-
-        function combine(computedPositions, vertexFormat, ellipsoid) {
-            var positions = computedPositions.positions;
-            var corners = computedPositions.corners;
-            var endPositions = computedPositions.endPositions;
-            var computedLefts = computedPositions.lefts;
-            var computedNormals = computedPositions.normals;
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            var corner;
-            var leftCount = 0;
-            var rightCount = 0;
-            var i;
-            var indicesLength = 0;
-            var length;
-            for (i = 0; i < positions.length; i += 2) {
-                length = positions[i].length - 3;
-                leftCount += length; //subtracting 3 to account for duplicate points at corners
-                indicesLength += length*2;
-                rightCount += positions[i + 1].length - 3;
-            }
-            leftCount += 3; //add back count for end positions
-            rightCount += 3;
-            for (i = 0; i < corners.length; i++) {
-                corner = corners[i];
-                var leftSide = corners[i].leftPositions;
-                if (when.defined(leftSide)) {
-                    length = leftSide.length;
-                    leftCount += length;
-                    indicesLength += length;
-                } else {
-                    length = corners[i].rightPositions.length;
-                    rightCount += length;
-                    indicesLength += length;
-                }
-            }
-
-            var addEndPositions = when.defined(endPositions);
-            var endPositionLength;
-            if (addEndPositions) {
-                endPositionLength = endPositions[0].length - 3;
-                leftCount += endPositionLength;
-                rightCount += endPositionLength;
-                endPositionLength /= 3;
-                indicesLength += endPositionLength * 6;
-            }
-            var size = leftCount + rightCount;
-            var finalPositions = new Float64Array(size);
-            var normals = (vertexFormat.normal) ? new Float32Array(size) : undefined;
-            var tangents = (vertexFormat.tangent) ? new Float32Array(size) : undefined;
-            var bitangents = (vertexFormat.bitangent) ? new Float32Array(size) : undefined;
-            var attr = {
-                normals : normals,
-                tangents : tangents,
-                bitangents : bitangents
-            };
-            var front = 0;
-            var back = size - 1;
-            var UL, LL, UR, LR;
-            var normal = cartesian1;
-            var left = cartesian2;
-            var rightPos, leftPos;
-            var halfLength = endPositionLength / 2;
-
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(size / 3, indicesLength);
-            var index = 0;
-            if (addEndPositions) { // add rounded end
-                leftPos = cartesian3;
-                rightPos = cartesian4;
-                var firstEndPositions = endPositions[0];
-                normal = Cartographic.Cartesian3.fromArray(computedNormals, 0, normal);
-                left = Cartographic.Cartesian3.fromArray(computedLefts, 0, left);
-                for (i = 0; i < halfLength; i++) {
-                    leftPos = Cartographic.Cartesian3.fromArray(firstEndPositions, (halfLength - 1 - i) * 3, leftPos);
-                    rightPos = Cartographic.Cartesian3.fromArray(firstEndPositions, (halfLength + i) * 3, rightPos);
-                    CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, rightPos, front);
-                    CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, leftPos, undefined, back);
-                    addNormals(attr, normal, left, front, back, vertexFormat);
-
-                    LL = front / 3;
-                    LR = LL + 1;
-                    UL = (back - 2) / 3;
-                    UR = UL - 1;
-                    indices[index++] = UL;
-                    indices[index++] = LL;
-                    indices[index++] = UR;
-                    indices[index++] = UR;
-                    indices[index++] = LL;
-                    indices[index++] = LR;
-
-                    front += 3;
-                    back -= 3;
-                }
-            }
-
-            var posIndex = 0;
-            var compIndex = 0;
-            var rightEdge = positions[posIndex++]; //add first two edges
-            var leftEdge = positions[posIndex++];
-            finalPositions.set(rightEdge, front);
-            finalPositions.set(leftEdge, back - leftEdge.length + 1);
-
-            left = Cartographic.Cartesian3.fromArray(computedLefts, compIndex, left);
-            var rightNormal;
-            var leftNormal;
-            length = leftEdge.length - 3;
-            for (i = 0; i < length; i += 3) {
-                rightNormal = ellipsoid.geodeticSurfaceNormal(Cartographic.Cartesian3.fromArray(rightEdge, i, scratch1), scratch1);
-                leftNormal = ellipsoid.geodeticSurfaceNormal(Cartographic.Cartesian3.fromArray(leftEdge, length - i, scratch2), scratch2);
-                normal = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.add(rightNormal, leftNormal, normal), normal);
-                addNormals(attr, normal, left, front, back, vertexFormat);
-
-                LL = front / 3;
-                LR = LL + 1;
-                UL = (back - 2) / 3;
-                UR = UL - 1;
-                indices[index++] = UL;
-                indices[index++] = LL;
-                indices[index++] = UR;
-                indices[index++] = UR;
-                indices[index++] = LL;
-                indices[index++] = LR;
-
-                front += 3;
-                back -= 3;
-            }
-
-            rightNormal = ellipsoid.geodeticSurfaceNormal(Cartographic.Cartesian3.fromArray(rightEdge, length, scratch1), scratch1);
-            leftNormal = ellipsoid.geodeticSurfaceNormal(Cartographic.Cartesian3.fromArray(leftEdge, length, scratch2), scratch2);
-            normal = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.add(rightNormal, leftNormal, normal), normal);
-            compIndex += 3;
-            for (i = 0; i < corners.length; i++) {
-                var j;
-                corner = corners[i];
-                var l = corner.leftPositions;
-                var r = corner.rightPositions;
-                var pivot;
-                var start;
-                var outsidePoint = cartesian6;
-                var previousPoint = cartesian3;
-                var nextPoint = cartesian4;
-                normal = Cartographic.Cartesian3.fromArray(computedNormals, compIndex, normal);
-                if (when.defined(l)) {
-                    addNormals(attr, normal, left, undefined, back, vertexFormat);
-                    back -= 3;
-                    pivot = LR;
-                    start = UR;
-                    for (j = 0; j < l.length / 3; j++) {
-                        outsidePoint = Cartographic.Cartesian3.fromArray(l, j * 3, outsidePoint);
-                        indices[index++] = pivot;
-                        indices[index++] = start - j - 1;
-                        indices[index++] = start - j;
-                        CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, outsidePoint, undefined, back);
-                        previousPoint = Cartographic.Cartesian3.fromArray(finalPositions, (start - j - 1) * 3, previousPoint);
-                        nextPoint = Cartographic.Cartesian3.fromArray(finalPositions, pivot * 3, nextPoint);
-                        left = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.subtract(previousPoint, nextPoint, left), left);
-                        addNormals(attr, normal, left, undefined, back, vertexFormat);
-                        back -= 3;
-                    }
-                    outsidePoint = Cartographic.Cartesian3.fromArray(finalPositions, pivot * 3, outsidePoint);
-                    previousPoint = Cartographic.Cartesian3.subtract(Cartographic.Cartesian3.fromArray(finalPositions, (start) * 3, previousPoint), outsidePoint, previousPoint);
-                    nextPoint = Cartographic.Cartesian3.subtract(Cartographic.Cartesian3.fromArray(finalPositions, (start - j) * 3, nextPoint), outsidePoint, nextPoint);
-                    left = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.add(previousPoint, nextPoint, left), left);
-                    addNormals(attr, normal, left, front, undefined, vertexFormat);
-                    front += 3;
-                } else {
-                    addNormals(attr, normal, left, front, undefined, vertexFormat);
-                    front += 3;
-                    pivot = UR;
-                    start = LR;
-                    for (j = 0; j < r.length / 3; j++) {
-                        outsidePoint = Cartographic.Cartesian3.fromArray(r, j * 3, outsidePoint);
-                        indices[index++] = pivot;
-                        indices[index++] = start + j;
-                        indices[index++] = start + j + 1;
-                        CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, outsidePoint, front);
-                        previousPoint = Cartographic.Cartesian3.fromArray(finalPositions, pivot * 3, previousPoint);
-                        nextPoint = Cartographic.Cartesian3.fromArray(finalPositions, (start + j) * 3, nextPoint);
-                        left = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.subtract(previousPoint, nextPoint, left), left);
-                        addNormals(attr, normal, left, front, undefined, vertexFormat);
-                        front += 3;
-                    }
-                    outsidePoint = Cartographic.Cartesian3.fromArray(finalPositions, pivot * 3, outsidePoint);
-                    previousPoint = Cartographic.Cartesian3.subtract(Cartographic.Cartesian3.fromArray(finalPositions, (start + j) * 3, previousPoint), outsidePoint, previousPoint);
-                    nextPoint = Cartographic.Cartesian3.subtract(Cartographic.Cartesian3.fromArray(finalPositions, start * 3, nextPoint), outsidePoint, nextPoint);
-                    left = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.negate(Cartographic.Cartesian3.add(nextPoint, previousPoint, left), left), left);
-                    addNormals(attr, normal, left, undefined, back, vertexFormat);
-                    back -= 3;
-                }
-                rightEdge = positions[posIndex++];
-                leftEdge = positions[posIndex++];
-                rightEdge.splice(0, 3); //remove duplicate points added by corner
-                leftEdge.splice(leftEdge.length - 3, 3);
-                finalPositions.set(rightEdge, front);
-                finalPositions.set(leftEdge, back - leftEdge.length + 1);
-                length = leftEdge.length - 3;
-
-                compIndex += 3;
-                left = Cartographic.Cartesian3.fromArray(computedLefts, compIndex, left);
-                for (j = 0; j < leftEdge.length; j += 3) {
-                    rightNormal = ellipsoid.geodeticSurfaceNormal(Cartographic.Cartesian3.fromArray(rightEdge, j, scratch1), scratch1);
-                    leftNormal = ellipsoid.geodeticSurfaceNormal(Cartographic.Cartesian3.fromArray(leftEdge, length - j, scratch2), scratch2);
-                    normal = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.add(rightNormal, leftNormal, normal), normal);
-                    addNormals(attr, normal, left, front, back, vertexFormat);
-
-                    LR = front / 3;
-                    LL = LR - 1;
-                    UR = (back - 2) / 3;
-                    UL = UR + 1;
-                    indices[index++] = UL;
-                    indices[index++] = LL;
-                    indices[index++] = UR;
-                    indices[index++] = UR;
-                    indices[index++] = LL;
-                    indices[index++] = LR;
-
-                    front += 3;
-                    back -= 3;
-                }
-                front -= 3;
-                back += 3;
-            }
-            normal = Cartographic.Cartesian3.fromArray(computedNormals, computedNormals.length - 3, normal);
-            addNormals(attr, normal, left, front, back, vertexFormat);
-
-            if (addEndPositions) { // add rounded end
-                front += 3;
-                back -= 3;
-                leftPos = cartesian3;
-                rightPos = cartesian4;
-                var lastEndPositions = endPositions[1];
-                for (i = 0; i < halfLength; i++) {
-                    leftPos = Cartographic.Cartesian3.fromArray(lastEndPositions, (endPositionLength - i - 1) * 3, leftPos);
-                    rightPos = Cartographic.Cartesian3.fromArray(lastEndPositions, i * 3, rightPos);
-                    CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, leftPos, undefined, back);
-                    CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, rightPos, front);
-                    addNormals(attr, normal, left, front, back, vertexFormat);
-
-                    LR = front / 3;
-                    LL = LR - 1;
-                    UR = (back - 2) / 3;
-                    UL = UR + 1;
-                    indices[index++] = UL;
-                    indices[index++] = LL;
-                    indices[index++] = UR;
-                    indices[index++] = UR;
-                    indices[index++] = LL;
-                    indices[index++] = LR;
-
-                    front += 3;
-                    back -= 3;
-                }
-            }
-
-            attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : finalPositions
-            });
-
-            if (vertexFormat.st) {
-                var st = new Float32Array(size / 3 * 2);
-                var rightSt;
-                var leftSt;
-                var stIndex = 0;
-                if (addEndPositions) {
-                    leftCount /= 3;
-                    rightCount /= 3;
-                    var theta = Math.PI / (endPositionLength + 1);
-                    leftSt = 1 / (leftCount - endPositionLength + 1);
-                    rightSt = 1 / (rightCount - endPositionLength + 1);
-                    var a;
-                    var halfEndPos = endPositionLength / 2;
-                    for (i = halfEndPos + 1; i < endPositionLength + 1; i++) { // lower left rounded end
-                        a = _Math.CesiumMath.PI_OVER_TWO + theta * i;
-                        st[stIndex++] = rightSt * (1 + Math.cos(a));
-                        st[stIndex++] = 0.5 * (1 + Math.sin(a));
-                    }
-                    for (i = 1; i < rightCount - endPositionLength + 1; i++) { // bottom edge
-                        st[stIndex++] = i * rightSt;
-                        st[stIndex++] = 0;
-                    }
-                    for (i = endPositionLength; i > halfEndPos; i--) { // lower right rounded end
-                        a = _Math.CesiumMath.PI_OVER_TWO - i * theta;
-                        st[stIndex++] = 1 - rightSt * (1 + Math.cos(a));
-                        st[stIndex++] = 0.5 * (1 + Math.sin(a));
-                    }
-                    for (i = halfEndPos; i > 0; i--) { // upper right rounded end
-                        a = _Math.CesiumMath.PI_OVER_TWO - theta * i;
-                        st[stIndex++] = 1 - leftSt * (1 + Math.cos(a));
-                        st[stIndex++] = 0.5 * (1 + Math.sin(a));
-                    }
-                    for (i = leftCount - endPositionLength; i > 0; i--) { // top edge
-                        st[stIndex++] = i * leftSt;
-                        st[stIndex++] = 1;
-                    }
-                    for (i = 1; i < halfEndPos + 1; i++) { // upper left rounded end
-                        a = _Math.CesiumMath.PI_OVER_TWO + theta * i;
-                        st[stIndex++] = leftSt * (1 + Math.cos(a));
-                        st[stIndex++] = 0.5 * (1 + Math.sin(a));
-                    }
-                } else {
-                    leftCount /= 3;
-                    rightCount /= 3;
-                    leftSt = 1 / (leftCount - 1);
-                    rightSt = 1 / (rightCount - 1);
-                    for (i = 0; i < rightCount; i++) { // bottom edge
-                        st[stIndex++] = i * rightSt;
-                        st[stIndex++] = 0;
-                    }
-                    for (i = leftCount; i > 0; i--) { // top edge
-                        st[stIndex++] = (i - 1) * leftSt;
-                        st[stIndex++] = 1;
-                    }
-                }
-
-                attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : st
-                });
-            }
-
-            if (vertexFormat.normal) {
-                attributes.normal = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : attr.normals
-                });
-            }
-
-            if (vertexFormat.tangent) {
-                attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : attr.tangents
-                });
-            }
-
-            if (vertexFormat.bitangent) {
-                attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : attr.bitangents
-                });
-            }
-
-            return {
-                attributes : attributes,
-                indices : indices
-            };
-        }
-
-        function extrudedAttributes(attributes, vertexFormat) {
-            if (!vertexFormat.normal && !vertexFormat.tangent && !vertexFormat.bitangent && !vertexFormat.st) {
-                return attributes;
-            }
-            var positions = attributes.position.values;
-            var topNormals;
-            var topBitangents;
-            if (vertexFormat.normal || vertexFormat.bitangent) {
-                topNormals = attributes.normal.values;
-                topBitangents = attributes.bitangent.values;
-            }
-            var size = attributes.position.values.length / 18;
-            var threeSize = size * 3;
-            var twoSize = size * 2;
-            var sixSize = threeSize * 2;
-            var i;
-            if (vertexFormat.normal || vertexFormat.bitangent || vertexFormat.tangent) {
-                var normals = (vertexFormat.normal) ? new Float32Array(threeSize * 6) : undefined;
-                var tangents = (vertexFormat.tangent) ? new Float32Array(threeSize * 6) : undefined;
-                var bitangents = (vertexFormat.bitangent) ? new Float32Array(threeSize * 6) : undefined;
-                var topPosition = cartesian1;
-                var bottomPosition = cartesian2;
-                var previousPosition = cartesian3;
-                var normal = cartesian4;
-                var tangent = cartesian5;
-                var bitangent = cartesian6;
-                var attrIndex = sixSize;
-                for (i = 0; i < threeSize; i += 3) {
-                    var attrIndexOffset = attrIndex + sixSize;
-                    topPosition      = Cartographic.Cartesian3.fromArray(positions, i, topPosition);
-                    bottomPosition   = Cartographic.Cartesian3.fromArray(positions, i + threeSize, bottomPosition);
-                    previousPosition = Cartographic.Cartesian3.fromArray(positions, (i + 3) % threeSize, previousPosition);
-                    bottomPosition   = Cartographic.Cartesian3.subtract(bottomPosition,   topPosition, bottomPosition);
-                    previousPosition = Cartographic.Cartesian3.subtract(previousPosition, topPosition, previousPosition);
-                    normal = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(bottomPosition, previousPosition, normal), normal);
-                    if (vertexFormat.normal) {
-                        CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(normals, normal, attrIndexOffset);
-                        CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(normals, normal, attrIndexOffset + 3);
-                        CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(normals, normal, attrIndex);
-                        CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(normals, normal, attrIndex + 3);
-                    }
-                    if (vertexFormat.tangent || vertexFormat.bitangent) {
-                        bitangent = Cartographic.Cartesian3.fromArray(topNormals, i, bitangent);
-                        if (vertexFormat.bitangent) {
-                            CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(bitangents, bitangent, attrIndexOffset);
-                            CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(bitangents, bitangent, attrIndexOffset + 3);
-                            CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(bitangents, bitangent, attrIndex);
-                            CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(bitangents, bitangent, attrIndex + 3);
-                        }
-
-                        if (vertexFormat.tangent) {
-                            tangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(bitangent, normal, tangent), tangent);
-                            CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(tangents, tangent, attrIndexOffset);
-                            CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(tangents, tangent, attrIndexOffset + 3);
-                            CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(tangents, tangent, attrIndex);
-                            CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(tangents, tangent, attrIndex + 3);
-                        }
-                    }
-                    attrIndex += 6;
-                }
-
-                if (vertexFormat.normal) {
-                    normals.set(topNormals); //top
-                    for (i = 0; i < threeSize; i += 3) { //bottom normals
-                        normals[i + threeSize] = -topNormals[i];
-                        normals[i + threeSize + 1] = -topNormals[i + 1];
-                        normals[i + threeSize + 2] = -topNormals[i + 2];
-                    }
-                    attributes.normal.values = normals;
-                } else {
-                    attributes.normal = undefined;
-                }
-
-                if (vertexFormat.bitangent) {
-                    bitangents.set(topBitangents); //top
-                    bitangents.set(topBitangents, threeSize); //bottom
-                    attributes.bitangent.values = bitangents;
-                } else {
-                    attributes.bitangent = undefined;
-                }
-
-                if (vertexFormat.tangent) {
-                    var topTangents = attributes.tangent.values;
-                    tangents.set(topTangents); //top
-                    tangents.set(topTangents, threeSize); //bottom
-                    attributes.tangent.values = tangents;
-                }
-            }
-            if (vertexFormat.st) {
-                var topSt = attributes.st.values;
-                var st = new Float32Array(twoSize * 6);
-                st.set(topSt); //top
-                st.set(topSt, twoSize); //bottom
-                var index = twoSize * 2;
-
-                for ( var j = 0; j < 2; j++) {
-                    st[index++] = topSt[0];
-                    st[index++] = topSt[1];
-                    for (i = 2; i < twoSize; i += 2) {
-                        var s = topSt[i];
-                        var t = topSt[i + 1];
-                        st[index++] = s;
-                        st[index++] = t;
-                        st[index++] = s;
-                        st[index++] = t;
-                    }
-                    st[index++] = topSt[0];
-                    st[index++] = topSt[1];
-                }
-                attributes.st.values = st;
-            }
-
-            return attributes;
-        }
-
-        function addWallPositions(positions, index, wallPositions) {
-            wallPositions[index++] = positions[0];
-            wallPositions[index++] = positions[1];
-            wallPositions[index++] = positions[2];
-            for ( var i = 3; i < positions.length; i += 3) {
-                var x = positions[i];
-                var y = positions[i + 1];
-                var z = positions[i + 2];
-                wallPositions[index++] = x;
-                wallPositions[index++] = y;
-                wallPositions[index++] = z;
-                wallPositions[index++] = x;
-                wallPositions[index++] = y;
-                wallPositions[index++] = z;
-            }
-            wallPositions[index++] = positions[0];
-            wallPositions[index++] = positions[1];
-            wallPositions[index++] = positions[2];
-
-            return wallPositions;
-        }
-
-        function computePositionsExtruded(params, vertexFormat) {
-            var topVertexFormat = new VertexFormat.VertexFormat({
-                position : vertexFormat.position,
-                normal : (vertexFormat.normal || vertexFormat.bitangent || params.shadowVolume),
-                tangent : vertexFormat.tangent,
-                bitangent : (vertexFormat.normal || vertexFormat.bitangent),
-                st : vertexFormat.st
-            });
-            var ellipsoid = params.ellipsoid;
-            var computedPositions = CorridorGeometryLibrary.CorridorGeometryLibrary.computePositions(params);
-            var attr = combine(computedPositions, topVertexFormat, ellipsoid);
-            var height = params.height;
-            var extrudedHeight = params.extrudedHeight;
-            var attributes = attr.attributes;
-            var indices = attr.indices;
-            var positions = attributes.position.values;
-            var length = positions.length;
-            var newPositions = new Float64Array(length * 6);
-            var extrudedPositions = new Float64Array(length);
-            extrudedPositions.set(positions);
-            var wallPositions = new Float64Array(length * 4);
-
-            positions = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(positions, height, ellipsoid);
-            wallPositions = addWallPositions(positions, 0, wallPositions);
-            extrudedPositions = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(extrudedPositions, extrudedHeight, ellipsoid);
-            wallPositions = addWallPositions(extrudedPositions, length * 2, wallPositions);
-            newPositions.set(positions);
-            newPositions.set(extrudedPositions, length);
-            newPositions.set(wallPositions, length * 2);
-            attributes.position.values = newPositions;
-
-            attributes = extrudedAttributes(attributes, vertexFormat);
-            var i;
-            var size = length / 3;
-            if (params.shadowVolume) {
-                var topNormals = attributes.normal.values;
-                length = topNormals.length;
-
-                var extrudeNormals = new Float32Array(length * 6);
-                for (i = 0; i < length; i ++) {
-                    topNormals[i] = -topNormals[i];
-                }
-                //only get normals for bottom layer that's going to be pushed down
-                extrudeNormals.set(topNormals, length); //bottom face
-                extrudeNormals = addWallPositions(topNormals, length*4, extrudeNormals); //bottom wall
-                attributes.extrudeDirection = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : extrudeNormals
-                });
-                if (!vertexFormat.normal) {
-                    attributes.normal = undefined;
-                }
-            }
-            if (when.defined(params.offsetAttribute)) {
-                var applyOffset = new Uint8Array(size * 6);
-                if (params.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                    applyOffset = arrayFill.arrayFill(applyOffset, 1, 0, size); // top face
-                    applyOffset = arrayFill.arrayFill(applyOffset, 1, size*2, size * 4); // top wall
-                } else {
-                    var applyOffsetValue = params.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    applyOffset = arrayFill.arrayFill(applyOffset, applyOffsetValue);
-                }
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values: applyOffset
-                });
-            }
-
-            var iLength = indices.length;
-            var twoSize = size + size;
-            var newIndices = IndexDatatype.IndexDatatype.createTypedArray(newPositions.length / 3, iLength * 2 + twoSize * 3);
-            newIndices.set(indices);
-            var index = iLength;
-            for (i = 0; i < iLength; i += 3) { // bottom indices
-                var v0 = indices[i];
-                var v1 = indices[i + 1];
-                var v2 = indices[i + 2];
-                newIndices[index++] = v2 + size;
-                newIndices[index++] = v1 + size;
-                newIndices[index++] = v0 + size;
-            }
-
-            var UL, LL, UR, LR;
-
-            for (i = 0; i < twoSize; i += 2) { //wall indices
-                UL = i + twoSize;
-                LL = UL + twoSize;
-                UR = UL + 1;
-                LR = LL + 1;
-                newIndices[index++] = UL;
-                newIndices[index++] = LL;
-                newIndices[index++] = UR;
-                newIndices[index++] = UR;
-                newIndices[index++] = LL;
-                newIndices[index++] = LR;
-            }
-
-            return {
-                attributes : attributes,
-                indices : newIndices
-            };
-        }
-
-        var scratchCartesian1 = new Cartographic.Cartesian3();
-        var scratchCartesian2 = new Cartographic.Cartesian3();
-        var scratchCartographic = new Cartographic.Cartographic();
-
-        function computeOffsetPoints(position1, position2, ellipsoid, halfWidth, min, max) {
-            // Compute direction of offset the point
-            var direction = Cartographic.Cartesian3.subtract(position2, position1, scratchCartesian1);
-            Cartographic.Cartesian3.normalize(direction, direction);
-            var normal = ellipsoid.geodeticSurfaceNormal(position1, scratchCartesian2);
-            var offsetDirection = Cartographic.Cartesian3.cross(direction, normal, scratchCartesian1);
-            Cartographic.Cartesian3.multiplyByScalar(offsetDirection, halfWidth, offsetDirection);
-
-            var minLat = min.latitude;
-            var minLon = min.longitude;
-            var maxLat = max.latitude;
-            var maxLon = max.longitude;
-
-            // Compute 2 offset points
-            Cartographic.Cartesian3.add(position1, offsetDirection, scratchCartesian2);
-            ellipsoid.cartesianToCartographic(scratchCartesian2, scratchCartographic);
-
-            var lat = scratchCartographic.latitude;
-            var lon = scratchCartographic.longitude;
-            minLat = Math.min(minLat, lat);
-            minLon = Math.min(minLon, lon);
-            maxLat = Math.max(maxLat, lat);
-            maxLon = Math.max(maxLon, lon);
-
-            Cartographic.Cartesian3.subtract(position1, offsetDirection, scratchCartesian2);
-            ellipsoid.cartesianToCartographic(scratchCartesian2, scratchCartographic);
-
-            lat = scratchCartographic.latitude;
-            lon = scratchCartographic.longitude;
-            minLat = Math.min(minLat, lat);
-            minLon = Math.min(minLon, lon);
-            maxLat = Math.max(maxLat, lat);
-            maxLon = Math.max(maxLon, lon);
-
-            min.latitude = minLat;
-            min.longitude = minLon;
-            max.latitude = maxLat;
-            max.longitude = maxLon;
-        }
-
-        var scratchCartesianOffset = new Cartographic.Cartesian3();
-        var scratchCartesianEnds = new Cartographic.Cartesian3();
-        var scratchCartographicMin = new Cartographic.Cartographic();
-        var scratchCartographicMax = new Cartographic.Cartographic();
-
-        function computeRectangle(positions, ellipsoid, width, cornerType, result) {
-            positions = scaleToSurface(positions, ellipsoid);
-            var cleanPositions = arrayRemoveDuplicates.arrayRemoveDuplicates(positions, Cartographic.Cartesian3.equalsEpsilon);
-            var length = cleanPositions.length;
-            if (length < 2 || width <= 0) {
-                return new Cartesian2.Rectangle();
-            }
-            var halfWidth = width * 0.5;
-
-            scratchCartographicMin.latitude = Number.POSITIVE_INFINITY;
-            scratchCartographicMin.longitude = Number.POSITIVE_INFINITY;
-            scratchCartographicMax.latitude = Number.NEGATIVE_INFINITY;
-            scratchCartographicMax.longitude = Number.NEGATIVE_INFINITY;
-
-            var lat, lon;
-            if (cornerType === PolylineVolumeGeometryLibrary.CornerType.ROUNDED) {
-                // Compute start cap
-                var first = cleanPositions[0];
-                Cartographic.Cartesian3.subtract(first, cleanPositions[1], scratchCartesianOffset);
-                Cartographic.Cartesian3.normalize(scratchCartesianOffset, scratchCartesianOffset);
-                Cartographic.Cartesian3.multiplyByScalar(scratchCartesianOffset, halfWidth, scratchCartesianOffset);
-                Cartographic.Cartesian3.add(first, scratchCartesianOffset, scratchCartesianEnds);
-
-                ellipsoid.cartesianToCartographic(scratchCartesianEnds, scratchCartographic);
-                lat = scratchCartographic.latitude;
-                lon = scratchCartographic.longitude;
-                scratchCartographicMin.latitude = Math.min(scratchCartographicMin.latitude, lat);
-                scratchCartographicMin.longitude = Math.min(scratchCartographicMin.longitude, lon);
-                scratchCartographicMax.latitude = Math.max(scratchCartographicMax.latitude, lat);
-                scratchCartographicMax.longitude = Math.max(scratchCartographicMax.longitude, lon);
-            }
-
-            // Compute the rest
-            for (var i = 0; i < length-1; ++i) {
-                computeOffsetPoints(cleanPositions[i], cleanPositions[i+1], ellipsoid, halfWidth,
-                    scratchCartographicMin, scratchCartographicMax);
-            }
-
-            // Compute ending point
-            var last = cleanPositions[length-1];
-            Cartographic.Cartesian3.subtract(last, cleanPositions[length-2], scratchCartesianOffset);
-            Cartographic.Cartesian3.normalize(scratchCartesianOffset, scratchCartesianOffset);
-            Cartographic.Cartesian3.multiplyByScalar(scratchCartesianOffset, halfWidth, scratchCartesianOffset);
-            Cartographic.Cartesian3.add(last, scratchCartesianOffset, scratchCartesianEnds);
-            computeOffsetPoints(last, scratchCartesianEnds, ellipsoid, halfWidth,
-                scratchCartographicMin, scratchCartographicMax);
-
-            if (cornerType === PolylineVolumeGeometryLibrary.CornerType.ROUNDED) {
-                // Compute end cap
-                ellipsoid.cartesianToCartographic(scratchCartesianEnds, scratchCartographic);
-                lat = scratchCartographic.latitude;
-                lon = scratchCartographic.longitude;
-                scratchCartographicMin.latitude = Math.min(scratchCartographicMin.latitude, lat);
-                scratchCartographicMin.longitude = Math.min(scratchCartographicMin.longitude, lon);
-                scratchCartographicMax.latitude = Math.max(scratchCartographicMax.latitude, lat);
-                scratchCartographicMax.longitude = Math.max(scratchCartographicMax.longitude, lon);
-            }
-
-            var rectangle = when.defined(result) ? result : new Cartesian2.Rectangle();
-            rectangle.north = scratchCartographicMax.latitude;
-            rectangle.south = scratchCartographicMin.latitude;
-            rectangle.east = scratchCartographicMax.longitude;
-            rectangle.west = scratchCartographicMin.longitude;
-
-            return rectangle;
-        }
-
-        /**
-         * A description of a corridor. Corridor geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}.
-         *
-         * @alias CorridorGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of positions that define the center of the corridor.
-         * @param {Number} options.width The distance between the edges of the corridor in meters.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Number} [options.height=0] The distance in meters between the ellipsoid surface and the positions.
-         * @param {Number} [options.extrudedHeight] The distance in meters between the ellipsoid surface and the extruded face.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {CornerType} [options.cornerType=CornerType.ROUNDED] Determines the style of the corners.
-         *
-         * @see CorridorGeometry.createGeometry
-         * @see Packable
-         *
-         * @demo {@link https://sandcastle.cesium.com/index.html?src=Corridor.html|Cesium Sandcastle Corridor Demo}
-         *
-         * @example
-         * var corridor = new Cesium.CorridorGeometry({
-         *   vertexFormat : Cesium.VertexFormat.POSITION_ONLY,
-         *   positions : Cesium.Cartesian3.fromDegreesArray([-72.0, 40.0, -70.0, 35.0]),
-         *   width : 100000
-         * });
-         */
-        function CorridorGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var positions = options.positions;
-            var width = options.width;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.positions', positions);
-            Check.Check.defined('options.width', width);
-            //>>includeEnd('debug');
-
-            var height = when.defaultValue(options.height, 0.0);
-            var extrudedHeight = when.defaultValue(options.extrudedHeight, height);
-
-            this._positions = positions;
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84));
-            this._vertexFormat = VertexFormat.VertexFormat.clone(when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT));
-            this._width = width;
-            this._height = Math.max(height, extrudedHeight);
-            this._extrudedHeight = Math.min(height, extrudedHeight);
-            this._cornerType = when.defaultValue(options.cornerType, PolylineVolumeGeometryLibrary.CornerType.ROUNDED);
-            this._granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            this._shadowVolume = when.defaultValue(options.shadowVolume, false);
-            this._workerName = 'createCorridorGeometry';
-            this._offsetAttribute = options.offsetAttribute;
-            this._rectangle = undefined;
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = 1 + positions.length * Cartographic.Cartesian3.packedLength + Cartesian2.Ellipsoid.packedLength + VertexFormat.VertexFormat.packedLength + 7;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {CorridorGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        CorridorGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var positions = value._positions;
-            var length = positions.length;
-            array[startingIndex++] = length;
-
-            for (var i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                Cartographic.Cartesian3.pack(positions[i], array, startingIndex);
-            }
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._width;
-            array[startingIndex++] = value._height;
-            array[startingIndex++] = value._extrudedHeight;
-            array[startingIndex++] = value._cornerType;
-            array[startingIndex++] = value._granularity;
-            array[startingIndex++] = value._shadowVolume ? 1.0 : 0.0;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            positions : undefined,
-            ellipsoid : scratchEllipsoid,
-            vertexFormat : scratchVertexFormat,
-            width : undefined,
-            height : undefined,
-            extrudedHeight : undefined,
-            cornerType : undefined,
-            granularity : undefined,
-            shadowVolume: undefined,
-            offsetAttribute: undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {CorridorGeometry} [result] The object into which to store the result.
-         * @returns {CorridorGeometry} The modified result parameter or a new CorridorGeometry instance if one was not provided.
-         */
-        CorridorGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var length = array[startingIndex++];
-            var positions = new Array(length);
-
-            for (var i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                positions[i] = Cartographic.Cartesian3.unpack(array, startingIndex);
-            }
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var width = array[startingIndex++];
-            var height = array[startingIndex++];
-            var extrudedHeight = array[startingIndex++];
-            var cornerType = array[startingIndex++];
-            var granularity = array[startingIndex++];
-            var shadowVolume = array[startingIndex++] === 1.0;
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.positions = positions;
-                scratchOptions.width = width;
-                scratchOptions.height = height;
-                scratchOptions.extrudedHeight = extrudedHeight;
-                scratchOptions.cornerType = cornerType;
-                scratchOptions.granularity = granularity;
-                scratchOptions.shadowVolume = shadowVolume;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-                return new CorridorGeometry(scratchOptions);
-            }
-
-            result._positions = positions;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._width = width;
-            result._height = height;
-            result._extrudedHeight = extrudedHeight;
-            result._cornerType = cornerType;
-            result._granularity = granularity;
-            result._shadowVolume = shadowVolume;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the bounding rectangle given the provided options
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of positions that define the center of the corridor.
-         * @param {Number} options.width The distance between the edges of the corridor in meters.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {CornerType} [options.cornerType=CornerType.ROUNDED] Determines the style of the corners.
-         * @param {Rectangle} [result] An object in which to store the result.
-         *
-         * @returns {Rectangle} The result rectangle.
-         */
-        CorridorGeometry.computeRectangle = function(options, result) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var positions = options.positions;
-            var width = options.width;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.positions', positions);
-            Check.Check.defined('options.width', width);
-            //>>includeEnd('debug');
-
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var cornerType = when.defaultValue(options.cornerType, PolylineVolumeGeometryLibrary.CornerType.ROUNDED);
-
-            return computeRectangle(positions, ellipsoid, width, cornerType, result);
-        };
-
-        /**
-         * Computes the geometric representation of a corridor, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {CorridorGeometry} corridorGeometry A description of the corridor.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        CorridorGeometry.createGeometry = function(corridorGeometry) {
-            var positions = corridorGeometry._positions;
-            var width = corridorGeometry._width;
-            var ellipsoid = corridorGeometry._ellipsoid;
-
-            positions = scaleToSurface(positions, ellipsoid);
-            var cleanPositions = arrayRemoveDuplicates.arrayRemoveDuplicates(positions, Cartographic.Cartesian3.equalsEpsilon);
-
-            if ((cleanPositions.length < 2) || (width <= 0)) {
-                return;
-            }
-
-            var height = corridorGeometry._height;
-            var extrudedHeight = corridorGeometry._extrudedHeight;
-            var extrude = !_Math.CesiumMath.equalsEpsilon(height, extrudedHeight, 0, _Math.CesiumMath.EPSILON2);
-
-            var vertexFormat = corridorGeometry._vertexFormat;
-            var params = {
-                ellipsoid : ellipsoid,
-                positions : cleanPositions,
-                width : width,
-                cornerType : corridorGeometry._cornerType,
-                granularity : corridorGeometry._granularity,
-                saveAttributes: true
-            };
-            var attr;
-            if (extrude) {
-                params.height = height;
-                params.extrudedHeight = extrudedHeight;
-                params.shadowVolume = corridorGeometry._shadowVolume;
-                params.offsetAttribute = corridorGeometry._offsetAttribute;
-                attr = computePositionsExtruded(params, vertexFormat);
-            } else {
-                var computedPositions = CorridorGeometryLibrary.CorridorGeometryLibrary.computePositions(params);
-                attr = combine(computedPositions, vertexFormat, ellipsoid);
-                attr.attributes.position.values = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(attr.attributes.position.values, height, ellipsoid);
-
-                if (when.defined(corridorGeometry._offsetAttribute)) {
-                    var applyOffsetValue = corridorGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    var length = attr.attributes.position.values.length;
-                    var applyOffset = new Uint8Array(length / 3);
-                    arrayFill.arrayFill(applyOffset, applyOffsetValue);
-                    attr.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        componentsPerAttribute : 1,
-                        values: applyOffset
-                    });
-                }
-            }
-            var attributes = attr.attributes;
-            var boundingSphere = BoundingSphere.BoundingSphere.fromVertices(attributes.position.values, undefined, 3);
-            if (!vertexFormat.position) {
-                attr.attributes.position.values = undefined;
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : attr.indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES,
-                boundingSphere : boundingSphere,
-                offsetAttribute : corridorGeometry._offsetAttribute
-            });
-        };
-
-        /**
-         * @private
-         */
-        CorridorGeometry.createShadowVolume = function(corridorGeometry, minHeightFunc, maxHeightFunc) {
-            var granularity = corridorGeometry._granularity;
-            var ellipsoid = corridorGeometry._ellipsoid;
-
-            var minHeight = minHeightFunc(granularity, ellipsoid);
-            var maxHeight = maxHeightFunc(granularity, ellipsoid);
-
-            return new CorridorGeometry({
-                positions : corridorGeometry._positions,
-                width : corridorGeometry._width,
-                cornerType : corridorGeometry._cornerType,
-                ellipsoid : ellipsoid,
-                granularity : granularity,
-                extrudedHeight : minHeight,
-                height : maxHeight,
-                vertexFormat : VertexFormat.VertexFormat.POSITION_ONLY,
-                shadowVolume: true
-            });
-        };
-
-        Object.defineProperties(CorridorGeometry.prototype, {
-            /**
-             * @private
-             */
-            rectangle : {
-                get : function() {
-                    if (!when.defined(this._rectangle)) {
-                        this._rectangle = computeRectangle(this._positions, this._ellipsoid, this._width, this._cornerType);
-                    }
-                    return this._rectangle;
-                }
-            },
-            /**
-             * For remapping texture coordinates when rendering CorridorGeometries as GroundPrimitives.
-             *
-             * Corridors don't support stRotation,
-             * so just return the corners of the original system.
-             * @private
-             */
-            textureCoordinateRotationPoints : {
-                get : function() {
-                    return [0, 0, 0, 1, 1, 0];
-                }
-            }
-        });
-
-    function createCorridorGeometry(corridorGeometry, offset) {
-        if (when.defined(offset)) {
-            corridorGeometry = CorridorGeometry.unpack(corridorGeometry, offset);
-        }
-        corridorGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(corridorGeometry._ellipsoid);
-        return CorridorGeometry.createGeometry(corridorGeometry);
-    }
-
-    return createCorridorGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createCorridorOutlineGeometry.js b/public/libs/Cesium/Workers/createCorridorOutlineGeometry.js
deleted file mode 100644
index 3e03c79..0000000
--- a/public/libs/Cesium/Workers/createCorridorOutlineGeometry.js
+++ /dev/null
@@ -1,546 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './arrayRemoveDuplicates-f0b089b1', './EllipsoidTangentPlane-e324bfa4', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './PolylineVolumeGeometryLibrary-5bb7662e', './EllipsoidGeodesic-84507801', './PolylinePipeline-a9f32196', './CorridorGeometryLibrary-d15f4d38'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, IntersectionTests, Plane, arrayFill, GeometryOffsetAttribute, arrayRemoveDuplicates, EllipsoidTangentPlane, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, PolylineVolumeGeometryLibrary, EllipsoidGeodesic, PolylinePipeline, CorridorGeometryLibrary) { 'use strict';
-
-    var cartesian1 = new Cartographic.Cartesian3();
-        var cartesian2 = new Cartographic.Cartesian3();
-        var cartesian3 = new Cartographic.Cartesian3();
-
-        function scaleToSurface(positions, ellipsoid) {
-            for (var i = 0; i < positions.length; i++) {
-                positions[i] = ellipsoid.scaleToGeodeticSurface(positions[i], positions[i]);
-            }
-            return positions;
-        }
-
-        function combine(computedPositions, cornerType) {
-            var wallIndices = [];
-            var positions = computedPositions.positions;
-            var corners = computedPositions.corners;
-            var endPositions = computedPositions.endPositions;
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            var corner;
-            var leftCount = 0;
-            var rightCount = 0;
-            var i;
-            var indicesLength = 0;
-            var length;
-            for (i = 0; i < positions.length; i += 2) {
-                length = positions[i].length - 3;
-                leftCount += length; //subtracting 3 to account for duplicate points at corners
-                indicesLength += length / 3 * 4;
-                rightCount += positions[i + 1].length - 3;
-            }
-            leftCount += 3; //add back count for end positions
-            rightCount += 3;
-            for (i = 0; i < corners.length; i++) {
-                corner = corners[i];
-                var leftSide = corners[i].leftPositions;
-                if (when.defined(leftSide)) {
-                    length = leftSide.length;
-                    leftCount += length;
-                    indicesLength += length / 3 * 2;
-                } else {
-                    length = corners[i].rightPositions.length;
-                    rightCount += length;
-                    indicesLength += length / 3 * 2;
-                }
-            }
-
-            var addEndPositions = when.defined(endPositions);
-            var endPositionLength;
-            if (addEndPositions) {
-                endPositionLength = endPositions[0].length - 3;
-                leftCount += endPositionLength;
-                rightCount += endPositionLength;
-                endPositionLength /= 3;
-                indicesLength += endPositionLength * 4;
-            }
-            var size = leftCount + rightCount;
-            var finalPositions = new Float64Array(size);
-            var front = 0;
-            var back = size - 1;
-            var UL, LL, UR, LR;
-            var rightPos, leftPos;
-            var halfLength = endPositionLength / 2;
-
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(size / 3, indicesLength + 4);
-            var index = 0;
-
-            indices[index++] = front / 3;
-            indices[index++] = (back - 2) / 3;
-            if (addEndPositions) { // add rounded end
-                wallIndices.push(front / 3);
-                leftPos = cartesian1;
-                rightPos = cartesian2;
-                var firstEndPositions = endPositions[0];
-                for (i = 0; i < halfLength; i++) {
-                    leftPos = Cartographic.Cartesian3.fromArray(firstEndPositions, (halfLength - 1 - i) * 3, leftPos);
-                    rightPos = Cartographic.Cartesian3.fromArray(firstEndPositions, (halfLength + i) * 3, rightPos);
-                    CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, rightPos, front);
-                    CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, leftPos, undefined, back);
-
-                    LL = front / 3;
-                    LR = LL + 1;
-                    UL = (back - 2) / 3;
-                    UR = UL - 1;
-                    indices[index++] = UL;
-                    indices[index++] = UR;
-                    indices[index++] = LL;
-                    indices[index++] = LR;
-
-                    front += 3;
-                    back -= 3;
-                }
-            }
-
-            var posIndex = 0;
-            var rightEdge = positions[posIndex++]; //add first two edges
-            var leftEdge = positions[posIndex++];
-            finalPositions.set(rightEdge, front);
-            finalPositions.set(leftEdge, back - leftEdge.length + 1);
-
-            length = leftEdge.length - 3;
-            wallIndices.push(front / 3, (back - 2) / 3);
-            for (i = 0; i < length; i += 3) {
-                LL = front / 3;
-                LR = LL + 1;
-                UL = (back - 2) / 3;
-                UR = UL - 1;
-                indices[index++] = UL;
-                indices[index++] = UR;
-                indices[index++] = LL;
-                indices[index++] = LR;
-
-                front += 3;
-                back -= 3;
-            }
-
-            for (i = 0; i < corners.length; i++) {
-                var j;
-                corner = corners[i];
-                var l = corner.leftPositions;
-                var r = corner.rightPositions;
-                var start;
-                var outsidePoint = cartesian3;
-                if (when.defined(l)) {
-                    back -= 3;
-                    start = UR;
-                    wallIndices.push(LR);
-                    for (j = 0; j < l.length / 3; j++) {
-                        outsidePoint = Cartographic.Cartesian3.fromArray(l, j * 3, outsidePoint);
-                        indices[index++] = start - j - 1;
-                        indices[index++] = start - j;
-                        CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, outsidePoint, undefined, back);
-                        back -= 3;
-                    }
-                    wallIndices.push(start - Math.floor(l.length / 6));
-                    if (cornerType === PolylineVolumeGeometryLibrary.CornerType.BEVELED) {
-                        wallIndices.push((back - 2) / 3 + 1);
-                    }
-                    front += 3;
-                } else {
-                    front += 3;
-                    start = LR;
-                    wallIndices.push(UR);
-                    for (j = 0; j < r.length / 3; j++) {
-                        outsidePoint = Cartographic.Cartesian3.fromArray(r, j * 3, outsidePoint);
-                        indices[index++] = start + j;
-                        indices[index++] = start + j + 1;
-                        CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, outsidePoint, front);
-                        front += 3;
-                    }
-                    wallIndices.push(start + Math.floor(r.length / 6));
-                    if (cornerType === PolylineVolumeGeometryLibrary.CornerType.BEVELED) {
-                        wallIndices.push(front / 3 - 1);
-                    }
-                    back -= 3;
-                }
-                rightEdge = positions[posIndex++];
-                leftEdge = positions[posIndex++];
-                rightEdge.splice(0, 3); //remove duplicate points added by corner
-                leftEdge.splice(leftEdge.length - 3, 3);
-                finalPositions.set(rightEdge, front);
-                finalPositions.set(leftEdge, back - leftEdge.length + 1);
-                length = leftEdge.length - 3;
-
-                for (j = 0; j < leftEdge.length; j += 3) {
-                    LR = front / 3;
-                    LL = LR - 1;
-                    UR = (back - 2) / 3;
-                    UL = UR + 1;
-                    indices[index++] = UL;
-                    indices[index++] = UR;
-                    indices[index++] = LL;
-                    indices[index++] = LR;
-                    front += 3;
-                    back -= 3;
-                }
-                front -= 3;
-                back += 3;
-                wallIndices.push(front / 3, (back - 2) / 3);
-            }
-
-            if (addEndPositions) { // add rounded end
-                front += 3;
-                back -= 3;
-                leftPos = cartesian1;
-                rightPos = cartesian2;
-                var lastEndPositions = endPositions[1];
-                for (i = 0; i < halfLength; i++) {
-                    leftPos = Cartographic.Cartesian3.fromArray(lastEndPositions, (endPositionLength - i - 1) * 3, leftPos);
-                    rightPos = Cartographic.Cartesian3.fromArray(lastEndPositions, i * 3, rightPos);
-                    CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, leftPos, undefined, back);
-                    CorridorGeometryLibrary.CorridorGeometryLibrary.addAttribute(finalPositions, rightPos, front);
-
-                    LR = front / 3;
-                    LL = LR - 1;
-                    UR = (back - 2) / 3;
-                    UL = UR + 1;
-                    indices[index++] = UL;
-                    indices[index++] = UR;
-                    indices[index++] = LL;
-                    indices[index++] = LR;
-
-                    front += 3;
-                    back -= 3;
-                }
-
-                wallIndices.push(front / 3);
-            } else {
-                wallIndices.push(front / 3, (back - 2) / 3);
-            }
-            indices[index++] = front / 3;
-            indices[index++] = (back - 2) / 3;
-
-            attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : finalPositions
-            });
-
-            return {
-                attributes : attributes,
-                indices : indices,
-                wallIndices : wallIndices
-            };
-        }
-
-        function computePositionsExtruded(params) {
-            var ellipsoid = params.ellipsoid;
-            var computedPositions = CorridorGeometryLibrary.CorridorGeometryLibrary.computePositions(params);
-            var attr = combine(computedPositions, params.cornerType);
-            var wallIndices = attr.wallIndices;
-            var height = params.height;
-            var extrudedHeight = params.extrudedHeight;
-            var attributes = attr.attributes;
-            var indices = attr.indices;
-            var positions = attributes.position.values;
-            var length = positions.length;
-            var extrudedPositions = new Float64Array(length);
-            extrudedPositions.set(positions);
-            var newPositions = new Float64Array(length * 2);
-
-            positions = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(positions, height, ellipsoid);
-            extrudedPositions = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(extrudedPositions, extrudedHeight, ellipsoid);
-            newPositions.set(positions);
-            newPositions.set(extrudedPositions, length);
-            attributes.position.values = newPositions;
-
-            length /= 3;
-            if (when.defined(params.offsetAttribute)) {
-                var applyOffset = new Uint8Array(length * 2);
-                if (params.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                    applyOffset = arrayFill.arrayFill(applyOffset, 1, 0, length);
-                } else {
-                    var applyOffsetValue = params.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    applyOffset = arrayFill.arrayFill(applyOffset, applyOffsetValue);
-                }
-
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values: applyOffset
-                });
-            }
-
-            var i;
-            var iLength = indices.length;
-            var newIndices = IndexDatatype.IndexDatatype.createTypedArray(newPositions.length / 3, (iLength + wallIndices.length) * 2);
-            newIndices.set(indices);
-            var index = iLength;
-            for (i = 0; i < iLength; i += 2) { // bottom indices
-                var v0 = indices[i];
-                var v1 = indices[i + 1];
-                newIndices[index++] = v0 + length;
-                newIndices[index++] = v1 + length;
-            }
-
-            var UL, LL;
-            for (i = 0; i < wallIndices.length; i++) { //wall indices
-                UL = wallIndices[i];
-                LL = UL + length;
-                newIndices[index++] = UL;
-                newIndices[index++] = LL;
-            }
-
-            return {
-                attributes : attributes,
-                indices : newIndices
-            };
-        }
-
-        /**
-         * A description of a corridor outline.
-         *
-         * @alias CorridorOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of positions that define the center of the corridor outline.
-         * @param {Number} options.width The distance between the edges of the corridor outline.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Number} [options.height=0] The distance in meters between the positions and the ellipsoid surface.
-         * @param {Number} [options.extrudedHeight] The distance in meters between the extruded face and the ellipsoid surface.
-         * @param {CornerType} [options.cornerType=CornerType.ROUNDED] Determines the style of the corners.
-         *
-         * @see CorridorOutlineGeometry.createGeometry
-         *
-         * @example
-         * var corridor = new Cesium.CorridorOutlineGeometry({
-         *   positions : Cesium.Cartesian3.fromDegreesArray([-72.0, 40.0, -70.0, 35.0]),
-         *   width : 100000
-         * });
-         */
-        function CorridorOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var positions = options.positions;
-            var width = options.width;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('options.positions', positions);
-            Check.Check.typeOf.number('options.width', width);
-            //>>includeEnd('debug');
-
-            var height = when.defaultValue(options.height, 0.0);
-            var extrudedHeight = when.defaultValue(options.extrudedHeight, height);
-
-            this._positions = positions;
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84));
-            this._width = width;
-            this._height = Math.max(height, extrudedHeight);
-            this._extrudedHeight = Math.min(height, extrudedHeight);
-            this._cornerType = when.defaultValue(options.cornerType, PolylineVolumeGeometryLibrary.CornerType.ROUNDED);
-            this._granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createCorridorOutlineGeometry';
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = 1 + positions.length * Cartographic.Cartesian3.packedLength + Cartesian2.Ellipsoid.packedLength + 6;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {CorridorOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        CorridorOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.typeOf.object('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var positions = value._positions;
-            var length = positions.length;
-            array[startingIndex++] = length;
-
-            for (var i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                Cartographic.Cartesian3.pack(positions[i], array, startingIndex);
-            }
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            array[startingIndex++] = value._width;
-            array[startingIndex++] = value._height;
-            array[startingIndex++] = value._extrudedHeight;
-            array[startingIndex++] = value._cornerType;
-            array[startingIndex++] = value._granularity;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchOptions = {
-            positions : undefined,
-            ellipsoid : scratchEllipsoid,
-            width : undefined,
-            height : undefined,
-            extrudedHeight : undefined,
-            cornerType : undefined,
-            granularity : undefined,
-            offsetAttribute: undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {CorridorOutlineGeometry} [result] The object into which to store the result.
-         * @returns {CorridorOutlineGeometry} The modified result parameter or a new CorridorOutlineGeometry instance if one was not provided.
-         */
-        CorridorOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var length = array[startingIndex++];
-            var positions = new Array(length);
-
-            for (var i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                positions[i] = Cartographic.Cartesian3.unpack(array, startingIndex);
-            }
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var width = array[startingIndex++];
-            var height = array[startingIndex++];
-            var extrudedHeight = array[startingIndex++];
-            var cornerType = array[startingIndex++];
-            var granularity = array[startingIndex++];
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.positions = positions;
-                scratchOptions.width = width;
-                scratchOptions.height = height;
-                scratchOptions.extrudedHeight = extrudedHeight;
-                scratchOptions.cornerType = cornerType;
-                scratchOptions.granularity = granularity;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-                return new CorridorOutlineGeometry(scratchOptions);
-            }
-
-            result._positions = positions;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._width = width;
-            result._height = height;
-            result._extrudedHeight = extrudedHeight;
-            result._cornerType = cornerType;
-            result._granularity = granularity;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of a corridor, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {CorridorOutlineGeometry} corridorOutlineGeometry A description of the corridor.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        CorridorOutlineGeometry.createGeometry = function(corridorOutlineGeometry) {
-            var positions = corridorOutlineGeometry._positions;
-            var width = corridorOutlineGeometry._width;
-            var ellipsoid = corridorOutlineGeometry._ellipsoid;
-
-            positions = scaleToSurface(positions, ellipsoid);
-            var cleanPositions = arrayRemoveDuplicates.arrayRemoveDuplicates(positions, Cartographic.Cartesian3.equalsEpsilon);
-
-            if ((cleanPositions.length < 2) || (width <= 0)) {
-                return;
-            }
-
-            var height = corridorOutlineGeometry._height;
-            var extrudedHeight = corridorOutlineGeometry._extrudedHeight;
-            var extrude = !_Math.CesiumMath.equalsEpsilon(height, extrudedHeight, 0, _Math.CesiumMath.EPSILON2);
-
-            var params = {
-                ellipsoid : ellipsoid,
-                positions : cleanPositions,
-                width : width,
-                cornerType : corridorOutlineGeometry._cornerType,
-                granularity : corridorOutlineGeometry._granularity,
-                saveAttributes : false
-            };
-            var attr;
-            if (extrude) {
-                params.height = height;
-                params.extrudedHeight = extrudedHeight;
-                params.offsetAttribute = corridorOutlineGeometry._offsetAttribute;
-                attr = computePositionsExtruded(params);
-            } else {
-                var computedPositions = CorridorGeometryLibrary.CorridorGeometryLibrary.computePositions(params);
-                attr = combine(computedPositions, params.cornerType);
-                attr.attributes.position.values = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(attr.attributes.position.values, height, ellipsoid);
-
-                if (when.defined(corridorOutlineGeometry._offsetAttribute)) {
-                    var length = attr.attributes.position.values.length;
-                    var applyOffset = new Uint8Array(length / 3);
-                    var offsetValue = corridorOutlineGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    arrayFill.arrayFill(applyOffset, offsetValue);
-                    attr.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        componentsPerAttribute : 1,
-                        values: applyOffset
-                    });
-                }
-            }
-            var attributes = attr.attributes;
-            var boundingSphere = BoundingSphere.BoundingSphere.fromVertices(attributes.position.values, undefined, 3);
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : attr.indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : boundingSphere,
-                offsetAttribute : corridorOutlineGeometry._offsetAttribute
-            });
-        };
-
-    function createCorridorOutlineGeometry(corridorOutlineGeometry, offset) {
-        if (when.defined(offset)) {
-            corridorOutlineGeometry = CorridorOutlineGeometry.unpack(corridorOutlineGeometry, offset);
-        }
-        corridorOutlineGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(corridorOutlineGeometry._ellipsoid);
-        return CorridorOutlineGeometry.createGeometry(corridorOutlineGeometry);
-    }
-
-    return createCorridorOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createCylinderGeometry.js b/public/libs/Cesium/Workers/createCylinderGeometry.js
deleted file mode 100644
index 696b03e..0000000
--- a/public/libs/Cesium/Workers/createCylinderGeometry.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './CylinderGeometryLibrary-8c0fda9f', './CylinderGeometry-3fb30286'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, VertexFormat, CylinderGeometryLibrary, CylinderGeometry) { 'use strict';
-
-    function createCylinderGeometry(cylinderGeometry, offset) {
-        if (when.defined(offset)) {
-            cylinderGeometry = CylinderGeometry.CylinderGeometry.unpack(cylinderGeometry, offset);
-        }
-        return CylinderGeometry.CylinderGeometry.createGeometry(cylinderGeometry);
-    }
-
-    return createCylinderGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createCylinderOutlineGeometry.js b/public/libs/Cesium/Workers/createCylinderOutlineGeometry.js
deleted file mode 100644
index 7e820ac..0000000
--- a/public/libs/Cesium/Workers/createCylinderOutlineGeometry.js
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './CylinderGeometryLibrary-8c0fda9f'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, CylinderGeometryLibrary) { 'use strict';
-
-    var radiusScratch = new Cartesian2.Cartesian2();
-
-        /**
-         * A description of the outline of a cylinder.
-         *
-         * @alias CylinderOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Number} options.length The length of the cylinder.
-         * @param {Number} options.topRadius The radius of the top of the cylinder.
-         * @param {Number} options.bottomRadius The radius of the bottom of the cylinder.
-         * @param {Number} [options.slices=128] The number of edges around the perimeter of the cylinder.
-         * @param {Number} [options.numberOfVerticalLines=16] Number of lines to draw between the top and bottom surfaces of the cylinder.
-         *
-         * @exception {DeveloperError} options.length must be greater than 0.
-         * @exception {DeveloperError} options.topRadius must be greater than 0.
-         * @exception {DeveloperError} options.bottomRadius must be greater than 0.
-         * @exception {DeveloperError} bottomRadius and topRadius cannot both equal 0.
-         * @exception {DeveloperError} options.slices must be greater than or equal to 3.
-         *
-         * @see CylinderOutlineGeometry.createGeometry
-         *
-         * @example
-         * // create cylinder geometry
-         * var cylinder = new Cesium.CylinderOutlineGeometry({
-         *     length: 200000,
-         *     topRadius: 80000,
-         *     bottomRadius: 200000,
-         * });
-         * var geometry = Cesium.CylinderOutlineGeometry.createGeometry(cylinder);
-         */
-        function CylinderOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var length = options.length;
-            var topRadius = options.topRadius;
-            var bottomRadius = options.bottomRadius;
-            var slices = when.defaultValue(options.slices, 128);
-            var numberOfVerticalLines = Math.max(when.defaultValue(options.numberOfVerticalLines, 16), 0);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('options.positions', length);
-            Check.Check.typeOf.number('options.topRadius', topRadius);
-            Check.Check.typeOf.number('options.bottomRadius', bottomRadius);
-            Check.Check.typeOf.number.greaterThanOrEquals('options.slices', slices, 3);
-            if (when.defined(options.offsetAttribute) && options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                throw new Check.DeveloperError('GeometryOffsetAttribute.TOP is not a supported options.offsetAttribute for this geometry.');
-            }
-            //>>includeEnd('debug');
-
-            this._length = length;
-            this._topRadius = topRadius;
-            this._bottomRadius = bottomRadius;
-            this._slices = slices;
-            this._numberOfVerticalLines = numberOfVerticalLines;
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createCylinderOutlineGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        CylinderOutlineGeometry.packedLength = 6;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {CylinderOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        CylinderOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            array[startingIndex++] = value._length;
-            array[startingIndex++] = value._topRadius;
-            array[startingIndex++] = value._bottomRadius;
-            array[startingIndex++] = value._slices;
-            array[startingIndex++] = value._numberOfVerticalLines;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchOptions = {
-            length : undefined,
-            topRadius : undefined,
-            bottomRadius : undefined,
-            slices : undefined,
-            numberOfVerticalLines : undefined,
-            offsetAttribute : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {CylinderOutlineGeometry} [result] The object into which to store the result.
-         * @returns {CylinderOutlineGeometry} The modified result parameter or a new CylinderOutlineGeometry instance if one was not provided.
-         */
-        CylinderOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var length = array[startingIndex++];
-            var topRadius = array[startingIndex++];
-            var bottomRadius = array[startingIndex++];
-            var slices = array[startingIndex++];
-            var numberOfVerticalLines = array[startingIndex++];
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.length = length;
-                scratchOptions.topRadius = topRadius;
-                scratchOptions.bottomRadius = bottomRadius;
-                scratchOptions.slices = slices;
-                scratchOptions.numberOfVerticalLines = numberOfVerticalLines;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-                return new CylinderOutlineGeometry(scratchOptions);
-            }
-
-            result._length = length;
-            result._topRadius = topRadius;
-            result._bottomRadius = bottomRadius;
-            result._slices = slices;
-            result._numberOfVerticalLines = numberOfVerticalLines;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of an outline of a cylinder, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {CylinderOutlineGeometry} cylinderGeometry A description of the cylinder outline.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        CylinderOutlineGeometry.createGeometry = function(cylinderGeometry) {
-            var length = cylinderGeometry._length;
-            var topRadius = cylinderGeometry._topRadius;
-            var bottomRadius = cylinderGeometry._bottomRadius;
-            var slices = cylinderGeometry._slices;
-            var numberOfVerticalLines = cylinderGeometry._numberOfVerticalLines;
-
-            if ((length <= 0) || (topRadius < 0) || (bottomRadius < 0) || ((topRadius === 0) && (bottomRadius === 0))) {
-                return;
-            }
-
-            var numVertices = slices * 2;
-
-            var positions = CylinderGeometryLibrary.CylinderGeometryLibrary.computePositions(length, topRadius, bottomRadius, slices, false);
-            var numIndices = slices * 2;
-            var numSide;
-            if (numberOfVerticalLines > 0) {
-                var numSideLines = Math.min(numberOfVerticalLines, slices);
-                numSide = Math.round(slices / numSideLines);
-                numIndices += numSideLines;
-            }
-
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(numVertices, numIndices * 2);
-            var index = 0;
-            var i;
-            for (i = 0; i < slices - 1; i++) {
-                indices[index++] = i;
-                indices[index++] = i + 1;
-                indices[index++] = i + slices;
-                indices[index++] = i + 1 + slices;
-            }
-
-            indices[index++] = slices - 1;
-            indices[index++] = 0;
-            indices[index++] = slices + slices - 1;
-            indices[index++] = slices;
-
-            if (numberOfVerticalLines > 0) {
-                for (i = 0; i < slices; i += numSide) {
-                    indices[index++] = i;
-                    indices[index++] = i + slices;
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : positions
-            });
-
-            radiusScratch.x = length * 0.5;
-            radiusScratch.y = Math.max(bottomRadius, topRadius);
-
-            var boundingSphere = new BoundingSphere.BoundingSphere(Cartographic.Cartesian3.ZERO, Cartesian2.Cartesian2.magnitude(radiusScratch));
-
-            if (when.defined(cylinderGeometry._offsetAttribute)) {
-                length = positions.length;
-                var applyOffset = new Uint8Array(length / 3);
-                var offsetValue = cylinderGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                arrayFill.arrayFill(applyOffset, offsetValue);
-                attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values: applyOffset
-                });
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : boundingSphere,
-                offsetAttribute : cylinderGeometry._offsetAttribute
-            });
-        };
-
-    function createCylinderOutlineGeometry(cylinderGeometry, offset) {
-        if (when.defined(offset)) {
-            cylinderGeometry = CylinderOutlineGeometry.unpack(cylinderGeometry, offset);
-        }
-        return CylinderOutlineGeometry.createGeometry(cylinderGeometry);
-    }
-
-    return createCylinderOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createEllipseGeometry.js b/public/libs/Cesium/Workers/createEllipseGeometry.js
deleted file mode 100644
index f931fad..0000000
--- a/public/libs/Cesium/Workers/createEllipseGeometry.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './EllipseGeometryLibrary-7533a967', './GeometryInstance-93a01b5d', './EllipseGeometry-185aabb4'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, arrayFill, GeometryOffsetAttribute, VertexFormat, EllipseGeometryLibrary, GeometryInstance, EllipseGeometry) { 'use strict';
-
-    function createEllipseGeometry(ellipseGeometry, offset) {
-        if (when.defined(offset)) {
-            ellipseGeometry = EllipseGeometry.EllipseGeometry.unpack(ellipseGeometry, offset);
-        }
-        ellipseGeometry._center = Cartographic.Cartesian3.clone(ellipseGeometry._center);
-        ellipseGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(ellipseGeometry._ellipsoid);
-        return EllipseGeometry.EllipseGeometry.createGeometry(ellipseGeometry);
-    }
-
-    return createEllipseGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createEllipseOutlineGeometry.js b/public/libs/Cesium/Workers/createEllipseOutlineGeometry.js
deleted file mode 100644
index c34b43e..0000000
--- a/public/libs/Cesium/Workers/createEllipseOutlineGeometry.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './EllipseGeometryLibrary-7533a967', './EllipseOutlineGeometry-9a21ac97'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, EllipseGeometryLibrary, EllipseOutlineGeometry) { 'use strict';
-
-    function createEllipseOutlineGeometry(ellipseGeometry, offset) {
-        if (when.defined(offset)) {
-            ellipseGeometry = EllipseOutlineGeometry.EllipseOutlineGeometry.unpack(ellipseGeometry, offset);
-        }
-        ellipseGeometry._center = Cartographic.Cartesian3.clone(ellipseGeometry._center);
-        ellipseGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(ellipseGeometry._ellipsoid);
-        return EllipseOutlineGeometry.EllipseOutlineGeometry.createGeometry(ellipseGeometry);
-    }
-
-    return createEllipseOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createEllipsoidGeometry.js b/public/libs/Cesium/Workers/createEllipsoidGeometry.js
deleted file mode 100644
index 7d60627..0000000
--- a/public/libs/Cesium/Workers/createEllipsoidGeometry.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './EllipsoidGeometry-833b1e19'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, VertexFormat, EllipsoidGeometry) { 'use strict';
-
-    function createEllipsoidGeometry(ellipsoidGeometry, offset) {
-        if (when.defined(offset)) {
-            ellipsoidGeometry = EllipsoidGeometry.EllipsoidGeometry.unpack(ellipsoidGeometry, offset);
-        }
-        return EllipsoidGeometry.EllipsoidGeometry.createGeometry(ellipsoidGeometry);
-    }
-
-    return createEllipsoidGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createEllipsoidOutlineGeometry.js b/public/libs/Cesium/Workers/createEllipsoidOutlineGeometry.js
deleted file mode 100644
index bd7d786..0000000
--- a/public/libs/Cesium/Workers/createEllipsoidOutlineGeometry.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './EllipsoidOutlineGeometry-2ac32d7f'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, EllipsoidOutlineGeometry) { 'use strict';
-
-    function createEllipsoidOutlineGeometry(ellipsoidGeometry, offset) {
-        if (when.defined(ellipsoidGeometry.buffer)) {
-            ellipsoidGeometry = EllipsoidOutlineGeometry.EllipsoidOutlineGeometry.unpack(ellipsoidGeometry, offset);
-        }
-        return EllipsoidOutlineGeometry.EllipsoidOutlineGeometry.createGeometry(ellipsoidGeometry);
-    }
-
-    return createEllipsoidOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createFrustumGeometry.js b/public/libs/Cesium/Workers/createFrustumGeometry.js
deleted file mode 100644
index 12b525c..0000000
--- a/public/libs/Cesium/Workers/createFrustumGeometry.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './Plane-8390418f', './VertexFormat-fe4db402', './FrustumGeometry-da141fc6'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, Plane, VertexFormat, FrustumGeometry) { 'use strict';
-
-    function createFrustumGeometry(frustumGeometry, offset) {
-        if (when.defined(offset)) {
-            frustumGeometry = FrustumGeometry.FrustumGeometry.unpack(frustumGeometry, offset);
-        }
-        return FrustumGeometry.FrustumGeometry.createGeometry(frustumGeometry);
-    }
-
-    return createFrustumGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createFrustumOutlineGeometry.js b/public/libs/Cesium/Workers/createFrustumOutlineGeometry.js
deleted file mode 100644
index 8950672..0000000
--- a/public/libs/Cesium/Workers/createFrustumOutlineGeometry.js
+++ /dev/null
@@ -1,253 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './Plane-8390418f', './VertexFormat-fe4db402', './FrustumGeometry-da141fc6'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, Plane, VertexFormat, FrustumGeometry) { 'use strict';
-
-    var PERSPECTIVE = 0;
-        var ORTHOGRAPHIC = 1;
-
-        /**
-         * A description of the outline of a frustum with the given the origin and orientation.
-         *
-         * @alias FrustumOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {PerspectiveFrustum|OrthographicFrustum} options.frustum The frustum.
-         * @param {Cartesian3} options.origin The origin of the frustum.
-         * @param {Quaternion} options.orientation The orientation of the frustum.
-         */
-        function FrustumOutlineGeometry(options) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('options', options);
-            Check.Check.typeOf.object('options.frustum', options.frustum);
-            Check.Check.typeOf.object('options.origin', options.origin);
-            Check.Check.typeOf.object('options.orientation', options.orientation);
-            //>>includeEnd('debug');
-
-            var frustum = options.frustum;
-            var orientation = options.orientation;
-            var origin = options.origin;
-
-            // This is private because it is used by DebugCameraPrimitive to draw a multi-frustum by
-            // creating multiple FrustumOutlineGeometrys. This way the near plane of one frustum doesn't overlap
-            // the far plane of another.
-            var drawNearPlane = when.defaultValue(options._drawNearPlane, true);
-
-            var frustumType;
-            var frustumPackedLength;
-            if (frustum instanceof FrustumGeometry.PerspectiveFrustum) {
-                frustumType = PERSPECTIVE;
-                frustumPackedLength = FrustumGeometry.PerspectiveFrustum.packedLength;
-            } else if (frustum instanceof FrustumGeometry.OrthographicFrustum) {
-                frustumType = ORTHOGRAPHIC;
-                frustumPackedLength = FrustumGeometry.OrthographicFrustum.packedLength;
-            }
-
-            this._frustumType = frustumType;
-            this._frustum = frustum.clone();
-            this._origin = Cartographic.Cartesian3.clone(origin);
-            this._orientation = Transforms.Quaternion.clone(orientation);
-            this._drawNearPlane = drawNearPlane;
-            this._workerName = 'createFrustumOutlineGeometry';
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = 2 + frustumPackedLength + Cartographic.Cartesian3.packedLength + Transforms.Quaternion.packedLength;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {FrustumOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        FrustumOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var frustumType = value._frustumType;
-            var frustum = value._frustum;
-
-            array[startingIndex++] = frustumType;
-
-            if (frustumType === PERSPECTIVE) {
-                FrustumGeometry.PerspectiveFrustum.pack(frustum, array, startingIndex);
-                startingIndex += FrustumGeometry.PerspectiveFrustum.packedLength;
-            } else {
-                FrustumGeometry.OrthographicFrustum.pack(frustum, array, startingIndex);
-                startingIndex += FrustumGeometry.OrthographicFrustum.packedLength;
-            }
-
-            Cartographic.Cartesian3.pack(value._origin, array, startingIndex);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-            Transforms.Quaternion.pack(value._orientation, array, startingIndex);
-            startingIndex += Transforms.Quaternion.packedLength;
-            array[startingIndex] = value._drawNearPlane ? 1.0 : 0.0;
-
-            return array;
-        };
-
-        var scratchPackPerspective = new FrustumGeometry.PerspectiveFrustum();
-        var scratchPackOrthographic = new FrustumGeometry.OrthographicFrustum();
-        var scratchPackQuaternion = new Transforms.Quaternion();
-        var scratchPackorigin = new Cartographic.Cartesian3();
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {FrustumOutlineGeometry} [result] The object into which to store the result.
-         */
-        FrustumOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var frustumType = array[startingIndex++];
-
-            var frustum;
-            if (frustumType === PERSPECTIVE) {
-                frustum = FrustumGeometry.PerspectiveFrustum.unpack(array, startingIndex, scratchPackPerspective);
-                startingIndex += FrustumGeometry.PerspectiveFrustum.packedLength;
-            } else {
-                frustum = FrustumGeometry.OrthographicFrustum.unpack(array, startingIndex, scratchPackOrthographic);
-                startingIndex += FrustumGeometry.OrthographicFrustum.packedLength;
-            }
-
-            var origin = Cartographic.Cartesian3.unpack(array, startingIndex, scratchPackorigin);
-            startingIndex += Cartographic.Cartesian3.packedLength;
-            var orientation = Transforms.Quaternion.unpack(array, startingIndex, scratchPackQuaternion);
-            startingIndex += Transforms.Quaternion.packedLength;
-            var drawNearPlane = array[startingIndex] === 1.0;
-
-            if (!when.defined(result)) {
-                return new FrustumOutlineGeometry({
-                    frustum : frustum,
-                    origin : origin,
-                    orientation : orientation,
-                    _drawNearPlane : drawNearPlane
-                });
-            }
-
-            var frustumResult = frustumType === result._frustumType ? result._frustum : undefined;
-            result._frustum = frustum.clone(frustumResult);
-
-            result._frustumType = frustumType;
-            result._origin = Cartographic.Cartesian3.clone(origin, result._origin);
-            result._orientation = Transforms.Quaternion.clone(orientation, result._orientation);
-            result._drawNearPlane = drawNearPlane;
-
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of a frustum outline, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {FrustumOutlineGeometry} frustumGeometry A description of the frustum.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        FrustumOutlineGeometry.createGeometry = function(frustumGeometry) {
-            var frustumType = frustumGeometry._frustumType;
-            var frustum = frustumGeometry._frustum;
-            var origin = frustumGeometry._origin;
-            var orientation = frustumGeometry._orientation;
-            var drawNearPlane = frustumGeometry._drawNearPlane;
-
-            var positions = new Float64Array(3 * 4 * 2);
-            FrustumGeometry.FrustumGeometry._computeNearFarPlanes(origin, orientation, frustumType, frustum, positions);
-
-            var attributes = new GeometryAttributes.GeometryAttributes({
-                position : new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : positions
-                })
-            });
-
-            var offset;
-            var index;
-
-            var numberOfPlanes = drawNearPlane ? 2 : 1;
-            var indices = new Uint16Array(8 * (numberOfPlanes + 1));
-
-            // Build the near/far planes
-            var i = drawNearPlane ? 0 : 1;
-            for (; i < 2; ++i) {
-                offset = drawNearPlane ? i * 8 : 0;
-                index = i * 4;
-
-                indices[offset] = index;
-                indices[offset + 1] = index + 1;
-                indices[offset + 2] = index + 1;
-                indices[offset + 3] = index + 2;
-                indices[offset + 4] = index + 2;
-                indices[offset + 5] = index + 3;
-                indices[offset + 6] = index + 3;
-                indices[offset + 7] = index;
-            }
-
-            // Build the sides of the frustums
-            for (i = 0; i < 2; ++i) {
-                offset = (numberOfPlanes + i) * 8;
-                index = i * 4;
-
-                indices[offset] = index;
-                indices[offset + 1] = index + 4;
-                indices[offset + 2] = index + 1;
-                indices[offset + 3] = index + 5;
-                indices[offset + 4] = index + 2;
-                indices[offset + 5] = index + 6;
-                indices[offset + 6] = index + 3;
-                indices[offset + 7] = index + 7;
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : BoundingSphere.BoundingSphere.fromVertices(positions)
-            });
-        };
-
-    function createFrustumOutlineGeometry(frustumGeometry, offset) {
-        if (when.defined(offset)) {
-            frustumGeometry = FrustumOutlineGeometry.unpack(frustumGeometry, offset);
-        }
-        return FrustumOutlineGeometry.createGeometry(frustumGeometry);
-    }
-
-    return createFrustumOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createGeometry.js b/public/libs/Cesium/Workers/createGeometry.js
deleted file mode 100644
index c38d25d..0000000
--- a/public/libs/Cesium/Workers/createGeometry.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './PrimitivePipeline-c9b56b34', './WebMercatorProjection-80c70558', './createTaskProcessorWorker'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, PrimitivePipeline, WebMercatorProjection, createTaskProcessorWorker) { 'use strict';
-
-    /* global require */
-
-    var moduleCache = {};
-
-    function getModule(moduleName) {
-        var module = moduleCache[moduleName];
-        if (!when.defined(module)) {
-            if (typeof exports === 'object') {
-                // Use CommonJS-style require.
-                moduleCache[module] = module = require('Workers/' + moduleName);
-            } else {
-                // Use AMD-style require.
-                // in web workers, require is synchronous
-                require(['Workers/' + moduleName], function(f) {
-                    module = f;
-                    moduleCache[module] = f;
-                });
-            }
-        }
-        return module;
-    }
-
-    function createGeometry(parameters, transferableObjects) {
-        var subTasks = parameters.subTasks;
-        var length = subTasks.length;
-        var resultsOrPromises = new Array(length);
-
-        for (var i = 0; i < length; i++) {
-            var task = subTasks[i];
-            var geometry = task.geometry;
-            var moduleName = task.moduleName;
-
-            if (when.defined(moduleName)) {
-                var createFunction = getModule(moduleName);
-                resultsOrPromises[i] = createFunction(geometry, task.offset);
-            } else {
-                //Already created geometry
-                resultsOrPromises[i] = geometry;
-            }
-        }
-
-        return when.when.all(resultsOrPromises, function(results) {
-            return PrimitivePipeline.PrimitivePipeline.packCreateGeometryResults(results, transferableObjects);
-        });
-    }
-    var createGeometry$1 = createTaskProcessorWorker(createGeometry);
-
-    return createGeometry$1;
-
-});
diff --git a/public/libs/Cesium/Workers/createGroundPolylineGeometry.js b/public/libs/Cesium/Workers/createGroundPolylineGeometry.js
deleted file mode 100644
index 92c7ace..0000000
--- a/public/libs/Cesium/Workers/createGroundPolylineGeometry.js
+++ /dev/null
@@ -1,1621 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './EncodedCartesian3-a569cba8', './IntersectionTests-397d9494', './Plane-8390418f', './WebMercatorProjection-80c70558', './arrayRemoveDuplicates-f0b089b1', './ArcType-66bc286a', './EllipsoidRhumbLine-f161e674', './EllipsoidGeodesic-84507801'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, EncodedCartesian3, IntersectionTests, Plane, WebMercatorProjection, arrayRemoveDuplicates, ArcType, EllipsoidRhumbLine, EllipsoidGeodesic) { 'use strict';
-
-    /**
-     * A tiling scheme for geometry referenced to a simple {@link GeographicProjection} where
-     * longitude and latitude are directly mapped to X and Y.  This projection is commonly
-     * known as geographic, equirectangular, equidistant cylindrical, or plate carrée.
-     *
-     * @alias GeographicTilingScheme
-     * @constructor
-     *
-     * @param {Object} [options] Object with the following properties:
-     * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid whose surface is being tiled. Defaults to
-     * the WGS84 ellipsoid.
-     * @param {Rectangle} [options.rectangle=Rectangle.MAX_VALUE] The rectangle, in radians, covered by the tiling scheme.
-     * @param {Number} [options.numberOfLevelZeroTilesX=2] The number of tiles in the X direction at level zero of
-     * the tile tree.
-     * @param {Number} [options.numberOfLevelZeroTilesY=1] The number of tiles in the Y direction at level zero of
-     * the tile tree.
-     */
-    function GeographicTilingScheme(options) {
-        options = when.defaultValue(options, {});
-
-        this._ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-        this._rectangle = when.defaultValue(options.rectangle, Cartesian2.Rectangle.MAX_VALUE);
-        this._projection = new BoundingSphere.GeographicProjection(this._ellipsoid);
-        this._numberOfLevelZeroTilesX = when.defaultValue(options.numberOfLevelZeroTilesX, 2);
-        this._numberOfLevelZeroTilesY = when.defaultValue(options.numberOfLevelZeroTilesY, 1);
-
-
-        this._customDPI = options.customDPI;
-        this._scaleDenominators = options.scaleDenominators;
-
-        this._tileWidth = when.defaultValue(options.tileWidth, 256);
-        this._tileHeight = when.defaultValue(options.tileHeight, 256);
-
-        this._beginLevel = when.defaultValue(options.beginLevel, 0);
-    }
-
-    Object.defineProperties(GeographicTilingScheme.prototype, {
-        /**
-         * Gets the ellipsoid that is tiled by this tiling scheme.
-         * @memberof GeographicTilingScheme.prototype
-         * @type {Ellipsoid}
-         */
-        ellipsoid : {
-            get : function() {
-                return this._ellipsoid;
-            }
-        },
-
-        /**
-         * Gets the rectangle, in radians, covered by this tiling scheme.
-         * @memberof GeographicTilingScheme.prototype
-         * @type {Rectangle}
-         */
-        rectangle : {
-            get : function() {
-                return this._rectangle;
-            }
-        },
-
-        /**
-         * Gets the map projection used by this tiling scheme.
-         * @memberof GeographicTilingScheme.prototype
-         * @type {MapProjection}
-         */
-        projection : {
-            get : function() {
-                return this._projection;
-            }
-        },
-        beginLevel : {
-            get : function() {
-                return this._beginLevel;
-            }
-        }
-    });
-
-    /**
-     * Gets the total number of tiles in the X direction at a specified level-of-detail.
-     *
-     * @param {Number} level The level-of-detail.
-     * @returns {Number} The number of tiles in the X direction at the given level.
-     */
-    GeographicTilingScheme.prototype.getNumberOfXTilesAtLevel = function(level) {
-        return this._numberOfLevelZeroTilesX << (level - this._beginLevel);
-    };
-
-    /**
-     * Gets the total number of tiles in the Y direction at a specified level-of-detail.
-     *
-     * @param {Number} level The level-of-detail.
-     * @returns {Number} The number of tiles in the Y direction at the given level.
-     */
-    GeographicTilingScheme.prototype.getNumberOfYTilesAtLevel = function(level) {
-        return this._numberOfLevelZeroTilesY << (level - this._beginLevel);
-    };
-
-    /**
-     * Transforms a rectangle specified in geodetic radians to the native coordinate system
-     * of this tiling scheme.
-     *
-     * @param {Rectangle} rectangle The rectangle to transform.
-     * @param {Rectangle} [result] The instance to which to copy the result, or undefined if a new instance
-     *        should be created.
-     * @returns {Rectangle} The specified 'result', or a new object containing the native rectangle if 'result'
-     *          is undefined.
-     */
-    GeographicTilingScheme.prototype.rectangleToNativeRectangle = function(rectangle, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('rectangle', rectangle);
-        //>>includeEnd('debug');
-
-        var west = _Math.CesiumMath.toDegrees(rectangle.west);
-        var south = _Math.CesiumMath.toDegrees(rectangle.south);
-        var east = _Math.CesiumMath.toDegrees(rectangle.east);
-        var north = _Math.CesiumMath.toDegrees(rectangle.north);
-
-        if (!when.defined(result)) {
-            return new Cartesian2.Rectangle(west, south, east, north);
-        }
-
-        result.west = west;
-        result.south = south;
-        result.east = east;
-        result.north = north;
-        return result;
-    };
-
-    /**
-     * Converts tile x, y coordinates and level to a rectangle expressed in the native coordinates
-     * of the tiling scheme.
-     *
-     * @param {Number} x The integer x coordinate of the tile.
-     * @param {Number} y The integer y coordinate of the tile.
-     * @param {Number} level The tile level-of-detail.  Zero is the least detailed.
-     * @param {Object} [result] The instance to which to copy the result, or undefined if a new instance
-     *        should be created.
-     * @returns {Rectangle} The specified 'result', or a new object containing the rectangle
-     *          if 'result' is undefined.
-     */
-    GeographicTilingScheme.prototype.tileXYToNativeRectangle = function(x, y, level, result) {
-        var rectangleRadians = this.tileXYToRectangle(x, y, level, result);
-        rectangleRadians.west = _Math.CesiumMath.toDegrees(rectangleRadians.west);
-        rectangleRadians.south = _Math.CesiumMath.toDegrees(rectangleRadians.south);
-        rectangleRadians.east = _Math.CesiumMath.toDegrees(rectangleRadians.east);
-        rectangleRadians.north = _Math.CesiumMath.toDegrees(rectangleRadians.north);
-        return rectangleRadians;
-    };
-
-    /**
-     * Converts tile x, y coordinates and level to a cartographic rectangle in radians.
-     *
-     * @param {Number} x The integer x coordinate of the tile.
-     * @param {Number} y The integer y coordinate of the tile.
-     * @param {Number} level The tile level-of-detail.  Zero is the least detailed.
-     * @param {Object} [result] The instance to which to copy the result, or undefined if a new instance
-     *        should be created.
-     * @returns {Rectangle} The specified 'result', or a new object containing the rectangle
-     *          if 'result' is undefined.
-     */
-    GeographicTilingScheme.prototype.tileXYToRectangle = function(x, y, level, result) {
-        var rectangle = this._rectangle;
-
-        if(when.defined(this._customDPI) && when.defined(this._scaleDenominators)){
-
-            var resolution = this.calculateResolution(level);
-
-            var west = -_Math.CesiumMath.PI + x * this._tileWidth * resolution.x;
-            var east = -_Math.CesiumMath.PI + (x + 1) * this._tileWidth * resolution.x;
-
-            var north = _Math.CesiumMath.PI_OVER_TWO - y * this._tileHeight * resolution.y;
-            var south = _Math.CesiumMath.PI_OVER_TWO - (y + 1) * this._tileHeight * resolution.y;
-
-            if (!when.defined(result)) {
-                return new Cartesian2.Rectangle(west, south, east, north);
-            }
-
-            result.west = west;
-            result.south = south;
-            result.east = east;
-            result.north = north;
-            return result;
-        }
-
-
-        var xTiles = this.getNumberOfXTilesAtLevel(level);
-        var yTiles = this.getNumberOfYTilesAtLevel(level);
-
-        var xTileWidth = rectangle.width / xTiles;
-        var west = x * xTileWidth + rectangle.west;
-        var east = (x + 1) * xTileWidth + rectangle.west;
-
-        var yTileHeight = rectangle.height / yTiles;
-        var north = rectangle.north - y * yTileHeight;
-        var south = rectangle.north - (y + 1) * yTileHeight;
-
-        if (!when.defined(result)) {
-            result = new Cartesian2.Rectangle(west, south, east, north);
-        }
-
-        result.west = west;
-        result.south = south;
-        result.east = east;
-        result.north = north;
-        return result;
-    };
-
-    /**
-     * Calculates the tile x, y coordinates of the tile containing
-     * a given cartographic position.
-     *
-     * @param {Cartographic} position The position.
-     * @param {Number} level The tile level-of-detail.  Zero is the least detailed.
-     * @param {Cartesian2} [result] The instance to which to copy the result, or undefined if a new instance
-     *        should be created.
-     * @returns {Cartesian2} The specified 'result', or a new object containing the tile x, y coordinates
-     *          if 'result' is undefined.
-     */
-    GeographicTilingScheme.prototype.positionToTileXY = function(position, level, result) {
-        var rectangle = this._rectangle;
-        if (!Cartesian2.Rectangle.contains(rectangle, position)) {
-            // outside the bounds of the tiling scheme
-            return undefined;
-        }
-
-        var xTiles = this.getNumberOfXTilesAtLevel(level);
-        var yTiles = this.getNumberOfYTilesAtLevel(level);
-
-        var xTileWidth = rectangle.width / xTiles;
-        var yTileHeight = rectangle.height / yTiles;
-
-        if(when.defined(this._customDPI) && when.defined(this._scaleDenominators)) {
-            var resolution = this.calculateResolution(level);
-            xTileWidth = this._tileWidth * resolution.x;
-            yTileHeight = this._tileHeight * resolution.y;
-        }
-
-        var longitude = position.longitude;
-        if (rectangle.east < rectangle.west) {
-            longitude += _Math.CesiumMath.TWO_PI;
-        }
-
-        var xTileCoordinate = (longitude - rectangle.west) / xTileWidth | 0;
-        if (xTileCoordinate >= xTiles) {
-            xTileCoordinate = xTiles - 1;
-        }
-
-        var yTileCoordinate = (rectangle.north - position.latitude) / yTileHeight | 0;
-        if (yTileCoordinate >= yTiles) {
-            yTileCoordinate = yTiles - 1;
-        }
-
-        if (!when.defined(result)) {
-            return new Cartesian2.Cartesian2(xTileCoordinate, yTileCoordinate);
-        }
-
-        result.x = xTileCoordinate;
-        result.y = yTileCoordinate;
-        return result;
-    };
-
-    GeographicTilingScheme.prototype.calculateResolution = function(level) {
-
-        var xResolution = this._scaleDenominators[level - this._beginLevel] * 0.0254 / this._customDPI.x;
-        var yResolution = this._scaleDenominators[level - this._beginLevel] * 0.0254 / this._customDPI.y;
-
-        var meterPerDegreeInEquator = Cartesian2.Ellipsoid.WGS84.maximumRadius/* * CesiumMath.TWO_PI / 360.0*/;
-
-        return new Cartesian2.Cartesian2(xResolution / meterPerDegreeInEquator, yResolution / meterPerDegreeInEquator);
-    };
-
-    var scratchDiagonalCartesianNE = new Cartographic.Cartesian3();
-        var scratchDiagonalCartesianSW = new Cartographic.Cartesian3();
-        var scratchDiagonalCartographic = new Cartographic.Cartographic();
-        var scratchCenterCartesian = new Cartographic.Cartesian3();
-        var scratchSurfaceCartesian = new Cartographic.Cartesian3();
-
-        var scratchBoundingSphere = new BoundingSphere.BoundingSphere();
-        var tilingScheme = new GeographicTilingScheme();
-        var scratchCorners = [new Cartographic.Cartographic(), new Cartographic.Cartographic(), new Cartographic.Cartographic(), new Cartographic.Cartographic()];
-        var scratchTileXY = new Cartesian2.Cartesian2();
-
-        /**
-         * A collection of functions for approximating terrain height
-         * @private
-         */
-        var ApproximateTerrainHeights = {};
-
-        /**
-         * Initializes the minimum and maximum terrain heights
-         * @return {Promise}
-         */
-        ApproximateTerrainHeights.initialize = function() {
-            var initPromise = ApproximateTerrainHeights._initPromise;
-            if (when.defined(initPromise)) {
-                return initPromise;
-            }
-
-            initPromise = buildModuleUrl.Resource.fetchJson(buildModuleUrl.buildModuleUrl('Assets/approximateTerrainHeights.json'))
-                .then(function(json) {
-                    ApproximateTerrainHeights._terrainHeights = json;
-                });
-            ApproximateTerrainHeights._initPromise = initPromise;
-
-            return initPromise;
-        };
-
-        /**
-         * Computes the minimum and maximum terrain heights for a given rectangle
-         * @param {Rectangle} rectangle The bounding rectangle
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid
-         * @return {{minimumTerrainHeight: Number, maximumTerrainHeight: Number}}
-         */
-        ApproximateTerrainHeights.getMinimumMaximumHeights = function(rectangle, ellipsoid) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('rectangle', rectangle);
-            if (!when.defined(ApproximateTerrainHeights._terrainHeights)) {
-                throw new Check.DeveloperError('You must call ApproximateTerrainHeights.initialize and wait for the promise to resolve before using this function');
-            }
-            //>>includeEnd('debug');
-            ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-            var xyLevel = getTileXYLevel(rectangle);
-
-            // Get the terrain min/max for that tile
-            var minTerrainHeight = ApproximateTerrainHeights._defaultMinTerrainHeight;
-            var maxTerrainHeight = ApproximateTerrainHeights._defaultMaxTerrainHeight;
-            if (when.defined(xyLevel)) {
-                var key = xyLevel.level + '-' + xyLevel.x + '-' + xyLevel.y;
-                var heights = ApproximateTerrainHeights._terrainHeights[key];
-                if (when.defined(heights)) {
-                    minTerrainHeight = heights[0];
-                    maxTerrainHeight = heights[1];
-                }
-
-                // Compute min by taking the center of the NE->SW diagonal and finding distance to the surface
-                ellipsoid.cartographicToCartesian(Cartesian2.Rectangle.northeast(rectangle, scratchDiagonalCartographic),
-                    scratchDiagonalCartesianNE);
-                ellipsoid.cartographicToCartesian(Cartesian2.Rectangle.southwest(rectangle, scratchDiagonalCartographic),
-                    scratchDiagonalCartesianSW);
-
-                Cartographic.Cartesian3.midpoint(scratchDiagonalCartesianSW, scratchDiagonalCartesianNE, scratchCenterCartesian);
-                var surfacePosition = ellipsoid.scaleToGeodeticSurface(scratchCenterCartesian, scratchSurfaceCartesian);
-                if (when.defined(surfacePosition)) {
-                    var distance = Cartographic.Cartesian3.distance(scratchCenterCartesian, surfacePosition);
-                    minTerrainHeight = Math.min(minTerrainHeight, -distance);
-                } else {
-                    minTerrainHeight = ApproximateTerrainHeights._defaultMinTerrainHeight;
-                }
-            }
-
-            minTerrainHeight = Math.max(ApproximateTerrainHeights._defaultMinTerrainHeight, minTerrainHeight);
-
-            return {
-                minimumTerrainHeight: minTerrainHeight,
-                maximumTerrainHeight: maxTerrainHeight
-            };
-        };
-
-        /**
-         * Computes the bounding sphere based on the tile heights in the rectangle
-         * @param {Rectangle} rectangle The bounding rectangle
-         * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid
-         * @return {BoundingSphere} The result bounding sphere
-         */
-        ApproximateTerrainHeights.getBoundingSphere = function(rectangle, ellipsoid) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('rectangle', rectangle);
-            if (!when.defined(ApproximateTerrainHeights._terrainHeights)) {
-                throw new Check.DeveloperError('You must call ApproximateTerrainHeights.initialize and wait for the promise to resolve before using this function');
-            }
-            //>>includeEnd('debug');
-            ellipsoid = when.defaultValue(ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-            var xyLevel = getTileXYLevel(rectangle);
-
-            // Get the terrain max for that tile
-            var maxTerrainHeight = ApproximateTerrainHeights._defaultMaxTerrainHeight;
-            if (when.defined(xyLevel)) {
-                var key = xyLevel.level + '-' + xyLevel.x + '-' + xyLevel.y;
-                var heights = ApproximateTerrainHeights._terrainHeights[key];
-                if (when.defined(heights)) {
-                    maxTerrainHeight = heights[1];
-                }
-            }
-
-            var result = BoundingSphere.BoundingSphere.fromRectangle3D(rectangle, ellipsoid, 0.0);
-            BoundingSphere.BoundingSphere.fromRectangle3D(rectangle, ellipsoid, maxTerrainHeight, scratchBoundingSphere);
-
-            return BoundingSphere.BoundingSphere.union(result, scratchBoundingSphere, result);
-        };
-
-        function getTileXYLevel(rectangle) {
-            Cartographic.Cartographic.fromRadians(rectangle.east, rectangle.north, 0.0, scratchCorners[0]);
-            Cartographic.Cartographic.fromRadians(rectangle.west, rectangle.north, 0.0, scratchCorners[1]);
-            Cartographic.Cartographic.fromRadians(rectangle.east, rectangle.south, 0.0, scratchCorners[2]);
-            Cartographic.Cartographic.fromRadians(rectangle.west, rectangle.south, 0.0, scratchCorners[3]);
-
-            // Determine which tile the bounding rectangle is in
-            var lastLevelX = 0, lastLevelY = 0;
-            var currentX = 0, currentY = 0;
-            var maxLevel = ApproximateTerrainHeights._terrainHeightsMaxLevel;
-            var i;
-            for(i = 0; i <= maxLevel; ++i) {
-                var failed = false;
-                for(var j = 0; j < 4; ++j) {
-                    var corner = scratchCorners[j];
-                    tilingScheme.positionToTileXY(corner, i, scratchTileXY);
-                    if (j === 0) {
-                        currentX = scratchTileXY.x;
-                        currentY = scratchTileXY.y;
-                    } else if(currentX !== scratchTileXY.x || currentY !== scratchTileXY.y) {
-                        failed = true;
-                        break;
-                    }
-                }
-
-                if (failed) {
-                    break;
-                }
-
-                lastLevelX = currentX;
-                lastLevelY = currentY;
-            }
-
-            if (i === 0) {
-                return undefined;
-            }
-
-            return {
-                x : lastLevelX,
-                y : lastLevelY,
-                level : (i > maxLevel) ? maxLevel : (i - 1)
-            };
-        }
-
-        ApproximateTerrainHeights._terrainHeightsMaxLevel = 6;
-        ApproximateTerrainHeights._defaultMaxTerrainHeight = 9000.0;
-        ApproximateTerrainHeights._defaultMinTerrainHeight = -100000.0;
-        ApproximateTerrainHeights._terrainHeights = undefined;
-        ApproximateTerrainHeights._initPromise = undefined;
-
-        Object.defineProperties(ApproximateTerrainHeights, {
-            /**
-             * Determines if the terrain heights are initialized and ready to use. To initialize the terrain heights,
-             * call {@link ApproximateTerrainHeights#initialize} and wait for the returned promise to resolve.
-             * @type {Boolean}
-             * @readonly
-             * @memberof ApproximateTerrainHeights
-             */
-            initialized: {
-                get: function() {
-                    return when.defined(ApproximateTerrainHeights._terrainHeights);
-                }
-            }
-        });
-
-    var PROJECTIONS = [BoundingSphere.GeographicProjection, WebMercatorProjection.WebMercatorProjection];
-    var PROJECTION_COUNT = PROJECTIONS.length;
-
-    var MITER_BREAK_SMALL = Math.cos(_Math.CesiumMath.toRadians(30.0));
-    var MITER_BREAK_LARGE = Math.cos(_Math.CesiumMath.toRadians(150.0));
-
-    // Initial heights for constructing the wall.
-    // Keeping WALL_INITIAL_MIN_HEIGHT near the ellipsoid surface helps
-    // prevent precision problems with planes in the shader.
-    // Putting the start point of a plane at ApproximateTerrainHeights._defaultMinTerrainHeight,
-    // which is a highly conservative bound, usually puts the plane origin several thousands
-    // of meters away from the actual terrain, causing floating point problems when checking
-    // fragments on terrain against the plane.
-    // Ellipsoid height is generally much closer.
-    // The initial max height is arbitrary.
-    // Both heights are corrected using ApproximateTerrainHeights for computing the actual volume geometry.
-    var WALL_INITIAL_MIN_HEIGHT = 0.0;
-    var WALL_INITIAL_MAX_HEIGHT = 1000.0;
-
-    /**
-     * A description of a polyline on terrain or 3D Tiles. Only to be used with {@link GroundPolylinePrimitive}.
-     *
-     * @alias GroundPolylineGeometry
-     * @constructor
-     *
-     * @param {Object} options Options with the following properties:
-     * @param {Cartesian3[]} options.positions An array of {@link Cartesian3} defining the polyline's points. Heights above the ellipsoid will be ignored.
-     * @param {Number} [options.width=1.0] The screen space width in pixels.
-     * @param {Number} [options.granularity=9999.0] The distance interval in meters used for interpolating options.points. Defaults to 9999.0 meters. Zero indicates no interpolation.
-     * @param {Boolean} [options.loop=false] Whether during geometry creation a line segment will be added between the last and first line positions to make this Polyline a loop.
-     * @param {ArcType} [options.arcType=ArcType.GEODESIC] The type of line the polyline segments must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}.
-     *
-     * @exception {DeveloperError} At least two positions are required.
-     *
-     * @see GroundPolylinePrimitive
-     *
-     * @example
-     * var positions = Cesium.Cartesian3.fromDegreesArray([
-     *   -112.1340164450331, 36.05494287836128,
-     *   -112.08821010582645, 36.097804071380715,
-     *   -112.13296079730024, 36.168769146801104
-     * ]);
-     *
-     * var geometry = new Cesium.GroundPolylineGeometry({
-     *   positions : positions
-     * });
-     */
-    function GroundPolylineGeometry(options) {
-        options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-        var positions = options.positions;
-
-        //>>includeStart('debug', pragmas.debug);
-        if ((!when.defined(positions)) || (positions.length < 2)) {
-            throw new Check.DeveloperError('At least two positions are required.');
-        }
-        if (when.defined(options.arcType) && options.arcType !== ArcType.ArcType.GEODESIC && options.arcType !== ArcType.ArcType.RHUMB) {
-            throw new Check.DeveloperError('Valid options for arcType are ArcType.GEODESIC and ArcType.RHUMB.');
-        }
-        //>>includeEnd('debug');
-
-        /**
-         * The screen space width in pixels.
-         * @type {Number}
-         */
-        this.width = when.defaultValue(options.width, 1.0); // Doesn't get packed, not necessary for computing geometry.
-
-        this._positions = positions;
-
-        /**
-         * The distance interval used for interpolating options.points. Zero indicates no interpolation.
-         * Default of 9999.0 allows centimeter accuracy with 32 bit floating point.
-         * @type {Boolean}
-         * @default 9999.0
-         */
-        this.granularity = when.defaultValue(options.granularity, 9999.0);
-
-        /**
-         * Whether during geometry creation a line segment will be added between the last and first line positions to make this Polyline a loop.
-         * If the geometry has two positions this parameter will be ignored.
-         * @type {Boolean}
-         * @default false
-         */
-        this.loop = when.defaultValue(options.loop, false);
-
-        /**
-         * The type of path the polyline must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}.
-         * @type {ArcType}
-         * @default ArcType.GEODESIC
-         */
-        this.arcType = when.defaultValue(options.arcType, ArcType.ArcType.GEODESIC);
-
-        this._ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-        // MapProjections can't be packed, so store the index to a known MapProjection.
-        this._projectionIndex = 0;
-        this._workerName = 'createGroundPolylineGeometry';
-
-        // Used by GroundPolylinePrimitive to signal worker that scenemode is 3D only.
-        this._scene3DOnly = false;
-    }
-
-    Object.defineProperties(GroundPolylineGeometry.prototype, {
-        /**
-         * The number of elements used to pack the object into an array.
-         * @memberof GroundPolylineGeometry.prototype
-         * @type {Number}
-         * @readonly
-         * @private
-         */
-        packedLength: {
-            get: function() {
-                return 1.0 + this._positions.length * 3 + 1.0 + 1.0 + 1.0 + Cartesian2.Ellipsoid.packedLength + 1.0 + 1.0;
-            }
-        }
-    });
-
-    /**
-     * Set the GroundPolylineGeometry's projection and ellipsoid.
-     * Used by GroundPolylinePrimitive to signal scene information to the geometry for generating 2D attributes.
-     *
-     * @param {GroundPolylineGeometry} groundPolylineGeometry GroundPolylinGeometry describing a polyline on terrain or 3D Tiles.
-     * @param {Projection} mapProjection A MapProjection used for projecting cartographic coordinates to 2D.
-     * @private
-     */
-    GroundPolylineGeometry.setProjectionAndEllipsoid = function(groundPolylineGeometry, mapProjection) {
-        var projectionIndex = 0;
-        for (var i = 0; i < PROJECTION_COUNT; i++) {
-            if (mapProjection instanceof PROJECTIONS[i]) {
-                projectionIndex = i;
-                break;
-            }
-        }
-
-        groundPolylineGeometry._projectionIndex = projectionIndex;
-        groundPolylineGeometry._ellipsoid = mapProjection.ellipsoid;
-    };
-
-    var cart3Scratch1 = new Cartographic.Cartesian3();
-    var cart3Scratch2 = new Cartographic.Cartesian3();
-    var cart3Scratch3 = new Cartographic.Cartesian3();
-    function computeRightNormal(start, end, maxHeight, ellipsoid, result) {
-        var startBottom = getPosition(ellipsoid, start, 0.0, cart3Scratch1);
-        var startTop = getPosition(ellipsoid, start, maxHeight, cart3Scratch2);
-        var endBottom = getPosition(ellipsoid, end, 0.0, cart3Scratch3);
-
-        var up = direction(startTop, startBottom, cart3Scratch2);
-        var forward = direction(endBottom, startBottom, cart3Scratch3);
-
-        Cartographic.Cartesian3.cross(forward, up, result);
-        return Cartographic.Cartesian3.normalize(result, result);
-    }
-
-    var interpolatedCartographicScratch = new Cartographic.Cartographic();
-    var interpolatedBottomScratch = new Cartographic.Cartesian3();
-    var interpolatedTopScratch = new Cartographic.Cartesian3();
-    var interpolatedNormalScratch = new Cartographic.Cartesian3();
-    function interpolateSegment(start, end, minHeight, maxHeight, granularity, arcType, ellipsoid, normalsArray, bottomPositionsArray, topPositionsArray, cartographicsArray) {
-        if (granularity === 0.0) {
-            return;
-        }
-
-        var ellipsoidLine;
-        if (arcType === ArcType.ArcType.GEODESIC) {
-            ellipsoidLine = new EllipsoidGeodesic.EllipsoidGeodesic(start, end, ellipsoid);
-        } else if (arcType === ArcType.ArcType.RHUMB) {
-            ellipsoidLine = new EllipsoidRhumbLine.EllipsoidRhumbLine(start, end, ellipsoid);
-        }
-
-        var surfaceDistance = ellipsoidLine.surfaceDistance;
-        if (surfaceDistance < granularity) {
-            return;
-        }
-
-        // Compute rightwards normal applicable at all interpolated points
-        var interpolatedNormal = computeRightNormal(start, end, maxHeight, ellipsoid, interpolatedNormalScratch);
-
-        var segments = Math.ceil(surfaceDistance / granularity);
-        var interpointDistance = surfaceDistance / segments;
-        var distanceFromStart = interpointDistance;
-        var pointsToAdd = segments - 1;
-        var packIndex = normalsArray.length;
-        for (var i = 0; i < pointsToAdd; i++) {
-            var interpolatedCartographic = ellipsoidLine.interpolateUsingSurfaceDistance(distanceFromStart, interpolatedCartographicScratch);
-            var interpolatedBottom = getPosition(ellipsoid, interpolatedCartographic, minHeight, interpolatedBottomScratch);
-            var interpolatedTop = getPosition(ellipsoid, interpolatedCartographic, maxHeight, interpolatedTopScratch);
-
-            Cartographic.Cartesian3.pack(interpolatedNormal, normalsArray, packIndex);
-            Cartographic.Cartesian3.pack(interpolatedBottom, bottomPositionsArray, packIndex);
-            Cartographic.Cartesian3.pack(interpolatedTop, topPositionsArray, packIndex);
-            cartographicsArray.push(interpolatedCartographic.latitude);
-            cartographicsArray.push(interpolatedCartographic.longitude);
-
-            packIndex += 3;
-            distanceFromStart += interpointDistance;
-        }
-    }
-
-    var heightlessCartographicScratch = new Cartographic.Cartographic();
-    function getPosition(ellipsoid, cartographic, height, result) {
-        Cartographic.Cartographic.clone(cartographic, heightlessCartographicScratch);
-        heightlessCartographicScratch.height = height;
-        return Cartographic.Cartographic.toCartesian(heightlessCartographicScratch, ellipsoid, result);
-    }
-
-    /**
-     * Stores the provided instance into the provided array.
-     *
-     * @param {PolygonGeometry} value The value to pack.
-     * @param {Number[]} array The array to pack into.
-     * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-     *
-     * @returns {Number[]} The array that was packed into
-     */
-    GroundPolylineGeometry.pack = function(value, array, startingIndex) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.typeOf.object('value', value);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        var index = when.defaultValue(startingIndex, 0);
-
-        var positions = value._positions;
-        var positionsLength = positions.length;
-
-        array[index++] = positionsLength;
-
-        for (var i = 0; i < positionsLength; ++i) {
-            var cartesian = positions[i];
-            Cartographic.Cartesian3.pack(cartesian, array, index);
-            index += 3;
-        }
-
-        array[index++] = value.granularity;
-        array[index++] = value.loop ? 1.0 : 0.0;
-        array[index++] = value.arcType;
-
-        Cartesian2.Ellipsoid.pack(value._ellipsoid, array, index);
-        index += Cartesian2.Ellipsoid.packedLength;
-
-        array[index++] = value._projectionIndex;
-        array[index++] = value._scene3DOnly ? 1.0 : 0.0;
-
-        return array;
-    };
-
-    /**
-     * Retrieves an instance from a packed array.
-     *
-     * @param {Number[]} array The packed array.
-     * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-     * @param {PolygonGeometry} [result] The object into which to store the result.
-     */
-    GroundPolylineGeometry.unpack = function(array, startingIndex, result) {
-        //>>includeStart('debug', pragmas.debug);
-        Check.Check.defined('array', array);
-        //>>includeEnd('debug');
-
-        var index = when.defaultValue(startingIndex, 0);
-        var positionsLength = array[index++];
-        var positions = new Array(positionsLength);
-
-        for (var i = 0; i < positionsLength; i++) {
-            positions[i] = Cartographic.Cartesian3.unpack(array, index);
-            index += 3;
-        }
-
-        var granularity = array[index++];
-        var loop = array[index++] === 1.0;
-        var arcType = array[index++];
-
-        var ellipsoid = Cartesian2.Ellipsoid.unpack(array, index);
-        index += Cartesian2.Ellipsoid.packedLength;
-
-        var projectionIndex = array[index++];
-        var scene3DOnly = (array[index++] === 1.0);
-
-        if (!when.defined(result)) {
-            var geometry = new GroundPolylineGeometry({
-                positions : positions,
-                granularity : granularity,
-                loop : loop,
-                arcType : arcType,
-                ellipsoid : ellipsoid
-            });
-            geometry._projectionIndex = projectionIndex;
-            geometry._scene3DOnly = scene3DOnly;
-            return geometry;
-        }
-
-        result._positions = positions;
-        result.granularity = granularity;
-        result.loop = loop;
-        result.arcType = arcType;
-        result._ellipsoid = ellipsoid;
-        result._projectionIndex = projectionIndex;
-        result._scene3DOnly = scene3DOnly;
-
-        return result;
-    };
-
-    function direction(target, origin, result) {
-        Cartographic.Cartesian3.subtract(target, origin, result);
-        Cartographic.Cartesian3.normalize(result, result);
-        return result;
-    }
-
-    var toPreviousScratch = new Cartographic.Cartesian3();
-    var toNextScratch = new Cartographic.Cartesian3();
-    var forwardScratch = new Cartographic.Cartesian3();
-    var coplanarNormalScratch = new Cartographic.Cartesian3();
-    var coplanarPlaneScratch = new Plane.Plane(Cartographic.Cartesian3.UNIT_X, 0.0);
-    var vertexUpScratch = new Cartographic.Cartesian3();
-    var cosine90 = 0.0;
-    function computeVertexMiterNormal(previousBottom, vertexBottom, vertexTop, nextBottom, result) {
-        var up = direction(vertexTop, vertexBottom, vertexUpScratch);
-        var toPrevious = direction(previousBottom, vertexBottom, toPreviousScratch);
-        var toNext = direction(nextBottom, vertexBottom, toNextScratch);
-
-        // Check if points are coplanar in a right-side-pointing plane that contains "up."
-        // This is roughly equivalent to the points being colinear in cartographic space.
-        var coplanarNormal = Cartographic.Cartesian3.cross(up, toPrevious, coplanarNormalScratch);
-        coplanarNormal = Cartographic.Cartesian3.normalize(coplanarNormal, coplanarNormal);
-        var coplanarPlane = Plane.Plane.fromPointNormal(vertexBottom, coplanarNormal, coplanarPlaneScratch);
-        var nextBottomDistance = Plane.Plane.getPointDistance(coplanarPlane, nextBottom);
-        if (_Math.CesiumMath.equalsEpsilon(nextBottomDistance, 0.0, _Math.CesiumMath.EPSILON7)) {
-            // If the points are coplanar, point the normal in the direction of the plane
-            Cartographic.Cartesian3.clone(coplanarNormal, result);
-            return result;
-        }
-
-        // Average directions to previous and to next
-        result = Cartographic.Cartesian3.add(toNext, toPrevious, result);
-        result = Cartographic.Cartesian3.normalize(result, result);
-
-        // Rotate this direction to be orthogonal to up
-        var forward = Cartographic.Cartesian3.cross(up, result, forwardScratch);
-        Cartographic.Cartesian3.normalize(forward, forward);
-        Cartographic.Cartesian3.cross(forward, up, result);
-        Cartographic.Cartesian3.normalize(result, result);
-
-        // Flip the normal if it isn't pointing roughly bound right (aka if forward is pointing more "backwards")
-        if (Cartographic.Cartesian3.dot(toNext, forward) < cosine90) {
-            result = Cartographic.Cartesian3.negate(result, result);
-        }
-
-        return result;
-    }
-
-    var XZ_PLANE = Plane.Plane.fromPointNormal(Cartographic.Cartesian3.ZERO, Cartographic.Cartesian3.UNIT_Y);
-
-    var previousBottomScratch = new Cartographic.Cartesian3();
-    var vertexBottomScratch = new Cartographic.Cartesian3();
-    var vertexTopScratch = new Cartographic.Cartesian3();
-    var nextBottomScratch = new Cartographic.Cartesian3();
-    var vertexNormalScratch = new Cartographic.Cartesian3();
-    var intersectionScratch = new Cartographic.Cartesian3();
-    var cartographicScratch0 = new Cartographic.Cartographic();
-    var cartographicScratch1 = new Cartographic.Cartographic();
-    var cartographicIntersectionScratch = new Cartographic.Cartographic();
-    /**
-     * Computes shadow volumes for the ground polyline, consisting of its vertices, indices, and a bounding sphere.
-     * Vertices are "fat," packing all the data needed in each volume to describe a line on terrain or 3D Tiles.
-     * Should not be called independent of {@link GroundPolylinePrimitive}.
-     *
-     * @param {GroundPolylineGeometry} groundPolylineGeometry
-     * @private
-     */
-    GroundPolylineGeometry.createGeometry = function(groundPolylineGeometry) {
-        var compute2dAttributes = !groundPolylineGeometry._scene3DOnly;
-        var loop = groundPolylineGeometry.loop;
-        var ellipsoid = groundPolylineGeometry._ellipsoid;
-        var granularity = groundPolylineGeometry.granularity;
-        var arcType = groundPolylineGeometry.arcType;
-        var projection = new PROJECTIONS[groundPolylineGeometry._projectionIndex](ellipsoid);
-
-        var minHeight = WALL_INITIAL_MIN_HEIGHT;
-        var maxHeight = WALL_INITIAL_MAX_HEIGHT;
-
-        var index;
-        var i;
-
-        var positions = groundPolylineGeometry._positions;
-        var positionsLength = positions.length;
-
-        if (positionsLength === 2) {
-            loop = false;
-        }
-
-        // Split positions across the IDL and the Prime Meridian as well.
-        // Split across prime meridian because very large geometries crossing the Prime Meridian but not the IDL
-        // may get split by the plane of IDL + Prime Meridian.
-        var p0;
-        var p1;
-        var c0;
-        var c1;
-        var rhumbLine = new EllipsoidRhumbLine.EllipsoidRhumbLine(undefined, undefined, ellipsoid);
-        var intersection;
-        var intersectionCartographic;
-        var intersectionLongitude;
-        var splitPositions = [positions[0]];
-        for (i = 0; i < positionsLength - 1; i++) {
-            p0 = positions[i];
-            p1 = positions[i + 1];
-            intersection = IntersectionTests.IntersectionTests.lineSegmentPlane(p0, p1, XZ_PLANE, intersectionScratch);
-            if (when.defined(intersection) &&
-                !Cartographic.Cartesian3.equalsEpsilon(intersection, p0, _Math.CesiumMath.EPSILON7) &&
-                !Cartographic.Cartesian3.equalsEpsilon(intersection, p1, _Math.CesiumMath.EPSILON7)) {
-                if (groundPolylineGeometry.arcType === ArcType.ArcType.GEODESIC) {
-                    splitPositions.push(Cartographic.Cartesian3.clone(intersection));
-                } else if (groundPolylineGeometry.arcType === ArcType.ArcType.RHUMB) {
-                    intersectionLongitude = ellipsoid.cartesianToCartographic(intersection, cartographicScratch0).longitude;
-                    c0 = ellipsoid.cartesianToCartographic(p0, cartographicScratch0);
-                    c1 = ellipsoid.cartesianToCartographic(p1, cartographicScratch1);
-                    rhumbLine.setEndPoints(c0, c1);
-                    intersectionCartographic = rhumbLine.findIntersectionWithLongitude(intersectionLongitude, cartographicIntersectionScratch);
-                    intersection = ellipsoid.cartographicToCartesian(intersectionCartographic, intersectionScratch);
-                    if (when.defined(intersection) &&
-                        !Cartographic.Cartesian3.equalsEpsilon(intersection, p0, _Math.CesiumMath.EPSILON7) &&
-                        !Cartographic.Cartesian3.equalsEpsilon(intersection, p1, _Math.CesiumMath.EPSILON7)) {
-                        splitPositions.push(Cartographic.Cartesian3.clone(intersection));
-                    }
-                }
-            }
-            splitPositions.push(p1);
-        }
-
-        if (loop) {
-            p0 = positions[positionsLength - 1];
-            p1 = positions[0];
-            intersection = IntersectionTests.IntersectionTests.lineSegmentPlane(p0, p1, XZ_PLANE, intersectionScratch);
-            if (when.defined(intersection) &&
-                !Cartographic.Cartesian3.equalsEpsilon(intersection, p0, _Math.CesiumMath.EPSILON7) &&
-                !Cartographic.Cartesian3.equalsEpsilon(intersection, p1, _Math.CesiumMath.EPSILON7)) {
-                if (groundPolylineGeometry.arcType === ArcType.ArcType.GEODESIC) {
-                    splitPositions.push(Cartographic.Cartesian3.clone(intersection));
-                } else if (groundPolylineGeometry.arcType === ArcType.ArcType.RHUMB) {
-                    intersectionLongitude = ellipsoid.cartesianToCartographic(intersection, cartographicScratch0).longitude;
-                    c0 = ellipsoid.cartesianToCartographic(p0, cartographicScratch0);
-                    c1 = ellipsoid.cartesianToCartographic(p1, cartographicScratch1);
-                    rhumbLine.setEndPoints(c0, c1);
-                    intersectionCartographic = rhumbLine.findIntersectionWithLongitude(intersectionLongitude, cartographicIntersectionScratch);
-                    intersection = ellipsoid.cartographicToCartesian(intersectionCartographic, intersectionScratch);
-                    if (when.defined(intersection) &&
-                        !Cartographic.Cartesian3.equalsEpsilon(intersection, p0, _Math.CesiumMath.EPSILON7) &&
-                        !Cartographic.Cartesian3.equalsEpsilon(intersection, p1, _Math.CesiumMath.EPSILON7)) {
-                        splitPositions.push(Cartographic.Cartesian3.clone(intersection));
-                    }
-                }
-            }
-        }
-        var cartographicsLength = splitPositions.length;
-
-        var cartographics = new Array(cartographicsLength);
-        for (i = 0; i < cartographicsLength; i++) {
-            var cartographic = Cartographic.Cartographic.fromCartesian(splitPositions[i], ellipsoid);
-            cartographic.height = 0.0;
-            cartographics[i] = cartographic;
-        }
-
-        cartographics = arrayRemoveDuplicates.arrayRemoveDuplicates(cartographics, Cartographic.Cartographic.equalsEpsilon);
-        cartographicsLength = cartographics.length;
-
-        if (cartographicsLength < 2) {
-            return undefined;
-        }
-
-        /**** Build heap-side arrays for positions, interpolated cartographics, and normals from which to compute vertices ****/
-        // We build a "wall" and then decompose it into separately connected component "volumes" because we need a lot
-        // of information about the wall. Also, this simplifies interpolation.
-        // Convention: "next" and "end" are locally forward to each segment of the wall,
-        // and we are computing normals pointing towards the local right side of the vertices in each segment.
-        var cartographicsArray = [];
-        var normalsArray = [];
-        var bottomPositionsArray = [];
-        var topPositionsArray = [];
-
-        var previousBottom = previousBottomScratch;
-        var vertexBottom = vertexBottomScratch;
-        var vertexTop = vertexTopScratch;
-        var nextBottom = nextBottomScratch;
-        var vertexNormal = vertexNormalScratch;
-
-        // First point - either loop or attach a "perpendicular" normal
-        var startCartographic = cartographics[0];
-        var nextCartographic = cartographics[1];
-
-        var prestartCartographic = cartographics[cartographicsLength - 1];
-        previousBottom = getPosition(ellipsoid, prestartCartographic, minHeight, previousBottom);
-        nextBottom = getPosition(ellipsoid, nextCartographic, minHeight, nextBottom);
-        vertexBottom = getPosition(ellipsoid, startCartographic, minHeight, vertexBottom);
-        vertexTop = getPosition(ellipsoid, startCartographic, maxHeight, vertexTop);
-
-        if (loop) {
-            vertexNormal = computeVertexMiterNormal(previousBottom, vertexBottom, vertexTop, nextBottom, vertexNormal);
-        } else {
-            vertexNormal = computeRightNormal(startCartographic, nextCartographic, maxHeight, ellipsoid, vertexNormal);
-        }
-
-        Cartographic.Cartesian3.pack(vertexNormal, normalsArray, 0);
-        Cartographic.Cartesian3.pack(vertexBottom, bottomPositionsArray, 0);
-        Cartographic.Cartesian3.pack(vertexTop, topPositionsArray, 0);
-        cartographicsArray.push(startCartographic.latitude);
-        cartographicsArray.push(startCartographic.longitude);
-
-        interpolateSegment(startCartographic, nextCartographic, minHeight, maxHeight, granularity, arcType, ellipsoid, normalsArray, bottomPositionsArray, topPositionsArray, cartographicsArray);
-
-        // All inbetween points
-        for (i = 1; i < cartographicsLength - 1; ++i) {
-            previousBottom = Cartographic.Cartesian3.clone(vertexBottom, previousBottom);
-            vertexBottom = Cartographic.Cartesian3.clone(nextBottom, vertexBottom);
-            var vertexCartographic = cartographics[i];
-            getPosition(ellipsoid, vertexCartographic, maxHeight, vertexTop);
-            getPosition(ellipsoid, cartographics[i + 1], minHeight, nextBottom);
-
-            computeVertexMiterNormal(previousBottom, vertexBottom, vertexTop, nextBottom, vertexNormal);
-
-            index = normalsArray.length;
-            Cartographic.Cartesian3.pack(vertexNormal, normalsArray, index);
-            Cartographic.Cartesian3.pack(vertexBottom, bottomPositionsArray, index);
-            Cartographic.Cartesian3.pack(vertexTop, topPositionsArray, index);
-            cartographicsArray.push(vertexCartographic.latitude);
-            cartographicsArray.push(vertexCartographic.longitude);
-
-            interpolateSegment(cartographics[i], cartographics[i + 1], minHeight, maxHeight, granularity, arcType, ellipsoid, normalsArray, bottomPositionsArray, topPositionsArray, cartographicsArray);
-        }
-
-        // Last point - either loop or attach a normal "perpendicular" to the wall.
-        var endCartographic = cartographics[cartographicsLength - 1];
-        var preEndCartographic = cartographics[cartographicsLength - 2];
-
-        vertexBottom = getPosition(ellipsoid, endCartographic, minHeight, vertexBottom);
-        vertexTop = getPosition(ellipsoid, endCartographic, maxHeight, vertexTop);
-
-        if (loop) {
-            var postEndCartographic = cartographics[0];
-            previousBottom = getPosition(ellipsoid, preEndCartographic, minHeight, previousBottom);
-            nextBottom = getPosition(ellipsoid, postEndCartographic, minHeight, nextBottom);
-
-            vertexNormal = computeVertexMiterNormal(previousBottom, vertexBottom, vertexTop, nextBottom, vertexNormal);
-        } else {
-            vertexNormal = computeRightNormal(preEndCartographic, endCartographic, maxHeight, ellipsoid, vertexNormal);
-        }
-
-        index = normalsArray.length;
-        Cartographic.Cartesian3.pack(vertexNormal, normalsArray, index);
-        Cartographic.Cartesian3.pack(vertexBottom, bottomPositionsArray, index);
-        Cartographic.Cartesian3.pack(vertexTop, topPositionsArray, index);
-        cartographicsArray.push(endCartographic.latitude);
-        cartographicsArray.push(endCartographic.longitude);
-
-        if (loop) {
-            interpolateSegment(endCartographic, startCartographic, minHeight, maxHeight, granularity, arcType, ellipsoid, normalsArray, bottomPositionsArray, topPositionsArray, cartographicsArray);
-            index = normalsArray.length;
-            for (i = 0; i < 3; ++i) {
-                normalsArray[index + i] = normalsArray[i];
-                bottomPositionsArray[index + i] = bottomPositionsArray[i];
-                topPositionsArray[index + i] = topPositionsArray[i];
-            }
-            cartographicsArray.push(startCartographic.latitude);
-            cartographicsArray.push(startCartographic.longitude);
-        }
-
-        return generateGeometryAttributes(loop, projection, bottomPositionsArray, topPositionsArray, normalsArray, cartographicsArray, compute2dAttributes);
-    };
-
-    // If the end normal angle is too steep compared to the direction of the line segment,
-    // "break" the miter by rotating the normal 90 degrees around the "up" direction at the point
-    // For ultra precision we would want to project into a plane, but in practice this is sufficient.
-    var lineDirectionScratch = new Cartographic.Cartesian3();
-    var matrix3Scratch = new BoundingSphere.Matrix3();
-    var quaternionScratch = new Transforms.Quaternion();
-    function breakMiter(endGeometryNormal, startBottom, endBottom, endTop) {
-        var lineDirection = direction(endBottom, startBottom, lineDirectionScratch);
-
-        var dot = Cartographic.Cartesian3.dot(lineDirection, endGeometryNormal);
-        if (dot > MITER_BREAK_SMALL || dot < MITER_BREAK_LARGE) {
-            var vertexUp = direction(endTop, endBottom, vertexUpScratch);
-            var angle = dot < MITER_BREAK_LARGE ? _Math.CesiumMath.PI_OVER_TWO : -_Math.CesiumMath.PI_OVER_TWO;
-            var quaternion = Transforms.Quaternion.fromAxisAngle(vertexUp, angle, quaternionScratch);
-            var rotationMatrix = BoundingSphere.Matrix3.fromQuaternion(quaternion, matrix3Scratch);
-            BoundingSphere.Matrix3.multiplyByVector(rotationMatrix, endGeometryNormal, endGeometryNormal);
-            return true;
-        }
-        return false;
-    }
-
-    var endPosCartographicScratch = new Cartographic.Cartographic();
-    var normalStartpointScratch = new Cartographic.Cartesian3();
-    var normalEndpointScratch = new Cartographic.Cartesian3();
-    function projectNormal(projection, cartographic, normal, projectedPosition, result) {
-        var position = Cartographic.Cartographic.toCartesian(cartographic, projection._ellipsoid, normalStartpointScratch);
-        var normalEndpoint = Cartographic.Cartesian3.add(position, normal, normalEndpointScratch);
-        var flipNormal = false;
-
-        var ellipsoid = projection._ellipsoid;
-        var normalEndpointCartographic = ellipsoid.cartesianToCartographic(normalEndpoint, endPosCartographicScratch);
-        // If normal crosses the IDL, go the other way and flip the result.
-        // In practice this almost never happens because the cartographic start
-        // and end points of each segment are "nudged" to be on the same side
-        // of the IDL and slightly away from the IDL.
-        if (Math.abs(cartographic.longitude - normalEndpointCartographic.longitude) > _Math.CesiumMath.PI_OVER_TWO) {
-            flipNormal = true;
-            normalEndpoint = Cartographic.Cartesian3.subtract(position, normal, normalEndpointScratch);
-            normalEndpointCartographic = ellipsoid.cartesianToCartographic(normalEndpoint, endPosCartographicScratch);
-        }
-
-        normalEndpointCartographic.height = 0.0;
-        var normalEndpointProjected = projection.project(normalEndpointCartographic, result);
-        result = Cartographic.Cartesian3.subtract(normalEndpointProjected, projectedPosition, result);
-        result.z = 0.0;
-        result = Cartographic.Cartesian3.normalize(result, result);
-        if (flipNormal) {
-            Cartographic.Cartesian3.negate(result, result);
-        }
-        return result;
-    }
-
-    var adjustHeightNormalScratch = new Cartographic.Cartesian3();
-    var adjustHeightOffsetScratch = new Cartographic.Cartesian3();
-    function adjustHeights(bottom, top, minHeight, maxHeight, adjustHeightBottom, adjustHeightTop) {
-        // bottom and top should be at WALL_INITIAL_MIN_HEIGHT and WALL_INITIAL_MAX_HEIGHT, respectively
-        var adjustHeightNormal = Cartographic.Cartesian3.subtract(top, bottom, adjustHeightNormalScratch);
-        Cartographic.Cartesian3.normalize(adjustHeightNormal, adjustHeightNormal);
-
-        var distanceForBottom = minHeight - WALL_INITIAL_MIN_HEIGHT;
-        var adjustHeightOffset = Cartographic.Cartesian3.multiplyByScalar(adjustHeightNormal, distanceForBottom, adjustHeightOffsetScratch);
-        Cartographic.Cartesian3.add(bottom, adjustHeightOffset, adjustHeightBottom);
-
-        var distanceForTop = maxHeight - WALL_INITIAL_MAX_HEIGHT;
-        adjustHeightOffset = Cartographic.Cartesian3.multiplyByScalar(adjustHeightNormal, distanceForTop, adjustHeightOffsetScratch);
-        Cartographic.Cartesian3.add(top, adjustHeightOffset, adjustHeightTop);
-    }
-
-    var nudgeDirectionScratch = new Cartographic.Cartesian3();
-    function nudgeXZ(start, end) {
-        var startToXZdistance = Plane.Plane.getPointDistance(XZ_PLANE, start);
-        var endToXZdistance = Plane.Plane.getPointDistance(XZ_PLANE, end);
-        var offset = nudgeDirectionScratch;
-        // Larger epsilon than what's used in GeometryPipeline, a centimeter in world space
-        if (_Math.CesiumMath.equalsEpsilon(startToXZdistance, 0.0, _Math.CesiumMath.EPSILON2)) {
-            offset = direction(end, start, offset);
-            Cartographic.Cartesian3.multiplyByScalar(offset, _Math.CesiumMath.EPSILON2, offset);
-            Cartographic.Cartesian3.add(start, offset, start);
-        } else if (_Math.CesiumMath.equalsEpsilon(endToXZdistance, 0.0, _Math.CesiumMath.EPSILON2)) {
-            offset = direction(start, end, offset);
-            Cartographic.Cartesian3.multiplyByScalar(offset, _Math.CesiumMath.EPSILON2, offset);
-            Cartographic.Cartesian3.add(end, offset, end);
-        }
-    }
-
-    // "Nudge" cartographic coordinates so start and end are on the same side of the IDL.
-    // Nudge amounts are tiny, basically just an IDL flip.
-    // Only used for 2D/CV.
-    function nudgeCartographic(start, end) {
-        var absStartLon = Math.abs(start.longitude);
-        var absEndLon = Math.abs(end.longitude);
-        if (_Math.CesiumMath.equalsEpsilon(absStartLon, _Math.CesiumMath.PI, _Math.CesiumMath.EPSILON11)) {
-            var endSign = _Math.CesiumMath.sign(end.longitude);
-            start.longitude = endSign * (absStartLon - _Math.CesiumMath.EPSILON11);
-            return 1;
-        } else if (_Math.CesiumMath.equalsEpsilon(absEndLon, _Math.CesiumMath.PI, _Math.CesiumMath.EPSILON11)) {
-            var startSign = _Math.CesiumMath.sign(start.longitude);
-            end.longitude = startSign * (absEndLon - _Math.CesiumMath.EPSILON11);
-            return 2;
-        }
-        return 0;
-    }
-
-    var startCartographicScratch = new Cartographic.Cartographic();
-    var endCartographicScratch = new Cartographic.Cartographic();
-
-    var segmentStartTopScratch = new Cartographic.Cartesian3();
-    var segmentEndTopScratch = new Cartographic.Cartesian3();
-    var segmentStartBottomScratch = new Cartographic.Cartesian3();
-    var segmentEndBottomScratch = new Cartographic.Cartesian3();
-    var segmentStartNormalScratch = new Cartographic.Cartesian3();
-    var segmentEndNormalScratch = new Cartographic.Cartesian3();
-
-    var getHeightCartographics = [startCartographicScratch, endCartographicScratch];
-    var getHeightRectangleScratch = new Cartesian2.Rectangle();
-
-    var adjustHeightStartTopScratch = new Cartographic.Cartesian3();
-    var adjustHeightEndTopScratch = new Cartographic.Cartesian3();
-    var adjustHeightStartBottomScratch = new Cartographic.Cartesian3();
-    var adjustHeightEndBottomScratch = new Cartographic.Cartesian3();
-
-    var segmentStart2DScratch = new Cartographic.Cartesian3();
-    var segmentEnd2DScratch = new Cartographic.Cartesian3();
-    var segmentStartNormal2DScratch = new Cartographic.Cartesian3();
-    var segmentEndNormal2DScratch = new Cartographic.Cartesian3();
-
-    var offsetScratch = new Cartographic.Cartesian3();
-    var startUpScratch = new Cartographic.Cartesian3();
-    var endUpScratch = new Cartographic.Cartesian3();
-    var rightScratch = new Cartographic.Cartesian3();
-    var startPlaneNormalScratch = new Cartographic.Cartesian3();
-    var endPlaneNormalScratch = new Cartographic.Cartesian3();
-    var encodeScratch = new EncodedCartesian3.EncodedCartesian3();
-
-    var encodeScratch2D = new EncodedCartesian3.EncodedCartesian3();
-    var forwardOffset2DScratch = new Cartographic.Cartesian3();
-    var right2DScratch = new Cartographic.Cartesian3();
-
-    var normalNudgeScratch = new Cartographic.Cartesian3();
-
-    var scratchBoundingSpheres = [new BoundingSphere.BoundingSphere(), new BoundingSphere.BoundingSphere()];
-
-    // Winding order is reversed so each segment's volume is inside-out
-    var REFERENCE_INDICES = [
-        0, 2, 1, 0, 3, 2, // right
-        0, 7, 3, 0, 4, 7, // start
-        0, 5, 4, 0, 1, 5, // bottom
-        5, 7, 4, 5, 6, 7, // left
-        5, 2, 6, 5, 1, 2, // end
-        3, 6, 2, 3, 7, 6 // top
-    ];
-    var REFERENCE_INDICES_LENGTH = REFERENCE_INDICES.length;
-
-    // Decompose the "wall" into a series of shadow volumes.
-    // Each shadow volume's vertices encode a description of the line it contains,
-    // including mitering planes at the end points, a plane along the line itself,
-    // and attributes for computing length-wise texture coordinates.
-    function generateGeometryAttributes(loop, projection, bottomPositionsArray, topPositionsArray, normalsArray, cartographicsArray, compute2dAttributes) {
-        var i;
-        var index;
-        var ellipsoid = projection._ellipsoid;
-
-        // Each segment will have 8 vertices
-        var segmentCount = (bottomPositionsArray.length / 3) - 1;
-        var vertexCount = segmentCount * 8;
-        var arraySizeVec4 = vertexCount * 4;
-        var indexCount = segmentCount * 36;
-
-        var indices = vertexCount > 65535 ? new Uint32Array(indexCount) : new Uint16Array(indexCount);
-        var positionsArray = new Float64Array(vertexCount * 3);
-
-        var startHiAndForwardOffsetX = new Float32Array(arraySizeVec4);
-        var startLoAndForwardOffsetY = new Float32Array(arraySizeVec4);
-        var startNormalAndForwardOffsetZ = new Float32Array(arraySizeVec4);
-        var endNormalAndTextureCoordinateNormalizationX = new Float32Array(arraySizeVec4);
-        var rightNormalAndTextureCoordinateNormalizationY = new Float32Array(arraySizeVec4);
-
-        var startHiLo2D;
-        var offsetAndRight2D;
-        var startEndNormals2D;
-        var texcoordNormalization2D;
-
-        if (compute2dAttributes) {
-            startHiLo2D = new Float32Array(arraySizeVec4);
-            offsetAndRight2D = new Float32Array(arraySizeVec4);
-            startEndNormals2D = new Float32Array(arraySizeVec4);
-            texcoordNormalization2D = new Float32Array(vertexCount * 2);
-        }
-
-        /*** Compute total lengths for texture coordinate normalization ***/
-        // 2D
-        var cartographicsLength = cartographicsArray.length / 2;
-        var length2D = 0.0;
-
-        var startCartographic = startCartographicScratch;
-        startCartographic.height = 0.0;
-        var endCartographic = endCartographicScratch;
-        endCartographic.height = 0.0;
-
-        var segmentStartCartesian = segmentStartTopScratch;
-        var segmentEndCartesian = segmentEndTopScratch;
-
-        if (compute2dAttributes) {
-            index = 0;
-            for (i = 1; i < cartographicsLength; i++) {
-                // Don't clone anything from previous segment b/c possible IDL touch
-                startCartographic.latitude = cartographicsArray[index];
-                startCartographic.longitude = cartographicsArray[index + 1];
-                endCartographic.latitude = cartographicsArray[index + 2];
-                endCartographic.longitude = cartographicsArray[index + 3];
-
-                segmentStartCartesian = projection.project(startCartographic, segmentStartCartesian);
-                segmentEndCartesian = projection.project(endCartographic, segmentEndCartesian);
-                length2D += Cartographic.Cartesian3.distance(segmentStartCartesian, segmentEndCartesian);
-                index += 2;
-            }
-        }
-
-        // 3D
-        var positionsLength = topPositionsArray.length / 3;
-        segmentEndCartesian = Cartographic.Cartesian3.unpack(topPositionsArray, 0, segmentEndCartesian);
-        var length3D = 0.0;
-
-        index = 3;
-        for (i = 1; i < positionsLength; i++) {
-            segmentStartCartesian = Cartographic.Cartesian3.clone(segmentEndCartesian, segmentStartCartesian);
-            segmentEndCartesian = Cartographic.Cartesian3.unpack(topPositionsArray, index, segmentEndCartesian);
-            length3D += Cartographic.Cartesian3.distance(segmentStartCartesian, segmentEndCartesian);
-            index += 3;
-        }
-
-        /*** Generate segments ***/
-        var j;
-        index = 3;
-        var cartographicsIndex = 0;
-        var vec2sWriteIndex = 0;
-        var vec3sWriteIndex = 0;
-        var vec4sWriteIndex = 0;
-        var miterBroken = false;
-
-        var endBottom = Cartographic.Cartesian3.unpack(bottomPositionsArray, 0, segmentEndBottomScratch);
-        var endTop = Cartographic.Cartesian3.unpack(topPositionsArray, 0, segmentEndTopScratch);
-        var endGeometryNormal = Cartographic.Cartesian3.unpack(normalsArray, 0, segmentEndNormalScratch);
-
-        if (loop) {
-            var preEndBottom = Cartographic.Cartesian3.unpack(bottomPositionsArray, bottomPositionsArray.length - 6, segmentStartBottomScratch);
-            if (breakMiter(endGeometryNormal, preEndBottom, endBottom, endTop)) {
-                // Miter broken as if for the last point in the loop, needs to be inverted for first point (clone of endBottom)
-                endGeometryNormal = Cartographic.Cartesian3.negate(endGeometryNormal, endGeometryNormal);
-            }
-        }
-
-        var lengthSoFar3D = 0.0;
-        var lengthSoFar2D = 0.0;
-
-        // For translating bounding volume
-        var sumHeights = 0.0;
-
-        for (i = 0; i < segmentCount; i++) {
-            var startBottom = Cartographic.Cartesian3.clone(endBottom, segmentStartBottomScratch);
-            var startTop = Cartographic.Cartesian3.clone(endTop, segmentStartTopScratch);
-            var startGeometryNormal = Cartographic.Cartesian3.clone(endGeometryNormal, segmentStartNormalScratch);
-
-            if (miterBroken) {
-                startGeometryNormal = Cartographic.Cartesian3.negate(startGeometryNormal, startGeometryNormal);
-            }
-
-            endBottom = Cartographic.Cartesian3.unpack(bottomPositionsArray, index, segmentEndBottomScratch);
-            endTop = Cartographic.Cartesian3.unpack(topPositionsArray, index, segmentEndTopScratch);
-            endGeometryNormal = Cartographic.Cartesian3.unpack(normalsArray, index, segmentEndNormalScratch);
-
-            miterBroken = breakMiter(endGeometryNormal, startBottom, endBottom, endTop);
-
-            // 2D - don't clone anything from previous segment b/c possible IDL touch
-            startCartographic.latitude = cartographicsArray[cartographicsIndex];
-            startCartographic.longitude = cartographicsArray[cartographicsIndex + 1];
-            endCartographic.latitude = cartographicsArray[cartographicsIndex + 2];
-            endCartographic.longitude = cartographicsArray[cartographicsIndex + 3];
-            var start2D;
-            var end2D;
-            var startGeometryNormal2D;
-            var endGeometryNormal2D;
-
-            if (compute2dAttributes) {
-                var nudgeResult = nudgeCartographic(startCartographic, endCartographic);
-                start2D = projection.project(startCartographic, segmentStart2DScratch);
-                end2D = projection.project(endCartographic, segmentEnd2DScratch);
-                var direction2D = direction(end2D, start2D, forwardOffset2DScratch);
-                direction2D.y = Math.abs(direction2D.y);
-
-                startGeometryNormal2D = segmentStartNormal2DScratch;
-                endGeometryNormal2D = segmentEndNormal2DScratch;
-                if (nudgeResult === 0 || Cartographic.Cartesian3.dot(direction2D, Cartographic.Cartesian3.UNIT_Y) > MITER_BREAK_SMALL) {
-                    // No nudge - project the original normal
-                    // Or, if the line's angle relative to the IDL is very acute,
-                    // in which case snapping will produce oddly shaped volumes.
-                    startGeometryNormal2D = projectNormal(projection, startCartographic, startGeometryNormal, start2D, segmentStartNormal2DScratch);
-                    endGeometryNormal2D = projectNormal(projection, endCartographic, endGeometryNormal, end2D, segmentEndNormal2DScratch);
-                } else if (nudgeResult === 1) {
-                    // Start is close to IDL - snap start normal to align with IDL
-                    endGeometryNormal2D = projectNormal(projection, endCartographic, endGeometryNormal, end2D, segmentEndNormal2DScratch);
-                    startGeometryNormal2D.x = 0.0;
-                    // If start longitude is negative and end longitude is less negative, relative right is unit -Y
-                    // If start longitude is positive and end longitude is less positive, relative right is unit +Y
-                    startGeometryNormal2D.y = _Math.CesiumMath.sign(startCartographic.longitude - Math.abs(endCartographic.longitude));
-                    startGeometryNormal2D.z = 0.0;
-                } else {
-                    // End is close to IDL - snap end normal to align with IDL
-                    startGeometryNormal2D = projectNormal(projection, startCartographic, startGeometryNormal, start2D, segmentStartNormal2DScratch);
-                    endGeometryNormal2D.x = 0.0;
-                    // If end longitude is negative and start longitude is less negative, relative right is unit Y
-                    // If end longitude is positive and start longitude is less positive, relative right is unit -Y
-                    endGeometryNormal2D.y = _Math.CesiumMath.sign(startCartographic.longitude - endCartographic.longitude);
-                    endGeometryNormal2D.z = 0.0;
-                }
-            }
-
-            /****************************************
-             * Geometry descriptors of a "line on terrain,"
-             * as opposed to the "shadow volume used to draw
-             * the line on terrain":
-             * - position of start + offset to end
-             * - start, end, and right-facing planes
-             * - encoded texture coordinate offsets
-             ****************************************/
-
-             /** 3D **/
-            var segmentLength3D = Cartographic.Cartesian3.distance(startTop, endTop);
-
-            var encodedStart = EncodedCartesian3.EncodedCartesian3.fromCartesian(startBottom, encodeScratch);
-            var forwardOffset = Cartographic.Cartesian3.subtract(endBottom, startBottom, offsetScratch);
-            var forward = Cartographic.Cartesian3.normalize(forwardOffset, rightScratch);
-
-            var startUp = Cartographic.Cartesian3.subtract(startTop, startBottom, startUpScratch);
-            startUp = Cartographic.Cartesian3.normalize(startUp, startUp);
-            var rightNormal = Cartographic.Cartesian3.cross(forward, startUp, rightScratch);
-            rightNormal = Cartographic.Cartesian3.normalize(rightNormal, rightNormal);
-
-            var startPlaneNormal = Cartographic.Cartesian3.cross(startUp, startGeometryNormal, startPlaneNormalScratch);
-            startPlaneNormal = Cartographic.Cartesian3.normalize(startPlaneNormal, startPlaneNormal);
-
-            var endUp = Cartographic.Cartesian3.subtract(endTop, endBottom, endUpScratch);
-            endUp = Cartographic.Cartesian3.normalize(endUp, endUp);
-            var endPlaneNormal = Cartographic.Cartesian3.cross(endGeometryNormal, endUp, endPlaneNormalScratch);
-            endPlaneNormal = Cartographic.Cartesian3.normalize(endPlaneNormal, endPlaneNormal);
-
-            var texcoordNormalization3DX = segmentLength3D / length3D;
-            var texcoordNormalization3DY = lengthSoFar3D / length3D;
-
-            /** 2D **/
-            var segmentLength2D = 0.0;
-            var encodedStart2D;
-            var forwardOffset2D;
-            var right2D;
-            var texcoordNormalization2DX = 0.0;
-            var texcoordNormalization2DY = 0.0;
-            if (compute2dAttributes) {
-                segmentLength2D = Cartographic.Cartesian3.distance(start2D, end2D);
-
-                encodedStart2D = EncodedCartesian3.EncodedCartesian3.fromCartesian(start2D, encodeScratch2D);
-                forwardOffset2D = Cartographic.Cartesian3.subtract(end2D, start2D, forwardOffset2DScratch);
-
-                // Right direction is just forward direction rotated by -90 degrees around Z
-                // Similarly with plane normals
-                right2D = Cartographic.Cartesian3.normalize(forwardOffset2D, right2DScratch);
-                var swap = right2D.x;
-                right2D.x = right2D.y;
-                right2D.y = -swap;
-
-                texcoordNormalization2DX = segmentLength2D / length2D;
-                texcoordNormalization2DY = lengthSoFar2D / length2D;
-            }
-            /** Pack **/
-            for (j = 0; j < 8; j++) {
-                var vec4Index = vec4sWriteIndex + j * 4;
-                var vec2Index = vec2sWriteIndex + j * 2;
-                var wIndex = vec4Index + 3;
-
-                // Encode sidedness of vertex relative to right plane in texture coordinate normalization X,
-                // whether vertex is top or bottom of volume in sign/magnitude of normalization Y.
-                var rightPlaneSide = j < 4 ? 1.0 : -1.0;
-                var topBottomSide = (j === 2 || j === 3 || j === 6 || j === 7) ? 1.0 : -1.0;
-
-                // 3D
-                Cartographic.Cartesian3.pack(encodedStart.high, startHiAndForwardOffsetX, vec4Index);
-                startHiAndForwardOffsetX[wIndex] = forwardOffset.x;
-
-                Cartographic.Cartesian3.pack(encodedStart.low, startLoAndForwardOffsetY, vec4Index);
-                startLoAndForwardOffsetY[wIndex] = forwardOffset.y;
-
-                Cartographic.Cartesian3.pack(startPlaneNormal, startNormalAndForwardOffsetZ, vec4Index);
-                startNormalAndForwardOffsetZ[wIndex] = forwardOffset.z;
-
-                Cartographic.Cartesian3.pack(endPlaneNormal, endNormalAndTextureCoordinateNormalizationX, vec4Index);
-                endNormalAndTextureCoordinateNormalizationX[wIndex] = texcoordNormalization3DX * rightPlaneSide;
-
-                Cartographic.Cartesian3.pack(rightNormal, rightNormalAndTextureCoordinateNormalizationY, vec4Index);
-
-                var texcoordNormalization = texcoordNormalization3DY * topBottomSide;
-                if (texcoordNormalization === 0.0 && topBottomSide < 0.0) {
-                    texcoordNormalization = Number.POSITIVE_INFINITY;
-                }
-                rightNormalAndTextureCoordinateNormalizationY[wIndex] = texcoordNormalization;
-
-                // 2D
-                if (compute2dAttributes) {
-                    startHiLo2D[vec4Index] = encodedStart2D.high.x;
-                    startHiLo2D[vec4Index + 1] = encodedStart2D.high.y;
-                    startHiLo2D[vec4Index + 2] = encodedStart2D.low.x;
-                    startHiLo2D[vec4Index + 3] = encodedStart2D.low.y;
-
-                    startEndNormals2D[vec4Index] = -startGeometryNormal2D.y;
-                    startEndNormals2D[vec4Index + 1] = startGeometryNormal2D.x;
-                    startEndNormals2D[vec4Index + 2] = endGeometryNormal2D.y;
-                    startEndNormals2D[vec4Index + 3] = -endGeometryNormal2D.x;
-
-                    offsetAndRight2D[vec4Index] = forwardOffset2D.x;
-                    offsetAndRight2D[vec4Index + 1] = forwardOffset2D.y;
-                    offsetAndRight2D[vec4Index + 2] = right2D.x;
-                    offsetAndRight2D[vec4Index + 3] = right2D.y;
-
-                    texcoordNormalization2D[vec2Index] = texcoordNormalization2DX * rightPlaneSide;
-
-                    texcoordNormalization = texcoordNormalization2DY * topBottomSide;
-                    if (texcoordNormalization === 0.0 && topBottomSide < 0.0) {
-                        texcoordNormalization = Number.POSITIVE_INFINITY;
-                    }
-                    texcoordNormalization2D[vec2Index + 1] = texcoordNormalization;
-                }
-            }
-
-            // Adjust height of volume in 3D
-            var adjustHeightStartBottom = adjustHeightStartBottomScratch;
-            var adjustHeightEndBottom = adjustHeightEndBottomScratch;
-            var adjustHeightStartTop = adjustHeightStartTopScratch;
-            var adjustHeightEndTop = adjustHeightEndTopScratch;
-
-            var getHeightsRectangle = Cartesian2.Rectangle.fromCartographicArray(getHeightCartographics, getHeightRectangleScratch);
-            var minMaxHeights = ApproximateTerrainHeights.getMinimumMaximumHeights(getHeightsRectangle, ellipsoid);
-            var minHeight = minMaxHeights.minimumTerrainHeight;
-            var maxHeight = minMaxHeights.maximumTerrainHeight;
-
-            sumHeights += minHeight;
-            sumHeights += maxHeight;
-
-            adjustHeights(startBottom, startTop, minHeight, maxHeight, adjustHeightStartBottom, adjustHeightStartTop);
-            adjustHeights(endBottom, endTop, minHeight, maxHeight, adjustHeightEndBottom, adjustHeightEndTop);
-
-            // Nudge the positions away from the "polyline" a little bit to prevent errors in GeometryPipeline
-            var normalNudge = Cartographic.Cartesian3.multiplyByScalar(rightNormal, _Math.CesiumMath.EPSILON5, normalNudgeScratch);
-            Cartographic.Cartesian3.add(adjustHeightStartBottom, normalNudge, adjustHeightStartBottom);
-            Cartographic.Cartesian3.add(adjustHeightEndBottom, normalNudge, adjustHeightEndBottom);
-            Cartographic.Cartesian3.add(adjustHeightStartTop, normalNudge, adjustHeightStartTop);
-            Cartographic.Cartesian3.add(adjustHeightEndTop, normalNudge, adjustHeightEndTop);
-
-            // If the segment is very close to the XZ plane, nudge the vertices slightly to avoid touching it.
-            nudgeXZ(adjustHeightStartBottom, adjustHeightEndBottom);
-            nudgeXZ(adjustHeightStartTop, adjustHeightEndTop);
-
-            Cartographic.Cartesian3.pack(adjustHeightStartBottom, positionsArray, vec3sWriteIndex);
-            Cartographic.Cartesian3.pack(adjustHeightEndBottom, positionsArray, vec3sWriteIndex + 3);
-            Cartographic.Cartesian3.pack(adjustHeightEndTop, positionsArray, vec3sWriteIndex + 6);
-            Cartographic.Cartesian3.pack(adjustHeightStartTop, positionsArray, vec3sWriteIndex + 9);
-
-            normalNudge = Cartographic.Cartesian3.multiplyByScalar(rightNormal, -2.0 * _Math.CesiumMath.EPSILON5, normalNudgeScratch);
-            Cartographic.Cartesian3.add(adjustHeightStartBottom, normalNudge, adjustHeightStartBottom);
-            Cartographic.Cartesian3.add(adjustHeightEndBottom, normalNudge, adjustHeightEndBottom);
-            Cartographic.Cartesian3.add(adjustHeightStartTop, normalNudge, adjustHeightStartTop);
-            Cartographic.Cartesian3.add(adjustHeightEndTop, normalNudge, adjustHeightEndTop);
-
-            nudgeXZ(adjustHeightStartBottom, adjustHeightEndBottom);
-            nudgeXZ(adjustHeightStartTop, adjustHeightEndTop);
-
-            Cartographic.Cartesian3.pack(adjustHeightStartBottom, positionsArray, vec3sWriteIndex + 12);
-            Cartographic.Cartesian3.pack(adjustHeightEndBottom, positionsArray, vec3sWriteIndex + 15);
-            Cartographic.Cartesian3.pack(adjustHeightEndTop, positionsArray, vec3sWriteIndex + 18);
-            Cartographic.Cartesian3.pack(adjustHeightStartTop, positionsArray, vec3sWriteIndex + 21);
-
-            cartographicsIndex += 2;
-            index += 3;
-
-            vec2sWriteIndex += 16;
-            vec3sWriteIndex += 24;
-            vec4sWriteIndex += 32;
-
-            lengthSoFar3D += segmentLength3D;
-            lengthSoFar2D += segmentLength2D;
-        }
-
-        index = 0;
-        var indexOffset = 0;
-        for (i = 0; i < segmentCount; i++) {
-            for (j = 0; j < REFERENCE_INDICES_LENGTH; j++) {
-                indices[index + j] = REFERENCE_INDICES[j] + indexOffset;
-            }
-            indexOffset += 8;
-            index += REFERENCE_INDICES_LENGTH;
-        }
-
-        var boundingSpheres = scratchBoundingSpheres;
-        BoundingSphere.BoundingSphere.fromVertices(bottomPositionsArray, Cartographic.Cartesian3.ZERO, 3, boundingSpheres[0]);
-        BoundingSphere.BoundingSphere.fromVertices(topPositionsArray, Cartographic.Cartesian3.ZERO, 3, boundingSpheres[1]);
-        var boundingSphere = BoundingSphere.BoundingSphere.fromBoundingSpheres(boundingSpheres);
-
-        // Adjust bounding sphere height and radius to cover more of the volume
-        boundingSphere.radius += sumHeights / (segmentCount * 2.0);
-
-        var attributes = {
-            position : new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                normalize : false,
-                values : positionsArray
-            }),
-            startHiAndForwardOffsetX : getVec4GeometryAttribute(startHiAndForwardOffsetX),
-            startLoAndForwardOffsetY : getVec4GeometryAttribute(startLoAndForwardOffsetY),
-            startNormalAndForwardOffsetZ : getVec4GeometryAttribute(startNormalAndForwardOffsetZ),
-            endNormalAndTextureCoordinateNormalizationX : getVec4GeometryAttribute(endNormalAndTextureCoordinateNormalizationX),
-            rightNormalAndTextureCoordinateNormalizationY : getVec4GeometryAttribute(rightNormalAndTextureCoordinateNormalizationY)
-        };
-
-        if (compute2dAttributes) {
-            attributes.startHiLo2D = getVec4GeometryAttribute(startHiLo2D);
-            attributes.offsetAndRight2D = getVec4GeometryAttribute(offsetAndRight2D);
-            attributes.startEndNormals2D = getVec4GeometryAttribute(startEndNormals2D);
-            attributes.texcoordNormalization2D = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                componentsPerAttribute : 2,
-                normalize : false,
-                values : texcoordNormalization2D
-            });
-        }
-
-        return new GeometryAttribute.Geometry({
-            attributes : attributes,
-            indices : indices,
-            boundingSphere : boundingSphere
-        });
-    }
-
-    function getVec4GeometryAttribute(typedArray) {
-        return new GeometryAttribute.GeometryAttribute({
-            componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-            componentsPerAttribute : 4,
-            normalize : false,
-            values : typedArray
-        });
-    }
-
-    /**
-     * Approximates an ellipsoid-tangent vector in 2D by projecting the end point into 2D.
-     * Exposed for testing.
-     *
-     * @param {MapProjection} projection Map Projection for projecting coordinates to 2D.
-     * @param {Cartographic} cartographic The cartographic origin point of the normal.
-     *   Used to check if the normal crosses the IDL during projection.
-     * @param {Cartesian3} normal The normal in 3D.
-     * @param {Cartesian3} projectedPosition The projected origin point of the normal in 2D.
-     * @param {Cartesian3} result Result parameter on which to store the projected normal.
-     * @private
-     */
-    GroundPolylineGeometry._projectNormal = projectNormal;
-
-    function createGroundPolylineGeometry(groundPolylineGeometry, offset) {
-        return ApproximateTerrainHeights.initialize()
-            .then(function() {
-                if (when.defined(offset)) {
-                    groundPolylineGeometry = GroundPolylineGeometry.unpack(groundPolylineGeometry, offset);
-                }
-                return GroundPolylineGeometry.createGeometry(groundPolylineGeometry);
-            });
-    }
-
-    return createGroundPolylineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createPlaneGeometry.js b/public/libs/Cesium/Workers/createPlaneGeometry.js
deleted file mode 100644
index 7a15bb2..0000000
--- a/public/libs/Cesium/Workers/createPlaneGeometry.js
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './VertexFormat-fe4db402'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, VertexFormat) { 'use strict';
-
-    /**
-         * Describes geometry representing a plane centered at the origin, with a unit width and length.
-         *
-         * @alias PlaneGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         *
-         * @example
-         * var planeGeometry = new Cesium.PlaneGeometry({
-         *   vertexFormat : Cesium.VertexFormat.POSITION_ONLY
-         * });
-         */
-        function PlaneGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var vertexFormat = when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT);
-
-            this._vertexFormat = vertexFormat;
-            this._workerName = 'createPlaneGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        PlaneGeometry.packedLength = VertexFormat.VertexFormat.packedLength;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {PlaneGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        PlaneGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-
-            return array;
-        };
-
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            vertexFormat: scratchVertexFormat
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {PlaneGeometry} [result] The object into which to store the result.
-         * @returns {PlaneGeometry} The modified result parameter or a new PlaneGeometry instance if one was not provided.
-         */
-        PlaneGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-
-            if (!when.defined(result)) {
-                return new PlaneGeometry(scratchOptions);
-            }
-
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-
-            return result;
-        };
-
-        var min = new Cartographic.Cartesian3(-0.5, -0.5, 0.0);
-        var max = new Cartographic.Cartesian3( 0.5,  0.5, 0.0);
-
-        /**
-         * Computes the geometric representation of a plane, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {PlaneGeometry} planeGeometry A description of the plane.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        PlaneGeometry.createGeometry = function(planeGeometry) {
-            var vertexFormat = planeGeometry._vertexFormat;
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            var indices;
-            var positions;
-
-            if (vertexFormat.position) {
-                // 4 corner points.  Duplicated 3 times each for each incident edge/face.
-                positions = new Float64Array(4 * 3);
-
-                // +z face
-                positions[0]  = min.x;
-                positions[1]  = min.y;
-                positions[2]  = 0.0;
-                positions[3]  = max.x;
-                positions[4]  = min.y;
-                positions[5]  = 0.0;
-                positions[6]  = max.x;
-                positions[7]  = max.y;
-                positions[8]  = 0.0;
-                positions[9]  = min.x;
-                positions[10] = max.y;
-                positions[11] = 0.0;
-
-                attributes.position = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : positions
-                });
-
-                if (vertexFormat.normal) {
-                    var normals = new Float32Array(4 * 3);
-
-                    // +z face
-                    normals[0]  = 0.0;
-                    normals[1]  = 0.0;
-                    normals[2]  = 1.0;
-                    normals[3]  = 0.0;
-                    normals[4]  = 0.0;
-                    normals[5]  = 1.0;
-                    normals[6]  = 0.0;
-                    normals[7]  = 0.0;
-                    normals[8]  = 1.0;
-                    normals[9]  = 0.0;
-                    normals[10] = 0.0;
-                    normals[11] = 1.0;
-
-                    attributes.normal = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : normals
-                    });
-                }
-
-                if (vertexFormat.st) {
-                    var texCoords = new Float32Array(4 * 2);
-
-                    // +z face
-                    texCoords[0]  = 0.0;
-                    texCoords[1]  = 0.0;
-                    texCoords[2]  = 1.0;
-                    texCoords[3]  = 0.0;
-                    texCoords[4]  = 1.0;
-                    texCoords[5]  = 1.0;
-                    texCoords[6]  = 0.0;
-                    texCoords[7]  = 1.0;
-
-                    attributes.st = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 2,
-                        values : texCoords
-                    });
-                }
-
-                if (vertexFormat.tangent) {
-                    var tangents = new Float32Array(4 * 3);
-
-                    // +z face
-                    tangents[0]  = 1.0;
-                    tangents[1]  = 0.0;
-                    tangents[2]  = 0.0;
-                    tangents[3]  = 1.0;
-                    tangents[4]  = 0.0;
-                    tangents[5]  = 0.0;
-                    tangents[6]  = 1.0;
-                    tangents[7]  = 0.0;
-                    tangents[8]  = 0.0;
-                    tangents[9]  = 1.0;
-                    tangents[10] = 0.0;
-                    tangents[11] = 0.0;
-
-                    attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : tangents
-                    });
-                }
-
-                if (vertexFormat.bitangent) {
-                    var bitangents = new Float32Array(4 * 3);
-
-                    // +z face
-                    bitangents[0] = 0.0;
-                    bitangents[1] = 1.0;
-                    bitangents[2] = 0.0;
-                    bitangents[3] = 0.0;
-                    bitangents[4] = 1.0;
-                    bitangents[5] = 0.0;
-                    bitangents[6] = 0.0;
-                    bitangents[7] = 1.0;
-                    bitangents[8] = 0.0;
-                    bitangents[9] = 0.0;
-                    bitangents[10] = 1.0;
-                    bitangents[11] = 0.0;
-
-                    attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : bitangents
-                    });
-                }
-
-                // 2 triangles
-                indices = new Uint16Array(2 * 3);
-
-                // +z face
-                indices[0] = 0;
-                indices[1] = 1;
-                indices[2] = 2;
-                indices[3] = 0;
-                indices[4] = 2;
-                indices[5] = 3;
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES,
-                boundingSphere : new BoundingSphere.BoundingSphere(Cartographic.Cartesian3.ZERO, Math.sqrt(2.0))
-            });
-        };
-
-    function createPlaneGeometry(planeGeometry, offset) {
-        if (when.defined(offset)) {
-            planeGeometry = PlaneGeometry.unpack(planeGeometry, offset);
-        }
-        return PlaneGeometry.createGeometry(planeGeometry);
-    }
-
-    return createPlaneGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createPlaneOutlineGeometry.js b/public/libs/Cesium/Workers/createPlaneOutlineGeometry.js
deleted file mode 100644
index 5ca9dc7..0000000
--- a/public/libs/Cesium/Workers/createPlaneOutlineGeometry.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes) { 'use strict';
-
-    /**
-         * Describes geometry representing the outline of a plane centered at the origin, with a unit width and length.
-         *
-         * @alias PlaneOutlineGeometry
-         * @constructor
-         *
-         */
-        function PlaneOutlineGeometry() {
-            this._workerName = 'createPlaneOutlineGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        PlaneOutlineGeometry.packedLength = 0;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {PlaneOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        PlaneOutlineGeometry.pack = function(value, array) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {PlaneOutlineGeometry} [result] The object into which to store the result.
-         * @returns {PlaneOutlineGeometry} The modified result parameter or a new PlaneOutlineGeometry instance if one was not provided.
-         */
-        PlaneOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                return new PlaneOutlineGeometry();
-            }
-
-            return result;
-        };
-
-        var min = new Cartographic.Cartesian3(-0.5, -0.5, 0.0);
-        var max = new Cartographic.Cartesian3( 0.5,  0.5, 0.0);
-
-        /**
-         * Computes the geometric representation of an outline of a plane, including its vertices, indices, and a bounding sphere.
-         *
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        PlaneOutlineGeometry.createGeometry = function() {
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            var indices = new Uint16Array(4 * 2);
-            var positions = new Float64Array(4 * 3);
-
-            positions[0] = min.x;
-            positions[1] = min.y;
-            positions[2] = min.z;
-            positions[3] = max.x;
-            positions[4] = min.y;
-            positions[5] = min.z;
-            positions[6] = max.x;
-            positions[7] = max.y;
-            positions[8] = min.z;
-            positions[9] = min.x;
-            positions[10] = max.y;
-            positions[11] = min.z;
-
-            attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : positions
-            });
-
-            indices[0] = 0;
-            indices[1] = 1;
-            indices[2] = 1;
-            indices[3] = 2;
-            indices[4] = 2;
-            indices[5] = 3;
-            indices[6] = 3;
-            indices[7] = 0;
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : new BoundingSphere.BoundingSphere(Cartographic.Cartesian3.ZERO, Math.sqrt(2.0))
-            });
-        };
-
-    function createPlaneOutlineGeometry(planeGeometry, offset) {
-        if (when.defined(offset)) {
-            planeGeometry = PlaneOutlineGeometry.unpack(planeGeometry, offset);
-        }
-        return PlaneOutlineGeometry.createGeometry(planeGeometry);
-    }
-
-    return createPlaneOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createPolygonGeometry.js b/public/libs/Cesium/Workers/createPolygonGeometry.js
deleted file mode 100644
index 0aecd99..0000000
--- a/public/libs/Cesium/Workers/createPolygonGeometry.js
+++ /dev/null
@@ -1,1079 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './GeometryInstance-93a01b5d', './arrayRemoveDuplicates-f0b089b1', './BoundingRectangle-dc808c42', './EllipsoidTangentPlane-e324bfa4', './ArcType-66bc286a', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './PolygonGeometryLibrary-9cc18cc2', './EllipsoidGeodesic-84507801'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, arrayFill, GeometryOffsetAttribute, VertexFormat, GeometryInstance, arrayRemoveDuplicates, BoundingRectangle, EllipsoidTangentPlane, ArcType, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, PolygonGeometryLibrary, EllipsoidGeodesic) { 'use strict';
-
-    var scratchCarto1 = new Cartographic.Cartographic();
-        var scratchCarto2 = new Cartographic.Cartographic();
-        function adjustPosHeightsForNormal(position, p1, p2, ellipsoid) {
-            var carto1 = ellipsoid.cartesianToCartographic(position, scratchCarto1);
-            var height = carto1.height;
-            var p1Carto = ellipsoid.cartesianToCartographic(p1, scratchCarto2);
-            p1Carto.height = height;
-            ellipsoid.cartographicToCartesian(p1Carto, p1);
-
-            var p2Carto = ellipsoid.cartesianToCartographic(p2, scratchCarto2);
-            p2Carto.height = height - 100;
-            ellipsoid.cartographicToCartesian(p2Carto, p2);
-        }
-
-        var scratchBoundingRectangle = new BoundingRectangle.BoundingRectangle();
-        var scratchPosition = new Cartographic.Cartesian3();
-        var scratchNormal = new Cartographic.Cartesian3();
-        var scratchTangent = new Cartographic.Cartesian3();
-        var scratchBitangent = new Cartographic.Cartesian3();
-        var p1Scratch = new Cartographic.Cartesian3();
-        var p2Scratch = new Cartographic.Cartesian3();
-        var scratchPerPosNormal = new Cartographic.Cartesian3();
-        var scratchPerPosTangent = new Cartographic.Cartesian3();
-        var scratchPerPosBitangent = new Cartographic.Cartesian3();
-
-        var appendTextureCoordinatesOrigin = new Cartesian2.Cartesian2();
-        var appendTextureCoordinatesCartesian2 = new Cartesian2.Cartesian2();
-        var appendTextureCoordinatesCartesian3 = new Cartographic.Cartesian3();
-        var appendTextureCoordinatesQuaternion = new Transforms.Quaternion();
-        var appendTextureCoordinatesMatrix3 = new BoundingSphere.Matrix3();
-        var tangentMatrixScratch = new BoundingSphere.Matrix3();
-
-        function computeAttributes(options) {
-            var vertexFormat = options.vertexFormat;
-            var geometry = options.geometry;
-            var shadowVolume = options.shadowVolume;
-            var flatPositions = geometry.attributes.position.values;
-            var length = flatPositions.length;
-            var wall = options.wall;
-            var top = options.top || wall;
-            var bottom = options.bottom || wall;
-            if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent || shadowVolume) {
-                // PERFORMANCE_IDEA: Compute before subdivision, then just interpolate during subdivision.
-                // PERFORMANCE_IDEA: Compute with createGeometryFromPositions() for fast path when there's no holes.
-                var boundingRectangle = options.boundingRectangle;
-                var tangentPlane = options.tangentPlane;
-                var ellipsoid = options.ellipsoid;
-                var stRotation = options.stRotation;
-                var perPositionHeight = options.perPositionHeight;
-
-                var origin = appendTextureCoordinatesOrigin;
-                origin.x = boundingRectangle.x;
-                origin.y = boundingRectangle.y;
-
-                var textureCoordinates = vertexFormat.st ? new Float32Array(2 * (length / 3)) : undefined;
-                var normals;
-                if (vertexFormat.normal) {
-                    if (perPositionHeight && top && !wall) {
-                        normals = geometry.attributes.normal.values;
-                    } else {
-                        normals = new Float32Array(length);
-                    }
-                }
-                var tangents = vertexFormat.tangent ? new Float32Array(length) : undefined;
-                var bitangents = vertexFormat.bitangent ? new Float32Array(length) : undefined;
-                var extrudeNormals = shadowVolume ? new Float32Array(length) : undefined;
-
-                var textureCoordIndex = 0;
-                var attrIndex = 0;
-
-                var normal = scratchNormal;
-                var tangent = scratchTangent;
-                var bitangent = scratchBitangent;
-                var recomputeNormal = true;
-
-                var textureMatrix = appendTextureCoordinatesMatrix3;
-                var tangentRotationMatrix = tangentMatrixScratch;
-                if (stRotation !== 0.0) {
-                    var rotation = Transforms.Quaternion.fromAxisAngle(tangentPlane._plane.normal, stRotation, appendTextureCoordinatesQuaternion);
-                    textureMatrix = BoundingSphere.Matrix3.fromQuaternion(rotation, textureMatrix);
-
-                    rotation = Transforms.Quaternion.fromAxisAngle(tangentPlane._plane.normal, -stRotation, appendTextureCoordinatesQuaternion);
-                    tangentRotationMatrix = BoundingSphere.Matrix3.fromQuaternion(rotation, tangentRotationMatrix);
-                } else {
-                    textureMatrix = BoundingSphere.Matrix3.clone(BoundingSphere.Matrix3.IDENTITY, textureMatrix);
-                    tangentRotationMatrix = BoundingSphere.Matrix3.clone(BoundingSphere.Matrix3.IDENTITY, tangentRotationMatrix);
-                }
-
-                var bottomOffset = 0;
-                var bottomOffset2 = 0;
-
-                if (top && bottom) {
-                    bottomOffset = length / 2;
-                    bottomOffset2 = length / 3;
-
-                    length /= 2;
-                }
-
-                for ( var i = 0; i < length; i += 3) {
-                    var position = Cartographic.Cartesian3.fromArray(flatPositions, i, appendTextureCoordinatesCartesian3);
-
-                    if (vertexFormat.st) {
-                        var p = BoundingSphere.Matrix3.multiplyByVector(textureMatrix, position, scratchPosition);
-                        p = ellipsoid.scaleToGeodeticSurface(p,p);
-                        var st = tangentPlane.projectPointOntoPlane(p, appendTextureCoordinatesCartesian2);
-                        Cartesian2.Cartesian2.subtract(st, origin, st);
-
-                        var stx = _Math.CesiumMath.clamp(st.x / boundingRectangle.width, 0, 1);
-                        var sty = _Math.CesiumMath.clamp(st.y / boundingRectangle.height, 0, 1);
-                        if (bottom) {
-                            textureCoordinates[textureCoordIndex + bottomOffset2] = stx;
-                            textureCoordinates[textureCoordIndex + 1 + bottomOffset2] = sty;
-                        }
-                        if (top) {
-                            textureCoordinates[textureCoordIndex] = stx;
-                            textureCoordinates[textureCoordIndex + 1] = sty;
-                        }
-
-                        textureCoordIndex += 2;
-                    }
-
-                    if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent || shadowVolume) {
-                        var attrIndex1 = attrIndex + 1;
-                        var attrIndex2 = attrIndex + 2;
-
-                        if (wall) {
-                            if (i + 3 < length) {
-                                var p1 = Cartographic.Cartesian3.fromArray(flatPositions, i + 3, p1Scratch);
-
-                                if (recomputeNormal) {
-                                    var p2 = Cartographic.Cartesian3.fromArray(flatPositions, i + length, p2Scratch);
-                                    if (perPositionHeight) {
-                                        adjustPosHeightsForNormal(position, p1, p2, ellipsoid);
-                                    }
-                                    Cartographic.Cartesian3.subtract(p1, position, p1);
-                                    Cartographic.Cartesian3.subtract(p2, position, p2);
-                                    normal = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(p2, p1, normal), normal);
-                                    recomputeNormal = false;
-                                }
-
-                                if (Cartographic.Cartesian3.equalsEpsilon(p1, position, _Math.CesiumMath.EPSILON10)) { // if we've reached a corner
-                                    recomputeNormal = true;
-                                }
-                            }
-
-                            if (vertexFormat.tangent || vertexFormat.bitangent) {
-                                bitangent = ellipsoid.geodeticSurfaceNormal(position, bitangent);
-                                if (vertexFormat.tangent) {
-                                    tangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(bitangent, normal, tangent), tangent);
-                                }
-                            }
-                        } else {
-                            normal = ellipsoid.geodeticSurfaceNormal(position, normal);
-                            if (vertexFormat.tangent || vertexFormat.bitangent) {
-                                if (perPositionHeight) {
-                                    scratchPerPosNormal = Cartographic.Cartesian3.fromArray(normals, attrIndex, scratchPerPosNormal);
-                                    scratchPerPosTangent = Cartographic.Cartesian3.cross(Cartographic.Cartesian3.UNIT_Z, scratchPerPosNormal, scratchPerPosTangent);
-                                    scratchPerPosTangent = Cartographic.Cartesian3.normalize(BoundingSphere.Matrix3.multiplyByVector(tangentRotationMatrix, scratchPerPosTangent, scratchPerPosTangent), scratchPerPosTangent);
-                                    if (vertexFormat.bitangent) {
-                                        scratchPerPosBitangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(scratchPerPosNormal, scratchPerPosTangent, scratchPerPosBitangent), scratchPerPosBitangent);
-                                    }
-                                }
-
-                                tangent = Cartographic.Cartesian3.cross(Cartographic.Cartesian3.UNIT_Z, normal, tangent);
-                                tangent = Cartographic.Cartesian3.normalize(BoundingSphere.Matrix3.multiplyByVector(tangentRotationMatrix, tangent, tangent), tangent);
-                                if (vertexFormat.bitangent) {
-                                    bitangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(normal, tangent, bitangent), bitangent);
-                                }
-                            }
-                        }
-
-                        if (vertexFormat.normal) {
-                            if (options.wall) {
-                                normals[attrIndex + bottomOffset] = normal.x;
-                                normals[attrIndex1 + bottomOffset] = normal.y;
-                                normals[attrIndex2 + bottomOffset] = normal.z;
-                            } else if (bottom){
-                                normals[attrIndex + bottomOffset] = -normal.x;
-                                normals[attrIndex1 + bottomOffset] = -normal.y;
-                                normals[attrIndex2 + bottomOffset] = -normal.z;
-                            }
-
-                            if ((top && !perPositionHeight) || wall) {
-                                normals[attrIndex] = normal.x;
-                                normals[attrIndex1] = normal.y;
-                                normals[attrIndex2] = normal.z;
-                            }
-                        }
-
-                        if (shadowVolume) {
-                            if (wall) {
-                                normal = ellipsoid.geodeticSurfaceNormal(position, normal);
-                            }
-                            extrudeNormals[attrIndex + bottomOffset] = -normal.x;
-                            extrudeNormals[attrIndex1 + bottomOffset] = -normal.y;
-                            extrudeNormals[attrIndex2 + bottomOffset] = -normal.z;
-                        }
-
-                        if (vertexFormat.tangent) {
-                            if (options.wall) {
-                                tangents[attrIndex + bottomOffset] = tangent.x;
-                                tangents[attrIndex1 + bottomOffset] = tangent.y;
-                                tangents[attrIndex2 + bottomOffset] = tangent.z;
-                            } else if (bottom) {
-                                tangents[attrIndex + bottomOffset] = -tangent.x;
-                                tangents[attrIndex1 + bottomOffset] = -tangent.y;
-                                tangents[attrIndex2 + bottomOffset] = -tangent.z;
-                            }
-
-                            if(top) {
-                                if (perPositionHeight) {
-                                    tangents[attrIndex] = scratchPerPosTangent.x;
-                                    tangents[attrIndex1] = scratchPerPosTangent.y;
-                                    tangents[attrIndex2] = scratchPerPosTangent.z;
-                                } else {
-                                    tangents[attrIndex] = tangent.x;
-                                    tangents[attrIndex1] = tangent.y;
-                                    tangents[attrIndex2] = tangent.z;
-                                }
-                            }
-                        }
-
-                        if (vertexFormat.bitangent) {
-                            if (bottom) {
-                                bitangents[attrIndex + bottomOffset] = bitangent.x;
-                                bitangents[attrIndex1 + bottomOffset] = bitangent.y;
-                                bitangents[attrIndex2 + bottomOffset] = bitangent.z;
-                            }
-                            if (top) {
-                                if (perPositionHeight) {
-                                    bitangents[attrIndex] = scratchPerPosBitangent.x;
-                                    bitangents[attrIndex1] = scratchPerPosBitangent.y;
-                                    bitangents[attrIndex2] = scratchPerPosBitangent.z;
-                                } else {
-                                    bitangents[attrIndex] = bitangent.x;
-                                    bitangents[attrIndex1] = bitangent.y;
-                                    bitangents[attrIndex2] = bitangent.z;
-                                }
-                            }
-                        }
-                        attrIndex += 3;
-                    }
-                }
-
-                if (vertexFormat.st) {
-                    geometry.attributes.st = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 2,
-                        values : textureCoordinates
-                    });
-                }
-
-                if (vertexFormat.normal) {
-                    geometry.attributes.normal = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : normals
-                    });
-                }
-
-                if (vertexFormat.tangent) {
-                    geometry.attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : tangents
-                    });
-                }
-
-                if (vertexFormat.bitangent) {
-                    geometry.attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : bitangents
-                    });
-                }
-
-                if (shadowVolume) {
-                    geometry.attributes.extrudeDirection = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                        componentsPerAttribute : 3,
-                        values : extrudeNormals
-                    });
-                }
-            }
-
-            if (options.extrude && when.defined(options.offsetAttribute)) {
-                var size = flatPositions.length / 3;
-                var offsetAttribute = new Uint8Array(size);
-
-                if (options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                    if ((top && bottom) || wall) {
-                        offsetAttribute = arrayFill.arrayFill(offsetAttribute, 1, 0, size / 2);
-                    } else if (top) {
-                        offsetAttribute = arrayFill.arrayFill(offsetAttribute, 1);
-                    }
-                } else {
-                    var offsetValue = options.offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    offsetAttribute = arrayFill.arrayFill(offsetAttribute, offsetValue);
-                }
-
-                geometry.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values : offsetAttribute
-                });
-            }
-
-            return geometry;
-        }
-
-        var startCartographicScratch = new Cartographic.Cartographic();
-        var endCartographicScratch = new Cartographic.Cartographic();
-        var idlCross = {
-            west : 0.0,
-            east : 0.0
-        };
-        var ellipsoidGeodesic = new EllipsoidGeodesic.EllipsoidGeodesic();
-        function computeRectangle(positions, ellipsoid, arcType, granularity, result) {
-            result = when.defaultValue(result, new Cartesian2.Rectangle());
-            if (!when.defined(positions) || positions.length < 3) {
-                result.west = 0.0;
-                result.north = 0.0;
-                result.south = 0.0;
-                result.east = 0.0;
-                return result;
-            }
-
-            if (arcType === ArcType.ArcType.RHUMB) {
-                return Cartesian2.Rectangle.fromCartesianArray(positions, ellipsoid, result);
-            }
-
-            if (!ellipsoidGeodesic.ellipsoid.equals(ellipsoid)) {
-                ellipsoidGeodesic = new EllipsoidGeodesic.EllipsoidGeodesic(undefined, undefined, ellipsoid);
-            }
-
-            result.west = Number.POSITIVE_INFINITY;
-            result.east = Number.NEGATIVE_INFINITY;
-            result.south = Number.POSITIVE_INFINITY;
-            result.north = Number.NEGATIVE_INFINITY;
-
-            idlCross.west = Number.POSITIVE_INFINITY;
-            idlCross.east = Number.NEGATIVE_INFINITY;
-
-            var inverseChordLength = 1.0 / _Math.CesiumMath.chordLength(granularity, ellipsoid.maximumRadius);
-            var positionsLength = positions.length;
-            var endCartographic = ellipsoid.cartesianToCartographic(positions[0], endCartographicScratch);
-            var startCartographic = startCartographicScratch;
-            var swap;
-
-            for (var i = 1; i < positionsLength; i++) {
-                swap = startCartographic;
-                startCartographic = endCartographic;
-                endCartographic = ellipsoid.cartesianToCartographic(positions[i], swap);
-                ellipsoidGeodesic.setEndPoints(startCartographic, endCartographic);
-                interpolateAndGrowRectangle(ellipsoidGeodesic, inverseChordLength, result, idlCross);
-            }
-
-            swap = startCartographic;
-            startCartographic = endCartographic;
-            endCartographic = ellipsoid.cartesianToCartographic(positions[0], swap);
-            ellipsoidGeodesic.setEndPoints(startCartographic, endCartographic);
-            interpolateAndGrowRectangle(ellipsoidGeodesic, inverseChordLength, result, idlCross);
-
-            if (result.east - result.west > idlCross.west - idlCross.east) {
-                result.east = idlCross.east;
-                result.west = idlCross.west;
-            }
-
-            return result;
-        }
-
-        var interpolatedCartographicScratch = new Cartographic.Cartographic();
-        function interpolateAndGrowRectangle(ellipsoidGeodesic, inverseChordLength, result, idlCross) {
-            var segmentLength = ellipsoidGeodesic.surfaceDistance;
-
-            var numPoints = Math.ceil(segmentLength * inverseChordLength);
-            var subsegmentDistance = numPoints > 0 ? segmentLength / (numPoints - 1) : Number.POSITIVE_INFINITY;
-            var interpolationDistance = 0.0;
-
-            for (var i = 0; i < numPoints; i++) {
-                var interpolatedCartographic = ellipsoidGeodesic.interpolateUsingSurfaceDistance(interpolationDistance, interpolatedCartographicScratch);
-                interpolationDistance += subsegmentDistance;
-                var longitude = interpolatedCartographic.longitude;
-                var latitude = interpolatedCartographic.latitude;
-
-                result.west = Math.min(result.west, longitude);
-                result.east = Math.max(result.east, longitude);
-                result.south = Math.min(result.south, latitude);
-                result.north = Math.max(result.north, latitude);
-
-                idlCross.west = longitude > 0.0 ? Math.min(longitude, idlCross.west) : idlCross.west;
-                idlCross.east = longitude < 0.0 ? Math.max(longitude, idlCross.east) : idlCross.east;
-            }
-        }
-
-        var createGeometryFromPositionsExtrudedPositions = [];
-
-        function createGeometryFromPositionsExtruded(ellipsoid, polygon, granularity, hierarchy, perPositionHeight, closeTop, closeBottom, vertexFormat, arcType, extrudeOutering) {
-            var geos = {
-                walls : []
-            };
-            var i;
-
-            if (closeTop || closeBottom) {
-                var topGeo = PolygonGeometryLibrary.PolygonGeometryLibrary.createGeometryFromPositions(ellipsoid, polygon, granularity, perPositionHeight, vertexFormat, arcType);
-
-                var edgePoints = topGeo.attributes.position.values;
-                var indices = topGeo.indices;
-                var numPositions;
-                var newIndices;
-
-                if (closeTop && closeBottom) {
-                    var topBottomPositions = edgePoints.concat(edgePoints);
-
-                    numPositions = topBottomPositions.length / 3;
-
-                    newIndices = IndexDatatype.IndexDatatype.createTypedArray(numPositions, indices.length * 2);
-                    newIndices.set(indices);
-                    var ilength = indices.length;
-
-                    var length = numPositions / 2;
-
-                    for (i = 0; i < ilength; i += 3) {
-                        var i0 = newIndices[i] + length;
-                        var i1 = newIndices[i + 1] + length;
-                        var i2 = newIndices[i + 2] + length;
-
-                        newIndices[i + ilength] = i2;
-                        newIndices[i + 1 + ilength] = i1;
-                        newIndices[i + 2 + ilength] = i0;
-                    }
-
-                    topGeo.attributes.position.values = topBottomPositions;
-                    if (perPositionHeight && vertexFormat.normal) {
-                        var normals = topGeo.attributes.normal.values;
-                        topGeo.attributes.normal.values = new Float32Array(topBottomPositions.length);
-                        topGeo.attributes.normal.values.set(normals);
-                    }
-                    topGeo.indices = newIndices;
-                } else if (closeBottom) {
-                    numPositions = edgePoints.length / 3;
-                    newIndices = IndexDatatype.IndexDatatype.createTypedArray(numPositions, indices.length);
-
-                    for (i = 0; i < indices.length; i += 3) {
-                        newIndices[i] = indices[i + 2];
-                        newIndices[i + 1] = indices[i + 1];
-                        newIndices[i + 2] = indices[i];
-                    }
-
-                    topGeo.indices = newIndices;
-                }
-
-                geos.topAndBottom = new GeometryInstance.GeometryInstance({
-                    geometry : topGeo
-                });
-            }
-
-            var outerRing = hierarchy.outerRing;
-            var tangentPlane = EllipsoidTangentPlane.EllipsoidTangentPlane.fromPoints(outerRing, ellipsoid);
-            var positions2D = tangentPlane.projectPointsOntoPlane(outerRing, createGeometryFromPositionsExtrudedPositions);
-
-            var windingOrder = PolygonPipeline.PolygonPipeline.computeWindingOrder2D(positions2D);
-            if (windingOrder === PolygonPipeline.WindingOrder.CLOCKWISE) {
-                outerRing = outerRing.slice().reverse();
-            }
-
-            var wallGeo;
-            if(extrudeOutering) {
-                wallGeo = PolygonGeometryLibrary.PolygonGeometryLibrary.computeWallGeometry(outerRing, ellipsoid, granularity, perPositionHeight, arcType);
-                geos.walls.push(new GeometryInstance.GeometryInstance({
-                    geometry : wallGeo
-                }));
-            }
-
-
-            var holes = hierarchy.holes;
-            for (i = 0; i < holes.length; i++) {
-                var hole = holes[i];
-
-                tangentPlane = EllipsoidTangentPlane.EllipsoidTangentPlane.fromPoints(hole, ellipsoid);
-                positions2D = tangentPlane.projectPointsOntoPlane(hole, createGeometryFromPositionsExtrudedPositions);
-
-                windingOrder = PolygonPipeline.PolygonPipeline.computeWindingOrder2D(positions2D);
-                if (windingOrder === PolygonPipeline.WindingOrder.COUNTER_CLOCKWISE) {
-                    hole = hole.slice().reverse();
-                }
-
-                wallGeo = PolygonGeometryLibrary.PolygonGeometryLibrary.computeWallGeometry(hole, ellipsoid, granularity, perPositionHeight, arcType);
-                geos.walls.push(new GeometryInstance.GeometryInstance({
-                    geometry : wallGeo
-                }));
-            }
-
-            return geos;
-        }
-
-        /**
-         * A description of a polygon on the ellipsoid. The polygon is defined by a polygon hierarchy. Polygon geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}.
-         *
-         * @alias PolygonGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {PolygonHierarchy} options.polygonHierarchy A polygon hierarchy that can include holes.
-         * @param {Number} [options.height=0.0] The distance in meters between the polygon and the ellipsoid surface.
-         * @param {Number} [options.extrudedHeight] The distance in meters between the polygon's extruded face and the ellipsoid surface.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {Number} [options.stRotation=0.0] The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Boolean} [options.perPositionHeight=false] Use the height of options.positions for each position instead of using options.height to determine the height.
-         * @param {Boolean} [options.closeTop=true] When false, leaves off the top of an extruded polygon open.
-         * @param {Boolean} [options.closeBottom=true] When false, leaves off the bottom of an extruded polygon open.
-         * @param {ArcType} [options.arcType=ArcType.GEODESIC] The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}.
-         *
-         * @see PolygonGeometry#createGeometry
-         * @see PolygonGeometry#fromPositions
-         *
-         * @demo {@link https://cesiumjs.org/Cesium/Apps/Sandcastle/index.html?src=Polygon.html|Cesium Sandcastle Polygon Demo}
-         *
-         * @example
-         * // 1. create a polygon from points
-         * var polygon = new Cesium.PolygonGeometry({
-         *   polygonHierarchy : new Cesium.PolygonHierarchy(
-         *     Cesium.Cartesian3.fromDegreesArray([
-         *       -72.0, 40.0,
-         *       -70.0, 35.0,
-         *       -75.0, 30.0,
-         *       -70.0, 30.0,
-         *       -68.0, 40.0
-         *     ])
-         *   )
-         * });
-         * var geometry = Cesium.PolygonGeometry.createGeometry(polygon);
-         *
-         * // 2. create a nested polygon with holes
-         * var polygonWithHole = new Cesium.PolygonGeometry({
-         *   polygonHierarchy : new Cesium.PolygonHierarchy(
-         *     Cesium.Cartesian3.fromDegreesArray([
-         *       -109.0, 30.0,
-         *       -95.0, 30.0,
-         *       -95.0, 40.0,
-         *       -109.0, 40.0
-         *     ]),
-         *     [new Cesium.PolygonHierarchy(
-         *       Cesium.Cartesian3.fromDegreesArray([
-         *         -107.0, 31.0,
-         *         -107.0, 39.0,
-         *         -97.0, 39.0,
-         *         -97.0, 31.0
-         *       ]),
-         *       [new Cesium.PolygonHierarchy(
-         *         Cesium.Cartesian3.fromDegreesArray([
-         *           -105.0, 33.0,
-         *           -99.0, 33.0,
-         *           -99.0, 37.0,
-         *           -105.0, 37.0
-         *         ]),
-         *         [new Cesium.PolygonHierarchy(
-         *           Cesium.Cartesian3.fromDegreesArray([
-         *             -103.0, 34.0,
-         *             -101.0, 34.0,
-         *             -101.0, 36.0,
-         *             -103.0, 36.0
-         *           ])
-         *         )]
-         *       )]
-         *     )]
-         *   )
-         * });
-         * var geometry = Cesium.PolygonGeometry.createGeometry(polygonWithHole);
-         *
-         * // 3. create extruded polygon
-         * var extrudedPolygon = new Cesium.PolygonGeometry({
-         *   polygonHierarchy : new Cesium.PolygonHierarchy(
-         *     Cesium.Cartesian3.fromDegreesArray([
-         *       -72.0, 40.0,
-         *       -70.0, 35.0,
-         *       -75.0, 30.0,
-         *       -70.0, 30.0,
-         *       -68.0, 40.0
-         *     ])
-         *   ),
-         *   extrudedHeight: 300000
-         * });
-         * var geometry = Cesium.PolygonGeometry.createGeometry(extrudedPolygon);
-         */
-        function PolygonGeometry(options) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('options', options);
-            Check.Check.typeOf.object('options.polygonHierarchy', options.polygonHierarchy);
-            if (when.defined(options.perPositionHeight) && options.perPositionHeight && when.defined(options.height)) {
-                throw new Check.DeveloperError('Cannot use both options.perPositionHeight and options.height');
-            }
-            if (when.defined(options.arcType) && options.arcType !== ArcType.ArcType.GEODESIC && options.arcType !== ArcType.ArcType.RHUMB) {
-                throw new Check.DeveloperError('Invalid arcType. Valid options are ArcType.GEODESIC and ArcType.RHUMB.');
-            }
-            //>>includeEnd('debug');
-
-            var polygonHierarchy = options.polygonHierarchy;
-            var vertexFormat = when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT);
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            var stRotation = when.defaultValue(options.stRotation, 0.0);
-            var perPositionHeight = when.defaultValue(options.perPositionHeight, false);
-            var perPositionHeightExtrude = perPositionHeight && when.defined(options.extrudedHeight);
-            var height = when.defaultValue(options.height, 0.0);
-            var extrudedHeight = when.defaultValue(options.extrudedHeight, height);
-
-            if (!perPositionHeightExtrude) {
-                var h = Math.max(height, extrudedHeight);
-                extrudedHeight = Math.min(height, extrudedHeight);
-                height = h;
-            }
-
-            this._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat);
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid);
-            this._granularity = granularity;
-            this._stRotation = stRotation;
-            this._height = height;
-            this._extrudedHeight = extrudedHeight;
-            this._closeTop = when.defaultValue(options.closeTop, true);
-            this._closeBottom = when.defaultValue(options.closeBottom, true);
-            this._extrudeOutering  = when.defaultValue(options.extrudeOutering, true);
-            this._polygonHierarchy = polygonHierarchy;
-            this._perPositionHeight = perPositionHeight;
-            this._perPositionHeightExtrude = perPositionHeightExtrude;
-            this._shadowVolume = when.defaultValue(options.shadowVolume, false);
-            this._workerName = 'createPolygonGeometry';
-            this._offsetAttribute = options.offsetAttribute;
-            this._arcType = when.defaultValue(options.arcType, ArcType.ArcType.GEODESIC);
-
-            this._rectangle = undefined;
-            this._textureCoordinateRotationPoints = undefined;
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = PolygonGeometryLibrary.PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + Cartesian2.Ellipsoid.packedLength + VertexFormat.VertexFormat.packedLength + 12;
-        }
-
-        /**
-         * A description of a polygon from an array of positions. Polygon geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of positions that defined the corner points of the polygon.
-         * @param {Number} [options.height=0.0] The height of the polygon.
-         * @param {Number} [options.extrudedHeight] The height of the polygon extrusion.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {Number} [options.stRotation=0.0] The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Boolean} [options.perPositionHeight=false] Use the height of options.positions for each position instead of using options.height to determine the height.
-         * @param {Boolean} [options.closeTop=true] When false, leaves off the top of an extruded polygon open.
-         * @param {Boolean} [options.closeBottom=true] When false, leaves off the bottom of an extruded polygon open.
-         * @param {ArcType} [options.arcType=ArcType.GEODESIC] The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}.
-         * @returns {PolygonGeometry}
-         *
-         *
-         * @example
-         * // create a polygon from points
-         * var polygon = Cesium.PolygonGeometry.fromPositions({
-         *   positions : Cesium.Cartesian3.fromDegreesArray([
-         *     -72.0, 40.0,
-         *     -70.0, 35.0,
-         *     -75.0, 30.0,
-         *     -70.0, 30.0,
-         *     -68.0, 40.0
-         *   ])
-         * });
-         * var geometry = Cesium.PolygonGeometry.createGeometry(polygon);
-         *
-         * @see PolygonGeometry#createGeometry
-         */
-        PolygonGeometry.fromPositions = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.positions', options.positions);
-            //>>includeEnd('debug');
-
-            var newOptions = {
-                polygonHierarchy : {
-                    positions : options.positions
-                },
-                height : options.height,
-                extrudedHeight : options.extrudedHeight,
-                vertexFormat : options.vertexFormat,
-                stRotation : options.stRotation,
-                ellipsoid : options.ellipsoid,
-                granularity : options.granularity,
-                perPositionHeight : options.perPositionHeight,
-                closeTop : options.closeTop,
-                closeBottom : options.closeBottom,
-                offsetAttribute : options.offsetAttribute,
-                arcType : options.arcType
-            };
-            return new PolygonGeometry(newOptions);
-        };
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {PolygonGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        PolygonGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            startingIndex = PolygonGeometryLibrary.PolygonGeometryLibrary.packPolygonHierarchy(value._polygonHierarchy, array, startingIndex);
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._height;
-            array[startingIndex++] = value._extrudedHeight;
-            array[startingIndex++] = value._granularity;
-            array[startingIndex++] = value._stRotation;
-            array[startingIndex++] = value._perPositionHeightExtrude ? 1.0 : 0.0;
-            array[startingIndex++] = value._perPositionHeight ? 1.0 : 0.0;
-            array[startingIndex++] = value._closeTop ? 1.0 : 0.0;
-            array[startingIndex++] = value._closeBottom ? 1.0 : 0.0;
-            array[startingIndex++] = value._shadowVolume ? 1.0 : 0.0;
-            array[startingIndex++] = when.defaultValue(value._offsetAttribute, -1);
-            array[startingIndex++] = value._arcType;
-            array[startingIndex] = value.packedLength;
-
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-
-        //Only used to avoid inability to default construct.
-        var dummyOptions = {
-            polygonHierarchy : {}
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {PolygonGeometry} [result] The object into which to store the result.
-         */
-        PolygonGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var polygonHierarchy = PolygonGeometryLibrary.PolygonGeometryLibrary.unpackPolygonHierarchy(array, startingIndex);
-            startingIndex = polygonHierarchy.startingIndex;
-            delete polygonHierarchy.startingIndex;
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var height = array[startingIndex++];
-            var extrudedHeight = array[startingIndex++];
-            var granularity = array[startingIndex++];
-            var stRotation = array[startingIndex++];
-            var perPositionHeightExtrude = array[startingIndex++] === 1.0;
-            var perPositionHeight = array[startingIndex++] === 1.0;
-            var closeTop = array[startingIndex++] === 1.0;
-            var closeBottom = array[startingIndex++] === 1.0;
-            var shadowVolume = array[startingIndex++] === 1.0;
-            var offsetAttribute = array[startingIndex++];
-            var arcType = array[startingIndex++];
-            var packedLength = array[startingIndex];
-
-            if (!when.defined(result)) {
-                result = new PolygonGeometry(dummyOptions);
-            }
-
-            result._polygonHierarchy = polygonHierarchy;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._height = height;
-            result._extrudedHeight = extrudedHeight;
-            result._granularity = granularity;
-            result._stRotation = stRotation;
-            result._perPositionHeightExtrude = perPositionHeightExtrude;
-            result._perPositionHeight = perPositionHeight;
-            result._closeTop = closeTop;
-            result._closeBottom = closeBottom;
-            result._shadowVolume = shadowVolume;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-            result._arcType = arcType;
-            result.packedLength = packedLength;
-            return result;
-        };
-
-        /**
-         * Returns the bounding rectangle given the provided options
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {PolygonHierarchy} options.polygonHierarchy A polygon hierarchy that can include holes.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions sampled.
-         * @param {ArcType} [options.arcType=ArcType.GEODESIC] The type of line the polygon edges must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {Rectangle} [result] An object in which to store the result.
-         *
-         * @returns {Rectangle} The result rectangle
-         */
-        PolygonGeometry.computeRectangle = function(options, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('options', options);
-            Check.Check.typeOf.object('options.polygonHierarchy', options.polygonHierarchy);
-            //>>includeEnd('debug');
-
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            var arcType = when.defaultValue(options.arcType, ArcType.ArcType.GEODESIC);
-            //>>includeStart('debug', pragmas.debug);
-            if (arcType !== ArcType.ArcType.GEODESIC && arcType !== ArcType.ArcType.RHUMB) {
-                throw new Check.DeveloperError('Invalid arcType. Valid options are ArcType.GEODESIC and ArcType.RHUMB.');
-            }
-            //>>includeEnd('debug');
-
-            var polygonHierarchy = options.polygonHierarchy;
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-            return computeRectangle(polygonHierarchy.positions, ellipsoid, arcType, granularity, result);
-        };
-
-        /**
-         * Computes the geometric representation of a polygon, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {PolygonGeometry} polygonGeometry A description of the polygon.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        PolygonGeometry.createGeometry = function(polygonGeometry) {
-            var vertexFormat = polygonGeometry._vertexFormat;
-            var ellipsoid = polygonGeometry._ellipsoid;
-            var granularity = polygonGeometry._granularity;
-            var stRotation = polygonGeometry._stRotation;
-            var polygonHierarchy = polygonGeometry._polygonHierarchy;
-            var perPositionHeight = polygonGeometry._perPositionHeight;
-            var closeTop = polygonGeometry._closeTop;
-            var closeBottom = polygonGeometry._closeBottom;
-            var arcType = polygonGeometry._arcType;
-
-            var outerPositions = polygonHierarchy.positions;
-            if (outerPositions.length < 3) {
-                return;
-            }
-
-            var tangentPlane = EllipsoidTangentPlane.EllipsoidTangentPlane.fromPoints(outerPositions, ellipsoid);
-
-            var results = PolygonGeometryLibrary.PolygonGeometryLibrary.polygonsFromHierarchy(polygonHierarchy, tangentPlane.projectPointsOntoPlane.bind(tangentPlane), !perPositionHeight, ellipsoid);
-            var hierarchy = results.hierarchy;
-            var polygons = results.polygons;
-
-            if (hierarchy.length === 0) {
-                return;
-            }
-
-            outerPositions = hierarchy[0].outerRing;
-            var boundingRectangle = PolygonGeometryLibrary.PolygonGeometryLibrary.computeBoundingRectangle(tangentPlane.plane.normal, tangentPlane.projectPointOntoPlane.bind(tangentPlane), outerPositions, stRotation, scratchBoundingRectangle);
-
-            var geometries = [];
-
-            var height = polygonGeometry._height;
-            var extrudedHeight = polygonGeometry._extrudedHeight;
-            var extrude = polygonGeometry._perPositionHeightExtrude || !_Math.CesiumMath.equalsEpsilon(height, extrudedHeight, 0, _Math.CesiumMath.EPSILON2);
-
-            var options = {
-                perPositionHeight: perPositionHeight,
-                vertexFormat: vertexFormat,
-                geometry: undefined,
-                tangentPlane: tangentPlane,
-                boundingRectangle: boundingRectangle,
-                ellipsoid: ellipsoid,
-                stRotation: stRotation,
-                bottom: false,
-                top: true,
-                wall: false,
-                extrude: false,
-                arcType: arcType
-            };
-
-            var i;
-
-            if (extrude) {
-                options.extrude = true;
-                options.top = closeTop;
-                options.bottom = closeBottom;
-                options.shadowVolume = polygonGeometry._shadowVolume;
-                options.offsetAttribute = polygonGeometry._offsetAttribute;
-                for (i = 0; i < polygons.length; i++) {
-                    var splitGeometry = createGeometryFromPositionsExtruded(ellipsoid, polygons[i], granularity, hierarchy[i], perPositionHeight, closeTop, closeBottom, vertexFormat, arcType, polygonGeometry._extrudeOutering);
-
-                    var topAndBottom;
-                    if (closeTop && closeBottom) {
-                        topAndBottom = splitGeometry.topAndBottom;
-                        options.geometry = PolygonGeometryLibrary.PolygonGeometryLibrary.scaleToGeodeticHeightExtruded(topAndBottom.geometry, height, extrudedHeight, ellipsoid, perPositionHeight);
-                    } else if (closeTop) {
-                        topAndBottom = splitGeometry.topAndBottom;
-                        topAndBottom.geometry.attributes.position.values = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(topAndBottom.geometry.attributes.position.values, height, ellipsoid, !perPositionHeight);
-                        options.geometry = topAndBottom.geometry;
-                    } else if (closeBottom) {
-                        topAndBottom = splitGeometry.topAndBottom;
-                        topAndBottom.geometry.attributes.position.values = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(topAndBottom.geometry.attributes.position.values, extrudedHeight, ellipsoid, true);
-                        options.geometry = topAndBottom.geometry;
-                    }
-                    if (closeTop || closeBottom) {
-                        options.wall = false;
-                        topAndBottom.geometry = computeAttributes(options);
-                        geometries.push(topAndBottom);
-                    }
-
-                    var walls = splitGeometry.walls;
-                    options.wall = true;
-                    for ( var k = 0; k < walls.length; k++) {
-                        var wall = walls[k];
-                        options.geometry = PolygonGeometryLibrary.PolygonGeometryLibrary.scaleToGeodeticHeightExtruded(wall.geometry, height, extrudedHeight, ellipsoid, perPositionHeight);
-                        wall.geometry = computeAttributes(options);
-                        geometries.push(wall);
-                    }
-                }
-            } else {
-                for (i = 0; i < polygons.length; i++) {
-                    var geometryInstance = new GeometryInstance.GeometryInstance({
-                        geometry : PolygonGeometryLibrary.PolygonGeometryLibrary.createGeometryFromPositions(ellipsoid, polygons[i], granularity, perPositionHeight, vertexFormat, arcType)
-                    });
-                    geometryInstance.geometry.attributes.position.values = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(geometryInstance.geometry.attributes.position.values, height, ellipsoid, !perPositionHeight);
-                    options.geometry = geometryInstance.geometry;
-                    geometryInstance.geometry = computeAttributes(options);
-
-                    if (when.defined(polygonGeometry._offsetAttribute)) {
-                        var length = geometryInstance.geometry.attributes.position.values.length;
-                        var applyOffset = new Uint8Array(length / 3);
-                        var offsetValue = polygonGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                        arrayFill.arrayFill(applyOffset, offsetValue);
-                        geometryInstance.geometry.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                            componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                            componentsPerAttribute : 1,
-                            values: applyOffset
-                        });
-                    }
-
-                    geometries.push(geometryInstance);
-                }
-            }
-
-            var geometry = GeometryPipeline.GeometryPipeline.combineInstances(geometries)[0];
-            geometry.attributes.position.values = new Float64Array(geometry.attributes.position.values);
-            geometry.indices = IndexDatatype.IndexDatatype.createTypedArray(geometry.attributes.position.values.length / 3, geometry.indices);
-
-            var attributes = geometry.attributes;
-            var boundingSphere = BoundingSphere.BoundingSphere.fromVertices(attributes.position.values);
-
-            if (!vertexFormat.position) {
-                delete attributes.position;
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : geometry.indices,
-                primitiveType : geometry.primitiveType,
-                boundingSphere : boundingSphere,
-                offsetAttribute : polygonGeometry._offsetAttribute
-            });
-        };
-
-        /**
-         * @private
-         */
-        PolygonGeometry.createShadowVolume = function(polygonGeometry, minHeightFunc, maxHeightFunc) {
-            var granularity = polygonGeometry._granularity;
-            var ellipsoid = polygonGeometry._ellipsoid;
-
-            var minHeight = minHeightFunc(granularity, ellipsoid);
-            var maxHeight = maxHeightFunc(granularity, ellipsoid);
-
-            return new PolygonGeometry({
-                polygonHierarchy : polygonGeometry._polygonHierarchy,
-                ellipsoid : ellipsoid,
-                stRotation : polygonGeometry._stRotation,
-                granularity : granularity,
-                perPositionHeight : false,
-                extrudedHeight : minHeight,
-                height : maxHeight,
-                vertexFormat : VertexFormat.VertexFormat.POSITION_ONLY,
-                shadowVolume: true,
-                arcType : polygonGeometry._arcType
-            });
-        };
-
-        function textureCoordinateRotationPoints(polygonGeometry) {
-            var stRotation = -polygonGeometry._stRotation;
-            if (stRotation === 0.0) {
-                return [0, 0, 0, 1, 1, 0];
-            }
-            var ellipsoid = polygonGeometry._ellipsoid;
-            var positions = polygonGeometry._polygonHierarchy.positions;
-            var boundingRectangle = polygonGeometry.rectangle;
-            return GeometryAttribute.Geometry._textureCoordinateRotationPoints(positions, stRotation, ellipsoid, boundingRectangle);
-        }
-
-        Object.defineProperties(PolygonGeometry.prototype, {
-            /**
-             * @private
-             */
-            rectangle : {
-                get : function() {
-                    if (!when.defined(this._rectangle)) {
-                        var positions = this._polygonHierarchy.positions;
-                        this._rectangle = computeRectangle(positions, this._ellipsoid, this._arcType, this._granularity);
-                    }
-
-                    return this._rectangle;
-                }
-            },
-            /**
-             * For remapping texture coordinates when rendering PolygonGeometries as GroundPrimitives.
-             * @private
-             */
-            textureCoordinateRotationPoints : {
-                get : function() {
-                    if (!when.defined(this._textureCoordinateRotationPoints)) {
-                        this._textureCoordinateRotationPoints = textureCoordinateRotationPoints(this);
-                    }
-                    return this._textureCoordinateRotationPoints;
-                }
-            }
-        });
-
-    function createPolygonGeometry(polygonGeometry, offset) {
-        if (when.defined(offset)) {
-            polygonGeometry = PolygonGeometry.unpack(polygonGeometry, offset);
-        }
-        polygonGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(polygonGeometry._ellipsoid);
-        return PolygonGeometry.createGeometry(polygonGeometry);
-    }
-
-    return createPolygonGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createPolygonOutlineGeometry.js b/public/libs/Cesium/Workers/createPolygonOutlineGeometry.js
deleted file mode 100644
index 975e01e..0000000
--- a/public/libs/Cesium/Workers/createPolygonOutlineGeometry.js
+++ /dev/null
@@ -1,567 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './GeometryInstance-93a01b5d', './arrayRemoveDuplicates-f0b089b1', './EllipsoidTangentPlane-e324bfa4', './ArcType-66bc286a', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './PolygonGeometryLibrary-9cc18cc2'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, arrayFill, GeometryOffsetAttribute, GeometryInstance, arrayRemoveDuplicates, EllipsoidTangentPlane, ArcType, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, PolygonGeometryLibrary) { 'use strict';
-
-    var createGeometryFromPositionsPositions = [];
-        var createGeometryFromPositionsSubdivided = [];
-
-        function createGeometryFromPositions(ellipsoid, positions, minDistance, perPositionHeight, arcType) {
-            var tangentPlane = EllipsoidTangentPlane.EllipsoidTangentPlane.fromPoints(positions, ellipsoid);
-            var positions2D = tangentPlane.projectPointsOntoPlane(positions, createGeometryFromPositionsPositions);
-
-            var originalWindingOrder = PolygonPipeline.PolygonPipeline.computeWindingOrder2D(positions2D);
-            if (originalWindingOrder === PolygonPipeline.WindingOrder.CLOCKWISE) {
-                positions2D.reverse();
-                positions = positions.slice().reverse();
-            }
-
-            var subdividedPositions;
-            var i;
-
-            var length = positions.length;
-            var index = 0;
-
-            if (!perPositionHeight) {
-                var numVertices = 0;
-                if (arcType === ArcType.ArcType.GEODESIC) {
-                    for (i = 0; i < length; i++) {
-                        numVertices += PolygonGeometryLibrary.PolygonGeometryLibrary.subdivideLineCount(positions[i], positions[(i + 1) % length], minDistance);
-                    }
-                } else if (arcType === ArcType.ArcType.RHUMB) {
-                    for (i = 0; i < length; i++) {
-                        numVertices += PolygonGeometryLibrary.PolygonGeometryLibrary.subdivideRhumbLineCount(ellipsoid, positions[i], positions[(i + 1) % length], minDistance);
-                    }
-                }
-                subdividedPositions = new Float64Array(numVertices * 3);
-                for (i = 0; i < length; i++) {
-                    var tempPositions;
-                    if (arcType === ArcType.ArcType.GEODESIC) {
-                        tempPositions = PolygonGeometryLibrary.PolygonGeometryLibrary.subdivideLine(positions[i], positions[(i + 1) % length], minDistance, createGeometryFromPositionsSubdivided);
-                    } else if (arcType === ArcType.ArcType.RHUMB) {
-                        tempPositions = PolygonGeometryLibrary.PolygonGeometryLibrary.subdivideRhumbLine(ellipsoid, positions[i], positions[(i + 1) % length], minDistance, createGeometryFromPositionsSubdivided);
-                    }
-                    var tempPositionsLength = tempPositions.length;
-                    for (var j = 0; j < tempPositionsLength; ++j) {
-                        subdividedPositions[index++] = tempPositions[j];
-                    }
-                }
-            } else {
-                subdividedPositions = new Float64Array(length * 2 * 3);
-                for (i = 0; i < length; i++) {
-                    var p0 = positions[i];
-                    var p1 = positions[(i + 1) % length];
-                    subdividedPositions[index++] = p0.x;
-                    subdividedPositions[index++] = p0.y;
-                    subdividedPositions[index++] = p0.z;
-                    subdividedPositions[index++] = p1.x;
-                    subdividedPositions[index++] = p1.y;
-                    subdividedPositions[index++] = p1.z;
-                }
-            }
-
-            length = subdividedPositions.length / 3;
-            var indicesSize = length * 2;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(length, indicesSize);
-            index = 0;
-            for (i = 0; i < length - 1; i++) {
-                indices[index++] = i;
-                indices[index++] = i + 1;
-            }
-            indices[index++] = length - 1;
-            indices[index++] = 0;
-
-            return new GeometryInstance.GeometryInstance({
-                geometry : new GeometryAttribute.Geometry({
-                    attributes : new GeometryAttributes.GeometryAttributes({
-                        position : new GeometryAttribute.GeometryAttribute({
-                            componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                            componentsPerAttribute : 3,
-                            values : subdividedPositions
-                        })
-                    }),
-                    indices : indices,
-                    primitiveType : PrimitiveType.PrimitiveType.LINES
-                })
-            });
-        }
-
-        function createGeometryFromPositionsExtruded(ellipsoid, positions, minDistance, perPositionHeight, arcType) {
-            var tangentPlane = EllipsoidTangentPlane.EllipsoidTangentPlane.fromPoints(positions, ellipsoid);
-            var positions2D = tangentPlane.projectPointsOntoPlane(positions, createGeometryFromPositionsPositions);
-
-            var originalWindingOrder = PolygonPipeline.PolygonPipeline.computeWindingOrder2D(positions2D);
-            if (originalWindingOrder === PolygonPipeline.WindingOrder.CLOCKWISE) {
-                positions2D.reverse();
-                positions = positions.slice().reverse();
-            }
-
-            var subdividedPositions;
-            var i;
-
-            var length = positions.length;
-            var corners = new Array(length);
-            var index = 0;
-
-            if (!perPositionHeight) {
-                var numVertices = 0;
-                if (arcType === ArcType.ArcType.GEODESIC) {
-                    for (i = 0; i < length; i++) {
-                        numVertices += PolygonGeometryLibrary.PolygonGeometryLibrary.subdivideLineCount(positions[i], positions[(i + 1) % length], minDistance);
-                    }
-                } else if (arcType === ArcType.ArcType.RHUMB) {
-                    for (i = 0; i < length; i++) {
-                        numVertices += PolygonGeometryLibrary.PolygonGeometryLibrary.subdivideRhumbLineCount(ellipsoid, positions[i], positions[(i + 1) % length], minDistance);
-                    }
-                }
-
-                subdividedPositions = new Float64Array(numVertices * 3 * 2);
-                for (i = 0; i < length; ++i) {
-                    corners[i] = index / 3;
-                    var tempPositions;
-                    if (arcType === ArcType.ArcType.GEODESIC) {
-                        tempPositions = PolygonGeometryLibrary.PolygonGeometryLibrary.subdivideLine(positions[i], positions[(i + 1) % length], minDistance, createGeometryFromPositionsSubdivided);
-                    } else if (arcType === ArcType.ArcType.RHUMB) {
-                        tempPositions = PolygonGeometryLibrary.PolygonGeometryLibrary.subdivideRhumbLine(ellipsoid, positions[i], positions[(i + 1) % length], minDistance, createGeometryFromPositionsSubdivided);
-                    }
-                    var tempPositionsLength = tempPositions.length;
-                    for (var j = 0; j < tempPositionsLength; ++j) {
-                        subdividedPositions[index++] = tempPositions[j];
-                    }
-                }
-            } else {
-                subdividedPositions = new Float64Array(length * 2 * 3 * 2);
-                for (i = 0; i < length; ++i) {
-                    corners[i] = index / 3;
-                    var p0 = positions[i];
-                    var p1 = positions[(i + 1) % length];
-
-                    subdividedPositions[index++] = p0.x;
-                    subdividedPositions[index++] = p0.y;
-                    subdividedPositions[index++] = p0.z;
-                    subdividedPositions[index++] = p1.x;
-                    subdividedPositions[index++] = p1.y;
-                    subdividedPositions[index++] = p1.z;
-                }
-            }
-
-            length = subdividedPositions.length / (3 * 2);
-            var cornersLength = corners.length;
-
-            var indicesSize = ((length * 2) + cornersLength) * 2;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(length, indicesSize);
-
-            index = 0;
-            for (i = 0; i < length; ++i) {
-                indices[index++] = i;
-                indices[index++] = (i + 1) % length;
-                indices[index++] = i + length;
-                indices[index++] = ((i + 1) % length) + length;
-            }
-
-            for (i = 0; i < cornersLength; i++) {
-                var corner = corners[i];
-                indices[index++] = corner;
-                indices[index++] = corner + length;
-            }
-
-            return new GeometryInstance.GeometryInstance({
-                geometry : new GeometryAttribute.Geometry({
-                    attributes : new GeometryAttributes.GeometryAttributes({
-                        position : new GeometryAttribute.GeometryAttribute({
-                            componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                            componentsPerAttribute : 3,
-                            values : subdividedPositions
-                        })
-                    }),
-                    indices : indices,
-                    primitiveType : PrimitiveType.PrimitiveType.LINES
-                })
-            });
-        }
-
-        /**
-         * A description of the outline of a polygon on the ellipsoid. The polygon is defined by a polygon hierarchy.
-         *
-         * @alias PolygonOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {PolygonHierarchy} options.polygonHierarchy A polygon hierarchy that can include holes.
-         * @param {Number} [options.height=0.0] The distance in meters between the polygon and the ellipsoid surface.
-         * @param {Number} [options.extrudedHeight] The distance in meters between the polygon's extruded face and the ellipsoid surface.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Boolean} [options.perPositionHeight=false] Use the height of options.positions for each position instead of using options.height to determine the height.
-         * @param {ArcType} [options.arcType=ArcType.GEODESIC] The type of path the outline must follow. Valid options are {@link ArcType.GEODESIC} and {@link ArcType.RHUMB}.
-         *
-         * @see PolygonOutlineGeometry#createGeometry
-         * @see PolygonOutlineGeometry#fromPositions
-         *
-         * @example
-         * // 1. create a polygon outline from points
-         * var polygon = new Cesium.PolygonOutlineGeometry({
-         *   polygonHierarchy : new Cesium.PolygonHierarchy(
-         *     Cesium.Cartesian3.fromDegreesArray([
-         *       -72.0, 40.0,
-         *       -70.0, 35.0,
-         *       -75.0, 30.0,
-         *       -70.0, 30.0,
-         *       -68.0, 40.0
-         *     ])
-         *   )
-         * });
-         * var geometry = Cesium.PolygonOutlineGeometry.createGeometry(polygon);
-         *
-         * // 2. create a nested polygon with holes outline
-         * var polygonWithHole = new Cesium.PolygonOutlineGeometry({
-         *   polygonHierarchy : new Cesium.PolygonHierarchy(
-         *     Cesium.Cartesian3.fromDegreesArray([
-         *       -109.0, 30.0,
-         *       -95.0, 30.0,
-         *       -95.0, 40.0,
-         *       -109.0, 40.0
-         *     ]),
-         *     [new Cesium.PolygonHierarchy(
-         *       Cesium.Cartesian3.fromDegreesArray([
-         *         -107.0, 31.0,
-         *         -107.0, 39.0,
-         *         -97.0, 39.0,
-         *         -97.0, 31.0
-         *       ]),
-         *       [new Cesium.PolygonHierarchy(
-         *         Cesium.Cartesian3.fromDegreesArray([
-         *           -105.0, 33.0,
-         *           -99.0, 33.0,
-         *           -99.0, 37.0,
-         *           -105.0, 37.0
-         *         ]),
-         *         [new Cesium.PolygonHierarchy(
-         *           Cesium.Cartesian3.fromDegreesArray([
-         *             -103.0, 34.0,
-         *             -101.0, 34.0,
-         *             -101.0, 36.0,
-         *             -103.0, 36.0
-         *           ])
-         *         )]
-         *       )]
-         *     )]
-         *   )
-         * });
-         * var geometry = Cesium.PolygonOutlineGeometry.createGeometry(polygonWithHole);
-         *
-         * // 3. create extruded polygon outline
-         * var extrudedPolygon = new Cesium.PolygonOutlineGeometry({
-         *   polygonHierarchy : new Cesium.PolygonHierarchy(
-         *     Cesium.Cartesian3.fromDegreesArray([
-         *       -72.0, 40.0,
-         *       -70.0, 35.0,
-         *       -75.0, 30.0,
-         *       -70.0, 30.0,
-         *       -68.0, 40.0
-         *     ])
-         *   ),
-         *   extrudedHeight: 300000
-         * });
-         * var geometry = Cesium.PolygonOutlineGeometry.createGeometry(extrudedPolygon);
-         */
-        function PolygonOutlineGeometry(options) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('options', options);
-            Check.Check.typeOf.object('options.polygonHierarchy', options.polygonHierarchy);
-
-            if (options.perPositionHeight && when.defined(options.height)) {
-                throw new Check.DeveloperError('Cannot use both options.perPositionHeight and options.height');
-            }
-            if (when.defined(options.arcType) && options.arcType !== ArcType.ArcType.GEODESIC && options.arcType !== ArcType.ArcType.RHUMB) {
-                throw new Check.DeveloperError('Invalid arcType. Valid options are ArcType.GEODESIC and ArcType.RHUMB.');
-            }
-            //>>includeEnd('debug');
-
-            var polygonHierarchy = options.polygonHierarchy;
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            var perPositionHeight = when.defaultValue(options.perPositionHeight, false);
-            var perPositionHeightExtrude = perPositionHeight && when.defined(options.extrudedHeight);
-            var arcType = when.defaultValue(options.arcType, ArcType.ArcType.GEODESIC);
-
-            var height = when.defaultValue(options.height, 0.0);
-            var extrudedHeight = when.defaultValue(options.extrudedHeight, height);
-
-            if (!perPositionHeightExtrude) {
-                var h = Math.max(height, extrudedHeight);
-                extrudedHeight = Math.min(height, extrudedHeight);
-                height = h;
-            }
-
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid);
-            this._granularity = granularity;
-            this._height = height;
-            this._extrudedHeight = extrudedHeight;
-            this._arcType = arcType;
-            this._polygonHierarchy = polygonHierarchy;
-            this._perPositionHeight = perPositionHeight;
-            this._perPositionHeightExtrude = perPositionHeightExtrude;
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createPolygonOutlineGeometry';
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = PolygonGeometryLibrary.PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + Cartesian2.Ellipsoid.packedLength + 8;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {PolygonOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        PolygonOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            startingIndex = PolygonGeometryLibrary.PolygonGeometryLibrary.packPolygonHierarchy(value._polygonHierarchy, array, startingIndex);
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            array[startingIndex++] = value._height;
-            array[startingIndex++] = value._extrudedHeight;
-            array[startingIndex++] = value._granularity;
-            array[startingIndex++] = value._perPositionHeightExtrude ? 1.0 : 0.0;
-            array[startingIndex++] = value._perPositionHeight ? 1.0 : 0.0;
-            array[startingIndex++] = value._arcType;
-            array[startingIndex++] = when.defaultValue(value._offsetAttribute, -1);
-            array[startingIndex] = value.packedLength;
-
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var dummyOptions = {
-            polygonHierarchy : {}
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {PolygonOutlineGeometry} [result] The object into which to store the result.
-         * @returns {PolygonOutlineGeometry} The modified result parameter or a new PolygonOutlineGeometry instance if one was not provided.
-         */
-        PolygonOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var polygonHierarchy = PolygonGeometryLibrary.PolygonGeometryLibrary.unpackPolygonHierarchy(array, startingIndex);
-            startingIndex = polygonHierarchy.startingIndex;
-            delete polygonHierarchy.startingIndex;
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var height = array[startingIndex++];
-            var extrudedHeight = array[startingIndex++];
-            var granularity = array[startingIndex++];
-            var perPositionHeightExtrude = array[startingIndex++] === 1.0;
-            var perPositionHeight = array[startingIndex++] === 1.0;
-            var arcType = array[startingIndex++];
-            var offsetAttribute = array[startingIndex++];
-            var packedLength = array[startingIndex];
-
-            if (!when.defined(result)) {
-                result = new PolygonOutlineGeometry(dummyOptions);
-            }
-
-            result._polygonHierarchy = polygonHierarchy;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._height = height;
-            result._extrudedHeight = extrudedHeight;
-            result._granularity = granularity;
-            result._perPositionHeight = perPositionHeight;
-            result._perPositionHeightExtrude = perPositionHeightExtrude;
-            result._arcType = arcType;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-            result.packedLength = packedLength;
-
-            return result;
-        };
-
-        /**
-         * A description of a polygon outline from an array of positions.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of positions that defined the corner points of the polygon.
-         * @param {Number} [options.height=0.0] The height of the polygon.
-         * @param {Number} [options.extrudedHeight] The height of the polygon extrusion.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Boolean} [options.perPositionHeight=false] Use the height of options.positions for each position instead of using options.height to determine the height.
-         * @param {ArcType} [options.arcType=ArcType.GEODESIC] The type of path the outline must follow. Valid options are {@link LinkType.GEODESIC} and {@link ArcType.RHUMB}.
-         * @returns {PolygonOutlineGeometry}
-         *
-         *
-         * @example
-         * // create a polygon from points
-         * var polygon = Cesium.PolygonOutlineGeometry.fromPositions({
-         *   positions : Cesium.Cartesian3.fromDegreesArray([
-         *     -72.0, 40.0,
-         *     -70.0, 35.0,
-         *     -75.0, 30.0,
-         *     -70.0, 30.0,
-         *     -68.0, 40.0
-         *   ])
-         * });
-         * var geometry = Cesium.PolygonOutlineGeometry.createGeometry(polygon);
-         *
-         * @see PolygonOutlineGeometry#createGeometry
-         */
-        PolygonOutlineGeometry.fromPositions = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('options.positions', options.positions);
-            //>>includeEnd('debug');
-
-            var newOptions = {
-                polygonHierarchy : {
-                    positions : options.positions
-                },
-                height : options.height,
-                extrudedHeight : options.extrudedHeight,
-                ellipsoid : options.ellipsoid,
-                granularity : options.granularity,
-                perPositionHeight : options.perPositionHeight,
-                arcType: options.arcType,
-                offsetAttribute : options.offsetAttribute
-            };
-            return new PolygonOutlineGeometry(newOptions);
-        };
-
-        /**
-         * Computes the geometric representation of a polygon outline, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {PolygonOutlineGeometry} polygonGeometry A description of the polygon outline.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        PolygonOutlineGeometry.createGeometry = function(polygonGeometry) {
-            var ellipsoid = polygonGeometry._ellipsoid;
-            var granularity = polygonGeometry._granularity;
-            var polygonHierarchy = polygonGeometry._polygonHierarchy;
-            var perPositionHeight = polygonGeometry._perPositionHeight;
-            var arcType = polygonGeometry._arcType;
-
-            var polygons = PolygonGeometryLibrary.PolygonGeometryLibrary.polygonOutlinesFromHierarchy(polygonHierarchy, !perPositionHeight, ellipsoid);
-
-            if (polygons.length === 0) {
-                return undefined;
-            }
-
-            var geometryInstance;
-            var geometries = [];
-            var minDistance = _Math.CesiumMath.chordLength(granularity, ellipsoid.maximumRadius);
-
-            var height = polygonGeometry._height;
-            var extrudedHeight = polygonGeometry._extrudedHeight;
-            var extrude = polygonGeometry._perPositionHeightExtrude || !_Math.CesiumMath.equalsEpsilon(height, extrudedHeight, 0, _Math.CesiumMath.EPSILON2);
-            var offsetValue;
-            var i;
-            if (extrude) {
-                for (i = 0; i < polygons.length; i++) {
-                    geometryInstance = createGeometryFromPositionsExtruded(ellipsoid, polygons[i], minDistance, perPositionHeight, arcType);
-                    geometryInstance.geometry = PolygonGeometryLibrary.PolygonGeometryLibrary.scaleToGeodeticHeightExtruded(geometryInstance.geometry, height, extrudedHeight, ellipsoid, perPositionHeight);
-                    if (when.defined(polygonGeometry._offsetAttribute)) {
-                        var size = geometryInstance.geometry.attributes.position.values.length / 3;
-                        var offsetAttribute = new Uint8Array(size);
-                        if (polygonGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                            offsetAttribute = arrayFill.arrayFill(offsetAttribute, 1, 0, size / 2);
-                        } else {
-                            offsetValue = polygonGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                            offsetAttribute = arrayFill.arrayFill(offsetAttribute, offsetValue);
-                        }
-
-                        geometryInstance.geometry.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                            componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                            componentsPerAttribute : 1,
-                            values : offsetAttribute
-                        });
-                    }
-                    geometries.push(geometryInstance);
-                }
-            } else {
-                for (i = 0; i < polygons.length; i++) {
-                    geometryInstance = createGeometryFromPositions(ellipsoid, polygons[i], minDistance, perPositionHeight, arcType);
-                    geometryInstance.geometry.attributes.position.values = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(geometryInstance.geometry.attributes.position.values, height, ellipsoid, !perPositionHeight);
-
-                    if (when.defined(polygonGeometry._offsetAttribute)) {
-                        var length = geometryInstance.geometry.attributes.position.values.length;
-                        var applyOffset = new Uint8Array(length / 3);
-                        offsetValue = polygonGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                        arrayFill.arrayFill(applyOffset, offsetValue);
-                        geometryInstance.geometry.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                            componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                            componentsPerAttribute : 1,
-                            values: applyOffset
-                        });
-                    }
-
-                    geometries.push(geometryInstance);
-                }
-            }
-
-            var geometry = GeometryPipeline.GeometryPipeline.combineInstances(geometries)[0];
-            var boundingSphere = BoundingSphere.BoundingSphere.fromVertices(geometry.attributes.position.values);
-
-            return new GeometryAttribute.Geometry({
-                attributes : geometry.attributes,
-                indices : geometry.indices,
-                primitiveType : geometry.primitiveType,
-                boundingSphere : boundingSphere,
-                offsetAttribute : polygonGeometry._offsetAttribute
-            });
-        };
-
-    function createPolygonOutlineGeometry(polygonGeometry, offset) {
-        if (when.defined(offset)) {
-            polygonGeometry = PolygonOutlineGeometry.unpack(polygonGeometry, offset);
-        }
-        polygonGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(polygonGeometry._ellipsoid);
-        return PolygonOutlineGeometry.createGeometry(polygonGeometry);
-    }
-
-    return createPolygonOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createPolylineGeometry.js b/public/libs/Cesium/Workers/createPolylineGeometry.js
deleted file mode 100644
index 960b363..0000000
--- a/public/libs/Cesium/Workers/createPolylineGeometry.js
+++ /dev/null
@@ -1,583 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './VertexFormat-fe4db402', './arrayRemoveDuplicates-f0b089b1', './ArcType-66bc286a', './EllipsoidRhumbLine-f161e674', './EllipsoidGeodesic-84507801', './PolylinePipeline-a9f32196', './Color-69f1845f'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, IntersectionTests, Plane, VertexFormat, arrayRemoveDuplicates, ArcType, EllipsoidRhumbLine, EllipsoidGeodesic, PolylinePipeline, Color) { 'use strict';
-
-    var scratchInterpolateColorsArray = [];
-
-        function interpolateColors(p0, p1, color0, color1, numPoints) {
-            var colors = scratchInterpolateColorsArray;
-            colors.length = numPoints;
-            var i;
-
-            var r0 = color0.red;
-            var g0 = color0.green;
-            var b0 = color0.blue;
-            var a0 = color0.alpha;
-
-            var r1 = color1.red;
-            var g1 = color1.green;
-            var b1 = color1.blue;
-            var a1 = color1.alpha;
-
-            if (Color.Color.equals(color0, color1)) {
-                for (i = 0; i < numPoints; i++) {
-                    colors[i] = Color.Color.clone(color0);
-                }
-                return colors;
-            }
-
-            var redPerVertex = (r1 - r0) / numPoints;
-            var greenPerVertex = (g1 - g0) / numPoints;
-            var bluePerVertex = (b1 - b0) / numPoints;
-            var alphaPerVertex = (a1 - a0) / numPoints;
-
-            for (i = 0; i < numPoints; i++) {
-                colors[i] = new Color.Color(r0 + i * redPerVertex, g0 + i * greenPerVertex, b0 + i * bluePerVertex, a0 + i * alphaPerVertex);
-            }
-
-            return colors;
-        }
-
-        /**
-         * A description of a polyline modeled as a line strip; the first two positions define a line segment,
-         * and each additional position defines a line segment from the previous position. The polyline is capable of
-         * displaying with a material.
-         *
-         * @alias PolylineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of {@link Cartesian3} defining the positions in the polyline as a line strip.
-         * @param {Number} [options.width=1.0] The width in pixels.
-         * @param {Color[]} [options.colors] An Array of {@link Color} defining the per vertex or per segment colors.
-         * @param {Boolean} [options.colorsPerVertex=false] A boolean that determines whether the colors will be flat across each segment of the line or interpolated across the vertices.
-         * @param {ArcType} [options.arcType=ArcType.GEODESIC] The type of line the polyline segments must follow.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude if options.arcType is not ArcType.NONE. Determines the number of positions in the buffer.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         *
-         * @exception {DeveloperError} At least two positions are required.
-         * @exception {DeveloperError} width must be greater than or equal to one.
-         * @exception {DeveloperError} colors has an invalid length.
-         *
-         * @see PolylineGeometry#createGeometry
-         *
-         * @demo {@link https://cesiumjs.org/Cesium/Apps/Sandcastle/index.html?src=Polyline.html|Cesium Sandcastle Polyline Demo}
-         *
-         * @example
-         * // A polyline with two connected line segments
-         * var polyline = new Cesium.PolylineGeometry({
-         *   positions : Cesium.Cartesian3.fromDegreesArray([
-         *     0.0, 0.0,
-         *     5.0, 0.0,
-         *     5.0, 5.0
-         *   ]),
-         *   width : 10.0
-         * });
-         * var geometry = Cesium.PolylineGeometry.createGeometry(polyline);
-         */
-        function PolylineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var positions = options.positions;
-            var colors = options.colors;
-            var width = when.defaultValue(options.width, 1.0);
-            var hMax = when.defaultValue(options.hMax, -1.0);
-            var colorsPerVertex = when.defaultValue(options.colorsPerVertex, false);
-
-            //>>includeStart('debug', pragmas.debug);
-            if ((!when.defined(positions)) || (positions.length < 2)) {
-                throw new Check.DeveloperError('At least two positions are required.');
-            }
-            if (typeof width !== 'number') {
-                throw new Check.DeveloperError('width must be a number');
-            }
-            if (when.defined(colors) && ((colorsPerVertex && colors.length < positions.length) || (!colorsPerVertex && colors.length < positions.length - 1))) {
-                throw new Check.DeveloperError('colors has an invalid length.');
-            }
-            //>>includeEnd('debug');
-
-            this._positions = positions;
-            this._colors = colors;
-            this._width = width;
-            this._hMax = hMax;
-            this._colorsPerVertex = colorsPerVertex;
-            this._dist = options.dist;
-            this._period = options.period;
-            this._vertexFormat = VertexFormat.VertexFormat.clone(when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT));
-
-            this._followSurface = when.defaultValue(options.followSurface, true);
-            if (when.defined(options.followSurface)) {
-                buildModuleUrl.deprecationWarning('PolylineGeometry.followSurface', 'PolylineGeometry.followSurface is deprecated and will be removed in Cesium 1.55. Use PolylineGeometry.arcType instead.');
-                options.arcType = options.followSurface ? ArcType.ArcType.GEODESIC : ArcType.ArcType.NONE;
-            }
-            this._arcType = when.defaultValue(options.arcType, ArcType.ArcType.GEODESIC);
-            this._followSurface = (this._arcType !== ArcType.ArcType.NONE);
-
-            this._granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84));
-            this._workerName = 'createPolylineGeometry';
-
-            var numComponents = 1 + positions.length * Cartographic.Cartesian3.packedLength;
-            numComponents += when.defined(colors) ? 1 + colors.length * Color.Color.packedLength : 1;
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = numComponents + Cartesian2.Ellipsoid.packedLength + VertexFormat.VertexFormat.packedLength + 4 + 2;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {PolylineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        PolylineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var positions = value._positions;
-            var length = positions.length;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                Cartographic.Cartesian3.pack(positions[i], array, startingIndex);
-            }
-
-            var colors = value._colors;
-            length = when.defined(colors) ? colors.length : 0.0;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Color.Color.packedLength) {
-                Color.Color.pack(colors[i], array, startingIndex);
-            }
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._width;
-            array[startingIndex++] = value._colorsPerVertex ? 1.0 : 0.0;
-            array[startingIndex++] = value._arcType;
-            array[startingIndex++]   = value._granularity;
-            array[startingIndex++]   = value._hMax;
-            array[startingIndex++] = value._dist;
-            array[startingIndex] = value._period;
-
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            positions : undefined,
-            colors : undefined,
-            ellipsoid : scratchEllipsoid,
-            vertexFormat : scratchVertexFormat,
-            width : undefined,
-            colorsPerVertex : undefined,
-            arcType : undefined,
-            granularity : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {PolylineGeometry} [result] The object into which to store the result.
-         * @returns {PolylineGeometry} The modified result parameter or a new PolylineGeometry instance if one was not provided.
-         */
-        PolylineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var length = array[startingIndex++];
-            var positions = new Array(length);
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                positions[i] = Cartographic.Cartesian3.unpack(array, startingIndex);
-            }
-
-            length = array[startingIndex++];
-            var colors = length > 0 ? new Array(length) : undefined;
-
-            for (i = 0; i < length; ++i, startingIndex += Color.Color.packedLength) {
-                colors[i] = Color.Color.unpack(array, startingIndex);
-            }
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var width = array[startingIndex++];
-            var colorsPerVertex = array[startingIndex++] === 1.0;
-            var arcType = array[startingIndex++];
-            var granularity = array[startingIndex++];
-            var hMax = array[startingIndex++];
-            var dist = array[startingIndex++] == 1.0;
-            var period = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.positions = positions;
-                scratchOptions.colors = colors;
-                scratchOptions.width = width;
-                scratchOptions.colorsPerVertex = colorsPerVertex;
-                scratchOptions.arcType = arcType;
-                scratchOptions.granularity = granularity;
-                scratchOptions.hMax = hMax;
-                scratchOptions.dist = dist;
-                scratchOptions.period = period;
-                return new PolylineGeometry(scratchOptions);
-            }
-
-            result._positions = positions;
-            result._colors = colors;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._width = width;
-            result._colorsPerVertex = colorsPerVertex;
-            result._arcType = arcType;
-            result._granularity = granularity;
-            result._hMax = hMax;
-            result._dist = dist;
-            result._period = period;
-
-            return result;
-        };
-
-        var scratchCartesian3 = new Cartographic.Cartesian3();
-        var scratchPosition = new Cartographic.Cartesian3();
-        var scratchPrevPosition = new Cartographic.Cartesian3();
-        var scratchNextPosition = new Cartographic.Cartesian3();
-
-        /**
-         * Computes the geometric representation of a polyline, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {PolylineGeometry} polylineGeometry A description of the polyline.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        PolylineGeometry.createGeometry = function(polylineGeometry) {
-            var width = polylineGeometry._width;
-            var hMax = polylineGeometry._hMax;
-            var vertexFormat = polylineGeometry._vertexFormat;
-            var colors = polylineGeometry._colors;
-            var colorsPerVertex = polylineGeometry._colorsPerVertex;
-            var arcType = polylineGeometry._arcType;
-            var granularity = polylineGeometry._granularity;
-            var ellipsoid = polylineGeometry._ellipsoid;
-            var hasDist = polylineGeometry._dist;
-            var period = polylineGeometry._period;
-
-            var i;
-            var j;
-            var k;
-
-            var positions = arrayRemoveDuplicates.arrayRemoveDuplicates(polylineGeometry._positions, Cartographic.Cartesian3.equalsEpsilon);
-            var positionsLength = positions.length;
-
-            // A width of a pixel or less is not a valid geometry, but in order to support external data
-            // that may have errors we treat this as an empty geometry.
-            if (positionsLength < 2 || width <= 0.0) {
-                return undefined;
-            }
-
-            if (arcType === ArcType.ArcType.GEODESIC || arcType === ArcType.ArcType.RHUMB) {
-                var subdivisionSize;
-                var numberOfPointsFunction;
-                if (arcType === ArcType.ArcType.GEODESIC) {
-                    subdivisionSize = _Math.CesiumMath.chordLength(granularity, ellipsoid.maximumRadius);
-                    numberOfPointsFunction = PolylinePipeline.PolylinePipeline.numberOfPoints;
-                } else {
-                    subdivisionSize = granularity;
-                    numberOfPointsFunction = PolylinePipeline.PolylinePipeline.numberOfPointsRhumbLine;
-                }
-
-                var heights = PolylinePipeline.PolylinePipeline.extractHeights(positions, ellipsoid);
-
-                if (when.defined(colors)) {
-                    var colorLength = 1;
-                    for (i = 0; i < positionsLength - 1; ++i) {
-                        colorLength += numberOfPointsFunction(positions[i], positions[i + 1], subdivisionSize);
-                    }
-
-                    var newColors = new Array(colorLength);
-                    var newColorIndex = 0;
-
-                    for (i = 0; i < positionsLength - 1; ++i) {
-                        var p0 = positions[i];
-                        var p1 = positions[i + 1];
-                        var c0 = colors[i];
-
-                        var numColors = numberOfPointsFunction(p0, p1, subdivisionSize);
-                        if (colorsPerVertex && i < colorLength) {
-                            var c1 = colors[i + 1];
-                            var interpolatedColors = interpolateColors(p0, p1, c0, c1, numColors);
-                            var interpolatedColorsLength = interpolatedColors.length;
-                            for (j = 0; j < interpolatedColorsLength; ++j) {
-                                newColors[newColorIndex++] = interpolatedColors[j];
-                            }
-                        } else {
-                            for (j = 0; j < numColors; ++j) {
-                                newColors[newColorIndex++] = Color.Color.clone(c0);
-                            }
-                        }
-                    }
-
-                    newColors[newColorIndex] = Color.Color.clone(colors[colors.length - 1]);
-                    colors = newColors;
-
-                    scratchInterpolateColorsArray.length = 0;
-                }
-
-                if (arcType === ArcType.ArcType.GEODESIC) {
-                    positions = PolylinePipeline.PolylinePipeline.generateCartesianArc({
-                        positions: positions,
-                        minDistance: subdivisionSize,
-                        ellipsoid: ellipsoid,
-                        height: heights,
-                        hMax:hMax
-                    });
-                } else {
-                    positions = PolylinePipeline.PolylinePipeline.generateCartesianRhumbArc({
-                        positions: positions,
-                        granularity: subdivisionSize,
-                        ellipsoid: ellipsoid,
-                        height: heights
-                    });
-                }
-            }
-
-            positionsLength = positions.length;
-            var size = positionsLength * 4.0 - 4.0;
-
-            var finalPositions = new Float64Array(size * 3);
-            var prevPositions = new Float64Array(size * 3);
-            var nextPositions = new Float64Array(size * 3);
-            var expandAndWidth = new Float32Array(size * 2);
-            var st = vertexFormat.st ? new Float32Array(size * 2) : undefined;
-            var finalColors = when.defined(colors) ? new Uint8Array(size * 4) : undefined;
-            var dist = hasDist ? new Float32Array(size * 3) : undefined;
-
-            var positionIndex = 0;
-            var expandAndWidthIndex = 0;
-            var stIndex = 0;
-            var colorIndex = 0;
-            var distIndex = 0;
-            var position;
-            var curDist = 0;
-
-            for (j = 0; j < positionsLength; ++j) {
-                if (j === 0) {
-                    position = scratchCartesian3;
-                    Cartographic.Cartesian3.subtract(positions[0], positions[1], position);
-                    Cartographic.Cartesian3.add(positions[0], position, position);
-                } else {
-                    position = positions[j - 1];
-                }
-
-                Cartographic.Cartesian3.clone(position, scratchPrevPosition);
-                Cartographic.Cartesian3.clone(positions[j], scratchPosition);
-
-                if (j === positionsLength - 1) {
-                    position = scratchCartesian3;
-                    Cartographic.Cartesian3.subtract(positions[positionsLength - 1], positions[positionsLength - 2], position);
-                    Cartographic.Cartesian3.add(positions[positionsLength - 1], position, position);
-                } else {
-                    position = positions[j + 1];
-                }
-
-                Cartographic.Cartesian3.clone(position, scratchNextPosition);
-
-                var color0, color1;
-                if (when.defined(finalColors)) {
-                    if (j !== 0 && !colorsPerVertex) {
-                        color0 = colors[j - 1];
-                    } else {
-                        color0 = colors[j];
-                    }
-
-                    if (j !== positionsLength - 1) {
-                        color1 = colors[j];
-                    }
-                }
-
-                var startK = j === 0 ? 2 : 0;
-                var endK = j === positionsLength - 1 ? 2 : 4;
-
-                for (k = startK; k < endK; ++k) {
-                    Cartographic.Cartesian3.pack(scratchPosition, finalPositions, positionIndex);
-                    Cartographic.Cartesian3.pack(scratchPrevPosition, prevPositions, positionIndex);
-                    Cartographic.Cartesian3.pack(scratchNextPosition, nextPositions, positionIndex);
-                    positionIndex += 3;
-
-                    var direction = (k - 2 < 0) ? -1.0 : 1.0;
-                    var dd = 2 * (k % 2) - 1;
-                    var u = dd * j/positionsLength;
-                    hMax>0.0?expandAndWidth[expandAndWidthIndex++] = u:expandAndWidth[expandAndWidthIndex++] = dd;
-                    // expandAndWidth[expandAndWidthIndex++] = 2 * (k % 2) - 1;       // expand direction
-                    expandAndWidth[expandAndWidthIndex++] = direction * width;
-
-                    if (vertexFormat.st) {
-                        st[stIndex++] = j / (positionsLength - 1);
-                        st[stIndex++] = Math.max(expandAndWidth[expandAndWidthIndex - 2], 0.0);
-                    }
-
-                    if (when.defined(finalColors)) {
-                        var color = (k < 2) ? color0 : color1;
-
-                        finalColors[colorIndex++] = Color.Color.floatToByte(color.red);
-                        finalColors[colorIndex++] = Color.Color.floatToByte(color.green);
-                        finalColors[colorIndex++] = Color.Color.floatToByte(color.blue);
-                        finalColors[colorIndex++] = Color.Color.floatToByte(color.alpha);
-                    }
-
-                    if(hasDist){
-                        dist[distIndex * 3] = curDist;
-                        distIndex++;
-                    }
-                }
-                curDist += Cartographic.Cartesian3.distance(position, positions[j]);
-            }
-
-            if(hasDist){
-                var maxDis = curDist;
-                var randomStart = Math.random() * (period > 0.0 ? period : maxDis);
-                for(j = 0; j < size; j++){
-                    dist[j * 3 + 1] = maxDis;
-                    dist[j * 3 + 2] = randomStart;
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-
-            attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : finalPositions
-            });
-
-            attributes.prevPosition = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : prevPositions
-            });
-
-            attributes.nextPosition = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : nextPositions
-            });
-
-            attributes.expandAndWidth = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                componentsPerAttribute : 2,
-                values : expandAndWidth
-            });
-
-            if (vertexFormat.st) {
-                attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : st
-                });
-            }
-
-            if (when.defined(finalColors)) {
-                attributes.color = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 4,
-                    values : finalColors,
-                    normalize : true
-                });
-            }
-
-            if (hasDist) {
-                attributes.dist = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : dist
-                });
-            }
-
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(size, positionsLength * 6 - 6);
-            var index = 0;
-            var indicesIndex = 0;
-            var length = positionsLength - 1.0;
-            for (j = 0; j < length; ++j) {
-                indices[indicesIndex++] = index;
-                indices[indicesIndex++] = index + 2;
-                indices[indicesIndex++] = index + 1;
-
-                indices[indicesIndex++] = index + 1;
-                indices[indicesIndex++] = index + 2;
-                indices[indicesIndex++] = index + 3;
-
-                index += 4;
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES,
-                boundingSphere : BoundingSphere.BoundingSphere.fromPoints(positions),
-                geometryType : GeometryAttribute.GeometryType.POLYLINES
-            });
-        };
-
-    function createPolylineGeometry(polylineGeometry, offset) {
-        if (when.defined(offset)) {
-            polylineGeometry = PolylineGeometry.unpack(polylineGeometry, offset);
-        }
-        polylineGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(polylineGeometry._ellipsoid);
-        return PolylineGeometry.createGeometry(polylineGeometry);
-    }
-
-    return createPolylineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createPolylineVolumeGeometry.js b/public/libs/Cesium/Workers/createPolylineVolumeGeometry.js
deleted file mode 100644
index 228fb46..0000000
--- a/public/libs/Cesium/Workers/createPolylineVolumeGeometry.js
+++ /dev/null
@@ -1,414 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './VertexFormat-fe4db402', './arrayRemoveDuplicates-f0b089b1', './BoundingRectangle-dc808c42', './EllipsoidTangentPlane-e324bfa4', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './PolylineVolumeGeometryLibrary-5bb7662e', './EllipsoidGeodesic-84507801', './PolylinePipeline-a9f32196'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, VertexFormat, arrayRemoveDuplicates, BoundingRectangle, EllipsoidTangentPlane, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, PolylineVolumeGeometryLibrary, EllipsoidGeodesic, PolylinePipeline) { 'use strict';
-
-    function computeAttributes(result, shape, boundingRectangle, vertexFormat) {
-            var combinedPositions = result.combinedPositions;
-            var combinedLocalPositions = result.combinedLocalPositions;
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            if (vertexFormat.position) {
-                attributes.position = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : combinedPositions
-                });
-            }
-            var shapeLength = shape.length;
-            var vertexCount = combinedPositions.length / 3;
-            var length = (vertexCount - shapeLength * 2) / (shapeLength * 2);
-            var firstEndIndices = PolygonPipeline.PolygonPipeline.triangulate(shape);
-
-            var indicesCount = (length - 1) * (shapeLength) * 6 + firstEndIndices.length * 2;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(vertexCount, indicesCount);
-            var i, j;
-            var ll, ul, ur, lr;
-            var offset = shapeLength * 2;
-            var index = 0;
-            for (i = 0; i < length - 1; i++) {
-                for (j = 0; j < shapeLength - 1; j++) {
-                    ll = j * 2 + i * shapeLength * 2;
-                    lr = ll + offset;
-                    ul = ll + 1;
-                    ur = ul + offset;
-
-                    indices[index++] = ul;
-                    indices[index++] = ll;
-                    indices[index++] = ur;
-                    indices[index++] = ur;
-                    indices[index++] = ll;
-                    indices[index++] = lr;
-                }
-                ll = shapeLength * 2 - 2 + i * shapeLength * 2;
-                ul = ll + 1;
-                ur = ul + offset;
-                lr = ll + offset;
-
-                indices[index++] = ul;
-                indices[index++] = ll;
-                indices[index++] = ur;
-                indices[index++] = ur;
-                indices[index++] = ll;
-                indices[index++] = lr;
-            }
-
-            if (vertexFormat.st || vertexFormat.tangent || vertexFormat.bitangent) { // st required for tangent/bitangent calculation
-                var st = new Float32Array(vertexCount * 2);
-                var lengthSt = 1 / (length - 1);
-                var heightSt = 1 / (boundingRectangle.height);
-                var heightOffset = boundingRectangle.height / 2;
-                var s, t;
-                var stindex = 0;
-                for (i = 0; i < length; i++) {
-                    s = i * lengthSt;
-                    t = heightSt * (shape[0].y + heightOffset);
-                    st[stindex++] = s;
-                    st[stindex++] = t;
-                    for (j = 1; j < shapeLength; j++) {
-                        t = heightSt * (shape[j].y + heightOffset);
-                        st[stindex++] = s;
-                        st[stindex++] = t;
-                        st[stindex++] = s;
-                        st[stindex++] = t;
-                    }
-                    t = heightSt * (shape[0].y + heightOffset);
-                    st[stindex++] = s;
-                    st[stindex++] = t;
-                }
-                for (j = 0; j < shapeLength; j++) {
-                    s = 0;
-                    t = heightSt * (shape[j].y + heightOffset);
-                    st[stindex++] = s;
-                    st[stindex++] = t;
-                }
-                for (j = 0; j < shapeLength; j++) {
-                    s = (length - 1) * lengthSt;
-                    t = heightSt * (shape[j].y + heightOffset);
-                    st[stindex++] = s;
-                    st[stindex++] = t;
-                }
-
-                attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : new Float32Array(st)
-                });
-            }
-
-            var endOffset = vertexCount - shapeLength * 2;
-            for (i = 0; i < firstEndIndices.length; i += 3) {
-                var v0 = firstEndIndices[i] + endOffset;
-                var v1 = firstEndIndices[i + 1] + endOffset;
-                var v2 = firstEndIndices[i + 2] + endOffset;
-
-                indices[index++] = v0;
-                indices[index++] = v1;
-                indices[index++] = v2;
-                indices[index++] = v2 + shapeLength;
-                indices[index++] = v1 + shapeLength;
-                indices[index++] = v0 + shapeLength;
-            }
-
-            var geometry = new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                boundingSphere : BoundingSphere.BoundingSphere.fromVertices(combinedPositions),
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES
-            });
-
-            if (vertexFormat.normal) {
-                geometry = GeometryPipeline.GeometryPipeline.computeNormal(geometry);
-            }
-
-            if (vertexFormat.tangent || vertexFormat.bitangent) {
-                try {
-                    geometry = GeometryPipeline.GeometryPipeline.computeTangentAndBitangent(geometry);
-                } catch (e) {
-                    buildModuleUrl.oneTimeWarning('polyline-volume-tangent-bitangent', 'Unable to compute tangents and bitangents for polyline volume geometry');
-                    //TODO https://github.com/AnalyticalGraphicsInc/cesium/issues/3609
-                }
-
-                if (!vertexFormat.tangent) {
-                    geometry.attributes.tangent = undefined;
-                }
-                if (!vertexFormat.bitangent) {
-                    geometry.attributes.bitangent = undefined;
-                }
-                if (!vertexFormat.st) {
-                    geometry.attributes.st = undefined;
-                }
-            }
-
-            if(when.defined(combinedLocalPositions)) {
-                geometry.attributes.position.values = combinedLocalPositions;
-                geometry.attributes.position.componentDatatype = ComponentDatatype.ComponentDatatype.FLOAT;
-            }
-
-            return geometry;
-        }
-
-        /**
-         * A description of a polyline with a volume (a 2D shape extruded along a polyline).
-         *
-         * @alias PolylineVolumeGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.polylinePositions An array of {@link Cartesain3} positions that define the center of the polyline volume.
-         * @param {Cartesian2[]} options.shapePositions An array of {@link Cartesian2} positions that define the shape to be extruded along the polyline
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {CornerType} [options.cornerType=CornerType.ROUNDED] Determines the style of the corners.
-         *
-         * @see PolylineVolumeGeometry#createGeometry
-         *
-         * @demo {@link https://cesiumjs.org/Cesium/Apps/Sandcastle/index.html?src=Polyline%20Volume.html|Cesium Sandcastle Polyline Volume Demo}
-         *
-         * @example
-         * function computeCircle(radius) {
-         *   var positions = [];
-         *   for (var i = 0; i < 360; i++) {
-         *     var radians = Cesium.Math.toRadians(i);
-         *     positions.push(new Cesium.Cartesian2(radius * Math.cos(radians), radius * Math.sin(radians)));
-         *   }
-         *   return positions;
-         * }
-         *
-         * var volume = new Cesium.PolylineVolumeGeometry({
-         *   vertexFormat : Cesium.VertexFormat.POSITION_ONLY,
-         *   polylinePositions : Cesium.Cartesian3.fromDegreesArray([
-         *     -72.0, 40.0,
-         *     -70.0, 35.0
-         *   ]),
-         *   shapePositions : computeCircle(100000.0)
-         * });
-         */
-        function PolylineVolumeGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var positions = options.polylinePositions;
-            var shape = options.shapePositions;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(positions)) {
-                throw new Check.DeveloperError('options.polylinePositions is required.');
-            }
-            if (!when.defined(shape)) {
-                throw new Check.DeveloperError('options.shapePositions is required.');
-            }
-            //>>includeEnd('debug');
-
-            this._positions = positions;
-            this._shape = shape;
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84));
-            this._cornerType = when.defaultValue(options.cornerType, PolylineVolumeGeometryLibrary.CornerType.ROUNDED);
-            this._vertexFormat = VertexFormat.VertexFormat.clone(when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT));
-            this._granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            this._workerName = 'createPolylineVolumeGeometry';
-            this.enuCenter = when.defaultValue(options.enuCenter, Cartographic.Cartesian3.ZERO);
-            var numComponents = 1 + positions.length * Cartographic.Cartesian3.packedLength;
-            numComponents += 1 + shape.length * Cartesian2.Cartesian2.packedLength + Cartographic.Cartesian3.packedLength;
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = numComponents + Cartesian2.Ellipsoid.packedLength + VertexFormat.VertexFormat.packedLength + 2;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {PolylineVolumeGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        PolylineVolumeGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var positions = value._positions;
-            var length = positions.length;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                Cartographic.Cartesian3.pack(positions[i], array, startingIndex);
-            }
-
-            var shape = value._shape;
-            length = shape.length;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Cartesian2.Cartesian2.packedLength) {
-                Cartesian2.Cartesian2.pack(shape[i], array, startingIndex);
-            }
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._cornerType;
-            array[startingIndex++]   = value._granularity;
-            Cartographic.Cartesian3.pack(value.enuCenter, array, startingIndex);
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            polylinePositions : undefined,
-            shapePositions : undefined,
-            ellipsoid : scratchEllipsoid,
-            vertexFormat : scratchVertexFormat,
-            cornerType : undefined,
-            granularity : undefined,
-            enuCenter : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {PolylineVolumeGeometry} [result] The object into which to store the result.
-         * @returns {PolylineVolumeGeometry} The modified result parameter or a new PolylineVolumeGeometry instance if one was not provided.
-         */
-        PolylineVolumeGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var length = array[startingIndex++];
-            var positions = new Array(length);
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                positions[i] = Cartographic.Cartesian3.unpack(array, startingIndex);
-            }
-
-            length = array[startingIndex++];
-            var shape = new Array(length);
-
-            for (i = 0; i < length; ++i, startingIndex += Cartesian2.Cartesian2.packedLength) {
-                shape[i] = Cartesian2.Cartesian2.unpack(array, startingIndex);
-            }
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var cornerType = array[startingIndex++];
-            var granularity = array[startingIndex++];
-            var enuCenter;
-            enuCenter = Cartographic.Cartesian3.unpack(array, startingIndex);
-            if (!when.defined(result)) {
-                scratchOptions.polylinePositions = positions;
-                scratchOptions.shapePositions = shape;
-                scratchOptions.cornerType = cornerType;
-                scratchOptions.granularity = granularity;
-                scratchOptions.enuCenter = enuCenter;
-                return new PolylineVolumeGeometry(scratchOptions);
-            }
-
-            result._positions = positions;
-            result._shape = shape;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._cornerType = cornerType;
-            result._granularity = granularity;
-            result.enuCenter = enuCenter;
-
-            return result;
-        };
-
-        var brScratch = new BoundingRectangle.BoundingRectangle();
-
-        /**
-         * Computes the geometric representation of a polyline with a volume, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {PolylineVolumeGeometry} polylineVolumeGeometry A description of the polyline volume.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        PolylineVolumeGeometry.createGeometry = function(polylineVolumeGeometry) {
-            var positions = polylineVolumeGeometry._positions;
-            var cleanPositions = arrayRemoveDuplicates.arrayRemoveDuplicates(positions, Cartographic.Cartesian3.equalsEpsilon);
-            var len = cleanPositions.length;
-            var copyPositions = new Array(len);
-            for(var i = 0;i < len;i++){
-                copyPositions[i] = Cartographic.Cartesian3.clone(cleanPositions[i]);
-            }
-            var shape2D = polylineVolumeGeometry._shape;
-            shape2D = PolylineVolumeGeometryLibrary.PolylineVolumeGeometryLibrary.removeDuplicatesFromShape(shape2D);
-
-            if (cleanPositions.length < 2 || shape2D.length < 3) {
-                return undefined;
-            }
-
-            if (PolygonPipeline.PolygonPipeline.computeWindingOrder2D(shape2D) === PolygonPipeline.WindingOrder.CLOCKWISE) {
-                shape2D.reverse();
-            }
-            var boundingRectangle = BoundingRectangle.BoundingRectangle.fromPoints(shape2D, brScratch);
-
-            var res = {};
-            res.combinedPositions = PolylineVolumeGeometryLibrary.PolylineVolumeGeometryLibrary.computePositions(copyPositions, shape2D, boundingRectangle, polylineVolumeGeometry, true);
-            if(!Cartographic.Cartesian3.equals(polylineVolumeGeometry.enuCenter, Cartographic.Cartesian3.ZERO)) {
-                var cleanPositionsClone = new Array(len);
-                for(var i = 0;i < len;i++){
-                    cleanPositionsClone[i] = Cartographic.Cartesian3.clone(cleanPositions[i]);
-                }
-                res.combinedLocalPositions = PolylineVolumeGeometryLibrary.PolylineVolumeGeometryLibrary.computeLocalPositions(cleanPositionsClone, shape2D, boundingRectangle, polylineVolumeGeometry, true, polylineVolumeGeometry.enuCenter);
-            }
-            return computeAttributes(res, shape2D, boundingRectangle, polylineVolumeGeometry._vertexFormat);
-        };
-
-    function createPolylineVolumeGeometry(polylineVolumeGeometry, offset) {
-        if (when.defined(offset)) {
-            polylineVolumeGeometry = PolylineVolumeGeometry.unpack(polylineVolumeGeometry, offset);
-        }
-        polylineVolumeGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(polylineVolumeGeometry._ellipsoid);
-        return PolylineVolumeGeometry.createGeometry(polylineVolumeGeometry);
-    }
-
-    return createPolylineVolumeGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createPolylineVolumeOutlineGeometry.js b/public/libs/Cesium/Workers/createPolylineVolumeOutlineGeometry.js
deleted file mode 100644
index d6fecb2..0000000
--- a/public/libs/Cesium/Workers/createPolylineVolumeOutlineGeometry.js
+++ /dev/null
@@ -1,292 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './arrayRemoveDuplicates-f0b089b1', './BoundingRectangle-dc808c42', './EllipsoidTangentPlane-e324bfa4', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './PolylineVolumeGeometryLibrary-5bb7662e', './EllipsoidGeodesic-84507801', './PolylinePipeline-a9f32196'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, IntersectionTests, Plane, arrayRemoveDuplicates, BoundingRectangle, EllipsoidTangentPlane, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, PolylineVolumeGeometryLibrary, EllipsoidGeodesic, PolylinePipeline) { 'use strict';
-
-    function computeAttributes(positions, shape) {
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : positions
-            });
-
-            var shapeLength = shape.length;
-            var vertexCount = attributes.position.values.length / 3;
-            var positionLength = positions.length / 3;
-            var shapeCount = positionLength / shapeLength;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(vertexCount, 2 * shapeLength * (shapeCount + 1));
-            var i, j;
-            var index = 0;
-            i = 0;
-            var offset = i * shapeLength;
-            for (j = 0; j < shapeLength - 1; j++) {
-                indices[index++] = j + offset;
-                indices[index++] = j + offset + 1;
-            }
-            indices[index++] = shapeLength - 1 + offset;
-            indices[index++] = offset;
-
-            i = shapeCount - 1;
-            offset = i * shapeLength;
-            for (j = 0; j < shapeLength - 1; j++) {
-                indices[index++] = j + offset;
-                indices[index++] = j + offset + 1;
-            }
-            indices[index++] = shapeLength - 1 + offset;
-            indices[index++] = offset;
-
-            for (i = 0; i < shapeCount - 1; i++) {
-                var firstOffset = shapeLength * i;
-                var secondOffset = firstOffset + shapeLength;
-                for (j = 0; j < shapeLength; j++) {
-                    indices[index++] = j + firstOffset;
-                    indices[index++] = j + secondOffset;
-                }
-            }
-
-            var geometry = new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : IndexDatatype.IndexDatatype.createTypedArray(vertexCount, indices),
-                boundingSphere : BoundingSphere.BoundingSphere.fromVertices(positions),
-                primitiveType : PrimitiveType.PrimitiveType.LINES
-            });
-
-            return geometry;
-        }
-
-        /**
-         * A description of a polyline with a volume (a 2D shape extruded along a polyline).
-         *
-         * @alias PolylineVolumeOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.polylinePositions An array of positions that define the center of the polyline volume.
-         * @param {Cartesian2[]} options.shapePositions An array of positions that define the shape to be extruded along the polyline
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {CornerType} [options.cornerType=CornerType.ROUNDED] Determines the style of the corners.
-         *
-         * @see PolylineVolumeOutlineGeometry#createGeometry
-         *
-         * @example
-         * function computeCircle(radius) {
-         *   var positions = [];
-         *   for (var i = 0; i < 360; i++) {
-         *     var radians = Cesium.Math.toRadians(i);
-         *     positions.push(new Cesium.Cartesian2(radius * Math.cos(radians), radius * Math.sin(radians)));
-         *   }
-         *   return positions;
-         * }
-         *
-         * var volumeOutline = new Cesium.PolylineVolumeOutlineGeometry({
-         *   polylinePositions : Cesium.Cartesian3.fromDegreesArray([
-         *     -72.0, 40.0,
-         *     -70.0, 35.0
-         *   ]),
-         *   shapePositions : computeCircle(100000.0)
-         * });
-         */
-        function PolylineVolumeOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var positions = options.polylinePositions;
-            var shape = options.shapePositions;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(positions)) {
-                throw new Check.DeveloperError('options.polylinePositions is required.');
-            }
-            if (!when.defined(shape)) {
-                throw new Check.DeveloperError('options.shapePositions is required.');
-            }
-            //>>includeEnd('debug');
-
-            this._positions = positions;
-            this._shape = shape;
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84));
-            this._cornerType = when.defaultValue(options.cornerType, PolylineVolumeGeometryLibrary.CornerType.ROUNDED);
-            this._granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            this._workerName = 'createPolylineVolumeOutlineGeometry';
-
-            var numComponents = 1 + positions.length * Cartographic.Cartesian3.packedLength;
-            numComponents += 1 + shape.length * Cartesian2.Cartesian2.packedLength;
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = numComponents + Cartesian2.Ellipsoid.packedLength + 2;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {PolylineVolumeOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        PolylineVolumeOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var positions = value._positions;
-            var length = positions.length;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                Cartographic.Cartesian3.pack(positions[i], array, startingIndex);
-            }
-
-            var shape = value._shape;
-            length = shape.length;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Cartesian2.Cartesian2.packedLength) {
-                Cartesian2.Cartesian2.pack(shape[i], array, startingIndex);
-            }
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            array[startingIndex++] = value._cornerType;
-            array[startingIndex]   = value._granularity;
-
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchOptions = {
-            polylinePositions : undefined,
-            shapePositions : undefined,
-            ellipsoid : scratchEllipsoid,
-            height : undefined,
-            cornerType : undefined,
-            granularity : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {PolylineVolumeOutlineGeometry} [result] The object into which to store the result.
-         * @returns {PolylineVolumeOutlineGeometry} The modified result parameter or a new PolylineVolumeOutlineGeometry instance if one was not provided.
-         */
-        PolylineVolumeOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var length = array[startingIndex++];
-            var positions = new Array(length);
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                positions[i] = Cartographic.Cartesian3.unpack(array, startingIndex);
-            }
-
-            length = array[startingIndex++];
-            var shape = new Array(length);
-
-            for (i = 0; i < length; ++i, startingIndex += Cartesian2.Cartesian2.packedLength) {
-                shape[i] = Cartesian2.Cartesian2.unpack(array, startingIndex);
-            }
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var cornerType = array[startingIndex++];
-            var granularity = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.polylinePositions = positions;
-                scratchOptions.shapePositions = shape;
-                scratchOptions.cornerType = cornerType;
-                scratchOptions.granularity = granularity;
-                return new PolylineVolumeOutlineGeometry(scratchOptions);
-            }
-
-            result._positions = positions;
-            result._shape = shape;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._cornerType = cornerType;
-            result._granularity = granularity;
-
-            return result;
-        };
-
-        var brScratch = new BoundingRectangle.BoundingRectangle();
-
-        /**
-         * Computes the geometric representation of the outline of a polyline with a volume, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {PolylineVolumeOutlineGeometry} polylineVolumeOutlineGeometry A description of the polyline volume outline.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        PolylineVolumeOutlineGeometry.createGeometry = function(polylineVolumeOutlineGeometry) {
-            var positions = polylineVolumeOutlineGeometry._positions;
-            var cleanPositions = arrayRemoveDuplicates.arrayRemoveDuplicates(positions, Cartographic.Cartesian3.equalsEpsilon);
-            var shape2D = polylineVolumeOutlineGeometry._shape;
-            shape2D = PolylineVolumeGeometryLibrary.PolylineVolumeGeometryLibrary.removeDuplicatesFromShape(shape2D);
-
-            if (cleanPositions.length < 2 || shape2D.length < 3) {
-                return undefined;
-            }
-
-            if (PolygonPipeline.PolygonPipeline.computeWindingOrder2D(shape2D) === PolygonPipeline.WindingOrder.CLOCKWISE) {
-                shape2D.reverse();
-            }
-            var boundingRectangle = BoundingRectangle.BoundingRectangle.fromPoints(shape2D, brScratch);
-
-            var computedPositions = PolylineVolumeGeometryLibrary.PolylineVolumeGeometryLibrary.computePositions(cleanPositions, shape2D, boundingRectangle, polylineVolumeOutlineGeometry, false);
-            return computeAttributes(computedPositions, shape2D);
-        };
-
-    function createPolylineVolumeOutlineGeometry(polylineVolumeOutlineGeometry, offset) {
-        if (when.defined(offset)) {
-            polylineVolumeOutlineGeometry = PolylineVolumeOutlineGeometry.unpack(polylineVolumeOutlineGeometry, offset);
-        }
-        polylineVolumeOutlineGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(polylineVolumeOutlineGeometry._ellipsoid);
-        return PolylineVolumeOutlineGeometry.createGeometry(polylineVolumeOutlineGeometry);
-    }
-
-    return createPolylineVolumeOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createRectangleGeometry.js b/public/libs/Cesium/Workers/createRectangleGeometry.js
deleted file mode 100644
index 10cbd08..0000000
--- a/public/libs/Cesium/Workers/createRectangleGeometry.js
+++ /dev/null
@@ -1,1207 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './AttributeCompression-84a90a13', './GeometryPipeline-245a05d7', './EncodedCartesian3-a569cba8', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './GeometryInstance-93a01b5d', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './RectangleGeometryLibrary-e7665732'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, AttributeCompression, GeometryPipeline, EncodedCartesian3, IndexDatatype, IntersectionTests, Plane, arrayFill, GeometryOffsetAttribute, VertexFormat, GeometryInstance, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, RectangleGeometryLibrary) { 'use strict';
-
-    var positionScratch = new Cartographic.Cartesian3();
-        var normalScratch = new Cartographic.Cartesian3();
-        var tangentScratch = new Cartographic.Cartesian3();
-        var bitangentScratch = new Cartographic.Cartesian3();
-        var rectangleScratch = new Cartesian2.Rectangle();
-        var stScratch = new Cartesian2.Cartesian2();
-        var bottomBoundingSphere = new BoundingSphere.BoundingSphere();
-        var topBoundingSphere = new BoundingSphere.BoundingSphere();
-
-        function createAttributes(vertexFormat, attributes) {
-            var geo = new GeometryAttribute.Geometry({
-                attributes : new GeometryAttributes.GeometryAttributes(),
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES
-            });
-
-            geo.attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : attributes.positions
-            });
-            if (vertexFormat.normal) {
-                geo.attributes.normal = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : attributes.normals
-                });
-            }
-            if (vertexFormat.tangent) {
-                geo.attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : attributes.tangents
-                });
-            }
-            if (vertexFormat.bitangent) {
-                geo.attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : attributes.bitangents
-                });
-            }
-            return geo;
-        }
-
-        function calculateAttributes(positions, vertexFormat, ellipsoid, tangentRotationMatrix) {
-            var length = positions.length;
-
-            var normals = (vertexFormat.normal) ? new Float32Array(length) : undefined;
-            var tangents = (vertexFormat.tangent) ? new Float32Array(length) : undefined;
-            var bitangents = (vertexFormat.bitangent) ? new Float32Array(length) : undefined;
-
-            var attrIndex = 0;
-            var bitangent = bitangentScratch;
-            var tangent = tangentScratch;
-            var normal = normalScratch;
-            if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
-                for (var i = 0; i < length; i += 3) {
-                    var p = Cartographic.Cartesian3.fromArray(positions, i, positionScratch);
-                    var attrIndex1 = attrIndex + 1;
-                    var attrIndex2 = attrIndex + 2;
-
-                    normal = ellipsoid.geodeticSurfaceNormal(p, normal);
-                    if (vertexFormat.tangent || vertexFormat.bitangent) {
-                        Cartographic.Cartesian3.cross(Cartographic.Cartesian3.UNIT_Z, normal, tangent);
-                        BoundingSphere.Matrix3.multiplyByVector(tangentRotationMatrix, tangent, tangent);
-                        Cartographic.Cartesian3.normalize(tangent, tangent);
-
-                        if (vertexFormat.bitangent) {
-                            Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(normal, tangent, bitangent), bitangent);
-                        }
-                    }
-
-                    if (vertexFormat.normal) {
-                        normals[attrIndex] = normal.x;
-                        normals[attrIndex1] = normal.y;
-                        normals[attrIndex2] = normal.z;
-                    }
-                    if (vertexFormat.tangent) {
-                        tangents[attrIndex] = tangent.x;
-                        tangents[attrIndex1] = tangent.y;
-                        tangents[attrIndex2] = tangent.z;
-                    }
-                    if (vertexFormat.bitangent) {
-                        bitangents[attrIndex] = bitangent.x;
-                        bitangents[attrIndex1] = bitangent.y;
-                        bitangents[attrIndex2] = bitangent.z;
-                    }
-                    attrIndex += 3;
-                }
-            }
-            return createAttributes(vertexFormat, {
-                positions : positions,
-                normals : normals,
-                tangents : tangents,
-                bitangents : bitangents
-            });
-        }
-
-        var v1Scratch = new Cartographic.Cartesian3();
-        var v2Scratch = new Cartographic.Cartesian3();
-
-        function calculateAttributesWall(positions, vertexFormat, ellipsoid) {
-            var length = positions.length;
-
-            var normals = (vertexFormat.normal) ? new Float32Array(length) : undefined;
-            var tangents = (vertexFormat.tangent) ? new Float32Array(length) : undefined;
-            var bitangents = (vertexFormat.bitangent) ? new Float32Array(length) : undefined;
-
-            var normalIndex = 0;
-            var tangentIndex = 0;
-            var bitangentIndex = 0;
-            var recomputeNormal = true;
-
-            var bitangent = bitangentScratch;
-            var tangent = tangentScratch;
-            var normal = normalScratch;
-            if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
-                for (var i = 0; i < length; i += 6) {
-                    var p = Cartographic.Cartesian3.fromArray(positions, i, positionScratch);
-                    var p1 = Cartographic.Cartesian3.fromArray(positions, (i + 6) % length, v1Scratch);
-                    if (recomputeNormal) {
-                        var p2 = Cartographic.Cartesian3.fromArray(positions, (i + 3) % length, v2Scratch);
-                        Cartographic.Cartesian3.subtract(p1, p, p1);
-                        Cartographic.Cartesian3.subtract(p2, p, p2);
-                        normal = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(p2, p1, normal), normal);
-                        recomputeNormal = false;
-                    }
-
-                    if (Cartographic.Cartesian3.equalsEpsilon(p1, p, _Math.CesiumMath.EPSILON10)) { // if we've reached a corner
-                        recomputeNormal = true;
-                    }
-
-                    if (vertexFormat.tangent || vertexFormat.bitangent) {
-                        bitangent = ellipsoid.geodeticSurfaceNormal(p, bitangent);
-                        if (vertexFormat.tangent) {
-                            tangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(bitangent, normal, tangent), tangent);
-                        }
-                    }
-
-                    if (vertexFormat.normal) {
-                        normals[normalIndex++] = normal.x;
-                        normals[normalIndex++] = normal.y;
-                        normals[normalIndex++] = normal.z;
-                        normals[normalIndex++] = normal.x;
-                        normals[normalIndex++] = normal.y;
-                        normals[normalIndex++] = normal.z;
-                    }
-
-                    if (vertexFormat.tangent) {
-                        tangents[tangentIndex++] = tangent.x;
-                        tangents[tangentIndex++] = tangent.y;
-                        tangents[tangentIndex++] = tangent.z;
-                        tangents[tangentIndex++] = tangent.x;
-                        tangents[tangentIndex++] = tangent.y;
-                        tangents[tangentIndex++] = tangent.z;
-                    }
-
-                    if (vertexFormat.bitangent) {
-                        bitangents[bitangentIndex++] = bitangent.x;
-                        bitangents[bitangentIndex++] = bitangent.y;
-                        bitangents[bitangentIndex++] = bitangent.z;
-                        bitangents[bitangentIndex++] = bitangent.x;
-                        bitangents[bitangentIndex++] = bitangent.y;
-                        bitangents[bitangentIndex++] = bitangent.z;
-                    }
-                }
-            }
-
-            return createAttributes(vertexFormat, {
-                positions : positions,
-                normals : normals,
-                tangents : tangents,
-                bitangents : bitangents
-            });
-        }
-
-        function constructRectangle(rectangleGeometry, computedOptions) {
-            var vertexFormat = rectangleGeometry._vertexFormat;
-            var ellipsoid = rectangleGeometry._ellipsoid;
-            var height = computedOptions.height;
-            var width = computedOptions.width;
-            var northCap = computedOptions.northCap;
-            var southCap = computedOptions.southCap;
-
-            var rowStart = 0;
-            var rowEnd = height;
-            var rowHeight = height;
-            var size = 0;
-            if (northCap) {
-                rowStart = 1;
-                rowHeight -= 1;
-                size += 1;
-            }
-            if (southCap) {
-                rowEnd -= 1;
-                rowHeight -= 1;
-                size += 1;
-            }
-            size += (width * rowHeight);
-
-            var positions = (vertexFormat.position) ? new Float64Array(size * 3) : undefined;
-            var textureCoordinates = (vertexFormat.st) ? new Float32Array(size * 2) : undefined;
-
-            var posIndex = 0;
-            var stIndex = 0;
-
-            var position = positionScratch;
-            var st = stScratch;
-
-            var minX = Number.MAX_VALUE;
-            var minY = Number.MAX_VALUE;
-            var maxX = -Number.MAX_VALUE;
-            var maxY = -Number.MAX_VALUE;
-
-            for (var row = rowStart; row < rowEnd; ++row) {
-                for (var col = 0; col < width; ++col) {
-                    RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, vertexFormat.st, row, col, position, st);
-
-                    positions[posIndex++] = position.x;
-                    positions[posIndex++] = position.y;
-                    positions[posIndex++] = position.z;
-
-                    if (vertexFormat.st) {
-                        textureCoordinates[stIndex++] = st.x;
-                        textureCoordinates[stIndex++] = st.y;
-
-                        minX = Math.min(minX, st.x);
-                        minY = Math.min(minY, st.y);
-                        maxX = Math.max(maxX, st.x);
-                        maxY = Math.max(maxY, st.y);
-                    }
-                }
-            }
-            if (northCap) {
-                RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, vertexFormat.st, 0, 0, position, st);
-
-                positions[posIndex++] = position.x;
-                positions[posIndex++] = position.y;
-                positions[posIndex++] = position.z;
-
-                if (vertexFormat.st) {
-                    textureCoordinates[stIndex++] = st.x;
-                    textureCoordinates[stIndex++] = st.y;
-
-                    minX = st.x;
-                    minY = st.y;
-                    maxX = st.x;
-                    maxY = st.y;
-                }
-            }
-            if (southCap) {
-                RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, vertexFormat.st, height - 1, 0, position, st);
-
-                positions[posIndex++] = position.x;
-                positions[posIndex++] = position.y;
-                positions[posIndex] = position.z;
-
-                if (vertexFormat.st) {
-                    textureCoordinates[stIndex++] = st.x;
-                    textureCoordinates[stIndex] = st.y;
-
-                    minX = Math.min(minX, st.x);
-                    minY = Math.min(minY, st.y);
-                    maxX = Math.max(maxX, st.x);
-                    maxY = Math.max(maxY, st.y);
-                }
-            }
-
-            if (vertexFormat.st && (minX < 0.0 || minY < 0.0 || maxX > 1.0 || maxY > 1.0)) {
-                for (var k = 0; k < textureCoordinates.length; k += 2) {
-                    textureCoordinates[k] = (textureCoordinates[k] - minX) / (maxX - minX);
-                    textureCoordinates[k + 1] = (textureCoordinates[k + 1] - minY) / (maxY - minY);
-                }
-            }
-
-            var geo = calculateAttributes(positions, vertexFormat, ellipsoid, computedOptions.tangentRotationMatrix);
-
-            var indicesSize = 6 * (width - 1) * (rowHeight - 1);
-            if (northCap) {
-                indicesSize += 3 * (width - 1);
-            }
-            if (southCap) {
-                indicesSize += 3 * (width - 1);
-            }
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(size, indicesSize);
-            var index = 0;
-            var indicesIndex = 0;
-            var i;
-            for (i = 0; i < rowHeight - 1; ++i) {
-                for (var j = 0; j < width - 1; ++j) {
-                    var upperLeft = index;
-                    var lowerLeft = upperLeft + width;
-                    var lowerRight = lowerLeft + 1;
-                    var upperRight = upperLeft + 1;
-                    indices[indicesIndex++] = upperLeft;
-                    indices[indicesIndex++] = lowerLeft;
-                    indices[indicesIndex++] = upperRight;
-                    indices[indicesIndex++] = upperRight;
-                    indices[indicesIndex++] = lowerLeft;
-                    indices[indicesIndex++] = lowerRight;
-                    ++index;
-                }
-                ++index;
-            }
-            if (northCap || southCap) {
-                var northIndex = size - 1;
-                var southIndex = size - 1;
-                if (northCap && southCap) {
-                    northIndex = size - 2;
-                }
-
-                var p1;
-                var p2;
-                index = 0;
-
-                if (northCap) {
-                    for (i = 0; i < width - 1; i++) {
-                        p1 = index;
-                        p2 = p1 + 1;
-                        indices[indicesIndex++] = northIndex;
-                        indices[indicesIndex++] = p1;
-                        indices[indicesIndex++] = p2;
-                        ++index;
-                    }
-                }
-                if (southCap) {
-                    index = (rowHeight - 1) * (width);
-                    for (i = 0; i < width - 1; i++) {
-                        p1 = index;
-                        p2 = p1 + 1;
-                        indices[indicesIndex++] = p1;
-                        indices[indicesIndex++] = southIndex;
-                        indices[indicesIndex++] = p2;
-                        ++index;
-                    }
-                }
-            }
-
-            geo.indices = indices;
-            if (vertexFormat.st) {
-                geo.attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : textureCoordinates
-                });
-            }
-
-            return geo;
-        }
-
-        function addWallPositions(wallPositions, posIndex, i, topPositions, bottomPositions) {
-            wallPositions[posIndex++] = topPositions[i];
-            wallPositions[posIndex++] = topPositions[i + 1];
-            wallPositions[posIndex++] = topPositions[i + 2];
-            wallPositions[posIndex++] = bottomPositions[i];
-            wallPositions[posIndex++] = bottomPositions[i + 1];
-            wallPositions[posIndex] = bottomPositions[i + 2];
-            return wallPositions;
-        }
-
-        function addWallTextureCoordinates(wallTextures, stIndex, i, st) {
-            wallTextures[stIndex++] = st[i];
-            wallTextures[stIndex++] = st[i + 1];
-            wallTextures[stIndex++] = st[i];
-            wallTextures[stIndex] = st[i + 1];
-            return wallTextures;
-        }
-
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-
-        function constructExtrudedRectangle(rectangleGeometry, computedOptions) {
-            var shadowVolume = rectangleGeometry._shadowVolume;
-            var offsetAttributeValue = rectangleGeometry._offsetAttribute;
-            var vertexFormat = rectangleGeometry._vertexFormat;
-            var minHeight = rectangleGeometry._extrudedHeight;
-            var maxHeight = rectangleGeometry._surfaceHeight;
-            var ellipsoid = rectangleGeometry._ellipsoid;
-
-            var height = computedOptions.height;
-            var width = computedOptions.width;
-
-            var i;
-
-            if (shadowVolume) {
-                var newVertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, scratchVertexFormat);
-                newVertexFormat.normal = true;
-                rectangleGeometry._vertexFormat = newVertexFormat;
-            }
-
-            var topBottomGeo = constructRectangle(rectangleGeometry, computedOptions);
-
-            if (shadowVolume) {
-                rectangleGeometry._vertexFormat = vertexFormat;
-            }
-
-            var topPositions = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(topBottomGeo.attributes.position.values, maxHeight, ellipsoid, false);
-            topPositions = new Float64Array(topPositions);
-            var length = topPositions.length;
-            var newLength = length * 2;
-            var positions = new Float64Array(newLength);
-            positions.set(topPositions);
-            var bottomPositions = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(topBottomGeo.attributes.position.values, minHeight, ellipsoid);
-            positions.set(bottomPositions, length);
-            topBottomGeo.attributes.position.values = positions;
-
-            var normals = (vertexFormat.normal) ? new Float32Array(newLength) : undefined;
-            var tangents = (vertexFormat.tangent) ? new Float32Array(newLength) : undefined;
-            var bitangents = (vertexFormat.bitangent) ? new Float32Array(newLength) : undefined;
-            var textures = (vertexFormat.st) ? new Float32Array(newLength / 3 * 2) : undefined;
-            var topSt;
-            var topNormals;
-            if (vertexFormat.normal) {
-                topNormals = topBottomGeo.attributes.normal.values;
-                normals.set(topNormals);
-                for (i = 0; i < length; i++) {
-                    topNormals[i] = -topNormals[i];
-                }
-                normals.set(topNormals, length);
-                topBottomGeo.attributes.normal.values = normals;
-            }
-            if (shadowVolume) {
-                topNormals = topBottomGeo.attributes.normal.values;
-                if (!vertexFormat.normal) {
-                    topBottomGeo.attributes.normal = undefined;
-                }
-                var extrudeNormals = new Float32Array(newLength);
-                for (i = 0; i < length; i++) {
-                    topNormals[i] = -topNormals[i];
-                }
-                extrudeNormals.set(topNormals, length); //only get normals for bottom layer that's going to be pushed down
-                topBottomGeo.attributes.extrudeDirection = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : extrudeNormals
-                });
-            }
-
-            var offsetValue;
-            var hasOffsets = when.defined(offsetAttributeValue);
-            if (hasOffsets) {
-                var size = length / 3 * 2;
-                var offsetAttribute = new Uint8Array(size);
-                if (offsetAttributeValue === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                    offsetAttribute = arrayFill.arrayFill(offsetAttribute, 1, 0, size / 2);
-                } else {
-                    offsetValue = offsetAttributeValue === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    offsetAttribute = arrayFill.arrayFill(offsetAttribute, offsetValue);
-                }
-
-                topBottomGeo.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values : offsetAttribute
-                });
-            }
-
-            if (vertexFormat.tangent) {
-                var topTangents = topBottomGeo.attributes.tangent.values;
-                tangents.set(topTangents);
-                for (i = 0; i < length; i++) {
-                    topTangents[i] = -topTangents[i];
-                }
-                tangents.set(topTangents, length);
-                topBottomGeo.attributes.tangent.values = tangents;
-            }
-            if (vertexFormat.bitangent) {
-                var topBitangents = topBottomGeo.attributes.bitangent.values;
-                bitangents.set(topBitangents);
-                bitangents.set(topBitangents, length);
-                topBottomGeo.attributes.bitangent.values = bitangents;
-            }
-            if (vertexFormat.st) {
-                topSt = topBottomGeo.attributes.st.values;
-                textures.set(topSt);
-                textures.set(topSt, length / 3 * 2);
-                topBottomGeo.attributes.st.values = textures;
-            }
-
-            var indices = topBottomGeo.indices;
-            var indicesLength = indices.length;
-            var posLength = length / 3;
-            var newIndices = IndexDatatype.IndexDatatype.createTypedArray(newLength / 3, indicesLength * 2);
-            newIndices.set(indices);
-            for (i = 0; i < indicesLength; i += 3) {
-                newIndices[i + indicesLength] = indices[i + 2] + posLength;
-                newIndices[i + 1 + indicesLength] = indices[i + 1] + posLength;
-                newIndices[i + 2 + indicesLength] = indices[i] + posLength;
-            }
-            topBottomGeo.indices = newIndices;
-
-            var northCap = computedOptions.northCap;
-            var southCap = computedOptions.southCap;
-
-            var rowHeight = height;
-            var widthMultiplier = 2;
-            var perimeterPositions = 0;
-            var corners = 4;
-            var dupliateCorners = 4;
-            if (northCap) {
-                widthMultiplier -= 1;
-                rowHeight -= 1;
-                perimeterPositions += 1;
-                corners -= 2;
-                dupliateCorners -= 1;
-            }
-            if (southCap) {
-                widthMultiplier -= 1;
-                rowHeight -= 1;
-                perimeterPositions += 1;
-                corners -= 2;
-                dupliateCorners -= 1;
-            }
-            perimeterPositions += (widthMultiplier * width + 2 * rowHeight - corners);
-
-            var wallCount = (perimeterPositions + dupliateCorners) * 2;
-
-            var wallPositions = new Float64Array(wallCount * 3);
-            var wallExtrudeNormals = shadowVolume ? new Float32Array(wallCount * 3) : undefined;
-            var wallOffsetAttribute = hasOffsets ? new Uint8Array(wallCount) : undefined;
-            var wallTextures = (vertexFormat.st) ? new Float32Array(wallCount * 2) : undefined;
-
-            var computeTopOffsets = offsetAttributeValue === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP;
-            if (hasOffsets && !computeTopOffsets) {
-                offsetValue = offsetAttributeValue === GeometryOffsetAttribute.GeometryOffsetAttribute.ALL ? 1 : 0;
-                wallOffsetAttribute = arrayFill.arrayFill(wallOffsetAttribute, offsetValue);
-            }
-
-            var posIndex = 0;
-            var stIndex = 0;
-            var extrudeNormalIndex = 0;
-            var wallOffsetIndex = 0;
-            var area = width * rowHeight;
-            var threeI;
-            for (i = 0; i < area; i += width) {
-                threeI = i * 3;
-                wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions);
-                posIndex += 6;
-                if (vertexFormat.st) {
-                    wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i * 2, topSt);
-                    stIndex += 4;
-                }
-                if (shadowVolume) {
-                    extrudeNormalIndex += 3;
-                    wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI];
-                    wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1];
-                    wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2];
-                }
-                if (computeTopOffsets) {
-                    wallOffsetAttribute[wallOffsetIndex++] = 1;
-                    wallOffsetIndex += 1;
-                }
-            }
-
-            if (!southCap) {
-                for (i = area - width; i < area; i++) {
-                    threeI = i * 3;
-                    wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions);
-                    posIndex += 6;
-                    if (vertexFormat.st) {
-                        wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i * 2, topSt);
-                        stIndex += 4;
-                    }
-                    if (shadowVolume) {
-                        extrudeNormalIndex += 3;
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI];
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1];
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2];
-                    }
-                    if (computeTopOffsets) {
-                        wallOffsetAttribute[wallOffsetIndex++] = 1;
-                        wallOffsetIndex += 1;
-                    }
-                }
-            } else {
-                var southIndex = northCap ? area + 1 : area;
-                threeI = southIndex * 3;
-
-                for (i = 0; i < 2; i++) { // duplicate corner points
-                    wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions);
-                    posIndex += 6;
-                    if (vertexFormat.st) {
-                        wallTextures = addWallTextureCoordinates(wallTextures, stIndex, southIndex * 2, topSt);
-                        stIndex += 4;
-                    }
-                    if (shadowVolume) {
-                        extrudeNormalIndex += 3;
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI];
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1];
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2];
-                    }
-                    if (computeTopOffsets) {
-                        wallOffsetAttribute[wallOffsetIndex++] = 1;
-                        wallOffsetIndex += 1;
-                    }
-                }
-            }
-
-            for (i = area - 1; i > 0; i -= width) {
-                threeI = i * 3;
-                wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions);
-                posIndex += 6;
-                if (vertexFormat.st) {
-                    wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i * 2, topSt);
-                    stIndex += 4;
-                }
-                if (shadowVolume) {
-                    extrudeNormalIndex += 3;
-                    wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI];
-                    wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1];
-                    wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2];
-                }
-                if (computeTopOffsets) {
-                    wallOffsetAttribute[wallOffsetIndex++] = 1;
-                    wallOffsetIndex += 1;
-                }
-
-            }
-
-            if (!northCap) {
-                for (i = width - 1; i >= 0; i--) {
-                    threeI = i * 3;
-                    wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions);
-                    posIndex += 6;
-                    if (vertexFormat.st) {
-                        wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i * 2, topSt);
-                        stIndex += 4;
-                    }
-                    if (shadowVolume) {
-                        extrudeNormalIndex += 3;
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI];
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1];
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2];
-                    }
-                    if (computeTopOffsets) {
-                        wallOffsetAttribute[wallOffsetIndex++] = 1;
-                        wallOffsetIndex += 1;
-                    }
-                }
-            } else {
-                var northIndex = area;
-                threeI = northIndex * 3;
-
-                for (i = 0; i < 2; i++) { // duplicate corner points
-                    wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions);
-                    posIndex += 6;
-                    if (vertexFormat.st) {
-                        wallTextures = addWallTextureCoordinates(wallTextures, stIndex, northIndex * 2, topSt);
-                        stIndex += 4;
-                    }
-                    if (shadowVolume) {
-                        extrudeNormalIndex += 3;
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI];
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1];
-                        wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2];
-                    }
-                    if (computeTopOffsets) {
-                        wallOffsetAttribute[wallOffsetIndex++] = 1;
-                        wallOffsetIndex += 1;
-                    }
-                }
-            }
-
-            var geo = calculateAttributesWall(wallPositions, vertexFormat, ellipsoid);
-
-            if (vertexFormat.st) {
-                geo.attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : wallTextures
-                });
-            }
-            if (shadowVolume) {
-                geo.attributes.extrudeDirection = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : wallExtrudeNormals
-                });
-            }
-            if (hasOffsets) {
-                geo.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 1,
-                    values : wallOffsetAttribute
-                });
-            }
-
-            var wallIndices = IndexDatatype.IndexDatatype.createTypedArray(wallCount, perimeterPositions * 6);
-
-            var upperLeft;
-            var lowerLeft;
-            var lowerRight;
-            var upperRight;
-            length = wallPositions.length / 3;
-            var index = 0;
-            for (i = 0; i < length - 1; i += 2) {
-                upperLeft = i;
-                upperRight = (upperLeft + 2) % length;
-                var p1 = Cartographic.Cartesian3.fromArray(wallPositions, upperLeft * 3, v1Scratch);
-                var p2 = Cartographic.Cartesian3.fromArray(wallPositions, upperRight * 3, v2Scratch);
-                if (Cartographic.Cartesian3.equalsEpsilon(p1, p2, _Math.CesiumMath.EPSILON10)) {
-                    continue;
-                }
-                lowerLeft = (upperLeft + 1) % length;
-                lowerRight = (lowerLeft + 2) % length;
-                wallIndices[index++] = upperLeft;
-                wallIndices[index++] = lowerLeft;
-                wallIndices[index++] = upperRight;
-                wallIndices[index++] = upperRight;
-                wallIndices[index++] = lowerLeft;
-                wallIndices[index++] = lowerRight;
-            }
-
-            geo.indices = wallIndices;
-
-            geo = GeometryPipeline.GeometryPipeline.combineInstances([
-                new GeometryInstance.GeometryInstance({
-                    geometry : topBottomGeo
-                }),
-                new GeometryInstance.GeometryInstance({
-                    geometry : geo
-                })
-            ]);
-
-            return geo[0];
-        }
-
-        var scratchRectanglePoints = [new Cartographic.Cartesian3(), new Cartographic.Cartesian3(), new Cartographic.Cartesian3(), new Cartographic.Cartesian3()];
-        var nwScratch = new Cartographic.Cartographic();
-        var stNwScratch = new Cartographic.Cartographic();
-        function computeRectangle(rectangle, granularity, rotation, ellipsoid, result) {
-            if (rotation === 0.0) {
-                return Cartesian2.Rectangle.clone(rectangle, result);
-            }
-
-            var computedOptions = RectangleGeometryLibrary.RectangleGeometryLibrary.computeOptions(rectangle, granularity, rotation, 0, rectangleScratch, nwScratch);
-
-            var height = computedOptions.height;
-            var width = computedOptions.width;
-
-            var positions = scratchRectanglePoints;
-            RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, false, 0, 0, positions[0]);
-            RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, false, 0, width - 1, positions[1]);
-            RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, false, height - 1, 0, positions[2]);
-            RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, false, height - 1, width - 1, positions[3]);
-
-            return Cartesian2.Rectangle.fromCartesianArray(positions, ellipsoid, result);
-        }
-
-        /**
-         * A description of a cartographic rectangle on an ellipsoid centered at the origin. Rectangle geometry can be rendered with both {@link Primitive} and {@link GroundPrimitive}.
-         *
-         * @alias RectangleGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Rectangle} options.rectangle A cartographic rectangle with north, south, east and west properties in radians.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the rectangle lies.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Number} [options.height=0.0] The distance in meters between the rectangle and the ellipsoid surface.
-         * @param {Number} [options.rotation=0.0] The rotation of the rectangle, in radians. A positive rotation is counter-clockwise.
-         * @param {Number} [options.stRotation=0.0] The rotation of the texture coordinates, in radians. A positive rotation is counter-clockwise.
-         * @param {Number} [options.extrudedHeight] The distance in meters between the rectangle's extruded face and the ellipsoid surface.
-         *
-         * @exception {DeveloperError} <code>options.rectangle.north</code> must be in the interval [<code>-Pi/2</code>, <code>Pi/2</code>].
-         * @exception {DeveloperError} <code>options.rectangle.south</code> must be in the interval [<code>-Pi/2</code>, <code>Pi/2</code>].
-         * @exception {DeveloperError} <code>options.rectangle.east</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].
-         * @exception {DeveloperError} <code>options.rectangle.west</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].
-         * @exception {DeveloperError} <code>options.rectangle.north</code> must be greater than <code>options.rectangle.south</code>.
-         *
-         * @see RectangleGeometry#createGeometry
-         *
-         * @demo {@link https://sandcastle.cesium.com/index.html?src=Rectangle.html|Cesium Sandcastle Rectangle Demo}
-         *
-         * @example
-         * // 1. create a rectangle
-         * var rectangle = new Cesium.RectangleGeometry({
-         *   ellipsoid : Cesium.Ellipsoid.WGS84,
-         *   rectangle : Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0),
-         *   height : 10000.0
-         * });
-         * var geometry = Cesium.RectangleGeometry.createGeometry(rectangle);
-         *
-         * // 2. create an extruded rectangle without a top
-         * var rectangle = new Cesium.RectangleGeometry({
-         *   ellipsoid : Cesium.Ellipsoid.WGS84,
-         *   rectangle : Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0),
-         *   height : 10000.0,
-         *   extrudedHeight: 300000
-         * });
-         * var geometry = Cesium.RectangleGeometry.createGeometry(rectangle);
-         */
-        function RectangleGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var rectangle = options.rectangle;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            Cartesian2.Rectangle.validate(rectangle);
-            if (rectangle.north < rectangle.south) {
-                throw new Check.DeveloperError('options.rectangle.north must be greater than or equal to options.rectangle.south');
-            }
-            //>>includeEnd('debug');
-
-            var height = when.defaultValue(options.height, 0.0);
-            var extrudedHeight = when.defaultValue(options.extrudedHeight, height);
-
-            this._rectangle = Cartesian2.Rectangle.clone(rectangle);
-            this._granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84));
-            this._surfaceHeight = Math.max(height, extrudedHeight);
-            this._rotation = when.defaultValue(options.rotation, 0.0);
-            this._stRotation = when.defaultValue(options.stRotation, 0.0);
-            this._vertexFormat = VertexFormat.VertexFormat.clone(when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT));
-            this._extrudedHeight = Math.min(height, extrudedHeight);
-            this._shadowVolume = when.defaultValue(options.shadowVolume, false);
-            this._workerName = 'createRectangleGeometry';
-            this._offsetAttribute = options.offsetAttribute;
-            this._rotatedRectangle = undefined;
-
-            this._textureCoordinateRotationPoints = undefined;
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        RectangleGeometry.packedLength = Cartesian2.Rectangle.packedLength + Cartesian2.Ellipsoid.packedLength + VertexFormat.VertexFormat.packedLength + 7;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {RectangleGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        RectangleGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            Cartesian2.Rectangle.pack(value._rectangle, array, startingIndex);
-            startingIndex += Cartesian2.Rectangle.packedLength;
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._granularity;
-            array[startingIndex++] = value._surfaceHeight;
-            array[startingIndex++] = value._rotation;
-            array[startingIndex++] = value._stRotation;
-            array[startingIndex++] = value._extrudedHeight;
-            array[startingIndex++] = value._shadowVolume ? 1.0 : 0.0;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchRectangle = new Cartesian2.Rectangle();
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchOptions = {
-            rectangle : scratchRectangle,
-            ellipsoid : scratchEllipsoid,
-            vertexFormat : scratchVertexFormat,
-            granularity : undefined,
-            height : undefined,
-            rotation : undefined,
-            stRotation : undefined,
-            extrudedHeight : undefined,
-            shadowVolume : undefined,
-            offsetAttribute: undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {RectangleGeometry} [result] The object into which to store the result.
-         * @returns {RectangleGeometry} The modified result parameter or a new RectangleGeometry instance if one was not provided.
-         */
-        RectangleGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.defined('array', array);
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var rectangle = Cartesian2.Rectangle.unpack(array, startingIndex, scratchRectangle);
-            startingIndex += Cartesian2.Rectangle.packedLength;
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var granularity = array[startingIndex++];
-            var surfaceHeight = array[startingIndex++];
-            var rotation = array[startingIndex++];
-            var stRotation = array[startingIndex++];
-            var extrudedHeight = array[startingIndex++];
-            var shadowVolume = array[startingIndex++] === 1.0;
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.granularity = granularity;
-                scratchOptions.height = surfaceHeight;
-                scratchOptions.rotation = rotation;
-                scratchOptions.stRotation = stRotation;
-                scratchOptions.extrudedHeight = extrudedHeight;
-                scratchOptions.shadowVolume = shadowVolume;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-                return new RectangleGeometry(scratchOptions);
-            }
-
-            result._rectangle = Cartesian2.Rectangle.clone(rectangle, result._rectangle);
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._granularity = granularity;
-            result._surfaceHeight = surfaceHeight;
-            result._rotation = rotation;
-            result._stRotation = stRotation;
-            result._extrudedHeight = extrudedHeight;
-            result._shadowVolume = shadowVolume;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        /**
-         * Computes the bounding rectangle based on the provided options
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Rectangle} options.rectangle A cartographic rectangle with north, south, east and west properties in radians.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the rectangle lies.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Number} [options.rotation=0.0] The rotation of the rectangle, in radians. A positive rotation is counter-clockwise.
-         * @param {Rectangle} [result] An object in which to store the result.
-         *
-         * @returns {Rectangle} The result rectangle
-         */
-        RectangleGeometry.computeRectangle = function(options, result) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var rectangle = options.rectangle;
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('rectangle', rectangle);
-            Cartesian2.Rectangle.validate(rectangle);
-            if (rectangle.north < rectangle.south) {
-                throw new Check.DeveloperError('options.rectangle.north must be greater than or equal to options.rectangle.south');
-            }
-            //>>includeEnd('debug');
-
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var rotation = when.defaultValue(options.rotation, 0.0);
-
-            return computeRectangle(rectangle, granularity, rotation, ellipsoid, result);
-        };
-
-        var tangentRotationMatrixScratch = new BoundingSphere.Matrix3();
-        var quaternionScratch = new Transforms.Quaternion();
-        var centerScratch = new Cartographic.Cartographic();
-        /**
-         * Computes the geometric representation of a rectangle, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {RectangleGeometry} rectangleGeometry A description of the rectangle.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         *
-         * @exception {DeveloperError} Rotated rectangle is invalid.
-         */
-        RectangleGeometry.createGeometry = function(rectangleGeometry) {
-            if ((_Math.CesiumMath.equalsEpsilon(rectangleGeometry._rectangle.north, rectangleGeometry._rectangle.south, _Math.CesiumMath.EPSILON10) ||
-                 (_Math.CesiumMath.equalsEpsilon(rectangleGeometry._rectangle.east, rectangleGeometry._rectangle.west, _Math.CesiumMath.EPSILON10)))) {
-                return undefined;
-            }
-
-            var rectangle = rectangleGeometry._rectangle;
-            var ellipsoid = rectangleGeometry._ellipsoid;
-            var rotation = rectangleGeometry._rotation;
-            var stRotation = rectangleGeometry._stRotation;
-            var vertexFormat = rectangleGeometry._vertexFormat;
-
-            var computedOptions = RectangleGeometryLibrary.RectangleGeometryLibrary.computeOptions(rectangle, rectangleGeometry._granularity, rotation, stRotation, rectangleScratch, nwScratch, stNwScratch);
-
-            var tangentRotationMatrix = tangentRotationMatrixScratch;
-            if (stRotation !== 0 || rotation !== 0) {
-                var center = Cartesian2.Rectangle.center(rectangle, centerScratch);
-                var axis = ellipsoid.geodeticSurfaceNormalCartographic(center, v1Scratch);
-                Transforms.Quaternion.fromAxisAngle(axis, -stRotation, quaternionScratch);
-                BoundingSphere.Matrix3.fromQuaternion(quaternionScratch, tangentRotationMatrix);
-            } else {
-                BoundingSphere.Matrix3.clone(BoundingSphere.Matrix3.IDENTITY, tangentRotationMatrix);
-            }
-
-            var surfaceHeight = rectangleGeometry._surfaceHeight;
-            var extrudedHeight = rectangleGeometry._extrudedHeight;
-            var extrude = !_Math.CesiumMath.equalsEpsilon(surfaceHeight, extrudedHeight, 0, _Math.CesiumMath.EPSILON2);
-
-            computedOptions.lonScalar = 1.0 / rectangleGeometry._rectangle.width;
-            computedOptions.latScalar = 1.0 / rectangleGeometry._rectangle.height;
-            computedOptions.tangentRotationMatrix = tangentRotationMatrix;
-
-            var geometry;
-            var boundingSphere;
-            rectangle = rectangleGeometry._rectangle;
-            if (extrude) {
-                geometry = constructExtrudedRectangle(rectangleGeometry, computedOptions);
-                var topBS = BoundingSphere.BoundingSphere.fromRectangle3D(rectangle, ellipsoid, surfaceHeight, topBoundingSphere);
-                var bottomBS = BoundingSphere.BoundingSphere.fromRectangle3D(rectangle, ellipsoid, extrudedHeight, bottomBoundingSphere);
-                boundingSphere = BoundingSphere.BoundingSphere.union(topBS, bottomBS);
-            } else {
-                geometry = constructRectangle(rectangleGeometry, computedOptions);
-                geometry.attributes.position.values = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(geometry.attributes.position.values, surfaceHeight, ellipsoid, false);
-
-                if (when.defined(rectangleGeometry._offsetAttribute)) {
-                    var length = geometry.attributes.position.values.length;
-                    var applyOffset = new Uint8Array(length / 3);
-                    var offsetValue = rectangleGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    arrayFill.arrayFill(applyOffset, offsetValue);
-                    geometry.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        componentsPerAttribute : 1,
-                        values: applyOffset
-                    });
-                }
-
-                boundingSphere = BoundingSphere.BoundingSphere.fromRectangle3D(rectangle, ellipsoid, surfaceHeight);
-            }
-
-            if (!vertexFormat.position) {
-                delete geometry.attributes.position;
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : geometry.attributes,
-                indices : geometry.indices,
-                primitiveType : geometry.primitiveType,
-                boundingSphere : boundingSphere,
-                offsetAttribute : rectangleGeometry._offsetAttribute
-            });
-        };
-
-        /**
-         * @private
-         */
-        RectangleGeometry.createShadowVolume = function(rectangleGeometry, minHeightFunc, maxHeightFunc) {
-            var granularity = rectangleGeometry._granularity;
-            var ellipsoid = rectangleGeometry._ellipsoid;
-
-            var minHeight = minHeightFunc(granularity, ellipsoid);
-            var maxHeight = maxHeightFunc(granularity, ellipsoid);
-
-            return new RectangleGeometry({
-                rectangle : rectangleGeometry._rectangle,
-                rotation : rectangleGeometry._rotation,
-                ellipsoid : ellipsoid,
-                stRotation : rectangleGeometry._stRotation,
-                granularity : granularity,
-                extrudedHeight : maxHeight,
-                height : minHeight,
-                vertexFormat : VertexFormat.VertexFormat.POSITION_ONLY,
-                shadowVolume : true
-            });
-        };
-
-        var unrotatedTextureRectangleScratch = new Cartesian2.Rectangle();
-        var points2DScratch = [new Cartesian2.Cartesian2(), new Cartesian2.Cartesian2(), new Cartesian2.Cartesian2()];
-        var rotation2DScratch = new GeometryAttribute.Matrix2();
-        var rectangleCenterScratch = new Cartographic.Cartographic();
-
-        function textureCoordinateRotationPoints(rectangleGeometry) {
-            if (rectangleGeometry._stRotation === 0.0) {
-                return [0, 0, 0, 1, 1, 0];
-            }
-
-            var rectangle = Cartesian2.Rectangle.clone(rectangleGeometry._rectangle, unrotatedTextureRectangleScratch);
-            var granularity = rectangleGeometry._granularity;
-            var ellipsoid = rectangleGeometry._ellipsoid;
-
-            // Rotate to align the texture coordinates with ENU
-            var rotation = rectangleGeometry._rotation - rectangleGeometry._stRotation;
-
-            var unrotatedTextureRectangle = computeRectangle(rectangle, granularity, rotation, ellipsoid, unrotatedTextureRectangleScratch);
-
-            // Assume a computed "east-north" texture coordinate system based on spherical or planar tricks, bounded by `boundingRectangle`.
-            // The "desired" texture coordinate system forms an oriented rectangle (un-oriented computed) around the geometry that completely and tightly bounds it.
-            // We want to map from the "east-north" texture coordinate system into the "desired" system using a pair of lines (analagous planes in 2D)
-            // Compute 3 corners of the "desired" texture coordinate system in "east-north" texture space by the following in cartographic space:
-            // - rotate 3 of the corners in unrotatedTextureRectangle by stRotation around the center of the bounding rectangle
-            // - apply the "east-north" system's normalization formula to the rotated cartographics, even though this is likely to produce values outside [0-1].
-            // This gives us a set of points in the "east-north" texture coordinate system that can be used to map "east-north" texture coordinates to "desired."
-
-            var points2D = points2DScratch;
-            points2D[0].x = unrotatedTextureRectangle.west;
-            points2D[0].y = unrotatedTextureRectangle.south;
-
-            points2D[1].x = unrotatedTextureRectangle.west;
-            points2D[1].y = unrotatedTextureRectangle.north;
-
-            points2D[2].x = unrotatedTextureRectangle.east;
-            points2D[2].y = unrotatedTextureRectangle.south;
-
-            var boundingRectangle = rectangleGeometry.rectangle;
-            var toDesiredInComputed = GeometryAttribute.Matrix2.fromRotation(rectangleGeometry._stRotation, rotation2DScratch);
-            var boundingRectangleCenter = Cartesian2.Rectangle.center(boundingRectangle, rectangleCenterScratch);
-
-            for (var i = 0; i < 3; ++i) {
-                var point2D = points2D[i];
-                point2D.x -= boundingRectangleCenter.longitude;
-                point2D.y -= boundingRectangleCenter.latitude;
-                GeometryAttribute.Matrix2.multiplyByVector(toDesiredInComputed, point2D, point2D);
-                point2D.x += boundingRectangleCenter.longitude;
-                point2D.y += boundingRectangleCenter.latitude;
-
-                // Convert point into east-north texture coordinate space
-                point2D.x = (point2D.x - boundingRectangle.west) / boundingRectangle.width;
-                point2D.y = (point2D.y - boundingRectangle.south) / boundingRectangle.height;
-            }
-
-            var minXYCorner = points2D[0];
-            var maxYCorner = points2D[1];
-            var maxXCorner = points2D[2];
-            var result = new Array(6);
-            Cartesian2.Cartesian2.pack(minXYCorner, result);
-            Cartesian2.Cartesian2.pack(maxYCorner, result, 2);
-            Cartesian2.Cartesian2.pack(maxXCorner, result, 4);
-            return result;
-        }
-
-        Object.defineProperties(RectangleGeometry.prototype, {
-            /**
-             * @private
-             */
-            rectangle : {
-                get : function() {
-                    if (!when.defined(this._rotatedRectangle)) {
-                        this._rotatedRectangle = computeRectangle(this._rectangle, this._granularity, this._rotation, this._ellipsoid);
-                    }
-                    return this._rotatedRectangle;
-                }
-            },
-            /**
-             * For remapping texture coordinates when rendering RectangleGeometries as GroundPrimitives.
-             * This version permits skew in textures by computing offsets directly in cartographic space and
-             * more accurately approximates rendering RectangleGeometries with height as standard Primitives.
-             * @see Geometry#_textureCoordinateRotationPoints
-             * @private
-             */
-            textureCoordinateRotationPoints : {
-                get : function() {
-                    if (!when.defined(this._textureCoordinateRotationPoints)) {
-                        this._textureCoordinateRotationPoints = textureCoordinateRotationPoints(this);
-                    }
-                    return this._textureCoordinateRotationPoints;
-                }
-            }
-        });
-
-    function createRectangleGeometry(rectangleGeometry, offset) {
-        if (when.defined(offset)) {
-            rectangleGeometry = RectangleGeometry.unpack(rectangleGeometry, offset);
-        }
-        rectangleGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(rectangleGeometry._ellipsoid);
-        rectangleGeometry._rectangle = Cartesian2.Rectangle.clone(rectangleGeometry._rectangle);
-        return RectangleGeometry.createGeometry(rectangleGeometry);
-    }
-
-    return createRectangleGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createRectangleOutlineGeometry.js b/public/libs/Cesium/Workers/createRectangleOutlineGeometry.js
deleted file mode 100644
index 91734cd..0000000
--- a/public/libs/Cesium/Workers/createRectangleOutlineGeometry.js
+++ /dev/null
@@ -1,449 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './RectangleGeometryLibrary-e7665732'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, RectangleGeometryLibrary) { 'use strict';
-
-    var bottomBoundingSphere = new BoundingSphere.BoundingSphere();
-        var topBoundingSphere = new BoundingSphere.BoundingSphere();
-        var positionScratch = new Cartographic.Cartesian3();
-        var rectangleScratch = new Cartesian2.Rectangle();
-
-        function constructRectangle(geometry, computedOptions) {
-            var ellipsoid = geometry._ellipsoid;
-            var height = computedOptions.height;
-            var width = computedOptions.width;
-            var northCap = computedOptions.northCap;
-            var southCap = computedOptions.southCap;
-
-            var rowHeight = height;
-            var widthMultiplier = 2;
-            var size = 0;
-            var corners = 4;
-            if (northCap) {
-                widthMultiplier -= 1;
-                rowHeight -= 1;
-                size += 1;
-                corners -= 2;
-            }
-            if (southCap) {
-                widthMultiplier -= 1;
-                rowHeight -= 1;
-                size += 1;
-                corners -= 2;
-            }
-            size += (widthMultiplier * width + 2 * rowHeight - corners);
-
-            var positions = new Float64Array(size * 3);
-
-            var posIndex = 0;
-            var row = 0;
-            var col;
-            var position = positionScratch;
-            if (northCap) {
-                RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, false, row, 0, position);
-                positions[posIndex++] = position.x;
-                positions[posIndex++] = position.y;
-                positions[posIndex++] = position.z;
-            } else {
-                for (col = 0; col < width; col++) {
-                    RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, false, row, col, position);
-                    positions[posIndex++] = position.x;
-                    positions[posIndex++] = position.y;
-                    positions[posIndex++] = position.z;
-                }
-            }
-
-            col = width - 1;
-            for (row = 1; row < height; row++) {
-                RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, false, row, col, position);
-                positions[posIndex++] = position.x;
-                positions[posIndex++] = position.y;
-                positions[posIndex++] = position.z;
-            }
-
-            row = height - 1;
-            if (!southCap) {  // if southCap is true, we dont need to add any more points because the south pole point was added by the iteration above
-                for (col = width - 2; col >= 0; col--) {
-                    RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, false, row, col, position);
-                    positions[posIndex++] = position.x;
-                    positions[posIndex++] = position.y;
-                    positions[posIndex++] = position.z;
-                }
-            }
-
-            col = 0;
-            for (row = height - 2; row > 0; row--) {
-                RectangleGeometryLibrary.RectangleGeometryLibrary.computePosition(computedOptions, ellipsoid, false, row, col, position);
-                positions[posIndex++] = position.x;
-                positions[posIndex++] = position.y;
-                positions[posIndex++] = position.z;
-            }
-
-            var indicesSize = positions.length / 3 * 2;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(positions.length / 3, indicesSize);
-
-            var index = 0;
-            for (var i = 0; i < (positions.length / 3) - 1; i++) {
-                indices[index++] = i;
-                indices[index++] = i + 1;
-            }
-            indices[index++] = (positions.length / 3) - 1;
-            indices[index++] = 0;
-
-            var geo = new GeometryAttribute.Geometry({
-                attributes : new GeometryAttributes.GeometryAttributes(),
-                primitiveType : PrimitiveType.PrimitiveType.LINES
-            });
-
-            geo.attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : positions
-            });
-            geo.indices = indices;
-
-            return geo;
-        }
-
-        function constructExtrudedRectangle(rectangleGeometry, computedOptions) {
-            var surfaceHeight = rectangleGeometry._surfaceHeight;
-            var extrudedHeight = rectangleGeometry._extrudedHeight;
-            var ellipsoid = rectangleGeometry._ellipsoid;
-            var minHeight = extrudedHeight;
-            var maxHeight = surfaceHeight;
-            var geo = constructRectangle(rectangleGeometry, computedOptions);
-
-            var height = computedOptions.height;
-            var width = computedOptions.width;
-
-            var topPositions = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(geo.attributes.position.values, maxHeight, ellipsoid, false);
-            var length = topPositions.length;
-            var positions = new Float64Array(length * 2);
-            positions.set(topPositions);
-            var bottomPositions = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(geo.attributes.position.values, minHeight, ellipsoid);
-            positions.set(bottomPositions, length);
-            geo.attributes.position.values = positions;
-
-            var northCap = computedOptions.northCap;
-            var southCap = computedOptions.southCap;
-            var corners = 4;
-            if (northCap) {
-                corners -= 1;
-            }
-            if (southCap) {
-                corners -= 1;
-            }
-
-            var indicesSize = (positions.length / 3 + corners) * 2;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(positions.length / 3, indicesSize);
-            length = positions.length / 6;
-            var index = 0;
-            for (var i = 0; i < length - 1; i++) {
-                indices[index++] = i;
-                indices[index++] = i + 1;
-                indices[index++] = i + length;
-                indices[index++] = i + length + 1;
-            }
-            indices[index++] = length - 1;
-            indices[index++] = 0;
-            indices[index++] = length + length - 1;
-            indices[index++] = length;
-
-            indices[index++] = 0;
-            indices[index++] = length;
-
-            var bottomCorner;
-            if (northCap) {
-                bottomCorner = height - 1;
-            } else {
-                var topRightCorner = width - 1;
-                indices[index++] = topRightCorner;
-                indices[index++] = topRightCorner + length;
-                bottomCorner = width + height - 2;
-            }
-
-            indices[index++] = bottomCorner;
-            indices[index++] = bottomCorner + length;
-
-            if (!southCap) {
-                var bottomLeftCorner = width + bottomCorner - 1;
-                indices[index++] = bottomLeftCorner;
-                indices[index] = bottomLeftCorner + length;
-            }
-
-            geo.indices = indices;
-
-            return geo;
-        }
-
-        /**
-         * A description of the outline of a a cartographic rectangle on an ellipsoid centered at the origin.
-         *
-         * @alias RectangleOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Rectangle} options.rectangle A cartographic rectangle with north, south, east and west properties in radians.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the rectangle lies.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Number} [options.height=0.0] The distance in meters between the rectangle and the ellipsoid surface.
-         * @param {Number} [options.rotation=0.0] The rotation of the rectangle, in radians. A positive rotation is counter-clockwise.
-         * @param {Number} [options.extrudedHeight] The distance in meters between the rectangle's extruded face and the ellipsoid surface.
-         *
-         * @exception {DeveloperError} <code>options.rectangle.north</code> must be in the interval [<code>-Pi/2</code>, <code>Pi/2</code>].
-         * @exception {DeveloperError} <code>options.rectangle.south</code> must be in the interval [<code>-Pi/2</code>, <code>Pi/2</code>].
-         * @exception {DeveloperError} <code>options.rectangle.east</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].
-         * @exception {DeveloperError} <code>options.rectangle.west</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].
-         * @exception {DeveloperError} <code>options.rectangle.north</code> must be greater than <code>rectangle.south</code>.
-         *
-         * @see RectangleOutlineGeometry#createGeometry
-         *
-         * @example
-         * var rectangle = new Cesium.RectangleOutlineGeometry({
-         *   ellipsoid : Cesium.Ellipsoid.WGS84,
-         *   rectangle : Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0),
-         *   height : 10000.0
-         * });
-         * var geometry = Cesium.RectangleOutlineGeometry.createGeometry(rectangle);
-         */
-        function RectangleOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var rectangle = options.rectangle;
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            var rotation = when.defaultValue(options.rotation, 0.0);
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(rectangle)) {
-                throw new Check.DeveloperError('rectangle is required.');
-            }
-            Cartesian2.Rectangle.validate(rectangle);
-            if (rectangle.north < rectangle.south) {
-                throw new Check.DeveloperError('options.rectangle.north must be greater than options.rectangle.south');
-            }
-            //>>includeEnd('debug');
-
-            var height = when.defaultValue(options.height, 0.0);
-            var extrudedHeight = when.defaultValue(options.extrudedHeight, height);
-
-            this._rectangle = Cartesian2.Rectangle.clone(rectangle);
-            this._granularity = granularity;
-            this._ellipsoid = ellipsoid;
-            this._surfaceHeight = Math.max(height, extrudedHeight);
-            this._rotation = rotation;
-            this._extrudedHeight = Math.min(height, extrudedHeight);
-            this._offsetAttribute = options.offsetAttribute;
-            this._workerName = 'createRectangleOutlineGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        RectangleOutlineGeometry.packedLength = Cartesian2.Rectangle.packedLength + Cartesian2.Ellipsoid.packedLength + 5;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {RectangleOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        RectangleOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            Cartesian2.Rectangle.pack(value._rectangle, array, startingIndex);
-            startingIndex += Cartesian2.Rectangle.packedLength;
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            array[startingIndex++] = value._granularity;
-            array[startingIndex++] = value._surfaceHeight;
-            array[startingIndex++] = value._rotation;
-            array[startingIndex++] = value._extrudedHeight;
-            array[startingIndex] = when.defaultValue(value._offsetAttribute, -1);
-
-            return array;
-        };
-
-        var scratchRectangle = new Cartesian2.Rectangle();
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchOptions = {
-            rectangle : scratchRectangle,
-            ellipsoid : scratchEllipsoid,
-            granularity : undefined,
-            height : undefined,
-            rotation : undefined,
-            extrudedHeight : undefined,
-            offsetAttribute : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {RectangleOutlineGeometry} [result] The object into which to store the result.
-         * @returns {RectangleOutlineGeometry} The modified result parameter or a new Quaternion instance if one was not provided.
-         */
-        RectangleOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var rectangle = Cartesian2.Rectangle.unpack(array, startingIndex, scratchRectangle);
-            startingIndex += Cartesian2.Rectangle.packedLength;
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var granularity = array[startingIndex++];
-            var height = array[startingIndex++];
-            var rotation = array[startingIndex++];
-            var extrudedHeight = array[startingIndex++];
-            var offsetAttribute = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.granularity = granularity;
-                scratchOptions.height = height;
-                scratchOptions.rotation = rotation;
-                scratchOptions.extrudedHeight = extrudedHeight;
-                scratchOptions.offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-                return new RectangleOutlineGeometry(scratchOptions);
-            }
-
-            result._rectangle = Cartesian2.Rectangle.clone(rectangle, result._rectangle);
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._surfaceHeight = height;
-            result._rotation = rotation;
-            result._extrudedHeight = extrudedHeight;
-            result._offsetAttribute = offsetAttribute === -1 ? undefined : offsetAttribute;
-
-            return result;
-        };
-
-        var nwScratch = new Cartographic.Cartographic();
-        /**
-         * Computes the geometric representation of an outline of a rectangle, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {RectangleOutlineGeometry} rectangleGeometry A description of the rectangle outline.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         *
-         * @exception {DeveloperError} Rotated rectangle is invalid.
-         */
-        RectangleOutlineGeometry.createGeometry = function(rectangleGeometry) {
-            var rectangle = rectangleGeometry._rectangle;
-            var ellipsoid = rectangleGeometry._ellipsoid;
-            var computedOptions = RectangleGeometryLibrary.RectangleGeometryLibrary.computeOptions(rectangle, rectangleGeometry._granularity, rectangleGeometry._rotation, 0, rectangleScratch, nwScratch);
-
-            var geometry;
-            var boundingSphere;
-
-            if ((_Math.CesiumMath.equalsEpsilon(rectangle.north, rectangle.south, _Math.CesiumMath.EPSILON10) ||
-                 (_Math.CesiumMath.equalsEpsilon(rectangle.east, rectangle.west, _Math.CesiumMath.EPSILON10)))) {
-                return undefined;
-            }
-
-            var surfaceHeight = rectangleGeometry._surfaceHeight;
-            var extrudedHeight = rectangleGeometry._extrudedHeight;
-            var extrude = !_Math.CesiumMath.equalsEpsilon(surfaceHeight, extrudedHeight, 0, _Math.CesiumMath.EPSILON2);
-            var offsetValue;
-            if (extrude) {
-                geometry = constructExtrudedRectangle(rectangleGeometry, computedOptions);
-                if (when.defined(rectangleGeometry._offsetAttribute)) {
-                    var size = geometry.attributes.position.values.length / 3;
-                    var offsetAttribute = new Uint8Array(size);
-                    if (rectangleGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.TOP) {
-                        offsetAttribute = arrayFill.arrayFill(offsetAttribute, 1, 0, size / 2);
-                    } else {
-                        offsetValue = rectangleGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                        offsetAttribute = arrayFill.arrayFill(offsetAttribute, offsetValue);
-                    }
-
-                    geometry.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        componentsPerAttribute : 1,
-                        values : offsetAttribute
-                    });
-                }
-                var topBS = BoundingSphere.BoundingSphere.fromRectangle3D(rectangle, ellipsoid, surfaceHeight, topBoundingSphere);
-                var bottomBS = BoundingSphere.BoundingSphere.fromRectangle3D(rectangle, ellipsoid, extrudedHeight, bottomBoundingSphere);
-                boundingSphere = BoundingSphere.BoundingSphere.union(topBS, bottomBS);
-            } else {
-                geometry = constructRectangle(rectangleGeometry, computedOptions);
-                geometry.attributes.position.values = PolygonPipeline.PolygonPipeline.scaleToGeodeticHeight(geometry.attributes.position.values, surfaceHeight, ellipsoid, false);
-
-                if (when.defined(rectangleGeometry._offsetAttribute)) {
-                    var length = geometry.attributes.position.values.length;
-                    var applyOffset = new Uint8Array(length / 3);
-                    offsetValue = rectangleGeometry._offsetAttribute === GeometryOffsetAttribute.GeometryOffsetAttribute.NONE ? 0 : 1;
-                    arrayFill.arrayFill(applyOffset, offsetValue);
-                    geometry.attributes.applyOffset = new GeometryAttribute.GeometryAttribute({
-                        componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                        componentsPerAttribute : 1,
-                        values : applyOffset
-                    });
-                }
-
-                boundingSphere = BoundingSphere.BoundingSphere.fromRectangle3D(rectangle, ellipsoid, surfaceHeight);
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : geometry.attributes,
-                indices : geometry.indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : boundingSphere,
-                offsetAttribute : rectangleGeometry._offsetAttribute
-            });
-        };
-
-    function createRectangleOutlineGeometry(rectangleGeometry, offset) {
-        if (when.defined(offset)) {
-            rectangleGeometry = RectangleOutlineGeometry.unpack(rectangleGeometry, offset);
-        }
-        rectangleGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(rectangleGeometry._ellipsoid);
-        rectangleGeometry._rectangle = Cartesian2.Rectangle.clone(rectangleGeometry._rectangle);
-        return RectangleOutlineGeometry.createGeometry(rectangleGeometry);
-    }
-
-    return createRectangleOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createSimplePolylineGeometry.js b/public/libs/Cesium/Workers/createSimplePolylineGeometry.js
deleted file mode 100644
index 960a45a..0000000
--- a/public/libs/Cesium/Workers/createSimplePolylineGeometry.js
+++ /dev/null
@@ -1,442 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './ArcType-66bc286a', './EllipsoidRhumbLine-f161e674', './EllipsoidGeodesic-84507801', './PolylinePipeline-a9f32196', './Color-69f1845f'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, IntersectionTests, Plane, ArcType, EllipsoidRhumbLine, EllipsoidGeodesic, PolylinePipeline, Color) { 'use strict';
-
-    function interpolateColors(p0, p1, color0, color1, minDistance, array, offset) {
-            var numPoints = PolylinePipeline.PolylinePipeline.numberOfPoints(p0, p1, minDistance);
-            var i;
-
-            var r0 = color0.red;
-            var g0 = color0.green;
-            var b0 = color0.blue;
-            var a0 = color0.alpha;
-
-            var r1 = color1.red;
-            var g1 = color1.green;
-            var b1 = color1.blue;
-            var a1 = color1.alpha;
-
-            if (Color.Color.equals(color0, color1)) {
-                for (i = 0; i < numPoints; i++) {
-                    array[offset++] = Color.Color.floatToByte(r0);
-                    array[offset++] = Color.Color.floatToByte(g0);
-                    array[offset++] = Color.Color.floatToByte(b0);
-                    array[offset++] = Color.Color.floatToByte(a0);
-                }
-                return offset;
-            }
-
-            var redPerVertex = (r1 - r0) / numPoints;
-            var greenPerVertex = (g1 - g0) / numPoints;
-            var bluePerVertex = (b1 - b0) / numPoints;
-            var alphaPerVertex = (a1 - a0) / numPoints;
-
-            var index = offset;
-            for (i = 0; i < numPoints; i++) {
-                array[index++] = Color.Color.floatToByte(r0 + i * redPerVertex);
-                array[index++] = Color.Color.floatToByte(g0 + i * greenPerVertex);
-                array[index++] = Color.Color.floatToByte(b0 + i * bluePerVertex);
-                array[index++] = Color.Color.floatToByte(a0 + i * alphaPerVertex);
-            }
-
-            return index;
-        }
-
-        /**
-         * A description of a polyline modeled as a line strip; the first two positions define a line segment,
-         * and each additional position defines a line segment from the previous position.
-         *
-         * @alias SimplePolylineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of {@link Cartesian3} defining the positions in the polyline as a line strip.
-         * @param {Color[]} [options.colors] An Array of {@link Color} defining the per vertex or per segment colors.
-         * @param {Boolean} [options.colorsPerVertex=false] A boolean that determines whether the colors will be flat across each segment of the line or interpolated across the vertices.
-         * @param {ArcType} [options.arcType=ArcType.GEODESIC] The type of line the polyline segments must follow.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude if options.arcType is not ArcType.NONE. Determines the number of positions in the buffer.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to be used as a reference.
-         *
-         * @exception {DeveloperError} At least two positions are required.
-         * @exception {DeveloperError} colors has an invalid length.
-         *
-         * @see SimplePolylineGeometry#createGeometry
-         *
-         * @example
-         * // A polyline with two connected line segments
-         * var polyline = new Cesium.SimplePolylineGeometry({
-         *   positions : Cesium.Cartesian3.fromDegreesArray([
-         *     0.0, 0.0,
-         *     5.0, 0.0,
-         *     5.0, 5.0
-         *   ])
-         * });
-         * var geometry = Cesium.SimplePolylineGeometry.createGeometry(polyline);
-         */
-        function SimplePolylineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var positions = options.positions;
-            var colors = options.colors;
-            var colorsPerVertex = when.defaultValue(options.colorsPerVertex, false);
-
-            //>>includeStart('debug', pragmas.debug);
-            if ((!when.defined(positions)) || (positions.length < 2)) {
-                throw new Check.DeveloperError('At least two positions are required.');
-            }
-            if (when.defined(colors) && ((colorsPerVertex && colors.length < positions.length) || (!colorsPerVertex && colors.length < positions.length - 1))) {
-                throw new Check.DeveloperError('colors has an invalid length.');
-            }
-            //>>includeEnd('debug');
-
-            this._positions = positions;
-            this._colors = colors;
-            this._colorsPerVertex = colorsPerVertex;
-
-            this._arcType = when.defaultValue(options.arcType, ArcType.ArcType.GEODESIC);
-            this._granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            this._ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-            this._workerName = 'createSimplePolylineGeometry';
-
-            var numComponents = 1 + positions.length * Cartographic.Cartesian3.packedLength;
-            numComponents += when.defined(colors) ? 1 + colors.length * Color.Color.packedLength : 1;
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = numComponents + Cartesian2.Ellipsoid.packedLength + 3;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {SimplePolylineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        SimplePolylineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var positions = value._positions;
-            var length = positions.length;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                Cartographic.Cartesian3.pack(positions[i], array, startingIndex);
-            }
-
-            var colors = value._colors;
-            length = when.defined(colors) ? colors.length : 0.0;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Color.Color.packedLength) {
-                Color.Color.pack(colors[i], array, startingIndex);
-            }
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            array[startingIndex++] = value._colorsPerVertex ? 1.0 : 0.0;
-            array[startingIndex++] = value._arcType;
-            array[startingIndex]   = value._granularity;
-
-            return array;
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {SimplePolylineGeometry} [result] The object into which to store the result.
-         * @returns {SimplePolylineGeometry} The modified result parameter or a new SimplePolylineGeometry instance if one was not provided.
-         */
-        SimplePolylineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var length = array[startingIndex++];
-            var positions = new Array(length);
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                positions[i] = Cartographic.Cartesian3.unpack(array, startingIndex);
-            }
-
-            length = array[startingIndex++];
-            var colors = length > 0 ? new Array(length) : undefined;
-
-            for (i = 0; i < length; ++i, startingIndex += Color.Color.packedLength) {
-                colors[i] = Color.Color.unpack(array, startingIndex);
-            }
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var colorsPerVertex = array[startingIndex++] === 1.0;
-            var arcType = array[startingIndex++];
-            var granularity = array[startingIndex];
-
-            if (!when.defined(result)) {
-                return new SimplePolylineGeometry({
-                    positions : positions,
-                    colors : colors,
-                    ellipsoid : ellipsoid,
-                    colorsPerVertex : colorsPerVertex,
-                    arcType : arcType,
-                    granularity : granularity
-                });
-            }
-
-            result._positions = positions;
-            result._colors = colors;
-            result._ellipsoid = ellipsoid;
-            result._colorsPerVertex = colorsPerVertex;
-            result._arcType = arcType;
-            result._granularity = granularity;
-
-            return result;
-        };
-
-        var scratchArray1 = new Array(2);
-        var scratchArray2 = new Array(2);
-        var generateArcOptionsScratch = {
-            positions : scratchArray1,
-            height: scratchArray2,
-            ellipsoid: undefined,
-            minDistance : undefined,
-            granularity : undefined
-        };
-
-        /**
-         * Computes the geometric representation of a simple polyline, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {SimplePolylineGeometry} simplePolylineGeometry A description of the polyline.
-         * @returns {Geometry} The computed vertices and indices.
-         */
-        SimplePolylineGeometry.createGeometry = function(simplePolylineGeometry) {
-            var positions = simplePolylineGeometry._positions;
-            var colors = simplePolylineGeometry._colors;
-            var colorsPerVertex = simplePolylineGeometry._colorsPerVertex;
-            var arcType = simplePolylineGeometry._arcType;
-            var granularity = simplePolylineGeometry._granularity;
-            var ellipsoid = simplePolylineGeometry._ellipsoid;
-
-            var minDistance = _Math.CesiumMath.chordLength(granularity, ellipsoid.maximumRadius);
-            var perSegmentColors = when.defined(colors) && !colorsPerVertex;
-
-            var i;
-            var length = positions.length;
-
-            var positionValues;
-            var numberOfPositions;
-            var colorValues;
-            var color;
-            var offset = 0;
-
-            if (arcType === ArcType.ArcType.GEODESIC || arcType === ArcType.ArcType.RHUMB) {
-                var subdivisionSize;
-                var numberOfPointsFunction;
-                var generateArcFunction;
-                if (arcType === ArcType.ArcType.GEODESIC) {
-                    subdivisionSize = _Math.CesiumMath.chordLength(granularity, ellipsoid.maximumRadius);
-                    numberOfPointsFunction = PolylinePipeline.PolylinePipeline.numberOfPoints;
-                    generateArcFunction = PolylinePipeline.PolylinePipeline.generateArc;
-                } else {
-                    subdivisionSize = granularity;
-                    numberOfPointsFunction = PolylinePipeline.PolylinePipeline.numberOfPointsRhumbLine;
-                    generateArcFunction = PolylinePipeline.PolylinePipeline.generateRhumbArc;
-                }
-
-                var heights = PolylinePipeline.PolylinePipeline.extractHeights(positions, ellipsoid);
-
-                var generateArcOptions = generateArcOptionsScratch;
-                if (arcType === ArcType.ArcType.GEODESIC) {
-                    generateArcOptions.minDistance = minDistance;
-                } else {
-                    generateArcOptions.granularity = granularity;
-                }
-                generateArcOptions.ellipsoid = ellipsoid;
-
-                if (perSegmentColors) {
-                    var positionCount = 0;
-                    for (i = 0; i < length - 1; i++) {
-                        positionCount += numberOfPointsFunction(positions[i], positions[i+1], subdivisionSize) + 1;
-                    }
-
-                    positionValues = new Float64Array(positionCount * 3);
-                    colorValues = new Uint8Array(positionCount * 4);
-
-                    generateArcOptions.positions = scratchArray1;
-                    generateArcOptions.height= scratchArray2;
-
-                    var ci = 0;
-                    for (i = 0; i < length - 1; ++i) {
-                        scratchArray1[0] = positions[i];
-                        scratchArray1[1] = positions[i + 1];
-
-                        scratchArray2[0] = heights[i];
-                        scratchArray2[1] = heights[i + 1];
-
-                        var pos = generateArcFunction(generateArcOptions);
-
-                        if (when.defined(colors)) {
-                            var segLen = pos.length / 3;
-                            color = colors[i];
-                            for(var k = 0; k < segLen; ++k) {
-                                colorValues[ci++] = Color.Color.floatToByte(color.red);
-                                colorValues[ci++] = Color.Color.floatToByte(color.green);
-                                colorValues[ci++] = Color.Color.floatToByte(color.blue);
-                                colorValues[ci++] = Color.Color.floatToByte(color.alpha);
-                            }
-                        }
-
-                        positionValues.set(pos, offset);
-                        offset += pos.length;
-                    }
-                } else {
-                    generateArcOptions.positions = positions;
-                    generateArcOptions.height= heights;
-                    positionValues = new Float64Array(generateArcFunction(generateArcOptions));
-
-                    if (when.defined(colors)) {
-                        colorValues = new Uint8Array(positionValues.length / 3 * 4);
-
-                        for (i = 0; i < length - 1; ++i) {
-                            var p0 = positions[i];
-                            var p1 = positions[i + 1];
-                            var c0 = colors[i];
-                            var c1 = colors[i + 1];
-                            offset = interpolateColors(p0, p1, c0, c1, minDistance, colorValues, offset);
-                        }
-
-                        var lastColor = colors[length - 1];
-                        colorValues[offset++] = Color.Color.floatToByte(lastColor.red);
-                        colorValues[offset++] = Color.Color.floatToByte(lastColor.green);
-                        colorValues[offset++] = Color.Color.floatToByte(lastColor.blue);
-                        colorValues[offset++] = Color.Color.floatToByte(lastColor.alpha);
-                    }
-                }
-            } else {
-                numberOfPositions = perSegmentColors ? length * 2 - 2 : length;
-                positionValues = new Float64Array(numberOfPositions * 3);
-                colorValues = when.defined(colors) ? new Uint8Array(numberOfPositions * 4) : undefined;
-
-                var positionIndex = 0;
-                var colorIndex = 0;
-
-                for (i = 0; i < length; ++i) {
-                    var p = positions[i];
-
-                    if (perSegmentColors && i > 0) {
-                        Cartographic.Cartesian3.pack(p, positionValues, positionIndex);
-                        positionIndex += 3;
-
-                        color = colors[i - 1];
-                        colorValues[colorIndex++] = Color.Color.floatToByte(color.red);
-                        colorValues[colorIndex++] = Color.Color.floatToByte(color.green);
-                        colorValues[colorIndex++] = Color.Color.floatToByte(color.blue);
-                        colorValues[colorIndex++] = Color.Color.floatToByte(color.alpha);
-                    }
-
-                    if (perSegmentColors && i === length - 1) {
-                        break;
-                    }
-
-                    Cartographic.Cartesian3.pack(p, positionValues, positionIndex);
-                    positionIndex += 3;
-
-                    if (when.defined(colors)) {
-                        color = colors[i];
-                        colorValues[colorIndex++] = Color.Color.floatToByte(color.red);
-                        colorValues[colorIndex++] = Color.Color.floatToByte(color.green);
-                        colorValues[colorIndex++] = Color.Color.floatToByte(color.blue);
-                        colorValues[colorIndex++] = Color.Color.floatToByte(color.alpha);
-                    }
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-            attributes.position = new GeometryAttribute.GeometryAttribute({
-                componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                componentsPerAttribute : 3,
-                values : positionValues
-            });
-
-            if (when.defined(colors)) {
-                attributes.color = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.UNSIGNED_BYTE,
-                    componentsPerAttribute : 4,
-                    values : colorValues,
-                    normalize : true
-                });
-            }
-
-            numberOfPositions = positionValues.length / 3;
-            var numberOfIndices = (numberOfPositions - 1) * 2;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfPositions, numberOfIndices);
-
-            var index = 0;
-            for (i = 0; i < numberOfPositions - 1; ++i) {
-                indices[index++] = i;
-                indices[index++] = i + 1;
-            }
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : BoundingSphere.BoundingSphere.fromPoints(positions)
-            });
-        };
-
-    function createSimplePolylineGeometry(simplePolylineGeometry, offset) {
-        if (when.defined(offset)) {
-            simplePolylineGeometry = SimplePolylineGeometry.unpack(simplePolylineGeometry, offset);
-        }
-        simplePolylineGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(simplePolylineGeometry._ellipsoid);
-        return SimplePolylineGeometry.createGeometry(simplePolylineGeometry);
-    }
-
-    return createSimplePolylineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createSphereGeometry.js b/public/libs/Cesium/Workers/createSphereGeometry.js
deleted file mode 100644
index 6767a52..0000000
--- a/public/libs/Cesium/Workers/createSphereGeometry.js
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './EllipsoidGeometry-833b1e19'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, VertexFormat, EllipsoidGeometry) { 'use strict';
-
-    /**
-         * A description of a sphere centered at the origin.
-         *
-         * @alias SphereGeometry
-         * @constructor
-         *
-         * @param {Object} [options] Object with the following properties:
-         * @param {Number} [options.radius=1.0] The radius of the sphere.
-         * @param {Number} [options.stackPartitions=64] The number of times to partition the ellipsoid into stacks.
-         * @param {Number} [options.slicePartitions=64] The number of times to partition the ellipsoid into radial slices.
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         *
-         * @exception {DeveloperError} options.slicePartitions cannot be less than three.
-         * @exception {DeveloperError} options.stackPartitions cannot be less than three.
-         *
-         * @see SphereGeometry#createGeometry
-         *
-         * @example
-         * var sphere = new Cesium.SphereGeometry({
-         *   radius : 100.0,
-         *   vertexFormat : Cesium.VertexFormat.POSITION_ONLY
-         * });
-         * var geometry = Cesium.SphereGeometry.createGeometry(sphere);
-         */
-        function SphereGeometry(options) {
-            var radius = when.defaultValue(options.radius, 1.0);
-            var radii = new Cartographic.Cartesian3(radius, radius, radius);
-            var ellipsoidOptions = {
-                    radii: radii,
-                    stackPartitions: options.stackPartitions,
-                    slicePartitions: options.slicePartitions,
-                    vertexFormat: options.vertexFormat
-            };
-
-            this._ellipsoidGeometry = new EllipsoidGeometry.EllipsoidGeometry(ellipsoidOptions);
-            this._workerName = 'createSphereGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        SphereGeometry.packedLength = EllipsoidGeometry.EllipsoidGeometry.packedLength;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {SphereGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        SphereGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            //>>includeEnd('debug');
-
-            return EllipsoidGeometry.EllipsoidGeometry.pack(value._ellipsoidGeometry, array, startingIndex);
-        };
-
-        var scratchEllipsoidGeometry = new EllipsoidGeometry.EllipsoidGeometry();
-        var scratchOptions = {
-            radius : undefined,
-            radii : new Cartographic.Cartesian3(),
-            vertexFormat : new VertexFormat.VertexFormat(),
-            stackPartitions : undefined,
-            slicePartitions : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {SphereGeometry} [result] The object into which to store the result.
-         * @returns {SphereGeometry} The modified result parameter or a new SphereGeometry instance if one was not provided.
-         */
-        SphereGeometry.unpack = function(array, startingIndex, result) {
-            var ellipsoidGeometry = EllipsoidGeometry.EllipsoidGeometry.unpack(array, startingIndex, scratchEllipsoidGeometry);
-            scratchOptions.vertexFormat = VertexFormat.VertexFormat.clone(ellipsoidGeometry._vertexFormat, scratchOptions.vertexFormat);
-            scratchOptions.stackPartitions = ellipsoidGeometry._stackPartitions;
-            scratchOptions.slicePartitions = ellipsoidGeometry._slicePartitions;
-
-            if (!when.defined(result)) {
-                scratchOptions.radius = ellipsoidGeometry._radii.x;
-                return new SphereGeometry(scratchOptions);
-            }
-
-            Cartographic.Cartesian3.clone(ellipsoidGeometry._radii, scratchOptions.radii);
-            result._ellipsoidGeometry = new EllipsoidGeometry.EllipsoidGeometry(scratchOptions);
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of a sphere, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {SphereGeometry} sphereGeometry A description of the sphere.
-         * @returns {Geometry} The computed vertices and indices.
-         */
-        SphereGeometry.createGeometry = function(sphereGeometry) {
-            return EllipsoidGeometry.EllipsoidGeometry.createGeometry(sphereGeometry._ellipsoidGeometry);
-        };
-
-    function createSphereGeometry(sphereGeometry, offset) {
-        if (when.defined(offset)) {
-            sphereGeometry = SphereGeometry.unpack(sphereGeometry, offset);
-        }
-        return SphereGeometry.createGeometry(sphereGeometry);
-    }
-
-    return createSphereGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createSphereOutlineGeometry.js b/public/libs/Cesium/Workers/createSphereOutlineGeometry.js
deleted file mode 100644
index f46f9d8..0000000
--- a/public/libs/Cesium/Workers/createSphereOutlineGeometry.js
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './EllipsoidOutlineGeometry-2ac32d7f'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, arrayFill, GeometryOffsetAttribute, EllipsoidOutlineGeometry) { 'use strict';
-
-    /**
-         * A description of the outline of a sphere.
-         *
-         * @alias SphereOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} [options] Object with the following properties:
-         * @param {Number} [options.radius=1.0] The radius of the sphere.
-         * @param {Number} [options.stackPartitions=10] The count of stacks for the sphere (1 greater than the number of parallel lines).
-         * @param {Number} [options.slicePartitions=8] The count of slices for the sphere (Equal to the number of radial lines).
-         * @param {Number} [options.subdivisions=200] The number of points per line, determining the granularity of the curvature .
-         *
-         * @exception {DeveloperError} options.stackPartitions must be greater than or equal to one.
-         * @exception {DeveloperError} options.slicePartitions must be greater than or equal to zero.
-         * @exception {DeveloperError} options.subdivisions must be greater than or equal to zero.
-         *
-         * @example
-         * var sphere = new Cesium.SphereOutlineGeometry({
-         *   radius : 100.0,
-         *   stackPartitions : 6,
-         *   slicePartitions: 5
-         * });
-         * var geometry = Cesium.SphereOutlineGeometry.createGeometry(sphere);
-         */
-        function SphereOutlineGeometry(options) {
-            var radius = when.defaultValue(options.radius, 1.0);
-            var radii = new Cartographic.Cartesian3(radius, radius, radius);
-            var ellipsoidOptions = {
-                    radii: radii,
-                    stackPartitions: options.stackPartitions,
-                    slicePartitions: options.slicePartitions,
-                    subdivisions: options.subdivisions
-            };
-
-            this._ellipsoidGeometry = new EllipsoidOutlineGeometry.EllipsoidOutlineGeometry(ellipsoidOptions);
-            this._workerName = 'createSphereOutlineGeometry';
-        }
-
-        /**
-         * The number of elements used to pack the object into an array.
-         * @type {Number}
-         */
-        SphereOutlineGeometry.packedLength = EllipsoidOutlineGeometry.EllipsoidOutlineGeometry.packedLength;
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {SphereOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        SphereOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('value', value);
-            //>>includeEnd('debug');
-
-            return EllipsoidOutlineGeometry.EllipsoidOutlineGeometry.pack(value._ellipsoidGeometry, array, startingIndex);
-        };
-
-        var scratchEllipsoidGeometry = new EllipsoidOutlineGeometry.EllipsoidOutlineGeometry();
-        var scratchOptions = {
-            radius : undefined,
-            radii : new Cartographic.Cartesian3(),
-            stackPartitions : undefined,
-            slicePartitions : undefined,
-            subdivisions : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {SphereOutlineGeometry} [result] The object into which to store the result.
-         * @returns {SphereOutlineGeometry} The modified result parameter or a new SphereOutlineGeometry instance if one was not provided.
-         */
-        SphereOutlineGeometry.unpack = function(array, startingIndex, result) {
-            var ellipsoidGeometry = EllipsoidOutlineGeometry.EllipsoidOutlineGeometry.unpack(array, startingIndex, scratchEllipsoidGeometry);
-            scratchOptions.stackPartitions = ellipsoidGeometry._stackPartitions;
-            scratchOptions.slicePartitions = ellipsoidGeometry._slicePartitions;
-            scratchOptions.subdivisions = ellipsoidGeometry._subdivisions;
-
-            if (!when.defined(result)) {
-                scratchOptions.radius = ellipsoidGeometry._radii.x;
-                return new SphereOutlineGeometry(scratchOptions);
-            }
-
-            Cartographic.Cartesian3.clone(ellipsoidGeometry._radii, scratchOptions.radii);
-            result._ellipsoidGeometry = new EllipsoidOutlineGeometry.EllipsoidOutlineGeometry(scratchOptions);
-            return result;
-        };
-
-        /**
-         * Computes the geometric representation of an outline of a sphere, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {SphereOutlineGeometry} sphereGeometry A description of the sphere outline.
-         * @returns {Geometry} The computed vertices and indices.
-         */
-        SphereOutlineGeometry.createGeometry = function(sphereGeometry) {
-            return EllipsoidOutlineGeometry.EllipsoidOutlineGeometry.createGeometry(sphereGeometry._ellipsoidGeometry);
-        };
-
-    function createSphereOutlineGeometry(sphereGeometry, offset) {
-        if (when.defined(offset)) {
-            sphereGeometry = SphereOutlineGeometry.unpack(sphereGeometry, offset);
-        }
-        return SphereOutlineGeometry.createGeometry(sphereGeometry);
-    }
-
-    return createSphereOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createTaskProcessorWorker.js b/public/libs/Cesium/Workers/createTaskProcessorWorker.js
deleted file mode 100644
index a1218e9..0000000
--- a/public/libs/Cesium/Workers/createTaskProcessorWorker.js
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60'], function (when) { 'use strict';
-
-    /**
-         * Formats an error object into a String.  If available, uses name, message, and stack
-         * properties, otherwise, falls back on toString().
-         *
-         * @exports formatError
-         *
-         * @param {*} object The item to find in the array.
-         * @returns {String} A string containing the formatted error.
-         */
-        function formatError(object) {
-            var result;
-
-            var name = object.name;
-            var message = object.message;
-            if (when.defined(name) && when.defined(message)) {
-                result = name + ': ' + message;
-            } else {
-                result = object.toString();
-            }
-
-            var stack = object.stack;
-            if (when.defined(stack)) {
-                result += '\n' + stack;
-            }
-
-            return result;
-        }
-
-    // createXXXGeometry functions may return Geometry or a Promise that resolves to Geometry
-        // if the function requires access to ApproximateTerrainHeights.
-        // For fully synchronous functions, just wrapping the function call in a `when` Promise doesn't
-        // handle errors correctly, hence try-catch
-        function callAndWrap(workerFunction, parameters, transferableObjects) {
-            var resultOrPromise;
-            try {
-                resultOrPromise = workerFunction(parameters, transferableObjects);
-                return resultOrPromise; // errors handled by Promise
-            } catch (e) {
-                return when.when.reject(e);
-            }
-        }
-
-        /**
-         * Creates an adapter function to allow a calculation function to operate as a Web Worker,
-         * paired with TaskProcessor, to receive tasks and return results.
-         *
-         * @exports createTaskProcessorWorker
-         *
-         * @param {createTaskProcessorWorker~WorkerFunction} workerFunction The calculation function,
-         *        which takes parameters and returns a result.
-         * @returns {createTaskProcessorWorker~TaskProcessorWorkerFunction} A function that adapts the
-         *          calculation function to work as a Web Worker onmessage listener with TaskProcessor.
-         *
-         *
-         * @example
-         * function doCalculation(parameters, transferableObjects) {
-         *   // calculate some result using the inputs in parameters
-         *   return result;
-         * }
-         *
-         * return Cesium.createTaskProcessorWorker(doCalculation);
-         * // the resulting function is compatible with TaskProcessor
-         *
-         * @see TaskProcessor
-         * @see {@link http://www.w3.org/TR/workers/|Web Workers}
-         * @see {@link http://www.w3.org/TR/html5/common-dom-interfaces.html#transferable-objects|Transferable objects}
-         */
-        function createTaskProcessorWorker(workerFunction) {
-            var postMessage;
-
-            return function(event) {
-                var data = event.data;
-
-                var transferableObjects = [];
-                var responseMessage = {
-                    id : data.id,
-                    result : undefined,
-                    error : undefined
-                };
-
-                return when.when(callAndWrap(workerFunction, data.parameters, transferableObjects))
-                    .then(function(result) {
-                        responseMessage.result = result;
-                    })
-                    .otherwise(function(e) {
-                        if (e instanceof Error) {
-                            // Errors can't be posted in a message, copy the properties
-                            responseMessage.error = {
-                                name : e.name,
-                                message : e.message,
-                                stack : e.stack
-                            };
-                        } else {
-                            responseMessage.error = e;
-                        }
-                    })
-                    .always(function() {
-                        if (!when.defined(postMessage)) {
-                            postMessage = when.defaultValue(self.webkitPostMessage, self.postMessage);
-                        }
-
-                        if (!data.canTransferArrayBuffer) {
-                            transferableObjects.length = 0;
-                        }
-
-                        try {
-                            postMessage(responseMessage, transferableObjects);
-                        } catch (e) {
-                            // something went wrong trying to post the message, post a simpler
-                            // error that we can be sure will be cloneable
-                            responseMessage.result = undefined;
-                            responseMessage.error = 'postMessage failed with error: ' + formatError(e) + '\n  with responseMessage: ' + JSON.stringify(responseMessage);
-                            postMessage(responseMessage);
-                        }
-                    });
-            };
-        }
-
-    return createTaskProcessorWorker;
-
-});
diff --git a/public/libs/Cesium/Workers/createVectorTileGeometries.js b/public/libs/Cesium/Workers/createVectorTileGeometries.js
deleted file mode 100644
index 9d94ee0..0000000
--- a/public/libs/Cesium/Workers/createVectorTileGeometries.js
+++ /dev/null
@@ -1,364 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './createTaskProcessorWorker', './arrayFill-9766fb2e', './GeometryOffsetAttribute-999fc023', './VertexFormat-fe4db402', './BoxGeometry-009c66b6', './CylinderGeometryLibrary-8c0fda9f', './CylinderGeometry-3fb30286', './EllipsoidGeometry-833b1e19', './Color-69f1845f'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, createTaskProcessorWorker, arrayFill, GeometryOffsetAttribute, VertexFormat, BoxGeometry, CylinderGeometryLibrary, CylinderGeometry, EllipsoidGeometry, Color) { 'use strict';
-
-    /**
-     * Describes a renderable batch of geometry.
-     *
-     * @alias Vector3DTileBatch
-     * @constructor
-     *
-     * @param {Object} options An object with the following properties:
-     * @param {Number} options.offset The offset of the batch into the indices buffer.
-     * @param {Number} options.count The number of indices in the batch.
-     * @param {Color} options.color The color of the geometry in the batch.
-     * @param {Number[]} options.batchIds An array where each element is the batch id of the geometry in the batch.
-     *
-     * @private
-     */
-    function Vector3DTileBatch(options) {
-        /**
-         * The offset of the batch into the indices buffer.
-         * @type {Number}
-         */
-        this.offset = options.offset;
-        /**
-         * The number of indices in the batch.
-         * @type {Number}
-         */
-        this.count = options.count;
-        /**
-         * The color of the geometry in the batch.
-         * @type {Color}
-         */
-        this.color = options.color;
-        /**
-         * An array where each element is the batch id of the geometry in the batch.
-         * @type {Number[]}
-         */
-        this.batchIds = options.batchIds;
-    }
-
-    var scratchCartesian = new Cartographic.Cartesian3();
-
-    var packedBoxLength = BoundingSphere.Matrix4.packedLength + Cartographic.Cartesian3.packedLength;
-    var packedCylinderLength = BoundingSphere.Matrix4.packedLength + 2;
-    var packedEllipsoidLength = BoundingSphere.Matrix4.packedLength + Cartographic.Cartesian3.packedLength;
-    var packedSphereLength = Cartographic.Cartesian3.packedLength + 1;
-
-    var scratchModelMatrixAndBV = {
-        modelMatrix : new BoundingSphere.Matrix4(),
-        boundingVolume : new BoundingSphere.BoundingSphere()
-    };
-
-    function boxModelMatrixAndBoundingVolume(boxes, index) {
-        var boxIndex  = index * packedBoxLength;
-
-        var dimensions = Cartographic.Cartesian3.unpack(boxes, boxIndex, scratchCartesian);
-        boxIndex += Cartographic.Cartesian3.packedLength;
-
-        var boxModelMatrix = BoundingSphere.Matrix4.unpack(boxes, boxIndex, scratchModelMatrixAndBV.modelMatrix);
-        BoundingSphere.Matrix4.multiplyByScale(boxModelMatrix, dimensions, boxModelMatrix);
-
-        var boundingVolume = scratchModelMatrixAndBV.boundingVolume;
-        Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, boundingVolume.center);
-        boundingVolume.radius = Math.sqrt(3.0);
-
-        return scratchModelMatrixAndBV;
-    }
-
-    function cylinderModelMatrixAndBoundingVolume(cylinders, index) {
-        var cylinderIndex = index * packedCylinderLength;
-
-        var cylinderRadius = cylinders[cylinderIndex++];
-        var length = cylinders[cylinderIndex++];
-        var scale = Cartographic.Cartesian3.fromElements(cylinderRadius, cylinderRadius, length, scratchCartesian);
-
-        var cylinderModelMatrix = BoundingSphere.Matrix4.unpack(cylinders, cylinderIndex, scratchModelMatrixAndBV.modelMatrix);
-        BoundingSphere.Matrix4.multiplyByScale(cylinderModelMatrix, scale, cylinderModelMatrix);
-
-        var boundingVolume = scratchModelMatrixAndBV.boundingVolume;
-        Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, boundingVolume.center);
-        boundingVolume.radius = Math.sqrt(2.0);
-
-        return scratchModelMatrixAndBV;
-    }
-
-    function ellipsoidModelMatrixAndBoundingVolume(ellipsoids, index) {
-        var ellipsoidIndex = index * packedEllipsoidLength;
-
-        var radii = Cartographic.Cartesian3.unpack(ellipsoids, ellipsoidIndex, scratchCartesian);
-        ellipsoidIndex += Cartographic.Cartesian3.packedLength;
-
-        var ellipsoidModelMatrix = BoundingSphere.Matrix4.unpack(ellipsoids, ellipsoidIndex, scratchModelMatrixAndBV.modelMatrix);
-        BoundingSphere.Matrix4.multiplyByScale(ellipsoidModelMatrix, radii, ellipsoidModelMatrix);
-
-        var boundingVolume = scratchModelMatrixAndBV.boundingVolume;
-        Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, boundingVolume.center);
-        boundingVolume.radius = 1.0;
-
-        return scratchModelMatrixAndBV;
-    }
-
-    function sphereModelMatrixAndBoundingVolume(spheres, index) {
-        var sphereIndex = index * packedSphereLength;
-
-        var sphereRadius = spheres[sphereIndex++];
-
-        var sphereTranslation = Cartographic.Cartesian3.unpack(spheres, sphereIndex, scratchCartesian);
-        var sphereModelMatrix = BoundingSphere.Matrix4.fromTranslation(sphereTranslation, scratchModelMatrixAndBV.modelMatrix);
-        BoundingSphere.Matrix4.multiplyByUniformScale(sphereModelMatrix, sphereRadius, sphereModelMatrix);
-
-        var boundingVolume = scratchModelMatrixAndBV.boundingVolume;
-        Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, boundingVolume.center);
-        boundingVolume.radius = 1.0;
-
-        return scratchModelMatrixAndBV;
-    }
-
-    var scratchPosition = new Cartographic.Cartesian3();
-
-    function createPrimitive(options, primitive, primitiveBatchIds, geometry, getModelMatrixAndBoundingVolume) {
-        if (!when.defined(primitive)) {
-            return;
-        }
-
-        var numberOfPrimitives = primitiveBatchIds.length;
-        var geometryPositions = geometry.attributes.position.values;
-        var geometryIndices = geometry.indices;
-
-        var positions = options.positions;
-        var vertexBatchIds = options.vertexBatchIds;
-        var indices = options.indices;
-
-        var batchIds = options.batchIds;
-        var batchTableColors = options.batchTableColors;
-        var batchedIndices = options.batchedIndices;
-        var indexOffsets = options.indexOffsets;
-        var indexCounts = options.indexCounts;
-        var boundingVolumes = options.boundingVolumes;
-
-        var modelMatrix = options.modelMatrix;
-        var center = options.center;
-
-        var positionOffset = options.positionOffset;
-        var batchIdIndex = options.batchIdIndex;
-        var indexOffset = options.indexOffset;
-        var batchedIndicesOffset = options.batchedIndicesOffset;
-
-        for (var i = 0; i < numberOfPrimitives; ++i) {
-            var primitiveModelMatrixAndBV = getModelMatrixAndBoundingVolume(primitive, i);
-            var primitiveModelMatrix = primitiveModelMatrixAndBV.modelMatrix;
-            BoundingSphere.Matrix4.multiply(modelMatrix, primitiveModelMatrix, primitiveModelMatrix);
-
-            var batchId = primitiveBatchIds[i];
-
-            var positionsLength = geometryPositions.length;
-            for (var j = 0; j < positionsLength; j += 3) {
-                var position = Cartographic.Cartesian3.unpack(geometryPositions, j, scratchPosition);
-                BoundingSphere.Matrix4.multiplyByPoint(primitiveModelMatrix, position, position);
-                Cartographic.Cartesian3.subtract(position, center, position);
-
-                Cartographic.Cartesian3.pack(position, positions, positionOffset * 3 + j);
-                vertexBatchIds[batchIdIndex++] = batchId;
-            }
-
-            var indicesLength = geometryIndices.length;
-            for (var k = 0; k < indicesLength; ++k) {
-                indices[indexOffset + k] = geometryIndices[k] + positionOffset;
-            }
-
-            var offset = i + batchedIndicesOffset;
-            batchedIndices[offset] = new Vector3DTileBatch({
-                offset : indexOffset,
-                count : indicesLength,
-                color : Color.Color.fromRgba(batchTableColors[batchId]),
-                batchIds : [batchId]
-            });
-            batchIds[offset] = batchId;
-            indexOffsets[offset] = indexOffset;
-            indexCounts[offset] = indicesLength;
-            boundingVolumes[offset] = BoundingSphere.BoundingSphere.transform(primitiveModelMatrixAndBV.boundingVolume, primitiveModelMatrix);
-
-            positionOffset += positionsLength / 3;
-            indexOffset += indicesLength;
-        }
-
-        options.positionOffset = positionOffset;
-        options.batchIdIndex = batchIdIndex;
-        options.indexOffset = indexOffset;
-        options.batchedIndicesOffset += numberOfPrimitives;
-    }
-
-    var scratchCenter = new Cartographic.Cartesian3();
-    var scratchMatrix4 = new BoundingSphere.Matrix4();
-
-    function unpackBuffer(buffer) {
-        var packedBuffer = new Float64Array(buffer);
-
-        var offset = 0;
-        Cartographic.Cartesian3.unpack(packedBuffer, offset, scratchCenter);
-        offset += Cartographic.Cartesian3.packedLength;
-
-        BoundingSphere.Matrix4.unpack(packedBuffer, offset, scratchMatrix4);
-    }
-
-    function packedBatchedIndicesLength(batchedIndices) {
-        var length = batchedIndices.length;
-        var count = 0;
-        for (var i = 0; i < length; ++i) {
-            count += Color.Color.packedLength + 3 + batchedIndices[i].batchIds.length;
-        }
-        return count;
-    }
-
-    function packBuffer(indicesBytesPerElement, batchedIndices, boundingVolumes) {
-        var numBVs = boundingVolumes.length;
-        var length = 1 + 1 + numBVs * BoundingSphere.BoundingSphere.packedLength + 1 + packedBatchedIndicesLength(batchedIndices);
-
-        var packedBuffer = new Float64Array(length);
-
-        var offset = 0;
-        packedBuffer[offset++] = indicesBytesPerElement;
-        packedBuffer[offset++] = numBVs;
-
-        for (var i = 0; i < numBVs; ++i) {
-            BoundingSphere.BoundingSphere.pack(boundingVolumes[i], packedBuffer, offset);
-            offset += BoundingSphere.BoundingSphere.packedLength;
-        }
-
-        var indicesLength = batchedIndices.length;
-        packedBuffer[offset++] = indicesLength;
-
-        for (var j = 0; j < indicesLength; ++j) {
-            var batchedIndex = batchedIndices[j];
-
-            Color.Color.pack(batchedIndex.color, packedBuffer, offset);
-            offset += Color.Color.packedLength;
-
-            packedBuffer[offset++] = batchedIndex.offset;
-            packedBuffer[offset++] = batchedIndex.count;
-
-            var batchIds = batchedIndex.batchIds;
-            var batchIdsLength = batchIds.length;
-            packedBuffer[offset++] = batchIdsLength;
-
-            for (var k = 0; k < batchIdsLength; ++k) {
-                packedBuffer[offset++] = batchIds[k];
-            }
-        }
-
-        return packedBuffer;
-    }
-
-    function createVectorTileGeometries(parameters, transferableObjects) {
-        var boxes = when.defined(parameters.boxes) ? new Float32Array(parameters.boxes) : undefined;
-        var boxBatchIds = when.defined(parameters.boxBatchIds) ? new Uint16Array(parameters.boxBatchIds) : undefined;
-        var cylinders =  when.defined(parameters.cylinders) ? new Float32Array(parameters.cylinders) : undefined;
-        var cylinderBatchIds = when.defined(parameters.cylinderBatchIds) ? new Uint16Array(parameters.cylinderBatchIds) : undefined;
-        var ellipsoids =  when.defined(parameters.ellipsoids) ? new Float32Array(parameters.ellipsoids) : undefined;
-        var ellipsoidBatchIds = when.defined(parameters.ellipsoidBatchIds) ? new Uint16Array(parameters.ellipsoidBatchIds) : undefined;
-        var spheres = when.defined(parameters.spheres) ?  new Float32Array(parameters.spheres) : undefined;
-        var sphereBatchIds = when.defined(parameters.sphereBatchIds) ? new Uint16Array(parameters.sphereBatchIds) : undefined;
-
-        var numberOfBoxes = when.defined(boxes) ? boxBatchIds.length : 0;
-        var numberOfCylinders = when.defined(cylinders) ? cylinderBatchIds.length : 0;
-        var numberOfEllipsoids = when.defined(ellipsoids) ? ellipsoidBatchIds.length : 0;
-        var numberOfSpheres = when.defined(spheres) ? sphereBatchIds.length : 0;
-
-        var boxGeometry = BoxGeometry.BoxGeometry.getUnitBox();
-        var cylinderGeometry = CylinderGeometry.CylinderGeometry.getUnitCylinder();
-        var ellipsoidGeometry = EllipsoidGeometry.EllipsoidGeometry.getUnitEllipsoid();
-
-        var boxPositions = boxGeometry.attributes.position.values;
-        var cylinderPositions = cylinderGeometry.attributes.position.values;
-        var ellipsoidPositions = ellipsoidGeometry.attributes.position.values;
-
-        var numberOfPositions = boxPositions.length * numberOfBoxes;
-        numberOfPositions += cylinderPositions.length * numberOfCylinders;
-        numberOfPositions += ellipsoidPositions.length * (numberOfEllipsoids + numberOfSpheres);
-
-        var boxIndices = boxGeometry.indices;
-        var cylinderIndices = cylinderGeometry.indices;
-        var ellipsoidIndices = ellipsoidGeometry.indices;
-
-        var numberOfIndices = boxIndices.length * numberOfBoxes;
-        numberOfIndices += cylinderIndices.length * numberOfCylinders;
-        numberOfIndices += ellipsoidIndices.length * (numberOfEllipsoids + numberOfSpheres);
-
-        var positions = new Float32Array(numberOfPositions);
-        var vertexBatchIds = new Uint16Array(numberOfPositions / 3);
-        var indices = IndexDatatype.IndexDatatype.createTypedArray(numberOfPositions / 3, numberOfIndices);
-
-        var numberOfGeometries = numberOfBoxes + numberOfCylinders + numberOfEllipsoids + numberOfSpheres;
-        var batchIds = new Uint16Array(numberOfGeometries);
-        var batchedIndices = new Array(numberOfGeometries);
-        var indexOffsets = new Uint32Array(numberOfGeometries);
-        var indexCounts = new Uint32Array(numberOfGeometries);
-        var boundingVolumes = new Array(numberOfGeometries);
-
-        unpackBuffer(parameters.packedBuffer);
-
-        var options = {
-            batchTableColors : new Uint32Array(parameters.batchTableColors),
-            positions : positions,
-            vertexBatchIds : vertexBatchIds,
-            indices : indices,
-            batchIds : batchIds,
-            batchedIndices : batchedIndices,
-            indexOffsets : indexOffsets,
-            indexCounts : indexCounts,
-            boundingVolumes : boundingVolumes,
-            positionOffset : 0,
-            batchIdIndex : 0,
-            indexOffset : 0,
-            batchedIndicesOffset : 0,
-            modelMatrix : scratchMatrix4,
-            center : scratchCenter
-        };
-
-        createPrimitive(options, boxes, boxBatchIds, boxGeometry, boxModelMatrixAndBoundingVolume);
-        createPrimitive(options, cylinders, cylinderBatchIds, cylinderGeometry, cylinderModelMatrixAndBoundingVolume);
-        createPrimitive(options, ellipsoids, ellipsoidBatchIds, ellipsoidGeometry, ellipsoidModelMatrixAndBoundingVolume);
-        createPrimitive(options, spheres, sphereBatchIds, ellipsoidGeometry, sphereModelMatrixAndBoundingVolume);
-
-        var packedBuffer = packBuffer(indices.BYTES_PER_ELEMENT, batchedIndices, boundingVolumes);
-        transferableObjects.push(positions.buffer, vertexBatchIds.buffer, indices.buffer);
-        transferableObjects.push(batchIds.buffer, indexOffsets.buffer, indexCounts.buffer);
-        transferableObjects.push(packedBuffer.buffer);
-
-        return {
-            positions : positions.buffer,
-            vertexBatchIds : vertexBatchIds.buffer,
-            indices : indices.buffer,
-            indexOffsets : indexOffsets.buffer,
-            indexCounts : indexCounts.buffer,
-            batchIds : batchIds.buffer,
-            packedBuffer : packedBuffer.buffer
-        };
-    }
-    var createVectorTileGeometries$1 = createTaskProcessorWorker(createVectorTileGeometries);
-
-    return createVectorTileGeometries$1;
-
-});
diff --git a/public/libs/Cesium/Workers/createVectorTilePoints.js b/public/libs/Cesium/Workers/createVectorTilePoints.js
deleted file mode 100644
index 4beecdc..0000000
--- a/public/libs/Cesium/Workers/createVectorTilePoints.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './AttributeCompression-84a90a13', './createTaskProcessorWorker'], function (when, Check, _Math, Cartographic, Cartesian2, AttributeCompression, createTaskProcessorWorker) { 'use strict';
-
-    var maxShort = 32767;
-
-    var scratchBVCartographic = new Cartographic.Cartographic();
-    var scratchEncodedPosition = new Cartographic.Cartesian3();
-
-    var scratchRectangle = new Cartesian2.Rectangle();
-    var scratchEllipsoid = new Cartesian2.Ellipsoid();
-    var scratchMinMaxHeights = {
-        min : undefined,
-        max : undefined
-    };
-
-    function unpackBuffer(packedBuffer) {
-        packedBuffer = new Float64Array(packedBuffer);
-
-        var offset = 0;
-        scratchMinMaxHeights.min = packedBuffer[offset++];
-        scratchMinMaxHeights.max = packedBuffer[offset++];
-
-        Cartesian2.Rectangle.unpack(packedBuffer, offset, scratchRectangle);
-        offset += Cartesian2.Rectangle.packedLength;
-
-        Cartesian2.Ellipsoid.unpack(packedBuffer, offset, scratchEllipsoid);
-    }
-
-    function createVectorTilePoints(parameters, transferableObjects) {
-        var positions = new Uint16Array(parameters.positions);
-
-        unpackBuffer(parameters.packedBuffer);
-        var rectangle = scratchRectangle;
-        var ellipsoid = scratchEllipsoid;
-        var minimumHeight = scratchMinMaxHeights.min;
-        var maximumHeight = scratchMinMaxHeights.max;
-
-        var positionsLength = positions.length / 3;
-        var uBuffer = positions.subarray(0, positionsLength);
-        var vBuffer = positions.subarray(positionsLength, 2 * positionsLength);
-        var heightBuffer = positions.subarray(2 * positionsLength, 3 * positionsLength);
-        AttributeCompression.AttributeCompression.zigZagDeltaDecode(uBuffer, vBuffer, heightBuffer);
-
-        var decoded = new Float64Array(positions.length);
-        for (var i = 0; i < positionsLength; ++i) {
-            var u = uBuffer[i];
-            var v = vBuffer[i];
-            var h = heightBuffer[i];
-
-            var lon = _Math.CesiumMath.lerp(rectangle.west, rectangle.east, u / maxShort);
-            var lat = _Math.CesiumMath.lerp(rectangle.south, rectangle.north, v / maxShort);
-            var alt = _Math.CesiumMath.lerp(minimumHeight, maximumHeight, h / maxShort);
-
-            var cartographic = Cartographic.Cartographic.fromRadians(lon, lat, alt, scratchBVCartographic);
-            var decodedPosition = ellipsoid.cartographicToCartesian(cartographic, scratchEncodedPosition);
-            Cartographic.Cartesian3.pack(decodedPosition, decoded, i * 3);
-        }
-
-        transferableObjects.push(decoded.buffer);
-
-        return {
-            positions : decoded.buffer
-        };
-    }
-    var createVectorTilePoints$1 = createTaskProcessorWorker(createVectorTilePoints);
-
-    return createVectorTilePoints$1;
-
-});
diff --git a/public/libs/Cesium/Workers/createVectorTilePolygons.js b/public/libs/Cesium/Workers/createVectorTilePolygons.js
deleted file mode 100644
index d163b79..0000000
--- a/public/libs/Cesium/Workers/createVectorTilePolygons.js
+++ /dev/null
@@ -1,375 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './AttributeCompression-84a90a13', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './createTaskProcessorWorker', './EllipsoidTangentPlane-e324bfa4', './OrientedBoundingBox-0ede1598', './Color-69f1845f'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, FeatureDetection, Transforms, buildModuleUrl, AttributeCompression, IndexDatatype, IntersectionTests, Plane, createTaskProcessorWorker, EllipsoidTangentPlane, OrientedBoundingBox, Color) { 'use strict';
-
-    var scratchCenter = new Cartographic.Cartesian3();
-    var scratchEllipsoid = new Cartesian2.Ellipsoid();
-    var scratchRectangle = new Cartesian2.Rectangle();
-    var scratchScalars = {
-        min : undefined,
-        max : undefined,
-        indexBytesPerElement : undefined
-    };
-
-    function unpackBuffer(buffer) {
-        var packedBuffer = new Float64Array(buffer);
-
-        var offset = 0;
-        scratchScalars.indexBytesPerElement = packedBuffer[offset++];
-
-        scratchScalars.min = packedBuffer[offset++];
-        scratchScalars.max = packedBuffer[offset++];
-
-        Cartographic.Cartesian3.unpack(packedBuffer, offset, scratchCenter);
-        offset += Cartographic.Cartesian3.packedLength;
-
-        Cartesian2.Ellipsoid.unpack(packedBuffer, offset, scratchEllipsoid);
-        offset += Cartesian2.Ellipsoid.packedLength;
-
-        Cartesian2.Rectangle.unpack(packedBuffer, offset, scratchRectangle);
-    }
-
-    function packedBatchedIndicesLength(batchedIndices) {
-        var length = batchedIndices.length;
-        var count = 0;
-        for (var i = 0; i < length; ++i) {
-            count += Color.Color.packedLength + 3 + batchedIndices[i].batchIds.length;
-        }
-        return count;
-    }
-
-    function packBuffer(indexDatatype, boundingVolumes, batchedIndices) {
-        var numBVs = boundingVolumes.length;
-        var length = 1 + 1 + numBVs * OrientedBoundingBox.OrientedBoundingBox.packedLength + 1 + packedBatchedIndicesLength(batchedIndices);
-
-        var packedBuffer = new Float64Array(length);
-
-        var offset = 0;
-        packedBuffer[offset++] = indexDatatype;
-        packedBuffer[offset++] = numBVs;
-
-        for (var i = 0; i < numBVs; ++i) {
-            OrientedBoundingBox.OrientedBoundingBox.pack(boundingVolumes[i], packedBuffer, offset);
-            offset += OrientedBoundingBox.OrientedBoundingBox.packedLength;
-        }
-
-        var indicesLength = batchedIndices.length;
-        packedBuffer[offset++] = indicesLength;
-
-        for (var j = 0; j < indicesLength; ++j) {
-            var batchedIndex = batchedIndices[j];
-
-            Color.Color.pack(batchedIndex.color, packedBuffer, offset);
-            offset += Color.Color.packedLength;
-
-            packedBuffer[offset++] = batchedIndex.offset;
-            packedBuffer[offset++] = batchedIndex.count;
-
-            var batchIds = batchedIndex.batchIds;
-            var batchIdsLength = batchIds.length;
-            packedBuffer[offset++] = batchIdsLength;
-
-            for (var k = 0; k < batchIdsLength; ++k) {
-                packedBuffer[offset++] = batchIds[k];
-            }
-        }
-
-        return packedBuffer;
-    }
-
-    var maxShort = 32767;
-
-    var scratchEncodedPosition = new Cartographic.Cartesian3();
-    var scratchNormal = new Cartographic.Cartesian3();
-    var scratchScaledNormal = new Cartographic.Cartesian3();
-    var scratchMinHeightPosition = new Cartographic.Cartesian3();
-    var scratchMaxHeightPosition = new Cartographic.Cartesian3();
-    var scratchBVCartographic = new Cartographic.Cartographic();
-    var scratchBVRectangle = new Cartesian2.Rectangle();
-
-    function createVectorTilePolygons(parameters, transferableObjects) {
-        unpackBuffer(parameters.packedBuffer);
-
-        var indices;
-        var indexBytesPerElement = scratchScalars.indexBytesPerElement;
-        if (indexBytesPerElement === 2) {
-            indices = new Uint16Array(parameters.indices);
-        } else {
-            indices = new Uint32Array(parameters.indices);
-        }
-
-        var positions = new Uint16Array(parameters.positions);
-        var counts = new Uint32Array(parameters.counts);
-        var indexCounts = new Uint32Array(parameters.indexCounts);
-        var batchIds = new Uint32Array(parameters.batchIds);
-        var batchTableColors = new Uint32Array(parameters.batchTableColors);
-
-        var boundingVolumes = new Array(counts.length);
-
-        var center = scratchCenter;
-        var ellipsoid = scratchEllipsoid;
-        var rectangle = scratchRectangle;
-        var minHeight = scratchScalars.min;
-        var maxHeight = scratchScalars.max;
-
-        var minimumHeights = parameters.minimumHeights;
-        var maximumHeights = parameters.maximumHeights;
-        if (when.defined(minimumHeights) && when.defined(maximumHeights)) {
-            minimumHeights = new Float32Array(minimumHeights);
-            maximumHeights = new Float32Array(maximumHeights);
-        }
-
-        var i;
-        var j;
-        var rgba;
-
-        var positionsLength = positions.length / 2;
-        var uBuffer = positions.subarray(0, positionsLength);
-        var vBuffer = positions.subarray(positionsLength, 2 * positionsLength);
-        AttributeCompression.AttributeCompression.zigZagDeltaDecode(uBuffer, vBuffer);
-
-        var decodedPositions = new Float32Array(positionsLength * 3);
-        for (i = 0; i < positionsLength; ++i) {
-            var u = uBuffer[i];
-            var v = vBuffer[i];
-
-            var x = _Math.CesiumMath.lerp(rectangle.west, rectangle.east, u / maxShort);
-            var y = _Math.CesiumMath.lerp(rectangle.south, rectangle.north, v / maxShort);
-
-            var cart = Cartographic.Cartographic.fromRadians(x, y, 0.0, scratchBVCartographic);
-            var decodedPosition = ellipsoid.cartographicToCartesian(cart, scratchEncodedPosition);
-            Cartographic.Cartesian3.pack(decodedPosition, decodedPositions, i * 3);
-        }
-
-        var countsLength = counts.length;
-        var offsets = new Array(countsLength);
-        var indexOffsets = new Array(countsLength);
-        var currentOffset = 0;
-        var currentIndexOffset = 0;
-        for (i = 0; i < countsLength; ++i) {
-            offsets[i] = currentOffset;
-            indexOffsets[i] = currentIndexOffset;
-
-            currentOffset += counts[i];
-            currentIndexOffset += indexCounts[i];
-        }
-
-        var batchedPositions = new Float32Array(positionsLength * 3 * 2);
-        var batchedIds = new Uint16Array(positionsLength * 2);
-        var batchedIndexOffsets = new Uint32Array(indexOffsets.length);
-        var batchedIndexCounts = new Uint32Array(indexCounts.length);
-        var batchedIndices = [];
-
-        var colorToBuffers = {};
-        for (i = 0; i < countsLength; ++i) {
-            rgba = batchTableColors[i];
-            if (!when.defined(colorToBuffers[rgba])) {
-                colorToBuffers[rgba] = {
-                    positionLength : counts[i],
-                    indexLength : indexCounts[i],
-                    offset : 0,
-                    indexOffset : 0,
-                    batchIds : [i]
-                };
-            } else {
-                colorToBuffers[rgba].positionLength += counts[i];
-                colorToBuffers[rgba].indexLength += indexCounts[i];
-                colorToBuffers[rgba].batchIds.push(i);
-            }
-        }
-
-        // get the offsets and counts for the positions and indices of each primitive
-        var buffer;
-        var byColorPositionOffset = 0;
-        var byColorIndexOffset = 0;
-        for (rgba in colorToBuffers) {
-            if (colorToBuffers.hasOwnProperty(rgba)) {
-                buffer = colorToBuffers[rgba];
-                buffer.offset = byColorPositionOffset;
-                buffer.indexOffset = byColorIndexOffset;
-
-                var positionLength = buffer.positionLength * 2;
-                var indexLength = buffer.indexLength * 2 + buffer.positionLength * 6;
-
-                byColorPositionOffset += positionLength;
-                byColorIndexOffset += indexLength;
-
-                buffer.indexLength = indexLength;
-            }
-        }
-
-        var batchedDrawCalls = [];
-
-        for (rgba in colorToBuffers) {
-            if (colorToBuffers.hasOwnProperty(rgba)) {
-                buffer = colorToBuffers[rgba];
-
-                batchedDrawCalls.push({
-                    color : Color.Color.fromRgba(parseInt(rgba)),
-                    offset : buffer.indexOffset,
-                    count : buffer.indexLength,
-                    batchIds : buffer.batchIds
-                });
-            }
-        }
-
-        for (i = 0; i < countsLength; ++i) {
-            rgba = batchTableColors[i];
-
-            buffer = colorToBuffers[rgba];
-            var positionOffset = buffer.offset;
-            var positionIndex = positionOffset * 3;
-            var batchIdIndex = positionOffset;
-
-            var polygonOffset = offsets[i];
-            var polygonCount = counts[i];
-            var batchId = batchIds[i];
-
-            var polygonMinimumHeight = minHeight;
-            var polygonMaximumHeight = maxHeight;
-            if (when.defined(minimumHeights) && when.defined(maximumHeights)) {
-                polygonMinimumHeight = minimumHeights[i];
-                polygonMaximumHeight = maximumHeights[i];
-            }
-
-            var minLat = Number.POSITIVE_INFINITY;
-            var maxLat = Number.NEGATIVE_INFINITY;
-            var minLon = Number.POSITIVE_INFINITY;
-            var maxLon = Number.NEGATIVE_INFINITY;
-
-            for (j = 0; j < polygonCount; ++j) {
-                var position = Cartographic.Cartesian3.unpack(decodedPositions, polygonOffset * 3 + j * 3, scratchEncodedPosition);
-                ellipsoid.scaleToGeodeticSurface(position, position);
-
-                var carto = ellipsoid.cartesianToCartographic(position, scratchBVCartographic);
-                var lat = carto.latitude;
-                var lon = carto.longitude;
-
-                minLat = Math.min(lat, minLat);
-                maxLat = Math.max(lat, maxLat);
-                minLon = Math.min(lon, minLon);
-                maxLon = Math.max(lon, maxLon);
-
-                var normal = ellipsoid.geodeticSurfaceNormal(position, scratchNormal);
-                var scaledNormal = Cartographic.Cartesian3.multiplyByScalar(normal, polygonMinimumHeight, scratchScaledNormal);
-                var minHeightPosition = Cartographic.Cartesian3.add(position, scaledNormal, scratchMinHeightPosition);
-
-                scaledNormal = Cartographic.Cartesian3.multiplyByScalar(normal, polygonMaximumHeight, scaledNormal);
-                var maxHeightPosition = Cartographic.Cartesian3.add(position, scaledNormal, scratchMaxHeightPosition);
-
-                Cartographic.Cartesian3.subtract(maxHeightPosition, center, maxHeightPosition);
-                Cartographic.Cartesian3.subtract(minHeightPosition, center, minHeightPosition);
-
-                Cartographic.Cartesian3.pack(maxHeightPosition, batchedPositions, positionIndex);
-                Cartographic.Cartesian3.pack(minHeightPosition, batchedPositions, positionIndex + 3);
-
-                batchedIds[batchIdIndex] = batchId;
-                batchedIds[batchIdIndex + 1] = batchId;
-
-                positionIndex += 6;
-                batchIdIndex += 2;
-            }
-
-            rectangle = scratchBVRectangle;
-            rectangle.west = minLon;
-            rectangle.east = maxLon;
-            rectangle.south = minLat;
-            rectangle.north = maxLat;
-
-            boundingVolumes[i] = OrientedBoundingBox.OrientedBoundingBox.fromRectangle(rectangle, minHeight, maxHeight, ellipsoid);
-
-            var indicesIndex = buffer.indexOffset;
-
-            var indexOffset = indexOffsets[i];
-            var indexCount = indexCounts[i];
-
-            batchedIndexOffsets[i] = indicesIndex;
-
-            for (j = 0; j < indexCount; j += 3) {
-                var i0 = indices[indexOffset + j] - polygonOffset;
-                var i1 = indices[indexOffset + j + 1] - polygonOffset;
-                var i2 = indices[indexOffset + j + 2] - polygonOffset;
-
-                // triangle on the top of the extruded polygon
-                batchedIndices[indicesIndex++] = i0 * 2 + positionOffset;
-                batchedIndices[indicesIndex++] = i1 * 2 + positionOffset;
-                batchedIndices[indicesIndex++] = i2 * 2 + positionOffset;
-
-                // triangle on the bottom of the extruded polygon
-                batchedIndices[indicesIndex++] = i2 * 2 + 1 + positionOffset;
-                batchedIndices[indicesIndex++] = i1 * 2 + 1 + positionOffset;
-                batchedIndices[indicesIndex++] = i0 * 2 + 1 + positionOffset;
-            }
-
-            // indices for the walls of the extruded polygon
-            for (j = 0; j < polygonCount; ++j) {
-                var v0 = j;
-                var v1 = (j + 1) % polygonCount;
-
-                batchedIndices[indicesIndex++] = v0 * 2 + 1 + positionOffset;
-                batchedIndices[indicesIndex++] = v1 * 2 + positionOffset;
-                batchedIndices[indicesIndex++] = v0 * 2 + positionOffset;
-
-                batchedIndices[indicesIndex++] = v0 * 2 + 1 + positionOffset;
-                batchedIndices[indicesIndex++] = v1 * 2 + 1 + positionOffset;
-                batchedIndices[indicesIndex++] = v1 * 2 + positionOffset;
-            }
-
-            buffer.offset += polygonCount * 2;
-            buffer.indexOffset = indicesIndex;
-
-            batchedIndexCounts[i] = indicesIndex - batchedIndexOffsets[i];
-        }
-
-        batchedIndices = IndexDatatype.IndexDatatype.createTypedArray(batchedPositions.length / 3, batchedIndices);
-
-        var batchedIndicesLength = batchedDrawCalls.length;
-        for (var m = 0; m < batchedIndicesLength; ++m) {
-            var tempIds = batchedDrawCalls[m].batchIds;
-            var count = 0;
-            var tempIdsLength = tempIds.length;
-            for (var n = 0; n < tempIdsLength; ++n) {
-                count += batchedIndexCounts[tempIds[n]];
-            }
-            batchedDrawCalls[m].count = count;
-        }
-
-        var indexDatatype = (batchedIndices.BYTES_PER_ELEMENT === 2) ?  IndexDatatype.IndexDatatype.UNSIGNED_SHORT : IndexDatatype.IndexDatatype.UNSIGNED_INT;
-        var packedBuffer = packBuffer(indexDatatype, boundingVolumes, batchedDrawCalls);
-
-        transferableObjects.push(batchedPositions.buffer, batchedIndices.buffer, batchedIndexOffsets.buffer, batchedIndexCounts.buffer, batchedIds.buffer, packedBuffer.buffer);
-
-        return {
-            positions : batchedPositions.buffer,
-            indices : batchedIndices.buffer,
-            indexOffsets : batchedIndexOffsets.buffer,
-            indexCounts : batchedIndexCounts.buffer,
-            batchIds : batchedIds.buffer,
-            packedBuffer : packedBuffer.buffer
-        };
-    }
-    var createVectorTilePolygons$1 = createTaskProcessorWorker(createVectorTilePolygons);
-
-    return createVectorTilePolygons$1;
-
-});
diff --git a/public/libs/Cesium/Workers/createVectorTilePolylines.js b/public/libs/Cesium/Workers/createVectorTilePolylines.js
deleted file mode 100644
index dc1ecf1..0000000
--- a/public/libs/Cesium/Workers/createVectorTilePolylines.js
+++ /dev/null
@@ -1,203 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './WebGLConstants-4c11ee5f', './AttributeCompression-84a90a13', './IndexDatatype-9435b55f', './createTaskProcessorWorker'], function (when, Check, _Math, Cartographic, Cartesian2, WebGLConstants, AttributeCompression, IndexDatatype, createTaskProcessorWorker) { 'use strict';
-
-    var maxShort = 32767;
-
-    var scratchBVCartographic = new Cartographic.Cartographic();
-    var scratchEncodedPosition = new Cartographic.Cartesian3();
-
-    function decodePositions(positions, rectangle, minimumHeight, maximumHeight, ellipsoid) {
-        var positionsLength = positions.length / 3;
-        var uBuffer = positions.subarray(0, positionsLength);
-        var vBuffer = positions.subarray(positionsLength, 2 * positionsLength);
-        var heightBuffer = positions.subarray(2 * positionsLength, 3 * positionsLength);
-        AttributeCompression.AttributeCompression.zigZagDeltaDecode(uBuffer, vBuffer, heightBuffer);
-
-        var decoded = new Float32Array(positions.length);
-        for (var i = 0; i < positionsLength; ++i) {
-            var u = uBuffer[i];
-            var v = vBuffer[i];
-            var h = heightBuffer[i];
-
-            var lon = _Math.CesiumMath.lerp(rectangle.west, rectangle.east, u / maxShort);
-            var lat = _Math.CesiumMath.lerp(rectangle.south, rectangle.north, v / maxShort);
-            var alt = _Math.CesiumMath.lerp(minimumHeight, maximumHeight, h / maxShort);
-
-            var cartographic = Cartographic.Cartographic.fromRadians(lon, lat, alt, scratchBVCartographic);
-            var decodedPosition = ellipsoid.cartographicToCartesian(cartographic, scratchEncodedPosition);
-            Cartographic.Cartesian3.pack(decodedPosition, decoded, i * 3);
-        }
-        return decoded;
-    }
-
-    var scratchRectangle = new Cartesian2.Rectangle();
-    var scratchEllipsoid = new Cartesian2.Ellipsoid();
-    var scratchCenter = new Cartographic.Cartesian3();
-    var scratchMinMaxHeights = {
-        min : undefined,
-        max : undefined
-    };
-
-    function unpackBuffer(packedBuffer) {
-        packedBuffer = new Float64Array(packedBuffer);
-
-        var offset = 0;
-        scratchMinMaxHeights.min = packedBuffer[offset++];
-        scratchMinMaxHeights.max = packedBuffer[offset++];
-
-        Cartesian2.Rectangle.unpack(packedBuffer, offset, scratchRectangle);
-        offset += Cartesian2.Rectangle.packedLength;
-
-        Cartesian2.Ellipsoid.unpack(packedBuffer, offset, scratchEllipsoid);
-        offset += Cartesian2.Ellipsoid.packedLength;
-
-        Cartographic.Cartesian3.unpack(packedBuffer, offset, scratchCenter);
-    }
-
-    var scratchP0 = new Cartographic.Cartesian3();
-    var scratchP1 = new Cartographic.Cartesian3();
-    var scratchPrev = new Cartographic.Cartesian3();
-    var scratchCur = new Cartographic.Cartesian3();
-    var scratchNext = new Cartographic.Cartesian3();
-
-    function createVectorTilePolylines(parameters, transferableObjects) {
-        var encodedPositions = new Uint16Array(parameters.positions);
-        var widths = new Uint16Array(parameters.widths);
-        var counts = new Uint32Array(parameters.counts);
-        var batchIds = new Uint16Array(parameters.batchIds);
-
-        unpackBuffer(parameters.packedBuffer);
-        var rectangle = scratchRectangle;
-        var ellipsoid = scratchEllipsoid;
-        var center = scratchCenter;
-        var minimumHeight = scratchMinMaxHeights.min;
-        var maximumHeight = scratchMinMaxHeights.max;
-
-        var positions = decodePositions(encodedPositions, rectangle, minimumHeight, maximumHeight, ellipsoid);
-
-        var positionsLength = positions.length / 3;
-        var size = positionsLength * 4 - 4;
-
-        var curPositions = new Float32Array(size * 3);
-        var prevPositions = new Float32Array(size * 3);
-        var nextPositions = new Float32Array(size * 3);
-        var expandAndWidth = new Float32Array(size * 2);
-        var vertexBatchIds = new Uint16Array(size);
-
-        var positionIndex = 0;
-        var expandAndWidthIndex = 0;
-        var batchIdIndex = 0;
-
-        var i;
-        var offset = 0;
-        var length = counts.length;
-
-        for (i = 0; i < length; ++i) {
-            var count = counts [i];
-            var width = widths[i];
-            var batchId = batchIds[i];
-
-            for (var j = 0; j < count; ++j) {
-                var previous;
-                if (j === 0) {
-                    var p0 = Cartographic.Cartesian3.unpack(positions, offset * 3, scratchP0);
-                    var p1 = Cartographic.Cartesian3.unpack(positions, (offset + 1) * 3, scratchP1);
-
-                    previous = Cartographic.Cartesian3.subtract(p0, p1, scratchPrev);
-                    Cartographic.Cartesian3.add(p0, previous, previous);
-                } else {
-                    previous = Cartographic.Cartesian3.unpack(positions, (offset + j - 1) * 3, scratchPrev);
-                }
-
-                var current = Cartographic.Cartesian3.unpack(positions, (offset + j) * 3, scratchCur);
-
-                var next;
-                if (j === count - 1) {
-                    var p2 = Cartographic.Cartesian3.unpack(positions, (offset + count - 1) * 3, scratchP0);
-                    var p3 = Cartographic.Cartesian3.unpack(positions, (offset + count - 2) * 3, scratchP1);
-
-                    next = Cartographic.Cartesian3.subtract(p2, p3, scratchNext);
-                    Cartographic.Cartesian3.add(p2, next, next);
-                } else {
-                    next = Cartographic.Cartesian3.unpack(positions, (offset + j + 1) * 3, scratchNext);
-                }
-
-                Cartographic.Cartesian3.subtract(previous, center, previous);
-                Cartographic.Cartesian3.subtract(current, center, current);
-                Cartographic.Cartesian3.subtract(next, center, next);
-
-                var startK = j === 0 ? 2 : 0;
-                var endK = j === count - 1 ? 2 : 4;
-
-                for (var k = startK; k < endK; ++k) {
-                    Cartographic.Cartesian3.pack(current, curPositions, positionIndex);
-                    Cartographic.Cartesian3.pack(previous, prevPositions, positionIndex);
-                    Cartographic.Cartesian3.pack(next, nextPositions, positionIndex);
-                    positionIndex += 3;
-
-                    var direction = (k - 2 < 0) ? -1.0 : 1.0;
-                    expandAndWidth[expandAndWidthIndex++] = 2 * (k % 2) - 1;
-                    expandAndWidth[expandAndWidthIndex++] = direction * width;
-
-                    vertexBatchIds[batchIdIndex++] = batchId;
-                }
-            }
-
-            offset += count;
-        }
-
-        var indices = IndexDatatype.IndexDatatype.createTypedArray(size, positionsLength * 6 - 6);
-        var index = 0;
-        var indicesIndex = 0;
-        length = positionsLength - 1;
-        for (i = 0; i < length; ++i) {
-            indices[indicesIndex++] = index;
-            indices[indicesIndex++] = index + 2;
-            indices[indicesIndex++] = index + 1;
-
-            indices[indicesIndex++] = index + 1;
-            indices[indicesIndex++] = index + 2;
-            indices[indicesIndex++] = index + 3;
-
-            index += 4;
-        }
-
-        transferableObjects.push(curPositions.buffer, prevPositions.buffer, nextPositions.buffer);
-        transferableObjects.push(expandAndWidth.buffer, vertexBatchIds.buffer, indices.buffer);
-
-        return {
-            indexDatatype : (indices.BYTES_PER_ELEMENT === 2) ? IndexDatatype.IndexDatatype.UNSIGNED_SHORT : IndexDatatype.IndexDatatype.UNSIGNED_INT,
-            currentPositions : curPositions.buffer,
-            previousPositions : prevPositions.buffer,
-            nextPositions : nextPositions.buffer,
-            expandAndWidth : expandAndWidth.buffer,
-            batchIds : vertexBatchIds.buffer,
-            indices : indices.buffer
-        };
-    }
-    var createVectorTilePolylines$1 = createTaskProcessorWorker(createVectorTilePolylines);
-
-    return createVectorTilePolylines$1;
-
-});
diff --git a/public/libs/Cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js b/public/libs/Cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js
deleted file mode 100644
index 4f16693..0000000
--- a/public/libs/Cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js
+++ /dev/null
@@ -1,478 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './AttributeCompression-84a90a13', './IntersectionTests-397d9494', './Plane-8390418f', './WebMercatorProjection-80c70558', './createTaskProcessorWorker', './EllipsoidTangentPlane-e324bfa4', './OrientedBoundingBox-0ede1598', './TerrainEncoding-a807a704'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, FeatureDetection, Transforms, buildModuleUrl, AttributeCompression, IntersectionTests, Plane, WebMercatorProjection, createTaskProcessorWorker, EllipsoidTangentPlane, OrientedBoundingBox, TerrainEncoding) { 'use strict';
-
-    var sizeOfUint16 = Uint16Array.BYTES_PER_ELEMENT;
-        var sizeOfInt32 = Int32Array.BYTES_PER_ELEMENT;
-        var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT;
-        var sizeOfFloat = Float32Array.BYTES_PER_ELEMENT;
-        var sizeOfDouble = Float64Array.BYTES_PER_ELEMENT;
-
-        function indexOfEpsilon(arr, elem, elemType) {
-            elemType = when.defaultValue(elemType, _Math.CesiumMath);
-            var count = arr.length;
-            for (var i = 0; i < count; ++i) {
-                if (elemType.equalsEpsilon(arr[i], elem, _Math.CesiumMath.EPSILON12)) {
-                    return i;
-                }
-            }
-
-            return -1;
-        }
-
-        function createVerticesFromGoogleEarthEnterpriseBuffer(parameters, transferableObjects) {
-            parameters.ellipsoid = Cartesian2.Ellipsoid.clone(parameters.ellipsoid);
-            parameters.rectangle = Cartesian2.Rectangle.clone(parameters.rectangle);
-
-            var statistics = processBuffer(parameters.buffer, parameters.relativeToCenter, parameters.ellipsoid,
-                parameters.rectangle, parameters.nativeRectangle, parameters.exaggeration, parameters.skirtHeight,
-                parameters.includeWebMercatorT, parameters.negativeAltitudeExponentBias, parameters.negativeElevationThreshold);
-            var vertices = statistics.vertices;
-            transferableObjects.push(vertices.buffer);
-            var indices = statistics.indices;
-            transferableObjects.push(indices.buffer);
-
-            return {
-                vertices : vertices.buffer,
-                indices : indices.buffer,
-                numberOfAttributes : statistics.encoding.getStride(),
-                minimumHeight : statistics.minimumHeight,
-                maximumHeight : statistics.maximumHeight,
-                boundingSphere3D : statistics.boundingSphere3D,
-                orientedBoundingBox : statistics.orientedBoundingBox,
-                occludeePointInScaledSpace : statistics.occludeePointInScaledSpace,
-                encoding : statistics.encoding,
-                vertexCountWithoutSkirts : statistics.vertexCountWithoutSkirts,
-                indexCountWithoutSkirts : statistics.indexCountWithoutSkirts,
-                westIndicesSouthToNorth : statistics.westIndicesSouthToNorth,
-                southIndicesEastToWest : statistics.southIndicesEastToWest,
-                eastIndicesNorthToSouth : statistics.eastIndicesNorthToSouth,
-                northIndicesWestToEast : statistics.northIndicesWestToEast
-            };
-        }
-
-        var scratchCartographic = new Cartographic.Cartographic();
-        var scratchCartesian = new Cartographic.Cartesian3();
-        var minimumScratch = new Cartographic.Cartesian3();
-        var maximumScratch = new Cartographic.Cartesian3();
-        var matrix4Scratch = new BoundingSphere.Matrix4();
-
-        function processBuffer(buffer, relativeToCenter, ellipsoid, rectangle, nativeRectangle, exaggeration, skirtHeight, includeWebMercatorT, negativeAltitudeExponentBias, negativeElevationThreshold) {
-            var geographicWest;
-            var geographicSouth;
-            var geographicEast;
-            var geographicNorth;
-            var rectangleWidth, rectangleHeight;
-
-            if (!when.defined(rectangle)) {
-                geographicWest = _Math.CesiumMath.toRadians(nativeRectangle.west);
-                geographicSouth = _Math.CesiumMath.toRadians(nativeRectangle.south);
-                geographicEast = _Math.CesiumMath.toRadians(nativeRectangle.east);
-                geographicNorth = _Math.CesiumMath.toRadians(nativeRectangle.north);
-                rectangleWidth = _Math.CesiumMath.toRadians(rectangle.width);
-                rectangleHeight = _Math.CesiumMath.toRadians(rectangle.height);
-            } else {
-                geographicWest = rectangle.west;
-                geographicSouth = rectangle.south;
-                geographicEast = rectangle.east;
-                geographicNorth = rectangle.north;
-                rectangleWidth = rectangle.width;
-                rectangleHeight = rectangle.height;
-            }
-
-            // Keep track of quad borders so we can remove duplicates around the borders
-            var quadBorderLatitudes = [geographicSouth, geographicNorth];
-            var quadBorderLongitudes = [geographicWest, geographicEast];
-
-            var fromENU = Transforms.Transforms.eastNorthUpToFixedFrame(relativeToCenter, ellipsoid);
-            var toENU = BoundingSphere.Matrix4.inverseTransformation(fromENU, matrix4Scratch);
-
-            var southMercatorY;
-            var oneOverMercatorHeight;
-            if (includeWebMercatorT) {
-                southMercatorY = WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(geographicSouth);
-                oneOverMercatorHeight = 1.0 / (WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(geographicNorth) - southMercatorY);
-            }
-
-            var dv = new DataView(buffer);
-
-            var minHeight = Number.POSITIVE_INFINITY;
-            var maxHeight = Number.NEGATIVE_INFINITY;
-
-            var minimum = minimumScratch;
-            minimum.x = Number.POSITIVE_INFINITY;
-            minimum.y = Number.POSITIVE_INFINITY;
-            minimum.z = Number.POSITIVE_INFINITY;
-
-            var maximum = maximumScratch;
-            maximum.x = Number.NEGATIVE_INFINITY;
-            maximum.y = Number.NEGATIVE_INFINITY;
-            maximum.z = Number.NEGATIVE_INFINITY;
-
-            // Compute sizes
-            var offset = 0;
-            var size = 0;
-            var indicesSize = 0;
-            var quadSize;
-            var quad;
-            for (quad = 0; quad < 4; ++quad) {
-                var o = offset;
-                quadSize = dv.getUint32(o, true);
-                o += sizeOfUint32;
-
-                var x = _Math.CesiumMath.toRadians(dv.getFloat64(o, true) * 180.0);
-                o += sizeOfDouble;
-                if (indexOfEpsilon(quadBorderLongitudes, x) === -1) {
-                    quadBorderLongitudes.push(x);
-                }
-
-                var y = _Math.CesiumMath.toRadians(dv.getFloat64(o, true) * 180.0);
-                o += sizeOfDouble;
-                if (indexOfEpsilon(quadBorderLatitudes, y) === -1) {
-                    quadBorderLatitudes.push(y);
-                }
-
-                o += 2 * sizeOfDouble; // stepX + stepY
-
-                var c = dv.getInt32(o, true); // Read point count
-                o += sizeOfInt32;
-                size += c;
-
-                c = dv.getInt32(o, true); // Read index count
-                indicesSize += c * 3;
-
-                offset += quadSize + sizeOfUint32; // Jump to next quad
-            }
-
-            // Quad Border points to remove duplicates
-            var quadBorderPoints = [];
-            var quadBorderIndices = [];
-
-            // Create arrays
-            var positions = new Array(size);
-            var uvs = new Array(size);
-            var heights = new Array(size);
-            var webMercatorTs = includeWebMercatorT ? new Array(size) : [];
-            var indices = new Array(indicesSize);
-
-            // Points are laid out in rows starting at SW, so storing border points as we
-            //  come across them all points will be adjacent.
-            var westBorder = [];
-            var southBorder = [];
-            var eastBorder = [];
-            var northBorder = [];
-
-            // Each tile is split into 4 parts
-            var pointOffset = 0;
-            var indicesOffset = 0;
-            offset = 0;
-            for (quad = 0; quad < 4; ++quad) {
-                quadSize = dv.getUint32(offset, true);
-                offset += sizeOfUint32;
-                var startQuad = offset;
-
-                var originX = _Math.CesiumMath.toRadians(dv.getFloat64(offset, true) * 180.0);
-                offset += sizeOfDouble;
-
-                var originY = _Math.CesiumMath.toRadians(dv.getFloat64(offset, true) * 180.0);
-                offset += sizeOfDouble;
-
-                var stepX = _Math.CesiumMath.toRadians(dv.getFloat64(offset, true) * 180.0);
-                var halfStepX = stepX * 0.5;
-                offset += sizeOfDouble;
-
-                var stepY = _Math.CesiumMath.toRadians(dv.getFloat64(offset, true) * 180.0);
-                var halfStepY = stepY * 0.5;
-                offset += sizeOfDouble;
-
-                var numPoints = dv.getInt32(offset, true);
-                offset += sizeOfInt32;
-
-                var numFaces = dv.getInt32(offset, true);
-                offset += sizeOfInt32;
-
-                //var level = dv.getInt32(offset, true);
-                offset += sizeOfInt32;
-
-                // Keep track of quad indices to overall tile indices
-                var indicesMapping = new Array(numPoints);
-                for (var i = 0; i < numPoints; ++i) {
-                    var longitude = originX + dv.getUint8(offset++) * stepX;
-                    scratchCartographic.longitude = longitude;
-                    var latitude = originY + dv.getUint8(offset++) * stepY;
-                    scratchCartographic.latitude = latitude;
-
-                    var height = dv.getFloat32(offset, true);
-                    offset += sizeOfFloat;
-
-                    // In order to support old clients, negative altitude values are stored as
-                    // height/-2^32. Old clients see the value as really close to 0 but new clients multiply
-                    // by -2^32 to get the real negative altitude value.
-                    if (height !== 0 && height < negativeElevationThreshold) {
-                        height *= -Math.pow(2, negativeAltitudeExponentBias);
-                    }
-
-                    // Height is stored in units of (1/EarthRadius) or (1/6371010.0)
-                    height *= 6371010.0 * exaggeration;
-
-                    scratchCartographic.height = height;
-
-                    // Is it along a quad border - if so check if already exists and use that index
-                    if (indexOfEpsilon(quadBorderLongitudes, longitude) !== -1 ||
-                        indexOfEpsilon(quadBorderLatitudes, latitude) !== -1) {
-                        var index = indexOfEpsilon(quadBorderPoints, scratchCartographic, Cartographic.Cartographic);
-                        if (index === -1) {
-                            quadBorderPoints.push(Cartographic.Cartographic.clone(scratchCartographic));
-                            quadBorderIndices.push(pointOffset);
-                        } else {
-                            indicesMapping[i] = quadBorderIndices[index];
-                            continue;
-                        }
-                    }
-                    indicesMapping[i] = pointOffset;
-
-                    if (Math.abs(longitude - geographicWest) < halfStepX) {
-                        westBorder.push({
-                            index : pointOffset,
-                            cartographic : Cartographic.Cartographic.clone(scratchCartographic)
-                        });
-                    } else if (Math.abs(longitude - geographicEast) < halfStepX) {
-                        eastBorder.push({
-                            index : pointOffset,
-                            cartographic : Cartographic.Cartographic.clone(scratchCartographic)
-                        });
-                    } else if (Math.abs(latitude - geographicSouth) < halfStepY) {
-                        southBorder.push({
-                            index : pointOffset,
-                            cartographic : Cartographic.Cartographic.clone(scratchCartographic)
-                        });
-                    } else if (Math.abs(latitude - geographicNorth) < halfStepY) {
-                        northBorder.push({
-                            index : pointOffset,
-                            cartographic : Cartographic.Cartographic.clone(scratchCartographic)
-                        });
-                    }
-
-                    minHeight = Math.min(height, minHeight);
-                    maxHeight = Math.max(height, maxHeight);
-                    heights[pointOffset] = height;
-
-                    var pos = ellipsoid.cartographicToCartesian(scratchCartographic);
-                    positions[pointOffset] = pos;
-
-                    if (includeWebMercatorT) {
-                        webMercatorTs[pointOffset] = (WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(latitude) - southMercatorY) * oneOverMercatorHeight;
-                    }
-
-                    BoundingSphere.Matrix4.multiplyByPoint(toENU, pos, scratchCartesian);
-
-                    Cartographic.Cartesian3.minimumByComponent(scratchCartesian, minimum, minimum);
-                    Cartographic.Cartesian3.maximumByComponent(scratchCartesian, maximum, maximum);
-
-                    var u = (longitude - geographicWest) / (geographicEast - geographicWest);
-                    u = _Math.CesiumMath.clamp(u, 0.0, 1.0);
-                    var v = (latitude - geographicSouth) / (geographicNorth - geographicSouth);
-                    v = _Math.CesiumMath.clamp(v, 0.0, 1.0);
-
-                    uvs[pointOffset] = new Cartesian2.Cartesian2(u, v);
-                    ++pointOffset;
-                }
-
-                var facesElementCount = numFaces * 3;
-                for (var j = 0; j < facesElementCount; ++j, ++indicesOffset) {
-                    indices[indicesOffset] = indicesMapping[dv.getUint16(offset, true)];
-                    offset += sizeOfUint16;
-                }
-
-                if (quadSize !== (offset - startQuad)) {
-                    throw new RuntimeError.RuntimeError('Invalid terrain tile.');
-                }
-            }
-
-            positions.length = pointOffset;
-            uvs.length = pointOffset;
-            heights.length = pointOffset;
-            if (includeWebMercatorT) {
-                webMercatorTs.length = pointOffset;
-            }
-
-            var vertexCountWithoutSkirts = pointOffset;
-            var indexCountWithoutSkirts = indicesOffset;
-
-            // Add skirt points
-            var skirtOptions = {
-                hMin : minHeight,
-                lastBorderPoint : undefined,
-                skirtHeight : skirtHeight,
-                toENU : toENU,
-                ellipsoid : ellipsoid,
-                minimum : minimum,
-                maximum : maximum
-            };
-
-            // Sort counter clockwise from NW corner
-            // Corner points are in the east/west arrays
-            westBorder.sort(function(a, b) {
-                return b.cartographic.latitude - a.cartographic.latitude;
-            });
-            southBorder.sort(function(a, b) {
-                return a.cartographic.longitude - b.cartographic.longitude;
-            });
-            eastBorder.sort(function(a, b) {
-                return a.cartographic.latitude - b.cartographic.latitude;
-            });
-            northBorder.sort(function(a, b) {
-                return b.cartographic.longitude - a.cartographic.longitude;
-            });
-
-            var percentage = 0.00001;
-            addSkirt(positions, heights, uvs, webMercatorTs, indices, skirtOptions,
-                westBorder, -percentage * rectangleWidth, true, -percentage * rectangleHeight);
-            addSkirt(positions, heights, uvs, webMercatorTs, indices, skirtOptions,
-                southBorder, -percentage * rectangleHeight, false);
-            addSkirt(positions, heights, uvs, webMercatorTs, indices, skirtOptions,
-                eastBorder, percentage * rectangleWidth, true, percentage * rectangleHeight);
-            addSkirt(positions, heights, uvs, webMercatorTs, indices, skirtOptions,
-                northBorder, percentage * rectangleHeight, false);
-
-            // Since the corner between the north and west sides is in the west array, generate the last
-            //  two triangles between the last north vertex and the first west vertex
-            if (westBorder.length > 0 && northBorder.length > 0) {
-                var firstBorderIndex = westBorder[0].index;
-                var firstSkirtIndex = vertexCountWithoutSkirts;
-                var lastBorderIndex = northBorder[northBorder.length - 1].index;
-                var lastSkirtIndex = positions.length - 1;
-
-                indices.push(lastBorderIndex, lastSkirtIndex, firstSkirtIndex, firstSkirtIndex, firstBorderIndex, lastBorderIndex);
-            }
-
-            size = positions.length; // Get new size with skirt vertices
-
-            var boundingSphere3D = BoundingSphere.BoundingSphere.fromPoints(positions);
-            var orientedBoundingBox;
-            if (when.defined(rectangle)) {
-                orientedBoundingBox = OrientedBoundingBox.OrientedBoundingBox.fromRectangle(rectangle, minHeight, maxHeight, ellipsoid);
-            }
-
-            var occluder = new TerrainEncoding.EllipsoidalOccluder(ellipsoid);
-            var occludeePointInScaledSpace = occluder.computeHorizonCullingPointPossiblyUnderEllipsoid(relativeToCenter, positions, minHeight);
-
-            var aaBox = new EllipsoidTangentPlane.AxisAlignedBoundingBox(minimum, maximum, relativeToCenter);
-            var encoding = new TerrainEncoding.TerrainEncoding(aaBox, skirtOptions.hMin, maxHeight, fromENU, false, includeWebMercatorT);
-            var vertices = new Float32Array(size * encoding.getStride());
-
-            var bufferIndex = 0;
-            for (var k = 0; k < size; ++k) {
-                bufferIndex = encoding.encode(vertices, bufferIndex, positions[k], uvs[k], heights[k], undefined, webMercatorTs[k]);
-            }
-
-            var westIndicesSouthToNorth = westBorder.map(function(vertex) { return vertex.index; }).reverse();
-            var southIndicesEastToWest = southBorder.map(function(vertex) { return vertex.index; }).reverse();
-            var eastIndicesNorthToSouth = eastBorder.map(function(vertex) { return vertex.index; }).reverse();
-            var northIndicesWestToEast = northBorder.map(function(vertex) { return vertex.index; }).reverse();
-
-            southIndicesEastToWest.unshift(eastIndicesNorthToSouth[eastIndicesNorthToSouth.length - 1]);
-            southIndicesEastToWest.push(westIndicesSouthToNorth[0]);
-
-            northIndicesWestToEast.unshift(westIndicesSouthToNorth[westIndicesSouthToNorth.length - 1]);
-            northIndicesWestToEast.push(eastIndicesNorthToSouth[0]);
-
-            return {
-                vertices : vertices,
-                indices : new Uint16Array(indices),
-                maximumHeight : maxHeight,
-                minimumHeight : minHeight,
-                encoding : encoding,
-                boundingSphere3D : boundingSphere3D,
-                orientedBoundingBox : orientedBoundingBox,
-                occludeePointInScaledSpace : occludeePointInScaledSpace,
-                vertexCountWithoutSkirts : vertexCountWithoutSkirts,
-                indexCountWithoutSkirts : indexCountWithoutSkirts,
-                westIndicesSouthToNorth : westIndicesSouthToNorth,
-                southIndicesEastToWest : southIndicesEastToWest,
-                eastIndicesNorthToSouth : eastIndicesNorthToSouth,
-                northIndicesWestToEast : northIndicesWestToEast
-            };
-        }
-
-        function addSkirt(positions, heights, uvs, webMercatorTs, indices, skirtOptions,
-                          borderPoints, fudgeFactor, eastOrWest, cornerFudge) {
-            var count = borderPoints.length;
-            for (var j = 0; j < count; ++j) {
-                var borderPoint = borderPoints[j];
-                var borderCartographic = borderPoint.cartographic;
-                var borderIndex = borderPoint.index;
-                var currentIndex = positions.length;
-
-                var longitude = borderCartographic.longitude;
-                var latitude = borderCartographic.latitude;
-                latitude = _Math.CesiumMath.clamp(latitude, -_Math.CesiumMath.PI_OVER_TWO, _Math.CesiumMath.PI_OVER_TWO); // Don't go over the poles
-                var height = borderCartographic.height - skirtOptions.skirtHeight;
-                skirtOptions.hMin = Math.min(skirtOptions.hMin, height);
-
-                Cartographic.Cartographic.fromRadians(longitude, latitude, height, scratchCartographic);
-
-                // Adjust sides to angle out
-                if (eastOrWest) {
-                    scratchCartographic.longitude += fudgeFactor;
-                }
-
-                // Adjust top or bottom to angle out
-                // Since corners are in the east/west arrays angle the first and last points as well
-                if (!eastOrWest) {
-                    scratchCartographic.latitude += fudgeFactor;
-                } else if (j === (count - 1)) {
-                    scratchCartographic.latitude += cornerFudge;
-                } else if (j === 0) {
-                    scratchCartographic.latitude -= cornerFudge;
-                }
-
-                var pos = skirtOptions.ellipsoid.cartographicToCartesian(scratchCartographic);
-                positions.push(pos);
-                heights.push(height);
-                uvs.push(Cartesian2.Cartesian2.clone(uvs[borderIndex])); // Copy UVs from border point
-                if (webMercatorTs.length > 0) {
-                    webMercatorTs.push(webMercatorTs[borderIndex]);
-                }
-
-                BoundingSphere.Matrix4.multiplyByPoint(skirtOptions.toENU, pos, scratchCartesian);
-
-                var minimum = skirtOptions.minimum;
-                var maximum = skirtOptions.maximum;
-                Cartographic.Cartesian3.minimumByComponent(scratchCartesian, minimum, minimum);
-                Cartographic.Cartesian3.maximumByComponent(scratchCartesian, maximum, maximum);
-
-                var lastBorderPoint = skirtOptions.lastBorderPoint;
-                if (when.defined(lastBorderPoint)) {
-                    var lastBorderIndex = lastBorderPoint.index;
-                    indices.push(lastBorderIndex, currentIndex - 1, currentIndex, currentIndex, borderIndex, lastBorderIndex);
-                }
-
-                skirtOptions.lastBorderPoint = borderPoint;
-            }
-        }
-    var createVerticesFromGoogleEarthEnterpriseBuffer$1 = createTaskProcessorWorker(createVerticesFromGoogleEarthEnterpriseBuffer);
-
-    return createVerticesFromGoogleEarthEnterpriseBuffer$1;
-
-});
diff --git a/public/libs/Cesium/Workers/createVerticesFromHeightmap.js b/public/libs/Cesium/Workers/createVerticesFromHeightmap.js
deleted file mode 100644
index 1c86159..0000000
--- a/public/libs/Cesium/Workers/createVerticesFromHeightmap.js
+++ /dev/null
@@ -1,2623 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './AttributeCompression-84a90a13', './IntersectionTests-397d9494', './Plane-8390418f', './WebMercatorProjection-80c70558', './createTaskProcessorWorker', './EllipsoidTangentPlane-e324bfa4', './OrientedBoundingBox-0ede1598', './TerrainEncoding-a807a704'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, FeatureDetection, Transforms, buildModuleUrl, AttributeCompression, IntersectionTests, Plane, WebMercatorProjection, createTaskProcessorWorker, EllipsoidTangentPlane, OrientedBoundingBox, TerrainEncoding) { 'use strict';
-
-    /**
-         * The encoding that is used for a heightmap
-         *
-         * @exports HeightmapEncoding
-         */
-        var HeightmapEncoding = {
-            /**
-             * No encoding
-             *
-             * @type {Number}
-             * @constant
-             */
-            NONE: 0,
-
-            /**
-             * LERC encoding
-             *
-             * @type {Number}
-             * @constant
-             *
-             * @see {@link https://github.com/Esri/lerc|The LERC specification}
-             */
-            LERC: 1
-        };
-    var HeightmapEncoding$1 = Object.freeze(HeightmapEncoding);
-
-    /**
-         * Contains functions to create a mesh from a heightmap image.
-         *
-         * @exports HeightmapTessellator
-         *
-         * @private
-         */
-        var HeightmapTessellator = {};
-
-        /**
-         * The default structure of a heightmap, as given to {@link HeightmapTessellator.computeVertices}.
-         *
-         * @constant
-         */
-        HeightmapTessellator.DEFAULT_STRUCTURE = Object.freeze({
-            heightScale : 1.0,
-            heightOffset : 0.0,
-            elementsPerHeight : 1,
-            stride : 1,
-            elementMultiplier : 256.0,
-            isBigEndian : false
-        });
-
-        var cartesian3Scratch = new Cartographic.Cartesian3();
-        var matrix4Scratch = new BoundingSphere.Matrix4();
-        var minimumScratch = new Cartographic.Cartesian3();
-        var maximumScratch = new Cartographic.Cartesian3();
-
-        /**
-         * Fills an array of vertices from a heightmap image.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {TypedArray} options.heightmap The heightmap to tessellate.
-         * @param {Number} options.width The width of the heightmap, in height samples.
-         * @param {Number} options.height The height of the heightmap, in height samples.
-         * @param {Number} options.skirtHeight The height of skirts to drape at the edges of the heightmap.
-         * @param {Rectangle} options.nativeRectangle A rectangle in the native coordinates of the heightmap's projection.  For
-         *                 a heightmap with a geographic projection, this is degrees.  For the web mercator
-         *                 projection, this is meters.
-         * @param {Number} [options.exaggeration=1.0] The scale used to exaggerate the terrain.
-         * @param {Rectangle} [options.rectangle] The rectangle covered by the heightmap, in geodetic coordinates with north, south, east and
-         *                 west properties in radians.  Either rectangle or nativeRectangle must be provided.  If both
-         *                 are provided, they're assumed to be consistent.
-         * @param {Boolean} [options.isGeographic=true] True if the heightmap uses a {@link GeographicProjection}, or false if it uses
-         *                  a {@link WebMercatorProjection}.
-         * @param {Cartesian3} [options.relativeToCenter=Cartesian3.ZERO] The positions will be computed as <code>Cartesian3.subtract(worldPosition, relativeToCenter)</code>.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid to which the heightmap applies.
-         * @param {Object} [options.structure] An object describing the structure of the height data.
-         * @param {Number} [options.structure.heightScale=1.0] The factor by which to multiply height samples in order to obtain
-         *                 the height above the heightOffset, in meters.  The heightOffset is added to the resulting
-         *                 height after multiplying by the scale.
-         * @param {Number} [options.structure.heightOffset=0.0] The offset to add to the scaled height to obtain the final
-         *                 height in meters.  The offset is added after the height sample is multiplied by the
-         *                 heightScale.
-         * @param {Number} [options.structure.elementsPerHeight=1] The number of elements in the buffer that make up a single height
-         *                 sample.  This is usually 1, indicating that each element is a separate height sample.  If
-         *                 it is greater than 1, that number of elements together form the height sample, which is
-         *                 computed according to the structure.elementMultiplier and structure.isBigEndian properties.
-         * @param {Number} [options.structure.stride=1] The number of elements to skip to get from the first element of
-         *                 one height to the first element of the next height.
-         * @param {Number} [options.structure.elementMultiplier=256.0] The multiplier used to compute the height value when the
-         *                 stride property is greater than 1.  For example, if the stride is 4 and the strideMultiplier
-         *                 is 256, the height is computed as follows:
-         *                 `height = buffer[index] + buffer[index + 1] * 256 + buffer[index + 2] * 256 * 256 + buffer[index + 3] * 256 * 256 * 256`
-         *                 This is assuming that the isBigEndian property is false.  If it is true, the order of the
-         *                 elements is reversed.
-         * @param {Number} [options.structure.lowestEncodedHeight] The lowest value that can be stored in the height buffer.  Any heights that are lower
-         *                 than this value after encoding with the `heightScale` and `heightOffset` are clamped to this value.  For example, if the height
-         *                 buffer is a `Uint16Array`, this value should be 0 because a `Uint16Array` cannot store negative numbers.  If this parameter is
-         *                 not specified, no minimum value is enforced.
-         * @param {Number} [options.structure.highestEncodedHeight] The highest value that can be stored in the height buffer.  Any heights that are higher
-         *                 than this value after encoding with the `heightScale` and `heightOffset` are clamped to this value.  For example, if the height
-         *                 buffer is a `Uint16Array`, this value should be `256 * 256 - 1` or 65535 because a `Uint16Array` cannot store numbers larger
-         *                 than 65535.  If this parameter is not specified, no maximum value is enforced.
-         * @param {Boolean} [options.structure.isBigEndian=false] Indicates endianness of the elements in the buffer when the
-         *                  stride property is greater than 1.  If this property is false, the first element is the
-         *                  low-order element.  If it is true, the first element is the high-order element.
-         *
-         * @example
-         * var width = 5;
-         * var height = 5;
-         * var statistics = Cesium.HeightmapTessellator.computeVertices({
-         *     heightmap : [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0],
-         *     width : width,
-         *     height : height,
-         *     skirtHeight : 0.0,
-         *     nativeRectangle : {
-         *         west : 10.0,
-         *         east : 20.0,
-         *         south : 30.0,
-         *         north : 40.0
-         *     }
-         * });
-         *
-         * var encoding = statistics.encoding;
-         * var position = encoding.decodePosition(statistics.vertices, index * encoding.getStride());
-         */
-        HeightmapTessellator.computeVertices = function(options) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(options) || !when.defined(options.heightmap)) {
-                throw new Check.DeveloperError('options.heightmap is required.');
-            }
-            if (!when.defined(options.width) || !when.defined(options.height)) {
-                throw new Check.DeveloperError('options.width and options.height are required.');
-            }
-            if (!when.defined(options.nativeRectangle)) {
-                throw new Check.DeveloperError('options.nativeRectangle is required.');
-            }
-            if (!when.defined(options.skirtHeight)) {
-                throw new Check.DeveloperError('options.skirtHeight is required.');
-            }
-            //>>includeEnd('debug');
-
-            // This function tends to be a performance hotspot for terrain rendering,
-            // so it employs a lot of inlining and unrolling as an optimization.
-            // In particular, the functionality of Ellipsoid.cartographicToCartesian
-            // is inlined.
-
-            var cos = Math.cos;
-            var sin = Math.sin;
-            var sqrt = Math.sqrt;
-            var atan = Math.atan;
-            var exp = Math.exp;
-            var piOverTwo = _Math.CesiumMath.PI_OVER_TWO;
-            var toRadians = _Math.CesiumMath.toRadians;
-
-            var heightmap = options.heightmap;
-            var width = options.width;
-            var height = options.height;
-            var skirtHeight = options.skirtHeight;
-
-            var isGeographic = when.defaultValue(options.isGeographic, true);
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-            var oneOverGlobeSemimajorAxis = 1.0 / ellipsoid.maximumRadius;
-
-            var nativeRectangle = options.nativeRectangle;
-
-            var geographicWest;
-            var geographicSouth;
-            var geographicEast;
-            var geographicNorth;
-
-            var rectangle = options.rectangle;
-            if (!when.defined(rectangle)) {
-                if (isGeographic) {
-                    geographicWest = toRadians(nativeRectangle.west);
-                    geographicSouth = toRadians(nativeRectangle.south);
-                    geographicEast = toRadians(nativeRectangle.east);
-                    geographicNorth = toRadians(nativeRectangle.north);
-                } else {
-                    geographicWest = nativeRectangle.west * oneOverGlobeSemimajorAxis;
-                    geographicSouth = piOverTwo - (2.0 * atan(exp(-nativeRectangle.south * oneOverGlobeSemimajorAxis)));
-                    geographicEast = nativeRectangle.east * oneOverGlobeSemimajorAxis;
-                    geographicNorth = piOverTwo - (2.0 * atan(exp(-nativeRectangle.north * oneOverGlobeSemimajorAxis)));
-                }
-            } else {
-                geographicWest = rectangle.west;
-                geographicSouth = rectangle.south;
-                geographicEast = rectangle.east;
-                geographicNorth = rectangle.north;
-            }
-
-            var relativeToCenter = options.relativeToCenter;
-            var hasRelativeToCenter = when.defined(relativeToCenter);
-            relativeToCenter = hasRelativeToCenter ? relativeToCenter : Cartographic.Cartesian3.ZERO;
-            var exaggeration = when.defaultValue(options.exaggeration, 1.0);
-            var includeWebMercatorT = when.defaultValue(options.includeWebMercatorT, false);
-
-            var structure = when.defaultValue(options.structure, HeightmapTessellator.DEFAULT_STRUCTURE);
-            var heightScale = when.defaultValue(structure.heightScale, HeightmapTessellator.DEFAULT_STRUCTURE.heightScale);
-            var heightOffset = when.defaultValue(structure.heightOffset, HeightmapTessellator.DEFAULT_STRUCTURE.heightOffset);
-            var elementsPerHeight = when.defaultValue(structure.elementsPerHeight, HeightmapTessellator.DEFAULT_STRUCTURE.elementsPerHeight);
-            var stride = when.defaultValue(structure.stride, HeightmapTessellator.DEFAULT_STRUCTURE.stride);
-            var elementMultiplier = when.defaultValue(structure.elementMultiplier, HeightmapTessellator.DEFAULT_STRUCTURE.elementMultiplier);
-            var isBigEndian = when.defaultValue(structure.isBigEndian, HeightmapTessellator.DEFAULT_STRUCTURE.isBigEndian);
-
-            var rectangleWidth = Cartesian2.Rectangle.computeWidth(nativeRectangle);
-            var rectangleHeight = Cartesian2.Rectangle.computeHeight(nativeRectangle);
-
-            var granularityX = rectangleWidth / (width - 1);
-            var granularityY = rectangleHeight / (height - 1);
-
-            if (!isGeographic) {
-                rectangleWidth *= oneOverGlobeSemimajorAxis;
-                rectangleHeight *= oneOverGlobeSemimajorAxis;
-            }
-
-            var radiiSquared = ellipsoid.radiiSquared;
-            var radiiSquaredX = radiiSquared.x;
-            var radiiSquaredY = radiiSquared.y;
-            var radiiSquaredZ = radiiSquared.z;
-
-            var minimumHeight = 65536.0;
-            var maximumHeight = -65536.0;
-
-            var fromENU = Transforms.Transforms.eastNorthUpToFixedFrame(relativeToCenter, ellipsoid);
-            var toENU = BoundingSphere.Matrix4.inverseTransformation(fromENU, matrix4Scratch);
-
-            var southMercatorY;
-            var oneOverMercatorHeight;
-            if (includeWebMercatorT) {
-                southMercatorY = WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(geographicSouth);
-                oneOverMercatorHeight = 1.0 / (WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(geographicNorth) - southMercatorY);
-            }
-
-            var minimum = minimumScratch;
-            minimum.x = Number.POSITIVE_INFINITY;
-            minimum.y = Number.POSITIVE_INFINITY;
-            minimum.z = Number.POSITIVE_INFINITY;
-
-            var maximum = maximumScratch;
-            maximum.x = Number.NEGATIVE_INFINITY;
-            maximum.y = Number.NEGATIVE_INFINITY;
-            maximum.z = Number.NEGATIVE_INFINITY;
-
-            var hMin = Number.POSITIVE_INFINITY;
-
-            var gridVertexCount = width * height;
-            var edgeVertexCount = skirtHeight > 0.0 ? (width * 2 + height * 2) : 0;
-            var vertexCount = gridVertexCount + edgeVertexCount;
-
-            var positions = new Array(vertexCount);
-            var heights = new Array(vertexCount);
-            var uvs = new Array(vertexCount);
-            var webMercatorTs = includeWebMercatorT ? new Array(vertexCount) : [];
-
-            var startRow = 0;
-            var endRow = height;
-            var startCol = 0;
-            var endCol = width;
-
-            if (skirtHeight > 0.0) {
-                --startRow;
-                ++endRow;
-                --startCol;
-                ++endCol;
-            }
-
-            var skirtOffsetPercentage = 0.00001;
-
-            for (var rowIndex = startRow; rowIndex < endRow; ++rowIndex) {
-                var row = rowIndex;
-                if (row < 0) {
-                    row = 0;
-                }
-                if (row >= height) {
-                    row = height - 1;
-                }
-
-                var latitude = nativeRectangle.north - granularityY * row;
-
-                if (!isGeographic) {
-                    latitude = piOverTwo - (2.0 * atan(exp(-latitude * oneOverGlobeSemimajorAxis)));
-                } else {
-                    latitude = toRadians(latitude);
-                }
-
-                var v = (latitude - geographicSouth) / (geographicNorth - geographicSouth);
-                v = _Math.CesiumMath.clamp(v, 0.0, 1.0);
-
-                var isNorthEdge = rowIndex === startRow;
-                var isSouthEdge = rowIndex === endRow - 1;
-                if (skirtHeight > 0.0) {
-                    if (isNorthEdge) {
-                        latitude += skirtOffsetPercentage * rectangleHeight;
-                    } else if (isSouthEdge) {
-                        latitude -= skirtOffsetPercentage * rectangleHeight;
-                    }
-                }
-
-                var cosLatitude = cos(latitude);
-                var nZ = sin(latitude);
-                var kZ = radiiSquaredZ * nZ;
-
-                var webMercatorT;
-                if (includeWebMercatorT) {
-                    webMercatorT = (WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(latitude) - southMercatorY) * oneOverMercatorHeight;
-                }
-
-                for (var colIndex = startCol; colIndex < endCol; ++colIndex) {
-                    var col = colIndex;
-                    if (col < 0) {
-                        col = 0;
-                    }
-                    if (col >= width) {
-                        col = width - 1;
-                    }
-
-                    var terrainOffset = row * (width * stride) + col * stride;
-
-                    var heightSample;
-                    if (elementsPerHeight === 1) {
-                        heightSample = heightmap[terrainOffset];
-                    } else {
-                        heightSample = 0;
-
-                        var elementOffset;
-                        if (isBigEndian) {
-                            for (elementOffset = 0; elementOffset < elementsPerHeight; ++elementOffset) {
-                                heightSample = (heightSample * elementMultiplier) + heightmap[terrainOffset + elementOffset];
-                            }
-                        } else {
-                            for (elementOffset = elementsPerHeight - 1; elementOffset >= 0; --elementOffset) {
-                                heightSample = (heightSample * elementMultiplier) + heightmap[terrainOffset + elementOffset];
-                            }
-                        }
-                    }
-
-                    heightSample = (heightSample * heightScale + heightOffset) * exaggeration;
-
-                    maximumHeight = Math.max(maximumHeight, heightSample);
-                    minimumHeight = Math.min(minimumHeight, heightSample);
-
-                    var longitude = nativeRectangle.west + granularityX * col;
-
-                    if (!isGeographic) {
-                        longitude = longitude * oneOverGlobeSemimajorAxis;
-                    } else {
-                        longitude = toRadians(longitude);
-                    }
-
-                    var u = (longitude - geographicWest) / (geographicEast - geographicWest);
-                    u = _Math.CesiumMath.clamp(u, 0.0, 1.0);
-
-                    var index = row * width + col;
-
-                    if (skirtHeight > 0.0) {
-                        var isWestEdge = colIndex === startCol;
-                        var isEastEdge = colIndex === endCol - 1;
-                        var isEdge = isNorthEdge || isSouthEdge || isWestEdge || isEastEdge;
-                        var isCorner = (isNorthEdge || isSouthEdge) && (isWestEdge || isEastEdge);
-                        if (isCorner) {
-                            // Don't generate skirts on the corners.
-                            continue;
-                        } else if (isEdge) {
-                            heightSample -= skirtHeight;
-
-                            if (isWestEdge) {
-                                // The outer loop iterates north to south but the indices are ordered south to north, hence the index flip below
-                                index = gridVertexCount + (height - row - 1);
-                                longitude -= skirtOffsetPercentage * rectangleWidth;
-                            } else if (isSouthEdge) {
-                                // Add after west indices. South indices are ordered east to west.
-                                index = gridVertexCount + height + (width - col - 1);
-                            } else if (isEastEdge) {
-                                // Add after west and south indices. East indices are ordered north to south. The index is flipped like above.
-                                index = gridVertexCount + height + width + row;
-                                longitude += skirtOffsetPercentage * rectangleWidth;
-                            } else if (isNorthEdge) {
-                                // Add after west, south, and east indices. North indices are ordered west to east.
-                                index = gridVertexCount + height + width + height + col;
-                            }
-                        }
-                    }
-
-                    var nX = cosLatitude * cos(longitude);
-                    var nY = cosLatitude * sin(longitude);
-
-                    var kX = radiiSquaredX * nX;
-                    var kY = radiiSquaredY * nY;
-
-                    var gamma = sqrt((kX * nX) + (kY * nY) + (kZ * nZ));
-                    var oneOverGamma = 1.0 / gamma;
-
-                    var rSurfaceX = kX * oneOverGamma;
-                    var rSurfaceY = kY * oneOverGamma;
-                    var rSurfaceZ = kZ * oneOverGamma;
-
-                    var position = new Cartographic.Cartesian3();
-                    position.x = rSurfaceX + nX * heightSample;
-                    position.y = rSurfaceY + nY * heightSample;
-                    position.z = rSurfaceZ + nZ * heightSample;
-
-                    positions[index] = position;
-                    heights[index] = heightSample;
-                    uvs[index] = new Cartesian2.Cartesian2(u, v);
-
-                    if (includeWebMercatorT) {
-                        webMercatorTs[index] = webMercatorT;
-                    }
-
-                    BoundingSphere.Matrix4.multiplyByPoint(toENU, position, cartesian3Scratch);
-
-                    Cartographic.Cartesian3.minimumByComponent(cartesian3Scratch, minimum, minimum);
-                    Cartographic.Cartesian3.maximumByComponent(cartesian3Scratch, maximum, maximum);
-                    hMin = Math.min(hMin, heightSample);
-                }
-            }
-
-            var boundingSphere3D = BoundingSphere.BoundingSphere.fromPoints(positions);
-            var orientedBoundingBox;
-            if (when.defined(rectangle)) {
-                orientedBoundingBox = OrientedBoundingBox.OrientedBoundingBox.fromRectangle(rectangle, minimumHeight, maximumHeight, ellipsoid);
-            }
-
-            var occludeePointInScaledSpace;
-            if (hasRelativeToCenter) {
-                var occluder = new TerrainEncoding.EllipsoidalOccluder(ellipsoid);
-                occludeePointInScaledSpace = occluder.computeHorizonCullingPointPossiblyUnderEllipsoid(relativeToCenter, positions, minimumHeight);
-            }
-
-            var aaBox = new EllipsoidTangentPlane.AxisAlignedBoundingBox(minimum, maximum, relativeToCenter);
-            var encoding = new TerrainEncoding.TerrainEncoding(aaBox, hMin, maximumHeight, fromENU, false, includeWebMercatorT);
-            var vertices = new Float32Array(vertexCount * encoding.getStride());
-
-            var bufferIndex = 0;
-            for (var j = 0; j < vertexCount; ++j) {
-                bufferIndex = encoding.encode(vertices, bufferIndex, positions[j], uvs[j], heights[j], undefined, webMercatorTs[j]);
-            }
-
-            return {
-                vertices : vertices,
-                maximumHeight : maximumHeight,
-                minimumHeight : minimumHeight,
-                encoding : encoding,
-                boundingSphere3D : boundingSphere3D,
-                orientedBoundingBox : orientedBoundingBox,
-                occludeePointInScaledSpace : occludeePointInScaledSpace
-            };
-        };
-
-    /* jshint forin: false, bitwise: false */
-    /*
-    Copyright 2015-2018 Esri
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-    A copy of the license and additional notices are located with the
-    source distribution at:
-
-    http://github.com/Esri/lerc/
-
-    Contributors:  Johannes Schmid, (LERC v1)
-                   Chayanika Khatua, (LERC v1)
-                   Wenxue Ju (LERC v1, v2.x)
-    */
-
-    /* Copyright 2015-2018 Esri. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @preserve */
-
-    var tmp = {};
-
-    /**
-     * a module for decoding LERC blobs
-     * @module Lerc
-     */
-    (function() {
-      //the original LercDecode for Version 1
-      var LercDecode = (function() {
-
-        // WARNING: This decoder version can only read old version 1 Lerc blobs. Use with caution.
-
-        // Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of
-        // the class was chosen to be future proof.
-
-        var CntZImage = {};
-
-        CntZImage.defaultNoDataValue = -3.4027999387901484e+38; // smallest Float32 value
-
-        /**
-         * Decode a LERC byte stream and return an object containing the pixel data and some required and optional
-         * information about it, such as the image's width and height.
-         *
-         * @param {ArrayBuffer} input The LERC input byte stream
-         * @param {object} [options] Decoding options, containing any of the following properties:
-         * @config {number} [inputOffset = 0]
-         *        Skip the first inputOffset bytes of the input byte stream. A valid LERC file is expected at that position.
-         * @config {Uint8Array} [encodedMask = null]
-         *        If specified, the decoder will not read mask information from the input and use the specified encoded
-         *        mask data instead. Mask header/data must not be present in the LERC byte stream in this case.
-         * @config {number} [noDataValue = LercCode.defaultNoDataValue]
-         *        Pixel value to use for masked pixels.
-         * @config {ArrayBufferView|Array} [pixelType = Float32Array]
-         *        The desired type of the pixelData array in the return value. Note that it is the caller's responsibility to
-         *        provide an appropriate noDataValue if the default pixelType is overridden.
-         * @config {boolean} [returnMask = false]
-         *        If true, the return value will contain a maskData property of type Uint8Array which has one element per
-         *        pixel, the value of which is 1 or 0 depending on whether that pixel's data is present or masked. If the
-         *        input LERC data does not contain a mask, maskData will not be returned.
-         * @config {boolean} [returnEncodedMask = false]
-         *        If true, the return value will contain a encodedMaskData property, which can be passed into encode() as
-         *        encodedMask.
-         * @config {boolean} [returnFileInfo = false]
-         *        If true, the return value will have a fileInfo property that contains metadata obtained from the
-         *        LERC headers and the decoding process.
-         * @config {boolean} [computeUsedBitDepths = false]
-         *        If true, the fileInfo property in the return value will contain the set of all block bit depths
-         *        encountered during decoding. Will only have an effect if returnFileInfo option is true.
-         * @returns {{width, height, pixelData, minValue, maxValue, noDataValue, maskData, encodedMaskData, fileInfo}}
-         */
-        CntZImage.decode = function(input, options) {
-          options = options || {};
-
-          var skipMask = options.encodedMaskData || (options.encodedMaskData === null);
-          var parsedData = parse(input, options.inputOffset || 0, skipMask);
-
-          var noDataValue = (options.noDataValue !== null) ? options.noDataValue : CntZImage.defaultNoDataValue;
-
-          var uncompressedData = uncompressPixelValues(parsedData, options.pixelType || Float32Array,
-            options.encodedMaskData, noDataValue, options.returnMask);
-
-          var result = {
-            width: parsedData.width,
-            height: parsedData.height,
-            pixelData: uncompressedData.resultPixels,
-            minValue: uncompressedData.minValue,
-            maxValue: parsedData.pixels.maxValue,
-            noDataValue: noDataValue
-          };
-
-          if (uncompressedData.resultMask) {
-            result.maskData = uncompressedData.resultMask;
-          }
-
-          if (options.returnEncodedMask && parsedData.mask) {
-            result.encodedMaskData = parsedData.mask.bitset ? parsedData.mask.bitset : null;
-          }
-
-          if (options.returnFileInfo) {
-            result.fileInfo = formatFileInfo(parsedData);
-            if (options.computeUsedBitDepths) {
-              result.fileInfo.bitDepths = computeUsedBitDepths(parsedData);
-            }
-          }
-
-          return result;
-        };
-
-        var uncompressPixelValues = function(data, TypedArrayClass, maskBitset, noDataValue, storeDecodedMask) {
-          var blockIdx = 0;
-          var numX = data.pixels.numBlocksX;
-          var numY = data.pixels.numBlocksY;
-          var blockWidth = Math.floor(data.width / numX);
-          var blockHeight = Math.floor(data.height / numY);
-          var scale = 2 * data.maxZError;
-          var minValue = Number.MAX_VALUE, currentValue;
-          maskBitset = maskBitset || ((data.mask) ? data.mask.bitset : null);
-
-          var resultPixels, resultMask;
-          resultPixels = new TypedArrayClass(data.width * data.height);
-          if (storeDecodedMask && maskBitset) {
-            resultMask = new Uint8Array(data.width * data.height);
-          }
-          var blockDataBuffer = new Float32Array(blockWidth * blockHeight);
-
-          var xx, yy;
-          for (var y = 0; y <= numY; y++) {
-            var thisBlockHeight = (y !== numY) ? blockHeight : (data.height % numY);
-            if (thisBlockHeight === 0) {
-              continue;
-            }
-            for (var x = 0; x <= numX; x++) {
-              var thisBlockWidth = (x !== numX) ? blockWidth : (data.width % numX);
-              if (thisBlockWidth === 0) {
-                continue;
-              }
-
-              var outPtr = y * data.width * blockHeight + x * blockWidth;
-              var outStride = data.width - thisBlockWidth;
-
-              var block = data.pixels.blocks[blockIdx];
-
-              var blockData, blockPtr, constValue;
-              if (block.encoding < 2) {
-                // block is either uncompressed or bit-stuffed (encodings 0 and 1)
-                if (block.encoding === 0) {
-                  // block is uncompressed
-                  blockData = block.rawData;
-                } else {
-                  // block is bit-stuffed
-                  unstuff(block.stuffedData, block.bitsPerPixel, block.numValidPixels, block.offset, scale, blockDataBuffer, data.pixels.maxValue);
-                  blockData = blockDataBuffer;
-                }
-                blockPtr = 0;
-              }
-              else if (block.encoding === 2) {
-                // block is all 0
-                constValue = 0;
-              }
-              else {
-                // block has constant value (encoding === 3)
-                constValue = block.offset;
-              }
-
-              var maskByte;
-              if (maskBitset) {
-                for (yy = 0; yy < thisBlockHeight; yy++) {
-                  if (outPtr & 7) {
-                    //
-                    maskByte = maskBitset[outPtr >> 3];
-                    maskByte <<= outPtr & 7;
-                  }
-                  for (xx = 0; xx < thisBlockWidth; xx++) {
-                    if (!(outPtr & 7)) {
-                      // read next byte from mask
-                      maskByte = maskBitset[outPtr >> 3];
-                    }
-                    if (maskByte & 128) {
-                      // pixel data present
-                      if (resultMask) {
-                        resultMask[outPtr] = 1;
-                      }
-                      currentValue = (block.encoding < 2) ? blockData[blockPtr++] : constValue;
-                      minValue = minValue > currentValue ? currentValue : minValue;
-                      resultPixels[outPtr++] = currentValue;
-                    } else {
-                      // pixel data not present
-                      if (resultMask) {
-                        resultMask[outPtr] = 0;
-                      }
-                      resultPixels[outPtr++] = noDataValue;
-                    }
-                    maskByte <<= 1;
-                  }
-                  outPtr += outStride;
-                }
-              } else {
-                // mask not present, simply copy block over
-                if (block.encoding < 2) {
-                  // duplicating this code block for performance reasons
-                  // blockData case:
-                  for (yy = 0; yy < thisBlockHeight; yy++) {
-                    for (xx = 0; xx < thisBlockWidth; xx++) {
-                      currentValue = blockData[blockPtr++];
-                      minValue = minValue > currentValue ? currentValue : minValue;
-                      resultPixels[outPtr++] = currentValue;
-                    }
-                    outPtr += outStride;
-                  }
-                }
-                else {
-                  // constValue case:
-                  minValue = minValue > constValue ? constValue : minValue;
-                  for (yy = 0; yy < thisBlockHeight; yy++) {
-                    for (xx = 0; xx < thisBlockWidth; xx++) {
-                      resultPixels[outPtr++] = constValue;
-                    }
-                    outPtr += outStride;
-                  }
-                }
-              }
-              if ((block.encoding === 1) && (blockPtr !== block.numValidPixels)) {
-                throw "Block and Mask do not match";
-              }
-              blockIdx++;
-            }
-          }
-
-          return {
-            resultPixels: resultPixels,
-            resultMask: resultMask,
-            minValue: minValue
-          };
-        };
-
-        var formatFileInfo = function(data) {
-          return {
-            "fileIdentifierString": data.fileIdentifierString,
-            "fileVersion": data.fileVersion,
-            "imageType": data.imageType,
-            "height": data.height,
-            "width": data.width,
-            "maxZError": data.maxZError,
-            "eofOffset": data.eofOffset,
-            "mask": data.mask ? {
-              "numBlocksX": data.mask.numBlocksX,
-              "numBlocksY": data.mask.numBlocksY,
-              "numBytes": data.mask.numBytes,
-              "maxValue": data.mask.maxValue
-            } : null,
-            "pixels": {
-              "numBlocksX": data.pixels.numBlocksX,
-              "numBlocksY": data.pixels.numBlocksY,
-              "numBytes": data.pixels.numBytes,
-              "maxValue": data.pixels.maxValue,
-              "noDataValue": data.noDataValue
-            }
-          };
-        };
-
-        var computeUsedBitDepths = function(data) {
-          var numBlocks = data.pixels.numBlocksX * data.pixels.numBlocksY;
-          var bitDepths = {};
-          for (var i = 0; i < numBlocks; i++) {
-            var block = data.pixels.blocks[i];
-            if (block.encoding === 0) {
-              bitDepths.float32 = true;
-            } else if (block.encoding === 1) {
-              bitDepths[block.bitsPerPixel] = true;
-            } else {
-              bitDepths[0] = true;
-            }
-          }
-
-          return Object.keys(bitDepths);
-        };
-
-        var parse = function(input, fp, skipMask) {
-          var data = {};
-
-          // File header
-          var fileIdView = new Uint8Array(input, fp, 10);
-          data.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
-          if (data.fileIdentifierString.trim() !== "CntZImage") {
-            throw "Unexpected file identifier string: " + data.fileIdentifierString;
-          }
-          fp += 10;
-          var view = new DataView(input, fp, 24);
-          data.fileVersion = view.getInt32(0, true);
-          data.imageType = view.getInt32(4, true);
-          data.height = view.getUint32(8, true);
-          data.width = view.getUint32(12, true);
-          data.maxZError = view.getFloat64(16, true);
-          fp += 24;
-
-          // Mask Header
-          if (!skipMask) {
-            view = new DataView(input, fp, 16);
-            data.mask = {};
-            data.mask.numBlocksY = view.getUint32(0, true);
-            data.mask.numBlocksX = view.getUint32(4, true);
-            data.mask.numBytes = view.getUint32(8, true);
-            data.mask.maxValue = view.getFloat32(12, true);
-            fp += 16;
-
-            // Mask Data
-            if (data.mask.numBytes > 0) {
-              var bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
-              view = new DataView(input, fp, data.mask.numBytes);
-              var cnt = view.getInt16(0, true);
-              var ip = 2, op = 0;
-              do {
-                if (cnt > 0) {
-                  while (cnt--) { bitset[op++] = view.getUint8(ip++); }
-                } else {
-                  var val = view.getUint8(ip++);
-                  cnt = -cnt;
-                  while (cnt--) { bitset[op++] = val; }
-                }
-                cnt = view.getInt16(ip, true);
-                ip += 2;
-              } while (ip < data.mask.numBytes);
-              if ((cnt !== -32768) || (op < bitset.length)) {
-                throw "Unexpected end of mask RLE encoding";
-              }
-              data.mask.bitset = bitset;
-              fp += data.mask.numBytes;
-            }
-            else if ((data.mask.numBytes | data.mask.numBlocksY | data.mask.maxValue) === 0) {  // Special case, all nodata
-              data.mask.bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));
-            }
-          }
-
-          // Pixel Header
-          view = new DataView(input, fp, 16);
-          data.pixels = {};
-          data.pixels.numBlocksY = view.getUint32(0, true);
-          data.pixels.numBlocksX = view.getUint32(4, true);
-          data.pixels.numBytes = view.getUint32(8, true);
-          data.pixels.maxValue = view.getFloat32(12, true);
-          fp += 16;
-
-          var numBlocksX = data.pixels.numBlocksX;
-          var numBlocksY = data.pixels.numBlocksY;
-          // the number of blocks specified in the header does not take into account the blocks at the end of
-          // each row/column with a special width/height that make the image complete in case the width is not
-          // evenly divisible by the number of blocks.
-          var actualNumBlocksX = numBlocksX + ((data.width % numBlocksX) > 0 ? 1 : 0);
-          var actualNumBlocksY = numBlocksY + ((data.height % numBlocksY) > 0 ? 1 : 0);
-          data.pixels.blocks = new Array(actualNumBlocksX * actualNumBlocksY);
-          var blockI = 0;
-          for (var blockY = 0; blockY < actualNumBlocksY; blockY++) {
-            for (var blockX = 0; blockX < actualNumBlocksX; blockX++) {
-
-              // Block
-              var size = 0;
-              var bytesLeft = input.byteLength - fp;
-              view = new DataView(input, fp, Math.min(10, bytesLeft));
-              var block = {};
-              data.pixels.blocks[blockI++] = block;
-              var headerByte = view.getUint8(0); size++;
-              block.encoding = headerByte & 63;
-              if (block.encoding > 3) {
-                throw "Invalid block encoding (" + block.encoding + ")";
-              }
-              if (block.encoding === 2) {
-                fp++;
-                continue;
-              }
-              if ((headerByte !== 0) && (headerByte !== 2)) {
-                headerByte >>= 6;
-                block.offsetType = headerByte;
-                if (headerByte === 2) {
-                  block.offset = view.getInt8(1); size++;
-                } else if (headerByte === 1) {
-                  block.offset = view.getInt16(1, true); size += 2;
-                } else if (headerByte === 0) {
-                  block.offset = view.getFloat32(1, true); size += 4;
-                } else {
-                  throw "Invalid block offset type";
-                }
-
-                if (block.encoding === 1) {
-                  headerByte = view.getUint8(size); size++;
-                  block.bitsPerPixel = headerByte & 63;
-                  headerByte >>= 6;
-                  block.numValidPixelsType = headerByte;
-                  if (headerByte === 2) {
-                    block.numValidPixels = view.getUint8(size); size++;
-                  } else if (headerByte === 1) {
-                    block.numValidPixels = view.getUint16(size, true); size += 2;
-                  } else if (headerByte === 0) {
-                    block.numValidPixels = view.getUint32(size, true); size += 4;
-                  } else {
-                    throw "Invalid valid pixel count type";
-                  }
-                }
-              }
-              fp += size;
-
-              if (block.encoding === 3) {
-                continue;
-              }
-
-              var arrayBuf, store8;
-              if (block.encoding === 0) {
-                var numPixels = (data.pixels.numBytes - 1) / 4;
-                if (numPixels !== Math.floor(numPixels)) {
-                  throw "uncompressed block has invalid length";
-                }
-                arrayBuf = new ArrayBuffer(numPixels * 4);
-                store8 = new Uint8Array(arrayBuf);
-                store8.set(new Uint8Array(input, fp, numPixels * 4));
-                var rawData = new Float32Array(arrayBuf);
-                block.rawData = rawData;
-                fp += numPixels * 4;
-              } else if (block.encoding === 1) {
-                var dataBytes = Math.ceil(block.numValidPixels * block.bitsPerPixel / 8);
-                var dataWords = Math.ceil(dataBytes / 4);
-                arrayBuf = new ArrayBuffer(dataWords * 4);
-                store8 = new Uint8Array(arrayBuf);
-                store8.set(new Uint8Array(input, fp, dataBytes));
-                block.stuffedData = new Uint32Array(arrayBuf);
-                fp += dataBytes;
-              }
-            }
-          }
-          data.eofOffset = fp;
-          return data;
-        };
-
-        var unstuff = function(src, bitsPerPixel, numPixels, offset, scale, dest, maxValue) {
-          var bitMask = (1 << bitsPerPixel) - 1;
-          var i = 0, o;
-          var bitsLeft = 0;
-          var n, buffer;
-          var nmax = Math.ceil((maxValue - offset) / scale);
-          // get rid of trailing bytes that are already part of next block
-          var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
-          src[src.length - 1] <<= 8 * numInvalidTailBytes;
-
-          for (o = 0; o < numPixels; o++) {
-            if (bitsLeft === 0) {
-              buffer = src[i++];
-              bitsLeft = 32;
-            }
-            if (bitsLeft >= bitsPerPixel) {
-              n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
-              bitsLeft -= bitsPerPixel;
-            } else {
-              var missingBits = (bitsPerPixel - bitsLeft);
-              n = ((buffer & bitMask) << missingBits) & bitMask;
-              buffer = src[i++];
-              bitsLeft = 32 - missingBits;
-              n += (buffer >>> bitsLeft);
-            }
-            //pixel values may exceed max due to quantization
-            dest[o] = n < nmax ? offset + n * scale : maxValue;
-          }
-          return dest;
-        };
-
-        return CntZImage;
-      })();
-
-      //version 2. Supports 2.1, 2.2, 2.3
-      var Lerc2Decode = (function() {
-        // Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of
-        // the class was chosen to be future proof, following LercDecode.
-
-        /*****************************************
-        * private static class bitsutffer used by Lerc2Decode
-        *******************************************/
-        var BitStuffer = {
-          //methods ending with 2 are for the new byte order used by Lerc2.3 and above.
-          //originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons.
-          unstuff: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
-            var bitMask = (1 << bitsPerPixel) - 1;
-            var i = 0, o;
-            var bitsLeft = 0;
-            var n, buffer, missingBits, nmax;
-
-            // get rid of trailing bytes that are already part of next block
-            var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
-            src[src.length - 1] <<= 8 * numInvalidTailBytes;
-            if (lutArr) {
-              for (o = 0; o < numPixels; o++) {
-                if (bitsLeft === 0) {
-                  buffer = src[i++];
-                  bitsLeft = 32;
-                }
-                if (bitsLeft >= bitsPerPixel) {
-                  n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
-                  bitsLeft -= bitsPerPixel;
-                }
-                else {
-                  missingBits = (bitsPerPixel - bitsLeft);
-                  n = ((buffer & bitMask) << missingBits) & bitMask;
-                  buffer = src[i++];
-                  bitsLeft = 32 - missingBits;
-                  n += (buffer >>> bitsLeft);
-                }
-                dest[o] = lutArr[n];//offset + lutArr[n] * scale;
-              }
-            }
-            else {
-              nmax = Math.ceil((maxValue - offset) / scale);
-              for (o = 0; o < numPixels; o++) {
-                if (bitsLeft === 0) {
-                  buffer = src[i++];
-                  bitsLeft = 32;
-                }
-                if (bitsLeft >= bitsPerPixel) {
-                  n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
-                  bitsLeft -= bitsPerPixel;
-                }
-                else {
-                  missingBits = (bitsPerPixel - bitsLeft);
-                  n = ((buffer & bitMask) << missingBits) & bitMask;
-                  buffer = src[i++];
-                  bitsLeft = 32 - missingBits;
-                  n += (buffer >>> bitsLeft);
-                }
-                //pixel values may exceed max due to quantization
-                dest[o] = n < nmax ? offset + n * scale : maxValue;
-              }
-            }
-          },
-
-          unstuffLUT: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
-            var bitMask = (1 << bitsPerPixel) - 1;
-            var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0;
-            var buffer;
-            var dest = [];
-
-            // get rid of trailing bytes that are already part of next block
-            var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
-            src[src.length - 1] <<= 8 * numInvalidTailBytes;
-
-            var nmax = Math.ceil((maxValue - offset) / scale);
-            for (o = 0; o < numPixels; o++) {
-              if (bitsLeft === 0) {
-                buffer = src[i++];
-                bitsLeft = 32;
-              }
-              if (bitsLeft >= bitsPerPixel) {
-                n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
-                bitsLeft -= bitsPerPixel;
-              } else {
-                missingBits = (bitsPerPixel - bitsLeft);
-                n = ((buffer & bitMask) << missingBits) & bitMask;
-                buffer = src[i++];
-                bitsLeft = 32 - missingBits;
-                n += (buffer >>> bitsLeft);
-              }
-              //dest.push(n);
-              dest[o] = n < nmax ? offset + n * scale : maxValue;
-            }
-            dest.unshift(offset);//1st one
-            return dest;
-          },
-
-          unstuff2: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {
-            var bitMask = (1 << bitsPerPixel) - 1;
-            var i = 0, o;
-            var bitsLeft = 0, bitPos = 0;
-            var n, buffer, missingBits;
-            if (lutArr) {
-              for (o = 0; o < numPixels; o++) {
-                if (bitsLeft === 0) {
-                  buffer = src[i++];
-                  bitsLeft = 32;
-                  bitPos = 0;
-                }
-                if (bitsLeft >= bitsPerPixel) {
-                  n = ((buffer >>> bitPos) & bitMask);
-                  bitsLeft -= bitsPerPixel;
-                  bitPos += bitsPerPixel;
-                } else {
-                  missingBits = (bitsPerPixel - bitsLeft);
-                  n = (buffer >>> bitPos) & bitMask;
-                  buffer = src[i++];
-                  bitsLeft = 32 - missingBits;
-                  n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
-                  bitPos = missingBits;
-                }
-                dest[o] = lutArr[n];
-              }
-            }
-            else {
-              var nmax = Math.ceil((maxValue - offset) / scale);
-              for (o = 0; o < numPixels; o++) {
-                if (bitsLeft === 0) {
-                  buffer = src[i++];
-                  bitsLeft = 32;
-                  bitPos = 0;
-                }
-                if (bitsLeft >= bitsPerPixel) {
-                  //no unsigned left shift
-                  n = ((buffer >>> bitPos) & bitMask);
-                  bitsLeft -= bitsPerPixel;
-                  bitPos += bitsPerPixel;
-                } else {
-                  missingBits = (bitsPerPixel - bitsLeft);
-                  n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;
-                  buffer = src[i++];
-                  bitsLeft = 32 - missingBits;
-                  n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
-                  bitPos = missingBits;
-                }
-                //pixel values may exceed max due to quantization
-                dest[o] = n < nmax ? offset + n * scale : maxValue;
-              }
-            }
-            return dest;
-          },
-
-          unstuffLUT2: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {
-            var bitMask = (1 << bitsPerPixel) - 1;
-            var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0, bitPos = 0;
-            var buffer;
-            var dest = [];
-            var nmax = Math.ceil((maxValue - offset) / scale);
-            for (o = 0; o < numPixels; o++) {
-              if (bitsLeft === 0) {
-                buffer = src[i++];
-                bitsLeft = 32;
-                bitPos = 0;
-              }
-              if (bitsLeft >= bitsPerPixel) {
-                //no unsigned left shift
-                n = ((buffer >>> bitPos) & bitMask);
-                bitsLeft -= bitsPerPixel;
-                bitPos += bitsPerPixel;
-              } else {
-                missingBits = (bitsPerPixel - bitsLeft);
-                n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;
-                buffer = src[i++];
-                bitsLeft = 32 - missingBits;
-                n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
-                bitPos = missingBits;
-              }
-              //dest.push(n);
-              dest[o] = n < nmax ? offset + n * scale : maxValue;
-            }
-            dest.unshift(offset);
-            return dest;
-          },
-
-          originalUnstuff: function(src, dest, bitsPerPixel, numPixels) {
-            var bitMask = (1 << bitsPerPixel) - 1;
-            var i = 0, o;
-            var bitsLeft = 0;
-            var n, buffer, missingBits;
-
-            // get rid of trailing bytes that are already part of next block
-            var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);
-            src[src.length - 1] <<= 8 * numInvalidTailBytes;
-
-            for (o = 0; o < numPixels; o++) {
-              if (bitsLeft === 0) {
-                buffer = src[i++];
-                bitsLeft = 32;
-              }
-              if (bitsLeft >= bitsPerPixel) {
-                n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;
-                bitsLeft -= bitsPerPixel;
-              }
-              else {
-                missingBits = (bitsPerPixel - bitsLeft);
-                n = ((buffer & bitMask) << missingBits) & bitMask;
-                buffer = src[i++];
-                bitsLeft = 32 - missingBits;
-                n += (buffer >>> bitsLeft);
-              }
-              dest[o] = n;
-            }
-            return dest;
-          },
-
-          originalUnstuff2: function(src, dest, bitsPerPixel, numPixels) {
-            var bitMask = (1 << bitsPerPixel) - 1;
-            var i = 0, o;
-            var bitsLeft = 0, bitPos = 0;
-            var n, buffer, missingBits;
-            //micro-optimizations
-            for (o = 0; o < numPixels; o++) {
-              if (bitsLeft === 0) {
-                buffer = src[i++];
-                bitsLeft = 32;
-                bitPos = 0;
-              }
-              if (bitsLeft >= bitsPerPixel) {
-                //no unsigned left shift
-                n = ((buffer >>> bitPos) & bitMask);
-                bitsLeft -= bitsPerPixel;
-                bitPos += bitsPerPixel;
-              } else {
-                missingBits = (bitsPerPixel - bitsLeft);
-                n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;
-                buffer = src[i++];
-                bitsLeft = 32 - missingBits;
-                n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);
-                bitPos = missingBits;
-              }
-              dest[o] = n;
-            }
-            return dest;
-          }
-        };
-
-        /*****************************************
-        *private static class used by Lerc2Decode
-        ******************************************/
-        var Lerc2Helpers = {
-          HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, treat it like constant
-          computeChecksumFletcher32: function(input) {
-
-            var sum1 = 0xffff, sum2 = 0xffff;
-            var len = input.length;
-            var words = Math.floor(len / 2);
-            var i = 0;
-            while (words) {
-              var tlen = (words >= 359) ? 359 : words;
-              words -= tlen;
-              do {
-                sum1 += (input[i++] << 8);
-                sum2 += sum1 += input[i++];
-              } while (--tlen);
-
-              sum1 = (sum1 & 0xffff) + (sum1 >>> 16);
-              sum2 = (sum2 & 0xffff) + (sum2 >>> 16);
-            }
-
-            // add the straggler byte if it exists
-            if (len & 1) {
-              sum2 += sum1 += (input[i] << 8);
-            }
-            // second reduction step to reduce sums to 16 bits
-            sum1 = (sum1 & 0xffff) + (sum1 >>> 16);
-            sum2 = (sum2 & 0xffff) + (sum2 >>> 16);
-
-            return (sum2 << 16 | sum1) >>> 0;
-          },
-
-          readHeaderInfo: function(input, data) {
-            var ptr = data.ptr;
-            var fileIdView = new Uint8Array(input, ptr, 6);
-            var headerInfo = {};
-            headerInfo.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
-            if (headerInfo.fileIdentifierString.lastIndexOf("Lerc2", 0) !== 0) {
-              throw "Unexpected file identifier string (expect Lerc2 ): " + headerInfo.fileIdentifierString;
-            }
-            ptr += 6;
-            var view = new DataView(input, ptr, 8);
-            var fileVersion = view.getInt32(0, true);
-            headerInfo.fileVersion = fileVersion;
-            ptr += 4;
-            if (fileVersion >= 3) {
-              headerInfo.checksum = view.getUint32(4, true); //nrows
-              ptr += 4;
-            }
-
-            //keys start from here
-            view = new DataView(input, ptr, 12);
-            headerInfo.height = view.getUint32(0, true); //nrows
-            headerInfo.width = view.getUint32(4, true); //ncols
-            ptr += 8;
-            if (fileVersion >= 4) {
-              headerInfo.numDims = view.getUint32(8, true);
-              ptr += 4;
-            }
-            else {
-              headerInfo.numDims = 1;
-            }
-
-            view = new DataView(input, ptr, 40);
-            headerInfo.numValidPixel = view.getUint32(0, true);
-            headerInfo.microBlockSize = view.getInt32(4, true);
-            headerInfo.blobSize = view.getInt32(8, true);
-            headerInfo.imageType = view.getInt32(12, true);
-
-            headerInfo.maxZError = view.getFloat64(16, true);
-            headerInfo.zMin = view.getFloat64(24, true);
-            headerInfo.zMax = view.getFloat64(32, true);
-            ptr += 40;
-            data.headerInfo = headerInfo;
-            data.ptr = ptr;
-
-            var checksum, keyLength;
-            if (fileVersion >= 3) {
-              keyLength = fileVersion >= 4 ? 52 : 48;
-              checksum = this.computeChecksumFletcher32(new Uint8Array(input, ptr - keyLength, headerInfo.blobSize - 14));
-              if (checksum !== headerInfo.checksum) {
-                throw "Checksum failed.";
-              }
-            }
-            return true;
-          },
-
-          checkMinMaxRanges: function(input, data) {
-            var headerInfo = data.headerInfo;
-            var OutPixelTypeArray = this.getDataTypeArray(headerInfo.imageType);
-            var rangeBytes = headerInfo.numDims * this.getDataTypeSize(headerInfo.imageType);
-            var minValues = this.readSubArray(input, data.ptr, OutPixelTypeArray, rangeBytes);
-            var maxValues = this.readSubArray(input, data.ptr + rangeBytes, OutPixelTypeArray, rangeBytes);
-            data.ptr += (2 * rangeBytes);
-            var i, equal = true;
-            for (i = 0; i < headerInfo.numDims; i++) {
-              if (minValues[i] !== maxValues[i]) {
-                equal = false;
-                break;
-              }
-            }
-            headerInfo.minValues = minValues;
-            headerInfo.maxValues = maxValues;
-            return equal;
-          },
-
-          readSubArray: function(input, ptr, OutPixelTypeArray, numBytes) {
-            var rawData;
-            if (OutPixelTypeArray === Uint8Array) {
-              rawData = new Uint8Array(input, ptr, numBytes);
-            }
-            else {
-              var arrayBuf = new ArrayBuffer(numBytes);
-              var store8 = new Uint8Array(arrayBuf);
-              store8.set(new Uint8Array(input, ptr, numBytes));
-              rawData = new OutPixelTypeArray(arrayBuf);
-            }
-            return rawData;
-          },
-
-          readMask: function(input, data) {
-            var ptr = data.ptr;
-            var headerInfo = data.headerInfo;
-            var numPixels = headerInfo.width * headerInfo.height;
-            var numValidPixel = headerInfo.numValidPixel;
-
-            var view = new DataView(input, ptr, 4);
-            var mask = {};
-            mask.numBytes = view.getUint32(0, true);
-            ptr += 4;
-
-            // Mask Data
-            if ((0 === numValidPixel || numPixels === numValidPixel) && 0 !== mask.numBytes) {
-              throw ("invalid mask");
-            }
-            var bitset, resultMask;
-            if (numValidPixel === 0) {
-              bitset = new Uint8Array(Math.ceil(numPixels / 8));
-              mask.bitset = bitset;
-              resultMask = new Uint8Array(numPixels);
-              data.pixels.resultMask = resultMask;
-              ptr += mask.numBytes;
-            }// ????? else if (data.mask.numBytes > 0 && data.mask.numBytes< data.numValidPixel) {
-            else if (mask.numBytes > 0) {
-              bitset = new Uint8Array(Math.ceil(numPixels / 8));
-              view = new DataView(input, ptr, mask.numBytes);
-              var cnt = view.getInt16(0, true);
-              var ip = 2, op = 0, val = 0;
-              do {
-                if (cnt > 0) {
-                  while (cnt--) { bitset[op++] = view.getUint8(ip++); }
-                } else {
-                  val = view.getUint8(ip++);
-                  cnt = -cnt;
-                  while (cnt--) { bitset[op++] = val; }
-                }
-                cnt = view.getInt16(ip, true);
-                ip += 2;
-              } while (ip < mask.numBytes);
-              if ((cnt !== -32768) || (op < bitset.length)) {
-                throw "Unexpected end of mask RLE encoding";
-              }
-
-              resultMask = new Uint8Array(numPixels);
-              var mb = 0, k = 0;
-
-              for (k = 0; k < numPixels; k++) {
-                if (k & 7) {
-                  mb = bitset[k >> 3];
-                  mb <<= k & 7;
-                }
-                else {
-                  mb = bitset[k >> 3];
-                }
-                if (mb & 128) {
-                  resultMask[k] = 1;
-                }
-              }
-              data.pixels.resultMask = resultMask;
-
-              mask.bitset = bitset;
-              ptr += mask.numBytes;
-            }
-            data.ptr = ptr;
-            data.mask = mask;
-            return true;
-          },
-
-          readDataOneSweep: function(input, data, OutPixelTypeArray) {
-            var ptr = data.ptr;
-            var headerInfo = data.headerInfo;
-            var numDims = headerInfo.numDims;
-            var numPixels = headerInfo.width * headerInfo.height;
-            var imageType = headerInfo.imageType;
-            var numBytes = headerInfo.numValidPixel * Lerc2Helpers.getDataTypeSize(imageType) * numDims;
-            //data.pixels.numBytes = numBytes;
-            var rawData;
-            var mask = data.pixels.resultMask;
-            if (OutPixelTypeArray === Uint8Array) {
-              rawData = new Uint8Array(input, ptr, numBytes);
-            }
-            else {
-              var arrayBuf = new ArrayBuffer(numBytes);
-              var store8 = new Uint8Array(arrayBuf);
-              store8.set(new Uint8Array(input, ptr, numBytes));
-              rawData = new OutPixelTypeArray(arrayBuf);
-            }
-            if (rawData.length === numPixels * numDims) {
-              data.pixels.resultPixels = rawData;
-            }
-            else  //mask
-            {
-              data.pixels.resultPixels = new OutPixelTypeArray(numPixels * numDims);
-              var z = 0, k = 0, i = 0, nStart = 0;
-              if (numDims > 1) {
-                for (i=0; i < numDims; i++) {
-                  nStart = i * numPixels;
-                  for (k = 0; k < numPixels; k++) {
-                    if (mask[k]) {
-                      data.pixels.resultPixels[nStart + k] = rawData[z++];
-                    }
-                  }
-                }
-              }
-              else {
-                for (k = 0; k < numPixels; k++) {
-                  if (mask[k]) {
-                    data.pixels.resultPixels[k] = rawData[z++];
-                  }
-                }
-              }
-            }
-            ptr += numBytes;
-            data.ptr = ptr;       //return data;
-            return true;
-          },
-
-          readHuffmanTree: function(input, data) {
-            var BITS_MAX = this.HUFFMAN_LUT_BITS_MAX; //8 is slow for the large test image
-            //var size_max = 1 << BITS_MAX;
-            /* ************************
-             * reading code table
-             *************************/
-            var view = new DataView(input, data.ptr, 16);
-            data.ptr += 16;
-            var version = view.getInt32(0, true);
-            if (version < 2) {
-              throw "unsupported Huffman version";
-            }
-            var size = view.getInt32(4, true);
-            var i0 = view.getInt32(8, true);
-            var i1 = view.getInt32(12, true);
-            if (i0 >= i1) {
-              return false;
-            }
-            var blockDataBuffer = new Uint32Array(i1 - i0);
-            Lerc2Helpers.decodeBits(input, data, blockDataBuffer);
-            var codeTable = []; //size
-            var i, j, k, len;
-
-            for (i = i0; i < i1; i++) {
-              j = i - (i < size ? 0 : size);//wrap around
-              codeTable[j] = { first: blockDataBuffer[i - i0], second: null };
-            }
-
-            var dataBytes = input.byteLength - data.ptr;
-            var dataWords = Math.ceil(dataBytes / 4);
-            var arrayBuf = new ArrayBuffer(dataWords * 4);
-            var store8 = new Uint8Array(arrayBuf);
-            store8.set(new Uint8Array(input, data.ptr, dataBytes));
-            var stuffedData = new Uint32Array(arrayBuf); //must start from x*4
-            var bitPos = 0, word, srcPtr = 0;
-            word = stuffedData[0];
-            for (i = i0; i < i1; i++) {
-              j = i - (i < size ? 0 : size);//wrap around
-              len = codeTable[j].first;
-              if (len > 0) {
-                codeTable[j].second = (word << bitPos) >>> (32 - len);
-
-                if (32 - bitPos >= len) {
-                  bitPos += len;
-                  if (bitPos === 32) {
-                    bitPos = 0;
-                    srcPtr++;
-                    word = stuffedData[srcPtr];
-                  }
-                }
-                else {
-                  bitPos += len - 32;
-                  srcPtr++;
-                  word = stuffedData[srcPtr];
-                  codeTable[j].second |= word >>> (32 - bitPos);
-                }
-              }
-            }
-
-            //finished reading code table
-
-            /* ************************
-             * building lut
-             *************************/
-            var numBitsLUT = 0, numBitsLUTQick = 0;
-            var tree = new TreeNode();
-            for (i = 0; i < codeTable.length; i++) {
-              if (codeTable[i] !== undefined) {
-                numBitsLUT = Math.max(numBitsLUT, codeTable[i].first);
-              }
-            }
-            if (numBitsLUT >= BITS_MAX) {
-              numBitsLUTQick = BITS_MAX;
-            }
-            else {
-              numBitsLUTQick = numBitsLUT;
-            }
-            if (numBitsLUT >= 30) {
-              console.log("WARning, large NUM LUT BITS IS " + numBitsLUT);
-            }
-            var decodeLut = [], entry, code, numEntries, jj, currentBit, node;
-            for (i = i0; i < i1; i++) {
-              j = i - (i < size ? 0 : size);//wrap around
-              len = codeTable[j].first;
-              if (len > 0) {
-                entry = [len, j];
-                if (len <= numBitsLUTQick) {
-                  code = codeTable[j].second << (numBitsLUTQick - len);
-                  numEntries = 1 << (numBitsLUTQick - len);
-                  for (k = 0; k < numEntries; k++) {
-                    decodeLut[code | k] = entry;
-                  }
-                }
-                else {
-                  //build tree
-                  code = codeTable[j].second;
-                  node = tree;
-                  for (jj = len - 1; jj >= 0; jj--) {
-                    currentBit = code >>> jj & 1; //no left shift as length could be 30,31
-                    if (currentBit) {
-                      if (!node.right) {
-                        node.right = new TreeNode();
-                      }
-                      node = node.right;
-                    }
-                    else {
-                      if (!node.left) {
-                        node.left = new TreeNode();
-                      }
-                      node = node.left;
-                    }
-                    if (jj === 0 && !node.val) {
-                      node.val = entry[1];
-                    }
-                  }
-                }
-              }
-            }
-            return {
-              decodeLut: decodeLut,
-              numBitsLUTQick: numBitsLUTQick,
-              numBitsLUT: numBitsLUT,
-              tree: tree,
-              stuffedData: stuffedData,
-              srcPtr: srcPtr,
-              bitPos: bitPos
-            };
-          },
-
-          readHuffman: function(input, data, OutPixelTypeArray) {
-            var headerInfo = data.headerInfo;
-            var numDims = headerInfo.numDims;
-            var height = data.headerInfo.height;
-            var width = data.headerInfo.width;
-            var numPixels = width * height;
-            //var size_max = 1 << BITS_MAX;
-            /* ************************
-             * reading huffman structure info
-             *************************/
-            var huffmanInfo = this.readHuffmanTree(input, data);
-            var decodeLut = huffmanInfo.decodeLut;
-            var tree = huffmanInfo.tree;
-            //stuffedData includes huffman headers
-            var stuffedData = huffmanInfo.stuffedData;
-            var srcPtr = huffmanInfo.srcPtr;
-            var bitPos = huffmanInfo.bitPos;
-            var numBitsLUTQick = huffmanInfo.numBitsLUTQick;
-            var numBitsLUT = huffmanInfo.numBitsLUT;
-            var offset = data.headerInfo.imageType === 0 ? 128 : 0;
-            /*************************
-            *  decode
-            ***************************/
-            var node, val, delta, mask = data.pixels.resultMask, valTmp, valTmpQuick, currentBit;
-            var i, j, k, ii;
-            var prevVal = 0;
-            if (bitPos > 0) {
-              srcPtr++;
-              bitPos = 0;
-            }
-            var word = stuffedData[srcPtr];
-            var deltaEncode = data.encodeMode === 1;
-            var resultPixelsAllDim = new OutPixelTypeArray(numPixels * numDims);
-            var resultPixels = resultPixelsAllDim;
-            var iDim;
-            for (iDim = 0; iDim < headerInfo.numDims; iDim++) {
-              if (numDims > 1) {
-                //get the mem block of current dimension
-                resultPixels = new OutPixelTypeArray(resultPixelsAllDim.buffer, numPixels * iDim, numPixels);
-                prevVal = 0;
-              }
-              if (data.headerInfo.numValidPixel === width * height) { //all valid
-                for (k = 0, i = 0; i < height; i++) {
-                  for (j = 0; j < width; j++, k++) {
-                    val = 0;
-                    valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);
-                    valTmpQuick = valTmp;// >>> deltaBits;
-                    if (32 - bitPos < numBitsLUTQick) {
-                      valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));
-                      valTmpQuick = valTmp;// >>> deltaBits;
-                    }
-                    if (decodeLut[valTmpQuick])    // if there, move the correct number of bits and done
-                    {
-                      val = decodeLut[valTmpQuick][1];
-                      bitPos += decodeLut[valTmpQuick][0];
-                    }
-                    else {
-                      valTmp = (word << bitPos) >>> (32 - numBitsLUT);
-                      valTmpQuick = valTmp;// >>> deltaBits;
-                      if (32 - bitPos < numBitsLUT) {
-                        valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));
-                        valTmpQuick = valTmp;// >>> deltaBits;
-                      }
-                      node = tree;
-                      for (ii = 0; ii < numBitsLUT; ii++) {
-                        currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;
-                        node = currentBit ? node.right : node.left;
-                        if (!(node.left || node.right)) {
-                          val = node.val;
-                          bitPos = bitPos + ii + 1;
-                          break;
-                        }
-                      }
-                    }
-
-                    if (bitPos >= 32) {
-                      bitPos -= 32;
-                      srcPtr++;
-                      word = stuffedData[srcPtr];
-                    }
-
-                    delta = val - offset;
-                    if (deltaEncode) {
-                      if (j > 0) {
-                        delta += prevVal;    // use overflow
-                      }
-                      else if (i > 0) {
-                        delta += resultPixels[k - width];
-                      }
-                      else {
-                        delta += prevVal;
-                      }
-                      delta &= 0xFF; //overflow
-                      resultPixels[k] = delta;//overflow
-                      prevVal = delta;
-                    }
-                    else {
-                      resultPixels[k] = delta;
-                    }
-                  }
-                }
-              }
-              else { //not all valid, use mask
-                for (k = 0, i = 0; i < height; i++) {
-                  for (j = 0; j < width; j++, k++) {
-                    if (mask[k]) {
-                      val = 0;
-                      valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);
-                      valTmpQuick = valTmp;// >>> deltaBits;
-                      if (32 - bitPos < numBitsLUTQick) {
-                        valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));
-                        valTmpQuick = valTmp;// >>> deltaBits;
-                      }
-                      if (decodeLut[valTmpQuick])    // if there, move the correct number of bits and done
-                      {
-                        val = decodeLut[valTmpQuick][1];
-                        bitPos += decodeLut[valTmpQuick][0];
-                      }
-                      else {
-                        valTmp = (word << bitPos) >>> (32 - numBitsLUT);
-                        valTmpQuick = valTmp;// >>> deltaBits;
-                        if (32 - bitPos < numBitsLUT) {
-                          valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));
-                          valTmpQuick = valTmp;// >>> deltaBits;
-                        }
-                        node = tree;
-                        for (ii = 0; ii < numBitsLUT; ii++) {
-                          currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;
-                          node = currentBit ? node.right : node.left;
-                          if (!(node.left || node.right)) {
-                            val = node.val;
-                            bitPos = bitPos + ii + 1;
-                            break;
-                          }
-                        }
-                      }
-
-                      if (bitPos >= 32) {
-                        bitPos -= 32;
-                        srcPtr++;
-                        word = stuffedData[srcPtr];
-                      }
-
-                      delta = val - offset;
-                      if (deltaEncode) {
-                        if (j > 0 && mask[k - 1]) {
-                          delta += prevVal;    // use overflow
-                        }
-                        else if (i > 0 && mask[k - width]) {
-                          delta += resultPixels[k - width];
-                        }
-                        else {
-                          delta += prevVal;
-                        }
-
-                        delta &= 0xFF; //overflow
-                        resultPixels[k] = delta;//overflow
-                        prevVal = delta;
-                      }
-                      else {
-                        resultPixels[k] = delta;
-                      }
-                    }
-                  }
-                }
-              }
-              data.ptr = data.ptr + (srcPtr + 1) * 4 + (bitPos > 0 ? 4 : 0);
-            }
-            data.pixels.resultPixels = resultPixelsAllDim;
-          },
-
-          decodeBits: function(input, data, blockDataBuffer, offset, iDim) {
-            {
-              //bitstuff encoding is 3
-              var headerInfo = data.headerInfo;
-              var fileVersion = headerInfo.fileVersion;
-              //var block = {};
-              var blockPtr = 0;
-              var viewByteLength = ((input.byteLength - data.ptr) >= 5) ? 5 : (input.byteLength - data.ptr);
-              var view = new DataView(input, data.ptr, viewByteLength);
-              var headerByte = view.getUint8(0);
-              blockPtr++;
-              var bits67 = headerByte >> 6;
-              var n = (bits67 === 0) ? 4 : 3 - bits67;
-              var doLut = (headerByte & 32) > 0 ? true : false;//5th bit
-              var numBits = headerByte & 31;
-              var numElements = 0;
-              if (n === 1) {
-                numElements = view.getUint8(blockPtr); blockPtr++;
-              } else if (n === 2) {
-                numElements = view.getUint16(blockPtr, true); blockPtr += 2;
-              } else if (n === 4) {
-                numElements = view.getUint32(blockPtr, true); blockPtr += 4;
-              } else {
-                throw "Invalid valid pixel count type";
-              }
-              //fix: huffman codes are bit stuffed, but not bound by data's max value, so need to use originalUnstuff
-              //offset = offset || 0;
-              var scale = 2 * headerInfo.maxZError;
-              var stuffedData, arrayBuf, store8, dataBytes, dataWords;
-              var lutArr, lutData, lutBytes, bitsPerPixel;
-              var zMax = headerInfo.numDims > 1 ? headerInfo.maxValues[iDim] : headerInfo.zMax;
-              if (doLut) {
-                data.counter.lut++;
-                lutBytes = view.getUint8(blockPtr);
-                blockPtr++;
-                dataBytes = Math.ceil((lutBytes - 1) * numBits / 8);
-                dataWords = Math.ceil(dataBytes / 4);
-                arrayBuf = new ArrayBuffer(dataWords * 4);
-                store8 = new Uint8Array(arrayBuf);
-
-                data.ptr += blockPtr;
-                store8.set(new Uint8Array(input, data.ptr, dataBytes));
-
-                lutData = new Uint32Array(arrayBuf);
-                data.ptr += dataBytes;
-
-                bitsPerPixel = 0;
-                while ((lutBytes - 1) >>> bitsPerPixel) {
-                  bitsPerPixel++;
-                }
-                dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
-                dataWords = Math.ceil(dataBytes / 4);
-                arrayBuf = new ArrayBuffer(dataWords * 4);
-                store8 = new Uint8Array(arrayBuf);
-                store8.set(new Uint8Array(input, data.ptr, dataBytes));
-                stuffedData = new Uint32Array(arrayBuf);
-                data.ptr += dataBytes;
-                if (fileVersion >= 3) {
-                  lutArr = BitStuffer.unstuffLUT2(lutData, numBits, lutBytes - 1, offset, scale, zMax);
-                }
-                else {
-                  lutArr = BitStuffer.unstuffLUT(lutData, numBits, lutBytes - 1, offset, scale, zMax);
-                }
-                //lutArr.unshift(0);
-                if (fileVersion >= 3) {
-                  //BitStuffer.unstuff2(block, blockDataBuffer, headerInfo.zMax);
-                  BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
-                }
-                else {
-                  BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);
-                }
-              }
-              else {
-                //console.debug("bitstuffer");
-                data.counter.bitstuffer++;
-                bitsPerPixel = numBits;
-                data.ptr += blockPtr;
-                if (bitsPerPixel > 0) {
-                  dataBytes = Math.ceil(numElements * bitsPerPixel / 8);
-                  dataWords = Math.ceil(dataBytes / 4);
-                  arrayBuf = new ArrayBuffer(dataWords * 4);
-                  store8 = new Uint8Array(arrayBuf);
-                  store8.set(new Uint8Array(input, data.ptr, dataBytes));
-                  stuffedData = new Uint32Array(arrayBuf);
-                  data.ptr += dataBytes;
-                  if (fileVersion >= 3) {
-                    if (offset === null) {
-                      BitStuffer.originalUnstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
-                    }
-                    else {
-                      BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
-                    }
-                  }
-                  else {
-                    if (offset === null) {
-                      BitStuffer.originalUnstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements);
-                    }
-                    else {
-                      BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);
-                    }
-                  }
-                }
-              }
-            }
-
-          },
-
-          readTiles: function(input, data, OutPixelTypeArray) {
-            var headerInfo = data.headerInfo;
-            var width = headerInfo.width;
-            var height = headerInfo.height;
-            var microBlockSize = headerInfo.microBlockSize;
-            var imageType = headerInfo.imageType;
-            var dataTypeSize = Lerc2Helpers.getDataTypeSize(imageType);
-            var numBlocksX = Math.ceil(width / microBlockSize);
-            var numBlocksY = Math.ceil(height / microBlockSize);
-            data.pixels.numBlocksY = numBlocksY;
-            data.pixels.numBlocksX = numBlocksX;
-            data.pixels.ptr = 0;
-            var row = 0, col = 0, blockY = 0, blockX = 0, thisBlockHeight = 0, thisBlockWidth = 0, bytesLeft = 0, headerByte = 0, bits67 = 0, testCode = 0, outPtr = 0, outStride = 0, numBytes = 0, bytesleft = 0, z = 0, blockPtr = 0;
-            var view, block, arrayBuf, store8, rawData;
-            var blockEncoding;
-            var blockDataBuffer = new OutPixelTypeArray(microBlockSize * microBlockSize);
-            var lastBlockHeight = (height % microBlockSize) || microBlockSize;
-            var lastBlockWidth = (width % microBlockSize) || microBlockSize;
-            var offsetType, offset;
-            var numDims = headerInfo.numDims, iDim;
-            var mask = data.pixels.resultMask;
-            var resultPixels = data.pixels.resultPixels;
-            for (blockY = 0; blockY < numBlocksY; blockY++) {
-              thisBlockHeight = (blockY !== numBlocksY - 1) ? microBlockSize : lastBlockHeight;
-              for (blockX = 0; blockX < numBlocksX; blockX++) {
-                //console.debug("y" + blockY + " x" + blockX);
-                thisBlockWidth = (blockX !== numBlocksX - 1) ? microBlockSize : lastBlockWidth;
-
-                outPtr = blockY * width * microBlockSize + blockX * microBlockSize;
-                outStride = width - thisBlockWidth;
-
-
-                for (iDim = 0; iDim < numDims; iDim++) {
-                  if (numDims > 1) {
-                    resultPixels = new OutPixelTypeArray(data.pixels.resultPixels.buffer, width * height * iDim * dataTypeSize, width * height);
-                  }
-                  bytesLeft = input.byteLength - data.ptr;
-                  view = new DataView(input, data.ptr, Math.min(10, bytesLeft));
-                  block = {};
-                  blockPtr = 0;
-                  headerByte = view.getUint8(0);
-                  blockPtr++;
-                  bits67 = (headerByte >> 6) & 0xFF;
-                  testCode = (headerByte >> 2) & 15;    // use bits 2345 for integrity check
-                  if (testCode !== (((blockX * microBlockSize) >> 3) & 15)) {
-                    throw "integrity issue";
-                    //return false;
-                  }
-
-                  blockEncoding = headerByte & 3;
-                  if (blockEncoding > 3) {
-                    data.ptr += blockPtr;
-                    throw "Invalid block encoding (" + blockEncoding + ")";
-                  }
-                  else if (blockEncoding === 2) { //constant 0
-                    data.counter.constant++;
-                    data.ptr += blockPtr;
-                    continue;
-                  }
-                  else if (blockEncoding === 0) {  //uncompressed
-                    data.counter.uncompressed++;
-                    data.ptr += blockPtr;
-                    numBytes = thisBlockHeight * thisBlockWidth * dataTypeSize;
-                    bytesleft = input.byteLength - data.ptr;
-                    numBytes = numBytes < bytesleft ? numBytes : bytesleft;
-                    //bit alignment
-                    arrayBuf = new ArrayBuffer((numBytes % dataTypeSize) === 0 ? numBytes : (numBytes + dataTypeSize - numBytes % dataTypeSize));
-                    store8 = new Uint8Array(arrayBuf);
-                    store8.set(new Uint8Array(input, data.ptr, numBytes));
-                    rawData = new OutPixelTypeArray(arrayBuf);
-                    z = 0;
-                    if (mask) {
-                      for (row = 0; row < thisBlockHeight; row++) {
-                        for (col = 0; col < thisBlockWidth; col++) {
-                          if (mask[outPtr]) {
-                            resultPixels[outPtr] = rawData[z++];
-                          }
-                          outPtr++;
-                        }
-                        outPtr += outStride;
-                      }
-                    }
-                    else {//all valid
-                      for (row = 0; row < thisBlockHeight; row++) {
-                        for (col = 0; col < thisBlockWidth; col++) {
-                          resultPixels[outPtr++] = rawData[z++];
-                        }
-                        outPtr += outStride;
-                      }
-                    }
-                    data.ptr += z * dataTypeSize;
-                  }
-                  else { //1 or 3
-                    offsetType = Lerc2Helpers.getDataTypeUsed(imageType, bits67);
-                    offset = Lerc2Helpers.getOnePixel(block, blockPtr, offsetType, view);
-                    blockPtr += Lerc2Helpers.getDataTypeSize(offsetType);
-                    if (blockEncoding === 3) //constant offset value
-                    {
-                      data.ptr += blockPtr;
-                      data.counter.constantoffset++;
-                      //you can delete the following resultMask case in favor of performance because val is constant and users use nodata mask, otherwise nodatavalue post processing handles it too.
-                      //while the above statement is true, we're not doing it as we want to keep invalid pixel value at 0 rather than arbitrary values
-                      if (mask) {
-                        for (row = 0; row < thisBlockHeight; row++) {
-                          for (col = 0; col < thisBlockWidth; col++) {
-                            if (mask[outPtr]) {
-                              resultPixels[outPtr] = offset;
-                            }
-                            outPtr++;
-                          }
-                          outPtr += outStride;
-                        }
-                      }
-                      else {
-                        for (row = 0; row < thisBlockHeight; row++) {
-                          for (col = 0; col < thisBlockWidth; col++) {
-                            resultPixels[outPtr++] = offset;
-                          }
-                          outPtr += outStride;
-                        }
-                      }
-                    }
-                    else { //bitstuff encoding is 3
-                      data.ptr += blockPtr;
-                      //heavy lifting
-                      Lerc2Helpers.decodeBits(input, data, blockDataBuffer, offset, iDim);
-                      blockPtr = 0;
-                      if (mask) {
-                        for (row = 0; row < thisBlockHeight; row++) {
-                          for (col = 0; col < thisBlockWidth; col++) {
-                            if (mask[outPtr]) {
-                              resultPixels[outPtr] = blockDataBuffer[blockPtr++];
-                            }
-                            outPtr++;
-                          }
-                          outPtr += outStride;
-                        }
-                      }
-                      else {
-                        for (row = 0; row < thisBlockHeight; row++) {
-                          for (col = 0; col < thisBlockWidth; col++) {
-                            resultPixels[outPtr++] = blockDataBuffer[blockPtr++];
-                          }
-                          outPtr += outStride;
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          },
-
-          /*****************
-          *  private methods (helper methods)
-          *****************/
-
-          formatFileInfo: function(data) {
-            return {
-              "fileIdentifierString": data.headerInfo.fileIdentifierString,
-              "fileVersion": data.headerInfo.fileVersion,
-              "imageType": data.headerInfo.imageType,
-              "height": data.headerInfo.height,
-              "width": data.headerInfo.width,
-              "numValidPixel": data.headerInfo.numValidPixel,
-              "microBlockSize": data.headerInfo.microBlockSize,
-              "blobSize": data.headerInfo.blobSize,
-              "maxZError": data.headerInfo.maxZError,
-              "pixelType": Lerc2Helpers.getPixelType(data.headerInfo.imageType),
-              "eofOffset": data.eofOffset,
-              "mask": data.mask ? {
-                "numBytes": data.mask.numBytes
-              } : null,
-              "pixels": {
-                "numBlocksX": data.pixels.numBlocksX,
-                "numBlocksY": data.pixels.numBlocksY,
-                //"numBytes": data.pixels.numBytes,
-                "maxValue": data.headerInfo.zMax,
-                "minValue": data.headerInfo.zMin,
-                "noDataValue": data.noDataValue
-              }
-            };
-          },
-
-          constructConstantSurface: function(data) {
-            var val = data.headerInfo.zMax;
-            var numDims =  data.headerInfo.numDims;
-            var numPixels = data.headerInfo.height * data.headerInfo.width;
-            var numPixelAllDims = numPixels * numDims;
-            var i=0, k = 0, nStart=0;
-            var mask = data.pixels.resultMask;
-            if (mask) {
-              if (numDims > 1) {
-                for (i=0; i < numDims; i++) {
-                  nStart = i * numPixels;
-                  for (k = 0; k < numPixels; k++) {
-                    if (mask[k]) {
-                      data.pixels.resultPixels[nStart + k] = val;
-                    }
-                  }
-                }
-              }
-              else {
-                for (k = 0; k < numPixels; k++) {
-                  if (mask[k]) {
-                    data.pixels.resultPixels[k] = val;
-                  }
-                }
-              }
-            }
-            else {
-              if (data.pixels.resultPixels.fill) {
-                data.pixels.resultPixels.fill(val);
-              }
-              else {
-                for (k = 0; k < numPixelAllDims; k++) {
-                  data.pixels.resultPixels[k] = val;
-                }
-              }
-            }
-            return;
-          },
-
-          getDataTypeArray: function(t) {
-            var tp;
-            switch (t) {
-              case 0: //char
-                tp = Int8Array;
-                break;
-              case 1: //byte
-                tp = Uint8Array;
-                break;
-              case 2: //short
-                tp = Int16Array;
-                break;
-              case 3: //ushort
-                tp = Uint16Array;
-                break;
-              case 4:
-                tp = Int32Array;
-                break;
-              case 5:
-                tp = Uint32Array;
-                break;
-              case 6:
-                tp = Float32Array;
-                break;
-              case 7:
-                tp = Float64Array;
-                break;
-              default:
-                tp = Float32Array;
-            }
-            return tp;
-          },
-
-          getPixelType: function(t) {
-            var tp;
-            switch (t) {
-              case 0: //char
-                tp = "S8";
-                break;
-              case 1: //byte
-                tp = "U8";
-                break;
-              case 2: //short
-                tp = "S16";
-                break;
-              case 3: //ushort
-                tp = "U16";
-                break;
-              case 4:
-                tp = "S32";
-                break;
-              case 5:
-                tp = "U32";
-                break;
-              case 6:
-                tp = "F32";
-                break;
-              case 7:
-                tp = "F64"; //not supported
-                break;
-              default:
-                tp = "F32";
-            }
-            return tp;
-          },
-
-          isValidPixelValue: function(t, val) {
-            if (val === null) {
-              return false;
-            }
-            var isValid;
-            switch (t) {
-              case 0: //char
-                isValid = val >= -128 && val <= 127;
-                break;
-              case 1: //byte  (unsigned char)
-                isValid = val >= 0 && val <= 255;
-                break;
-              case 2: //short
-                isValid = val >= -32768 && val <= 32767;
-                break;
-              case 3: //ushort
-                isValid = val >= 0 && val <= 65536;
-                break;
-              case 4: //int 32
-                isValid = val >= -2147483648 && val <= 2147483647;
-                break;
-              case 5: //uinit 32
-                isValid = val >= 0 && val <= 4294967296;
-                break;
-              case 6:
-                isValid = val >= -3.4027999387901484e+38 && val <= 3.4027999387901484e+38;
-                break;
-              case 7:
-                isValid = val >= 5e-324 && val <= 1.7976931348623157e+308;
-                break;
-              default:
-                isValid = false;
-            }
-            return isValid;
-          },
-
-          getDataTypeSize: function(t) {
-            var s = 0;
-            switch (t) {
-              case 0: //ubyte
-              case 1: //byte
-                s = 1;
-                break;
-              case 2: //short
-              case 3: //ushort
-                s = 2;
-                break;
-              case 4:
-              case 5:
-              case 6:
-                s = 4;
-                break;
-              case 7:
-                s = 8;
-                break;
-              default:
-                s = t;
-            }
-            return s;
-          },
-
-          getDataTypeUsed: function(dt, tc) {
-            var t = dt;
-            switch (dt) {
-              case 2: //short
-              case 4: //long
-                t = dt - tc;
-                break;
-              case 3: //ushort
-              case 5: //ulong
-                t = dt - 2 * tc;
-                break;
-              case 6: //float
-                if (0 === tc) {
-                  t = dt;
-                }
-                else if (1 === tc) {
-                  t = 2;
-                }
-                else {
-                  t = 1;//byte
-                }
-                break;
-              case 7: //double
-                if (0 === tc) {
-                  t = dt;
-                }
-                else {
-                  t = dt - 2 * tc + 1;
-                }
-                break;
-              default:
-                t = dt;
-                break;
-            }
-            return t;
-          },
-
-          getOnePixel: function(block, blockPtr, offsetType, view) {
-            var temp = 0;
-            switch (offsetType) {
-              case 0: //char
-                temp = view.getInt8(blockPtr);
-                break;
-              case 1: //byte
-                temp = view.getUint8(blockPtr);
-                break;
-              case 2:
-                temp = view.getInt16(blockPtr, true);
-                break;
-              case 3:
-                temp = view.getUint16(blockPtr, true);
-                break;
-              case 4:
-                temp = view.getInt32(blockPtr, true);
-                break;
-              case 5:
-                temp = view.getUInt32(blockPtr, true);
-                break;
-              case 6:
-                temp = view.getFloat32(blockPtr, true);
-                break;
-              case 7:
-                //temp = view.getFloat64(blockPtr, true);
-                //blockPtr += 8;
-                //lerc2 encoding doesnt handle float 64, force to float32???
-                temp = view.getFloat64(blockPtr, true);
-                break;
-              default:
-                throw ("the decoder does not understand this pixel type");
-            }
-            return temp;
-          }
-        };
-
-        /***************************************************
-        *private class for a tree node. Huffman code is in Lerc2Helpers
-        ****************************************************/
-        var TreeNode = function(val, left, right) {
-          this.val = val;
-          this.left = left;
-          this.right = right;
-        };
-
-        var Lerc2Decode = {
-          /*
-          * ********removed options compared to LERC1. We can bring some of them back if needed.
-           * removed pixel type. LERC2 is typed and doesn't require user to give pixel type
-           * changed encodedMaskData to maskData. LERC2 's js version make it faster to use maskData directly.
-           * removed returnMask. mask is used by LERC2 internally and is cost free. In case of user input mask, it's returned as well and has neglible cost.
-           * removed nodatavalue. Because LERC2 pixels are typed, nodatavalue will sacrify a useful value for many types (8bit, 16bit) etc,
-           *       user has to be knowledgable enough about raster and their data to avoid usability issues. so nodata value is simply removed now.
-           *       We can add it back later if their's a clear requirement.
-           * removed encodedMask. This option was not implemented in LercDecode. It can be done after decoding (less efficient)
-           * removed computeUsedBitDepths.
-           *
-           *
-           * response changes compared to LERC1
-           * 1. encodedMaskData is not available
-           * 2. noDataValue is optional (returns only if user's noDataValue is with in the valid data type range)
-           * 3. maskData is always available
-          */
-          /*****************
-          *  public properties
-          ******************/
-          //HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, not configurable
-
-          /*****************
-          *  public methods
-          *****************/
-
-          /**
-           * Decode a LERC2 byte stream and return an object containing the pixel data and optional metadata.
-           *
-           * @param {ArrayBuffer} input The LERC input byte stream
-           * @param {object} [options] options Decoding options
-           * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid LERC file is expected at that position
-           * @param {boolean} [options.returnFileInfo] If true, the return value will have a fileInfo property that contains metadata obtained from the LERC headers and the decoding process
-           */
-          decode: function(/*byte array*/ input, /*object*/ options) {
-            //currently there's a bug in the sparse array, so please do not set to false
-            options = options || {};
-            var noDataValue = options.noDataValue;
-
-            //initialize
-            var i = 0, data = {};
-            data.ptr = options.inputOffset || 0;
-            data.pixels = {};
-
-            // File header
-            if (!Lerc2Helpers.readHeaderInfo(input, data)) {
-              return;
-            }
-            var headerInfo = data.headerInfo;
-            var fileVersion = headerInfo.fileVersion;
-            var OutPixelTypeArray = Lerc2Helpers.getDataTypeArray(headerInfo.imageType);
-
-            // Mask Header
-            Lerc2Helpers.readMask(input, data);
-            if (headerInfo.numValidPixel !== headerInfo.width * headerInfo.height && !data.pixels.resultMask) {
-              data.pixels.resultMask = options.maskData;
-            }
-
-            var numPixels = headerInfo.width * headerInfo.height;
-            data.pixels.resultPixels = new OutPixelTypeArray(numPixels * headerInfo.numDims);
-
-            data.counter = {
-              onesweep: 0,
-              uncompressed: 0,
-              lut: 0,
-              bitstuffer: 0,
-              constant: 0,
-              constantoffset: 0
-            };
-            if (headerInfo.numValidPixel !== 0) {
-              //not tested
-              if (headerInfo.zMax === headerInfo.zMin) //constant surface
-              {
-                Lerc2Helpers.constructConstantSurface(data);
-              }
-              else if (fileVersion >= 4 && Lerc2Helpers.checkMinMaxRanges(input, data)) {
-                Lerc2Helpers.constructConstantSurface(data);
-              }
-              else {
-                var view = new DataView(input, data.ptr, 2);
-                var bReadDataOneSweep = view.getUint8(0);
-                data.ptr++;
-                if (bReadDataOneSweep) {
-                  //console.debug("OneSweep");
-                  Lerc2Helpers.readDataOneSweep(input, data, OutPixelTypeArray);
-                }
-                else {
-                  //lerc2.1: //bitstuffing + lut
-                  //lerc2.2: //bitstuffing + lut + huffman
-                  //lerc2.3: new bitstuffer
-                  if (fileVersion > 1 && headerInfo.imageType <= 1 && Math.abs(headerInfo.maxZError - 0.5) < 0.00001) {
-                    //this is 2.x plus 8 bit (unsigned and signed) data, possiblity of Huffman
-                    var flagHuffman = view.getUint8(1);
-                    data.ptr++;
-                    data.encodeMode = flagHuffman;
-                    if (flagHuffman > 2 || (fileVersion < 4 && flagHuffman > 1)) {
-                      throw "Invalid Huffman flag " + flagHuffman;
-                    }
-                    if (flagHuffman) {//1 - delta Huffman, 2 - Huffman
-                      //console.log("Huffman");
-                      Lerc2Helpers.readHuffman(input, data, OutPixelTypeArray);
-                    }
-                    else {
-                      //console.log("Tiles");
-                      Lerc2Helpers.readTiles(input, data, OutPixelTypeArray);
-                    }
-                  }
-                  else { //lerc2.x non-8 bit data
-                    //console.log("Tiles");
-                    Lerc2Helpers.readTiles(input, data, OutPixelTypeArray);
-                  }
-                }
-              }
-            }
-
-            data.eofOffset = data.ptr;
-            var diff;
-            if (options.inputOffset) {
-              diff = data.headerInfo.blobSize + options.inputOffset - data.ptr;
-              if (Math.abs(diff) >= 1) {
-                //console.debug("incorrect eof: dataptr " + data.ptr + " offset " + options.inputOffset + " blobsize " + data.headerInfo.blobSize + " diff: " + diff);
-                data.eofOffset = options.inputOffset + data.headerInfo.blobSize;
-              }
-            }
-            else {
-              diff = data.headerInfo.blobSize - data.ptr;
-              if (Math.abs(diff) >= 1) {
-                //console.debug("incorrect first band eof: dataptr " + data.ptr + " blobsize " + data.headerInfo.blobSize + " diff: " + diff);
-                data.eofOffset = data.headerInfo.blobSize;
-              }
-            }
-
-            var result = {
-              width: headerInfo.width,
-              height: headerInfo.height,
-              pixelData: data.pixels.resultPixels,
-              minValue: headerInfo.zMin,
-              maxValue: headerInfo.zMax,
-              validPixelCount: headerInfo.numValidPixel,
-              dimCount: headerInfo.numDims,
-              dimStats: {
-                minValues: headerInfo.minValues,
-                maxValues: headerInfo.maxValues
-              },
-              maskData: data.pixels.resultMask
-              //noDataValue: noDataValue
-            };
-
-            //we should remove this if there's no existing client
-            //optional noDataValue processing, it's user's responsiblity
-            if (data.pixels.resultMask && Lerc2Helpers.isValidPixelValue(headerInfo.imageType, noDataValue)) {
-              var mask = data.pixels.resultMask;
-              for (i = 0; i < numPixels; i++) {
-                if (!mask[i]) {
-                  result.pixelData[i] = noDataValue;
-                }
-              }
-              result.noDataValue = noDataValue;
-            }
-            data.noDataValue = noDataValue;
-            if (options.returnFileInfo) {
-              result.fileInfo = Lerc2Helpers.formatFileInfo(data);
-            }
-            return result;
-          },
-
-          getBandCount: function(/*byte array*/ input) {
-            var count = 0;
-            var i = 0;
-            var temp = {};
-            temp.ptr = 0;
-            temp.pixels = {};
-            while (i < input.byteLength - 58) {
-              Lerc2Helpers.readHeaderInfo(input, temp);
-              i += temp.headerInfo.blobSize;
-              count++;
-              temp.ptr = i;
-            }
-            return count;
-          }
-        };
-
-        return Lerc2Decode;
-      })();
-
-      var isPlatformLittleEndian = (function() {
-        var a = new ArrayBuffer(4);
-        var b = new Uint8Array(a);
-        var c = new Uint32Array(a);
-        c[0] = 1;
-        return b[0] === 1;
-      })();
-
-      var Lerc = {
-        /************wrapper**********************************************/
-        /**
-         * A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types.
-         *
-         * @alias module:Lerc
-         * @param {ArrayBuffer} input The LERC input byte stream
-         * @param {object} [options] The decoding options below are optional.
-         * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position.
-         * @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32.
-         * @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value.
-         * @returns {{width, height, pixels, pixelType, mask, statistics}}
-           * @property {number} width Width of decoded image.
-           * @property {number} height Height of decoded image.
-           * @property {array} pixels [band1, band2, …] Each band is a typed array of width*height.
-           * @property {string} pixelType The type of pixels represented in the output.
-           * @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid.
-           * @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values
-        **/
-        decode: function(encodedData, options) {
-          if (!isPlatformLittleEndian) {
-            throw "Big endian system is not supported.";
-          }
-          options = options || {};
-          var inputOffset = options.inputOffset || 0;
-          var fileIdView = new Uint8Array(encodedData, inputOffset, 10);
-          var fileIdentifierString = String.fromCharCode.apply(null, fileIdView);
-          var lerc, majorVersion;
-          if (fileIdentifierString.trim() === "CntZImage") {
-            lerc = LercDecode;
-            majorVersion = 1;
-          }
-          else if (fileIdentifierString.substring(0, 5) === "Lerc2") {
-            lerc = Lerc2Decode;
-            majorVersion = 2;
-          }
-          else {
-            throw "Unexpected file identifier string: " + fileIdentifierString;
-          }
-
-          var iPlane = 0, eof = encodedData.byteLength - 10, encodedMaskData, bandMasks = [], bandMask, maskData;
-          var decodedPixelBlock = {
-            width: 0,
-            height: 0,
-            pixels: [],
-            pixelType: options.pixelType,
-            mask: null,
-            statistics: []
-          };
-
-          while (inputOffset < eof) {
-            var result = lerc.decode(encodedData, {
-              inputOffset: inputOffset,//for both lerc1 and lerc2
-              encodedMaskData: encodedMaskData,//lerc1 only
-              maskData: maskData,//lerc2 only
-              returnMask: iPlane === 0 ? true : false,//lerc1 only
-              returnEncodedMask: iPlane === 0 ? true : false,//lerc1 only
-              returnFileInfo: true,//for both lerc1 and lerc2
-              pixelType: options.pixelType || null,//lerc1 only
-              noDataValue: options.noDataValue || null//lerc1 only
-            });
-
-            inputOffset = result.fileInfo.eofOffset;
-            if (iPlane === 0) {
-              encodedMaskData = result.encodedMaskData;//lerc1
-              maskData = result.maskData;//lerc2
-              decodedPixelBlock.width = result.width;
-              decodedPixelBlock.height = result.height;
-              decodedPixelBlock.dimCount = result.dimCount || 1;
-              //decodedPixelBlock.dimStats = decodedPixelBlock.dimStats;
-              decodedPixelBlock.pixelType = result.pixelType || result.fileInfo.pixelType;
-              decodedPixelBlock.mask = result.maskData;
-            }
-            if (majorVersion >1 && result.fileInfo.mask && result.fileInfo.mask.numBytes > 0) {
-              bandMasks.push(result.maskData);
-            }
-
-            iPlane++;
-            decodedPixelBlock.pixels.push(result.pixelData);
-            decodedPixelBlock.statistics.push({
-              minValue: result.minValue,
-              maxValue: result.maxValue,
-              noDataValue: result.noDataValue,
-              dimStats: result.dimStats
-            });
-          }
-          var i, j, numPixels;
-          if (majorVersion > 1 && bandMasks.length > 1) {
-            numPixels = decodedPixelBlock.width * decodedPixelBlock.height;
-            decodedPixelBlock.bandMasks = bandMasks;
-            maskData = new Uint8Array(numPixels);
-            maskData.set(bandMasks[0]);
-            for (i = 1; i < bandMasks.length; i++) {
-              bandMask = bandMasks[i];
-              for (j = 0; j < numPixels; j++) {
-                maskData[j] = maskData[j] & bandMask[j];
-              }
-            }
-            decodedPixelBlock.maskData = maskData;
-          }
-
-          return decodedPixelBlock;
-        }
-      };
-
-      tmp.Lerc = Lerc;
-    })();
-
-    var Lerc = tmp.Lerc;
-
-    function createVerticesFromHeightmap(parameters, transferableObjects) {
-            // LERC encoded buffers must be decoded, then we can process them like normal
-            if (parameters.encoding === HeightmapEncoding$1.LERC) {
-                var result;
-                try {
-                    result = Lerc.decode(parameters.heightmap);
-                } catch (error) {
-                    throw new RuntimeError.RuntimeError(error);
-                }
-
-                var lercStatistics = result.statistics[0];
-                if (lercStatistics.minValue === Number.MAX_VALUE) {
-                    throw new RuntimeError.RuntimeError('Invalid tile data');
-                }
-
-                parameters.heightmap = result.pixels[0];
-                parameters.width = result.width;
-                parameters.height = result.height;
-            }
-
-            parameters.ellipsoid = Cartesian2.Ellipsoid.clone(parameters.ellipsoid);
-            parameters.rectangle = Cartesian2.Rectangle.clone(parameters.rectangle);
-
-            var statistics = HeightmapTessellator.computeVertices(parameters);
-            var vertices = statistics.vertices;
-            transferableObjects.push(vertices.buffer);
-
-            return {
-                vertices : vertices.buffer,
-                numberOfAttributes : statistics.encoding.getStride(),
-                minimumHeight : statistics.minimumHeight,
-                maximumHeight : statistics.maximumHeight,
-                gridWidth : parameters.width,
-                gridHeight : parameters.height,
-                boundingSphere3D : statistics.boundingSphere3D,
-                orientedBoundingBox : statistics.orientedBoundingBox,
-                occludeePointInScaledSpace : statistics.occludeePointInScaledSpace,
-                encoding : statistics.encoding,
-                westIndicesSouthToNorth : statistics.westIndicesSouthToNorth,
-                southIndicesEastToWest : statistics.southIndicesEastToWest,
-                eastIndicesNorthToSouth : statistics.eastIndicesNorthToSouth,
-                northIndicesWestToEast : statistics.northIndicesWestToEast
-            };
-        }
-    var createVerticesFromHeightmap$1 = createTaskProcessorWorker(createVerticesFromHeightmap);
-
-    return createVerticesFromHeightmap$1;
-
-});
diff --git a/public/libs/Cesium/Workers/createVerticesFromQuantizedTerrainMesh.js b/public/libs/Cesium/Workers/createVerticesFromQuantizedTerrainMesh.js
deleted file mode 100644
index 527dacc..0000000
--- a/public/libs/Cesium/Workers/createVerticesFromQuantizedTerrainMesh.js
+++ /dev/null
@@ -1,845 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './AttributeCompression-84a90a13', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './WebMercatorProjection-80c70558', './createTaskProcessorWorker', './EllipsoidTangentPlane-e324bfa4', './OrientedBoundingBox-0ede1598', './TerrainEncoding-a807a704'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, FeatureDetection, Transforms, buildModuleUrl, AttributeCompression, IndexDatatype, IntersectionTests, Plane, WebMercatorProjection, createTaskProcessorWorker, EllipsoidTangentPlane, OrientedBoundingBox, TerrainEncoding) { 'use strict';
-
-    /**
-         * Provides terrain or other geometry for the surface of an ellipsoid.  The surface geometry is
-         * organized into a pyramid of tiles according to a {@link TilingScheme}.  This type describes an
-         * interface and is not intended to be instantiated directly.
-         *
-         * @alias TerrainProvider
-         * @constructor
-         *
-         * @see EllipsoidTerrainProvider
-         * @see CesiumTerrainProvider
-         * @see VRTheWorldTerrainProvider
-         * @see GoogleEarthEnterpriseTerrainProvider
-         */
-        function TerrainProvider() {
-            Check.DeveloperError.throwInstantiationError();
-        }
-
-        Object.defineProperties(TerrainProvider.prototype, {
-            /**
-             * Gets an event that is raised when the terrain provider encounters an asynchronous error..  By subscribing
-             * to the event, you will be notified of the error and can potentially recover from it.  Event listeners
-             * are passed an instance of {@link TileProviderError}.
-             * @memberof TerrainProvider.prototype
-             * @type {Event}
-             */
-            errorEvent : {
-                get : Check.DeveloperError.throwInstantiationError
-            },
-
-            /**
-             * Gets the credit to display when this terrain provider is active.  Typically this is used to credit
-             * the source of the terrain. This function should
-             * not be called before {@link TerrainProvider#ready} returns true.
-             * @memberof TerrainProvider.prototype
-             * @type {Credit}
-             */
-            credit : {
-                get : Check.DeveloperError.throwInstantiationError
-            },
-
-            /**
-             * Gets the tiling scheme used by the provider.  This function should
-             * not be called before {@link TerrainProvider#ready} returns true.
-             * @memberof TerrainProvider.prototype
-             * @type {TilingScheme}
-             */
-            tilingScheme : {
-                get : Check.DeveloperError.throwInstantiationError
-            },
-
-            /**
-             * Gets a value indicating whether or not the provider is ready for use.
-             * @memberof TerrainProvider.prototype
-             * @type {Boolean}
-             */
-            ready : {
-                get : Check.DeveloperError.throwInstantiationError
-            },
-
-            /**
-             * Gets a promise that resolves to true when the provider is ready for use.
-             * @memberof TerrainProvider.prototype
-             * @type {Promise.<Boolean>}
-             * @readonly
-             */
-            readyPromise : {
-                get : Check.DeveloperError.throwInstantiationError
-            },
-
-            /**
-             * Gets a value indicating whether or not the provider includes a water mask.  The water mask
-             * indicates which areas of the globe are water rather than land, so they can be rendered
-             * as a reflective surface with animated waves.  This function should not be
-             * called before {@link TerrainProvider#ready} returns true.
-             * @memberof TerrainProvider.prototype
-             * @type {Boolean}
-             */
-            hasWaterMask : {
-                get : Check.DeveloperError.throwInstantiationError
-            },
-
-            /**
-             * Gets a value indicating whether or not the requested tiles include vertex normals.
-             * This function should not be called before {@link TerrainProvider#ready} returns true.
-             * @memberof TerrainProvider.prototype
-             * @type {Boolean}
-             */
-            hasVertexNormals : {
-                get : Check.DeveloperError.throwInstantiationError
-            },
-
-            /**
-             * Gets an object that can be used to determine availability of terrain from this provider, such as
-             * at points and in rectangles.  This function should not be called before
-             * {@link TerrainProvider#ready} returns true.  This property may be undefined if availability
-             * information is not available.
-             * @memberof TerrainProvider.prototype
-             * @type {TileAvailability}
-             */
-            availability : {
-                get : Check.DeveloperError.throwInstantiationError
-            }
-        });
-
-        var regularGridIndicesCache = [];
-
-        /**
-         * Gets a list of indices for a triangle mesh representing a regular grid.  Calling
-         * this function multiple times with the same grid width and height returns the
-         * same list of indices.  The total number of vertices must be less than or equal
-         * to 65536.
-         *
-         * @param {Number} width The number of vertices in the regular grid in the horizontal direction.
-         * @param {Number} height The number of vertices in the regular grid in the vertical direction.
-         * @returns {Uint16Array|Uint32Array} The list of indices. Uint16Array gets returned for 64KB or less and Uint32Array for 4GB or less.
-         */
-        TerrainProvider.getRegularGridIndices = function(width, height) {
-            //>>includeStart('debug', pragmas.debug);
-            if (width * height >= _Math.CesiumMath.FOUR_GIGABYTES) {
-                throw new Check.DeveloperError('The total number of vertices (width * height) must be less than 4,294,967,296.');
-            }
-            //>>includeEnd('debug');
-
-            var byWidth = regularGridIndicesCache[width];
-            if (!when.defined(byWidth)) {
-                regularGridIndicesCache[width] = byWidth = [];
-            }
-
-            var indices = byWidth[height];
-            if (!when.defined(indices)) {
-                if (width * height < _Math.CesiumMath.SIXTY_FOUR_KILOBYTES) {
-                    indices = byWidth[height] = new Uint16Array((width - 1) * (height - 1) * 6 + 3*(width + height - 2));
-                } else {
-                    indices = byWidth[height] = new Uint32Array((width - 1) * (height - 1) * 6 + 3*(width + height - 2));
-                }
-                addRegularGridIndices(width, height, indices, 0);
-            }
-
-            return indices;
-        };
-
-        TerrainProvider.getRegularGridIndicesForReproject = function(width, height) {
-            //>>includeStart('debug', pragmas.debug);
-            if (width * height >= _Math.CesiumMath.FOUR_GIGABYTES) {
-                throw new Check.DeveloperError('The total number of vertices (width * height) must be less than 4,294,967,296.');
-            }
-            //>>includeEnd('debug');
-
-            var byWidth = regularGridIndicesCache[width];
-            if (!when.defined(byWidth)) {
-                regularGridIndicesCache[width] = byWidth = [];
-            }
-
-            var indices = byWidth[height];
-            if (!when.defined(indices)) {
-                if (width * height < _Math.CesiumMath.SIXTY_FOUR_KILOBYTES) {
-                    indices = byWidth[height] = new Uint16Array((width - 1) * (height - 1) * 6);
-                } else {
-                    indices = byWidth[height] = new Uint32Array((width - 1) * (height - 1) * 6);
-                }
-                addRegularGridIndices(width, height, indices, 0);
-            }
-
-            return indices;
-        };
-
-        var regularGridAndEdgeIndicesCache = [];
-
-        /**
-         * @private
-         */
-        TerrainProvider.getRegularGridIndicesAndEdgeIndices = function(width, height) {
-            //>>includeStart('debug', pragmas.debug);
-            if (width * height >= _Math.CesiumMath.FOUR_GIGABYTES) {
-                throw new Check.DeveloperError('The total number of vertices (width * height) must be less than 4,294,967,296.');
-            }
-            //>>includeEnd('debug');
-
-            var byWidth = regularGridAndEdgeIndicesCache[width];
-            if (!when.defined(byWidth)) {
-                regularGridAndEdgeIndicesCache[width] = byWidth = [];
-            }
-
-            var indicesAndEdges = byWidth[height];
-            if (!when.defined(indicesAndEdges)) {
-                var indices = TerrainProvider.getRegularGridIndices(width, height);
-
-                var edgeIndices = getEdgeIndices(width, height);
-                var westIndicesSouthToNorth = edgeIndices.westIndicesSouthToNorth;
-                var southIndicesEastToWest = edgeIndices.southIndicesEastToWest;
-                var eastIndicesNorthToSouth = edgeIndices.eastIndicesNorthToSouth;
-                var northIndicesWestToEast = edgeIndices.northIndicesWestToEast;
-
-                indicesAndEdges = byWidth[height] = {
-                    indices : indices,
-                    westIndicesSouthToNorth : westIndicesSouthToNorth,
-                    southIndicesEastToWest : southIndicesEastToWest,
-                    eastIndicesNorthToSouth : eastIndicesNorthToSouth,
-                    northIndicesWestToEast : northIndicesWestToEast
-                };
-            }
-
-            return indicesAndEdges;
-        };
-
-        var regularGridAndSkirtAndEdgeIndicesCache = [];
-
-        /**
-         * @private
-         */
-        TerrainProvider.getRegularGridAndSkirtIndicesAndEdgeIndices = function(width, height) {
-            //>>includeStart('debug', pragmas.debug);
-            if (width * height >= _Math.CesiumMath.FOUR_GIGABYTES) {
-                throw new Check.DeveloperError('The total number of vertices (width * height) must be less than 4,294,967,296.');
-            }
-            //>>includeEnd('debug');
-
-            var byWidth = regularGridAndSkirtAndEdgeIndicesCache[width];
-            if (!when.defined(byWidth)) {
-                regularGridAndSkirtAndEdgeIndicesCache[width] = byWidth = [];
-            }
-
-            var indicesAndEdges = byWidth[height];
-            if (!when.defined(indicesAndEdges)) {
-                var gridVertexCount = width * height;
-                var gridIndexCount = (width - 1) * (height - 1) * 6;
-                var edgeVertexCount = width * 2 + height * 2;
-                var edgeIndexCount = Math.max(0, edgeVertexCount - 4) * 6;
-                var vertexCount = gridVertexCount + edgeVertexCount;
-
-                var boundaryIndexCount = 3*(width + height - 2);
-
-                var indexCount = gridIndexCount + edgeIndexCount + boundaryIndexCount;
-
-                var edgeIndices = getEdgeIndices(width, height);
-                var westIndicesSouthToNorth = edgeIndices.westIndicesSouthToNorth;
-                var southIndicesEastToWest = edgeIndices.southIndicesEastToWest;
-                var eastIndicesNorthToSouth = edgeIndices.eastIndicesNorthToSouth;
-                var northIndicesWestToEast = edgeIndices.northIndicesWestToEast;
-
-                var indices = IndexDatatype.IndexDatatype.createTypedArray(vertexCount, indexCount);
-                addRegularGridIndices(width, height, indices, 0);
-                TerrainProvider.addSkirtIndices(westIndicesSouthToNorth, southIndicesEastToWest, eastIndicesNorthToSouth, northIndicesWestToEast, gridVertexCount, indices, gridIndexCount + boundaryIndexCount);
-
-                indicesAndEdges = byWidth[height] = {
-                    indices : indices,
-                    westIndicesSouthToNorth : westIndicesSouthToNorth,
-                    southIndicesEastToWest : southIndicesEastToWest,
-                    eastIndicesNorthToSouth : eastIndicesNorthToSouth,
-                    northIndicesWestToEast : northIndicesWestToEast,
-                    indexCountWithoutSkirts : gridIndexCount
-                };
-            }
-
-            return indicesAndEdges;
-        };
-
-        /**
-         * @private
-         */
-        TerrainProvider.addSkirtIndices = function(westIndicesSouthToNorth, southIndicesEastToWest, eastIndicesNorthToSouth, northIndicesWestToEast, vertexCount, indices, offset, edgeMap) {
-            var vertexIndex = vertexCount;
-            offset = addSkirtIndices(westIndicesSouthToNorth, vertexIndex, indices, offset, edgeMap);
-            vertexIndex += westIndicesSouthToNorth.length;
-            offset = addSkirtIndices(southIndicesEastToWest, vertexIndex, indices, offset, edgeMap);
-            vertexIndex += southIndicesEastToWest.length;
-            offset = addSkirtIndices(eastIndicesNorthToSouth, vertexIndex, indices, offset, edgeMap);
-            vertexIndex += eastIndicesNorthToSouth.length;
-            addSkirtIndices(northIndicesWestToEast, vertexIndex, indices, offset, edgeMap);
-        };
-
-        function getEdgeIndices(width, height) {
-            var westIndicesSouthToNorth = new Array(height);
-            var southIndicesEastToWest = new Array(width);
-            var eastIndicesNorthToSouth = new Array(height);
-            var northIndicesWestToEast = new Array(width);
-
-            var i;
-            for (i = 0; i < width; ++i) {
-                northIndicesWestToEast[i] = i;
-                southIndicesEastToWest[i] = width * height - 1 - i;
-            }
-
-            for (i = 0; i < height; ++i) {
-                eastIndicesNorthToSouth[i] = (i + 1) * width - 1;
-                westIndicesSouthToNorth[i] = (height - i - 1) * width;
-            }
-
-            return {
-                westIndicesSouthToNorth : westIndicesSouthToNorth,
-                southIndicesEastToWest : southIndicesEastToWest,
-                eastIndicesNorthToSouth : eastIndicesNorthToSouth,
-                northIndicesWestToEast : northIndicesWestToEast
-            };
-        }
-
-        function addRegularGridIndices(width, height, indices, offset) {
-            var index = 0;
-            for (var j = 0; j < height - 1; ++j) {
-                for (var i = 0; i < width - 1; ++i) {
-                    var upperLeft = index;
-                    var lowerLeft = upperLeft + width;
-                    var lowerRight = lowerLeft + 1;
-                    var upperRight = upperLeft + 1;
-
-                    indices[offset++] = upperLeft;
-                    indices[offset++] = lowerLeft;
-                    indices[offset++] = upperRight;
-                    indices[offset++] = upperRight;
-                    indices[offset++] = lowerLeft;
-                    indices[offset++] = lowerRight;
-
-                    ++index;
-                }
-                ++index;
-            }
-            var boundaryHeight = (height - 1)/2;
-            var boundaryWidth = (width - 1)/2;
-
-            index = 0;
-            for(var i=0; i<boundaryWidth; i++)
-            {
-                indices[offset++] = index;
-                indices[offset++] = index + 1;
-                indices[offset++] = index + 2;
-                index+=2;
-            }
-
-            index = width * (height - 1);
-            for(var i=0; i<boundaryWidth; i++)
-            {
-                indices[offset++] = index + 1;
-                indices[offset++] = index;
-                indices[offset++] = index + 2;
-                index+=2;
-            }
-
-            index = 0;
-            for(var i=0; i<boundaryHeight; i++)
-            {
-                indices[offset++] = index + width;
-                indices[offset++] = index;
-                indices[offset++] = index + 2*width;
-                index+=2*width;
-            }
-
-            index = width - 1;
-            for(var i=0; i<boundaryHeight; i++)
-            {
-                indices[offset++] = index;
-                indices[offset++] = index + width;
-                indices[offset++] = index + 2*width;
-                index+=2*width;
-            }
-        }
-
-        function addSkirtIndices(edgeIndices, vertexIndex, indices, offset, edgeMap) {
-            var hasEdgeMap = when.defined(edgeMap);
-            var previousIndex = edgeIndices[0];
-
-            var length = edgeIndices.length;
-            for (var i = 1; i < length; ++i) {
-                var index = edgeIndices[i];
-
-                if(hasEdgeMap && !edgeMap[previousIndex + '_' + index]){
-                    previousIndex = index;
-                    ++vertexIndex;
-                    continue ;
-                }
-
-                indices[offset++] = previousIndex;
-                indices[offset++] = index;
-                indices[offset++] = vertexIndex;
-
-                indices[offset++] = vertexIndex;
-                indices[offset++] = index;
-                indices[offset++] = vertexIndex + 1;
-
-                previousIndex = index;
-                ++vertexIndex;
-            }
-
-            return offset;
-        }
-
-        /**
-         * Specifies the quality of terrain created from heightmaps.  A value of 1.0 will
-         * ensure that adjacent heightmap vertices are separated by no more than
-         * {@link Globe.maximumScreenSpaceError} screen pixels and will probably go very slowly.
-         * A value of 0.5 will cut the estimated level zero geometric error in half, allowing twice the
-         * screen pixels between adjacent heightmap vertices and thus rendering more quickly.
-         * @type {Number}
-         */
-        TerrainProvider.heightmapTerrainQuality = 0.25;
-
-        /**
-         * Determines an appropriate geometric error estimate when the geometry comes from a heightmap.
-         *
-         * @param {Ellipsoid} ellipsoid The ellipsoid to which the terrain is attached.
-         * @param {Number} tileImageWidth The width, in pixels, of the heightmap associated with a single tile.
-         * @param {Number} numberOfTilesAtLevelZero The number of tiles in the horizontal direction at tile level zero.
-         * @returns {Number} An estimated geometric error.
-         */
-        TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap = function(ellipsoid, tileImageWidth, numberOfTilesAtLevelZero) {
-            return ellipsoid.maximumRadius * 2 * Math.PI * TerrainProvider.heightmapTerrainQuality / (tileImageWidth * numberOfTilesAtLevelZero);
-        };
-
-        /**
-         * Requests the geometry for a given tile.  This function should not be called before
-         * {@link TerrainProvider#ready} returns true.  The result must include terrain data and
-         * may optionally include a water mask and an indication of which child tiles are available.
-         * @function
-         *
-         * @param {Number} x The X coordinate of the tile for which to request geometry.
-         * @param {Number} y The Y coordinate of the tile for which to request geometry.
-         * @param {Number} level The level of the tile for which to request geometry.
-         * @param {Request} [request] The request object. Intended for internal use only.
-         *
-         * @returns {Promise.<TerrainData>|undefined} A promise for the requested geometry.  If this method
-         *          returns undefined instead of a promise, it is an indication that too many requests are already
-         *          pending and the request will be retried later.
-         */
-        TerrainProvider.prototype.requestTileGeometry = Check.DeveloperError.throwInstantiationError;
-
-        /**
-         * Gets the maximum geometric error allowed in a tile at a given level.  This function should not be
-         * called before {@link TerrainProvider#ready} returns true.
-         * @function
-         *
-         * @param {Number} level The tile level for which to get the maximum geometric error.
-         * @returns {Number} The maximum geometric error.
-         */
-        TerrainProvider.prototype.getLevelMaximumGeometricError = Check.DeveloperError.throwInstantiationError;
-
-        /**
-         * Determines whether data for a tile is available to be loaded.
-         * @function
-         *
-         * @param {Number} x The X coordinate of the tile for which to request geometry.
-         * @param {Number} y The Y coordinate of the tile for which to request geometry.
-         * @param {Number} level The level of the tile for which to request geometry.
-         * @returns {Boolean} Undefined if not supported by the terrain provider, otherwise true or false.
-         */
-        TerrainProvider.prototype.getTileDataAvailable = Check.DeveloperError.throwInstantiationError;
-
-        /**
-         * Makes sure we load availability data for a tile
-         * @function
-         *
-         * @param {Number} x The X coordinate of the tile for which to request geometry.
-         * @param {Number} y The Y coordinate of the tile for which to request geometry.
-         * @param {Number} level The level of the tile for which to request geometry.
-         * @returns {undefined|Promise} Undefined if nothing need to be loaded or a Promise that resolves when all required tiles are loaded
-         */
-        TerrainProvider.prototype.loadTileDataAvailability = Check.DeveloperError.throwInstantiationError;
-
-    var maxShort = 32767;
-
-    var cartesian3Scratch = new Cartographic.Cartesian3();
-    var scratchMinimum = new Cartographic.Cartesian3();
-    var scratchMaximum = new Cartographic.Cartesian3();
-    var cartographicScratch = new Cartographic.Cartographic();
-    var toPack = new Cartesian2.Cartesian2();
-    var scratchNormal = new Cartographic.Cartesian3();
-    var scratchToENU = new BoundingSphere.Matrix4();
-    var scratchFromENU = new BoundingSphere.Matrix4();
-
-    function createVerticesFromQuantizedTerrainMesh(parameters, transferableObjects) {
-        var quantizedVertices = parameters.quantizedVertices;
-        var quantizedVertexCount = quantizedVertices.length / 3;
-        var octEncodedNormals = parameters.octEncodedNormals;
-        var edgeVertexCount = parameters.westIndices.length + parameters.eastIndices.length +
-            parameters.southIndices.length + parameters.northIndices.length;
-        var includeWebMercatorT = parameters.includeWebMercatorT;
-
-        var rectangle = Cartesian2.Rectangle.clone(parameters.rectangle);
-        var west = rectangle.west;
-        var south = rectangle.south;
-        var east = rectangle.east;
-        var north = rectangle.north;
-
-        var ellipsoid = Cartesian2.Ellipsoid.clone(parameters.ellipsoid);
-
-        var exaggeration = parameters.exaggeration;
-        var minimumHeight = parameters.minimumHeight * exaggeration;
-        var maximumHeight = parameters.maximumHeight * exaggeration;
-
-        var center = parameters.relativeToCenter;
-        var fromENU = Transforms.Transforms.eastNorthUpToFixedFrame(center, ellipsoid);
-        var toENU = BoundingSphere.Matrix4.inverseTransformation(fromENU, new BoundingSphere.Matrix4());
-
-        var southMercatorY;
-        var oneOverMercatorHeight;
-        if (includeWebMercatorT) {
-            southMercatorY = WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(south);
-            oneOverMercatorHeight = 1.0 / (WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(north) - southMercatorY);
-        }
-
-        var uBuffer = quantizedVertices.subarray(0, quantizedVertexCount);
-        var vBuffer = quantizedVertices.subarray(quantizedVertexCount, 2 * quantizedVertexCount);
-        var heightBuffer = quantizedVertices.subarray(quantizedVertexCount * 2, 3 * quantizedVertexCount);
-        var hasVertexNormals = when.defined(octEncodedNormals);
-
-        var uvs = new Array(quantizedVertexCount);
-        var heights = new Array(quantizedVertexCount);
-        var positions = new Array(quantizedVertexCount);
-        var webMercatorTs = includeWebMercatorT ? new Array(quantizedVertexCount) : [];
-
-        var minimum = scratchMinimum;
-        minimum.x = Number.POSITIVE_INFINITY;
-        minimum.y = Number.POSITIVE_INFINITY;
-        minimum.z = Number.POSITIVE_INFINITY;
-
-        var maximum = scratchMaximum;
-        maximum.x = Number.NEGATIVE_INFINITY;
-        maximum.y = Number.NEGATIVE_INFINITY;
-        maximum.z = Number.NEGATIVE_INFINITY;
-
-        var minLongitude = Number.POSITIVE_INFINITY;
-        var maxLongitude = Number.NEGATIVE_INFINITY;
-        var minLatitude = Number.POSITIVE_INFINITY;
-        var maxLatitude = Number.NEGATIVE_INFINITY;
-
-        for (var i = 0; i < quantizedVertexCount; ++i) {
-            var rawU = uBuffer[i];
-            var rawV = vBuffer[i];
-
-            var u = rawU / maxShort;
-            var v = rawV / maxShort;
-            var height = _Math.CesiumMath.lerp(minimumHeight, maximumHeight, heightBuffer[i] / maxShort);
-
-            cartographicScratch.longitude = _Math.CesiumMath.lerp(west, east, u);
-            cartographicScratch.latitude = _Math.CesiumMath.lerp(south, north, v);
-            cartographicScratch.height = height;
-
-            minLongitude = Math.min(cartographicScratch.longitude, minLongitude);
-            maxLongitude = Math.max(cartographicScratch.longitude, maxLongitude);
-            minLatitude = Math.min(cartographicScratch.latitude, minLatitude);
-            maxLatitude = Math.max(cartographicScratch.latitude, maxLatitude);
-
-            var position = ellipsoid.cartographicToCartesian(cartographicScratch);
-
-            uvs[i] = new Cartesian2.Cartesian2(u, v);
-            heights[i] = height;
-            positions[i] = position;
-
-            if (includeWebMercatorT) {
-                webMercatorTs[i] = (WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(cartographicScratch.latitude) - southMercatorY) * oneOverMercatorHeight;
-            }
-
-            BoundingSphere.Matrix4.multiplyByPoint(toENU, position, cartesian3Scratch);
-
-            Cartographic.Cartesian3.minimumByComponent(cartesian3Scratch, minimum, minimum);
-            Cartographic.Cartesian3.maximumByComponent(cartesian3Scratch, maximum, maximum);
-        }
-
-        var westIndicesSouthToNorth = copyAndSort(parameters.westIndices, function(a, b) {
-            return uvs[a].y - uvs[b].y;
-        });
-        var eastIndicesNorthToSouth = copyAndSort(parameters.eastIndices, function(a, b) {
-            return uvs[b].y - uvs[a].y;
-        });
-        var southIndicesEastToWest = copyAndSort(parameters.southIndices, function(a, b) {
-            return uvs[b].x - uvs[a].x;
-        });
-        var northIndicesWestToEast = copyAndSort(parameters.northIndices, function(a, b) {
-            return uvs[a].x - uvs[b].x;
-        });
-
-        var orientedBoundingBox;
-        var boundingSphere;
-
-        // Bounding volumes need to be recomputed since the tile payload assumes no exaggeration.
-        boundingSphere = BoundingSphere.BoundingSphere.fromPoints(positions);
-        orientedBoundingBox = OrientedBoundingBox.OrientedBoundingBox.fromRectangle(rectangle, minimumHeight, maximumHeight, ellipsoid);
-
-        var occludeePointInScaledSpace;
-        if (exaggeration !== 1.0 || minimumHeight < 0.0) {
-            // Horizon culling point needs to be recomputed since the tile payload assumes no exaggeration.
-            var occluder = new TerrainEncoding.EllipsoidalOccluder(ellipsoid);
-            occludeePointInScaledSpace = occluder.computeHorizonCullingPointPossiblyUnderEllipsoid(center, positions, minimumHeight);
-        }
-
-        var hMin = minimumHeight;
-        hMin = Math.min(hMin, findMinMaxSkirts(parameters.westIndices, parameters.westSkirtHeight, heights, uvs, rectangle, ellipsoid, toENU, minimum, maximum));
-        hMin = Math.min(hMin, findMinMaxSkirts(parameters.southIndices, parameters.southSkirtHeight, heights, uvs, rectangle, ellipsoid, toENU, minimum, maximum));
-        hMin = Math.min(hMin, findMinMaxSkirts(parameters.eastIndices, parameters.eastSkirtHeight, heights, uvs, rectangle, ellipsoid, toENU, minimum, maximum));
-        hMin = Math.min(hMin, findMinMaxSkirts(parameters.northIndices, parameters.northSkirtHeight, heights, uvs, rectangle, ellipsoid, toENU, minimum, maximum));
-
-        var aaBox = new EllipsoidTangentPlane.AxisAlignedBoundingBox(minimum, maximum, center);
-        var encoding = new TerrainEncoding.TerrainEncoding(aaBox, hMin, maximumHeight, fromENU, hasVertexNormals, includeWebMercatorT);
-        var vertexStride = encoding.getStride();
-        var size = quantizedVertexCount * vertexStride + edgeVertexCount * vertexStride;
-        var vertexBuffer = new Float32Array(size);
-
-        var bufferIndex = 0;
-        for (var j = 0; j < quantizedVertexCount; ++j) {
-            if (hasVertexNormals) {
-                var n = j * 2.0;
-                toPack.x = octEncodedNormals[n];
-                toPack.y = octEncodedNormals[n + 1];
-
-                if (exaggeration !== 1.0) {
-                    var normal = AttributeCompression.AttributeCompression.octDecode(toPack.x, toPack.y, scratchNormal);
-                    var fromENUNormal = Transforms.Transforms.eastNorthUpToFixedFrame(positions[j], ellipsoid, scratchFromENU);
-                    var toENUNormal = BoundingSphere.Matrix4.inverseTransformation(fromENUNormal, scratchToENU);
-
-                    BoundingSphere.Matrix4.multiplyByPointAsVector(toENUNormal, normal, normal);
-                    normal.z *= exaggeration;
-                    Cartographic.Cartesian3.normalize(normal, normal);
-
-                    BoundingSphere.Matrix4.multiplyByPointAsVector(fromENUNormal, normal, normal);
-                    Cartographic.Cartesian3.normalize(normal, normal);
-
-                    AttributeCompression.AttributeCompression.octEncode(normal, toPack);
-                }
-            }
-
-            bufferIndex = encoding.encode(vertexBuffer, bufferIndex, positions[j], uvs[j], heights[j], toPack, webMercatorTs[j]);
-        }
-
-        var edgeTriangleCount = Math.max(0, (edgeVertexCount - 4) * 2);
-        var indexBufferLength = parameters.indices.length + edgeTriangleCount * 3;
-        var indexBuffer = IndexDatatype.IndexDatatype.createTypedArray(quantizedVertexCount + edgeVertexCount, indexBufferLength);
-        indexBuffer.set(parameters.indices, 0);
-
-        var percentage = 0.0001;
-        var lonOffset = (maxLongitude - minLongitude) * percentage;
-        var latOffset = (maxLatitude - minLatitude) * percentage;
-        var westLongitudeOffset = -lonOffset;
-        var westLatitudeOffset = 0.0;
-        var eastLongitudeOffset = lonOffset;
-        var eastLatitudeOffset = 0.0;
-        var northLongitudeOffset = 0.0;
-        var northLatitudeOffset = latOffset;
-        var southLongitudeOffset = 0.0;
-        var southLatitudeOffset = -latOffset;
-
-        // Add skirts.
-        var vertexBufferIndex = quantizedVertexCount * vertexStride;
-        addSkirt(vertexBuffer, vertexBufferIndex, westIndicesSouthToNorth, encoding, heights, uvs, octEncodedNormals, ellipsoid, rectangle, parameters.westSkirtHeight, exaggeration, southMercatorY, oneOverMercatorHeight, westLongitudeOffset, westLatitudeOffset);
-        vertexBufferIndex += parameters.westIndices.length * vertexStride;
-        addSkirt(vertexBuffer, vertexBufferIndex, southIndicesEastToWest, encoding, heights, uvs, octEncodedNormals, ellipsoid, rectangle, parameters.southSkirtHeight, exaggeration, southMercatorY, oneOverMercatorHeight, southLongitudeOffset, southLatitudeOffset);
-        vertexBufferIndex += parameters.southIndices.length * vertexStride;
-        addSkirt(vertexBuffer, vertexBufferIndex, eastIndicesNorthToSouth, encoding, heights, uvs, octEncodedNormals, ellipsoid, rectangle, parameters.eastSkirtHeight, exaggeration, southMercatorY, oneOverMercatorHeight, eastLongitudeOffset, eastLatitudeOffset);
-        vertexBufferIndex += parameters.eastIndices.length * vertexStride;
-        addSkirt(vertexBuffer, vertexBufferIndex, northIndicesWestToEast, encoding, heights, uvs, octEncodedNormals, ellipsoid, rectangle, parameters.northSkirtHeight, exaggeration, southMercatorY, oneOverMercatorHeight, northLongitudeOffset, northLatitudeOffset);
-
-        var edgeMap = createEdgeMap(parameters.indices, uBuffer, vBuffer, parameters.level);
-        TerrainProvider.addSkirtIndices(westIndicesSouthToNorth, southIndicesEastToWest, eastIndicesNorthToSouth, northIndicesWestToEast, quantizedVertexCount, indexBuffer, parameters.indices.length, edgeMap);
-
-        transferableObjects.push(vertexBuffer.buffer, indexBuffer.buffer);
-
-        return {
-            vertices : vertexBuffer.buffer,
-            indices : indexBuffer.buffer,
-            westIndicesSouthToNorth : westIndicesSouthToNorth,
-            southIndicesEastToWest : southIndicesEastToWest,
-            eastIndicesNorthToSouth : eastIndicesNorthToSouth,
-            northIndicesWestToEast : northIndicesWestToEast,
-            vertexStride : vertexStride,
-            center : center,
-            minimumHeight : minimumHeight,
-            maximumHeight : maximumHeight,
-            boundingSphere : boundingSphere,
-            orientedBoundingBox : orientedBoundingBox,
-            occludeePointInScaledSpace : occludeePointInScaledSpace,
-            encoding : encoding,
-            indexCountWithoutSkirts : parameters.indices.length
-        };
-    }
-
-    function createEdgeMap(indices, uBuffer, vBuffer, level) {
-        if(level < 12){
-            return undefined;
-        }
-
-        var edgeMap = {};
-        var len = indices.length;
-        for(var i = 0;i < len;i += 3){
-            var i0 = indices[i];
-            var i1 = indices[i + 1];
-            var i2 = indices[i + 2];
-            if( (uBuffer[i0] === maxShort && uBuffer[i1] === maxShort) ||
-                (uBuffer[i0] === 0 && uBuffer[i1] === 0) ||
-                (vBuffer[i0] === maxShort && vBuffer[i1] === maxShort) ||
-                (vBuffer[i0] === 0 && vBuffer[i1] === 0) ){
-                edgeMap[i0 + '_' + i1] = 1;
-                edgeMap[i1 + '_' + i0] = 1;
-            }
-
-            if( (uBuffer[i1] === maxShort && uBuffer[i2] === maxShort) ||
-                (uBuffer[i1] === 0 && uBuffer[i2] === 0) ||
-                (vBuffer[i1] === maxShort && vBuffer[i2] === maxShort) ||
-                (vBuffer[i1] === 0 && vBuffer[i2] === 0) ){
-                edgeMap[i1 + '_' + i2] = 1;
-                edgeMap[i2 + '_' + i1] = 1;
-            }
-
-            if( (uBuffer[i2] === maxShort && uBuffer[i0] === maxShort) ||
-                (uBuffer[i2] === 0 && uBuffer[i0] === 0) ||
-                (vBuffer[i2] === maxShort && vBuffer[i0] === maxShort) ||
-                (vBuffer[i2] === 0 && vBuffer[i0] === 0) ){
-                edgeMap[i2 + '_' + i0] = 1;
-                edgeMap[i0 + '_' + i2] = 1;
-            }
-        }
-
-        return edgeMap;
-    }
-
-    function findMinMaxSkirts(edgeIndices, edgeHeight, heights, uvs, rectangle, ellipsoid, toENU, minimum, maximum) {
-        var hMin = Number.POSITIVE_INFINITY;
-
-        var north = rectangle.north;
-        var south = rectangle.south;
-        var east = rectangle.east;
-        var west = rectangle.west;
-
-        if (east < west) {
-            east += _Math.CesiumMath.TWO_PI;
-        }
-
-        var length = edgeIndices.length;
-        for (var i = 0; i < length; ++i) {
-            var index = edgeIndices[i];
-            var h = heights[index];
-            var uv = uvs[index];
-
-            cartographicScratch.longitude = _Math.CesiumMath.lerp(west, east, uv.x);
-            cartographicScratch.latitude = _Math.CesiumMath.lerp(south, north, uv.y);
-            cartographicScratch.height = h - edgeHeight;
-
-            var position = ellipsoid.cartographicToCartesian(cartographicScratch, cartesian3Scratch);
-            BoundingSphere.Matrix4.multiplyByPoint(toENU, position, position);
-
-            Cartographic.Cartesian3.minimumByComponent(position, minimum, minimum);
-            Cartographic.Cartesian3.maximumByComponent(position, maximum, maximum);
-
-            hMin = Math.min(hMin, cartographicScratch.height);
-        }
-        return hMin;
-    }
-
-    function addSkirt(vertexBuffer, vertexBufferIndex, edgeVertices, encoding, heights, uvs, octEncodedNormals, ellipsoid, rectangle, skirtLength, exaggeration, southMercatorY, oneOverMercatorHeight, longitudeOffset, latitudeOffset) {
-        var hasVertexNormals = when.defined(octEncodedNormals);
-
-        var north = rectangle.north;
-        var south = rectangle.south;
-        var east = rectangle.east;
-        var west = rectangle.west;
-
-        if (east < west) {
-            east += _Math.CesiumMath.TWO_PI;
-        }
-
-        var length = edgeVertices.length;
-        for (var i = 0; i < length; ++i) {
-            var index = edgeVertices[i];
-            var h = heights[index];
-            var uv = uvs[index];
-
-            cartographicScratch.longitude = _Math.CesiumMath.lerp(west, east, uv.x) + longitudeOffset;
-            cartographicScratch.latitude = _Math.CesiumMath.lerp(south, north, uv.y) + latitudeOffset;
-            cartographicScratch.height = h - skirtLength;
-
-            var position = ellipsoid.cartographicToCartesian(cartographicScratch, cartesian3Scratch);
-
-            if (hasVertexNormals) {
-                var n = index * 2.0;
-                toPack.x = octEncodedNormals[n];
-                toPack.y = octEncodedNormals[n + 1];
-
-                if (exaggeration !== 1.0) {
-                    var normal = AttributeCompression.AttributeCompression.octDecode(toPack.x, toPack.y, scratchNormal);
-                    var fromENUNormal = Transforms.Transforms.eastNorthUpToFixedFrame(cartesian3Scratch, ellipsoid, scratchFromENU);
-                    var toENUNormal = BoundingSphere.Matrix4.inverseTransformation(fromENUNormal, scratchToENU);
-
-                    BoundingSphere.Matrix4.multiplyByPointAsVector(toENUNormal, normal, normal);
-                    normal.z *= exaggeration;
-                    Cartographic.Cartesian3.normalize(normal, normal);
-
-                    BoundingSphere.Matrix4.multiplyByPointAsVector(fromENUNormal, normal, normal);
-                    Cartographic.Cartesian3.normalize(normal, normal);
-
-                    AttributeCompression.AttributeCompression.octEncode(normal, toPack);
-                }
-            }
-
-            var webMercatorT;
-            if (encoding.hasWebMercatorT) {
-                webMercatorT = (WebMercatorProjection.WebMercatorProjection.geodeticLatitudeToMercatorAngle(cartographicScratch.latitude) - southMercatorY) * oneOverMercatorHeight;
-            }
-
-            vertexBufferIndex = encoding.encode(vertexBuffer, vertexBufferIndex, position, uv, cartographicScratch.height, toPack, webMercatorT);
-        }
-    }
-
-    function copyAndSort(typedArray, comparator) {
-        var copy;
-        if (typeof typedArray.slice === 'function') {
-            copy = typedArray.slice();
-            if (typeof copy.sort !== 'function') {
-                // Sliced typed array isn't sortable, so we can't use it.
-                copy = undefined;
-            }
-        }
-
-        if (!when.defined(copy)) {
-            copy = Array.prototype.slice.call(typedArray);
-        }
-
-        copy.sort(comparator);
-
-        return copy;
-    }
-    var createVerticesFromQuantizedTerrainMesh$1 = createTaskProcessorWorker(createVerticesFromQuantizedTerrainMesh);
-
-    return createVerticesFromQuantizedTerrainMesh$1;
-
-});
diff --git a/public/libs/Cesium/Workers/createWallGeometry.js b/public/libs/Cesium/Workers/createWallGeometry.js
deleted file mode 100644
index 615280b..0000000
--- a/public/libs/Cesium/Workers/createWallGeometry.js
+++ /dev/null
@@ -1,602 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './VertexFormat-fe4db402', './EllipsoidTangentPlane-e324bfa4', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './EllipsoidGeodesic-84507801', './PolylinePipeline-a9f32196', './WallGeometryLibrary-e09058ca'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, IntersectionTests, Plane, VertexFormat, EllipsoidTangentPlane, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, EllipsoidGeodesic, PolylinePipeline, WallGeometryLibrary) { 'use strict';
-
-    var scratchCartesian3Position1 = new Cartographic.Cartesian3();
-        var scratchCartesian3Position2 = new Cartographic.Cartesian3();
-        var scratchCartesian3Position3 = new Cartographic.Cartesian3();
-        var scratchCartesian3Position4 = new Cartographic.Cartesian3();
-        var scratchCartesian3Position5 = new Cartographic.Cartesian3();
-        var scratchBitangent = new Cartographic.Cartesian3();
-        var scratchTangent = new Cartographic.Cartesian3();
-        var scratchNormal = new Cartographic.Cartesian3();
-
-        /**
-         * A description of a wall, which is similar to a KML line string. A wall is defined by a series of points,
-         * which extrude down to the ground. Optionally, they can extrude downwards to a specified height.
-         *
-         * @alias WallGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of Cartesian objects, which are the points of the wall.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Number[]} [options.maximumHeights] An array parallel to <code>positions</code> that give the maximum height of the
-         *        wall at <code>positions</code>. If undefined, the height of each position in used.
-         * @param {Number[]} [options.minimumHeights] An array parallel to <code>positions</code> that give the minimum height of the
-         *        wall at <code>positions</code>. If undefined, the height at each position is 0.0.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid for coordinate manipulation
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         *
-         * @exception {DeveloperError} positions length must be greater than or equal to 2.
-         * @exception {DeveloperError} positions and maximumHeights must have the same length.
-         * @exception {DeveloperError} positions and minimumHeights must have the same length.
-         *
-         * @see WallGeometry#createGeometry
-         * @see WallGeometry#fromConstantHeight
-         *
-         * @demo {@link https://sandcastle.cesium.com/index.html?src=Wall.html|Cesium Sandcastle Wall Demo}
-         *
-         * @example
-         * // create a wall that spans from ground level to 10000 meters
-         * var wall = new Cesium.WallGeometry({
-         *   positions : Cesium.Cartesian3.fromDegreesArrayHeights([
-         *     19.0, 47.0, 10000.0,
-         *     19.0, 48.0, 10000.0,
-         *     20.0, 48.0, 10000.0,
-         *     20.0, 47.0, 10000.0,
-         *     19.0, 47.0, 10000.0
-         *   ])
-         * });
-         * var geometry = Cesium.WallGeometry.createGeometry(wall);
-         */
-        function WallGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var wallPositions = options.positions;
-            var maximumHeights = options.maximumHeights;
-            var minimumHeights = options.minimumHeights;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(wallPositions)) {
-                throw new Check.DeveloperError('options.positions is required.');
-            }
-            if (when.defined(maximumHeights) && maximumHeights.length !== wallPositions.length) {
-                throw new Check.DeveloperError('options.positions and options.maximumHeights must have the same length.');
-            }
-            if (when.defined(minimumHeights) && minimumHeights.length !== wallPositions.length) {
-                throw new Check.DeveloperError('options.positions and options.minimumHeights must have the same length.');
-            }
-            //>>includeEnd('debug');
-
-            var vertexFormat = when.defaultValue(options.vertexFormat, VertexFormat.VertexFormat.DEFAULT);
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-            this._positions = wallPositions;
-            this._minimumHeights = minimumHeights;
-            this._maximumHeights = maximumHeights;
-            this._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat);
-            this._granularity = granularity;
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid);
-            this._enuCenter = options.enuCenter;
-            this._workerName = 'createWallGeometry';
-
-            var numComponents = 1 + wallPositions.length * Cartographic.Cartesian3.packedLength + 2;
-            if (when.defined(minimumHeights)) {
-                numComponents += minimumHeights.length;
-            }
-            if (when.defined(maximumHeights)) {
-                numComponents += maximumHeights.length;
-            }
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = numComponents + Cartesian2.Ellipsoid.packedLength + VertexFormat.VertexFormat.packedLength + 1;
-            this.packedLength += Cartographic.Cartesian3.packedLength;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {WallGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        WallGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var positions = value._positions;
-            var length = positions.length;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                Cartographic.Cartesian3.pack(positions[i], array, startingIndex);
-            }
-
-            var minimumHeights = value._minimumHeights;
-            length = when.defined(minimumHeights) ? minimumHeights.length : 0;
-            array[startingIndex++] = length;
-
-            if (when.defined(minimumHeights)) {
-                for (i = 0; i < length; ++i) {
-                    array[startingIndex++] = minimumHeights[i];
-                }
-            }
-
-            var maximumHeights = value._maximumHeights;
-            length = when.defined(maximumHeights) ? maximumHeights.length : 0;
-            array[startingIndex++] = length;
-
-            if (when.defined(maximumHeights)) {
-                for (i = 0; i < length; ++i) {
-                    array[startingIndex++] = maximumHeights[i];
-                }
-            }
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            VertexFormat.VertexFormat.pack(value._vertexFormat, array, startingIndex);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            array[startingIndex++] = value._granularity;
-
-            if(when.defined(value._enuCenter)){
-                Cartographic.Cartesian3.pack(value._enuCenter, array, startingIndex);
-            } else {
-                Cartographic.Cartesian3.pack(Cartographic.Cartesian3.ZERO, array, startingIndex);
-            }
-
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchVertexFormat = new VertexFormat.VertexFormat();
-        var scratchOptions = {
-            positions : undefined,
-            minimumHeights : undefined,
-            maximumHeights : undefined,
-            ellipsoid : scratchEllipsoid,
-            vertexFormat : scratchVertexFormat,
-            granularity : undefined,
-            enuCenter : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {WallGeometry} [result] The object into which to store the result.
-         * @returns {WallGeometry} The modified result parameter or a new WallGeometry instance if one was not provided.
-         */
-        WallGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var length = array[startingIndex++];
-            var positions = new Array(length);
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                positions[i] = Cartographic.Cartesian3.unpack(array, startingIndex);
-            }
-
-            length = array[startingIndex++];
-            var minimumHeights;
-
-            if (length > 0) {
-                minimumHeights = new Array(length);
-                for (i = 0; i < length; ++i) {
-                    minimumHeights[i] = array[startingIndex++];
-                }
-            }
-
-            length = array[startingIndex++];
-            var maximumHeights;
-
-            if (length > 0) {
-                maximumHeights = new Array(length);
-                for (i = 0; i < length; ++i) {
-                    maximumHeights[i] = array[startingIndex++];
-                }
-            }
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var vertexFormat = VertexFormat.VertexFormat.unpack(array, startingIndex, scratchVertexFormat);
-            startingIndex += VertexFormat.VertexFormat.packedLength;
-
-            var granularity = array[startingIndex++];
-            var enuCenter = Cartographic.Cartesian3.unpack(array, startingIndex);
-            if(Cartographic.Cartesian3.equals(enuCenter, Cartographic.Cartesian3.ZERO)) {
-                enuCenter = undefined;
-            }
-
-            if (!when.defined(result)) {
-                scratchOptions.positions = positions;
-                scratchOptions.minimumHeights = minimumHeights;
-                scratchOptions.maximumHeights = maximumHeights;
-                scratchOptions.granularity = granularity;
-                scratchOptions.enuCenter = enuCenter;
-                return new WallGeometry(scratchOptions);
-            }
-
-            result._positions = positions;
-            result._minimumHeights = minimumHeights;
-            result._maximumHeights = maximumHeights;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._vertexFormat = VertexFormat.VertexFormat.clone(vertexFormat, result._vertexFormat);
-            result._granularity = granularity;
-            result._enuCenter = enuCenter;
-
-            return result;
-        };
-
-        /**
-         * A description of a wall, which is similar to a KML line string. A wall is defined by a series of points,
-         * which extrude down to the ground. Optionally, they can extrude downwards to a specified height.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of Cartesian objects, which are the points of the wall.
-         * @param {Number} [options.maximumHeight] A constant that defines the maximum height of the
-         *        wall at <code>positions</code>. If undefined, the height of each position in used.
-         * @param {Number} [options.minimumHeight] A constant that defines the minimum height of the
-         *        wall at <code>positions</code>. If undefined, the height at each position is 0.0.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid for coordinate manipulation
-         * @param {VertexFormat} [options.vertexFormat=VertexFormat.DEFAULT] The vertex attributes to be computed.
-         * @returns {WallGeometry}
-         *
-         *
-         * @example
-         * // create a wall that spans from 10000 meters to 20000 meters
-         * var wall = Cesium.WallGeometry.fromConstantHeights({
-         *   positions : Cesium.Cartesian3.fromDegreesArray([
-         *     19.0, 47.0,
-         *     19.0, 48.0,
-         *     20.0, 48.0,
-         *     20.0, 47.0,
-         *     19.0, 47.0,
-         *   ]),
-         *   minimumHeight : 20000.0,
-         *   maximumHeight : 10000.0
-         * });
-         * var geometry = Cesium.WallGeometry.createGeometry(wall);
-         *
-         * @see WallGeometry#createGeometry
-         */
-        WallGeometry.fromConstantHeights = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var positions = options.positions;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(positions)) {
-                throw new Check.DeveloperError('options.positions is required.');
-            }
-            //>>includeEnd('debug');
-
-            var minHeights;
-            var maxHeights;
-
-            var min = options.minimumHeight;
-            var max = options.maximumHeight;
-
-            var doMin = when.defined(min);
-            var doMax = when.defined(max);
-            if (doMin || doMax) {
-                var length = positions.length;
-                minHeights = (doMin) ? new Array(length) : undefined;
-                maxHeights = (doMax) ? new Array(length) : undefined;
-
-                for (var i = 0; i < length; ++i) {
-                    if (doMin) {
-                        minHeights[i] = min;
-                    }
-
-                    if (doMax) {
-                        maxHeights[i] = max;
-                    }
-                }
-            }
-
-            var newOptions = {
-                positions : positions,
-                maximumHeights : maxHeights,
-                minimumHeights : minHeights,
-                ellipsoid : options.ellipsoid,
-                vertexFormat : options.vertexFormat
-            };
-            return new WallGeometry(newOptions);
-        };
-
-        /**
-         * Computes the geometric representation of a wall, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {WallGeometry} wallGeometry A description of the wall.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        WallGeometry.createGeometry = function(wallGeometry) {
-            var wallPositions = wallGeometry._positions;
-            var minimumHeights = wallGeometry._minimumHeights;
-            var maximumHeights = wallGeometry._maximumHeights;
-            var vertexFormat = wallGeometry._vertexFormat;
-            var granularity = wallGeometry._granularity;
-            var ellipsoid = wallGeometry._ellipsoid;
-            var enuCenter = wallGeometry._enuCenter;
-
-            var posObj = WallGeometryLibrary.WallGeometryLibrary.computePositions(ellipsoid, wallPositions, maximumHeights, minimumHeights, granularity, true, enuCenter);
-            if (!when.defined(posObj.pos)) {
-                return;
-            }
-
-            var enu;
-            if (when.defined(enuCenter)) {
-                enu = Transforms.Transforms.eastNorthUpToFixedFrame(enuCenter);
-            }
-
-            var bottomPositions = posObj.pos.bottomPositions;
-            var topPositions = posObj.pos.topPositions;
-            var numCorners = posObj.pos.numCorners;
-
-            var length = topPositions.length;
-            var size = length * 2;
-
-            var positions = vertexFormat.position ? new Float64Array(size) : undefined;
-            var normals = vertexFormat.normal ? new Float32Array(size) : undefined;
-            var tangents = vertexFormat.tangent ? new Float32Array(size) : undefined;
-            var bitangents = vertexFormat.bitangent ? new Float32Array(size) : undefined;
-            var textureCoordinates = vertexFormat.st ? new Float32Array(size / 3 * 2) : undefined;
-
-            var positionIndex = 0;
-            var normalIndex = 0;
-            var bitangentIndex = 0;
-            var tangentIndex = 0;
-            var stIndex = 0;
-
-            // add lower and upper points one after the other, lower
-            // points being even and upper points being odd
-            var normal = scratchNormal;
-            var tangent = scratchTangent;
-            var bitangent = scratchBitangent;
-            var recomputeNormal = true;
-            length /= 3;
-            var i;
-            var s = 0;
-            var ds = 1/(length - wallPositions.length + 1);
-            for (i = 0; i < length; ++i) {
-                var i3 = i * 3;
-                var topPosition = Cartographic.Cartesian3.fromArray(topPositions, i3, scratchCartesian3Position1);
-                var bottomPosition = Cartographic.Cartesian3.fromArray(bottomPositions, i3, scratchCartesian3Position2);
-                if (vertexFormat.position) {
-                    // insert the lower point
-                    positions[positionIndex++] = bottomPosition.x;
-                    positions[positionIndex++] = bottomPosition.y;
-                    positions[positionIndex++] = bottomPosition.z;
-
-                    // insert the upper point
-                    positions[positionIndex++] = topPosition.x;
-                    positions[positionIndex++] = topPosition.y;
-                    positions[positionIndex++] = topPosition.z;
-                }
-
-                if (vertexFormat.st) {
-                    textureCoordinates[stIndex++] = s;
-                    textureCoordinates[stIndex++] = 0.0;
-
-                    textureCoordinates[stIndex++] = s;
-                    textureCoordinates[stIndex++] = 1.0;
-                }
-
-                if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.bitangent) {
-                    var nextPosition;
-                    var nextTop = Cartographic.Cartesian3.clone(Cartographic.Cartesian3.ZERO, scratchCartesian3Position5);
-                    var groundPosition = ellipsoid.scaleToGeodeticSurface(Cartographic.Cartesian3.fromArray(topPositions, i3, scratchCartesian3Position2), scratchCartesian3Position2);
-                    if (i + 1 < length) {
-                        nextPosition = ellipsoid.scaleToGeodeticSurface(Cartographic.Cartesian3.fromArray(topPositions, i3 + 3, scratchCartesian3Position3), scratchCartesian3Position3);
-                        nextTop = Cartographic.Cartesian3.fromArray(topPositions, i3 + 3, scratchCartesian3Position5);
-                    }
-
-                    if (recomputeNormal) {
-                        var scalednextPosition = Cartographic.Cartesian3.subtract(nextTop, topPosition, scratchCartesian3Position4);
-                        var scaledGroundPosition = Cartographic.Cartesian3.subtract(groundPosition, topPosition, scratchCartesian3Position1);
-                        normal = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(scaledGroundPosition, scalednextPosition, normal), normal);
-                        recomputeNormal = false;
-                    }
-
-                    if (Cartographic.Cartesian3.equalsEpsilon(nextPosition, groundPosition, _Math.CesiumMath.EPSILON10)) {
-                        recomputeNormal = true;
-                    } else {
-                        s += ds;
-                        if (vertexFormat.tangent) {
-                            tangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.subtract(nextPosition, groundPosition, tangent), tangent);
-                        }
-                        if (vertexFormat.bitangent) {
-                            bitangent = Cartographic.Cartesian3.normalize(Cartographic.Cartesian3.cross(normal, tangent, bitangent), bitangent);
-                        }
-                    }
-
-                    if (vertexFormat.normal) {
-                        if (when.defined(enuCenter)) {
-                            BoundingSphere.Matrix4.multiplyByPoint(enu, normal, normal);
-                            Cartographic.Cartesian3.normalize(normal, normal);
-                        }
-                        normals[normalIndex++] = normal.x;
-                        normals[normalIndex++] = normal.y;
-                        normals[normalIndex++] = normal.z;
-
-                        normals[normalIndex++] = normal.x;
-                        normals[normalIndex++] = normal.y;
-                        normals[normalIndex++] = normal.z;
-                    }
-
-                    if (vertexFormat.tangent) {
-                        tangents[tangentIndex++] = tangent.x;
-                        tangents[tangentIndex++] = tangent.y;
-                        tangents[tangentIndex++] = tangent.z;
-
-                        tangents[tangentIndex++] = tangent.x;
-                        tangents[tangentIndex++] = tangent.y;
-                        tangents[tangentIndex++] = tangent.z;
-                    }
-
-                    if (vertexFormat.bitangent) {
-                        bitangents[bitangentIndex++] = bitangent.x;
-                        bitangents[bitangentIndex++] = bitangent.y;
-                        bitangents[bitangentIndex++] = bitangent.z;
-
-                        bitangents[bitangentIndex++] = bitangent.x;
-                        bitangents[bitangentIndex++] = bitangent.y;
-                        bitangents[bitangentIndex++] = bitangent.z;
-                    }
-                }
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes();
-
-            if (vertexFormat.position) {
-                attributes.position = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : positions
-                });
-            }
-
-            if (vertexFormat.normal) {
-                attributes.normal = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : normals
-                });
-            }
-
-            if (vertexFormat.tangent) {
-                attributes.tangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : tangents
-                });
-            }
-
-            if (vertexFormat.bitangent) {
-                attributes.bitangent = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 3,
-                    values : bitangents
-                });
-            }
-
-            if (vertexFormat.st) {
-                attributes.st = new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.FLOAT,
-                    componentsPerAttribute : 2,
-                    values : textureCoordinates
-                });
-            }
-
-            // prepare the side walls, two triangles for each wall
-            //
-            //    A (i+1)  B (i+3) E
-            //    +--------+-------+
-            //    |      / |      /|    triangles:  A C B
-            //    |     /  |     / |                B C D
-            //    |    /   |    /  |
-            //    |   /    |   /   |
-            //    |  /     |  /    |
-            //    | /      | /     |
-            //    +--------+-------+
-            //    C (i)    D (i+2) F
-            //
-
-            var numVertices = size / 3;
-            size -= 6 * (numCorners + 1);
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(numVertices, size);
-
-            var edgeIndex = 0;
-            for (i = 0; i < numVertices - 2; i += 2) {
-                var LL = i;
-                var LR = i + 2;
-                var pl = Cartographic.Cartesian3.fromArray(positions, LL * 3, scratchCartesian3Position1);
-                var pr = Cartographic.Cartesian3.fromArray(positions, LR * 3, scratchCartesian3Position2);
-                if (Cartographic.Cartesian3.equalsEpsilon(pl, pr, _Math.CesiumMath.EPSILON10)) {
-                    continue;
-                }
-                var UL = i + 1;
-                var UR = i + 3;
-
-                indices[edgeIndex++] = UL;
-                indices[edgeIndex++] = LL;
-                indices[edgeIndex++] = UR;
-                indices[edgeIndex++] = UR;
-                indices[edgeIndex++] = LL;
-                indices[edgeIndex++] = LR;
-            }
-
-            var geometry = new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.TRIANGLES,
-                boundingSphere : new BoundingSphere.BoundingSphere.fromVertices(positions)
-            });
-
-            if(when.defined(wallGeometry._enuCenter)) {
-                geometry.attributes.position.values.set(posObj.localPos.topPositions, 0);
-                geometry.attributes.position.values.set(posObj.localPos.bottomPositions, geometry.attributes.position.values.length / 2);
-                geometry.attributes.position.componentDatatype = ComponentDatatype.ComponentDatatype.FLOAT;
-            }
-            return geometry;
-        };
-
-    function createWallGeometry(wallGeometry, offset) {
-        if (when.defined(offset)) {
-            wallGeometry = WallGeometry.unpack(wallGeometry, offset);
-        }
-        wallGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(wallGeometry._ellipsoid);
-        return WallGeometry.createGeometry(wallGeometry);
-    }
-
-    return createWallGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/createWallOutlineGeometry.js b/public/libs/Cesium/Workers/createWallOutlineGeometry.js
deleted file mode 100644
index 1041d4f..0000000
--- a/public/libs/Cesium/Workers/createWallOutlineGeometry.js
+++ /dev/null
@@ -1,418 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './GeometryAttribute-ed9d707f', './PrimitiveType-97893bc7', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './GeometryAttributes-aacecde6', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './EllipsoidTangentPlane-e324bfa4', './EllipsoidRhumbLine-f161e674', './earcut-2.2.1-b404d9e6', './PolygonPipeline-fd46002b', './EllipsoidGeodesic-84507801', './PolylinePipeline-a9f32196', './WallGeometryLibrary-e09058ca'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, GeometryAttribute, PrimitiveType, FeatureDetection, Transforms, buildModuleUrl, GeometryAttributes, IndexDatatype, IntersectionTests, Plane, EllipsoidTangentPlane, EllipsoidRhumbLine, earcut2_2_1, PolygonPipeline, EllipsoidGeodesic, PolylinePipeline, WallGeometryLibrary) { 'use strict';
-
-    var scratchCartesian3Position1 = new Cartographic.Cartesian3();
-        var scratchCartesian3Position2 = new Cartographic.Cartesian3();
-
-        /**
-         * A description of a wall outline. A wall is defined by a series of points,
-         * which extrude down to the ground. Optionally, they can extrude downwards to a specified height.
-         *
-         * @alias WallOutlineGeometry
-         * @constructor
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of Cartesian objects, which are the points of the wall.
-         * @param {Number} [options.granularity=CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer.
-         * @param {Number[]} [options.maximumHeights] An array parallel to <code>positions</code> that give the maximum height of the
-         *        wall at <code>positions</code>. If undefined, the height of each position in used.
-         * @param {Number[]} [options.minimumHeights] An array parallel to <code>positions</code> that give the minimum height of the
-         *        wall at <code>positions</code>. If undefined, the height at each position is 0.0.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid for coordinate manipulation
-         *
-         * @exception {DeveloperError} positions length must be greater than or equal to 2.
-         * @exception {DeveloperError} positions and maximumHeights must have the same length.
-         * @exception {DeveloperError} positions and minimumHeights must have the same length.
-         *
-         * @see WallGeometry#createGeometry
-         * @see WallGeometry#fromConstantHeight
-         *
-         * @example
-         * // create a wall outline that spans from ground level to 10000 meters
-         * var wall = new Cesium.WallOutlineGeometry({
-         *   positions : Cesium.Cartesian3.fromDegreesArrayHeights([
-         *     19.0, 47.0, 10000.0,
-         *     19.0, 48.0, 10000.0,
-         *     20.0, 48.0, 10000.0,
-         *     20.0, 47.0, 10000.0,
-         *     19.0, 47.0, 10000.0
-         *   ])
-         * });
-         * var geometry = Cesium.WallOutlineGeometry.createGeometry(wall);
-         */
-        function WallOutlineGeometry(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-
-            var wallPositions = options.positions;
-            var maximumHeights = options.maximumHeights;
-            var minimumHeights = options.minimumHeights;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(wallPositions)) {
-                throw new Check.DeveloperError('options.positions is required.');
-            }
-            if (when.defined(maximumHeights) && maximumHeights.length !== wallPositions.length) {
-                throw new Check.DeveloperError('options.positions and options.maximumHeights must have the same length.');
-            }
-            if (when.defined(minimumHeights) && minimumHeights.length !== wallPositions.length) {
-                throw new Check.DeveloperError('options.positions and options.minimumHeights must have the same length.');
-            }
-            //>>includeEnd('debug');
-
-            var granularity = when.defaultValue(options.granularity, _Math.CesiumMath.RADIANS_PER_DEGREE);
-            var ellipsoid = when.defaultValue(options.ellipsoid, Cartesian2.Ellipsoid.WGS84);
-
-            this._positions = wallPositions;
-            this._minimumHeights = minimumHeights;
-            this._maximumHeights = maximumHeights;
-            this._granularity = granularity;
-            this._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid);
-            this._workerName = 'createWallOutlineGeometry';
-
-            var numComponents = 1 + wallPositions.length * Cartographic.Cartesian3.packedLength + 2;
-            if (when.defined(minimumHeights)) {
-                numComponents += minimumHeights.length;
-            }
-            if (when.defined(maximumHeights)) {
-                numComponents += maximumHeights.length;
-            }
-
-            /**
-             * The number of elements used to pack the object into an array.
-             * @type {Number}
-             */
-            this.packedLength = numComponents + Cartesian2.Ellipsoid.packedLength + 1;
-        }
-
-        /**
-         * Stores the provided instance into the provided array.
-         *
-         * @param {WallOutlineGeometry} value The value to pack.
-         * @param {Number[]} array The array to pack into.
-         * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.
-         *
-         * @returns {Number[]} The array that was packed into
-         */
-        WallOutlineGeometry.pack = function(value, array, startingIndex) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(value)) {
-                throw new Check.DeveloperError('value is required');
-            }
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var positions = value._positions;
-            var length = positions.length;
-            array[startingIndex++] = length;
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                Cartographic.Cartesian3.pack(positions[i], array, startingIndex);
-            }
-
-            var minimumHeights = value._minimumHeights;
-            length = when.defined(minimumHeights) ? minimumHeights.length : 0;
-            array[startingIndex++] = length;
-
-            if (when.defined(minimumHeights)) {
-                for (i = 0; i < length; ++i) {
-                    array[startingIndex++] = minimumHeights[i];
-                }
-            }
-
-            var maximumHeights = value._maximumHeights;
-            length = when.defined(maximumHeights) ? maximumHeights.length : 0;
-            array[startingIndex++] = length;
-
-            if (when.defined(maximumHeights)) {
-                for (i = 0; i < length; ++i) {
-                    array[startingIndex++] = maximumHeights[i];
-                }
-            }
-
-            Cartesian2.Ellipsoid.pack(value._ellipsoid, array, startingIndex);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            array[startingIndex]   = value._granularity;
-
-            return array;
-        };
-
-        var scratchEllipsoid = Cartesian2.Ellipsoid.clone(Cartesian2.Ellipsoid.UNIT_SPHERE);
-        var scratchOptions = {
-            positions : undefined,
-            minimumHeights : undefined,
-            maximumHeights : undefined,
-            ellipsoid : scratchEllipsoid,
-            granularity : undefined
-        };
-
-        /**
-         * Retrieves an instance from a packed array.
-         *
-         * @param {Number[]} array The packed array.
-         * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.
-         * @param {WallOutlineGeometry} [result] The object into which to store the result.
-         * @returns {WallOutlineGeometry} The modified result parameter or a new WallOutlineGeometry instance if one was not provided.
-         */
-        WallOutlineGeometry.unpack = function(array, startingIndex, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(array)) {
-                throw new Check.DeveloperError('array is required');
-            }
-            //>>includeEnd('debug');
-
-            startingIndex = when.defaultValue(startingIndex, 0);
-
-            var i;
-
-            var length = array[startingIndex++];
-            var positions = new Array(length);
-
-            for (i = 0; i < length; ++i, startingIndex += Cartographic.Cartesian3.packedLength) {
-                positions[i] = Cartographic.Cartesian3.unpack(array, startingIndex);
-            }
-
-            length = array[startingIndex++];
-            var minimumHeights;
-
-            if (length > 0) {
-                minimumHeights = new Array(length);
-                for (i = 0; i < length; ++i) {
-                    minimumHeights[i] = array[startingIndex++];
-                }
-            }
-
-            length = array[startingIndex++];
-            var maximumHeights;
-
-            if (length > 0) {
-                maximumHeights = new Array(length);
-                for (i = 0; i < length; ++i) {
-                    maximumHeights[i] = array[startingIndex++];
-                }
-            }
-
-            var ellipsoid = Cartesian2.Ellipsoid.unpack(array, startingIndex, scratchEllipsoid);
-            startingIndex += Cartesian2.Ellipsoid.packedLength;
-
-            var granularity = array[startingIndex];
-
-            if (!when.defined(result)) {
-                scratchOptions.positions = positions;
-                scratchOptions.minimumHeights = minimumHeights;
-                scratchOptions.maximumHeights = maximumHeights;
-                scratchOptions.granularity = granularity;
-                return new WallOutlineGeometry(scratchOptions);
-            }
-
-            result._positions = positions;
-            result._minimumHeights = minimumHeights;
-            result._maximumHeights = maximumHeights;
-            result._ellipsoid = Cartesian2.Ellipsoid.clone(ellipsoid, result._ellipsoid);
-            result._granularity = granularity;
-
-            return result;
-        };
-
-        /**
-         * A description of a walloutline. A wall is defined by a series of points,
-         * which extrude down to the ground. Optionally, they can extrude downwards to a specified height.
-         *
-         * @param {Object} options Object with the following properties:
-         * @param {Cartesian3[]} options.positions An array of Cartesian objects, which are the points of the wall.
-         * @param {Number} [options.maximumHeight] A constant that defines the maximum height of the
-         *        wall at <code>positions</code>. If undefined, the height of each position in used.
-         * @param {Number} [options.minimumHeight] A constant that defines the minimum height of the
-         *        wall at <code>positions</code>. If undefined, the height at each position is 0.0.
-         * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid for coordinate manipulation
-         * @returns {WallOutlineGeometry}
-         *
-         *
-         * @example
-         * // create a wall that spans from 10000 meters to 20000 meters
-         * var wall = Cesium.WallOutlineGeometry.fromConstantHeights({
-         *   positions : Cesium.Cartesian3.fromDegreesArray([
-         *     19.0, 47.0,
-         *     19.0, 48.0,
-         *     20.0, 48.0,
-         *     20.0, 47.0,
-         *     19.0, 47.0,
-         *   ]),
-         *   minimumHeight : 20000.0,
-         *   maximumHeight : 10000.0
-         * });
-         * var geometry = Cesium.WallOutlineGeometry.createGeometry(wall);
-         *
-         * @see WallOutlineGeometry#createGeometry
-         */
-        WallOutlineGeometry.fromConstantHeights = function(options) {
-            options = when.defaultValue(options, when.defaultValue.EMPTY_OBJECT);
-            var positions = options.positions;
-
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(positions)) {
-                throw new Check.DeveloperError('options.positions is required.');
-            }
-            //>>includeEnd('debug');
-
-            var minHeights;
-            var maxHeights;
-
-            var min = options.minimumHeight;
-            var max = options.maximumHeight;
-
-            var doMin = when.defined(min);
-            var doMax = when.defined(max);
-            if (doMin || doMax) {
-                var length = positions.length;
-                minHeights = (doMin) ? new Array(length) : undefined;
-                maxHeights = (doMax) ? new Array(length) : undefined;
-
-                for (var i = 0; i < length; ++i) {
-                    if (doMin) {
-                        minHeights[i] = min;
-                    }
-
-                    if (doMax) {
-                        maxHeights[i] = max;
-                    }
-                }
-            }
-
-            var newOptions = {
-                positions : positions,
-                maximumHeights : maxHeights,
-                minimumHeights : minHeights,
-                ellipsoid : options.ellipsoid
-            };
-            return new WallOutlineGeometry(newOptions);
-        };
-
-        /**
-         * Computes the geometric representation of a wall outline, including its vertices, indices, and a bounding sphere.
-         *
-         * @param {WallOutlineGeometry} wallGeometry A description of the wall outline.
-         * @returns {Geometry|undefined} The computed vertices and indices.
-         */
-        WallOutlineGeometry.createGeometry = function(wallGeometry) {
-            var wallPositions = wallGeometry._positions;
-            var minimumHeights = wallGeometry._minimumHeights;
-            var maximumHeights = wallGeometry._maximumHeights;
-            var granularity = wallGeometry._granularity;
-            var ellipsoid = wallGeometry._ellipsoid;
-
-            var pos = WallGeometryLibrary.WallGeometryLibrary.computePositions(ellipsoid, wallPositions, maximumHeights, minimumHeights, granularity, false);
-            if (!when.defined(pos)) {
-                return;
-            }
-
-            var bottomPositions = pos.pos.bottomPositions;
-            var topPositions = pos.pos.topPositions;
-
-            var length = topPositions.length;
-            var size = length * 2;
-
-            var positions = new Float64Array(size);
-            var positionIndex = 0;
-
-            // add lower and upper points one after the other, lower
-            // points being even and upper points being odd
-            length /= 3;
-            var i;
-            for (i = 0; i < length; ++i) {
-                var i3 = i * 3;
-                var topPosition = Cartographic.Cartesian3.fromArray(topPositions, i3, scratchCartesian3Position1);
-                var bottomPosition = Cartographic.Cartesian3.fromArray(bottomPositions, i3, scratchCartesian3Position2);
-
-                // insert the lower point
-                positions[positionIndex++] = bottomPosition.x;
-                positions[positionIndex++] = bottomPosition.y;
-                positions[positionIndex++] = bottomPosition.z;
-
-                // insert the upper point
-                positions[positionIndex++] = topPosition.x;
-                positions[positionIndex++] = topPosition.y;
-                positions[positionIndex++] = topPosition.z;
-            }
-
-            var attributes = new GeometryAttributes.GeometryAttributes({
-                position : new GeometryAttribute.GeometryAttribute({
-                    componentDatatype : ComponentDatatype.ComponentDatatype.DOUBLE,
-                    componentsPerAttribute : 3,
-                    values : positions
-                })
-            });
-
-            var numVertices = size / 3;
-            size = 2 * numVertices - 4 + numVertices;
-            var indices = IndexDatatype.IndexDatatype.createTypedArray(numVertices, size);
-
-            var edgeIndex = 0;
-            for (i = 0; i < numVertices - 2; i += 2) {
-                var LL = i;
-                var LR = i + 2;
-                var pl = Cartographic.Cartesian3.fromArray(positions, LL * 3, scratchCartesian3Position1);
-                var pr = Cartographic.Cartesian3.fromArray(positions, LR * 3, scratchCartesian3Position2);
-                if (Cartographic.Cartesian3.equalsEpsilon(pl, pr, _Math.CesiumMath.EPSILON10)) {
-                    continue;
-                }
-                var UL = i + 1;
-                var UR = i + 3;
-
-                indices[edgeIndex++] = UL;
-                indices[edgeIndex++] = LL;
-                indices[edgeIndex++] = UL;
-                indices[edgeIndex++] = UR;
-                indices[edgeIndex++] = LL;
-                indices[edgeIndex++] = LR;
-            }
-
-            indices[edgeIndex++] = numVertices - 2;
-            indices[edgeIndex++] = numVertices - 1;
-
-            return new GeometryAttribute.Geometry({
-                attributes : attributes,
-                indices : indices,
-                primitiveType : PrimitiveType.PrimitiveType.LINES,
-                boundingSphere : new BoundingSphere.BoundingSphere.fromVertices(positions)
-            });
-        };
-
-    function createWallOutlineGeometry(wallGeometry, offset) {
-        if (when.defined(offset)) {
-            wallGeometry = WallOutlineGeometry.unpack(wallGeometry, offset);
-        }
-        wallGeometry._ellipsoid = Cartesian2.Ellipsoid.clone(wallGeometry._ellipsoid);
-        return WallOutlineGeometry.createGeometry(wallGeometry);
-    }
-
-    return createWallOutlineGeometry;
-
-});
diff --git a/public/libs/Cesium/Workers/decodeDraco.js b/public/libs/Cesium/Workers/decodeDraco.js
deleted file mode 100644
index 223c609..0000000
--- a/public/libs/Cesium/Workers/decodeDraco.js
+++ /dev/null
@@ -1,307 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './IndexDatatype-9435b55f', './createTaskProcessorWorker'], function (when, Check, _Math, RuntimeError, WebGLConstants, ComponentDatatype, IndexDatatype, createTaskProcessorWorker) { 'use strict';
-
-    /* global require */
-
-    var draco;
-
-    function decodeIndexArray(dracoGeometry, dracoDecoder) {
-        var numPoints = dracoGeometry.num_points();
-        var numFaces = dracoGeometry.num_faces();
-        var faceIndices = new draco.DracoInt32Array();
-        var numIndices = numFaces * 3;
-        var indexArray = IndexDatatype.IndexDatatype.createTypedArray(numPoints, numIndices);
-
-        var offset = 0;
-        for (var i = 0; i < numFaces; ++i) {
-            dracoDecoder.GetFaceFromMesh(dracoGeometry, i, faceIndices);
-
-            indexArray[offset + 0] = faceIndices.GetValue(0);
-            indexArray[offset + 1] = faceIndices.GetValue(1);
-            indexArray[offset + 2] = faceIndices.GetValue(2);
-            offset += 3;
-        }
-
-        draco.destroy(faceIndices);
-
-        return {
-            typedArray : indexArray,
-            numberOfIndices : numIndices
-        };
-    }
-
-    function decodeQuantizedDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, quantization, vertexArrayLength) {
-        var vertexArray;
-        var attributeData;
-        if (quantization.quantizationBits <= 8) {
-            attributeData = new draco.DracoUInt8Array();
-            vertexArray = new Uint8Array(vertexArrayLength);
-            dracoDecoder.GetAttributeUInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-        } else {
-            attributeData = new draco.DracoUInt16Array();
-            vertexArray = new Uint16Array(vertexArrayLength);
-            dracoDecoder.GetAttributeUInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-        }
-
-        for (var i = 0; i < vertexArrayLength; ++i) {
-            vertexArray[i] = attributeData.GetValue(i);
-        }
-
-        draco.destroy(attributeData);
-        return vertexArray;
-    }
-
-    function decodeDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, vertexArrayLength) {
-        var vertexArray;
-        var attributeData;
-
-        // Some attribute types are casted down to 32 bit since Draco only returns 32 bit values
-        switch (dracoAttribute.data_type()) {
-            case 1: case 11: // DT_INT8 or DT_BOOL
-            attributeData = new draco.DracoInt8Array();
-            vertexArray = new Int8Array(vertexArrayLength);
-            dracoDecoder.GetAttributeInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-            break;
-            case 2: // DT_UINT8
-                attributeData = new draco.DracoUInt8Array();
-                vertexArray = new Uint8Array(vertexArrayLength);
-                dracoDecoder.GetAttributeUInt8ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-                break;
-            case 3: // DT_INT16
-                attributeData = new draco.DracoInt16Array();
-                vertexArray = new Int16Array(vertexArrayLength);
-                dracoDecoder.GetAttributeInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-                break;
-            case 4: // DT_UINT16
-                attributeData = new draco.DracoUInt16Array();
-                vertexArray = new Uint16Array(vertexArrayLength);
-                dracoDecoder.GetAttributeUInt16ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-                break;
-            case 5: case 7: // DT_INT32 or DT_INT64
-            attributeData = new draco.DracoInt32Array();
-            vertexArray = new Int32Array(vertexArrayLength);
-            dracoDecoder.GetAttributeInt32ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-            break;
-            case 6: case 8: // DT_UINT32 or DT_UINT64
-            attributeData = new draco.DracoUInt32Array();
-            vertexArray = new Uint32Array(vertexArrayLength);
-            dracoDecoder.GetAttributeUInt32ForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-            break;
-            case 9: case 10: // DT_FLOAT32 or DT_FLOAT64
-            attributeData = new draco.DracoFloat32Array();
-            vertexArray = new Float32Array(vertexArrayLength);
-            dracoDecoder.GetAttributeFloatForAllPoints(dracoGeometry, dracoAttribute, attributeData);
-            break;
-        }
-
-        for (var i = 0; i < vertexArrayLength; ++i) {
-            vertexArray[i] = attributeData.GetValue(i);
-        }
-
-        draco.destroy(attributeData);
-        return vertexArray;
-    }
-
-    function decodeAttribute(dracoGeometry, dracoDecoder, dracoAttribute) {
-        var numPoints = dracoGeometry.num_points();
-        var numComponents = dracoAttribute.num_components();
-
-        var quantization;
-        var transform = new draco.AttributeQuantizationTransform();
-        if (transform.InitFromAttribute(dracoAttribute)) {
-            var minValues = new Array(numComponents);
-            for (var i = 0; i < numComponents; ++i) {
-                minValues[i] = transform.min_value(i);
-            }
-            quantization = {
-                quantizationBits : transform.quantization_bits(),
-                minValues : minValues,
-                range : transform.range(),
-                octEncoded : false
-            };
-        }
-        draco.destroy(transform);
-
-        transform = new draco.AttributeOctahedronTransform();
-        if (transform.InitFromAttribute(dracoAttribute)) {
-            quantization = {
-                quantizationBits : transform.quantization_bits(),
-                octEncoded : true
-            };
-        }
-        draco.destroy(transform);
-
-        var vertexArrayLength = numPoints * numComponents;
-        var vertexArray;
-        if (when.defined(quantization)) {
-            vertexArray = decodeQuantizedDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, quantization, vertexArrayLength);
-        } else {
-            vertexArray = decodeDracoTypedArray(dracoGeometry, dracoDecoder, dracoAttribute, vertexArrayLength);
-        }
-
-        var componentDatatype = ComponentDatatype.ComponentDatatype.fromTypedArray(vertexArray);
-
-        return {
-            array : vertexArray,
-            data : {
-                componentsPerAttribute : numComponents,
-                componentDatatype : componentDatatype,
-                byteOffset : dracoAttribute.byte_offset(),
-                byteStride : ComponentDatatype.ComponentDatatype.getSizeInBytes(componentDatatype) * numComponents,
-                normalized : dracoAttribute.normalized(),
-                quantization : quantization
-            }
-        };
-    }
-
-    function decodePointCloud(parameters) {
-        var dracoDecoder = new draco.Decoder();
-
-        if (parameters.dequantizeInShader) {
-            dracoDecoder.SkipAttributeTransform(draco.POSITION);
-            dracoDecoder.SkipAttributeTransform(draco.NORMAL);
-        }
-
-        var buffer = new draco.DecoderBuffer();
-        buffer.Init(parameters.buffer, parameters.buffer.length);
-
-        var geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
-        if (geometryType !== draco.POINT_CLOUD) {
-            throw new RuntimeError.RuntimeError('Draco geometry type must be POINT_CLOUD.');
-        }
-
-        var dracoPointCloud = new draco.PointCloud();
-        var decodingStatus = dracoDecoder.DecodeBufferToPointCloud(buffer, dracoPointCloud);
-        if (!decodingStatus.ok() || dracoPointCloud.ptr === 0) {
-            throw new RuntimeError.RuntimeError('Error decoding draco point cloud: ' + decodingStatus.error_msg());
-        }
-
-        draco.destroy(buffer);
-
-        var result = {};
-
-        var properties = parameters.properties;
-        for (var propertyName in properties) {
-            if (properties.hasOwnProperty(propertyName)) {
-                var attributeId = properties[propertyName];
-                var dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoPointCloud, attributeId);
-                result[propertyName] = decodeAttribute(dracoPointCloud, dracoDecoder, dracoAttribute);
-            }
-        }
-
-        draco.destroy(dracoPointCloud);
-        draco.destroy(dracoDecoder);
-
-        return result;
-    }
-
-    function decodePrimitive(parameters) {
-        var dracoDecoder = new draco.Decoder();
-
-        // Skip all parameter types except generic
-        var attributesToSkip = ['POSITION', 'NORMAL', 'COLOR', 'TEX_COORD'];
-        if (parameters.dequantizeInShader) {
-            for (var i = 0; i < attributesToSkip.length; ++i) {
-                dracoDecoder.SkipAttributeTransform(draco[attributesToSkip[i]]);
-            }
-        }
-
-        var bufferView = parameters.bufferView;
-        var buffer = new draco.DecoderBuffer();
-        buffer.Init(parameters.array, bufferView.byteLength);
-
-        var geometryType = dracoDecoder.GetEncodedGeometryType(buffer);
-        if (geometryType !== draco.TRIANGULAR_MESH) {
-            throw new RuntimeError.RuntimeError('Unsupported draco mesh geometry type.');
-        }
-
-        var dracoGeometry = new draco.Mesh();
-        var decodingStatus = dracoDecoder.DecodeBufferToMesh(buffer, dracoGeometry);
-        if (!decodingStatus.ok() || dracoGeometry.ptr === 0) {
-            throw new RuntimeError.RuntimeError('Error decoding draco mesh geometry: ' + decodingStatus.error_msg());
-        }
-
-        draco.destroy(buffer);
-
-        var attributeData = {};
-
-        var compressedAttributes = parameters.compressedAttributes;
-        for (var attributeName in compressedAttributes) {
-            if (compressedAttributes.hasOwnProperty(attributeName)) {
-                var compressedAttribute = compressedAttributes[attributeName];
-                var dracoAttribute = dracoDecoder.GetAttributeByUniqueId(dracoGeometry, compressedAttribute);
-                attributeData[attributeName] = decodeAttribute(dracoGeometry, dracoDecoder, dracoAttribute);
-            }
-        }
-
-        var result = {
-            indexArray : decodeIndexArray(dracoGeometry, dracoDecoder),
-            attributeData : attributeData
-        };
-
-        draco.destroy(dracoGeometry);
-        draco.destroy(dracoDecoder);
-
-        return result;
-    }
-
-    function decode(parameters) {
-        if (when.defined(parameters.primitive)) {
-            return decodePrimitive(parameters);
-        }
-        return decodePointCloud(parameters);
-    }
-
-    function initWorker(dracoModule) {
-        draco = dracoModule;
-        self.onmessage = createTaskProcessorWorker(decode);
-        self.postMessage(true);
-    }
-
-    function decodeDraco(event) {
-        var data = event.data;
-
-        // Expect the first message to be to load a web assembly module
-        var wasmConfig = data.webAssemblyConfig;
-        if (when.defined(wasmConfig)) {
-            // Require and compile WebAssembly module, or use fallback if not supported
-            return require([wasmConfig.modulePath], function(dracoModule) {
-                if (when.defined(wasmConfig.wasmBinaryFile)) {
-                    if (!when.defined(dracoModule)) {
-                        dracoModule = self.DracoDecoderModule;
-                    }
-
-                    dracoModule(wasmConfig).then(function (compiledModule) {
-                        initWorker(compiledModule);
-                    });
-                } else {
-                    initWorker(dracoModule());
-                }
-            });
-        }
-    }
-
-    return decodeDraco;
-
-});
diff --git a/public/libs/Cesium/Workers/decodeGoogleEarthEnterprisePacket.js b/public/libs/Cesium/Workers/decodeGoogleEarthEnterprisePacket.js
deleted file mode 100644
index 3745435..0000000
--- a/public/libs/Cesium/Workers/decodeGoogleEarthEnterprisePacket.js
+++ /dev/null
@@ -1,473 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './RuntimeError-ba10bc3e', './createTaskProcessorWorker', './pako_inflate-8ea163f9'], function (when, Check, RuntimeError, createTaskProcessorWorker, pako_inflate) { 'use strict';
-
-    var compressedMagic = 0x7468dead;
-        var compressedMagicSwap = 0xadde6874;
-
-        /**
-         * Decodes data that is received from the Google Earth Enterprise server.
-         *
-         * @param {ArrayBuffer} key The key used during decoding.
-         * @param {ArrayBuffer} data The data to be decoded.
-         *
-         * @private
-         */
-        function decodeGoogleEarthEnterpriseData(key, data) {
-            if (decodeGoogleEarthEnterpriseData.passThroughDataForTesting) {
-                return data;
-            }
-
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.object('key', key);
-            Check.Check.typeOf.object('data', data);
-            //>>includeEnd('debug');
-
-            var keyLength = key.byteLength;
-            if (keyLength === 0 || (keyLength % 4) !== 0) {
-                throw new RuntimeError.RuntimeError('The length of key must be greater than 0 and a multiple of 4.');
-            }
-
-            var dataView = new DataView(data);
-            var magic = dataView.getUint32(0, true);
-            if (magic === compressedMagic || magic === compressedMagicSwap) {
-                // Occasionally packets don't come back encoded, so just return
-                return data;
-            }
-
-            var keyView = new DataView(key);
-
-            var dp = 0;
-            var dpend = data.byteLength;
-            var dpend64 = dpend - (dpend % 8);
-            var kpend = keyLength;
-            var kp;
-            var off = 8;
-
-            // This algorithm is intentionally asymmetric to make it more difficult to
-            // guess. Security through obscurity. :-(
-
-            // while we have a full uint64 (8 bytes) left to do
-            // assumes buffer is 64bit aligned (or processor doesn't care)
-            while (dp < dpend64) {
-                // rotate the key each time through by using the offets 16,0,8,16,0,8,...
-                off = (off + 8) % 24;
-                kp = off;
-
-                // run through one key length xor'ing one uint64 at a time
-                // then drop out to rotate the key for the next bit
-                while ((dp < dpend64) && (kp < kpend)) {
-                    dataView.setUint32(dp, dataView.getUint32(dp, true) ^ keyView.getUint32(kp, true), true);
-                    dataView.setUint32(dp + 4, dataView.getUint32(dp + 4, true) ^ keyView.getUint32(kp + 4, true), true);
-                    dp += 8;
-                    kp += 24;
-                }
-            }
-
-            // now the remaining 1 to 7 bytes
-            if (dp < dpend) {
-                if (kp >= kpend) {
-                    // rotate the key one last time (if necessary)
-                    off = (off + 8) % 24;
-                    kp = off;
-                }
-
-                while (dp < dpend) {
-                    dataView.setUint8(dp, dataView.getUint8(dp) ^ keyView.getUint8(kp));
-                    dp++;
-                    kp++;
-                }
-            }
-        }
-
-        decodeGoogleEarthEnterpriseData.passThroughDataForTesting = false;
-
-    /**
-         * @private
-         */
-        function isBitSet(bits, mask) {
-            return ((bits & mask) !== 0);
-        }
-
-    // Bitmask for checking tile properties
-        var childrenBitmasks = [0x01, 0x02, 0x04, 0x08];
-        var anyChildBitmask = 0x0F;
-        var cacheFlagBitmask = 0x10; // True if there is a child subtree
-        var imageBitmask = 0x40;
-        var terrainBitmask = 0x80;
-
-        /**
-         * Contains information about each tile from a Google Earth Enterprise server
-         *
-         * @param {Number} bits Bitmask that contains the type of data and available children for each tile.
-         * @param {Number} cnodeVersion Version of the request for subtree metadata.
-         * @param {Number} imageryVersion Version of the request for imagery tile.
-         * @param {Number} terrainVersion Version of the request for terrain tile.
-         * @param {Number} imageryProvider Id of imagery provider.
-         * @param {Number} terrainProvider Id of terrain provider.
-         *
-         * @private
-         */
-        function GoogleEarthEnterpriseTileInformation(bits, cnodeVersion, imageryVersion, terrainVersion, imageryProvider, terrainProvider) {
-            this._bits = bits;
-            this.cnodeVersion = cnodeVersion;
-            this.imageryVersion = imageryVersion;
-            this.terrainVersion = terrainVersion;
-            this.imageryProvider = imageryProvider;
-            this.terrainProvider = terrainProvider;
-            this.ancestorHasTerrain = false; // Set it later once we find its parent
-            this.terrainState = undefined;
-        }
-
-        /**
-         * Creates GoogleEarthEnterpriseTileInformation from an object
-         *
-         * @param {Object} info Object to be cloned
-         * @param {GoogleEarthEnterpriseTileInformation} [result] The object onto which to store the result.
-         * @returns {GoogleEarthEnterpriseTileInformation} The modified result parameter or a new GoogleEarthEnterpriseTileInformation instance if none was provided.
-         */
-        GoogleEarthEnterpriseTileInformation.clone = function(info, result) {
-            if (!when.defined(result)) {
-                result = new GoogleEarthEnterpriseTileInformation(info._bits, info.cnodeVersion, info.imageryVersion, info.terrainVersion,
-                    info.imageryProvider, info.terrainProvider);
-            } else {
-                result._bits = info._bits;
-                result.cnodeVersion = info.cnodeVersion;
-                result.imageryVersion = info.imageryVersion;
-                result.terrainVersion = info.terrainVersion;
-                result.imageryProvider = info.imageryProvider;
-                result.terrainProvider = info.terrainProvider;
-            }
-            result.ancestorHasTerrain = info.ancestorHasTerrain;
-            result.terrainState = info.terrainState;
-
-            return result;
-        };
-
-        /**
-         * Sets the parent for the tile
-         *
-         * @param {GoogleEarthEnterpriseTileInformation} parent Parent tile
-         */
-        GoogleEarthEnterpriseTileInformation.prototype.setParent = function(parent) {
-            this.ancestorHasTerrain = parent.ancestorHasTerrain || this.hasTerrain();
-        };
-
-        /**
-         * Gets whether a subtree is available
-         *
-         * @returns {Boolean} true if subtree is available, false otherwise.
-         */
-        GoogleEarthEnterpriseTileInformation.prototype.hasSubtree = function() {
-            return isBitSet(this._bits, cacheFlagBitmask);
-        };
-
-        /**
-         * Gets whether imagery is available
-         *
-         * @returns {Boolean} true if imagery is available, false otherwise.
-         */
-        GoogleEarthEnterpriseTileInformation.prototype.hasImagery = function() {
-            return isBitSet(this._bits, imageBitmask);
-        };
-
-        /**
-         * Gets whether terrain is available
-         *
-         * @returns {Boolean} true if terrain is available, false otherwise.
-         */
-        GoogleEarthEnterpriseTileInformation.prototype.hasTerrain = function() {
-            return isBitSet(this._bits, terrainBitmask);
-        };
-
-        /**
-         * Gets whether any children are present
-         *
-         * @returns {Boolean} true if any children are available, false otherwise.
-         */
-        GoogleEarthEnterpriseTileInformation.prototype.hasChildren = function() {
-            return isBitSet(this._bits, anyChildBitmask);
-        };
-
-        /**
-         * Gets whether a specified child is available
-         *
-         * @param {Number} index Index of child tile
-         *
-         * @returns {Boolean} true if child is available, false otherwise
-         */
-        GoogleEarthEnterpriseTileInformation.prototype.hasChild = function(index) {
-            return isBitSet(this._bits, childrenBitmasks[index]);
-        };
-
-        /**
-         * Gets bitmask containing children
-         *
-         * @returns {Number} Children bitmask
-         */
-        GoogleEarthEnterpriseTileInformation.prototype.getChildBitmask = function() {
-            return this._bits & anyChildBitmask;
-        };
-
-    // Datatype sizes
-    var sizeOfUint16 = Uint16Array.BYTES_PER_ELEMENT;
-    var sizeOfInt32 = Int32Array.BYTES_PER_ELEMENT;
-    var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT;
-
-    var Types = {
-        METADATA : 0,
-        TERRAIN : 1,
-        DBROOT : 2
-    };
-
-    Types.fromString = function(s) {
-        if (s === 'Metadata') {
-            return Types.METADATA;
-        } else if (s === 'Terrain') {
-            return Types.TERRAIN;
-        } else if (s === 'DbRoot') {
-            return Types.DBROOT;
-        }
-    };
-
-    function decodeGoogleEarthEnterprisePacket(parameters, transferableObjects) {
-        var type = Types.fromString(parameters.type);
-        var buffer = parameters.buffer;
-        decodeGoogleEarthEnterpriseData(parameters.key, buffer);
-
-        var uncompressedTerrain = uncompressPacket(buffer);
-        buffer = uncompressedTerrain.buffer;
-        var length = uncompressedTerrain.length;
-
-        switch (type) {
-            case Types.METADATA:
-                return processMetadata(buffer, length, parameters.quadKey);
-            case Types.TERRAIN:
-                return processTerrain(buffer, length, transferableObjects);
-            case Types.DBROOT:
-                transferableObjects.push(buffer);
-                return {
-                    buffer : buffer
-                };
-        }
-
-    }
-
-    var qtMagic = 32301;
-
-    function processMetadata(buffer, totalSize, quadKey) {
-        var dv = new DataView(buffer);
-        var offset = 0;
-        var magic = dv.getUint32(offset, true);
-        offset += sizeOfUint32;
-        if (magic !== qtMagic) {
-            throw new RuntimeError.RuntimeError('Invalid magic');
-        }
-
-        var dataTypeId = dv.getUint32(offset, true);
-        offset += sizeOfUint32;
-        if (dataTypeId !== 1) {
-            throw new RuntimeError.RuntimeError('Invalid data type. Must be 1 for QuadTreePacket');
-        }
-
-        // Tile format version
-        var quadVersion = dv.getUint32(offset, true);
-        offset += sizeOfUint32;
-        if (quadVersion !== 2) {
-            throw new RuntimeError.RuntimeError('Invalid QuadTreePacket version. Only version 2 is supported.');
-        }
-
-        var numInstances = dv.getInt32(offset, true);
-        offset += sizeOfInt32;
-
-        var dataInstanceSize = dv.getInt32(offset, true);
-        offset += sizeOfInt32;
-        if (dataInstanceSize !== 32) {
-            throw new RuntimeError.RuntimeError('Invalid instance size.');
-        }
-
-        var dataBufferOffset = dv.getInt32(offset, true);
-        offset += sizeOfInt32;
-
-        var dataBufferSize = dv.getInt32(offset, true);
-        offset += sizeOfInt32;
-
-        var metaBufferSize = dv.getInt32(offset, true);
-        offset += sizeOfInt32;
-
-        // Offset from beginning of packet (instances + current offset)
-        if (dataBufferOffset !== (numInstances * dataInstanceSize + offset)) {
-            throw new RuntimeError.RuntimeError('Invalid dataBufferOffset');
-        }
-
-        // Verify the packets is all there header + instances + dataBuffer + metaBuffer
-        if (dataBufferOffset + dataBufferSize + metaBufferSize !== totalSize) {
-            throw new RuntimeError.RuntimeError('Invalid packet offsets');
-        }
-
-        // Read all the instances
-        var instances = [];
-        for (var i = 0; i < numInstances; ++i) {
-            var bitfield = dv.getUint8(offset);
-            ++offset;
-
-            ++offset; // 2 byte align
-
-            var cnodeVersion = dv.getUint16(offset, true);
-            offset += sizeOfUint16;
-
-            var imageVersion = dv.getUint16(offset, true);
-            offset += sizeOfUint16;
-
-            var terrainVersion = dv.getUint16(offset, true);
-            offset += sizeOfUint16;
-
-            // Number of channels stored in the dataBuffer
-            offset += sizeOfUint16;
-
-            offset += sizeOfUint16; // 4 byte align
-
-            // Channel type offset into dataBuffer
-            offset += sizeOfInt32;
-
-            // Channel version offset into dataBuffer
-            offset += sizeOfInt32;
-
-            offset += 8; // Ignore image neighbors for now
-
-            // Data providers
-            var imageProvider = dv.getUint8(offset++);
-            var terrainProvider = dv.getUint8(offset++);
-            offset += sizeOfUint16; // 4 byte align
-
-            instances.push(new GoogleEarthEnterpriseTileInformation(bitfield, cnodeVersion,
-                imageVersion, terrainVersion, imageProvider, terrainProvider));
-        }
-
-        var tileInfo = [];
-        var index = 0;
-
-        function populateTiles(parentKey, parent, level) {
-            var isLeaf = false;
-            if (level === 4) {
-                if (parent.hasSubtree()) {
-                    return; // We have a subtree, so just return
-                }
-
-                isLeaf = true; // No subtree, so set all children to null
-            }
-            for (var i = 0; i < 4; ++i) {
-                var childKey = parentKey + i.toString();
-                if (isLeaf) {
-                    // No subtree so set all children to null
-                    tileInfo[childKey] = null;
-                } else if (level < 4) {
-                    // We are still in the middle of the subtree, so add child
-                    //  only if their bits are set, otherwise set child to null.
-                    if (!parent.hasChild(i)) {
-                        tileInfo[childKey] = null;
-                    } else {
-                        if (index === numInstances) {
-                            console.log('Incorrect number of instances');
-                            return;
-                        }
-
-                        var instance = instances[index++];
-                        tileInfo[childKey] = instance;
-                        populateTiles(childKey, instance, level + 1);
-                    }
-                }
-            }
-        }
-
-        var level = 0;
-        var root = instances[index++];
-        if (quadKey === '') {
-            // Root tile has data at its root and one less level
-            ++level;
-        } else {
-            tileInfo[quadKey] = root; // This will only contain the child bitmask
-        }
-
-        populateTiles(quadKey, root, level);
-
-        return tileInfo;
-    }
-
-    function processTerrain(buffer, totalSize, transferableObjects) {
-        var dv = new DataView(buffer);
-
-        var offset = 0;
-        var terrainTiles = [];
-        while (offset < totalSize) {
-            // Each tile is split into 4 parts
-            var tileStart = offset;
-            for (var quad = 0; quad < 4; ++quad) {
-                var size = dv.getUint32(offset, true);
-                offset += sizeOfUint32;
-                offset += size;
-            }
-            var tile = buffer.slice(tileStart, offset);
-            transferableObjects.push(tile);
-            terrainTiles.push(tile);
-        }
-
-        return terrainTiles;
-    }
-
-    var compressedMagic$1 = 0x7468dead;
-    var compressedMagicSwap$1 = 0xadde6874;
-
-    function uncompressPacket(data) {
-        // The layout of this decoded data is
-        // Magic Uint32
-        // Size Uint32
-        // [GZipped chunk of Size bytes]
-
-        // Pullout magic and verify we have the correct data
-        var dv = new DataView(data);
-        var offset = 0;
-        var magic = dv.getUint32(offset, true);
-        offset += sizeOfUint32;
-        if (magic !== compressedMagic$1 && magic !== compressedMagicSwap$1) {
-            throw new RuntimeError.RuntimeError('Invalid magic');
-        }
-
-        // Get the size of the compressed buffer - the endianness depends on which magic was used
-        var size = dv.getUint32(offset, (magic === compressedMagic$1));
-        offset += sizeOfUint32;
-
-        var compressedPacket = new Uint8Array(data, offset);
-        var uncompressedPacket = pako_inflate.pako.inflate(compressedPacket);
-
-        if (uncompressedPacket.length !== size) {
-            throw new RuntimeError.RuntimeError('Size of packet doesn\'t match header');
-        }
-
-        return uncompressedPacket;
-    }
-    var decodeGoogleEarthEnterprisePacket$1 = createTaskProcessorWorker(decodeGoogleEarthEnterprisePacket);
-
-    return decodeGoogleEarthEnterprisePacket$1;
-
-});
diff --git a/public/libs/Cesium/Workers/earcut-2.2.1-b404d9e6.js b/public/libs/Cesium/Workers/earcut-2.2.1-b404d9e6.js
deleted file mode 100644
index 181fbab..0000000
--- a/public/libs/Cesium/Workers/earcut-2.2.1-b404d9e6.js
+++ /dev/null
@@ -1,699 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports'], function (exports) { 'use strict';
-
-    function earcut(data, holeIndices, dim) {
-
-        dim = dim || 2;
-
-        var hasHoles = holeIndices && holeIndices.length,
-            outerLen = hasHoles ? holeIndices[0] * dim : data.length,
-            outerNode = linkedList(data, 0, outerLen, dim, true),
-            triangles = [];
-
-        if (!outerNode || outerNode.next === outerNode.prev) return triangles;
-
-        var minX, minY, maxX, maxY, x, y, invSize;
-
-        if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
-
-        // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
-        if (data.length > 80 * dim) {
-            minX = maxX = data[0];
-            minY = maxY = data[1];
-
-            for (var i = dim; i < outerLen; i += dim) {
-                x = data[i];
-                y = data[i + 1];
-                if (x < minX) minX = x;
-                if (y < minY) minY = y;
-                if (x > maxX) maxX = x;
-                if (y > maxY) maxY = y;
-            }
-
-            // minX, minY and invSize are later used to transform coords into integers for z-order calculation
-            invSize = Math.max(maxX - minX, maxY - minY);
-            invSize = invSize !== 0 ? 1 / invSize : 0;
-        }
-
-        earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
-
-        return triangles;
-    }
-
-    // create a circular doubly linked list from polygon points in the specified winding order
-    function linkedList(data, start, end, dim, clockwise) {
-        var i, last;
-
-        if (clockwise === (signedArea(data, start, end, dim) > 0)) {
-            for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
-        } else {
-            for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
-        }
-
-        if (last && equals(last, last.next)) {
-            removeNode(last);
-            last = last.next;
-        }
-
-        return last;
-    }
-
-    // eliminate colinear or duplicate points
-    function filterPoints(start, end) {
-        if (!start) return start;
-        if (!end) end = start;
-
-        var p = start,
-            again;
-        do {
-            again = false;
-
-            if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
-                removeNode(p);
-                p = end = p.prev;
-                if (p === p.next) break;
-                again = true;
-
-            } else {
-                p = p.next;
-            }
-        } while (again || p !== end);
-
-        return end;
-    }
-
-    // main ear slicing loop which triangulates a polygon (given as a linked list)
-    function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
-        if (!ear) return;
-
-        // interlink polygon nodes in z-order
-        if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
-
-        var stop = ear,
-            prev, next;
-
-        // iterate through ears, slicing them one by one
-        while (ear.prev !== ear.next) {
-            prev = ear.prev;
-            next = ear.next;
-
-            if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
-                // cut off the triangle
-                triangles.push(prev.i / dim);
-                triangles.push(ear.i / dim);
-                triangles.push(next.i / dim);
-
-                removeNode(ear);
-
-                // skipping the next vertex leads to less sliver triangles
-                ear = next.next;
-                stop = next.next;
-
-                continue;
-            }
-
-            ear = next;
-
-            // if we looped through the whole remaining polygon and can't find any more ears
-            if (ear === stop) {
-                // try filtering points and slicing again
-                if (!pass) {
-                    earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
-
-                // if this didn't work, try curing all small self-intersections locally
-                } else if (pass === 1) {
-                    ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
-                    earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
-
-                // as a last resort, try splitting the remaining polygon into two
-                } else if (pass === 2) {
-                    splitEarcut(ear, triangles, dim, minX, minY, invSize);
-                }
-
-                break;
-            }
-        }
-    }
-
-    // check whether a polygon node forms a valid ear with adjacent nodes
-    function isEar(ear) {
-        var a = ear.prev,
-            b = ear,
-            c = ear.next;
-
-        if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
-
-        // now make sure we don't have other points inside the potential ear
-        var p = ear.next.next;
-
-        while (p !== ear.prev) {
-            if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
-                area(p.prev, p, p.next) >= 0) return false;
-            p = p.next;
-        }
-
-        return true;
-    }
-
-    function isEarHashed(ear, minX, minY, invSize) {
-        var a = ear.prev,
-            b = ear,
-            c = ear.next;
-
-        if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
-
-        // triangle bbox; min & max are calculated like this for speed
-        var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
-            minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
-            maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
-            maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
-
-        // z-order range for the current triangle bbox;
-        var minZ = zOrder(minTX, minTY, minX, minY, invSize),
-            maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
-
-        var p = ear.prevZ,
-            n = ear.nextZ;
-
-        // look for points inside the triangle in both directions
-        while (p && p.z >= minZ && n && n.z <= maxZ) {
-            if (p !== ear.prev && p !== ear.next &&
-                pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
-                area(p.prev, p, p.next) >= 0) return false;
-            p = p.prevZ;
-
-            if (n !== ear.prev && n !== ear.next &&
-                pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
-                area(n.prev, n, n.next) >= 0) return false;
-            n = n.nextZ;
-        }
-
-        // look for remaining points in decreasing z-order
-        while (p && p.z >= minZ) {
-            if (p !== ear.prev && p !== ear.next &&
-                pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
-                area(p.prev, p, p.next) >= 0) return false;
-            p = p.prevZ;
-        }
-
-        // look for remaining points in increasing z-order
-        while (n && n.z <= maxZ) {
-            if (n !== ear.prev && n !== ear.next &&
-                pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
-                area(n.prev, n, n.next) >= 0) return false;
-            n = n.nextZ;
-        }
-
-        return true;
-    }
-
-    // go through all polygon nodes and cure small local self-intersections
-    function cureLocalIntersections(start, triangles, dim) {
-        var p = start;
-        do {
-            var a = p.prev,
-                b = p.next.next;
-
-            if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
-
-                triangles.push(a.i / dim);
-                triangles.push(p.i / dim);
-                triangles.push(b.i / dim);
-
-                // remove two nodes involved
-                removeNode(p);
-                removeNode(p.next);
-
-                p = start = b;
-            }
-            p = p.next;
-        } while (p !== start);
-
-        return filterPoints(p);
-    }
-
-    // try splitting polygon into two and triangulate them independently
-    function splitEarcut(start, triangles, dim, minX, minY, invSize) {
-        // look for a valid diagonal that divides the polygon into two
-        var a = start;
-        do {
-            var b = a.next.next;
-            while (b !== a.prev) {
-                if (a.i !== b.i && isValidDiagonal(a, b)) {
-                    // split the polygon in two by the diagonal
-                    var c = splitPolygon(a, b);
-
-                    // filter colinear points around the cuts
-                    a = filterPoints(a, a.next);
-                    c = filterPoints(c, c.next);
-
-                    // run earcut on each half
-                    earcutLinked(a, triangles, dim, minX, minY, invSize);
-                    earcutLinked(c, triangles, dim, minX, minY, invSize);
-                    return;
-                }
-                b = b.next;
-            }
-            a = a.next;
-        } while (a !== start);
-    }
-
-    // link every hole into the outer loop, producing a single-ring polygon without holes
-    function eliminateHoles(data, holeIndices, outerNode, dim) {
-        var queue = [],
-            i, len, start, end, list;
-
-        for (i = 0, len = holeIndices.length; i < len; i++) {
-            start = holeIndices[i] * dim;
-            end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
-            list = linkedList(data, start, end, dim, false);
-            if (list === list.next) list.steiner = true;
-            queue.push(getLeftmost(list));
-        }
-
-        queue.sort(compareX);
-
-        // process holes from left to right
-        for (i = 0; i < queue.length; i++) {
-            eliminateHole(queue[i], outerNode);
-            outerNode = filterPoints(outerNode, outerNode.next);
-        }
-
-        return outerNode;
-    }
-
-    function compareX(a, b) {
-        return a.x - b.x;
-    }
-
-    // find a bridge between vertices that connects hole with an outer ring and and link it
-    function eliminateHole(hole, outerNode) {
-        outerNode = findHoleBridge(hole, outerNode);
-        if (outerNode) {
-            var b = splitPolygon(outerNode, hole);
-            filterPoints(b, b.next);
-        }
-    }
-
-    // David Eberly's algorithm for finding a bridge between hole and outer polygon
-    function findHoleBridge(hole, outerNode) {
-        var p = outerNode,
-            hx = hole.x,
-            hy = hole.y,
-            qx = -Infinity,
-            m;
-
-        // find a segment intersected by a ray from the hole's leftmost point to the left;
-        // segment's endpoint with lesser x will be potential connection point
-        do {
-            if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
-                var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
-                if (x <= hx && x > qx) {
-                    qx = x;
-                    if (x === hx) {
-                        if (hy === p.y) return p;
-                        if (hy === p.next.y) return p.next;
-                    }
-                    m = p.x < p.next.x ? p : p.next;
-                }
-            }
-            p = p.next;
-        } while (p !== outerNode);
-
-        if (!m) return null;
-
-        if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint
-
-        // look for points inside the triangle of hole point, segment intersection and endpoint;
-        // if there are no points found, we have a valid connection;
-        // otherwise choose the point of the minimum angle with the ray as connection point
-
-        var stop = m,
-            mx = m.x,
-            my = m.y,
-            tanMin = Infinity,
-            tan;
-
-        p = m;
-
-        do {
-            if (hx >= p.x && p.x >= mx && hx !== p.x &&
-                    pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
-
-                tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
-
-                if (locallyInside(p, hole) &&
-                    (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {
-                    m = p;
-                    tanMin = tan;
-                }
-            }
-
-            p = p.next;
-        } while (p !== stop);
-
-        return m;
-    }
-
-    // whether sector in vertex m contains sector in vertex p in the same coordinates
-    function sectorContainsSector(m, p) {
-        return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
-    }
-
-    // interlink polygon nodes in z-order
-    function indexCurve(start, minX, minY, invSize) {
-        var p = start;
-        do {
-            if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);
-            p.prevZ = p.prev;
-            p.nextZ = p.next;
-            p = p.next;
-        } while (p !== start);
-
-        p.prevZ.nextZ = null;
-        p.prevZ = null;
-
-        sortLinked(p);
-    }
-
-    // Simon Tatham's linked list merge sort algorithm
-    // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
-    function sortLinked(list) {
-        var i, p, q, e, tail, numMerges, pSize, qSize,
-            inSize = 1;
-
-        do {
-            p = list;
-            list = null;
-            tail = null;
-            numMerges = 0;
-
-            while (p) {
-                numMerges++;
-                q = p;
-                pSize = 0;
-                for (i = 0; i < inSize; i++) {
-                    pSize++;
-                    q = q.nextZ;
-                    if (!q) break;
-                }
-                qSize = inSize;
-
-                while (pSize > 0 || (qSize > 0 && q)) {
-
-                    if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
-                        e = p;
-                        p = p.nextZ;
-                        pSize--;
-                    } else {
-                        e = q;
-                        q = q.nextZ;
-                        qSize--;
-                    }
-
-                    if (tail) tail.nextZ = e;
-                    else list = e;
-
-                    e.prevZ = tail;
-                    tail = e;
-                }
-
-                p = q;
-            }
-
-            tail.nextZ = null;
-            inSize *= 2;
-
-        } while (numMerges > 1);
-
-        return list;
-    }
-
-    // z-order of a point given coords and inverse of the longer side of data bbox
-    function zOrder(x, y, minX, minY, invSize) {
-        // coords are transformed into non-negative 15-bit integer range
-        x = 32767 * (x - minX) * invSize;
-        y = 32767 * (y - minY) * invSize;
-
-        x = (x | (x << 8)) & 0x00FF00FF;
-        x = (x | (x << 4)) & 0x0F0F0F0F;
-        x = (x | (x << 2)) & 0x33333333;
-        x = (x | (x << 1)) & 0x55555555;
-
-        y = (y | (y << 8)) & 0x00FF00FF;
-        y = (y | (y << 4)) & 0x0F0F0F0F;
-        y = (y | (y << 2)) & 0x33333333;
-        y = (y | (y << 1)) & 0x55555555;
-
-        return x | (y << 1);
-    }
-
-    // find the leftmost node of a polygon ring
-    function getLeftmost(start) {
-        var p = start,
-            leftmost = start;
-        do {
-            if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;
-            p = p.next;
-        } while (p !== start);
-
-        return leftmost;
-    }
-
-    // check if a point lies within a convex triangle
-    function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
-        return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
-               (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
-               (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
-    }
-
-    // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
-    function isValidDiagonal(a, b) {
-        return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges
-               (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
-                (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
-                equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
-    }
-
-    // signed area of a triangle
-    function area(p, q, r) {
-        return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
-    }
-
-    // check if two points are equal
-    function equals(p1, p2) {
-        return p1.x === p2.x && p1.y === p2.y;
-    }
-
-    // check if two segments intersect
-    function intersects(p1, q1, p2, q2) {
-        var o1 = sign(area(p1, q1, p2));
-        var o2 = sign(area(p1, q1, q2));
-        var o3 = sign(area(p2, q2, p1));
-        var o4 = sign(area(p2, q2, q1));
-
-        if (o1 !== o2 && o3 !== o4) return true; // general case
-
-        if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
-        if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
-        if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
-        if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
-
-        return false;
-    }
-
-    // for collinear points p, q, r, check if point q lies on segment pr
-    function onSegment(p, q, r) {
-        return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
-    }
-
-    function sign(num) {
-        return num > 0 ? 1 : num < 0 ? -1 : 0;
-    }
-
-    // check if a polygon diagonal intersects any polygon segments
-    function intersectsPolygon(a, b) {
-        var p = a;
-        do {
-            if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
-                    intersects(p, p.next, a, b)) return true;
-            p = p.next;
-        } while (p !== a);
-
-        return false;
-    }
-
-    // check if a polygon diagonal is locally inside the polygon
-    function locallyInside(a, b) {
-        return area(a.prev, a, a.next) < 0 ?
-            area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
-            area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
-    }
-
-    // check if the middle point of a polygon diagonal is inside the polygon
-    function middleInside(a, b) {
-        var p = a,
-            inside = false,
-            px = (a.x + b.x) / 2,
-            py = (a.y + b.y) / 2;
-        do {
-            if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
-                    (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
-                inside = !inside;
-            p = p.next;
-        } while (p !== a);
-
-        return inside;
-    }
-
-    // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
-    // if one belongs to the outer ring and another to a hole, it merges it into a single ring
-    function splitPolygon(a, b) {
-        var a2 = new Node(a.i, a.x, a.y),
-            b2 = new Node(b.i, b.x, b.y),
-            an = a.next,
-            bp = b.prev;
-
-        a.next = b;
-        b.prev = a;
-
-        a2.next = an;
-        an.prev = a2;
-
-        b2.next = a2;
-        a2.prev = b2;
-
-        bp.next = b2;
-        b2.prev = bp;
-
-        return b2;
-    }
-
-    // create a node and optionally link it with previous one (in a circular doubly linked list)
-    function insertNode(i, x, y, last) {
-        var p = new Node(i, x, y);
-
-        if (!last) {
-            p.prev = p;
-            p.next = p;
-
-        } else {
-            p.next = last.next;
-            p.prev = last;
-            last.next.prev = p;
-            last.next = p;
-        }
-        return p;
-    }
-
-    function removeNode(p) {
-        p.next.prev = p.prev;
-        p.prev.next = p.next;
-
-        if (p.prevZ) p.prevZ.nextZ = p.nextZ;
-        if (p.nextZ) p.nextZ.prevZ = p.prevZ;
-    }
-
-    function Node(i, x, y) {
-        // vertex index in coordinates array
-        this.i = i;
-
-        // vertex coordinates
-        this.x = x;
-        this.y = y;
-
-        // previous and next vertex nodes in a polygon ring
-        this.prev = null;
-        this.next = null;
-
-        // z-order curve value
-        this.z = null;
-
-        // previous and next nodes in z-order
-        this.prevZ = null;
-        this.nextZ = null;
-
-        // indicates whether this is a steiner point
-        this.steiner = false;
-    }
-
-    // return a percentage difference between the polygon area and its triangulation area;
-    // used to verify correctness of triangulation
-    earcut.deviation = function (data, holeIndices, dim, triangles) {
-        var hasHoles = holeIndices && holeIndices.length;
-        var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
-
-        var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
-        if (hasHoles) {
-            for (var i = 0, len = holeIndices.length; i < len; i++) {
-                var start = holeIndices[i] * dim;
-                var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
-                polygonArea -= Math.abs(signedArea(data, start, end, dim));
-            }
-        }
-
-        var trianglesArea = 0;
-        for (i = 0; i < triangles.length; i += 3) {
-            var a = triangles[i] * dim;
-            var b = triangles[i + 1] * dim;
-            var c = triangles[i + 2] * dim;
-            trianglesArea += Math.abs(
-                (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
-                (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
-        }
-
-        return polygonArea === 0 && trianglesArea === 0 ? 0 :
-            Math.abs((trianglesArea - polygonArea) / polygonArea);
-    };
-
-    function signedArea(data, start, end, dim) {
-        var sum = 0;
-        for (var i = start, j = end - dim; i < end; i += dim) {
-            sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
-            j = i;
-        }
-        return sum;
-    }
-
-    // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
-    earcut.flatten = function (data) {
-        var dim = data[0][0].length,
-            result = {vertices: [], holes: [], dimensions: dim},
-            holeIndex = 0;
-
-        for (var i = 0; i < data.length; i++) {
-            for (var j = 0; j < data[i].length; j++) {
-                for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
-            }
-            if (i > 0) {
-                holeIndex += data[i - 1].length;
-                result.holes.push(holeIndex);
-            }
-        }
-        return result;
-    };
-
-    exports.earcut = earcut;
-
-});
diff --git a/public/libs/Cesium/Workers/indexedDBWorker.js b/public/libs/Cesium/Workers/indexedDBWorker.js
deleted file mode 100644
index e743819..0000000
--- a/public/libs/Cesium/Workers/indexedDBWorker.js
+++ /dev/null
@@ -1,684 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './createTaskProcessorWorker'], function (when, createTaskProcessorWorker) { 'use strict';
-
-    /**
-         * @exports defined
-         *
-         * @param {*} value The object.
-         * @returns {Boolean} Returns true if the object is defined, returns false otherwise.
-         *
-         * @example
-         * if (Cesium.defined(positions)) {
-         *      doSomething();
-         * } else {
-         *      doSomethingElse();
-         * }
-         */
-        function defined(value) {
-            return value !== undefined && value !== null;
-        }
-
-    /**
-         * Constructs an exception object that is thrown due to a developer error, e.g., invalid argument,
-         * argument out of range, etc.  This exception should only be thrown during development;
-         * it usually indicates a bug in the calling code.  This exception should never be
-         * caught; instead the calling code should strive not to generate it.
-         * <br /><br />
-         * On the other hand, a {@link RuntimeError} indicates an exception that may
-         * be thrown at runtime, e.g., out of memory, that the calling code should be prepared
-         * to catch.
-         *
-         * @alias DeveloperError
-         * @constructor
-         * @extends Error
-         *
-         * @param {String} [message] The error message for this exception.
-         *
-         * @see RuntimeError
-         */
-        function DeveloperError(message) {
-            /**
-             * 'DeveloperError' indicating that this exception was thrown due to a developer error.
-             * @type {String}
-             * @readonly
-             */
-            this.name = 'DeveloperError';
-
-            /**
-             * The explanation for why this exception was thrown.
-             * @type {String}
-             * @readonly
-             */
-            this.message = message;
-
-            //Browsers such as IE don't have a stack property until you actually throw the error.
-            var stack;
-            try {
-                throw new Error();
-            } catch (e) {
-                stack = e.stack;
-            }
-
-            /**
-             * The stack trace of this exception, if available.
-             * @type {String}
-             * @readonly
-             */
-            this.stack = stack;
-        }
-
-        if (defined(Object.create)) {
-            DeveloperError.prototype = Object.create(Error.prototype);
-            DeveloperError.prototype.constructor = DeveloperError;
-        }
-
-        DeveloperError.prototype.toString = function() {
-            var str = this.name + ': ' + this.message;
-
-            if (defined(this.stack)) {
-                str += '\n' + this.stack.toString();
-            }
-
-            return str;
-        };
-
-        /**
-         * @private
-         */
-        DeveloperError.throwInstantiationError = function() {
-            throw new DeveloperError('This function defines an interface and should not be called directly.');
-        };
-
-    var DataStatus = {
-        NONE : 0,
-        STORING : 1,
-        STORED : 2,
-        FAILED : 3
-    };
-
-    function IndexedDBScheduler(options) {
-        if(!defined(options.name)){
-            throw new DeveloperError('options.name is required.');
-        }
-        var defer = when.when.defer();
-        this.dbname = options.name;
-        var request = indexedDB.open(this.dbname);
-
-        var that = this;
-        request.onsuccess = function (event) {
-            that.db = event.target.result;
-            that.version = that.db.version;
-
-            if (!defined(that.cachestatus)) {
-                that.cachestatus = {
-
-                };
-            }
-            defer.resolve(that);
-        };
-
-        request.onupgradeneeded = function (event) {
-            that.db = event.target.result;
-            that.version = that.db.version;
-            defer.resolve(that);
-        };
-
-        request.onerror = function (event) {
-            that.db = null;
-            defer.reject('create database fail, error code : ' + event.target.errorcode);
-        };
-
-        this.layer = options.layer || null;
-        this.storageType = options.storageType || "arrayBuffer";
-        this.creatingTable = false;
-        this.cachestatus = {};
-        return defer.promise;
-    }
-
-    IndexedDBScheduler.prototype.checkObjectStoreExit = function(storeName) {
-        if (!defined(this.db)) {
-            return false;
-        }
-
-        return this.db.objectStoreNames.contains(storeName);
-    };
-
-    IndexedDBScheduler.prototype.createObjectStore = function(storeName) {
-        var defer = when.when.defer();
-
-        //防止多个请求同时创建同一张表
-        if (!this.creatingTable) {
-            if (this.db.objectStoreNames.contains(storeName)) {
-                defer.reject(false);
-                return defer.promise;
-            }
-            this.creatingTable = true;
-
-            var that = this;
-
-            //只能在onupgradeneeded方法中创建新表,所以需要用更高版本打开数据库触发更新
-            var version = parseInt(that.db.version);
-            that.db.close();
-            var secondRequest = indexedDB.open(that.dbname, version + 1);
-            secondRequest.onupgradeneeded  = function(e) {
-                var database = e.target.result;
-                that.db = database;
-                var objectStore = database.createObjectStore(storeName, { keyPath : 'id'});
-                if (defined(objectStore)) {
-                    objectStore.createIndex('value', 'value', { unique : false});
-                    that.creatingTable = false;
-                    //初始化表的缓存状态
-                    if (!defined(that.cachestatus)) {
-                        that.cachestatus = {};
-                    }
-
-                    that.cachestatus[storeName] = {
-
-                    };
-
-                    //这边创建成功表后直接使用会出现各种奇怪的问题,索性关闭数据库后再打开
-                    that.db.close();
-                    var thirdRequest = indexedDB.open(that.dbname);
-
-                    thirdRequest.onsuccess = function(e) {
-                        var database = e.target.result;
-                        that.db = database;
-                        defer.resolve(true);
-                    };
-                } else {
-                    that.creatingTable = false;
-                    defer.reject(false);
-                }
-            };
-
-            secondRequest.onsuccess = function(e) {
-                e.target.result.close();
-                defer.resolve(true);
-            };
-
-            secondRequest.onerror = function(e) {
-                that.creatingTable = false;
-                defer.reject(false);
-            };
-        } else {
-            defer.reject(false);
-        }
-
-        return defer.promise;
-    };
-
-    IndexedDBScheduler.prototype.putElementInDB = function (table, key, data, objectArray) {
-        var defer = when.when.defer();
-
-        if (!defined(this.db)) {
-            defer.reject(false);
-            return defer.promise;
-        }
-
-        var objectStore;
-        var that = this;
-
-        //先检查缓存,如果已经写了就不去写了
-        if (defined(that.cachestatus[table]) && !defined(objectArray)) {
-            if (defined(that.cachestatus[table][key])) {
-                if (that.cachestatus[table][key] === DataStatus.STORING || that.cachestatus[table][key] === DataStatus.STORED) {
-                    defer.resolve(false);
-                    return defer.promise;
-                }
-            }
-        }
-
-        //没有表,去创建指定名称的表
-        if (!this.db.objectStoreNames.contains(table)) {
-            this.createObjectStore(table).then(function(success) {
-                var transaction = that.db.transaction([table], "readwrite");
-                objectStore = transaction.objectStore(table);
-
-                if (defined(objectArray)) {
-                    for (var i = 0, len = objectArray.length; i < len; i++) {
-                        objectStore.add({ id : objectArray[i].key, value : objectArray[i].value});
-                    }
-
-                    defer.resolve(true);
-                } else {
-                    var request = objectStore.add({ id : key, value : data});
-                    request.onsuccess = function (event) {
-                        defer.resolve(true);
-                    };
-
-                    request.onerror = function (event) {
-                        defer.reject(false);
-                    };
-                }
-            }, function(error) {
-                defer.reject(false);
-            });
-        } else {
-            if (!defined(that.cachestatus[table])) {
-                that.cachestatus[table] = {
-
-                };
-            }
-
-            //打开表并添加对应数据
-            var transaction;
-            try {
-                transaction = this.db.transaction([table], "readwrite");
-            } catch (e) {
-                defer.reject(null);
-                return defer.promise;
-            }
-
-            objectStore = transaction.objectStore(table);
-
-            if (defined(objectArray)) {
-                if (objectArray instanceof Array) {
-                    for (var i = 0, len = objectArray.length; i < len; i++) {
-                        if (that.cachestatus[table][objectArray[i].key] !== DataStatus.STORED) {
-                            objectStore.add({ id : objectArray[i].key, value : objectArray[i].value});
-                            that.cachestatus[table][objectArray[i].key] = DataStatus.STORED;
-                        }
-                    }
-                    defer.resolve(true);
-                } else {
-                    for (var key in objectArray) {
-                        if (isNaN(key * 1)) {
-                            continue;
-                        }
-                        objectStore.add({ id : key, value : objectArray[key]});
-                    }
-                    defer.resolve(true);
-                }
-                
-            } else if (key.length > 0 && data.length > 0) {
-                for (var i = 0, len = key.length; i < len; i++) {
-                    if (that.cachestatus[table][key[i]] !== DataStatus.STORED) {
-                        objectStore.add({ id : key[i], value : data[i]});
-                        that.cachestatus[table][key[i]] = DataStatus.STORED;
-                    }
-                }
-
-                transaction.oncomplete = function(e) {
-                    defer.resolve(true);
-                };
-
-                transaction.onerror = function(e) {
-                    defer.reject(false);
-                };
-            } else {
-                var request = objectStore.add({ id : key, value : data});
-                that.cachestatus[table][key] = DataStatus.STORING;
-                request.onsuccess = function (event) {
-                    that.cachestatus[table][key] = DataStatus.STORED;
-                    defer.resolve(true);
-                };
-
-                request.onerror = function (event) {
-                    that.cachestatus[table][key] = DataStatus.FAILED;
-                    defer.reject(false);
-                };
-            }
-        }
-
-        return defer.promise;
-    };
-
-    IndexedDBScheduler.prototype.getRangeFromDB = function(table, idRange) {
-        var defer = when.when.defer();
-
-        if (!defined(this.db)) {
-            return null;
-        }
-
-        if (!this.db.objectStoreNames.contains(table)) {
-            return null;
-        }
-
-        var transaction;
-        try {
-            transaction = this.db.transaction([table]);
-        } catch (e) {
-            defer.reject(null);
-            return defer.promise;
-        }
-
-        var objectStore;
-        try {
-            objectStore = transaction.objectStore(table);
-        } catch (e) {
-            defer.reject(null);
-        }
-
-        var request = objectStore.openCursor(IDBKeyRange.bound(idRange[0], idRange[1]));
-
-        var rs = [];
-        request.onsuccess = function(event) {
-            var cursor = event.target.result;
-            if (!defined(cursor)) {
-                defer.resolve(rs);
-            } else {
-                rs.push(cursor.value);
-                cursor.continue();
-            }
-        };
-
-        request.onerror = function(event) {
-            defer.reject(null);
-        };
-
-        return defer.promise;
-    };
-
-    IndexedDBScheduler.prototype.getElementFromDB = function (table, key) {
-        var defer = when.when.defer();
-
-        if (!defined(this.db)) {
-            return null;
-        }
-
-        if (!this.db.objectStoreNames.contains(table)) {
-            return null;
-        }
-
-        var transaction;
-        try {
-            transaction = this.db.transaction([table]);
-        } catch (e) {
-            defer.reject(null);
-            return defer.promise;
-        }
-
-        var objectStore;
-        try {
-            objectStore = transaction.objectStore(table);
-        } catch (e) {
-            defer.reject(null);
-        }
-
-        var request = objectStore.get(key);
-
-        request.onsuccess = function(event) {
-            if (!defined(event.target.result)) {
-                defer.reject(null);
-                return;
-            }
-
-            defer.resolve(event.target.result.value);
-        };
-
-        request.onerror = function(event) {
-            defer.reject(null);
-        };
-
-        return defer.promise;
-    };
-
-    IndexedDBScheduler.prototype.getAllElementFromDB = function (table) {
-        var defer = when.when.defer();
-
-        if (!defined(this.db)) {
-            return null;
-        }
-
-        if (!this.db.objectStoreNames.contains(table)) {
-            return null;
-        }
-
-        var transaction;
-        if (this.transaction != null) {
-            transaction = this.transaction;
-        } else {
-            try {
-                transaction = this.db.transaction([table]);
-            } catch (e) {
-                defer.reject(null);
-                return defer.promise;
-            }
-        }
-        
-
-        var objectStore;
-        try {
-            objectStore = transaction.objectStore(table);
-        } catch (e) {
-            defer.reject(null);
-        }
-
-        var request = objectStore.getAll();
-
-        request.onsuccess = function(event) {
-            if (!defined(event.target.result)) {
-                defer.reject(null);
-                return;
-            }
-
-            defer.resolve(event.target.result);
-        };
-
-        request.onerror = function(event) {
-            defer.reject(null);
-        };
-
-        return defer.promise;
-    };
-
-    IndexedDBScheduler.prototype.updateElementInDB = function (table, key, value, append) {
-        var defer = when.when.defer();
-
-        if (!defined(this.db)) {
-            defer.resolve(false);
-            return defer.promise;
-        }
-
-        if (!this.db.objectStoreNames.contains(table)) {
-            defer.resolve(false);
-            return defer.promise;
-        }
-
-        var transaction = this.db.transaction([table], "readwrite");
-        var objectStore;
-        try {
-            objectStore = transaction.objectStore(table);
-        } catch (e) {
-            defer.resolve(false);
-        }
-
-        var request = objectStore.get(key);
-
-        request.onsuccess = function(event) {
-            var data = event.target.result;
-            if (!defined(data)) {
-                data = {
-                    id : key
-                };
-            }
-
-            if (append === true) {
-                data.value = Object.assign(data.value, value);
-            } else {
-                data.value = value;
-            }
-            
-
-            var requestUpdate = objectStore.put(data);
-            requestUpdate.onsuccess = function(event) {
-                defer.resolve(true);
-            };
-
-            requestUpdate.onerror = function(event) {
-                defer.resolve(false);
-            };
-        };
-
-        request.onerror = function(event) {
-            defer.resolve(false);
-        };
-
-        return defer.promise;
-    };
-
-    IndexedDBScheduler.prototype.removeElementFromDB = function (table, key) {
-        var defer = when.when.defer();
-
-        if (!defined(this.db)) {
-            defer.resolve(false);
-            return defer.promise;
-        }
-
-        if (!this.db.objectStoreNames.contains(table)) {
-            defer.resolve(false);
-            return defer.promise;
-        }
-
-        var transaction = this.db.transaction([table], "readwrite");
-        var objectStore;
-        try {
-            objectStore = transaction.objectStore(table);
-        } catch (e) {
-            defer.resolve(false);
-        }
-
-        var request = objectStore.delete(key);
-
-        request.onerror = function(event) {
-            defer.resolve(false);
-        };
-
-        request.onsuccess = function(event) {
-            defer.resolve(true);
-        };
-
-        return defer.promise;
-    };
-
-    IndexedDBScheduler.prototype.clear = function(table) {
-        var defer = when.when.defer();
-
-        if (!defined(this.db)) {
-            defer.resolve(false);
-            return defer.promise;
-        }
-
-        if (!this.db.objectStoreNames.contains(table)) {
-            defer.resolve(false);
-            return defer.promise;
-        }
-
-        var transaction = this.db.transaction([table], "readwrite");
-        var objectStore;
-        try {
-            objectStore = transaction.objectStore(table);
-        } catch (e) {
-            defer.resolve(false);
-        }
-
-        var request = objectStore.clear();
-
-        request.onerror = function(event) {
-            defer.resolve(false);
-        };
-
-        request.onsuccess = function(event) {
-            defer.resolve(true);
-        };
-
-        return defer.promise;
-    };
-
-    var cache = {};
-
-    function indexedDBWorker(parameters, transferableObjects) {
-        var blob = parameters.blob;
-        var key = parameters.key;
-        var tablename = parameters.tablename;
-        var dbname = parameters.dbname;
-        var cacheSize = parameters.cacheSize || 100;
-
-        var cahceKey = dbname + tablename;
-        if (typeof cache[cahceKey] === "undefined") {
-            cache[cahceKey] = {
-                cache: [],
-                creatingDB: false,
-                scheduler: null,
-                creatingTable: false
-            };
-        } else {
-            cache[cahceKey].cache.push({
-                key: key,
-                value: blob
-            });
-        }
-
-
-        if (cache[cahceKey].cache.length > cacheSize) {
-            putElementInDB(dbname, tablename, cache[cahceKey]);
-        }
-    }
-
-    function putElementInDB(dbname, tablename, cache) {
-        if (cache.scheduler === null) {
-            if (!cache.creatingDB) {
-                cache.creatingDB = true;
-                new IndexedDBScheduler({ name: dbname }).then(function (result) {
-                    cache.creatingDB = false;
-                    cache.scheduler = result;
-                    if (!result.checkObjectStoreExit(tablename)) {
-                        if (!cache.creatingTable) {
-                            cache.creatingTable = true;
-                            result.createObjectStore(tablename).then(function () {
-                                cache.creatingTable = false;
-                                result.putElementInDB(tablename, null, null, cache.cache);
-                                cache.cache = [];
-                            });
-                        }
-                    } else {
-                        result.putElementInDB(tablename, null, null, cache.cache);
-                        cache.cache = [];
-                    }
-                });
-            }
-
-        } else {
-            if (!cache.scheduler.checkObjectStoreExit(tablename)) {
-                if (!cache.creatingTable) {
-                    cache.creatingTable = true;
-                    cache.scheduler.createObjectStore(tablename).then(function () {
-                        cache.creatingTable = false;
-                        cache.scheduler.putElementInDB(tablename, null, null, cache.cache);
-                        cache.cache = [];
-                    });
-                }
-            } else {
-                cache.scheduler.putElementInDB(tablename, null, null, cache.cache);
-                cache.cache = [];
-            }
-        }
-
-    }
-
-    var indexedDBWorker$1 = createTaskProcessorWorker(indexedDBWorker);
-
-    return indexedDBWorker$1;
-
-});
diff --git a/public/libs/Cesium/Workers/pako_inflate-8ea163f9.js b/public/libs/Cesium/Workers/pako_inflate-8ea163f9.js
deleted file mode 100644
index 945ec25..0000000
--- a/public/libs/Cesium/Workers/pako_inflate-8ea163f9.js
+++ /dev/null
@@ -1,3141 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports'], function (exports) { 'use strict';
-
-    var tmp = {};
-
-    /* pako 1.0.4 nodeca/pako */(function(f){tmp = f();})(function(){return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r);}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-
-
-        var TYPED_OK =  (typeof Uint8Array !== 'undefined') &&
-                        (typeof Uint16Array !== 'undefined') &&
-                        (typeof Int32Array !== 'undefined');
-
-
-        exports.assign = function (obj /*from1, from2, from3, ...*/) {
-            var sources = Array.prototype.slice.call(arguments, 1);
-            while (sources.length) {
-                var source = sources.shift();
-                if (!source) { continue; }
-
-                if (typeof source !== 'object') {
-                    throw new TypeError(source + 'must be non-object');
-                }
-
-                for (var p in source) {
-                    if (source.hasOwnProperty(p)) {
-                        obj[p] = source[p];
-                    }
-                }
-            }
-
-            return obj;
-        };
-
-
-    // reduce buffer size, avoiding mem copy
-        exports.shrinkBuf = function (buf, size) {
-            if (buf.length === size) { return buf; }
-            if (buf.subarray) { return buf.subarray(0, size); }
-            buf.length = size;
-            return buf;
-        };
-
-
-        var fnTyped = {
-            arraySet: function (dest, src, src_offs, len, dest_offs) {
-                if (src.subarray && dest.subarray) {
-                    dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
-                    return;
-                }
-                // Fallback to ordinary array
-                for (var i = 0; i < len; i++) {
-                    dest[dest_offs + i] = src[src_offs + i];
-                }
-            },
-            // Join array of chunks to single array.
-            flattenChunks: function (chunks) {
-                var i, l, len, pos, chunk, result;
-
-                // calculate data length
-                len = 0;
-                for (i = 0, l = chunks.length; i < l; i++) {
-                    len += chunks[i].length;
-                }
-
-                // join chunks
-                result = new Uint8Array(len);
-                pos = 0;
-                for (i = 0, l = chunks.length; i < l; i++) {
-                    chunk = chunks[i];
-                    result.set(chunk, pos);
-                    pos += chunk.length;
-                }
-
-                return result;
-            }
-        };
-
-        var fnUntyped = {
-            arraySet: function (dest, src, src_offs, len, dest_offs) {
-                for (var i = 0; i < len; i++) {
-                    dest[dest_offs + i] = src[src_offs + i];
-                }
-            },
-            // Join array of chunks to single array.
-            flattenChunks: function (chunks) {
-                return [].concat.apply([], chunks);
-            }
-        };
-
-
-    // Enable/Disable typed arrays use, for testing
-    //
-        exports.setTyped = function (on) {
-            if (on) {
-                exports.Buf8  = Uint8Array;
-                exports.Buf16 = Uint16Array;
-                exports.Buf32 = Int32Array;
-                exports.assign(exports, fnTyped);
-            } else {
-                exports.Buf8  = Array;
-                exports.Buf16 = Array;
-                exports.Buf32 = Array;
-                exports.assign(exports, fnUntyped);
-            }
-        };
-
-        exports.setTyped(TYPED_OK);
-
-    },{}],2:[function(require,module,exports){
-
-
-        var utils = require('./common');
-
-
-    // Quick check if we can use fast array to bin string conversion
-    //
-    // - apply(Array) can fail on Android 2.2
-    // - apply(Uint8Array) can fail on iOS 5.1 Safary
-    //
-        var STR_APPLY_OK = true;
-        var STR_APPLY_UIA_OK = true;
-
-        try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }
-        try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }
-
-
-    // Table with utf8 lengths (calculated by first byte of sequence)
-    // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
-    // because max possible codepoint is 0x10ffff
-        var _utf8len = new utils.Buf8(256);
-        for (var q = 0; q < 256; q++) {
-            _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
-        }
-        _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start
-
-
-    // convert string to array (typed, when possible)
-        exports.string2buf = function (str) {
-            var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
-
-            // count binary size
-            for (m_pos = 0; m_pos < str_len; m_pos++) {
-                c = str.charCodeAt(m_pos);
-                if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
-                    c2 = str.charCodeAt(m_pos + 1);
-                    if ((c2 & 0xfc00) === 0xdc00) {
-                        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
-                        m_pos++;
-                    }
-                }
-                buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
-            }
-
-            // allocate buffer
-            buf = new utils.Buf8(buf_len);
-
-            // convert
-            for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
-                c = str.charCodeAt(m_pos);
-                if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
-                    c2 = str.charCodeAt(m_pos + 1);
-                    if ((c2 & 0xfc00) === 0xdc00) {
-                        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
-                        m_pos++;
-                    }
-                }
-                if (c < 0x80) {
-                    /* one byte */
-                    buf[i++] = c;
-                } else if (c < 0x800) {
-                    /* two bytes */
-                    buf[i++] = 0xC0 | (c >>> 6);
-                    buf[i++] = 0x80 | (c & 0x3f);
-                } else if (c < 0x10000) {
-                    /* three bytes */
-                    buf[i++] = 0xE0 | (c >>> 12);
-                    buf[i++] = 0x80 | (c >>> 6 & 0x3f);
-                    buf[i++] = 0x80 | (c & 0x3f);
-                } else {
-                    /* four bytes */
-                    buf[i++] = 0xf0 | (c >>> 18);
-                    buf[i++] = 0x80 | (c >>> 12 & 0x3f);
-                    buf[i++] = 0x80 | (c >>> 6 & 0x3f);
-                    buf[i++] = 0x80 | (c & 0x3f);
-                }
-            }
-
-            return buf;
-        };
-
-    // Helper (used in 2 places)
-        function buf2binstring(buf, len) {
-            // use fallback for big arrays to avoid stack overflow
-            if (len < 65537) {
-                if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
-                    return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
-                }
-            }
-
-            var result = '';
-            for (var i = 0; i < len; i++) {
-                result += String.fromCharCode(buf[i]);
-            }
-            return result;
-        }
-
-
-    // Convert byte array to binary string
-        exports.buf2binstring = function (buf) {
-            return buf2binstring(buf, buf.length);
-        };
-
-
-    // Convert binary string (typed, when possible)
-        exports.binstring2buf = function (str) {
-            var buf = new utils.Buf8(str.length);
-            for (var i = 0, len = buf.length; i < len; i++) {
-                buf[i] = str.charCodeAt(i);
-            }
-            return buf;
-        };
-
-
-    // convert array to string
-        exports.buf2string = function (buf, max) {
-            var i, out, c, c_len;
-            var len = max || buf.length;
-
-            // Reserve max possible length (2 words per char)
-            // NB: by unknown reasons, Array is significantly faster for
-            //     String.fromCharCode.apply than Uint16Array.
-            var utf16buf = new Array(len * 2);
-
-            for (out = 0, i = 0; i < len;) {
-                c = buf[i++];
-                // quick process ascii
-                if (c < 0x80) { utf16buf[out++] = c; continue; }
-
-                c_len = _utf8len[c];
-                // skip 5 & 6 byte codes
-                if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }
-
-                // apply mask on first byte
-                c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
-                // join the rest
-                while (c_len > 1 && i < len) {
-                    c = (c << 6) | (buf[i++] & 0x3f);
-                    c_len--;
-                }
-
-                // terminated by end of string?
-                if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
-
-                if (c < 0x10000) {
-                    utf16buf[out++] = c;
-                } else {
-                    c -= 0x10000;
-                    utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
-                    utf16buf[out++] = 0xdc00 | (c & 0x3ff);
-                }
-            }
-
-            return buf2binstring(utf16buf, out);
-        };
-
-
-    // Calculate max possible position in utf8 buffer,
-    // that will not break sequence. If that's not possible
-    // - (very small limits) return max size as is.
-    //
-    // buf[] - utf8 bytes array
-    // max   - length limit (mandatory);
-        exports.utf8border = function (buf, max) {
-            var pos;
-
-            max = max || buf.length;
-            if (max > buf.length) { max = buf.length; }
-
-            // go back from last position, until start of sequence found
-            pos = max - 1;
-            while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
-
-            // Fuckup - very small and broken sequence,
-            // return max, because we should return something anyway.
-            if (pos < 0) { return max; }
-
-            // If we came to start of buffer - that means vuffer is too small,
-            // return max too.
-            if (pos === 0) { return max; }
-
-            return (pos + _utf8len[buf[pos]] > max) ? pos : max;
-        };
-
-    },{"./common":1}],3:[function(require,module,exports){
-
-    // Note: adler32 takes 12% for level 0 and 2% for level 6.
-    // It doesn't worth to make additional optimizationa as in original.
-    // Small size is preferable.
-
-        function adler32(adler, buf, len, pos) {
-            var s1 = (adler & 0xffff) |0,
-                s2 = ((adler >>> 16) & 0xffff) |0,
-                n = 0;
-
-            while (len !== 0) {
-                // Set limit ~ twice less than 5552, to keep
-                // s2 in 31-bits, because we force signed ints.
-                // in other case %= will fail.
-                n = len > 2000 ? 2000 : len;
-                len -= n;
-
-                do {
-                    s1 = (s1 + buf[pos++]) |0;
-                    s2 = (s2 + s1) |0;
-                } while (--n);
-
-                s1 %= 65521;
-                s2 %= 65521;
-            }
-
-            return (s1 | (s2 << 16)) |0;
-        }
-
-
-        module.exports = adler32;
-
-    },{}],4:[function(require,module,exports){
-
-
-        module.exports = {
-
-            /* Allowed flush values; see deflate() and inflate() below for details */
-            Z_NO_FLUSH:         0,
-            Z_PARTIAL_FLUSH:    1,
-            Z_SYNC_FLUSH:       2,
-            Z_FULL_FLUSH:       3,
-            Z_FINISH:           4,
-            Z_BLOCK:            5,
-            Z_TREES:            6,
-
-            /* Return codes for the compression/decompression functions. Negative values
-             * are errors, positive values are used for special but normal events.
-             */
-            Z_OK:               0,
-            Z_STREAM_END:       1,
-            Z_NEED_DICT:        2,
-            Z_ERRNO:           -1,
-            Z_STREAM_ERROR:    -2,
-            Z_DATA_ERROR:      -3,
-            //Z_MEM_ERROR:     -4,
-            Z_BUF_ERROR:       -5,
-            //Z_VERSION_ERROR: -6,
-
-            /* compression levels */
-            Z_NO_COMPRESSION:         0,
-            Z_BEST_SPEED:             1,
-            Z_BEST_COMPRESSION:       9,
-            Z_DEFAULT_COMPRESSION:   -1,
-
-
-            Z_FILTERED:               1,
-            Z_HUFFMAN_ONLY:           2,
-            Z_RLE:                    3,
-            Z_FIXED:                  4,
-            Z_DEFAULT_STRATEGY:       0,
-
-            /* Possible values of the data_type field (though see inflate()) */
-            Z_BINARY:                 0,
-            Z_TEXT:                   1,
-            //Z_ASCII:                1, // = Z_TEXT (deprecated)
-            Z_UNKNOWN:                2,
-
-            /* The deflate compression method */
-            Z_DEFLATED:               8
-            //Z_NULL:                 null // Use -1 or null inline, depending on var type
-        };
-
-    },{}],5:[function(require,module,exports){
-
-    // Note: we can't get significant speed boost here.
-    // So write code to minimize size - no pregenerated tables
-    // and array tools dependencies.
-
-
-    // Use ordinary array, since untyped makes no boost here
-        function makeTable() {
-            var c, table = [];
-
-            for (var n = 0; n < 256; n++) {
-                c = n;
-                for (var k = 0; k < 8; k++) {
-                    c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
-                }
-                table[n] = c;
-            }
-
-            return table;
-        }
-
-    // Create table on load. Just 255 signed longs. Not a problem.
-        var crcTable = makeTable();
-
-
-        function crc32(crc, buf, len, pos) {
-            var t = crcTable,
-                end = pos + len;
-
-            crc ^= -1;
-
-            for (var i = pos; i < end; i++) {
-                crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
-            }
-
-            return (crc ^ (-1)); // >>> 0;
-        }
-
-
-        module.exports = crc32;
-
-    },{}],6:[function(require,module,exports){
-
-
-        function GZheader() {
-            /* true if compressed data believed to be text */
-            this.text       = 0;
-            /* modification time */
-            this.time       = 0;
-            /* extra flags (not used when writing a gzip file) */
-            this.xflags     = 0;
-            /* operating system */
-            this.os         = 0;
-            /* pointer to extra field or Z_NULL if none */
-            this.extra      = null;
-            /* extra field length (valid if extra != Z_NULL) */
-            this.extra_len  = 0; // Actually, we don't need it in JS,
-                                 // but leave for few code modifications
-
-            //
-            // Setup limits is not necessary because in js we should not preallocate memory
-            // for inflate use constant limit in 65536 bytes
-            //
-
-            /* space at extra (only when reading header) */
-            // this.extra_max  = 0;
-            /* pointer to zero-terminated file name or Z_NULL */
-            this.name       = '';
-            /* space at name (only when reading header) */
-            // this.name_max   = 0;
-            /* pointer to zero-terminated comment or Z_NULL */
-            this.comment    = '';
-            /* space at comment (only when reading header) */
-            // this.comm_max   = 0;
-            /* true if there was or will be a header crc */
-            this.hcrc       = 0;
-            /* true when done reading gzip header (not used when writing a gzip file) */
-            this.done       = false;
-        }
-
-        module.exports = GZheader;
-
-    },{}],7:[function(require,module,exports){
-
-    // See state defs from inflate.js
-        var BAD = 30;       /* got a data error -- remain here until reset */
-        var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
-
-        /*
-         Decode literal, length, and distance codes and write out the resulting
-         literal and match bytes until either not enough input or output is
-         available, an end-of-block is encountered, or a data error is encountered.
-         When large enough input and output buffers are supplied to inflate(), for
-         example, a 16K input buffer and a 64K output buffer, more than 95% of the
-         inflate execution time is spent in this routine.
-
-         Entry assumptions:
-
-         state.mode === LEN
-         strm.avail_in >= 6
-         strm.avail_out >= 258
-         start >= strm.avail_out
-         state.bits < 8
-
-         On return, state.mode is one of:
-
-         LEN -- ran out of enough output space or enough available input
-         TYPE -- reached end of block code, inflate() to interpret next block
-         BAD -- error in block data
-
-         Notes:
-
-         - The maximum input bits used by a length/distance pair is 15 bits for the
-         length code, 5 bits for the length extra, 15 bits for the distance code,
-         and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
-         Therefore if strm.avail_in >= 6, then there is enough input to avoid
-         checking for available input while decoding.
-
-         - The maximum bytes that a single length/distance pair can output is 258
-         bytes, which is the maximum length that can be coded.  inflate_fast()
-         requires strm.avail_out >= 258 for each loop to avoid checking for
-         output space.
-         */
-        module.exports = function inflate_fast(strm, start) {
-            var state;
-            var _in;                    /* local strm.input */
-            var last;                   /* have enough input while in < last */
-            var _out;                   /* local strm.output */
-            var beg;                    /* inflate()'s initial strm.output */
-            var end;                    /* while out < end, enough space available */
-    //#ifdef INFLATE_STRICT
-            var dmax;                   /* maximum distance from zlib header */
-    //#endif
-            var wsize;                  /* window size or zero if not using window */
-            var whave;                  /* valid bytes in the window */
-            var wnext;                  /* window write index */
-            // Use `s_window` instead `window`, avoid conflict with instrumentation tools
-            var s_window;               /* allocated sliding window, if wsize != 0 */
-            var hold;                   /* local strm.hold */
-            var bits;                   /* local strm.bits */
-            var lcode;                  /* local strm.lencode */
-            var dcode;                  /* local strm.distcode */
-            var lmask;                  /* mask for first level of length codes */
-            var dmask;                  /* mask for first level of distance codes */
-            var here;                   /* retrieved table entry */
-            var op;                     /* code bits, operation, extra bits, or */
-            /*  window position, window bytes to copy */
-            var len;                    /* match length, unused bytes */
-            var dist;                   /* match distance */
-            var from;                   /* where to copy match from */
-            var from_source;
-
-
-            var input, output; // JS specific, because we have no pointers
-
-            /* copy state to local variables */
-            state = strm.state;
-            //here = state.here;
-            _in = strm.next_in;
-            input = strm.input;
-            last = _in + (strm.avail_in - 5);
-            _out = strm.next_out;
-            output = strm.output;
-            beg = _out - (start - strm.avail_out);
-            end = _out + (strm.avail_out - 257);
-    //#ifdef INFLATE_STRICT
-            dmax = state.dmax;
-    //#endif
-            wsize = state.wsize;
-            whave = state.whave;
-            wnext = state.wnext;
-            s_window = state.window;
-            hold = state.hold;
-            bits = state.bits;
-            lcode = state.lencode;
-            dcode = state.distcode;
-            lmask = (1 << state.lenbits) - 1;
-            dmask = (1 << state.distbits) - 1;
-
-
-            /* decode literals and length/distances until end-of-block or not enough
-             input data or output space */
-
-            top:
-                do {
-                    if (bits < 15) {
-                        hold += input[_in++] << bits;
-                        bits += 8;
-                        hold += input[_in++] << bits;
-                        bits += 8;
-                    }
-
-                    here = lcode[hold & lmask];
-
-                    dolen:
-                        for (;;) { // Goto emulation
-                            op = here >>> 24/*here.bits*/;
-                            hold >>>= op;
-                            bits -= op;
-                            op = (here >>> 16) & 0xff/*here.op*/;
-                            if (op === 0) {                          /* literal */
-                                //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
-                                //        "inflate:         literal '%c'\n" :
-                                //        "inflate:         literal 0x%02x\n", here.val));
-                                output[_out++] = here & 0xffff/*here.val*/;
-                            }
-                            else if (op & 16) {                     /* length base */
-                                len = here & 0xffff/*here.val*/;
-                                op &= 15;                           /* number of extra bits */
-                                if (op) {
-                                    if (bits < op) {
-                                        hold += input[_in++] << bits;
-                                        bits += 8;
-                                    }
-                                    len += hold & ((1 << op) - 1);
-                                    hold >>>= op;
-                                    bits -= op;
-                                }
-                                //Tracevv((stderr, "inflate:         length %u\n", len));
-                                if (bits < 15) {
-                                    hold += input[_in++] << bits;
-                                    bits += 8;
-                                    hold += input[_in++] << bits;
-                                    bits += 8;
-                                }
-                                here = dcode[hold & dmask];
-
-                                dodist:
-                                    for (;;) { // goto emulation
-                                        op = here >>> 24/*here.bits*/;
-                                        hold >>>= op;
-                                        bits -= op;
-                                        op = (here >>> 16) & 0xff/*here.op*/;
-
-                                        if (op & 16) {                      /* distance base */
-                                            dist = here & 0xffff/*here.val*/;
-                                            op &= 15;                       /* number of extra bits */
-                                            if (bits < op) {
-                                                hold += input[_in++] << bits;
-                                                bits += 8;
-                                                if (bits < op) {
-                                                    hold += input[_in++] << bits;
-                                                    bits += 8;
-                                                }
-                                            }
-                                            dist += hold & ((1 << op) - 1);
-    //#ifdef INFLATE_STRICT
-                                            if (dist > dmax) {
-                                                strm.msg = 'invalid distance too far back';
-                                                state.mode = BAD;
-                                                break top;
-                                            }
-    //#endif
-                                            hold >>>= op;
-                                            bits -= op;
-                                            //Tracevv((stderr, "inflate:         distance %u\n", dist));
-                                            op = _out - beg;                /* max distance in output */
-                                            if (dist > op) {                /* see if copy from window */
-                                                op = dist - op;               /* distance back in window */
-                                                if (op > whave) {
-                                                    if (state.sane) {
-                                                        strm.msg = 'invalid distance too far back';
-                                                        state.mode = BAD;
-                                                        break top;
-                                                    }
-
-    // (!) This block is disabled in zlib defailts,
-    // don't enable it for binary compatibility
-    //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
-    //                if (len <= op - whave) {
-    //                  do {
-    //                    output[_out++] = 0;
-    //                  } while (--len);
-    //                  continue top;
-    //                }
-    //                len -= op - whave;
-    //                do {
-    //                  output[_out++] = 0;
-    //                } while (--op > whave);
-    //                if (op === 0) {
-    //                  from = _out - dist;
-    //                  do {
-    //                    output[_out++] = output[from++];
-    //                  } while (--len);
-    //                  continue top;
-    //                }
-    //#endif
-                                                }
-                                                from = 0; // window index
-                                                from_source = s_window;
-                                                if (wnext === 0) {           /* very common case */
-                                                    from += wsize - op;
-                                                    if (op < len) {         /* some from window */
-                                                        len -= op;
-                                                        do {
-                                                            output[_out++] = s_window[from++];
-                                                        } while (--op);
-                                                        from = _out - dist;  /* rest from output */
-                                                        from_source = output;
-                                                    }
-                                                }
-                                                else if (wnext < op) {      /* wrap around window */
-                                                    from += wsize + wnext - op;
-                                                    op -= wnext;
-                                                    if (op < len) {         /* some from end of window */
-                                                        len -= op;
-                                                        do {
-                                                            output[_out++] = s_window[from++];
-                                                        } while (--op);
-                                                        from = 0;
-                                                        if (wnext < len) {  /* some from start of window */
-                                                            op = wnext;
-                                                            len -= op;
-                                                            do {
-                                                                output[_out++] = s_window[from++];
-                                                            } while (--op);
-                                                            from = _out - dist;      /* rest from output */
-                                                            from_source = output;
-                                                        }
-                                                    }
-                                                }
-                                                else {                      /* contiguous in window */
-                                                    from += wnext - op;
-                                                    if (op < len) {         /* some from window */
-                                                        len -= op;
-                                                        do {
-                                                            output[_out++] = s_window[from++];
-                                                        } while (--op);
-                                                        from = _out - dist;  /* rest from output */
-                                                        from_source = output;
-                                                    }
-                                                }
-                                                while (len > 2) {
-                                                    output[_out++] = from_source[from++];
-                                                    output[_out++] = from_source[from++];
-                                                    output[_out++] = from_source[from++];
-                                                    len -= 3;
-                                                }
-                                                if (len) {
-                                                    output[_out++] = from_source[from++];
-                                                    if (len > 1) {
-                                                        output[_out++] = from_source[from++];
-                                                    }
-                                                }
-                                            }
-                                            else {
-                                                from = _out - dist;          /* copy direct from output */
-                                                do {                        /* minimum length is three */
-                                                    output[_out++] = output[from++];
-                                                    output[_out++] = output[from++];
-                                                    output[_out++] = output[from++];
-                                                    len -= 3;
-                                                } while (len > 2);
-                                                if (len) {
-                                                    output[_out++] = output[from++];
-                                                    if (len > 1) {
-                                                        output[_out++] = output[from++];
-                                                    }
-                                                }
-                                            }
-                                        }
-                                        else if ((op & 64) === 0) {          /* 2nd level distance code */
-                                            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
-                                            continue dodist;
-                                        }
-                                        else {
-                                            strm.msg = 'invalid distance code';
-                                            state.mode = BAD;
-                                            break top;
-                                        }
-
-                                        break; // need to emulate goto via "continue"
-                                    }
-                            }
-                            else if ((op & 64) === 0) {              /* 2nd level length code */
-                                here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
-                                continue dolen;
-                            }
-                            else if (op & 32) {                     /* end-of-block */
-                                //Tracevv((stderr, "inflate:         end of block\n"));
-                                state.mode = TYPE;
-                                break top;
-                            }
-                            else {
-                                strm.msg = 'invalid literal/length code';
-                                state.mode = BAD;
-                                break top;
-                            }
-
-                            break; // need to emulate goto via "continue"
-                        }
-                } while (_in < last && _out < end);
-
-            /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
-            len = bits >> 3;
-            _in -= len;
-            bits -= len << 3;
-            hold &= (1 << bits) - 1;
-
-            /* update state and return */
-            strm.next_in = _in;
-            strm.next_out = _out;
-            strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
-            strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
-            state.hold = hold;
-            state.bits = bits;
-            return;
-        };
-
-    },{}],8:[function(require,module,exports){
-
-
-        var utils         = require('../utils/common');
-        var adler32       = require('./adler32');
-        var crc32         = require('./crc32');
-        var inflate_fast  = require('./inffast');
-        var inflate_table = require('./inftrees');
-
-        var CODES = 0;
-        var LENS = 1;
-        var DISTS = 2;
-
-        /* Public constants ==========================================================*/
-        /* ===========================================================================*/
-
-
-        /* Allowed flush values; see deflate() and inflate() below for details */
-    //var Z_NO_FLUSH      = 0;
-    //var Z_PARTIAL_FLUSH = 1;
-    //var Z_SYNC_FLUSH    = 2;
-    //var Z_FULL_FLUSH    = 3;
-        var Z_FINISH        = 4;
-        var Z_BLOCK         = 5;
-        var Z_TREES         = 6;
-
-
-        /* Return codes for the compression/decompression functions. Negative values
-         * are errors, positive values are used for special but normal events.
-         */
-        var Z_OK            = 0;
-        var Z_STREAM_END    = 1;
-        var Z_NEED_DICT     = 2;
-    //var Z_ERRNO         = -1;
-        var Z_STREAM_ERROR  = -2;
-        var Z_DATA_ERROR    = -3;
-        var Z_MEM_ERROR     = -4;
-        var Z_BUF_ERROR     = -5;
-    //var Z_VERSION_ERROR = -6;
-
-        /* The deflate compression method */
-        var Z_DEFLATED  = 8;
-
-
-        /* STATES ====================================================================*/
-        /* ===========================================================================*/
-
-
-        var    HEAD = 1;       /* i: waiting for magic header */
-        var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
-        var    TIME = 3;       /* i: waiting for modification time (gzip) */
-        var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
-        var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
-        var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
-        var    NAME = 7;       /* i: waiting for end of file name (gzip) */
-        var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
-        var    HCRC = 9;       /* i: waiting for header crc (gzip) */
-        var    DICTID = 10;    /* i: waiting for dictionary check value */
-        var    DICT = 11;      /* waiting for inflateSetDictionary() call */
-        var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
-        var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
-        var        STORED = 14;    /* i: waiting for stored size (length and complement) */
-        var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
-        var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
-        var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
-        var        LENLENS = 18;   /* i: waiting for code length code lengths */
-        var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
-        var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
-        var            LEN = 21;       /* i: waiting for length/lit/eob code */
-        var            LENEXT = 22;    /* i: waiting for length extra bits */
-        var            DIST = 23;      /* i: waiting for distance code */
-        var            DISTEXT = 24;   /* i: waiting for distance extra bits */
-        var            MATCH = 25;     /* o: waiting for output space to copy string */
-        var            LIT = 26;       /* o: waiting for output space to write literal */
-        var    CHECK = 27;     /* i: waiting for 32-bit check value */
-        var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
-        var    DONE = 29;      /* finished check, done -- remain here until reset */
-        var    BAD = 30;       /* got a data error -- remain here until reset */
-        var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
-        var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
-
-        /* ===========================================================================*/
-
-
-
-        var ENOUGH_LENS = 852;
-        var ENOUGH_DISTS = 592;
-    //var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
-
-        var MAX_WBITS = 15;
-        /* 32K LZ77 window */
-        var DEF_WBITS = MAX_WBITS;
-
-
-        function zswap32(q) {
-            return  (((q >>> 24) & 0xff) +
-                     ((q >>> 8) & 0xff00) +
-                     ((q & 0xff00) << 8) +
-                     ((q & 0xff) << 24));
-        }
-
-
-        function InflateState() {
-            this.mode = 0;             /* current inflate mode */
-            this.last = false;          /* true if processing last block */
-            this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
-            this.havedict = false;      /* true if dictionary provided */
-            this.flags = 0;             /* gzip header method and flags (0 if zlib) */
-            this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
-            this.check = 0;             /* protected copy of check value */
-            this.total = 0;             /* protected copy of output count */
-            // TODO: may be {}
-            this.head = null;           /* where to save gzip header information */
-
-            /* sliding window */
-            this.wbits = 0;             /* log base 2 of requested window size */
-            this.wsize = 0;             /* window size or zero if not using window */
-            this.whave = 0;             /* valid bytes in the window */
-            this.wnext = 0;             /* window write index */
-            this.window = null;         /* allocated sliding window, if needed */
-
-            /* bit accumulator */
-            this.hold = 0;              /* input bit accumulator */
-            this.bits = 0;              /* number of bits in "in" */
-
-            /* for string and stored block copying */
-            this.length = 0;            /* literal or length of data to copy */
-            this.offset = 0;            /* distance back to copy string from */
-
-            /* for table and code decoding */
-            this.extra = 0;             /* extra bits needed */
-
-            /* fixed and dynamic code tables */
-            this.lencode = null;          /* starting table for length/literal codes */
-            this.distcode = null;         /* starting table for distance codes */
-            this.lenbits = 0;           /* index bits for lencode */
-            this.distbits = 0;          /* index bits for distcode */
-
-            /* dynamic table building */
-            this.ncode = 0;             /* number of code length code lengths */
-            this.nlen = 0;              /* number of length code lengths */
-            this.ndist = 0;             /* number of distance code lengths */
-            this.have = 0;              /* number of code lengths in lens[] */
-            this.next = null;              /* next available space in codes[] */
-
-            this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
-            this.work = new utils.Buf16(288); /* work area for code table building */
-
-            /*
-             because we don't have pointers in js, we use lencode and distcode directly
-             as buffers so we don't need codes
-             */
-            //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
-            this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
-            this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
-            this.sane = 0;                   /* if false, allow invalid distance too far */
-            this.back = 0;                   /* bits back of last unprocessed length/lit */
-            this.was = 0;                    /* initial length of match */
-        }
-
-        function inflateResetKeep(strm) {
-            var state;
-
-            if (!strm || !strm.state) { return Z_STREAM_ERROR; }
-            state = strm.state;
-            strm.total_in = strm.total_out = state.total = 0;
-            strm.msg = ''; /*Z_NULL*/
-            if (state.wrap) {       /* to support ill-conceived Java test suite */
-                strm.adler = state.wrap & 1;
-            }
-            state.mode = HEAD;
-            state.last = 0;
-            state.havedict = 0;
-            state.dmax = 32768;
-            state.head = null/*Z_NULL*/;
-            state.hold = 0;
-            state.bits = 0;
-            //state.lencode = state.distcode = state.next = state.codes;
-            state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
-            state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
-
-            state.sane = 1;
-            state.back = -1;
-            //Tracev((stderr, "inflate: reset\n"));
-            return Z_OK;
-        }
-
-        function inflateReset(strm) {
-            var state;
-
-            if (!strm || !strm.state) { return Z_STREAM_ERROR; }
-            state = strm.state;
-            state.wsize = 0;
-            state.whave = 0;
-            state.wnext = 0;
-            return inflateResetKeep(strm);
-
-        }
-
-        function inflateReset2(strm, windowBits) {
-            var wrap;
-            var state;
-
-            /* get the state */
-            if (!strm || !strm.state) { return Z_STREAM_ERROR; }
-            state = strm.state;
-
-            /* extract wrap request from windowBits parameter */
-            if (windowBits < 0) {
-                wrap = 0;
-                windowBits = -windowBits;
-            }
-            else {
-                wrap = (windowBits >> 4) + 1;
-                if (windowBits < 48) {
-                    windowBits &= 15;
-                }
-            }
-
-            /* set number of window bits, free window if different */
-            if (windowBits && (windowBits < 8 || windowBits > 15)) {
-                return Z_STREAM_ERROR;
-            }
-            if (state.window !== null && state.wbits !== windowBits) {
-                state.window = null;
-            }
-
-            /* update state and reset the rest of it */
-            state.wrap = wrap;
-            state.wbits = windowBits;
-            return inflateReset(strm);
-        }
-
-        function inflateInit2(strm, windowBits) {
-            var ret;
-            var state;
-
-            if (!strm) { return Z_STREAM_ERROR; }
-            //strm.msg = Z_NULL;                 /* in case we return an error */
-
-            state = new InflateState();
-
-            //if (state === Z_NULL) return Z_MEM_ERROR;
-            //Tracev((stderr, "inflate: allocated\n"));
-            strm.state = state;
-            state.window = null/*Z_NULL*/;
-            ret = inflateReset2(strm, windowBits);
-            if (ret !== Z_OK) {
-                strm.state = null/*Z_NULL*/;
-            }
-            return ret;
-        }
-
-        function inflateInit(strm) {
-            return inflateInit2(strm, DEF_WBITS);
-        }
-
-
-        /*
-         Return state with length and distance decoding tables and index sizes set to
-         fixed code decoding.  Normally this returns fixed tables from inffixed.h.
-         If BUILDFIXED is defined, then instead this routine builds the tables the
-         first time it's called, and returns those tables the first time and
-         thereafter.  This reduces the size of the code by about 2K bytes, in
-         exchange for a little execution time.  However, BUILDFIXED should not be
-         used for threaded applications, since the rewriting of the tables and virgin
-         may not be thread-safe.
-         */
-        var virgin = true;
-
-        var lenfix, distfix; // We have no pointers in JS, so keep tables separate
-
-        function fixedtables(state) {
-            /* build fixed huffman tables if first call (may not be thread safe) */
-            if (virgin) {
-                var sym;
-
-                lenfix = new utils.Buf32(512);
-                distfix = new utils.Buf32(32);
-
-                /* literal/length table */
-                sym = 0;
-                while (sym < 144) { state.lens[sym++] = 8; }
-                while (sym < 256) { state.lens[sym++] = 9; }
-                while (sym < 280) { state.lens[sym++] = 7; }
-                while (sym < 288) { state.lens[sym++] = 8; }
-
-                inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });
-
-                /* distance table */
-                sym = 0;
-                while (sym < 32) { state.lens[sym++] = 5; }
-
-                inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });
-
-                /* do this just once */
-                virgin = false;
-            }
-
-            state.lencode = lenfix;
-            state.lenbits = 9;
-            state.distcode = distfix;
-            state.distbits = 5;
-        }
-
-
-        /*
-         Update the window with the last wsize (normally 32K) bytes written before
-         returning.  If window does not exist yet, create it.  This is only called
-         when a window is already in use, or when output has been written during this
-         inflate call, but the end of the deflate stream has not been reached yet.
-         It is also called to create a window for dictionary data when a dictionary
-         is loaded.
-
-         Providing output buffers larger than 32K to inflate() should provide a speed
-         advantage, since only the last 32K of output is copied to the sliding window
-         upon return from inflate(), and since all distances after the first 32K of
-         output will fall in the output data, making match copies simpler and faster.
-         The advantage may be dependent on the size of the processor's data caches.
-         */
-        function updatewindow(strm, src, end, copy) {
-            var dist;
-            var state = strm.state;
-
-            /* if it hasn't been done already, allocate space for the window */
-            if (state.window === null) {
-                state.wsize = 1 << state.wbits;
-                state.wnext = 0;
-                state.whave = 0;
-
-                state.window = new utils.Buf8(state.wsize);
-            }
-
-            /* copy state->wsize or less output bytes into the circular window */
-            if (copy >= state.wsize) {
-                utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
-                state.wnext = 0;
-                state.whave = state.wsize;
-            }
-            else {
-                dist = state.wsize - state.wnext;
-                if (dist > copy) {
-                    dist = copy;
-                }
-                //zmemcpy(state->window + state->wnext, end - copy, dist);
-                utils.arraySet(state.window, src, end - copy, dist, state.wnext);
-                copy -= dist;
-                if (copy) {
-                    //zmemcpy(state->window, end - copy, copy);
-                    utils.arraySet(state.window, src, end - copy, copy, 0);
-                    state.wnext = copy;
-                    state.whave = state.wsize;
-                }
-                else {
-                    state.wnext += dist;
-                    if (state.wnext === state.wsize) { state.wnext = 0; }
-                    if (state.whave < state.wsize) { state.whave += dist; }
-                }
-            }
-            return 0;
-        }
-
-        function inflate(strm, flush) {
-            var state;
-            var input, output;          // input/output buffers
-            var next;                   /* next input INDEX */
-            var put;                    /* next output INDEX */
-            var have, left;             /* available input and output */
-            var hold;                   /* bit buffer */
-            var bits;                   /* bits in bit buffer */
-            var _in, _out;              /* save starting available input and output */
-            var copy;                   /* number of stored or match bytes to copy */
-            var from;                   /* where to copy match bytes from */
-            var from_source;
-            var here = 0;               /* current decoding table entry */
-            var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
-            //var last;                   /* parent table entry */
-            var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
-            var len;                    /* length to copy for repeats, bits to drop */
-            var ret;                    /* return code */
-            var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
-            var opts;
-
-            var n; // temporary var for NEED_BITS
-
-            var order = /* permutation of code lengths */
-                [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
-
-
-            if (!strm || !strm.state || !strm.output ||
-                (!strm.input && strm.avail_in !== 0)) {
-                return Z_STREAM_ERROR;
-            }
-
-            state = strm.state;
-            if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
-
-
-            //--- LOAD() ---
-            put = strm.next_out;
-            output = strm.output;
-            left = strm.avail_out;
-            next = strm.next_in;
-            input = strm.input;
-            have = strm.avail_in;
-            hold = state.hold;
-            bits = state.bits;
-            //---
-
-            _in = have;
-            _out = left;
-            ret = Z_OK;
-
-            inf_leave: // goto emulation
-                for (;;) {
-                    switch (state.mode) {
-                        case HEAD:
-                            if (state.wrap === 0) {
-                                state.mode = TYPEDO;
-                                break;
-                            }
-                            //=== NEEDBITS(16);
-                            while (bits < 16) {
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                            }
-                            //===//
-                            if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
-                                state.check = 0/*crc32(0L, Z_NULL, 0)*/;
-                                //=== CRC2(state.check, hold);
-                                hbuf[0] = hold & 0xff;
-                                hbuf[1] = (hold >>> 8) & 0xff;
-                                state.check = crc32(state.check, hbuf, 2, 0);
-                                //===//
-
-                                //=== INITBITS();
-                                hold = 0;
-                                bits = 0;
-                                //===//
-                                state.mode = FLAGS;
-                                break;
-                            }
-                            state.flags = 0;           /* expect zlib header */
-                            if (state.head) {
-                                state.head.done = false;
-                            }
-                            if (!(state.wrap & 1) ||   /* check if zlib header allowed */
-                                (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
-                                strm.msg = 'incorrect header check';
-                                state.mode = BAD;
-                                break;
-                            }
-                            if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
-                                strm.msg = 'unknown compression method';
-                                state.mode = BAD;
-                                break;
-                            }
-                            //--- DROPBITS(4) ---//
-                            hold >>>= 4;
-                            bits -= 4;
-                            //---//
-                            len = (hold & 0x0f)/*BITS(4)*/ + 8;
-                            if (state.wbits === 0) {
-                                state.wbits = len;
-                            }
-                            else if (len > state.wbits) {
-                                strm.msg = 'invalid window size';
-                                state.mode = BAD;
-                                break;
-                            }
-                            state.dmax = 1 << len;
-                            //Tracev((stderr, "inflate:   zlib header ok\n"));
-                            strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
-                            state.mode = hold & 0x200 ? DICTID : TYPE;
-                            //=== INITBITS();
-                            hold = 0;
-                            bits = 0;
-                            //===//
-                            break;
-                        case FLAGS:
-                            //=== NEEDBITS(16); */
-                            while (bits < 16) {
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                            }
-                            //===//
-                            state.flags = hold;
-                            if ((state.flags & 0xff) !== Z_DEFLATED) {
-                                strm.msg = 'unknown compression method';
-                                state.mode = BAD;
-                                break;
-                            }
-                            if (state.flags & 0xe000) {
-                                strm.msg = 'unknown header flags set';
-                                state.mode = BAD;
-                                break;
-                            }
-                            if (state.head) {
-                                state.head.text = ((hold >> 8) & 1);
-                            }
-                            if (state.flags & 0x0200) {
-                                //=== CRC2(state.check, hold);
-                                hbuf[0] = hold & 0xff;
-                                hbuf[1] = (hold >>> 8) & 0xff;
-                                state.check = crc32(state.check, hbuf, 2, 0);
-                                //===//
-                            }
-                            //=== INITBITS();
-                            hold = 0;
-                            bits = 0;
-                            //===//
-                            state.mode = TIME;
-                        /* falls through */
-                        case TIME:
-                            //=== NEEDBITS(32); */
-                            while (bits < 32) {
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                            }
-                            //===//
-                            if (state.head) {
-                                state.head.time = hold;
-                            }
-                            if (state.flags & 0x0200) {
-                                //=== CRC4(state.check, hold)
-                                hbuf[0] = hold & 0xff;
-                                hbuf[1] = (hold >>> 8) & 0xff;
-                                hbuf[2] = (hold >>> 16) & 0xff;
-                                hbuf[3] = (hold >>> 24) & 0xff;
-                                state.check = crc32(state.check, hbuf, 4, 0);
-                                //===
-                            }
-                            //=== INITBITS();
-                            hold = 0;
-                            bits = 0;
-                            //===//
-                            state.mode = OS;
-                        /* falls through */
-                        case OS:
-                            //=== NEEDBITS(16); */
-                            while (bits < 16) {
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                            }
-                            //===//
-                            if (state.head) {
-                                state.head.xflags = (hold & 0xff);
-                                state.head.os = (hold >> 8);
-                            }
-                            if (state.flags & 0x0200) {
-                                //=== CRC2(state.check, hold);
-                                hbuf[0] = hold & 0xff;
-                                hbuf[1] = (hold >>> 8) & 0xff;
-                                state.check = crc32(state.check, hbuf, 2, 0);
-                                //===//
-                            }
-                            //=== INITBITS();
-                            hold = 0;
-                            bits = 0;
-                            //===//
-                            state.mode = EXLEN;
-                        /* falls through */
-                        case EXLEN:
-                            if (state.flags & 0x0400) {
-                                //=== NEEDBITS(16); */
-                                while (bits < 16) {
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    hold += input[next++] << bits;
-                                    bits += 8;
-                                }
-                                //===//
-                                state.length = hold;
-                                if (state.head) {
-                                    state.head.extra_len = hold;
-                                }
-                                if (state.flags & 0x0200) {
-                                    //=== CRC2(state.check, hold);
-                                    hbuf[0] = hold & 0xff;
-                                    hbuf[1] = (hold >>> 8) & 0xff;
-                                    state.check = crc32(state.check, hbuf, 2, 0);
-                                    //===//
-                                }
-                                //=== INITBITS();
-                                hold = 0;
-                                bits = 0;
-                                //===//
-                            }
-                            else if (state.head) {
-                                state.head.extra = null/*Z_NULL*/;
-                            }
-                            state.mode = EXTRA;
-                        /* falls through */
-                        case EXTRA:
-                            if (state.flags & 0x0400) {
-                                copy = state.length;
-                                if (copy > have) { copy = have; }
-                                if (copy) {
-                                    if (state.head) {
-                                        len = state.head.extra_len - state.length;
-                                        if (!state.head.extra) {
-                                            // Use untyped array for more conveniend processing later
-                                            state.head.extra = new Array(state.head.extra_len);
-                                        }
-                                        utils.arraySet(
-                                            state.head.extra,
-                                            input,
-                                            next,
-                                            // extra field is limited to 65536 bytes
-                                            // - no need for additional size check
-                                            copy,
-                                            /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
-                                            len
-                                        );
-                                        //zmemcpy(state.head.extra + len, next,
-                                        //        len + copy > state.head.extra_max ?
-                                        //        state.head.extra_max - len : copy);
-                                    }
-                                    if (state.flags & 0x0200) {
-                                        state.check = crc32(state.check, input, copy, next);
-                                    }
-                                    have -= copy;
-                                    next += copy;
-                                    state.length -= copy;
-                                }
-                                if (state.length) { break inf_leave; }
-                            }
-                            state.length = 0;
-                            state.mode = NAME;
-                        /* falls through */
-                        case NAME:
-                            if (state.flags & 0x0800) {
-                                if (have === 0) { break inf_leave; }
-                                copy = 0;
-                                do {
-                                    // TODO: 2 or 1 bytes?
-                                    len = input[next + copy++];
-                                    /* use constant limit because in js we should not preallocate memory */
-                                    if (state.head && len &&
-                                        (state.length < 65536 /*state.head.name_max*/)) {
-                                        state.head.name += String.fromCharCode(len);
-                                    }
-                                } while (len && copy < have);
-
-                                if (state.flags & 0x0200) {
-                                    state.check = crc32(state.check, input, copy, next);
-                                }
-                                have -= copy;
-                                next += copy;
-                                if (len) { break inf_leave; }
-                            }
-                            else if (state.head) {
-                                state.head.name = null;
-                            }
-                            state.length = 0;
-                            state.mode = COMMENT;
-                        /* falls through */
-                        case COMMENT:
-                            if (state.flags & 0x1000) {
-                                if (have === 0) { break inf_leave; }
-                                copy = 0;
-                                do {
-                                    len = input[next + copy++];
-                                    /* use constant limit because in js we should not preallocate memory */
-                                    if (state.head && len &&
-                                        (state.length < 65536 /*state.head.comm_max*/)) {
-                                        state.head.comment += String.fromCharCode(len);
-                                    }
-                                } while (len && copy < have);
-                                if (state.flags & 0x0200) {
-                                    state.check = crc32(state.check, input, copy, next);
-                                }
-                                have -= copy;
-                                next += copy;
-                                if (len) { break inf_leave; }
-                            }
-                            else if (state.head) {
-                                state.head.comment = null;
-                            }
-                            state.mode = HCRC;
-                        /* falls through */
-                        case HCRC:
-                            if (state.flags & 0x0200) {
-                                //=== NEEDBITS(16); */
-                                while (bits < 16) {
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    hold += input[next++] << bits;
-                                    bits += 8;
-                                }
-                                //===//
-                                if (hold !== (state.check & 0xffff)) {
-                                    strm.msg = 'header crc mismatch';
-                                    state.mode = BAD;
-                                    break;
-                                }
-                                //=== INITBITS();
-                                hold = 0;
-                                bits = 0;
-                                //===//
-                            }
-                            if (state.head) {
-                                state.head.hcrc = ((state.flags >> 9) & 1);
-                                state.head.done = true;
-                            }
-                            strm.adler = state.check = 0;
-                            state.mode = TYPE;
-                            break;
-                        case DICTID:
-                            //=== NEEDBITS(32); */
-                            while (bits < 32) {
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                            }
-                            //===//
-                            strm.adler = state.check = zswap32(hold);
-                            //=== INITBITS();
-                            hold = 0;
-                            bits = 0;
-                            //===//
-                            state.mode = DICT;
-                        /* falls through */
-                        case DICT:
-                            if (state.havedict === 0) {
-                                //--- RESTORE() ---
-                                strm.next_out = put;
-                                strm.avail_out = left;
-                                strm.next_in = next;
-                                strm.avail_in = have;
-                                state.hold = hold;
-                                state.bits = bits;
-                                //---
-                                return Z_NEED_DICT;
-                            }
-                            strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
-                            state.mode = TYPE;
-                        /* falls through */
-                        case TYPE:
-                            if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
-                        /* falls through */
-                        case TYPEDO:
-                            if (state.last) {
-                                //--- BYTEBITS() ---//
-                                hold >>>= bits & 7;
-                                bits -= bits & 7;
-                                //---//
-                                state.mode = CHECK;
-                                break;
-                            }
-                            //=== NEEDBITS(3); */
-                            while (bits < 3) {
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                            }
-                            //===//
-                            state.last = (hold & 0x01)/*BITS(1)*/;
-                            //--- DROPBITS(1) ---//
-                            hold >>>= 1;
-                            bits -= 1;
-                            //---//
-
-                            switch ((hold & 0x03)/*BITS(2)*/) {
-                                case 0:                             /* stored block */
-                                    //Tracev((stderr, "inflate:     stored block%s\n",
-                                    //        state.last ? " (last)" : ""));
-                                    state.mode = STORED;
-                                    break;
-                                case 1:                             /* fixed block */
-                                    fixedtables(state);
-                                    //Tracev((stderr, "inflate:     fixed codes block%s\n",
-                                    //        state.last ? " (last)" : ""));
-                                    state.mode = LEN_;             /* decode codes */
-                                    if (flush === Z_TREES) {
-                                        //--- DROPBITS(2) ---//
-                                        hold >>>= 2;
-                                        bits -= 2;
-                                        //---//
-                                        break inf_leave;
-                                    }
-                                    break;
-                                case 2:                             /* dynamic block */
-                                    //Tracev((stderr, "inflate:     dynamic codes block%s\n",
-                                    //        state.last ? " (last)" : ""));
-                                    state.mode = TABLE;
-                                    break;
-                                case 3:
-                                    strm.msg = 'invalid block type';
-                                    state.mode = BAD;
-                            }
-                            //--- DROPBITS(2) ---//
-                            hold >>>= 2;
-                            bits -= 2;
-                            //---//
-                            break;
-                        case STORED:
-                            //--- BYTEBITS() ---// /* go to byte boundary */
-                            hold >>>= bits & 7;
-                            bits -= bits & 7;
-                            //---//
-                            //=== NEEDBITS(32); */
-                            while (bits < 32) {
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                            }
-                            //===//
-                            if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
-                                strm.msg = 'invalid stored block lengths';
-                                state.mode = BAD;
-                                break;
-                            }
-                            state.length = hold & 0xffff;
-                            //Tracev((stderr, "inflate:       stored length %u\n",
-                            //        state.length));
-                            //=== INITBITS();
-                            hold = 0;
-                            bits = 0;
-                            //===//
-                            state.mode = COPY_;
-                            if (flush === Z_TREES) { break inf_leave; }
-                        /* falls through */
-                        case COPY_:
-                            state.mode = COPY;
-                        /* falls through */
-                        case COPY:
-                            copy = state.length;
-                            if (copy) {
-                                if (copy > have) { copy = have; }
-                                if (copy > left) { copy = left; }
-                                if (copy === 0) { break inf_leave; }
-                                //--- zmemcpy(put, next, copy); ---
-                                utils.arraySet(output, input, next, copy, put);
-                                //---//
-                                have -= copy;
-                                next += copy;
-                                left -= copy;
-                                put += copy;
-                                state.length -= copy;
-                                break;
-                            }
-                            //Tracev((stderr, "inflate:       stored end\n"));
-                            state.mode = TYPE;
-                            break;
-                        case TABLE:
-                            //=== NEEDBITS(14); */
-                            while (bits < 14) {
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                            }
-                            //===//
-                            state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
-                            //--- DROPBITS(5) ---//
-                            hold >>>= 5;
-                            bits -= 5;
-                            //---//
-                            state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
-                            //--- DROPBITS(5) ---//
-                            hold >>>= 5;
-                            bits -= 5;
-                            //---//
-                            state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
-                            //--- DROPBITS(4) ---//
-                            hold >>>= 4;
-                            bits -= 4;
-                            //---//
-    //#ifndef PKZIP_BUG_WORKAROUND
-                            if (state.nlen > 286 || state.ndist > 30) {
-                                strm.msg = 'too many length or distance symbols';
-                                state.mode = BAD;
-                                break;
-                            }
-    //#endif
-                            //Tracev((stderr, "inflate:       table sizes ok\n"));
-                            state.have = 0;
-                            state.mode = LENLENS;
-                        /* falls through */
-                        case LENLENS:
-                            while (state.have < state.ncode) {
-                                //=== NEEDBITS(3);
-                                while (bits < 3) {
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    hold += input[next++] << bits;
-                                    bits += 8;
-                                }
-                                //===//
-                                state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
-                                //--- DROPBITS(3) ---//
-                                hold >>>= 3;
-                                bits -= 3;
-                                //---//
-                            }
-                            while (state.have < 19) {
-                                state.lens[order[state.have++]] = 0;
-                            }
-                            // We have separate tables & no pointers. 2 commented lines below not needed.
-                            //state.next = state.codes;
-                            //state.lencode = state.next;
-                            // Switch to use dynamic table
-                            state.lencode = state.lendyn;
-                            state.lenbits = 7;
-
-                            opts = { bits: state.lenbits };
-                            ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
-                            state.lenbits = opts.bits;
-
-                            if (ret) {
-                                strm.msg = 'invalid code lengths set';
-                                state.mode = BAD;
-                                break;
-                            }
-                            //Tracev((stderr, "inflate:       code lengths ok\n"));
-                            state.have = 0;
-                            state.mode = CODELENS;
-                        /* falls through */
-                        case CODELENS:
-                            while (state.have < state.nlen + state.ndist) {
-                                for (;;) {
-                                    here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
-                                    here_bits = here >>> 24;
-                                    here_op = (here >>> 16) & 0xff;
-                                    here_val = here & 0xffff;
-
-                                    if ((here_bits) <= bits) { break; }
-                                    //--- PULLBYTE() ---//
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    hold += input[next++] << bits;
-                                    bits += 8;
-                                    //---//
-                                }
-                                if (here_val < 16) {
-                                    //--- DROPBITS(here.bits) ---//
-                                    hold >>>= here_bits;
-                                    bits -= here_bits;
-                                    //---//
-                                    state.lens[state.have++] = here_val;
-                                }
-                                else {
-                                    if (here_val === 16) {
-                                        //=== NEEDBITS(here.bits + 2);
-                                        n = here_bits + 2;
-                                        while (bits < n) {
-                                            if (have === 0) { break inf_leave; }
-                                            have--;
-                                            hold += input[next++] << bits;
-                                            bits += 8;
-                                        }
-                                        //===//
-                                        //--- DROPBITS(here.bits) ---//
-                                        hold >>>= here_bits;
-                                        bits -= here_bits;
-                                        //---//
-                                        if (state.have === 0) {
-                                            strm.msg = 'invalid bit length repeat';
-                                            state.mode = BAD;
-                                            break;
-                                        }
-                                        len = state.lens[state.have - 1];
-                                        copy = 3 + (hold & 0x03);//BITS(2);
-                                        //--- DROPBITS(2) ---//
-                                        hold >>>= 2;
-                                        bits -= 2;
-                                        //---//
-                                    }
-                                    else if (here_val === 17) {
-                                        //=== NEEDBITS(here.bits + 3);
-                                        n = here_bits + 3;
-                                        while (bits < n) {
-                                            if (have === 0) { break inf_leave; }
-                                            have--;
-                                            hold += input[next++] << bits;
-                                            bits += 8;
-                                        }
-                                        //===//
-                                        //--- DROPBITS(here.bits) ---//
-                                        hold >>>= here_bits;
-                                        bits -= here_bits;
-                                        //---//
-                                        len = 0;
-                                        copy = 3 + (hold & 0x07);//BITS(3);
-                                        //--- DROPBITS(3) ---//
-                                        hold >>>= 3;
-                                        bits -= 3;
-                                        //---//
-                                    }
-                                    else {
-                                        //=== NEEDBITS(here.bits + 7);
-                                        n = here_bits + 7;
-                                        while (bits < n) {
-                                            if (have === 0) { break inf_leave; }
-                                            have--;
-                                            hold += input[next++] << bits;
-                                            bits += 8;
-                                        }
-                                        //===//
-                                        //--- DROPBITS(here.bits) ---//
-                                        hold >>>= here_bits;
-                                        bits -= here_bits;
-                                        //---//
-                                        len = 0;
-                                        copy = 11 + (hold & 0x7f);//BITS(7);
-                                        //--- DROPBITS(7) ---//
-                                        hold >>>= 7;
-                                        bits -= 7;
-                                        //---//
-                                    }
-                                    if (state.have + copy > state.nlen + state.ndist) {
-                                        strm.msg = 'invalid bit length repeat';
-                                        state.mode = BAD;
-                                        break;
-                                    }
-                                    while (copy--) {
-                                        state.lens[state.have++] = len;
-                                    }
-                                }
-                            }
-
-                            /* handle error breaks in while */
-                            if (state.mode === BAD) { break; }
-
-                            /* check for end-of-block code (better have one) */
-                            if (state.lens[256] === 0) {
-                                strm.msg = 'invalid code -- missing end-of-block';
-                                state.mode = BAD;
-                                break;
-                            }
-
-                            /* build code tables -- note: do not change the lenbits or distbits
-                             values here (9 and 6) without reading the comments in inftrees.h
-                             concerning the ENOUGH constants, which depend on those values */
-                            state.lenbits = 9;
-
-                            opts = { bits: state.lenbits };
-                            ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
-                            // We have separate tables & no pointers. 2 commented lines below not needed.
-                            // state.next_index = opts.table_index;
-                            state.lenbits = opts.bits;
-                            // state.lencode = state.next;
-
-                            if (ret) {
-                                strm.msg = 'invalid literal/lengths set';
-                                state.mode = BAD;
-                                break;
-                            }
-
-                            state.distbits = 6;
-                            //state.distcode.copy(state.codes);
-                            // Switch to use dynamic table
-                            state.distcode = state.distdyn;
-                            opts = { bits: state.distbits };
-                            ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
-                            // We have separate tables & no pointers. 2 commented lines below not needed.
-                            // state.next_index = opts.table_index;
-                            state.distbits = opts.bits;
-                            // state.distcode = state.next;
-
-                            if (ret) {
-                                strm.msg = 'invalid distances set';
-                                state.mode = BAD;
-                                break;
-                            }
-                            //Tracev((stderr, 'inflate:       codes ok\n'));
-                            state.mode = LEN_;
-                            if (flush === Z_TREES) { break inf_leave; }
-                        /* falls through */
-                        case LEN_:
-                            state.mode = LEN;
-                        /* falls through */
-                        case LEN:
-                            if (have >= 6 && left >= 258) {
-                                //--- RESTORE() ---
-                                strm.next_out = put;
-                                strm.avail_out = left;
-                                strm.next_in = next;
-                                strm.avail_in = have;
-                                state.hold = hold;
-                                state.bits = bits;
-                                //---
-                                inflate_fast(strm, _out);
-                                //--- LOAD() ---
-                                put = strm.next_out;
-                                output = strm.output;
-                                left = strm.avail_out;
-                                next = strm.next_in;
-                                input = strm.input;
-                                have = strm.avail_in;
-                                hold = state.hold;
-                                bits = state.bits;
-                                //---
-
-                                if (state.mode === TYPE) {
-                                    state.back = -1;
-                                }
-                                break;
-                            }
-                            state.back = 0;
-                            for (;;) {
-                                here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/
-                                here_bits = here >>> 24;
-                                here_op = (here >>> 16) & 0xff;
-                                here_val = here & 0xffff;
-
-                                if (here_bits <= bits) { break; }
-                                //--- PULLBYTE() ---//
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                                //---//
-                            }
-                            if (here_op && (here_op & 0xf0) === 0) {
-                                last_bits = here_bits;
-                                last_op = here_op;
-                                last_val = here_val;
-                                for (;;) {
-                                    here = state.lencode[last_val +
-                                                         ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
-                                    here_bits = here >>> 24;
-                                    here_op = (here >>> 16) & 0xff;
-                                    here_val = here & 0xffff;
-
-                                    if ((last_bits + here_bits) <= bits) { break; }
-                                    //--- PULLBYTE() ---//
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    hold += input[next++] << bits;
-                                    bits += 8;
-                                    //---//
-                                }
-                                //--- DROPBITS(last.bits) ---//
-                                hold >>>= last_bits;
-                                bits -= last_bits;
-                                //---//
-                                state.back += last_bits;
-                            }
-                            //--- DROPBITS(here.bits) ---//
-                            hold >>>= here_bits;
-                            bits -= here_bits;
-                            //---//
-                            state.back += here_bits;
-                            state.length = here_val;
-                            if (here_op === 0) {
-                                //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
-                                //        "inflate:         literal '%c'\n" :
-                                //        "inflate:         literal 0x%02x\n", here.val));
-                                state.mode = LIT;
-                                break;
-                            }
-                            if (here_op & 32) {
-                                //Tracevv((stderr, "inflate:         end of block\n"));
-                                state.back = -1;
-                                state.mode = TYPE;
-                                break;
-                            }
-                            if (here_op & 64) {
-                                strm.msg = 'invalid literal/length code';
-                                state.mode = BAD;
-                                break;
-                            }
-                            state.extra = here_op & 15;
-                            state.mode = LENEXT;
-                        /* falls through */
-                        case LENEXT:
-                            if (state.extra) {
-                                //=== NEEDBITS(state.extra);
-                                n = state.extra;
-                                while (bits < n) {
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    hold += input[next++] << bits;
-                                    bits += 8;
-                                }
-                                //===//
-                                state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
-                                //--- DROPBITS(state.extra) ---//
-                                hold >>>= state.extra;
-                                bits -= state.extra;
-                                //---//
-                                state.back += state.extra;
-                            }
-                            //Tracevv((stderr, "inflate:         length %u\n", state.length));
-                            state.was = state.length;
-                            state.mode = DIST;
-                        /* falls through */
-                        case DIST:
-                            for (;;) {
-                                here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
-                                here_bits = here >>> 24;
-                                here_op = (here >>> 16) & 0xff;
-                                here_val = here & 0xffff;
-
-                                if ((here_bits) <= bits) { break; }
-                                //--- PULLBYTE() ---//
-                                if (have === 0) { break inf_leave; }
-                                have--;
-                                hold += input[next++] << bits;
-                                bits += 8;
-                                //---//
-                            }
-                            if ((here_op & 0xf0) === 0) {
-                                last_bits = here_bits;
-                                last_op = here_op;
-                                last_val = here_val;
-                                for (;;) {
-                                    here = state.distcode[last_val +
-                                                          ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
-                                    here_bits = here >>> 24;
-                                    here_op = (here >>> 16) & 0xff;
-                                    here_val = here & 0xffff;
-
-                                    if ((last_bits + here_bits) <= bits) { break; }
-                                    //--- PULLBYTE() ---//
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    hold += input[next++] << bits;
-                                    bits += 8;
-                                    //---//
-                                }
-                                //--- DROPBITS(last.bits) ---//
-                                hold >>>= last_bits;
-                                bits -= last_bits;
-                                //---//
-                                state.back += last_bits;
-                            }
-                            //--- DROPBITS(here.bits) ---//
-                            hold >>>= here_bits;
-                            bits -= here_bits;
-                            //---//
-                            state.back += here_bits;
-                            if (here_op & 64) {
-                                strm.msg = 'invalid distance code';
-                                state.mode = BAD;
-                                break;
-                            }
-                            state.offset = here_val;
-                            state.extra = (here_op) & 15;
-                            state.mode = DISTEXT;
-                        /* falls through */
-                        case DISTEXT:
-                            if (state.extra) {
-                                //=== NEEDBITS(state.extra);
-                                n = state.extra;
-                                while (bits < n) {
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    hold += input[next++] << bits;
-                                    bits += 8;
-                                }
-                                //===//
-                                state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
-                                //--- DROPBITS(state.extra) ---//
-                                hold >>>= state.extra;
-                                bits -= state.extra;
-                                //---//
-                                state.back += state.extra;
-                            }
-    //#ifdef INFLATE_STRICT
-                            if (state.offset > state.dmax) {
-                                strm.msg = 'invalid distance too far back';
-                                state.mode = BAD;
-                                break;
-                            }
-    //#endif
-                            //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
-                            state.mode = MATCH;
-                        /* falls through */
-                        case MATCH:
-                            if (left === 0) { break inf_leave; }
-                            copy = _out - left;
-                            if (state.offset > copy) {         /* copy from window */
-                                copy = state.offset - copy;
-                                if (copy > state.whave) {
-                                    if (state.sane) {
-                                        strm.msg = 'invalid distance too far back';
-                                        state.mode = BAD;
-                                        break;
-                                    }
-    // (!) This block is disabled in zlib defailts,
-    // don't enable it for binary compatibility
-    //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
-    //          Trace((stderr, "inflate.c too far\n"));
-    //          copy -= state.whave;
-    //          if (copy > state.length) { copy = state.length; }
-    //          if (copy > left) { copy = left; }
-    //          left -= copy;
-    //          state.length -= copy;
-    //          do {
-    //            output[put++] = 0;
-    //          } while (--copy);
-    //          if (state.length === 0) { state.mode = LEN; }
-    //          break;
-    //#endif
-                                }
-                                if (copy > state.wnext) {
-                                    copy -= state.wnext;
-                                    from = state.wsize - copy;
-                                }
-                                else {
-                                    from = state.wnext - copy;
-                                }
-                                if (copy > state.length) { copy = state.length; }
-                                from_source = state.window;
-                            }
-                            else {                              /* copy from output */
-                                from_source = output;
-                                from = put - state.offset;
-                                copy = state.length;
-                            }
-                            if (copy > left) { copy = left; }
-                            left -= copy;
-                            state.length -= copy;
-                            do {
-                                output[put++] = from_source[from++];
-                            } while (--copy);
-                            if (state.length === 0) { state.mode = LEN; }
-                            break;
-                        case LIT:
-                            if (left === 0) { break inf_leave; }
-                            output[put++] = state.length;
-                            left--;
-                            state.mode = LEN;
-                            break;
-                        case CHECK:
-                            if (state.wrap) {
-                                //=== NEEDBITS(32);
-                                while (bits < 32) {
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    // Use '|' insdead of '+' to make sure that result is signed
-                                    hold |= input[next++] << bits;
-                                    bits += 8;
-                                }
-                                //===//
-                                _out -= left;
-                                strm.total_out += _out;
-                                state.total += _out;
-                                if (_out) {
-                                    strm.adler = state.check =
-                                        /*UPDATE(state.check, put - _out, _out);*/
-                                        (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
-
-                                }
-                                _out = left;
-                                // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
-                                if ((state.flags ? hold : zswap32(hold)) !== state.check) {
-                                    strm.msg = 'incorrect data check';
-                                    state.mode = BAD;
-                                    break;
-                                }
-                                //=== INITBITS();
-                                hold = 0;
-                                bits = 0;
-                                //===//
-                                //Tracev((stderr, "inflate:   check matches trailer\n"));
-                            }
-                            state.mode = LENGTH;
-                        /* falls through */
-                        case LENGTH:
-                            if (state.wrap && state.flags) {
-                                //=== NEEDBITS(32);
-                                while (bits < 32) {
-                                    if (have === 0) { break inf_leave; }
-                                    have--;
-                                    hold += input[next++] << bits;
-                                    bits += 8;
-                                }
-                                //===//
-                                if (hold !== (state.total & 0xffffffff)) {
-                                    strm.msg = 'incorrect length check';
-                                    state.mode = BAD;
-                                    break;
-                                }
-                                //=== INITBITS();
-                                hold = 0;
-                                bits = 0;
-                                //===//
-                                //Tracev((stderr, "inflate:   length matches trailer\n"));
-                            }
-                            state.mode = DONE;
-                        /* falls through */
-                        case DONE:
-                            ret = Z_STREAM_END;
-                            break inf_leave;
-                        case BAD:
-                            ret = Z_DATA_ERROR;
-                            break inf_leave;
-                        case MEM:
-                            return Z_MEM_ERROR;
-                        case SYNC:
-                        /* falls through */
-                        default:
-                            return Z_STREAM_ERROR;
-                    }
-                }
-
-            // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
-
-            /*
-             Return from inflate(), updating the total counts and the check value.
-             If there was no progress during the inflate() call, return a buffer
-             error.  Call updatewindow() to create and/or update the window state.
-             Note: a memory error from inflate() is non-recoverable.
-             */
-
-            //--- RESTORE() ---
-            strm.next_out = put;
-            strm.avail_out = left;
-            strm.next_in = next;
-            strm.avail_in = have;
-            state.hold = hold;
-            state.bits = bits;
-            //---
-
-            if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
-                                (state.mode < CHECK || flush !== Z_FINISH))) {
-                if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;
-            }
-            _in -= strm.avail_in;
-            _out -= strm.avail_out;
-            strm.total_in += _in;
-            strm.total_out += _out;
-            state.total += _out;
-            if (state.wrap && _out) {
-                strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
-                    (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
-            }
-            strm.data_type = state.bits + (state.last ? 64 : 0) +
-                             (state.mode === TYPE ? 128 : 0) +
-                             (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
-            if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
-                ret = Z_BUF_ERROR;
-            }
-            return ret;
-        }
-
-        function inflateEnd(strm) {
-
-            if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
-                return Z_STREAM_ERROR;
-            }
-
-            var state = strm.state;
-            if (state.window) {
-                state.window = null;
-            }
-            strm.state = null;
-            return Z_OK;
-        }
-
-        function inflateGetHeader(strm, head) {
-            var state;
-
-            /* check state */
-            if (!strm || !strm.state) { return Z_STREAM_ERROR; }
-            state = strm.state;
-            if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
-
-            /* save header structure */
-            state.head = head;
-            head.done = false;
-            return Z_OK;
-        }
-
-        function inflateSetDictionary(strm, dictionary) {
-            var dictLength = dictionary.length;
-
-            var state;
-            var dictid;
-            var ret;
-
-            /* check state */
-            if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
-            state = strm.state;
-
-            if (state.wrap !== 0 && state.mode !== DICT) {
-                return Z_STREAM_ERROR;
-            }
-
-            /* check for correct dictionary identifier */
-            if (state.mode === DICT) {
-                dictid = 1; /* adler32(0, null, 0)*/
-                /* dictid = adler32(dictid, dictionary, dictLength); */
-                dictid = adler32(dictid, dictionary, dictLength, 0);
-                if (dictid !== state.check) {
-                    return Z_DATA_ERROR;
-                }
-            }
-            /* copy dictionary to window using updatewindow(), which will amend the
-             existing dictionary if appropriate */
-            ret = updatewindow(strm, dictionary, dictLength, dictLength);
-            if (ret) {
-                state.mode = MEM;
-                return Z_MEM_ERROR;
-            }
-            state.havedict = 1;
-            // Tracev((stderr, "inflate:   dictionary set\n"));
-            return Z_OK;
-        }
-
-        exports.inflateReset = inflateReset;
-        exports.inflateReset2 = inflateReset2;
-        exports.inflateResetKeep = inflateResetKeep;
-        exports.inflateInit = inflateInit;
-        exports.inflateInit2 = inflateInit2;
-        exports.inflate = inflate;
-        exports.inflateEnd = inflateEnd;
-        exports.inflateGetHeader = inflateGetHeader;
-        exports.inflateSetDictionary = inflateSetDictionary;
-        exports.inflateInfo = 'pako inflate (from Nodeca project)';
-
-        /* Not implemented
-         exports.inflateCopy = inflateCopy;
-         exports.inflateGetDictionary = inflateGetDictionary;
-         exports.inflateMark = inflateMark;
-         exports.inflatePrime = inflatePrime;
-         exports.inflateSync = inflateSync;
-         exports.inflateSyncPoint = inflateSyncPoint;
-         exports.inflateUndermine = inflateUndermine;
-         */
-
-    },{"../utils/common":1,"./adler32":3,"./crc32":5,"./inffast":7,"./inftrees":9}],9:[function(require,module,exports){
-
-
-        var utils = require('../utils/common');
-
-        var MAXBITS = 15;
-        var ENOUGH_LENS = 852;
-        var ENOUGH_DISTS = 592;
-    //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
-
-        var CODES = 0;
-        var LENS = 1;
-        var DISTS = 2;
-
-        var lbase = [ /* Length codes 257..285 base */
-            3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
-            35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
-        ];
-
-        var lext = [ /* Length codes 257..285 extra */
-            16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
-            19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
-        ];
-
-        var dbase = [ /* Distance codes 0..29 base */
-            1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
-            257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
-            8193, 12289, 16385, 24577, 0, 0
-        ];
-
-        var dext = [ /* Distance codes 0..29 extra */
-            16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
-            23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
-            28, 28, 29, 29, 64, 64
-        ];
-
-        module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
-        {
-            var bits = opts.bits;
-            //here = opts.here; /* table entry for duplication */
-
-            var len = 0;               /* a code's length in bits */
-            var sym = 0;               /* index of code symbols */
-            var min = 0, max = 0;          /* minimum and maximum code lengths */
-            var root = 0;              /* number of index bits for root table */
-            var curr = 0;              /* number of index bits for current table */
-            var drop = 0;              /* code bits to drop for sub-table */
-            var left = 0;                   /* number of prefix codes available */
-            var used = 0;              /* code entries in table used */
-            var huff = 0;              /* Huffman code */
-            var incr;              /* for incrementing code, index */
-            var fill;              /* index for replicating entries */
-            var low;               /* low bits for current root entry */
-            var mask;              /* mask for low root bits */
-            var next;             /* next available space in table */
-            var base = null;     /* base value table to use */
-            var base_index = 0;
-    //  var shoextra;    /* extra bits table to use */
-            var end;                    /* use base and extra for symbol > end */
-            var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */
-            var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */
-            var extra = null;
-            var extra_index = 0;
-
-            var here_bits, here_op, here_val;
-
-            /*
-             Process a set of code lengths to create a canonical Huffman code.  The
-             code lengths are lens[0..codes-1].  Each length corresponds to the
-             symbols 0..codes-1.  The Huffman code is generated by first sorting the
-             symbols by length from short to long, and retaining the symbol order
-             for codes with equal lengths.  Then the code starts with all zero bits
-             for the first code of the shortest length, and the codes are integer
-             increments for the same length, and zeros are appended as the length
-             increases.  For the deflate format, these bits are stored backwards
-             from their more natural integer increment ordering, and so when the
-             decoding tables are built in the large loop below, the integer codes
-             are incremented backwards.
-
-             This routine assumes, but does not check, that all of the entries in
-             lens[] are in the range 0..MAXBITS.  The caller must assure this.
-             1..MAXBITS is interpreted as that code length.  zero means that that
-             symbol does not occur in this code.
-
-             The codes are sorted by computing a count of codes for each length,
-             creating from that a table of starting indices for each length in the
-             sorted table, and then entering the symbols in order in the sorted
-             table.  The sorted table is work[], with that space being provided by
-             the caller.
-
-             The length counts are used for other purposes as well, i.e. finding
-             the minimum and maximum length codes, determining if there are any
-             codes at all, checking for a valid set of lengths, and looking ahead
-             at length counts to determine sub-table sizes when building the
-             decoding tables.
-             */
-
-            /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
-            for (len = 0; len <= MAXBITS; len++) {
-                count[len] = 0;
-            }
-            for (sym = 0; sym < codes; sym++) {
-                count[lens[lens_index + sym]]++;
-            }
-
-            /* bound code lengths, force root to be within code lengths */
-            root = bits;
-            for (max = MAXBITS; max >= 1; max--) {
-                if (count[max] !== 0) { break; }
-            }
-            if (root > max) {
-                root = max;
-            }
-            if (max === 0) {                     /* no symbols to code at all */
-                //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
-                //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
-                //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
-                table[table_index++] = (1 << 24) | (64 << 16) | 0;
-
-
-                //table.op[opts.table_index] = 64;
-                //table.bits[opts.table_index] = 1;
-                //table.val[opts.table_index++] = 0;
-                table[table_index++] = (1 << 24) | (64 << 16) | 0;
-
-                opts.bits = 1;
-                return 0;     /* no symbols, but wait for decoding to report error */
-            }
-            for (min = 1; min < max; min++) {
-                if (count[min] !== 0) { break; }
-            }
-            if (root < min) {
-                root = min;
-            }
-
-            /* check for an over-subscribed or incomplete set of lengths */
-            left = 1;
-            for (len = 1; len <= MAXBITS; len++) {
-                left <<= 1;
-                left -= count[len];
-                if (left < 0) {
-                    return -1;
-                }        /* over-subscribed */
-            }
-            if (left > 0 && (type === CODES || max !== 1)) {
-                return -1;                      /* incomplete set */
-            }
-
-            /* generate offsets into symbol table for each length for sorting */
-            offs[1] = 0;
-            for (len = 1; len < MAXBITS; len++) {
-                offs[len + 1] = offs[len] + count[len];
-            }
-
-            /* sort symbols by length, by symbol order within each length */
-            for (sym = 0; sym < codes; sym++) {
-                if (lens[lens_index + sym] !== 0) {
-                    work[offs[lens[lens_index + sym]]++] = sym;
-                }
-            }
-
-            /*
-             Create and fill in decoding tables.  In this loop, the table being
-             filled is at next and has curr index bits.  The code being used is huff
-             with length len.  That code is converted to an index by dropping drop
-             bits off of the bottom.  For codes where len is less than drop + curr,
-             those top drop + curr - len bits are incremented through all values to
-             fill the table with replicated entries.
-
-             root is the number of index bits for the root table.  When len exceeds
-             root, sub-tables are created pointed to by the root entry with an index
-             of the low root bits of huff.  This is saved in low to check for when a
-             new sub-table should be started.  drop is zero when the root table is
-             being filled, and drop is root when sub-tables are being filled.
-
-             When a new sub-table is needed, it is necessary to look ahead in the
-             code lengths to determine what size sub-table is needed.  The length
-             counts are used for this, and so count[] is decremented as codes are
-             entered in the tables.
-
-             used keeps track of how many table entries have been allocated from the
-             provided *table space.  It is checked for LENS and DIST tables against
-             the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
-             the initial root table size constants.  See the comments in inftrees.h
-             for more information.
-
-             sym increments through all symbols, and the loop terminates when
-             all codes of length max, i.e. all codes, have been processed.  This
-             routine permits incomplete codes, so another loop after this one fills
-             in the rest of the decoding tables with invalid code markers.
-             */
-
-            /* set up for code type */
-            // poor man optimization - use if-else instead of switch,
-            // to avoid deopts in old v8
-            if (type === CODES) {
-                base = extra = work;    /* dummy value--not used */
-                end = 19;
-
-            } else if (type === LENS) {
-                base = lbase;
-                base_index -= 257;
-                extra = lext;
-                extra_index -= 257;
-                end = 256;
-
-            } else {                    /* DISTS */
-                base = dbase;
-                extra = dext;
-                end = -1;
-            }
-
-            /* initialize opts for loop */
-            huff = 0;                   /* starting code */
-            sym = 0;                    /* starting code symbol */
-            len = min;                  /* starting code length */
-            next = table_index;              /* current table to fill in */
-            curr = root;                /* current table index bits */
-            drop = 0;                   /* current bits to drop from code for index */
-            low = -1;                   /* trigger new sub-table when len > root */
-            used = 1 << root;          /* use root table entries */
-            mask = used - 1;            /* mask for comparing low */
-
-            /* check available table space */
-            if ((type === LENS && used > ENOUGH_LENS) ||
-                (type === DISTS && used > ENOUGH_DISTS)) {
-                return 1;
-            }
-
-            /* process all codes and make table entries */
-            for (;;) {
-                /* create table entry */
-                here_bits = len - drop;
-                if (work[sym] < end) {
-                    here_op = 0;
-                    here_val = work[sym];
-                }
-                else if (work[sym] > end) {
-                    here_op = extra[extra_index + work[sym]];
-                    here_val = base[base_index + work[sym]];
-                }
-                else {
-                    here_op = 32 + 64;         /* end of block */
-                    here_val = 0;
-                }
-
-                /* replicate for those indices with low len bits equal to huff */
-                incr = 1 << (len - drop);
-                fill = 1 << curr;
-                min = fill;                 /* save offset to next table */
-                do {
-                    fill -= incr;
-                    table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
-                } while (fill !== 0);
-
-                /* backwards increment the len-bit code huff */
-                incr = 1 << (len - 1);
-                while (huff & incr) {
-                    incr >>= 1;
-                }
-                if (incr !== 0) {
-                    huff &= incr - 1;
-                    huff += incr;
-                } else {
-                    huff = 0;
-                }
-
-                /* go to next symbol, update count, len */
-                sym++;
-                if (--count[len] === 0) {
-                    if (len === max) { break; }
-                    len = lens[lens_index + work[sym]];
-                }
-
-                /* create new sub-table if needed */
-                if (len > root && (huff & mask) !== low) {
-                    /* if first time, transition to sub-tables */
-                    if (drop === 0) {
-                        drop = root;
-                    }
-
-                    /* increment past last table */
-                    next += min;            /* here min is 1 << curr */
-
-                    /* determine length of next table */
-                    curr = len - drop;
-                    left = 1 << curr;
-                    while (curr + drop < max) {
-                        left -= count[curr + drop];
-                        if (left <= 0) { break; }
-                        curr++;
-                        left <<= 1;
-                    }
-
-                    /* check for enough space */
-                    used += 1 << curr;
-                    if ((type === LENS && used > ENOUGH_LENS) ||
-                        (type === DISTS && used > ENOUGH_DISTS)) {
-                        return 1;
-                    }
-
-                    /* point entry in root table to sub-table */
-                    low = huff & mask;
-                    /*table.op[low] = curr;
-                     table.bits[low] = root;
-                     table.val[low] = next - opts.table_index;*/
-                    table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
-                }
-            }
-
-            /* fill in remaining table entry if code is incomplete (guaranteed to have
-             at most one remaining entry, since if the code is incomplete, the
-             maximum code length that was allowed to get this far is one bit) */
-            if (huff !== 0) {
-                //table.op[next + huff] = 64;            /* invalid code marker */
-                //table.bits[next + huff] = len - drop;
-                //table.val[next + huff] = 0;
-                table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
-            }
-
-            /* set return parameters */
-            //opts.table_index += used;
-            opts.bits = root;
-            return 0;
-        };
-
-    },{"../utils/common":1}],10:[function(require,module,exports){
-
-        module.exports = {
-            2:      'need dictionary',     /* Z_NEED_DICT       2  */
-            1:      'stream end',          /* Z_STREAM_END      1  */
-            0:      '',                    /* Z_OK              0  */
-            '-1':   'file error',          /* Z_ERRNO         (-1) */
-            '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
-            '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
-            '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
-            '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
-            '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
-        };
-
-    },{}],11:[function(require,module,exports){
-
-
-        function ZStream() {
-            /* next input byte */
-            this.input = null; // JS specific, because we have no pointers
-            this.next_in = 0;
-            /* number of bytes available at input */
-            this.avail_in = 0;
-            /* total number of input bytes read so far */
-            this.total_in = 0;
-            /* next output byte should be put there */
-            this.output = null; // JS specific, because we have no pointers
-            this.next_out = 0;
-            /* remaining free space at output */
-            this.avail_out = 0;
-            /* total number of bytes output so far */
-            this.total_out = 0;
-            /* last error message, NULL if no error */
-            this.msg = ''/*Z_NULL*/;
-            /* not visible by applications */
-            this.state = null;
-            /* best guess about the data type: binary or text */
-            this.data_type = 2/*Z_UNKNOWN*/;
-            /* adler32 value of the uncompressed data */
-            this.adler = 0;
-        }
-
-        module.exports = ZStream;
-
-    },{}],"/lib/inflate.js":[function(require,module,exports){
-
-
-        var zlib_inflate = require('./zlib/inflate');
-        var utils        = require('./utils/common');
-        var strings      = require('./utils/strings');
-        var c            = require('./zlib/constants');
-        var msg          = require('./zlib/messages');
-        var ZStream      = require('./zlib/zstream');
-        var GZheader     = require('./zlib/gzheader');
-
-        var toString = Object.prototype.toString;
-
-        /**
-         * class Inflate
-         *
-         * Generic JS-style wrapper for zlib calls. If you don't need
-         * streaming behaviour - use more simple functions: [[inflate]]
-         * and [[inflateRaw]].
-         **/
-
-        /* internal
-         * inflate.chunks -> Array
-         *
-         * Chunks of output data, if [[Inflate#onData]] not overriden.
-         **/
-
-        /**
-         * Inflate.result -> Uint8Array|Array|String
-         *
-         * Uncompressed result, generated by default [[Inflate#onData]]
-         * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
-         * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you
-         * push a chunk with explicit flush (call [[Inflate#push]] with
-         * `Z_SYNC_FLUSH` param).
-         **/
-
-        /**
-         * Inflate.err -> Number
-         *
-         * Error code after inflate finished. 0 (Z_OK) on success.
-         * Should be checked if broken data possible.
-         **/
-
-        /**
-         * Inflate.msg -> String
-         *
-         * Error message, if [[Inflate.err]] != 0
-         **/
-
-
-        /**
-         * new Inflate(options)
-         * - options (Object): zlib inflate options.
-         *
-         * Creates new inflator instance with specified params. Throws exception
-         * on bad params. Supported options:
-         *
-         * - `windowBits`
-         * - `dictionary`
-         *
-         * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
-         * for more information on these.
-         *
-         * Additional options, for internal needs:
-         *
-         * - `chunkSize` - size of generated data chunks (16K by default)
-         * - `raw` (Boolean) - do raw inflate
-         * - `to` (String) - if equal to 'string', then result will be converted
-         *   from utf8 to utf16 (javascript) string. When string output requested,
-         *   chunk length can differ from `chunkSize`, depending on content.
-         *
-         * By default, when no options set, autodetect deflate/gzip data format via
-         * wrapper header.
-         *
-         * ##### Example:
-         *
-         * ```javascript
-         * var pako = require('pako')
-         *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
-         *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
-         *
-         * var inflate = new pako.Inflate({ level: 3});
-         *
-         * inflate.push(chunk1, false);
-         * inflate.push(chunk2, true);  // true -> last chunk
-         *
-         * if (inflate.err) { throw new Error(inflate.err); }
-         *
-         * console.log(inflate.result);
-         * ```
-         **/
-        function Inflate(options) {
-            if (!(this instanceof Inflate)) return new Inflate(options);
-
-            this.options = utils.assign({
-                chunkSize: 16384,
-                windowBits: 0,
-                to: ''
-            }, options || {});
-
-            var opt = this.options;
-
-            // Force window size for `raw` data, if not set directly,
-            // because we have no header for autodetect.
-            if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
-                opt.windowBits = -opt.windowBits;
-                if (opt.windowBits === 0) { opt.windowBits = -15; }
-            }
-
-            // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
-            if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
-                !(options && options.windowBits)) {
-                opt.windowBits += 32;
-            }
-
-            // Gzip header has no info about windows size, we can do autodetect only
-            // for deflate. So, if window size not set, force it to max when gzip possible
-            if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
-                // bit 3 (16) -> gzipped data
-                // bit 4 (32) -> autodetect gzip/deflate
-                if ((opt.windowBits & 15) === 0) {
-                    opt.windowBits |= 15;
-                }
-            }
-
-            this.err    = 0;      // error code, if happens (0 = Z_OK)
-            this.msg    = '';     // error message
-            this.ended  = false;  // used to avoid multiple onEnd() calls
-            this.chunks = [];     // chunks of compressed data
-
-            this.strm   = new ZStream();
-            this.strm.avail_out = 0;
-
-            var status  = zlib_inflate.inflateInit2(
-                this.strm,
-                opt.windowBits
-            );
-
-            if (status !== c.Z_OK) {
-                throw new Error(msg[status]);
-            }
-
-            this.header = new GZheader();
-
-            zlib_inflate.inflateGetHeader(this.strm, this.header);
-        }
-
-        /**
-         * Inflate#push(data[, mode]) -> Boolean
-         * - data (Uint8Array|Array|ArrayBuffer|String): input data
-         * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
-         *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
-         *
-         * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
-         * new output chunks. Returns `true` on success. The last data block must have
-         * mode Z_FINISH (or `true`). That will flush internal pending buffers and call
-         * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you
-         * can use mode Z_SYNC_FLUSH, keeping the decompression context.
-         *
-         * On fail call [[Inflate#onEnd]] with error code and return false.
-         *
-         * We strongly recommend to use `Uint8Array` on input for best speed (output
-         * format is detected automatically). Also, don't skip last param and always
-         * use the same type in your code (boolean or number). That will improve JS speed.
-         *
-         * For regular `Array`-s make sure all elements are [0..255].
-         *
-         * ##### Example
-         *
-         * ```javascript
-         * push(chunk, false); // push one of data chunks
-         * ...
-         * push(chunk, true);  // push last chunk
-         * ```
-         **/
-        Inflate.prototype.push = function (data, mode) {
-            var strm = this.strm;
-            var chunkSize = this.options.chunkSize;
-            var dictionary = this.options.dictionary;
-            var status, _mode;
-            var next_out_utf8, tail, utf8str;
-            var dict;
-
-            // Flag to properly process Z_BUF_ERROR on testing inflate call
-            // when we check that all output data was flushed.
-            var allowBufError = false;
-
-            if (this.ended) { return false; }
-            _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
-
-            // Convert data if needed
-            if (typeof data === 'string') {
-                // Only binary strings can be decompressed on practice
-                strm.input = strings.binstring2buf(data);
-            } else if (toString.call(data) === '[object ArrayBuffer]') {
-                strm.input = new Uint8Array(data);
-            } else {
-                strm.input = data;
-            }
-
-            strm.next_in = 0;
-            strm.avail_in = strm.input.length;
-
-            do {
-                if (strm.avail_out === 0) {
-                    strm.output = new utils.Buf8(chunkSize);
-                    strm.next_out = 0;
-                    strm.avail_out = chunkSize;
-                }
-
-                status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */
-
-                if (status === c.Z_NEED_DICT && dictionary) {
-                    // Convert data if needed
-                    if (typeof dictionary === 'string') {
-                        dict = strings.string2buf(dictionary);
-                    } else if (toString.call(dictionary) === '[object ArrayBuffer]') {
-                        dict = new Uint8Array(dictionary);
-                    } else {
-                        dict = dictionary;
-                    }
-
-                    status = zlib_inflate.inflateSetDictionary(this.strm, dict);
-
-                }
-
-                if (status === c.Z_BUF_ERROR && allowBufError === true) {
-                    status = c.Z_OK;
-                    allowBufError = false;
-                }
-
-                if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
-                    this.onEnd(status);
-                    this.ended = true;
-                    return false;
-                }
-
-                if (strm.next_out) {
-                    if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {
-
-                        if (this.options.to === 'string') {
-
-                            next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
-
-                            tail = strm.next_out - next_out_utf8;
-                            utf8str = strings.buf2string(strm.output, next_out_utf8);
-
-                            // move tail
-                            strm.next_out = tail;
-                            strm.avail_out = chunkSize - tail;
-                            if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
-
-                            this.onData(utf8str);
-
-                        } else {
-                            this.onData(utils.shrinkBuf(strm.output, strm.next_out));
-                        }
-                    }
-                }
-
-                // When no more input data, we should check that internal inflate buffers
-                // are flushed. The only way to do it when avail_out = 0 - run one more
-                // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.
-                // Here we set flag to process this error properly.
-                //
-                // NOTE. Deflate does not return error in this case and does not needs such
-                // logic.
-                if (strm.avail_in === 0 && strm.avail_out === 0) {
-                    allowBufError = true;
-                }
-
-            } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);
-
-            if (status === c.Z_STREAM_END) {
-                _mode = c.Z_FINISH;
-            }
-
-            // Finalize on the last chunk.
-            if (_mode === c.Z_FINISH) {
-                status = zlib_inflate.inflateEnd(this.strm);
-                this.onEnd(status);
-                this.ended = true;
-                return status === c.Z_OK;
-            }
-
-            // callback interim results if Z_SYNC_FLUSH.
-            if (_mode === c.Z_SYNC_FLUSH) {
-                this.onEnd(c.Z_OK);
-                strm.avail_out = 0;
-                return true;
-            }
-
-            return true;
-        };
-
-
-        /**
-         * Inflate#onData(chunk) -> Void
-         * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
-         *   on js engine support. When string output requested, each chunk
-         *   will be string.
-         *
-         * By default, stores data blocks in `chunks[]` property and glue
-         * those in `onEnd`. Override this handler, if you need another behaviour.
-         **/
-        Inflate.prototype.onData = function (chunk) {
-            this.chunks.push(chunk);
-        };
-
-
-        /**
-         * Inflate#onEnd(status) -> Void
-         * - status (Number): inflate status. 0 (Z_OK) on success,
-         *   other if not.
-         *
-         * Called either after you tell inflate that the input stream is
-         * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)
-         * or if an error happened. By default - join collected chunks,
-         * free memory and fill `results` / `err` properties.
-         **/
-        Inflate.prototype.onEnd = function (status) {
-            // On success - join
-            if (status === c.Z_OK) {
-                if (this.options.to === 'string') {
-                    // Glue & convert here, until we teach pako to send
-                    // utf8 alligned strings to onData
-                    this.result = this.chunks.join('');
-                } else {
-                    this.result = utils.flattenChunks(this.chunks);
-                }
-            }
-            this.chunks = [];
-            this.err = status;
-            this.msg = this.strm.msg;
-        };
-
-
-        /**
-         * inflate(data[, options]) -> Uint8Array|Array|String
-         * - data (Uint8Array|Array|String): input data to decompress.
-         * - options (Object): zlib inflate options.
-         *
-         * Decompress `data` with inflate/ungzip and `options`. Autodetect
-         * format via wrapper header by default. That's why we don't provide
-         * separate `ungzip` method.
-         *
-         * Supported options are:
-         *
-         * - windowBits
-         *
-         * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
-         * for more information.
-         *
-         * Sugar (options):
-         *
-         * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
-         *   negative windowBits implicitly.
-         * - `to` (String) - if equal to 'string', then result will be converted
-         *   from utf8 to utf16 (javascript) string. When string output requested,
-         *   chunk length can differ from `chunkSize`, depending on content.
-         *
-         *
-         * ##### Example:
-         *
-         * ```javascript
-         * var pako = require('pako')
-         *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])
-         *   , output;
-         *
-         * try {
-     *   output = pako.inflate(input);
-     * } catch (err)
-         *   console.log(err);
-         * }
-         * ```
-         **/
-        function inflate(input, options) {
-            var inflator = new Inflate(options);
-
-            inflator.push(input, true);
-
-            // That will never happens, if you don't cheat with options :)
-            if (inflator.err) { throw inflator.msg || msg[inflator.err]; }
-
-            return inflator.result;
-        }
-
-
-        /**
-         * inflateRaw(data[, options]) -> Uint8Array|Array|String
-         * - data (Uint8Array|Array|String): input data to decompress.
-         * - options (Object): zlib inflate options.
-         *
-         * The same as [[inflate]], but creates raw data, without wrapper
-         * (header and adler32 crc).
-         **/
-        function inflateRaw(input, options) {
-            options = options || {};
-            options.raw = true;
-            return inflate(input, options);
-        }
-
-
-        /**
-         * ungzip(data[, options]) -> Uint8Array|Array|String
-         * - data (Uint8Array|Array|String): input data to decompress.
-         * - options (Object): zlib inflate options.
-         *
-         * Just shortcut to [[inflate]], because it autodetects format
-         * by header.content. Done for convenience.
-         **/
-
-
-        exports.Inflate = Inflate;
-        exports.inflate = inflate;
-        exports.inflateRaw = inflateRaw;
-        exports.ungzip  = inflate;
-
-    },{"./utils/common":1,"./utils/strings":2,"./zlib/constants":4,"./zlib/gzheader":6,"./zlib/inflate":8,"./zlib/messages":10,"./zlib/zstream":11}]},{},[])("/lib/inflate.js")
-    });
-
-    var pako = tmp;
-
-    exports.pako = pako;
-
-});
diff --git a/public/libs/Cesium/Workers/pbf-9fe59c76.js b/public/libs/Cesium/Workers/pbf-9fe59c76.js
deleted file mode 100644
index 1bca39f..0000000
--- a/public/libs/Cesium/Workers/pbf-9fe59c76.js
+++ /dev/null
@@ -1,615 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports'], function (exports) { 'use strict';
-
-    var read = function (buffer, offset, isLE, mLen, nBytes) {
-        var e, m;
-        var eLen = (nBytes * 8) - mLen - 1;
-        var eMax = (1 << eLen) - 1;
-        var eBias = eMax >> 1;
-        var nBits = -7;
-        var i = isLE ? (nBytes - 1) : 0;
-        var d = isLE ? -1 : 1;
-        var s = buffer[offset + i];
-        i += d;
-        e = s & ((1 << (-nBits)) - 1);
-        s >>= (-nBits);
-        nBits += eLen;
-        for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
-        m = e & ((1 << (-nBits)) - 1);
-        e >>= (-nBits);
-        nBits += mLen;
-        for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
-        if (e === 0) {
-            e = 1 - eBias;
-        } else if (e === eMax) {
-            return m ? NaN : ((s ? -1 : 1) * Infinity)
-        } else {
-            m = m + Math.pow(2, mLen);
-            e = e - eBias;
-        }
-        return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
-    };
-    var write = function (buffer, value, offset, isLE, mLen, nBytes) {
-        var e, m, c;
-        var eLen = (nBytes * 8) - mLen - 1;
-        var eMax = (1 << eLen) - 1;
-        var eBias = eMax >> 1;
-        var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
-        var i = isLE ? 0 : (nBytes - 1);
-        var d = isLE ? 1 : -1;
-        var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
-        value = Math.abs(value);
-        if (isNaN(value) || value === Infinity) {
-            m = isNaN(value) ? 1 : 0;
-            e = eMax;
-        } else {
-            e = Math.floor(Math.log(value) / Math.LN2);
-            if (value * (c = Math.pow(2, -e)) < 1) {
-                e--;
-                c *= 2;
-            }
-            if (e + eBias >= 1) {
-                value += rt / c;
-            } else {
-                value += rt * Math.pow(2, 1 - eBias);
-            }
-            if (value * c >= 2) {
-                e++;
-                c /= 2;
-            }
-            if (e + eBias >= eMax) {
-                m = 0;
-                e = eMax;
-            } else if (e + eBias >= 1) {
-                m = ((value * c) - 1) * Math.pow(2, mLen);
-                e = e + eBias;
-            } else {
-                m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
-                e = 0;
-            }
-        }
-        for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
-        e = (e << mLen) | m;
-        eLen += mLen;
-        for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
-        buffer[offset + i - d] |= s * 128;
-    };
-    var ieee754 = {
-        read: read,
-        write: write
-    };
-
-    function Pbf(buf) {
-        this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
-        this.pos = 0;
-        this.type = 0;
-        this.length = this.buf.length;
-    }
-    Pbf.Varint  = 0;
-    Pbf.Fixed64 = 1;
-    Pbf.Bytes   = 2;
-    Pbf.Fixed32 = 5;
-    var SHIFT_LEFT_32 = (1 << 16) * (1 << 16);
-    var SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
-    Pbf.prototype = {
-        destroy: function() {
-            this.buf = null;
-        },
-        readFields: function(readField, result, end) {
-            end = end || this.length;
-            while (this.pos < end) {
-                var val = this.readVarint(),
-                    tag = val >> 3,
-                    startPos = this.pos;
-                this.type = val & 0x7;
-                readField(tag, result, this);
-                if (this.pos === startPos) this.skip(val);
-            }
-            return result;
-        },
-        readMessage: function(readField, result) {
-            return this.readFields(readField, result, this.readVarint() + this.pos);
-        },
-        readFixed32: function() {
-            var val = readUInt32(this.buf, this.pos);
-            this.pos += 4;
-            return val;
-        },
-        readSFixed32: function() {
-            var val = readInt32(this.buf, this.pos);
-            this.pos += 4;
-            return val;
-        },
-        readFixed64: function() {
-            var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-            this.pos += 8;
-            return val;
-        },
-        readSFixed64: function() {
-            var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-            this.pos += 8;
-            return val;
-        },
-        readFloat: function() {
-            var val = ieee754.read(this.buf, this.pos, true, 23, 4);
-            this.pos += 4;
-            return val;
-        },
-        readDouble: function() {
-            var val = ieee754.read(this.buf, this.pos, true, 52, 8);
-            this.pos += 8;
-            return val;
-        },
-        readVarint: function(isSigned) {
-            var buf = this.buf,
-                val, b;
-            b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
-            b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
-            b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
-            b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
-            b = buf[this.pos];   val |= (b & 0x0f) << 28;
-            return readVarintRemainder(val, isSigned, this);
-        },
-        readVarint64: function() {
-            return this.readVarint(true);
-        },
-        readSVarint: function() {
-            var num = this.readVarint();
-            return num % 2 === 1 ? (num + 1) / -2 : num / 2;
-        },
-        readBoolean: function() {
-            return Boolean(this.readVarint());
-        },
-        readString: function() {
-            var end = this.readVarint() + this.pos,
-                str = readUtf8(this.buf, this.pos, end);
-            this.pos = end;
-            return str;
-        },
-        readBytes: function() {
-            var end = this.readVarint() + this.pos,
-                buffer = this.buf.subarray(this.pos, end);
-            this.pos = end;
-            return buffer;
-        },
-        readPackedVarint: function(arr, isSigned) {
-            var end = readPackedEnd(this);
-            arr = arr || [];
-            while (this.pos < end) arr.push(this.readVarint(isSigned));
-            return arr;
-        },
-        readPackedSVarint: function(arr) {
-            var end = readPackedEnd(this);
-            arr = arr || [];
-            while (this.pos < end) arr.push(this.readSVarint());
-            return arr;
-        },
-        readPackedBoolean: function(arr) {
-            var end = readPackedEnd(this);
-            arr = arr || [];
-            while (this.pos < end) arr.push(this.readBoolean());
-            return arr;
-        },
-        readPackedFloat: function(arr) {
-            var end = readPackedEnd(this);
-            arr = arr || [];
-            while (this.pos < end) arr.push(this.readFloat());
-            return arr;
-        },
-        readPackedDouble: function(arr) {
-            var end = readPackedEnd(this);
-            arr = arr || [];
-            while (this.pos < end) arr.push(this.readDouble());
-            return arr;
-        },
-        readPackedFixed32: function(arr) {
-            var end = readPackedEnd(this);
-            arr = arr || [];
-            while (this.pos < end) arr.push(this.readFixed32());
-            return arr;
-        },
-        readPackedSFixed32: function(arr) {
-            var end = readPackedEnd(this);
-            arr = arr || [];
-            while (this.pos < end) arr.push(this.readSFixed32());
-            return arr;
-        },
-        readPackedFixed64: function(arr) {
-            var end = readPackedEnd(this);
-            arr = arr || [];
-            while (this.pos < end) arr.push(this.readFixed64());
-            return arr;
-        },
-        readPackedSFixed64: function(arr) {
-            var end = readPackedEnd(this);
-            arr = arr || [];
-            while (this.pos < end) arr.push(this.readSFixed64());
-            return arr;
-        },
-        skip: function(val) {
-            var type = val & 0x7;
-            if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
-            else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
-            else if (type === Pbf.Fixed32) this.pos += 4;
-            else if (type === Pbf.Fixed64) this.pos += 8;
-            else throw new Error('Unimplemented type: ' + type);
-        },
-        writeTag: function(tag, type) {
-            this.writeVarint((tag << 3) | type);
-        },
-        realloc: function(min) {
-            var length = this.length || 16;
-            while (length < this.pos + min) length *= 2;
-            if (length !== this.length) {
-                var buf = new Uint8Array(length);
-                buf.set(this.buf);
-                this.buf = buf;
-                this.length = length;
-            }
-        },
-        finish: function() {
-            this.length = this.pos;
-            this.pos = 0;
-            return this.buf.subarray(0, this.length);
-        },
-        writeFixed32: function(val) {
-            this.realloc(4);
-            writeInt32(this.buf, val, this.pos);
-            this.pos += 4;
-        },
-        writeSFixed32: function(val) {
-            this.realloc(4);
-            writeInt32(this.buf, val, this.pos);
-            this.pos += 4;
-        },
-        writeFixed64: function(val) {
-            this.realloc(8);
-            writeInt32(this.buf, val & -1, this.pos);
-            writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-            this.pos += 8;
-        },
-        writeSFixed64: function(val) {
-            this.realloc(8);
-            writeInt32(this.buf, val & -1, this.pos);
-            writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-            this.pos += 8;
-        },
-        writeVarint: function(val) {
-            val = +val || 0;
-            if (val > 0xfffffff || val < 0) {
-                writeBigVarint(val, this);
-                return;
-            }
-            this.realloc(4);
-            this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-            this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-            this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-            this.buf[this.pos++] =   (val >>> 7) & 0x7f;
-        },
-        writeSVarint: function(val) {
-            this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
-        },
-        writeBoolean: function(val) {
-            this.writeVarint(Boolean(val));
-        },
-        writeString: function(str) {
-            str = String(str);
-            this.realloc(str.length * 4);
-            this.pos++;
-            var startPos = this.pos;
-            this.pos = writeUtf8(this.buf, str, this.pos);
-            var len = this.pos - startPos;
-            if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
-            this.pos = startPos - 1;
-            this.writeVarint(len);
-            this.pos += len;
-        },
-        writeFloat: function(val) {
-            this.realloc(4);
-            ieee754.write(this.buf, val, this.pos, true, 23, 4);
-            this.pos += 4;
-        },
-        writeDouble: function(val) {
-            this.realloc(8);
-            ieee754.write(this.buf, val, this.pos, true, 52, 8);
-            this.pos += 8;
-        },
-        writeBytes: function(buffer) {
-            var len = buffer.length;
-            this.writeVarint(len);
-            this.realloc(len);
-            for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
-        },
-        writeRawMessage: function(fn, obj) {
-            this.pos++;
-            var startPos = this.pos;
-            fn(obj, this);
-            var len = this.pos - startPos;
-            if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
-            this.pos = startPos - 1;
-            this.writeVarint(len);
-            this.pos += len;
-        },
-        writeMessage: function(tag, fn, obj) {
-            this.writeTag(tag, Pbf.Bytes);
-            this.writeRawMessage(fn, obj);
-        },
-        writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
-        writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
-        writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
-        writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
-        writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
-        writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
-        writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
-        writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
-        writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
-        writeBytesField: function(tag, buffer) {
-            this.writeTag(tag, Pbf.Bytes);
-            this.writeBytes(buffer);
-        },
-        writeFixed32Field: function(tag, val) {
-            this.writeTag(tag, Pbf.Fixed32);
-            this.writeFixed32(val);
-        },
-        writeSFixed32Field: function(tag, val) {
-            this.writeTag(tag, Pbf.Fixed32);
-            this.writeSFixed32(val);
-        },
-        writeFixed64Field: function(tag, val) {
-            this.writeTag(tag, Pbf.Fixed64);
-            this.writeFixed64(val);
-        },
-        writeSFixed64Field: function(tag, val) {
-            this.writeTag(tag, Pbf.Fixed64);
-            this.writeSFixed64(val);
-        },
-        writeVarintField: function(tag, val) {
-            this.writeTag(tag, Pbf.Varint);
-            this.writeVarint(val);
-        },
-        writeSVarintField: function(tag, val) {
-            this.writeTag(tag, Pbf.Varint);
-            this.writeSVarint(val);
-        },
-        writeStringField: function(tag, str) {
-            this.writeTag(tag, Pbf.Bytes);
-            this.writeString(str);
-        },
-        writeFloatField: function(tag, val) {
-            this.writeTag(tag, Pbf.Fixed32);
-            this.writeFloat(val);
-        },
-        writeDoubleField: function(tag, val) {
-            this.writeTag(tag, Pbf.Fixed64);
-            this.writeDouble(val);
-        },
-        writeBooleanField: function(tag, val) {
-            this.writeVarintField(tag, Boolean(val));
-        }
-    };
-    function readVarintRemainder(l, s, p) {
-        var buf = p.buf,
-            h, b;
-        b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
-        b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
-        b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
-        b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
-        b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
-        b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
-        throw new Error('Expected varint not more than 10 bytes');
-    }
-    function readPackedEnd(pbf) {
-        return pbf.type === Pbf.Bytes ?
-            pbf.readVarint() + pbf.pos : pbf.pos + 1;
-    }
-    function toNum(low, high, isSigned) {
-        if (isSigned) {
-            return high * 0x100000000 + (low >>> 0);
-        }
-        return ((high >>> 0) * 0x100000000) + (low >>> 0);
-    }
-    function writeBigVarint(val, pbf) {
-        var low, high;
-        if (val >= 0) {
-            low  = (val % 0x100000000) | 0;
-            high = (val / 0x100000000) | 0;
-        } else {
-            low  = ~(-val % 0x100000000);
-            high = ~(-val / 0x100000000);
-            if (low ^ 0xffffffff) {
-                low = (low + 1) | 0;
-            } else {
-                low = 0;
-                high = (high + 1) | 0;
-            }
-        }
-        if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
-            throw new Error('Given varint doesn\'t fit into 10 bytes');
-        }
-        pbf.realloc(10);
-        writeBigVarintLow(low, high, pbf);
-        writeBigVarintHigh(high, pbf);
-    }
-    function writeBigVarintLow(low, high, pbf) {
-        pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-        pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-        pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-        pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-        pbf.buf[pbf.pos]   = low & 0x7f;
-    }
-    function writeBigVarintHigh(high, pbf) {
-        var lsb = (high & 0x07) << 4;
-        pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
-        pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-        pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-        pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-        pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-        pbf.buf[pbf.pos++]  = high & 0x7f;
-    }
-    function makeRoomForExtraLength(startPos, len, pbf) {
-        var extraLen =
-            len <= 0x3fff ? 1 :
-                len <= 0x1fffff ? 2 :
-                    len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
-        pbf.realloc(extraLen);
-        for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
-    }
-    function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
-    function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
-    function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
-    function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
-    function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
-    function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
-    function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
-    function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
-    function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
-    function readUInt32(buf, pos) {
-        return ((buf[pos]) |
-            (buf[pos + 1] << 8) |
-            (buf[pos + 2] << 16)) +
-            (buf[pos + 3] * 0x1000000);
-    }
-    function writeInt32(buf, val, pos) {
-        buf[pos] = val;
-        buf[pos + 1] = (val >>> 8);
-        buf[pos + 2] = (val >>> 16);
-        buf[pos + 3] = (val >>> 24);
-    }
-    function readInt32(buf, pos) {
-        return ((buf[pos]) |
-            (buf[pos + 1] << 8) |
-            (buf[pos + 2] << 16)) +
-            (buf[pos + 3] << 24);
-    }
-    function readUtf8(buf, pos, end) {
-        var str = '';
-        var i = pos;
-        while (i < end) {
-            var b0 = buf[i];
-            var c = null;
-            var bytesPerSequence =
-                b0 > 0xEF ? 4 :
-                    b0 > 0xDF ? 3 :
-                        b0 > 0xBF ? 2 : 1;
-            if (i + bytesPerSequence > end) break;
-            var b1, b2, b3;
-            if (bytesPerSequence === 1) {
-                if (b0 < 0x80) {
-                    c = b0;
-                }
-            } else if (bytesPerSequence === 2) {
-                b1 = buf[i + 1];
-                if ((b1 & 0xC0) === 0x80) {
-                    c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
-                    if (c <= 0x7F) {
-                        c = null;
-                    }
-                }
-            } else if (bytesPerSequence === 3) {
-                b1 = buf[i + 1];
-                b2 = buf[i + 2];
-                if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
-                    c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
-                    if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
-                        c = null;
-                    }
-                }
-            } else if (bytesPerSequence === 4) {
-                b1 = buf[i + 1];
-                b2 = buf[i + 2];
-                b3 = buf[i + 3];
-                if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
-                    c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
-                    if (c <= 0xFFFF || c >= 0x110000) {
-                        c = null;
-                    }
-                }
-            }
-            if (c === null) {
-                c = 0xFFFD;
-                bytesPerSequence = 1;
-            } else if (c > 0xFFFF) {
-                c -= 0x10000;
-                str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
-                c = 0xDC00 | c & 0x3FF;
-            }
-            str += String.fromCharCode(c);
-            i += bytesPerSequence;
-        }
-        return str;
-    }
-    function writeUtf8(buf, str, pos) {
-        for (var i = 0, c, lead; i < str.length; i++) {
-            c = str.charCodeAt(i);
-            if (c > 0xD7FF && c < 0xE000) {
-                if (lead) {
-                    if (c < 0xDC00) {
-                        buf[pos++] = 0xEF;
-                        buf[pos++] = 0xBF;
-                        buf[pos++] = 0xBD;
-                        lead = c;
-                        continue;
-                    } else {
-                        c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
-                        lead = null;
-                    }
-                } else {
-                    if (c > 0xDBFF || (i + 1 === str.length)) {
-                        buf[pos++] = 0xEF;
-                        buf[pos++] = 0xBF;
-                        buf[pos++] = 0xBD;
-                    } else {
-                        lead = c;
-                    }
-                    continue;
-                }
-            } else if (lead) {
-                buf[pos++] = 0xEF;
-                buf[pos++] = 0xBF;
-                buf[pos++] = 0xBD;
-                lead = null;
-            }
-            if (c < 0x80) {
-                buf[pos++] = c;
-            } else {
-                if (c < 0x800) {
-                    buf[pos++] = c >> 0x6 | 0xC0;
-                } else {
-                    if (c < 0x10000) {
-                        buf[pos++] = c >> 0xC | 0xE0;
-                    } else {
-                        buf[pos++] = c >> 0x12 | 0xF0;
-                        buf[pos++] = c >> 0xC & 0x3F | 0x80;
-                    }
-                    buf[pos++] = c >> 0x6 & 0x3F | 0x80;
-                }
-                buf[pos++] = c & 0x3F | 0x80;
-            }
-        }
-        return pos;
-    }
-
-    exports.Protobuf = Pbf;
-
-});
diff --git a/public/libs/Cesium/Workers/transcodeCRNToDXT.js b/public/libs/Cesium/Workers/transcodeCRNToDXT.js
deleted file mode 100644
index 575a001..0000000
--- a/public/libs/Cesium/Workers/transcodeCRNToDXT.js
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './createTaskProcessorWorker', './PixelFormat-e6d821ed'], function (when, RuntimeError, WebGLConstants, createTaskProcessorWorker, PixelFormat) { 'use strict';
-
-    // Modified from texture-tester
-    // See:
-    //     https://github.com/toji/texture-tester/blob/master/js/webgl-texture-util.js
-    //     http://toji.github.io/texture-tester/
-
-    /**
-     * @license
-     *
-     * Copyright (c) 2014, Brandon Jones. All rights reserved.
-     *
-     * Redistribution and use in source and binary forms, with or without modification,
-     * are permitted provided that the following conditions are met:
-     *
-     *  * Redistributions of source code must retain the above copyright notice, this
-     *  list of conditions and the following disclaimer.
-     *  * Redistributions in binary form must reproduce the above copyright notice,
-     *  this list of conditions and the following disclaimer in the documentation
-     *  and/or other materials provided with the distribution.
-     *
-     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-     * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-     * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-     * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-     */
-
-    // Taken from crnlib.h
-    var CRN_FORMAT = {
-        cCRNFmtInvalid: -1,
-
-        cCRNFmtDXT1: 0,
-        // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS.
-        cCRNFmtDXT3: 1,
-        cCRNFmtDXT5: 2
-
-        // Crunch supports more formats than this, but we can't use them here.
-    };
-
-    // Mapping of Crunch formats to DXT formats.
-    var DXT_FORMAT_MAP = {};
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.PixelFormat.RGB_DXT1;
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.PixelFormat.RGBA_DXT3;
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.PixelFormat.RGBA_DXT5;
-
-    var dst;
-    var dxtData;
-    var cachedDstSize = 0;
-
-    var crunch;
-
-    // Copy an array of bytes into or out of the emscripten heap.
-    function arrayBufferCopy(src, dst, dstByteOffset, numBytes) {
-        var i;
-        var dst32Offset = dstByteOffset / 4;
-        var tail = (numBytes % 4);
-        var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4);
-        var dst32 = new Uint32Array(dst.buffer);
-        for (i = 0; i < src32.length; i++) {
-            dst32[dst32Offset + i] = src32[i];
-        }
-        for (i = numBytes - tail; i < numBytes; i++) {
-            dst[dstByteOffset + i] = src[i];
-        }
-    }
-
-    /**
-     * @private
-     */
-    function convertCRNToDXT(parameters, transferableObjects) {
-        // Copy the contents of the arrayBuffer into emscriptens heap.
-        var arrayBuffer = parameters.data;
-        var srcSize = arrayBuffer.byteLength;
-        var bytes = new Uint8Array(arrayBuffer);
-        var src = crunch._malloc(srcSize);
-        arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize);
-
-        // Determine what type of compressed data the file contains.
-        var crnFormat = crunch._crn_get_dxt_format(src, srcSize);
-        var format = DXT_FORMAT_MAP[crnFormat];
-        if (!when.defined(format)) {
-            throw new RuntimeError.RuntimeError('Unsupported compressed format.');
-        }
-
-        // Gather basic metrics about the DXT data.
-        var levels = crunch._crn_get_levels(src, srcSize);
-        var width = crunch._crn_get_width(src, srcSize);
-        var height = crunch._crn_get_height(src, srcSize);
-
-        // Determine the size of the decoded DXT data.
-        var dstSize = 0;
-        var i;
-        for (i = 0; i < levels; ++i) {
-            dstSize += PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width >> i, height >> i);
-        }
-
-        // Allocate enough space on the emscripten heap to hold the decoded DXT data
-        // or reuse the existing allocation if a previous call to this function has
-        // already acquired a large enough buffer.
-        if(cachedDstSize < dstSize) {
-            if(when.defined(dst)) {
-                crunch._free(dst);
-            }
-            dst = crunch._malloc(dstSize);
-            dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize);
-            cachedDstSize = dstSize;
-        }
-
-        // Decompress the DXT data from the Crunch file into the allocated space.
-        crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels);
-
-        // Release the crunch file data from the emscripten heap.
-        crunch._free(src);
-
-        var bOutMipMapData = when.defaultValue(parameters.bMipMap, false);
-        if(bOutMipMapData){
-            var dXTDataMipMap = dxtData.slice(0, dstSize);
-            transferableObjects.push(dXTDataMipMap.buffer);
-            return new PixelFormat.CompressedTextureBuffer(format, width, height, dXTDataMipMap);
-        }
-        else {
-            // Mipmaps are unsupported, so copy the level 0 texture
-            // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap.
-            var length = PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width, height);
-
-            // Get a copy of the 0th mip level. dxtData will exceed length when there are more mip levels.
-            // Equivalent to dxtData.slice(0, length), which is not supported in IE11
-            var level0DXTDataView = dxtData.subarray(0, length);
-            var level0DXTData = new Uint8Array(length);
-            level0DXTData.set(level0DXTDataView, 0);
-
-            transferableObjects.push(level0DXTData.buffer);
-            return new PixelFormat.CompressedTextureBuffer(format, width, height, level0DXTData);
-        }
-    }
-
-    function initWorker(crunchModule) {
-        crunch = crunchModule;
-        self.onmessage = createTaskProcessorWorker(convertCRNToDXT);
-        self.postMessage(true);
-    }
-
-    function transcodeCRNToDXT(event) {
-        var data = event.data;
-
-        // Expect the first message to be to load a web assembly module
-        var wasmConfig = data.webAssemblyConfig;
-        if (when.defined(wasmConfig)) {
-            // Require and compile WebAssembly module, or use fallback if not supported
-            return require([wasmConfig.modulePath], function(crnModule) {
-                if (when.defined(wasmConfig.wasmBinaryFile)) {
-                    if (!when.defined(crnModule)) {
-                        crnModule = self.Module;
-                    }
-                    initWorker(crnModule);
-                } else {
-                    initWorker(crnModule);
-                }
-            });
-        }
-    }
-
-    return transcodeCRNToDXT;
-
-});
diff --git a/public/libs/Cesium/Workers/transcodeCRNToDXTprevious.js b/public/libs/Cesium/Workers/transcodeCRNToDXTprevious.js
deleted file mode 100644
index 3258680..0000000
--- a/public/libs/Cesium/Workers/transcodeCRNToDXTprevious.js
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './createTaskProcessorWorker', './PixelFormat-e6d821ed'], function (when, RuntimeError, WebGLConstants, createTaskProcessorWorker, PixelFormat) { 'use strict';
-
-    /**
-     * @licence
-     * crunch/crnlib uses the ZLIB license:
-     * http://opensource.org/licenses/Zlib
-     *
-     * Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC
-     *
-     * This software is provided 'as-is', without any express or implied
-     * warranty.  In no event will the authors be held liable for any damages
-     * arising from the use of this software.
-     *
-     * Permission is granted to anyone to use this software for any purpose,
-     * including commercial applications, and to alter it and redistribute it
-     * freely, subject to the following restrictions:
-     *
-     * 1. The origin of this software must not be misrepresented; you must not
-     * claim that you wrote the original software. If you use this software
-     * in a product, an acknowledgment in the product documentation would be
-     * appreciated but is not required.
-     *
-     * 2. Altered source versions must be plainly marked as such, and must not be
-     * misrepresented as being the original software.
-     *
-     * 3. This notice may not be removed or altered from any source distribution.
-     */
-
-    // The C++ code was compiled to Javascript with Emcripten.
-    // For instructions, see: https://github.com/BinomialLLC/crunch
-
-    var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key];}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true;}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true;}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true;}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true;}else{throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;}if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret);}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f));};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/");}else{Module["thisProgram"]="unknown-program";}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module;}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return "[Emscripten Module object]"});}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read;}else{Module["read"]=function shell_read(){throw "no read() available"};}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs;}else if(typeof arguments!="undefined"){Module["arguments"]=arguments;}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status);});}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)};}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);}else{onerror();}};xhr.onerror=onerror;xhr.send(null);};if(typeof arguments!="undefined"){Module["arguments"]=arguments;}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function shell_print(x){console.log(x);};if(!Module["printErr"])Module["printErr"]=function shell_printErr(x){console.warn(x);};}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x);}):(function(x){});}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts;}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title;});}}else{throw "Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x);}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f));};}if(!Module["print"]){Module["print"]=(function(){});}if(!Module["printErr"]){Module["printErr"]=Module["print"];}if(!Module["arguments"]){Module["arguments"]=[];}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program";}if(!Module["quit"]){Module["quit"]=(function(status,toThrow){throw toThrow});}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key];}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop;}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4;}}else{assert((ptr&3)===0);}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return 2*(1+i)}}throw "Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null;}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text);}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={};}var sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func)};}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return Runtime.dynCall(sig,func,[arg])};}else{sigCache[func]=function dynCall_wrapper(){return Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))};}}return sigCache[func]}),getCompilerSetting:(function(name){throw "You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work"}),stackAlloc:(function(size){var ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return ret}),staticAlloc:(function(size){var ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return ret}),dynamicAlloc:(function(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var ABORT=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text);}}function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident);}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave();}),"stackRestore":(function(){Runtime.stackRestore();}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len);}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i]);}else{cArgs[i]=args[i];}}}var ret=func.apply(null,cArgs);if(returnType==="string")ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack);}));return}Runtime.stackRestore(stack);}return ret};var sourceRegex=/^function\s*[a-zA-Z$_0-9]*\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/;function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return {arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun]);}}}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident);var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs){return cfunc}var argNames=argTypes.map((function(x,i){return "$"+i}));var funcstr="(function("+argNames.join(",")+") {";var nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+="var stack = "+JSsource["stackSave"].body+";";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type==="number")continue;var convertCode=JSsource[type+"ToC"];funcstr+="var "+convertCode.arguments+" = "+arg+";";funcstr+=convertCode.body+";";funcstr+=arg+"=("+convertCode.returnValue+");";}}var cfuncname=parseJSFunc((function(){return cfunc})).returnValue;funcstr+="var ret = "+cfuncname+"("+argNames.join(",")+");";if(!numericRet){var strgfy=parseJSFunc((function(){return Pointer_stringify})).returnValue;funcstr+="ret = "+strgfy+"(ret);";}if(!numericArgs){ensureJSsource();funcstr+=JSsource["stackRestore"].body.replace("()","(stack)")+";";}funcstr+="return ret})";return eval(funcstr)};}))();Module["ccall"]=ccall;Module["cwrap"]=cwrap;function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type);}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type);}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab;}else{zeroinit=false;size=slab.length;}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr;}else{ret=[typeof _malloc==="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length));}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0;}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0;}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret);}else{HEAPU8.set(new Uint8Array(slab),ret);}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];if(typeof curr==="function"){curr=Runtime.getFunctionIndex(curr);}type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type;}i+=typeSize;}return ret}Module["allocate"]=allocate;function getMemory(size){if(!staticSealed)return Runtime.staticAlloc(size);if(!runtimeInitialized)return Runtime.dynamicAlloc(size);return _malloc(size)}Module["getMemory"]=getMemory;function Pointer_stringify(ptr,length){if(length===0||!ptr)return "";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK;}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch);}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2;}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3;}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4;}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5;}}}if(u0<65536){str+=String.fromCharCode(u0);}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023);}}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u;}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63;}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63;}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63;}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63;}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63;}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len;}else if(u<=2047){len+=2;}else if(u<=65535){len+=3;}else if(u<=2097151){len+=4;}else if(u<=67108863){len+=5;}else{len+=6;}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){var __cxa_demangle_func=Module["___cxa_demangle"]||Module["__cxa_demangle"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret);}return func}Runtime.warnOnce("warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling");return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e;}if(!err.stack){return "(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}Module["stackTrace"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple;}return x}var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf;}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer);}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value "+TOTAL_MEMORY+", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 ");}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size);}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8);}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE);}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT);}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4));}catch(e){byteLength=(function(buffer){return buffer.byteLength});}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"];}else{{buffer=new ArrayBuffer(TOTAL_MEMORY);}}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw "Runtime error: expected the system to be little-endian!";Module["HEAP"]=HEAP;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8;Module["HEAP16"]=HEAP16;Module["HEAP32"]=HEAP32;Module["HEAPU8"]=HEAPU8;Module["HEAPU16"]=HEAPU16;Module["HEAPU32"]=HEAPU32;Module["HEAPF32"]=HEAPF32;Module["HEAPF64"]=HEAPF64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func);}else{Module["dynCall_vi"](func,callback.arg);}}else{func(callback.arg===undefined?null:callback.arg);}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift());}}callRuntimeCallbacks(__ATPRERUN__);}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__);}function preMain(){callRuntimeCallbacks(__ATMAIN__);}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift());}}callRuntimeCallbacks(__ATPOSTRUN__);}function addOnPreRun(cb){__ATPRERUN__.unshift(cb);}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb);}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb);}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb);}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb);}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){chr&=255;}ret.push(String.fromCharCode(chr));}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end];}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar;}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer);}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i);}if(!dontAddNull)HEAP8[buffer>>0]=0;}Module["writeAsciiToMemory"]=writeAsciiToMemory;if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];if(!Math["trunc"])Math["trunc"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math["trunc"];var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies);}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies);}if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback();}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+6192;__ATINIT__.push();allocate([228,2,0,0,81,16,0,0,12,3,0,0,177,16,0,0,32,0,0,0,0,0,0,0,12,3,0,0,94,16,0,0,48,0,0,0,0,0,0,0,228,2,0,0,127,16,0,0,12,3,0,0,140,16,0,0,16,0,0,0,0,0,0,0,12,3,0,0,183,17,0,0,32,0,0,0,0,0,0,0,12,3,0,0,147,17,0,0,72,0,0,0,0,0,0,0,108,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,32,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,1,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,40,20,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,16,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,56,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,37,115,40,37,117,41,58,32,65,115,115,101,114,116,105,111,110,32,102,97,105,108,117,114,101,58,32,34,37,115,34,10,0,109,95,115,105,122,101,32,60,61,32,109,95,99,97,112,97,99,105,116,121,0,46,47,105,110,99,92,99,114,110,95,100,101,99,111,109,112,46,104,0,109,105,110,95,110,101,119,95,99,97,112,97,99,105,116,121,32,60,32,40,48,120,55,70,70,70,48,48,48,48,85,32,47,32,101,108,101,109,101,110,116,95,115,105,122,101,41,0,110,101,119,95,99,97,112,97,99,105,116,121,32,38,38,32,40,110,101,119,95,99,97,112,97,99,105,116,121,32,62,32,109,95,99,97,112,97,99,105,116,121,41,0,110,117,109,95,99,111,100,101,115,91,99,93,0,115,111,114,116,101,100,95,112,111,115,32,60,32,116,111,116,97,108,95,117,115,101,100,95,115,121,109,115,0,112,67,111,100,101,115,105,122,101,115,91,115,121,109,95,105,110,100,101,120,93,32,61,61,32,99,111,100,101,115,105,122,101,0,116,32,60,32,40,49,85,32,60,60,32,116,97,98,108,101,95,98,105,116,115,41,0,109,95,108,111,111,107,117,112,91,116,93,32,61,61,32,99,85,73,78,84,51,50,95,77,65,88,0,99,114,110,100,95,109,97,108,108,111,99,58,32,115,105,122,101,32,116,111,111,32,98,105,103,0,99,114,110,100,95,109,97,108,108,111,99,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,0,40,40,117,105,110,116,51,50,41,112,95,110,101,119,32,38,32,40,67,82,78,68,95,77,73,78,95,65,76,76,79,67,95,65,76,73,71,78,77,69,78,84,32,45,32,49,41,41,32,61,61,32,48,0,99,114,110,100,95,114,101,97,108,108,111,99,58,32,98,97,100,32,112,116,114,0,99,114,110,100,95,102,114,101,101,58,32,98,97,100,32,112,116,114,0,102,97,108,115,101,0,40,116,111,116,97,108,95,115,121,109,115,32,62,61,32,49,41,32,38,38,32,40,116,111,116,97,108,95,115,121,109,115,32,60,61,32,112,114,101,102,105,120,95,99,111,100,105,110,103,58,58,99,77,97,120,83,117,112,112,111,114,116,101,100,83,121,109,115,41,0,17,18,19,20,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15,16,48,0,110,117,109,95,98,105,116,115,32,60,61,32,51,50,85,0,109,95,98,105,116,95,99,111,117,110,116,32,60,61,32,99,66,105,116,66,117,102,83,105,122,101,0,116,32,33,61,32,99,85,73,78,84,51,50,95,77,65,88,0,109,111,100,101,108,46,109,95,99,111,100,101,95,115,105,122,101,115,91,115,121,109,93,32,61,61,32,108,101,110,0,0,2,3,1,0,2,3,4,5,6,7,1,40,108,101,110,32,62,61,32,49,41,32,38,38,32,40,108,101,110,32,60,61,32,99,77,97,120,69,120,112,101,99,116,101,100,67,111,100,101,83,105,122,101,41,0,105,32,60,32,109,95,115,105,122,101,0,110,101,120,116,95,108,101,118,101,108,95,111,102,115,32,62,32,99,117,114,95,108,101,118,101,108,95,111,102,115,0,1,2,2,3,3,3,3,4,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,2,1,2,0,0,0,1,0,2,1,0,2,0,0,1,2,3,110,117,109,32,38,38,32,40,110,117,109,32,61,61,32,126,110,117,109,95,99,104,101,99,107,41,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,58,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,102,111,114,101,105,103,110,32,101,120,99,101,112,116,105,111,110,0,116,101,114,109,105,110,97,116,105,110,103,0,117,110,99,97,117,103,104,116,0,83,116,57,101,120,99,101,112,116,105,111,110,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,112,116,104,114,101,97,100,95,111,110,99,101,32,102,97,105,108,117,114,101,32,105,110,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,95,102,97,115,116,40,41,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,116,104,114,101,97,100,32,107,101,121,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,99,97,110,110,111,116,32,122,101,114,111,32,111,117,116,32,116,104,114,101,97,100,32,118,97,108,117,101,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,114,101,116,117,114,110,101,100,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,57,95,95,112,111,105,110,116,101,114,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,112,98,97,115,101,95,116,121,112,101,95,105,110,102,111,69,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _abort(){Module["abort"]();}function __ZSt18uncaught_exceptionv(){return !!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++;}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr);}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr);}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0;})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--;}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1;}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0);})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return -e.errno}}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",ALLOC_STATIC);var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr;}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return (Runtime.setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return (Runtime.setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i<typeArray.length;i++){if(typeArray[i]&&Module["___cxa_can_catch"](typeArray[i],throwntype,thrown)){thrown=HEAP32[thrown>>2];info.adjusted=thrown;return (Runtime.setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return (Runtime.setTempRet0(throwntype),thrown)|0}function ___gxx_personality_v0(){}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return -e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?Module["print"]:Module["printErr"])(UTF8ArrayToString(buffer,0));buffer.length=0;}else{buffer.push(curr);}});}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j]);}ret+=len;}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return -e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return -e.errno}}__ATEXIT__.push((function(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10);}));DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0);}}function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5);}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0);}}function invoke_vi(index,a1){try{Module["dynCall_vi"](index,a1);}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0);}}function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0);}}function invoke_viii(index,a1,a2,a3){try{Module["dynCall_viii"](index,a1,a2,a3);}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0);}}function invoke_v(index){try{Module["dynCall_v"](index);}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0);}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6);}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0);}}function invoke_viiii(index,a1,a2,a3,a4){try{Module["dynCall_viiii"](index,a1,a2,a3,a4);}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0);}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity,"byteLength":byteLength};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_iiii":invoke_iiii,"invoke_viiiii":invoke_viiiii,"invoke_vi":invoke_vi,"invoke_ii":invoke_ii,"invoke_viii":invoke_viii,"invoke_v":invoke_v,"invoke_viiiiii":invoke_viiiiii,"invoke_viiii":invoke_viiii,"_pthread_getspecific":_pthread_getspecific,"___syscall54":___syscall54,"_pthread_setspecific":_pthread_setspecific,"___gxx_personality_v0":___gxx_personality_v0,"___syscall6":___syscall6,"___setErrNo":___setErrNo,"_abort":_abort,"___cxa_begin_catch":___cxa_begin_catch,"_pthread_once":_pthread_once,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_pthread_key_create":_pthread_key_create,"___syscall140":___syscall140,"___resumeException":___resumeException,"___cxa_find_matching_catch":___cxa_find_matching_catch,"___syscall146":___syscall146,"__ZSt18uncaught_exceptionv":__ZSt18uncaught_exceptionv,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX,"cttz_i8":cttz_i8};// EMSCRIPTEN_START_ASM
-    var asm=(function(global,env,buffer) {
-    "almost asm";var a=global.Int8Array;var b=new a(buffer);var c=global.Int16Array;var d=new c(buffer);var e=global.Int32Array;var f=new e(buffer);var g=global.Uint8Array;var h=new g(buffer);var i=global.Uint16Array;var j=new i(buffer);var k=global.Uint32Array;var l=new k(buffer);var m=global.Float32Array;var n=new m(buffer);var o=global.Float64Array;var p=new o(buffer);var q=global.byteLength;var r=env.DYNAMICTOP_PTR|0;var s=env.tempDoublePtr|0;var t=env.ABORT|0;var u=env.STACKTOP|0;var v=env.STACK_MAX|0;var w=env.cttz_i8|0;var B=global.NaN,C=global.Infinity;var I=0;var J=global.Math.floor;var K=global.Math.abs;var L=global.Math.sqrt;var M=global.Math.pow;var N=global.Math.cos;var O=global.Math.sin;var P=global.Math.tan;var Q=global.Math.acos;var R=global.Math.asin;var S=global.Math.atan;var T=global.Math.atan2;var U=global.Math.exp;var V=global.Math.log;var W=global.Math.ceil;var X=global.Math.imul;var Y=global.Math.min;var Z=global.Math.max;var _=global.Math.clz32;var $=env.abort;var aa=env.assert;var ba=env.enlargeMemory;var ca=env.getTotalMemory;var da=env.abortOnCannotGrowMemory;var ea=env.invoke_iiii;var fa=env.invoke_viiiii;var ga=env.invoke_vi;var ha=env.invoke_ii;var ia=env.invoke_viii;var ja=env.invoke_v;var ka=env.invoke_viiiiii;var la=env.invoke_viiii;var ma=env._pthread_getspecific;var na=env.___syscall54;var oa=env._pthread_setspecific;var pa=env.___gxx_personality_v0;var qa=env.___syscall6;var ra=env.___setErrNo;var sa=env._abort;var ta=env.___cxa_begin_catch;var ua=env._pthread_once;var va=env._emscripten_memcpy_big;var wa=env._pthread_key_create;var xa=env.___syscall140;var ya=env.___resumeException;var za=env.___cxa_find_matching_catch;var Aa=env.___syscall146;var Ba=env.__ZSt18uncaught_exceptionv;function Da(newBuffer){if(q(newBuffer)&16777215||q(newBuffer)<=16777215||q(newBuffer)>2147483648)return false;b=new a(newBuffer);d=new c(newBuffer);f=new e(newBuffer);h=new g(newBuffer);j=new i(newBuffer);l=new k(newBuffer);n=new m(newBuffer);p=new o(newBuffer);buffer=newBuffer;return true}
-    // EMSCRIPTEN_START_FUNCS
-    function Ma(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0;x=u;u=u+16|0;n=x;do if(a>>>0<245){k=a>>>0<11?16:a+11&-8;a=k>>>3;m=f[1144]|0;c=m>>>a;if(c&3|0){b=(c&1^1)+a|0;a=4616+(b<<1<<2)|0;c=a+8|0;d=f[c>>2]|0;e=d+8|0;g=f[e>>2]|0;if((a|0)==(g|0))f[1144]=m&~(1<<b);else{f[g+12>>2]=a;f[c>>2]=g;}w=b<<3;f[d+4>>2]=w|3;w=d+w+4|0;f[w>>2]=f[w>>2]|1;w=e;u=x;return w|0}l=f[1146]|0;if(k>>>0>l>>>0){if(c|0){b=2<<a;b=c<<a&(b|0-b);b=(b&0-b)+-1|0;h=b>>>12&16;b=b>>>h;c=b>>>5&8;b=b>>>c;e=b>>>2&4;b=b>>>e;a=b>>>1&2;b=b>>>a;d=b>>>1&1;d=(c|h|e|a|d)+(b>>>d)|0;b=4616+(d<<1<<2)|0;a=b+8|0;e=f[a>>2]|0;h=e+8|0;c=f[h>>2]|0;if((b|0)==(c|0)){a=m&~(1<<d);f[1144]=a;}else{f[c+12>>2]=b;f[a>>2]=c;a=m;}g=(d<<3)-k|0;f[e+4>>2]=k|3;d=e+k|0;f[d+4>>2]=g|1;f[d+g>>2]=g;if(l|0){e=f[1149]|0;b=l>>>3;c=4616+(b<<1<<2)|0;b=1<<b;if(!(a&b)){f[1144]=a|b;b=c;a=c+8|0;}else{a=c+8|0;b=f[a>>2]|0;}f[a>>2]=e;f[b+12>>2]=e;f[e+8>>2]=b;f[e+12>>2]=c;}f[1146]=g;f[1149]=d;w=h;u=x;return w|0}i=f[1145]|0;if(i){c=(i&0-i)+-1|0;h=c>>>12&16;c=c>>>h;g=c>>>5&8;c=c>>>g;j=c>>>2&4;c=c>>>j;d=c>>>1&2;c=c>>>d;a=c>>>1&1;a=f[4880+((g|h|j|d|a)+(c>>>a)<<2)>>2]|0;c=(f[a+4>>2]&-8)-k|0;d=f[a+16+(((f[a+16>>2]|0)==0&1)<<2)>>2]|0;if(!d){j=a;g=c;}else{do{h=(f[d+4>>2]&-8)-k|0;j=h>>>0<c>>>0;c=j?h:c;a=j?d:a;d=f[d+16+(((f[d+16>>2]|0)==0&1)<<2)>>2]|0;}while((d|0)!=0);j=a;g=c;}h=j+k|0;if(j>>>0<h>>>0){e=f[j+24>>2]|0;b=f[j+12>>2]|0;do if((b|0)==(j|0)){a=j+20|0;b=f[a>>2]|0;if(!b){a=j+16|0;b=f[a>>2]|0;if(!b){c=0;break}}while(1){c=b+20|0;d=f[c>>2]|0;if(d|0){b=d;a=c;continue}c=b+16|0;d=f[c>>2]|0;if(!d)break;else{b=d;a=c;}}f[a>>2]=0;c=b;}else{c=f[j+8>>2]|0;f[c+12>>2]=b;f[b+8>>2]=c;c=b;}while(0);do if(e|0){b=f[j+28>>2]|0;a=4880+(b<<2)|0;if((j|0)==(f[a>>2]|0)){f[a>>2]=c;if(!c){f[1145]=i&~(1<<b);break}}else{f[e+16+(((f[e+16>>2]|0)!=(j|0)&1)<<2)>>2]=c;if(!c)break}f[c+24>>2]=e;b=f[j+16>>2]|0;if(b|0){f[c+16>>2]=b;f[b+24>>2]=c;}b=f[j+20>>2]|0;if(b|0){f[c+20>>2]=b;f[b+24>>2]=c;}}while(0);if(g>>>0<16){w=g+k|0;f[j+4>>2]=w|3;w=j+w+4|0;f[w>>2]=f[w>>2]|1;}else{f[j+4>>2]=k|3;f[h+4>>2]=g|1;f[h+g>>2]=g;if(l|0){d=f[1149]|0;b=l>>>3;c=4616+(b<<1<<2)|0;b=1<<b;if(!(m&b)){f[1144]=m|b;b=c;a=c+8|0;}else{a=c+8|0;b=f[a>>2]|0;}f[a>>2]=d;f[b+12>>2]=d;f[d+8>>2]=b;f[d+12>>2]=c;}f[1146]=g;f[1149]=h;}w=j+8|0;u=x;return w|0}else m=k;}else m=k;}else m=k;}else if(a>>>0<=4294967231){a=a+11|0;k=a&-8;j=f[1145]|0;if(j){d=0-k|0;a=a>>>8;if(a)if(k>>>0>16777215)i=31;else{m=(a+1048320|0)>>>16&8;v=a<<m;l=(v+520192|0)>>>16&4;v=v<<l;i=(v+245760|0)>>>16&2;i=14-(l|m|i)+(v<<i>>>15)|0;i=k>>>(i+7|0)&1|i<<1;}else i=0;c=f[4880+(i<<2)>>2]|0;a:do if(!c){c=0;a=0;v=57;}else{a=0;h=k<<((i|0)==31?0:25-(i>>>1)|0);g=0;while(1){e=(f[c+4>>2]&-8)-k|0;if(e>>>0<d>>>0)if(!e){a=c;d=0;e=c;v=61;break a}else{a=c;d=e;}e=f[c+20>>2]|0;c=f[c+16+(h>>>31<<2)>>2]|0;g=(e|0)==0|(e|0)==(c|0)?g:e;e=(c|0)==0;if(e){c=g;v=57;break}else h=h<<((e^1)&1);}}while(0);if((v|0)==57){if((c|0)==0&(a|0)==0){a=2<<i;a=j&(a|0-a);if(!a){m=k;break}m=(a&0-a)+-1|0;h=m>>>12&16;m=m>>>h;g=m>>>5&8;m=m>>>g;i=m>>>2&4;m=m>>>i;l=m>>>1&2;m=m>>>l;c=m>>>1&1;a=0;c=f[4880+((g|h|i|l|c)+(m>>>c)<<2)>>2]|0;}if(!c){i=a;h=d;}else{e=c;v=61;}}if((v|0)==61)while(1){v=0;c=(f[e+4>>2]&-8)-k|0;m=c>>>0<d>>>0;c=m?c:d;a=m?e:a;e=f[e+16+(((f[e+16>>2]|0)==0&1)<<2)>>2]|0;if(!e){i=a;h=c;break}else{d=c;v=61;}}if((i|0)!=0?h>>>0<((f[1146]|0)-k|0)>>>0:0){g=i+k|0;if(i>>>0>=g>>>0){w=0;u=x;return w|0}e=f[i+24>>2]|0;b=f[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=f[a>>2]|0;if(!b){a=i+16|0;b=f[a>>2]|0;if(!b){b=0;break}}while(1){c=b+20|0;d=f[c>>2]|0;if(d|0){b=d;a=c;continue}c=b+16|0;d=f[c>>2]|0;if(!d)break;else{b=d;a=c;}}f[a>>2]=0;}else{w=f[i+8>>2]|0;f[w+12>>2]=b;f[b+8>>2]=w;}while(0);do if(e){a=f[i+28>>2]|0;c=4880+(a<<2)|0;if((i|0)==(f[c>>2]|0)){f[c>>2]=b;if(!b){d=j&~(1<<a);f[1145]=d;break}}else{f[e+16+(((f[e+16>>2]|0)!=(i|0)&1)<<2)>>2]=b;if(!b){d=j;break}}f[b+24>>2]=e;a=f[i+16>>2]|0;if(a|0){f[b+16>>2]=a;f[a+24>>2]=b;}a=f[i+20>>2]|0;if(a){f[b+20>>2]=a;f[a+24>>2]=b;d=j;}else d=j;}else d=j;while(0);do if(h>>>0>=16){f[i+4>>2]=k|3;f[g+4>>2]=h|1;f[g+h>>2]=h;b=h>>>3;if(h>>>0<256){c=4616+(b<<1<<2)|0;a=f[1144]|0;b=1<<b;if(!(a&b)){f[1144]=a|b;b=c;a=c+8|0;}else{a=c+8|0;b=f[a>>2]|0;}f[a>>2]=g;f[b+12>>2]=g;f[g+8>>2]=b;f[g+12>>2]=c;break}b=h>>>8;if(b)if(h>>>0>16777215)b=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;t=(w+520192|0)>>>16&4;w=w<<t;b=(w+245760|0)>>>16&2;b=14-(t|v|b)+(w<<b>>>15)|0;b=h>>>(b+7|0)&1|b<<1;}else b=0;c=4880+(b<<2)|0;f[g+28>>2]=b;a=g+16|0;f[a+4>>2]=0;f[a>>2]=0;a=1<<b;if(!(d&a)){f[1145]=d|a;f[c>>2]=g;f[g+24>>2]=c;f[g+12>>2]=g;f[g+8>>2]=g;break}a=h<<((b|0)==31?0:25-(b>>>1)|0);c=f[c>>2]|0;while(1){if((f[c+4>>2]&-8|0)==(h|0)){v=97;break}d=c+16+(a>>>31<<2)|0;b=f[d>>2]|0;if(!b){v=96;break}else{a=a<<1;c=b;}}if((v|0)==96){f[d>>2]=g;f[g+24>>2]=c;f[g+12>>2]=g;f[g+8>>2]=g;break}else if((v|0)==97){v=c+8|0;w=f[v>>2]|0;f[w+12>>2]=g;f[v>>2]=g;f[g+8>>2]=w;f[g+12>>2]=c;f[g+24>>2]=0;break}}else{w=h+k|0;f[i+4>>2]=w|3;w=i+w+4|0;f[w>>2]=f[w>>2]|1;}while(0);w=i+8|0;u=x;return w|0}else m=k;}else m=k;}else m=-1;while(0);c=f[1146]|0;if(c>>>0>=m>>>0){b=c-m|0;a=f[1149]|0;if(b>>>0>15){w=a+m|0;f[1149]=w;f[1146]=b;f[w+4>>2]=b|1;f[w+b>>2]=b;f[a+4>>2]=m|3;}else{f[1146]=0;f[1149]=0;f[a+4>>2]=c|3;w=a+c+4|0;f[w>>2]=f[w>>2]|1;}w=a+8|0;u=x;return w|0}h=f[1147]|0;if(h>>>0>m>>>0){t=h-m|0;f[1147]=t;w=f[1150]|0;v=w+m|0;f[1150]=v;f[v+4>>2]=t|1;f[w+4>>2]=m|3;w=w+8|0;u=x;return w|0}if(!(f[1262]|0)){f[1264]=4096;f[1263]=4096;f[1265]=-1;f[1266]=-1;f[1267]=0;f[1255]=0;a=n&-16^1431655768;f[n>>2]=a;f[1262]=a;a=4096;}else a=f[1264]|0;i=m+48|0;j=m+47|0;g=a+j|0;e=0-a|0;k=g&e;if(k>>>0<=m>>>0){w=0;u=x;return w|0}a=f[1254]|0;if(a|0?(l=f[1252]|0,n=l+k|0,n>>>0<=l>>>0|n>>>0>a>>>0):0){w=0;u=x;return w|0}b:do if(!(f[1255]&4)){c=f[1150]|0;c:do if(c){d=5024;while(1){a=f[d>>2]|0;if(a>>>0<=c>>>0?(q=d+4|0,(a+(f[q>>2]|0)|0)>>>0>c>>>0):0)break;a=f[d+8>>2]|0;if(!a){v=118;break c}else d=a;}b=g-h&e;if(b>>>0<2147483647){a=ac(b|0)|0;if((a|0)==((f[d>>2]|0)+(f[q>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;v=135;break b}}else{d=a;v=126;}}else b=0;}else v=118;while(0);do if((v|0)==118){c=ac(0)|0;if((c|0)!=(-1|0)?(b=c,o=f[1263]|0,p=o+-1|0,b=((p&b|0)==0?0:(p+b&0-o)-b|0)+k|0,o=f[1252]|0,p=b+o|0,b>>>0>m>>>0&b>>>0<2147483647):0){q=f[1254]|0;if(q|0?p>>>0<=o>>>0|p>>>0>q>>>0:0){b=0;break}a=ac(b|0)|0;if((a|0)==(c|0)){h=b;g=c;v=135;break b}else{d=a;v=126;}}else b=0;}while(0);do if((v|0)==126){c=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(d|0)!=(-1|0))))if((d|0)==(-1|0)){b=0;break}else{h=b;g=d;v=135;break b}a=f[1264]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=d;v=135;break b}if((ac(a|0)|0)==(-1|0)){ac(c|0)|0;b=0;break}else{h=a+b|0;g=d;v=135;break b}}while(0);f[1255]=f[1255]|4;v=133;}else{b=0;v=133;}while(0);if(((v|0)==133?k>>>0<2147483647:0)?(t=ac(k|0)|0,q=ac(0)|0,r=q-t|0,s=r>>>0>(m+40|0)>>>0,!((t|0)==(-1|0)|s^1|t>>>0<q>>>0&((t|0)!=(-1|0)&(q|0)!=(-1|0))^1)):0){h=s?r:b;g=t;v=135;}if((v|0)==135){b=(f[1252]|0)+h|0;f[1252]=b;if(b>>>0>(f[1253]|0)>>>0)f[1253]=b;j=f[1150]|0;do if(j){b=5024;while(1){a=f[b>>2]|0;c=b+4|0;d=f[c>>2]|0;if((g|0)==(a+d|0)){v=145;break}e=f[b+8>>2]|0;if(!e)break;else b=e;}if(((v|0)==145?(f[b+12>>2]&8|0)==0:0)?j>>>0<g>>>0&j>>>0>=a>>>0:0){f[c>>2]=d+h;w=j+8|0;w=(w&7|0)==0?0:0-w&7;v=j+w|0;w=(f[1147]|0)+(h-w)|0;f[1150]=v;f[1147]=w;f[v+4>>2]=w|1;f[v+w+4>>2]=40;f[1151]=f[1266];break}if(g>>>0<(f[1148]|0)>>>0)f[1148]=g;c=g+h|0;b=5024;while(1){if((f[b>>2]|0)==(c|0)){v=153;break}a=f[b+8>>2]|0;if(!a)break;else b=a;}if((v|0)==153?(f[b+12>>2]&8|0)==0:0){f[b>>2]=g;l=b+4|0;f[l>>2]=(f[l>>2]|0)+h;l=g+8|0;l=g+((l&7|0)==0?0:0-l&7)|0;b=c+8|0;b=c+((b&7|0)==0?0:0-b&7)|0;k=l+m|0;i=b-l-m|0;f[l+4>>2]=m|3;do if((b|0)!=(j|0)){if((b|0)==(f[1149]|0)){w=(f[1146]|0)+i|0;f[1146]=w;f[1149]=k;f[k+4>>2]=w|1;f[k+w>>2]=w;break}a=f[b+4>>2]|0;if((a&3|0)==1){h=a&-8;d=a>>>3;d:do if(a>>>0<256){a=f[b+8>>2]|0;c=f[b+12>>2]|0;if((c|0)==(a|0)){f[1144]=f[1144]&~(1<<d);break}else{f[a+12>>2]=c;f[c+8>>2]=a;break}}else{g=f[b+24>>2]|0;a=f[b+12>>2]|0;do if((a|0)==(b|0)){d=b+16|0;c=d+4|0;a=f[c>>2]|0;if(!a){a=f[d>>2]|0;if(!a){a=0;break}else c=d;}while(1){d=a+20|0;e=f[d>>2]|0;if(e|0){a=e;c=d;continue}d=a+16|0;e=f[d>>2]|0;if(!e)break;else{a=e;c=d;}}f[c>>2]=0;}else{w=f[b+8>>2]|0;f[w+12>>2]=a;f[a+8>>2]=w;}while(0);if(!g)break;c=f[b+28>>2]|0;d=4880+(c<<2)|0;do if((b|0)!=(f[d>>2]|0)){f[g+16+(((f[g+16>>2]|0)!=(b|0)&1)<<2)>>2]=a;if(!a)break d}else{f[d>>2]=a;if(a|0)break;f[1145]=f[1145]&~(1<<c);break d}while(0);f[a+24>>2]=g;c=b+16|0;d=f[c>>2]|0;if(d|0){f[a+16>>2]=d;f[d+24>>2]=a;}c=f[c+4>>2]|0;if(!c)break;f[a+20>>2]=c;f[c+24>>2]=a;}while(0);b=b+h|0;e=h+i|0;}else e=i;b=b+4|0;f[b>>2]=f[b>>2]&-2;f[k+4>>2]=e|1;f[k+e>>2]=e;b=e>>>3;if(e>>>0<256){c=4616+(b<<1<<2)|0;a=f[1144]|0;b=1<<b;if(!(a&b)){f[1144]=a|b;b=c;a=c+8|0;}else{a=c+8|0;b=f[a>>2]|0;}f[a>>2]=k;f[b+12>>2]=k;f[k+8>>2]=b;f[k+12>>2]=c;break}b=e>>>8;do if(!b)b=0;else{if(e>>>0>16777215){b=31;break}v=(b+1048320|0)>>>16&8;w=b<<v;t=(w+520192|0)>>>16&4;w=w<<t;b=(w+245760|0)>>>16&2;b=14-(t|v|b)+(w<<b>>>15)|0;b=e>>>(b+7|0)&1|b<<1;}while(0);d=4880+(b<<2)|0;f[k+28>>2]=b;a=k+16|0;f[a+4>>2]=0;f[a>>2]=0;a=f[1145]|0;c=1<<b;if(!(a&c)){f[1145]=a|c;f[d>>2]=k;f[k+24>>2]=d;f[k+12>>2]=k;f[k+8>>2]=k;break}a=e<<((b|0)==31?0:25-(b>>>1)|0);c=f[d>>2]|0;while(1){if((f[c+4>>2]&-8|0)==(e|0)){v=194;break}d=c+16+(a>>>31<<2)|0;b=f[d>>2]|0;if(!b){v=193;break}else{a=a<<1;c=b;}}if((v|0)==193){f[d>>2]=k;f[k+24>>2]=c;f[k+12>>2]=k;f[k+8>>2]=k;break}else if((v|0)==194){v=c+8|0;w=f[v>>2]|0;f[w+12>>2]=k;f[v>>2]=k;f[k+8>>2]=w;f[k+12>>2]=c;f[k+24>>2]=0;break}}else{w=(f[1147]|0)+i|0;f[1147]=w;f[1150]=k;f[k+4>>2]=w|1;}while(0);w=l+8|0;u=x;return w|0}b=5024;while(1){a=f[b>>2]|0;if(a>>>0<=j>>>0?(w=a+(f[b+4>>2]|0)|0,w>>>0>j>>>0):0)break;b=f[b+8>>2]|0;}e=w+-47|0;a=e+8|0;a=e+((a&7|0)==0?0:0-a&7)|0;e=j+16|0;a=a>>>0<e>>>0?j:a;b=a+8|0;c=g+8|0;c=(c&7|0)==0?0:0-c&7;v=g+c|0;c=h+-40-c|0;f[1150]=v;f[1147]=c;f[v+4>>2]=c|1;f[v+c+4>>2]=40;f[1151]=f[1266];c=a+4|0;f[c>>2]=27;f[b>>2]=f[1256];f[b+4>>2]=f[1257];f[b+8>>2]=f[1258];f[b+12>>2]=f[1259];f[1256]=g;f[1257]=h;f[1259]=0;f[1258]=b;b=a+24|0;do{v=b;b=b+4|0;f[b>>2]=7;}while((v+8|0)>>>0<w>>>0);if((a|0)!=(j|0)){g=a-j|0;f[c>>2]=f[c>>2]&-2;f[j+4>>2]=g|1;f[a>>2]=g;b=g>>>3;if(g>>>0<256){c=4616+(b<<1<<2)|0;a=f[1144]|0;b=1<<b;if(!(a&b)){f[1144]=a|b;b=c;a=c+8|0;}else{a=c+8|0;b=f[a>>2]|0;}f[a>>2]=j;f[b+12>>2]=j;f[j+8>>2]=b;f[j+12>>2]=c;break}b=g>>>8;if(b)if(g>>>0>16777215)c=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;t=(w+520192|0)>>>16&4;w=w<<t;c=(w+245760|0)>>>16&2;c=14-(t|v|c)+(w<<c>>>15)|0;c=g>>>(c+7|0)&1|c<<1;}else c=0;d=4880+(c<<2)|0;f[j+28>>2]=c;f[j+20>>2]=0;f[e>>2]=0;b=f[1145]|0;a=1<<c;if(!(b&a)){f[1145]=b|a;f[d>>2]=j;f[j+24>>2]=d;f[j+12>>2]=j;f[j+8>>2]=j;break}a=g<<((c|0)==31?0:25-(c>>>1)|0);c=f[d>>2]|0;while(1){if((f[c+4>>2]&-8|0)==(g|0)){v=216;break}d=c+16+(a>>>31<<2)|0;b=f[d>>2]|0;if(!b){v=215;break}else{a=a<<1;c=b;}}if((v|0)==215){f[d>>2]=j;f[j+24>>2]=c;f[j+12>>2]=j;f[j+8>>2]=j;break}else if((v|0)==216){v=c+8|0;w=f[v>>2]|0;f[w+12>>2]=j;f[v>>2]=j;f[j+8>>2]=w;f[j+12>>2]=c;f[j+24>>2]=0;break}}}else{w=f[1148]|0;if((w|0)==0|g>>>0<w>>>0)f[1148]=g;f[1256]=g;f[1257]=h;f[1259]=0;f[1153]=f[1262];f[1152]=-1;b=0;do{w=4616+(b<<1<<2)|0;f[w+12>>2]=w;f[w+8>>2]=w;b=b+1|0;}while((b|0)!=32);w=g+8|0;w=(w&7|0)==0?0:0-w&7;v=g+w|0;w=h+-40-w|0;f[1150]=v;f[1147]=w;f[v+4>>2]=w|1;f[v+w+4>>2]=40;f[1151]=f[1266];}while(0);b=f[1147]|0;if(b>>>0>m>>>0){t=b-m|0;f[1147]=t;w=f[1150]|0;v=w+m|0;f[1150]=v;f[v+4>>2]=t|1;f[w+4>>2]=m|3;w=w+8|0;u=x;return w|0}}w=jd()|0;f[w>>2]=12;w=0;u=x;return w|0}function Na(a,c,d,e,g,i){a=a|0;c=+c;d=d|0;e=e|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;G=u;u=u+560|0;l=G+8|0;t=G;F=G+524|0;E=F;m=G+512|0;f[t>>2]=0;D=m+12|0;Fc(c)|0;if((I|0)<0){c=-c;B=1;A=2087;}else{B=(g&2049|0)!=0&1;A=(g&2048|0)==0?((g&1|0)==0?2088:2093):2090;}Fc(c)|0;C=I&2146435072;do if(C>>>0<2146435072|(C|0)==2146435072&0<0){q=+hd(c,t)*2.0;j=q!=0.0;if(j)f[t>>2]=(f[t>>2]|0)+-1;w=i|32;if((w|0)==97){r=i&32;p=(r|0)==0?A:A+9|0;o=B|2;j=12-e|0;do if(!(e>>>0>11|(j|0)==0)){c=8.0;do{j=j+-1|0;c=c*16.0;}while((j|0)!=0);if((b[p>>0]|0)==45){c=-(c+(-q-c));break}else{c=q+c-c;break}}else c=q;while(0);k=f[t>>2]|0;j=(k|0)<0?0-k|0:k;j=Rb(j,((j|0)<0)<<31>>31,D)|0;if((j|0)==(D|0)){j=m+11|0;b[j>>0]=48;}b[j+-1>>0]=(k>>31&2)+43;n=j+-2|0;b[n>>0]=i+15;m=(e|0)<1;l=(g&8|0)==0;j=F;do{C=~~c;k=j+1|0;b[j>>0]=h[2122+C>>0]|r;c=(c-+(C|0))*16.0;if((k-E|0)==1?!(l&(m&c==0.0)):0){b[k>>0]=46;j=j+2|0;}else j=k;}while(c!=0.0);C=j-E|0;E=D-n|0;D=(e|0)!=0&(C+-2|0)<(e|0)?e+2|0:C;j=E+o+D|0;Wb(a,32,d,j,g);Nc(a,p,o);Wb(a,48,d,j,g^65536);Nc(a,F,C);Wb(a,48,D-C|0,0,0);Nc(a,n,E);Wb(a,32,d,j,g^8192);break}k=(e|0)<0?6:e;if(j){j=(f[t>>2]|0)+-28|0;f[t>>2]=j;c=q*268435456.0;}else{c=q;j=f[t>>2]|0;}C=(j|0)<0?l:l+288|0;l=C;do{y=~~c>>>0;f[l>>2]=y;l=l+4|0;c=(c-+(y>>>0))*1.0e9;}while(c!=0.0);if((j|0)>0){m=C;o=l;while(1){n=(j|0)<29?j:29;j=o+-4|0;if(j>>>0>=m>>>0){l=0;do{x=yc(f[j>>2]|0,0,n|0)|0;x=Gc(x|0,I|0,l|0,0)|0;y=I;v=mc(x|0,y|0,1e9,0)|0;f[j>>2]=v;l=Uc(x|0,y|0,1e9,0)|0;j=j+-4|0;}while(j>>>0>=m>>>0);if(l){m=m+-4|0;f[m>>2]=l;}}l=o;while(1){if(l>>>0<=m>>>0)break;j=l+-4|0;if(!(f[j>>2]|0))l=j;else break}j=(f[t>>2]|0)-n|0;f[t>>2]=j;if((j|0)>0)o=l;else break}}else m=C;if((j|0)<0){e=((k+25|0)/9|0)+1|0;s=(w|0)==102;do{r=0-j|0;r=(r|0)<9?r:9;if(m>>>0<l>>>0){n=(1<<r)+-1|0;o=1e9>>>r;p=0;j=m;do{y=f[j>>2]|0;f[j>>2]=(y>>>r)+p;p=X(y&n,o)|0;j=j+4|0;}while(j>>>0<l>>>0);j=(f[m>>2]|0)==0?m+4|0:m;if(!p){m=j;j=l;}else{f[l>>2]=p;m=j;j=l+4|0;}}else{m=(f[m>>2]|0)==0?m+4|0:m;j=l;}l=s?C:m;l=(j-l>>2|0)>(e|0)?l+(e<<2)|0:j;j=(f[t>>2]|0)+r|0;f[t>>2]=j;}while((j|0)<0);j=m;e=l;}else{j=m;e=l;}y=C;if(j>>>0<e>>>0){l=(y-j>>2)*9|0;n=f[j>>2]|0;if(n>>>0>=10){m=10;do{m=m*10|0;l=l+1|0;}while(n>>>0>=m>>>0)}}else l=0;s=(w|0)==103;v=(k|0)!=0;m=k-((w|0)!=102?l:0)+((v&s)<<31>>31)|0;if((m|0)<(((e-y>>2)*9|0)+-9|0)){m=m+9216|0;r=C+4+(((m|0)/9|0)+-1024<<2)|0;m=((m|0)%9|0)+1|0;if((m|0)<9){n=10;do{n=n*10|0;m=m+1|0;}while((m|0)!=9)}else n=10;o=f[r>>2]|0;p=(o>>>0)%(n>>>0)|0;m=(r+4|0)==(e|0);if(!(m&(p|0)==0)){q=(((o>>>0)/(n>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;x=(n|0)/2|0;c=p>>>0<x>>>0?.5:m&(p|0)==(x|0)?1.0:1.5;if(B){x=(b[A>>0]|0)==45;c=x?-c:c;q=x?-q:q;}m=o-p|0;f[r>>2]=m;if(q+c!=q){x=m+n|0;f[r>>2]=x;if(x>>>0>999999999){l=r;while(1){m=l+-4|0;f[l>>2]=0;if(m>>>0<j>>>0){j=j+-4|0;f[j>>2]=0;}x=(f[m>>2]|0)+1|0;f[m>>2]=x;if(x>>>0>999999999)l=m;else break}}else m=r;l=(y-j>>2)*9|0;o=f[j>>2]|0;if(o>>>0>=10){n=10;do{n=n*10|0;l=l+1|0;}while(o>>>0>=n>>>0)}}else m=r;}else m=r;m=m+4|0;m=e>>>0>m>>>0?m:e;x=j;}else{m=e;x=j;}w=m;while(1){if(w>>>0<=x>>>0){t=0;break}j=w+-4|0;if(!(f[j>>2]|0))w=j;else{t=1;break}}e=0-l|0;do if(s){j=((v^1)&1)+k|0;if((j|0)>(l|0)&(l|0)>-5){n=i+-1|0;k=j+-1-l|0;}else{n=i+-2|0;k=j+-1|0;}j=g&8;if(!j){if(t?(z=f[w+-4>>2]|0,(z|0)!=0):0)if(!((z>>>0)%10|0)){m=0;j=10;do{j=j*10|0;m=m+1|0;}while(!((z>>>0)%(j>>>0)|0|0))}else m=0;else m=9;j=((w-y>>2)*9|0)+-9|0;if((n|32|0)==102){r=j-m|0;r=(r|0)>0?r:0;k=(k|0)<(r|0)?k:r;r=0;break}else{r=j+l-m|0;r=(r|0)>0?r:0;k=(k|0)<(r|0)?k:r;r=0;break}}else r=j;}else{n=i;r=g&8;}while(0);s=k|r;o=(s|0)!=0&1;p=(n|32|0)==102;if(p){v=0;j=(l|0)>0?l:0;}else{j=(l|0)<0?e:l;j=Rb(j,((j|0)<0)<<31>>31,D)|0;m=D;if((m-j|0)<2)do{j=j+-1|0;b[j>>0]=48;}while((m-j|0)<2);b[j+-1>>0]=(l>>31&2)+43;j=j+-2|0;b[j>>0]=n;v=j;j=m-j|0;}j=B+1+k+o+j|0;Wb(a,32,d,j,g);Nc(a,A,B);Wb(a,48,d,j,g^65536);if(p){n=x>>>0>C>>>0?C:x;r=F+9|0;o=r;p=F+8|0;m=n;do{l=Rb(f[m>>2]|0,0,r)|0;if((m|0)==(n|0)){if((l|0)==(r|0)){b[p>>0]=48;l=p;}}else if(l>>>0>F>>>0){Ib(F|0,48,l-E|0)|0;do l=l+-1|0;while(l>>>0>F>>>0)}Nc(a,l,o-l|0);m=m+4|0;}while(m>>>0<=C>>>0);if(s|0)Nc(a,2138,1);if(m>>>0<w>>>0&(k|0)>0)while(1){l=Rb(f[m>>2]|0,0,r)|0;if(l>>>0>F>>>0){Ib(F|0,48,l-E|0)|0;do l=l+-1|0;while(l>>>0>F>>>0)}Nc(a,l,(k|0)<9?k:9);m=m+4|0;l=k+-9|0;if(!(m>>>0<w>>>0&(k|0)>9)){k=l;break}else k=l;}Wb(a,48,k+9|0,9,0);}else{s=t?w:x+4|0;if((k|0)>-1){t=F+9|0;r=(r|0)==0;e=t;o=0-E|0;p=F+8|0;n=x;do{l=Rb(f[n>>2]|0,0,t)|0;if((l|0)==(t|0)){b[p>>0]=48;l=p;}do if((n|0)==(x|0)){m=l+1|0;Nc(a,l,1);if(r&(k|0)<1){l=m;break}Nc(a,2138,1);l=m;}else{if(l>>>0<=F>>>0)break;Ib(F|0,48,l+o|0)|0;do l=l+-1|0;while(l>>>0>F>>>0)}while(0);E=e-l|0;Nc(a,l,(k|0)>(E|0)?E:k);k=k-E|0;n=n+4|0;}while(n>>>0<s>>>0&(k|0)>-1)}Wb(a,48,k+18|0,18,0);Nc(a,v,D-v|0);}Wb(a,32,d,j,g^8192);}else{F=(i&32|0)!=0;j=B+3|0;Wb(a,32,d,j,g&-65537);Nc(a,A,B);Nc(a,c!=c|0.0!=0.0?(F?2114:2118):F?2106:2110,3);Wb(a,32,d,j,g^8192);}while(0);u=G;return ((j|0)<(d|0)?d:j)|0}function Oa(a,c,e,g,h){a=a|0;c=c|0;e=e|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;G=u;u=u+64|0;C=G+16|0;D=G;A=G+24|0;E=G+8|0;F=G+20|0;f[C>>2]=c;x=(a|0)!=0;y=A+40|0;z=y;A=A+39|0;B=E+4|0;j=0;i=0;n=0;a:while(1){do if((i|0)>-1)if((j|0)>(2147483647-i|0)){i=jd()|0;f[i>>2]=75;i=-1;break}else{i=j+i|0;break}while(0);j=b[c>>0]|0;if(!(j<<24>>24)){w=87;break}else k=c;b:while(1){switch(j<<24>>24){case 37:{j=k;w=9;break b}case 0:{j=k;break b}}v=k+1|0;f[C>>2]=v;j=b[v>>0]|0;k=v;}c:do if((w|0)==9)while(1){w=0;if((b[k+1>>0]|0)!=37)break c;j=j+1|0;k=k+2|0;f[C>>2]=k;if((b[k>>0]|0)==37)w=9;else break}while(0);j=j-c|0;if(x)Nc(a,c,j);if(j|0){c=k;continue}l=k+1|0;j=(b[l>>0]|0)+-48|0;if(j>>>0<10){v=(b[k+2>>0]|0)==36;t=v?j:-1;n=v?1:n;l=v?k+3|0:l;}else t=-1;f[C>>2]=l;j=b[l>>0]|0;k=(j<<24>>24)+-32|0;d:do if(k>>>0<32){m=0;o=j;while(1){j=1<<k;if(!(j&75913)){j=o;break d}m=j|m;l=l+1|0;f[C>>2]=l;j=b[l>>0]|0;k=(j<<24>>24)+-32|0;if(k>>>0>=32)break;else o=j;}}else m=0;while(0);if(j<<24>>24==42){k=l+1|0;j=(b[k>>0]|0)+-48|0;if(j>>>0<10?(b[l+2>>0]|0)==36:0){f[h+(j<<2)>>2]=10;j=f[g+((b[k>>0]|0)+-48<<3)>>2]|0;n=1;l=l+3|0;}else{if(n|0){i=-1;break}if(x){n=(f[e>>2]|0)+(4-1)&~(4-1);j=f[n>>2]|0;f[e>>2]=n+4;n=0;l=k;}else{j=0;n=0;l=k;}}f[C>>2]=l;v=(j|0)<0;j=v?0-j|0:j;m=v?m|8192:m;}else{j=ec(C)|0;if((j|0)<0){i=-1;break}l=f[C>>2]|0;}do if((b[l>>0]|0)==46){if((b[l+1>>0]|0)!=42){f[C>>2]=l+1;k=ec(C)|0;l=f[C>>2]|0;break}o=l+2|0;k=(b[o>>0]|0)+-48|0;if(k>>>0<10?(b[l+3>>0]|0)==36:0){f[h+(k<<2)>>2]=10;k=f[g+((b[o>>0]|0)+-48<<3)>>2]|0;l=l+4|0;f[C>>2]=l;break}if(n|0){i=-1;break a}if(x){v=(f[e>>2]|0)+(4-1)&~(4-1);k=f[v>>2]|0;f[e>>2]=v+4;}else k=0;f[C>>2]=o;l=o;}else k=-1;while(0);s=0;while(1){if(((b[l>>0]|0)+-65|0)>>>0>57){i=-1;break a}v=l+1|0;f[C>>2]=v;o=b[(b[l>>0]|0)+-65+(1606+(s*58|0))>>0]|0;q=o&255;if((q+-1|0)>>>0<8){s=q;l=v;}else break}if(!(o<<24>>24)){i=-1;break}r=(t|0)>-1;do if(o<<24>>24==19)if(r){i=-1;break a}else w=49;else{if(r){f[h+(t<<2)>>2]=q;r=g+(t<<3)|0;t=f[r+4>>2]|0;w=D;f[w>>2]=f[r>>2];f[w+4>>2]=t;w=49;break}if(!x){i=0;break a}db(D,q,e);}while(0);if((w|0)==49?(w=0,!x):0){j=0;c=v;continue}l=b[l>>0]|0;l=(s|0)!=0&(l&15|0)==3?l&-33:l;r=m&-65537;t=(m&8192|0)==0?m:r;e:do switch(l|0){case 110:switch((s&255)<<24>>24){case 0:{f[f[D>>2]>>2]=i;j=0;c=v;continue a}case 1:{f[f[D>>2]>>2]=i;j=0;c=v;continue a}case 2:{j=f[D>>2]|0;f[j>>2]=i;f[j+4>>2]=((i|0)<0)<<31>>31;j=0;c=v;continue a}case 3:{d[f[D>>2]>>1]=i;j=0;c=v;continue a}case 4:{b[f[D>>2]>>0]=i;j=0;c=v;continue a}case 6:{f[f[D>>2]>>2]=i;j=0;c=v;continue a}case 7:{j=f[D>>2]|0;f[j>>2]=i;f[j+4>>2]=((i|0)<0)<<31>>31;j=0;c=v;continue a}default:{j=0;c=v;continue a}}case 112:{l=120;k=k>>>0>8?k:8;c=t|8;w=61;break}case 88:case 120:{c=t;w=61;break}case 111:{l=D;c=f[l>>2]|0;l=f[l+4>>2]|0;q=kc(c,l,y)|0;r=z-q|0;m=0;o=2070;k=(t&8|0)==0|(k|0)>(r|0)?k:r+1|0;r=t;w=67;break}case 105:case 100:{l=D;c=f[l>>2]|0;l=f[l+4>>2]|0;if((l|0)<0){c=Cc(0,0,c|0,l|0)|0;l=I;m=D;f[m>>2]=c;f[m+4>>2]=l;m=1;o=2070;w=66;break e}else{m=(t&2049|0)!=0&1;o=(t&2048|0)==0?((t&1|0)==0?2070:2072):2071;w=66;break e}}case 117:{l=D;m=0;o=2070;c=f[l>>2]|0;l=f[l+4>>2]|0;w=66;break}case 99:{b[A>>0]=f[D>>2];c=A;m=0;o=2070;q=y;l=1;k=r;break}case 109:{l=jd()|0;l=Qc(f[l>>2]|0)|0;w=71;break}case 115:{l=f[D>>2]|0;l=l|0?l:2080;w=71;break}case 67:{f[E>>2]=f[D>>2];f[B>>2]=0;f[D>>2]=E;q=-1;l=E;w=75;break}case 83:{c=f[D>>2]|0;if(!k){Wb(a,32,j,0,t);c=0;w=84;}else{q=k;l=c;w=75;}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{j=Na(a,+p[D>>3],j,k,t,l)|0;c=v;continue a}default:{m=0;o=2070;q=y;l=k;k=t;}}while(0);f:do if((w|0)==61){t=D;s=f[t>>2]|0;t=f[t+4>>2]|0;q=gc(s,t,y,l&32)|0;o=(c&8|0)==0|(s|0)==0&(t|0)==0;m=o?0:2;o=o?2070:2070+(l>>4)|0;r=c;c=s;l=t;w=67;}else if((w|0)==66){q=Rb(c,l,y)|0;r=t;w=67;}else if((w|0)==71){w=0;t=vb(l,0,k)|0;s=(t|0)==0;c=l;m=0;o=2070;q=s?l+k|0:t;l=s?k:t-l|0;k=r;}else if((w|0)==75){w=0;o=l;c=0;k=0;while(1){m=f[o>>2]|0;if(!m)break;k=Rc(F,m)|0;if((k|0)<0|k>>>0>(q-c|0)>>>0)break;c=k+c|0;if(q>>>0>c>>>0)o=o+4|0;else break}if((k|0)<0){i=-1;break a}Wb(a,32,j,c,t);if(!c){c=0;w=84;}else{m=0;while(1){k=f[l>>2]|0;if(!k){w=84;break f}k=Rc(F,k)|0;m=k+m|0;if((m|0)>(c|0)){w=84;break f}Nc(a,F,k);if(m>>>0>=c>>>0){w=84;break}else l=l+4|0;}}}while(0);if((w|0)==67){w=0;l=(c|0)!=0|(l|0)!=0;t=(k|0)!=0|l;l=((l^1)&1)+(z-q)|0;c=t?q:y;q=y;l=t?((k|0)>(l|0)?k:l):k;k=(k|0)>-1?r&-65537:r;}else if((w|0)==84){w=0;Wb(a,32,j,c,t^8192);j=(j|0)>(c|0)?j:c;c=v;continue}s=q-c|0;r=(l|0)<(s|0)?s:l;t=r+m|0;j=(j|0)<(t|0)?t:j;Wb(a,32,j,t,k);Nc(a,o,m);Wb(a,48,j,t,k^65536);Wb(a,48,r,s,0);Nc(a,c,s);Wb(a,32,j,t,k^8192);c=v;}g:do if((w|0)==87)if(!a)if(!n)i=0;else{i=1;while(1){c=f[h+(i<<2)>>2]|0;if(!c)break;db(g+(i<<3)|0,c,e);i=i+1|0;if((i|0)>=10){i=1;break g}}while(1){if(f[h+(i<<2)>>2]|0){i=-1;break g}i=i+1|0;if((i|0)>=10){i=1;break}}}while(0);u=G;return i|0}function Pa(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=u;u=u+704|0;A=E+144|0;z=E+128|0;y=E+112|0;x=E+96|0;w=E+80|0;v=E+64|0;t=E+48|0;B=E+32|0;n=E+16|0;k=E;p=E+184|0;D=E+160|0;q=yb(a,14)|0;if(!q){Eb(c);D=1;u=E;return D|0}r=c+4|0;s=c+8|0;d=f[s>>2]|0;if((d|0)!=(q|0)){if(d>>>0<=q>>>0){do if((f[c+12>>2]|0)>>>0<q>>>0){if(fb(r,q,(d+1|0)==(q|0),1,0)|0){d=f[s>>2]|0;break}b[c+16>>0]=1;D=0;u=E;return D|0}while(0);Ib((f[r>>2]|0)+d|0,0,q-d|0)|0;}f[s>>2]=q;}Ib(f[r>>2]|0,0,q|0)|0;o=a+20|0;d=f[o>>2]|0;if((d|0)<5){i=a+4|0;j=a+8|0;g=a+16|0;do{e=f[i>>2]|0;if((e|0)==(f[j>>2]|0))e=0;else{f[i>>2]=e+1;e=h[e>>0]|0;}d=d+8|0;f[o>>2]=d;if((d|0)>=33){f[k>>2]=866;f[k+4>>2]=3208;f[k+8>>2]=1366;vc(p,812,k)|0;Ub(p)|0;d=f[o>>2]|0;}e=e<<32-d|f[g>>2];f[g>>2]=e;}while((d|0)<5)}else{e=a+16|0;g=e;e=f[e>>2]|0;}m=e>>>27;f[g>>2]=e<<5;f[o>>2]=d+-5;if((m+-1|0)>>>0>20){D=0;u=E;return D|0}f[D+20>>2]=0;f[D>>2]=0;f[D+4>>2]=0;f[D+8>>2]=0;f[D+12>>2]=0;b[D+16>>0]=0;d=D+4|0;e=D+8|0;a:do if(fb(d,21,0,1,0)|0){i=f[e>>2]|0;l=f[d>>2]|0;Ib(l+i|0,0,21-i|0)|0;f[e>>2]=21;i=a+4|0;j=a+8|0;k=a+16|0;g=0;do{d=f[o>>2]|0;if((d|0)<3)do{e=f[i>>2]|0;if((e|0)==(f[j>>2]|0))e=0;else{f[i>>2]=e+1;e=h[e>>0]|0;}d=d+8|0;f[o>>2]=d;if((d|0)>=33){f[n>>2]=866;f[n+4>>2]=3208;f[n+8>>2]=1366;vc(p,812,n)|0;Ub(p)|0;d=f[o>>2]|0;}e=e<<32-d|f[k>>2];f[k>>2]=e;}while((d|0)<3);else e=f[k>>2]|0;f[k>>2]=e<<3;f[o>>2]=d+-3;b[l+(h[1327+g>>0]|0)>>0]=e>>>29;g=g+1|0;}while((g|0)!=(m|0));if(qb(D)|0){k=a+4|0;l=a+8|0;m=a+16|0;d=0;b:do{j=q-d|0;g=bb(a,D)|0;c:do if(g>>>0<17){if((f[s>>2]|0)>>>0<=d>>>0){f[B>>2]=866;f[B+4>>2]=910;f[B+8>>2]=1497;vc(p,812,B)|0;Ub(p)|0;}b[(f[r>>2]|0)+d>>0]=g;d=d+1|0;}else switch(g|0){case 17:{e=f[o>>2]|0;if((e|0)<3)do{g=f[k>>2]|0;if((g|0)==(f[l>>2]|0))g=0;else{f[k>>2]=g+1;g=h[g>>0]|0;}e=e+8|0;f[o>>2]=e;if((e|0)>=33){f[t>>2]=866;f[t+4>>2]=3208;f[t+8>>2]=1366;vc(p,812,t)|0;Ub(p)|0;e=f[o>>2]|0;}g=g<<32-e|f[m>>2];f[m>>2]=g;}while((e|0)<3);else g=f[m>>2]|0;f[m>>2]=g<<3;f[o>>2]=e+-3;g=(g>>>29)+3|0;e=g>>>0>j>>>0;if(e){d=0;break a}else{d=(e?0:g)+d|0;break c}}case 18:{e=f[o>>2]|0;if((e|0)<7)do{g=f[k>>2]|0;if((g|0)==(f[l>>2]|0))g=0;else{f[k>>2]=g+1;g=h[g>>0]|0;}e=e+8|0;f[o>>2]=e;if((e|0)>=33){f[v>>2]=866;f[v+4>>2]=3208;f[v+8>>2]=1366;vc(p,812,v)|0;Ub(p)|0;e=f[o>>2]|0;}g=g<<32-e|f[m>>2];f[m>>2]=g;}while((e|0)<7);else g=f[m>>2]|0;f[m>>2]=g<<7;f[o>>2]=e+-7;g=(g>>>25)+11|0;e=g>>>0>j>>>0;if(e){d=0;break a}else{d=(e?0:g)+d|0;break c}}default:{if((g+-19|0)>>>0>=2){C=81;break b}e=f[o>>2]|0;if((g|0)==19){if((e|0)<2){g=e;while(1){e=f[k>>2]|0;if((e|0)==(f[l>>2]|0))i=0;else{f[k>>2]=e+1;i=h[e>>0]|0;}e=g+8|0;f[o>>2]=e;if((e|0)>=33){f[w>>2]=866;f[w+4>>2]=3208;f[w+8>>2]=1366;vc(p,812,w)|0;Ub(p)|0;e=f[o>>2]|0;}g=i<<32-e|f[m>>2];f[m>>2]=g;if((e|0)<2)g=e;else break}}else g=f[m>>2]|0;f[m>>2]=g<<2;g=g>>>30;i=3;e=e+-2|0;}else{if((e|0)<6)do{g=f[k>>2]|0;if((g|0)==(f[l>>2]|0))g=0;else{f[k>>2]=g+1;g=h[g>>0]|0;}e=e+8|0;f[o>>2]=e;if((e|0)>=33){f[x>>2]=866;f[x+4>>2]=3208;f[x+8>>2]=1366;vc(p,812,x)|0;Ub(p)|0;e=f[o>>2]|0;}g=g<<32-e|f[m>>2];f[m>>2]=g;}while((e|0)<6);else g=f[m>>2]|0;f[m>>2]=g<<6;g=g>>>26;i=7;e=e+-6|0;}f[o>>2]=e;g=g+i|0;if((d|0)==0|g>>>0>j>>>0){d=0;break a}e=d+-1|0;if((f[s>>2]|0)>>>0<=e>>>0){f[y>>2]=866;f[y+4>>2]=910;f[y+8>>2]=1497;vc(p,812,y)|0;Ub(p)|0;}i=b[(f[r>>2]|0)+e>>0]|0;if(!(i<<24>>24)){d=0;break a}e=g+d|0;if(d>>>0>=e>>>0)break c;do{if((f[s>>2]|0)>>>0<=d>>>0){f[z>>2]=866;f[z+4>>2]=910;f[z+8>>2]=1497;vc(p,812,z)|0;Ub(p)|0;}b[(f[r>>2]|0)+d>>0]=i;d=d+1|0;}while((d|0)!=(e|0));d=e;}}while(0)}while(q>>>0>d>>>0);if((C|0)==81){f[A>>2]=866;f[A+4>>2]=3149;f[A+8>>2]=1348;vc(p,812,A)|0;Ub(p)|0;d=0;break}if((q|0)==(d|0))d=qb(c)|0;else d=0;}else d=0;}else{b[D+16>>0]=1;d=0;}while(0);Cb(D);D=d;u=E;return D|0}function Qa(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=u;u=u+880|0;J=L+144|0;I=L+128|0;H=L+112|0;G=L+96|0;C=L+80|0;x=L+64|0;v=L+48|0;w=L+32|0;q=L+16|0;p=L;E=L+360|0;F=L+296|0;K=L+224|0;t=L+156|0;if((c|0)==0|g>>>0>11){K=0;u=L;return K|0}f[a>>2]=c;i=K;k=i+68|0;do{f[i>>2]=0;i=i+4|0;}while((i|0)<(k|0));i=0;do{D=b[e+i>>0]|0;k=K+((D&255)<<2)|0;if(D<<24>>24)f[k>>2]=(f[k>>2]|0)+1;i=i+1|0;}while((i|0)!=(c|0));k=0;l=0;m=0;n=-1;o=1;while(1){i=f[K+(o<<2)>>2]|0;if(!i){f[a+28+(o+-1<<2)>>2]=0;r=l;}else{r=o+-1|0;f[F+(r<<2)>>2]=k;k=i+k|0;D=16-o|0;f[a+28+(r<<2)>>2]=(k+-1<<D|(1<<D)+-1)+1;f[a+96+(r<<2)>>2]=l;f[t+(o<<2)>>2]=l;r=i+l|0;m=m>>>0>o>>>0?m:o;n=n>>>0<o>>>0?n:o;}o=o+1|0;if((o|0)==17)break;else{k=k<<1;l=r;}}f[a+4>>2]=r;k=a+172|0;do if(r>>>0>(f[k>>2]|0)>>>0){i=r+-1|0;if(!(i&r))i=r;else{i=i>>>16|i;i=i>>>8|i;i=i>>>4|i;i=i>>>2|i;i=(i>>>1|i)+1|0;i=i>>>0>c>>>0?c:i;}f[k>>2]=i;l=a+176|0;i=f[l>>2]|0;do if(i|0){D=f[i+-4>>2]|0;i=i+-8|0;if(!((D|0)!=0?(D|0)==(~f[i>>2]|0):0)){f[p>>2]=866;f[p+4>>2]=651;f[p+8>>2]=1579;vc(E,812,p)|0;Ub(E)|0;}if(!(i&7)){Nb(i,0,0,1,0)|0;break}else{f[q>>2]=866;f[q+4>>2]=2506;f[q+8>>2]=1232;vc(E,812,q)|0;Ub(E)|0;break}}while(0);i=f[k>>2]|0;i=i|0?i:1;k=Db((i<<1)+8|0,0)|0;if(!k){f[l>>2]=0;g=0;break}else{f[k+4>>2]=i;f[k>>2]=~i;f[l>>2]=k+8;s=24;break}}else s=24;while(0);a:do if((s|0)==24){D=a+24|0;b[D>>0]=n;b[a+25>>0]=m;l=a+176|0;k=0;do{B=b[e+k>>0]|0;i=B&255;if(B<<24>>24){if(!(f[K+(i<<2)>>2]|0)){f[w>>2]=866;f[w+4>>2]=2276;f[w+8>>2]=977;vc(E,812,w)|0;Ub(E)|0;}B=t+(i<<2)|0;i=f[B>>2]|0;f[B>>2]=i+1;if(i>>>0>=r>>>0){f[v>>2]=866;f[v+4>>2]=2280;f[v+8>>2]=990;vc(E,812,v)|0;Ub(E)|0;}d[(f[l>>2]|0)+(i<<1)>>1]=k;}k=k+1|0;}while((k|0)!=(c|0));A=(h[D>>0]|0)>>>0<g>>>0?g:0;B=a+8|0;f[B>>2]=A;z=(A|0)!=0;if(z){y=1<<A;i=a+164|0;do if(y>>>0>(f[i>>2]|0)>>>0){f[i>>2]=y;l=a+168|0;i=f[l>>2]|0;do if(i|0){w=f[i+-4>>2]|0;i=i+-8|0;if(!((w|0)!=0?(w|0)==(~f[i>>2]|0):0)){f[x>>2]=866;f[x+4>>2]=651;f[x+8>>2]=1579;vc(E,812,x)|0;Ub(E)|0;}if(!(i&7)){Nb(i,0,0,1,0)|0;break}else{f[C>>2]=866;f[C+4>>2]=2506;f[C+8>>2]=1232;vc(E,812,C)|0;Ub(E)|0;break}}while(0);i=y<<2;k=Db(i+8|0,0)|0;if(!k){f[l>>2]=0;g=0;break a}else{C=k+8|0;f[k+4>>2]=y;f[k>>2]=~y;f[l>>2]=C;k=C;break}}else{k=a+168|0;i=y<<2;l=k;k=f[k>>2]|0;}while(0);Ib(k|0,-1,i|0)|0;v=a+176|0;t=1;do{if(f[K+(t<<2)>>2]|0){w=A-t|0;x=1<<w;i=t+-1|0;k=f[F+(i<<2)>>2]|0;if(i>>>0>=16){f[G>>2]=866;f[G+4>>2]=1960;f[G+8>>2]=1453;vc(E,812,G)|0;Ub(E)|0;}c=f[a+28+(i<<2)>>2]|0;c=(c|0)==0?-1:(c+-1|0)>>>(16-t|0);if(k>>>0<=c>>>0){r=(f[a+96+(i<<2)>>2]|0)-k|0;s=t<<16;do{i=j[(f[v>>2]|0)+(r+k<<1)>>1]|0;if((h[e+i>>0]|0|0)!=(t|0)){f[H>>2]=866;f[H+4>>2]=2322;f[H+8>>2]=1019;vc(E,812,H)|0;Ub(E)|0;}q=k<<w;o=i|s;n=0;do{p=n+q|0;if(p>>>0>=y>>>0){f[I>>2]=866;f[I+4>>2]=2328;f[I+8>>2]=1053;vc(E,812,I)|0;Ub(E)|0;}i=f[l>>2]|0;if((f[i+(p<<2)>>2]|0)!=-1){f[J>>2]=866;f[J+4>>2]=2330;f[J+8>>2]=1076;vc(E,812,J)|0;Ub(E)|0;i=f[l>>2]|0;}f[i+(p<<2)>>2]=o;n=n+1|0;}while(n>>>0<x>>>0);k=k+1|0;}while(k>>>0<=c>>>0)}}t=t+1|0;}while(A>>>0>=t>>>0)}i=a+96|0;f[i>>2]=(f[i>>2]|0)-(f[F>>2]|0);i=a+100|0;f[i>>2]=(f[i>>2]|0)-(f[F+4>>2]|0);i=a+104|0;f[i>>2]=(f[i>>2]|0)-(f[F+8>>2]|0);i=a+108|0;f[i>>2]=(f[i>>2]|0)-(f[F+12>>2]|0);i=a+112|0;f[i>>2]=(f[i>>2]|0)-(f[F+16>>2]|0);i=a+116|0;f[i>>2]=(f[i>>2]|0)-(f[F+20>>2]|0);i=a+120|0;f[i>>2]=(f[i>>2]|0)-(f[F+24>>2]|0);i=a+124|0;f[i>>2]=(f[i>>2]|0)-(f[F+28>>2]|0);i=a+128|0;f[i>>2]=(f[i>>2]|0)-(f[F+32>>2]|0);i=a+132|0;f[i>>2]=(f[i>>2]|0)-(f[F+36>>2]|0);i=a+136|0;f[i>>2]=(f[i>>2]|0)-(f[F+40>>2]|0);i=a+140|0;f[i>>2]=(f[i>>2]|0)-(f[F+44>>2]|0);i=a+144|0;f[i>>2]=(f[i>>2]|0)-(f[F+48>>2]|0);i=a+148|0;f[i>>2]=(f[i>>2]|0)-(f[F+52>>2]|0);i=a+152|0;f[i>>2]=(f[i>>2]|0)-(f[F+56>>2]|0);i=a+156|0;f[i>>2]=(f[i>>2]|0)-(f[F+60>>2]|0);i=a+16|0;f[i>>2]=0;k=a+20|0;f[k>>2]=h[D>>0];b:do if(z){do{if(!g)break b;J=g;g=g+-1|0;}while(!(f[K+(J<<2)>>2]|0));f[i>>2]=f[a+28+(g<<2)>>2];g=A+1|0;f[k>>2]=g;if(g>>>0<=m>>>0){while(1){if(f[K+(g<<2)>>2]|0)break;g=g+1|0;if(g>>>0>m>>>0)break b}f[k>>2]=g;}}while(0);f[a+92>>2]=-1;f[a+160>>2]=1048575;f[a+12>>2]=32-(f[B>>2]|0);g=1;}while(0);K=g;u=L;return K|0}function Ra(a,c,d,e,g,i,j,k){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;ga=u;u=u+656|0;ea=ga+112|0;ca=ga+96|0;ba=ga+80|0;aa=ga+64|0;$=ga+48|0;fa=ga+32|0;da=ga+16|0;_=ga;Y=ga+144|0;Z=ga+128|0;N=a+240|0;O=f[N>>2]|0;P=a+256|0;Q=f[P>>2]|0;W=b[(f[a+88>>2]|0)+17>>0]|0;R=W&255;S=e>>>2;if(!(W<<24>>24)){u=ga;return 1}T=(k|0)==0;U=j+-1|0;V=U<<4;W=k+-1|0;H=(i&1|0)!=0;I=e<<1;J=a+92|0;K=a+116|0;L=a+140|0;M=a+236|0;G=(g&1|0)!=0;F=a+188|0;B=a+252|0;C=S+1|0;D=S+2|0;E=S+3|0;A=0;i=0;d=0;g=1;do{if(!T){y=f[c+(A<<2)>>2]|0;z=0;while(1){w=z&1;m=(w|0)==0;v=(w<<5^32)+-16|0;w=(w<<1^2)+-1|0;t=m?j:-1;l=m?0:U;a=(z|0)==(W|0);x=H&a;if((l|0)!=(t|0)){s=H&a^1;r=m?y:y+V|0;while(1){if((g|0)==1)g=bb(J,K)|0|512;q=g&7;g=g>>>3;m=h[1539+q>>0]|0;a=0;do{n=(bb(J,L)|0)+d|0;o=n-O|0;p=o>>31;d=p&n|o&~p;if((f[N>>2]|0)>>>0<=d>>>0){f[_>>2]=866;f[_+4>>2]=910;f[_+8>>2]=1497;vc(Y,812,_)|0;Ub(Y)|0;}f[Z+(a<<2)>>2]=f[(f[M>>2]|0)+(d<<2)>>2];a=a+1|0;}while(a>>>0<m>>>0);p=G&(l|0)==(U|0);if(x|p){o=0;do{a=r+(X(o,e)|0)|0;n=(o|0)==0|s;m=o<<1;ia=(bb(J,F)|0)+i|0;ha=ia-Q|0;i=ha>>31;i=i&ia|ha&~i;do if(!p){if(n){f[a>>2]=f[Z+((h[1547+(q<<2)+m>>0]|0)<<2)>>2];if((f[P>>2]|0)>>>0<=i>>>0){f[ba>>2]=866;f[ba+4>>2]=910;f[ba+8>>2]=1497;vc(Y,812,ba)|0;Ub(Y)|0;}f[a+4>>2]=f[(f[B>>2]|0)+(i<<2)>>2];}a=a+8|0;ha=(bb(J,F)|0)+i|0;ia=ha-Q|0;i=ia>>31;i=i&ha|ia&~i;if(n){f[a>>2]=f[Z+((h[(m|1)+(1547+(q<<2))>>0]|0)<<2)>>2];if((f[P>>2]|0)>>>0<=i>>>0){f[ea>>2]=866;f[ea+4>>2]=910;f[ea+8>>2]=1497;vc(Y,812,ea)|0;Ub(Y)|0;}f[a+4>>2]=f[(f[B>>2]|0)+(i<<2)>>2];}}else{if(!n){ha=(bb(J,F)|0)+i|0;ia=ha-Q|0;i=ia>>31;i=i&ha|ia&~i;break}f[a>>2]=f[Z+((h[1547+(q<<2)+m>>0]|0)<<2)>>2];if((f[P>>2]|0)>>>0<=i>>>0){f[ca>>2]=866;f[ca+4>>2]=910;f[ca+8>>2]=1497;vc(Y,812,ca)|0;Ub(Y)|0;}f[a+4>>2]=f[(f[B>>2]|0)+(i<<2)>>2];ha=(bb(J,F)|0)+i|0;ia=ha-Q|0;i=ia>>31;i=i&ha|ia&~i;}while(0);o=o+1|0;}while((o|0)!=2)}else{f[r>>2]=f[Z+((h[1547+(q<<2)>>0]|0)<<2)>>2];ha=(bb(J,F)|0)+i|0;ia=ha-Q|0;i=ia>>31;i=i&ha|ia&~i;if((f[P>>2]|0)>>>0<=i>>>0){f[da>>2]=866;f[da+4>>2]=910;f[da+8>>2]=1497;vc(Y,812,da)|0;Ub(Y)|0;}f[r+4>>2]=f[(f[B>>2]|0)+(i<<2)>>2];f[r+8>>2]=f[Z+((h[1547+(q<<2)+1>>0]|0)<<2)>>2];ha=(bb(J,F)|0)+i|0;ia=ha-Q|0;i=ia>>31;i=i&ha|ia&~i;if((f[P>>2]|0)>>>0<=i>>>0){f[fa>>2]=866;f[fa+4>>2]=910;f[fa+8>>2]=1497;vc(Y,812,fa)|0;Ub(Y)|0;}f[r+12>>2]=f[(f[B>>2]|0)+(i<<2)>>2];f[r+(S<<2)>>2]=f[Z+((h[1547+(q<<2)+2>>0]|0)<<2)>>2];ha=(bb(J,F)|0)+i|0;ia=ha-Q|0;i=ia>>31;i=i&ha|ia&~i;if((f[P>>2]|0)>>>0<=i>>>0){f[$>>2]=866;f[$+4>>2]=910;f[$+8>>2]=1497;vc(Y,812,$)|0;Ub(Y)|0;}f[r+(C<<2)>>2]=f[(f[B>>2]|0)+(i<<2)>>2];f[r+(D<<2)>>2]=f[Z+((h[1547+(q<<2)+3>>0]|0)<<2)>>2];ha=(bb(J,F)|0)+i|0;ia=ha-Q|0;i=ia>>31;i=i&ha|ia&~i;if((f[P>>2]|0)>>>0<=i>>>0){f[aa>>2]=866;f[aa+4>>2]=910;f[aa+8>>2]=1497;vc(Y,812,aa)|0;Ub(Y)|0;}f[r+(E<<2)>>2]=f[(f[B>>2]|0)+(i<<2)>>2];}l=w+l|0;if((l|0)==(t|0))break;else r=r+v|0;}}z=z+1|0;if((z|0)==(k|0))break;else y=y+I|0;}}A=A+1|0;}while((A|0)!=(R|0));u=ga;return 1}function Sa(a,c,d,e,g,i,k,l){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0;ka=u;u=u+640|0;ha=ka+80|0;ga=ka+64|0;fa=ka+48|0;ja=ka+32|0;ia=ka+16|0;ea=ka;ca=ka+128|0;da=ka+112|0;P=ka+96|0;Q=a+272|0;R=f[Q>>2]|0;ba=f[a+88>>2]|0;S=(h[ba+63>>0]|0)<<8|(h[ba+64>>0]|0);ba=b[ba+17>>0]|0;T=ba&255;if(!(ba<<24>>24)){u=ka;return 1}U=(l|0)==0;V=k+-1|0;W=V<<5;X=l+-1|0;Y=e<<1;Z=a+92|0;_=a+116|0;$=a+164|0;aa=a+268|0;ba=a+212|0;O=(g&1|0)==0;N=(i&1|0)==0;M=a+288|0;L=a+284|0;K=0;a=0;i=0;g=0;d=0;m=1;do{if(!U){I=f[c+(K<<2)>>2]|0;J=0;while(1){H=J&1;o=(H|0)==0;G=(H<<6^64)+-32|0;H=(H<<1^2)+-1|0;E=o?k:-1;n=o?0:V;if((n|0)!=(E|0)){F=N|(J|0)!=(X|0);D=o?I:I+W|0;while(1){if((m|0)==1)m=bb(Z,_)|0|512;C=m&7;m=m>>>3;p=h[1539+C>>0]|0;o=0;do{z=(bb(Z,$)|0)+d|0;A=z-R|0;B=A>>31;d=B&z|A&~B;if((f[Q>>2]|0)>>>0<=d>>>0){f[ea>>2]=866;f[ea+4>>2]=910;f[ea+8>>2]=1497;vc(ca,812,ea)|0;Ub(ca)|0;}f[da+(o<<2)>>2]=j[(f[aa>>2]|0)+(d<<1)>>1];o=o+1|0;}while(o>>>0<p>>>0);o=0;do{z=(bb(Z,$)|0)+i|0;A=z-R|0;B=A>>31;i=B&z|A&~B;if((f[Q>>2]|0)>>>0<=i>>>0){f[ia>>2]=866;f[ia+4>>2]=910;f[ia+8>>2]=1497;vc(ca,812,ia)|0;Ub(ca)|0;}f[P+(o<<2)>>2]=j[(f[aa>>2]|0)+(i<<1)>>1];o=o+1|0;}while(o>>>0<p>>>0);B=O|(n|0)!=(V|0);z=0;A=D;while(1){w=F|(z|0)==0;x=z<<1;if(B){t=0;v=A;while(1){y=(bb(Z,ba)|0)+g|0;s=y-S|0;g=s>>31;g=g&y|s&~g;s=(bb(Z,ba)|0)+a|0;y=s-S|0;a=y>>31;a=a&s|y&~a;if(w){s=h[t+x+(1547+(C<<2))>>0]|0;p=g*3|0;o=f[M>>2]|0;if(o>>>0<=p>>>0){f[ja>>2]=866;f[ja+4>>2]=910;f[ja+8>>2]=1497;vc(ca,812,ja)|0;Ub(ca)|0;o=f[M>>2]|0;}q=f[L>>2]|0;p=q+(p<<1)|0;r=a*3|0;if(o>>>0>r>>>0)o=q;else{f[fa>>2]=866;f[fa+4>>2]=910;f[fa+8>>2]=1497;vc(ca,812,fa)|0;Ub(ca)|0;o=f[L>>2]|0;}y=o+(r<<1)|0;f[v>>2]=(j[p>>1]|0)<<16|f[da+(s<<2)>>2];f[v+4>>2]=(j[p+4>>1]|0)<<16|(j[p+2>>1]|0);f[v+8>>2]=(j[y>>1]|0)<<16|f[P+(s<<2)>>2];f[v+12>>2]=(j[y+4>>1]|0)<<16|(j[y+2>>1]|0);}t=t+1|0;if((t|0)==2)break;else v=v+16|0;}}else{y=w^1;w=1547+(C<<2)+x|0;t=0;v=A;while(1){x=(bb(Z,ba)|0)+g|0;s=x-S|0;g=s>>31;g=g&x|s&~g;s=(bb(Z,ba)|0)+a|0;x=s-S|0;a=x>>31;a=a&s|x&~a;if(!((t|0)!=0|y)){s=h[w>>0]|0;p=g*3|0;o=f[M>>2]|0;if(o>>>0<=p>>>0){f[ga>>2]=866;f[ga+4>>2]=910;f[ga+8>>2]=1497;vc(ca,812,ga)|0;Ub(ca)|0;o=f[M>>2]|0;}q=f[L>>2]|0;p=q+(p<<1)|0;r=a*3|0;if(o>>>0>r>>>0)o=q;else{f[ha>>2]=866;f[ha+4>>2]=910;f[ha+8>>2]=1497;vc(ca,812,ha)|0;Ub(ca)|0;o=f[L>>2]|0;}x=o+(r<<1)|0;f[v>>2]=(j[p>>1]|0)<<16|f[da+(s<<2)>>2];f[v+4>>2]=(j[p+4>>1]|0)<<16|(j[p+2>>1]|0);f[v+8>>2]=(j[x>>1]|0)<<16|f[P+(s<<2)>>2];f[v+12>>2]=(j[x+4>>1]|0)<<16|(j[x+2>>1]|0);}t=t+1|0;if((t|0)==2)break;else v=v+16|0;}}z=z+1|0;if((z|0)==2)break;else A=A+e|0;}n=H+n|0;if((n|0)==(E|0))break;else D=D+G|0;}}J=J+1|0;if((J|0)==(l|0))break;else I=I+Y|0;}}K=K+1|0;}while((K|0)!=(T|0));u=ka;return 1}function Ta(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;if(!a)return;c=a+-8|0;e=f[1148]|0;a=f[a+-4>>2]|0;b=a&-8;j=c+b|0;do if(!(a&1)){d=f[c>>2]|0;if(!(a&3))return;h=c+(0-d)|0;g=d+b|0;if(h>>>0<e>>>0)return;if((h|0)==(f[1149]|0)){a=j+4|0;b=f[a>>2]|0;if((b&3|0)!=3){i=h;b=g;break}f[1146]=g;f[a>>2]=b&-2;f[h+4>>2]=g|1;f[h+g>>2]=g;return}c=d>>>3;if(d>>>0<256){a=f[h+8>>2]|0;b=f[h+12>>2]|0;if((b|0)==(a|0)){f[1144]=f[1144]&~(1<<c);i=h;b=g;break}else{f[a+12>>2]=b;f[b+8>>2]=a;i=h;b=g;break}}e=f[h+24>>2]|0;a=f[h+12>>2]|0;do if((a|0)==(h|0)){c=h+16|0;b=c+4|0;a=f[b>>2]|0;if(!a){a=f[c>>2]|0;if(!a){a=0;break}else b=c;}while(1){c=a+20|0;d=f[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=f[c>>2]|0;if(!d)break;else{a=d;b=c;}}f[b>>2]=0;}else{i=f[h+8>>2]|0;f[i+12>>2]=a;f[a+8>>2]=i;}while(0);if(e){b=f[h+28>>2]|0;c=4880+(b<<2)|0;if((h|0)==(f[c>>2]|0)){f[c>>2]=a;if(!a){f[1145]=f[1145]&~(1<<b);i=h;b=g;break}}else{f[e+16+(((f[e+16>>2]|0)!=(h|0)&1)<<2)>>2]=a;if(!a){i=h;b=g;break}}f[a+24>>2]=e;b=h+16|0;c=f[b>>2]|0;if(c|0){f[a+16>>2]=c;f[c+24>>2]=a;}b=f[b+4>>2]|0;if(b){f[a+20>>2]=b;f[b+24>>2]=a;i=h;b=g;}else{i=h;b=g;}}else{i=h;b=g;}}else{i=c;h=c;}while(0);if(h>>>0>=j>>>0)return;a=j+4|0;d=f[a>>2]|0;if(!(d&1))return;if(!(d&2)){a=f[1149]|0;if((j|0)==(f[1150]|0)){j=(f[1147]|0)+b|0;f[1147]=j;f[1150]=i;f[i+4>>2]=j|1;if((i|0)!=(a|0))return;f[1149]=0;f[1146]=0;return}if((j|0)==(a|0)){j=(f[1146]|0)+b|0;f[1146]=j;f[1149]=h;f[i+4>>2]=j|1;f[h+j>>2]=j;return}e=(d&-8)+b|0;c=d>>>3;do if(d>>>0<256){b=f[j+8>>2]|0;a=f[j+12>>2]|0;if((a|0)==(b|0)){f[1144]=f[1144]&~(1<<c);break}else{f[b+12>>2]=a;f[a+8>>2]=b;break}}else{g=f[j+24>>2]|0;a=f[j+12>>2]|0;do if((a|0)==(j|0)){c=j+16|0;b=c+4|0;a=f[b>>2]|0;if(!a){a=f[c>>2]|0;if(!a){c=0;break}else b=c;}while(1){c=a+20|0;d=f[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=f[c>>2]|0;if(!d)break;else{a=d;b=c;}}f[b>>2]=0;c=a;}else{c=f[j+8>>2]|0;f[c+12>>2]=a;f[a+8>>2]=c;c=a;}while(0);if(g|0){a=f[j+28>>2]|0;b=4880+(a<<2)|0;if((j|0)==(f[b>>2]|0)){f[b>>2]=c;if(!c){f[1145]=f[1145]&~(1<<a);break}}else{f[g+16+(((f[g+16>>2]|0)!=(j|0)&1)<<2)>>2]=c;if(!c)break}f[c+24>>2]=g;a=j+16|0;b=f[a>>2]|0;if(b|0){f[c+16>>2]=b;f[b+24>>2]=c;}a=f[a+4>>2]|0;if(a|0){f[c+20>>2]=a;f[a+24>>2]=c;}}}while(0);f[i+4>>2]=e|1;f[h+e>>2]=e;if((i|0)==(f[1149]|0)){f[1146]=e;return}}else{f[a>>2]=d&-2;f[i+4>>2]=b|1;f[h+b>>2]=b;e=b;}a=e>>>3;if(e>>>0<256){c=4616+(a<<1<<2)|0;b=f[1144]|0;a=1<<a;if(!(b&a)){f[1144]=b|a;a=c;b=c+8|0;}else{b=c+8|0;a=f[b>>2]|0;}f[b>>2]=i;f[a+12>>2]=i;f[i+8>>2]=a;f[i+12>>2]=c;return}a=e>>>8;if(a)if(e>>>0>16777215)a=31;else{h=(a+1048320|0)>>>16&8;j=a<<h;g=(j+520192|0)>>>16&4;j=j<<g;a=(j+245760|0)>>>16&2;a=14-(g|h|a)+(j<<a>>>15)|0;a=e>>>(a+7|0)&1|a<<1;}else a=0;d=4880+(a<<2)|0;f[i+28>>2]=a;f[i+20>>2]=0;f[i+16>>2]=0;b=f[1145]|0;c=1<<a;do if(b&c){b=e<<((a|0)==31?0:25-(a>>>1)|0);c=f[d>>2]|0;while(1){if((f[c+4>>2]&-8|0)==(e|0)){a=73;break}d=c+16+(b>>>31<<2)|0;a=f[d>>2]|0;if(!a){a=72;break}else{b=b<<1;c=a;}}if((a|0)==72){f[d>>2]=i;f[i+24>>2]=c;f[i+12>>2]=i;f[i+8>>2]=i;break}else if((a|0)==73){h=c+8|0;j=f[h>>2]|0;f[j+12>>2]=i;f[h>>2]=i;f[i+8>>2]=j;f[i+12>>2]=c;f[i+24>>2]=0;break}}else{f[1145]=b|c;f[d>>2]=i;f[i+24>>2]=d;f[i+12>>2]=i;f[i+8>>2]=i;}while(0);j=(f[1152]|0)+-1|0;f[1152]=j;if(!j)a=5032;else return;while(1){a=f[a>>2]|0;if(!a)break;else a=a+8|0;}f[1152]=-1;return}function Ua(a,c,d,e,g,i,k,l){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;pa=u;u=u+640|0;ma=pa+80|0;la=pa+64|0;ka=pa+48|0;oa=pa+32|0;na=pa+16|0;ja=pa;ha=pa+128|0;ia=pa+112|0;N=pa+96|0;O=a+240|0;P=f[O>>2]|0;Q=a+256|0;R=f[Q>>2]|0;S=a+272|0;T=f[S>>2]|0;ga=f[a+88>>2]|0;U=(h[ga+63>>0]|0)<<8|(h[ga+64>>0]|0);ga=b[ga+17>>0]|0;V=ga&255;if(!(ga<<24>>24)){u=pa;return 1}W=(l|0)==0;X=k+-1|0;Y=X<<5;Z=l+-1|0;_=e<<1;$=a+92|0;aa=a+116|0;ba=a+164|0;ca=a+268|0;da=a+140|0;ea=a+236|0;fa=a+212|0;ga=a+188|0;M=(g&1|0)==0;L=(i&1|0)==0;J=a+288|0;K=a+284|0;I=a+252|0;H=0;a=0;i=0;g=0;d=0;m=1;do{if(!W){F=f[c+(H<<2)>>2]|0;G=0;while(1){E=G&1;o=(E|0)==0;D=(E<<6^64)+-32|0;E=(E<<1^2)+-1|0;B=o?k:-1;n=o?0:X;if((n|0)!=(B|0)){C=L|(G|0)!=(Z|0);A=o?F:F+Y|0;while(1){if((m|0)==1)m=bb($,aa)|0|512;z=m&7;m=m>>>3;p=h[1539+z>>0]|0;o=0;do{w=(bb($,ba)|0)+i|0;x=w-T|0;y=x>>31;i=y&w|x&~y;if((f[S>>2]|0)>>>0<=i>>>0){f[ja>>2]=866;f[ja+4>>2]=910;f[ja+8>>2]=1497;vc(ha,812,ja)|0;Ub(ha)|0;}f[N+(o<<2)>>2]=j[(f[ca>>2]|0)+(i<<1)>>1];o=o+1|0;}while(o>>>0<p>>>0);o=0;do{w=(bb($,da)|0)+d|0;x=w-P|0;y=x>>31;d=y&w|x&~y;if((f[O>>2]|0)>>>0<=d>>>0){f[na>>2]=866;f[na+4>>2]=910;f[na+8>>2]=1497;vc(ha,812,na)|0;Ub(ha)|0;}f[ia+(o<<2)>>2]=f[(f[ea>>2]|0)+(d<<2)>>2];o=o+1|0;}while(o>>>0<p>>>0);y=M|(n|0)!=(X|0);w=0;x=A;while(1){s=C|(w|0)==0;t=w<<1;if(y){q=0;r=x;while(1){v=(bb($,fa)|0)+a|0;p=v-U|0;a=p>>31;a=a&v|p&~a;p=(bb($,ga)|0)+g|0;v=p-R|0;g=v>>31;g=g&p|v&~g;if(s){o=h[q+t+(1547+(z<<2))>>0]|0;p=a*3|0;if((f[J>>2]|0)>>>0<=p>>>0){f[oa>>2]=866;f[oa+4>>2]=910;f[oa+8>>2]=1497;vc(ha,812,oa)|0;Ub(ha)|0;}v=(f[K>>2]|0)+(p<<1)|0;f[r>>2]=(j[v>>1]|0)<<16|f[N+(o<<2)>>2];f[r+4>>2]=(j[v+4>>1]|0)<<16|(j[v+2>>1]|0);f[r+8>>2]=f[ia+(o<<2)>>2];if((f[Q>>2]|0)>>>0<=g>>>0){f[ka>>2]=866;f[ka+4>>2]=910;f[ka+8>>2]=1497;vc(ha,812,ka)|0;Ub(ha)|0;}f[r+12>>2]=f[(f[I>>2]|0)+(g<<2)>>2];}q=q+1|0;if((q|0)==2)break;else r=r+16|0;}}else{v=s^1;s=1547+(z<<2)+t|0;q=0;r=x;while(1){t=(bb($,fa)|0)+a|0;p=t-U|0;a=p>>31;a=a&t|p&~a;p=(bb($,ga)|0)+g|0;t=p-R|0;g=t>>31;g=g&p|t&~g;if(!((q|0)!=0|v)){o=h[s>>0]|0;p=a*3|0;if((f[J>>2]|0)>>>0<=p>>>0){f[la>>2]=866;f[la+4>>2]=910;f[la+8>>2]=1497;vc(ha,812,la)|0;Ub(ha)|0;}t=(f[K>>2]|0)+(p<<1)|0;f[r>>2]=(j[t>>1]|0)<<16|f[N+(o<<2)>>2];f[r+4>>2]=(j[t+4>>1]|0)<<16|(j[t+2>>1]|0);f[r+8>>2]=f[ia+(o<<2)>>2];if((f[Q>>2]|0)>>>0<=g>>>0){f[ma>>2]=866;f[ma+4>>2]=910;f[ma+8>>2]=1497;vc(ha,812,ma)|0;Ub(ha)|0;}f[r+12>>2]=f[(f[I>>2]|0)+(g<<2)>>2];}q=q+1|0;if((q|0)==2)break;else r=r+16|0;}}w=w+1|0;if((w|0)==2)break;else x=x+e|0;}n=E+n|0;if((n|0)==(B|0))break;else A=A+D|0;}}G=G+1|0;if((G|0)==(l|0))break;else F=F+_|0;}}H=H+1|0;}while((H|0)!=(V|0));u=pa;return 1}function Va(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;j=a+b|0;c=f[a+4>>2]|0;do if(!(c&1)){d=f[a>>2]|0;if(!(c&3))return;g=a+(0-d)|0;h=d+b|0;if((g|0)==(f[1149]|0)){a=j+4|0;c=f[a>>2]|0;if((c&3|0)!=3){i=g;c=h;break}f[1146]=h;f[a>>2]=c&-2;f[g+4>>2]=h|1;f[g+h>>2]=h;return}b=d>>>3;if(d>>>0<256){a=f[g+8>>2]|0;c=f[g+12>>2]|0;if((c|0)==(a|0)){f[1144]=f[1144]&~(1<<b);i=g;c=h;break}else{f[a+12>>2]=c;f[c+8>>2]=a;i=g;c=h;break}}e=f[g+24>>2]|0;a=f[g+12>>2]|0;do if((a|0)==(g|0)){b=g+16|0;c=b+4|0;a=f[c>>2]|0;if(!a){a=f[b>>2]|0;if(!a){a=0;break}else c=b;}while(1){b=a+20|0;d=f[b>>2]|0;if(d|0){a=d;c=b;continue}b=a+16|0;d=f[b>>2]|0;if(!d)break;else{a=d;c=b;}}f[c>>2]=0;}else{i=f[g+8>>2]|0;f[i+12>>2]=a;f[a+8>>2]=i;}while(0);if(e){c=f[g+28>>2]|0;b=4880+(c<<2)|0;if((g|0)==(f[b>>2]|0)){f[b>>2]=a;if(!a){f[1145]=f[1145]&~(1<<c);i=g;c=h;break}}else{f[e+16+(((f[e+16>>2]|0)!=(g|0)&1)<<2)>>2]=a;if(!a){i=g;c=h;break}}f[a+24>>2]=e;c=g+16|0;b=f[c>>2]|0;if(b|0){f[a+16>>2]=b;f[b+24>>2]=a;}c=f[c+4>>2]|0;if(c){f[a+20>>2]=c;f[c+24>>2]=a;i=g;c=h;}else{i=g;c=h;}}else{i=g;c=h;}}else{i=a;c=b;}while(0);a=j+4|0;d=f[a>>2]|0;if(!(d&2)){a=f[1149]|0;if((j|0)==(f[1150]|0)){j=(f[1147]|0)+c|0;f[1147]=j;f[1150]=i;f[i+4>>2]=j|1;if((i|0)!=(a|0))return;f[1149]=0;f[1146]=0;return}if((j|0)==(a|0)){j=(f[1146]|0)+c|0;f[1146]=j;f[1149]=i;f[i+4>>2]=j|1;f[i+j>>2]=j;return}g=(d&-8)+c|0;b=d>>>3;do if(d>>>0<256){c=f[j+8>>2]|0;a=f[j+12>>2]|0;if((a|0)==(c|0)){f[1144]=f[1144]&~(1<<b);break}else{f[c+12>>2]=a;f[a+8>>2]=c;break}}else{e=f[j+24>>2]|0;a=f[j+12>>2]|0;do if((a|0)==(j|0)){b=j+16|0;c=b+4|0;a=f[c>>2]|0;if(!a){a=f[b>>2]|0;if(!a){b=0;break}else c=b;}while(1){b=a+20|0;d=f[b>>2]|0;if(d|0){a=d;c=b;continue}b=a+16|0;d=f[b>>2]|0;if(!d)break;else{a=d;c=b;}}f[c>>2]=0;b=a;}else{b=f[j+8>>2]|0;f[b+12>>2]=a;f[a+8>>2]=b;b=a;}while(0);if(e|0){a=f[j+28>>2]|0;c=4880+(a<<2)|0;if((j|0)==(f[c>>2]|0)){f[c>>2]=b;if(!b){f[1145]=f[1145]&~(1<<a);break}}else{f[e+16+(((f[e+16>>2]|0)!=(j|0)&1)<<2)>>2]=b;if(!b)break}f[b+24>>2]=e;a=j+16|0;c=f[a>>2]|0;if(c|0){f[b+16>>2]=c;f[c+24>>2]=b;}a=f[a+4>>2]|0;if(a|0){f[b+20>>2]=a;f[a+24>>2]=b;}}}while(0);f[i+4>>2]=g|1;f[i+g>>2]=g;if((i|0)==(f[1149]|0)){f[1146]=g;return}else c=g;}else{f[a>>2]=d&-2;f[i+4>>2]=c|1;f[i+c>>2]=c;}a=c>>>3;if(c>>>0<256){b=4616+(a<<1<<2)|0;c=f[1144]|0;a=1<<a;if(!(c&a)){f[1144]=c|a;a=b;c=b+8|0;}else{c=b+8|0;a=f[c>>2]|0;}f[c>>2]=i;f[a+12>>2]=i;f[i+8>>2]=a;f[i+12>>2]=b;return}a=c>>>8;if(a)if(c>>>0>16777215)a=31;else{h=(a+1048320|0)>>>16&8;j=a<<h;g=(j+520192|0)>>>16&4;j=j<<g;a=(j+245760|0)>>>16&2;a=14-(g|h|a)+(j<<a>>>15)|0;a=c>>>(a+7|0)&1|a<<1;}else a=0;e=4880+(a<<2)|0;f[i+28>>2]=a;f[i+20>>2]=0;f[i+16>>2]=0;b=f[1145]|0;d=1<<a;if(!(b&d)){f[1145]=b|d;f[e>>2]=i;f[i+24>>2]=e;f[i+12>>2]=i;f[i+8>>2]=i;return}b=c<<((a|0)==31?0:25-(a>>>1)|0);d=f[e>>2]|0;while(1){if((f[d+4>>2]&-8|0)==(c|0)){a=69;break}e=d+16+(b>>>31<<2)|0;a=f[e>>2]|0;if(!a){a=68;break}else{b=b<<1;d=a;}}if((a|0)==68){f[e>>2]=i;f[i+24>>2]=d;f[i+12>>2]=i;f[i+8>>2]=i;return}else if((a|0)==69){h=d+8|0;j=f[h>>2]|0;f[j+12>>2]=i;f[h>>2]=i;f[i+8>>2]=j;f[i+12>>2]=d;f[i+24>>2]=0;return}}function Wa(a){a=a|0;var c=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;S=u;u=u+2416|0;k=S;j=S+1904|0;R=S+1880|0;O=S+980|0;P=S+80|0;Q=S+16|0;e=f[a+88>>2]|0;M=(h[e+63>>0]|0)<<8|(h[e+64>>0]|0);N=a+92|0;c=(f[a+4>>2]|0)+((h[e+58>>0]|0)<<8|(h[e+57>>0]|0)<<16|(h[e+59>>0]|0))|0;e=(h[e+61>>0]|0)<<8|(h[e+60>>0]|0)<<16|(h[e+62>>0]|0);if(!e){R=0;u=S;return R|0}f[N>>2]=c;f[a+96>>2]=c;f[a+104>>2]=e;f[a+100>>2]=c+e;f[a+108>>2]=0;f[a+112>>2]=0;f[R+20>>2]=0;f[R>>2]=0;f[R+4>>2]=0;f[R+8>>2]=0;f[R+12>>2]=0;b[R+16>>0]=0;if(Pa(N,R)|0){c=0;e=-7;g=-7;while(1){f[O+(c<<2)>>2]=g;f[P+(c<<2)>>2]=e;i=(g|0)>6;c=c+1|0;if((c|0)==225)break;else{e=(i&1)+e|0;g=i?-7:g+1|0;}}c=Q;e=c+64|0;do{f[c>>2]=0;c=c+4|0;}while((c|0)<(e|0));i=a+284|0;e=M*3|0;g=a+288|0;c=f[g>>2]|0;a:do if((c|0)==(e|0))l=13;else{if(c>>>0<=e>>>0){do if((f[a+292>>2]|0)>>>0<e>>>0)if(fb(i,e,(c+1|0)==(e|0),2,0)|0){c=f[g>>2]|0;break}else{b[a+296>>0]=1;c=0;break a}while(0);Ib((f[i>>2]|0)+(c<<1)|0,0,e-c<<1|0)|0;}f[g>>2]=e;l=13;}while(0);do if((l|0)==13){if(!M){f[k>>2]=866;f[k+4>>2]=910;f[k+8>>2]=1497;vc(j,812,k)|0;Ub(j)|0;c=1;break}x=Q+4|0;y=Q+8|0;z=Q+12|0;A=Q+16|0;B=Q+20|0;C=Q+24|0;D=Q+28|0;E=Q+32|0;F=Q+36|0;G=Q+40|0;H=Q+44|0;I=Q+48|0;J=Q+52|0;K=Q+56|0;L=Q+60|0;w=0;c=f[i>>2]|0;e=f[Q>>2]|0;g=f[x>>2]|0;i=f[y>>2]|0;a=f[z>>2]|0;j=f[A>>2]|0;k=f[B>>2]|0;l=f[C>>2]|0;m=f[D>>2]|0;n=f[E>>2]|0;o=f[F>>2]|0;p=f[G>>2]|0;q=f[H>>2]|0;r=0;s=0;t=0;v=0;while(1){U=bb(N,R)|0;e=e+(f[O+(U<<2)>>2]|0)&7;g=g+(f[P+(U<<2)>>2]|0)&7;U=bb(N,R)|0;i=i+(f[O+(U<<2)>>2]|0)&7;a=a+(f[P+(U<<2)>>2]|0)&7;U=bb(N,R)|0;j=j+(f[O+(U<<2)>>2]|0)&7;k=k+(f[P+(U<<2)>>2]|0)&7;U=bb(N,R)|0;l=l+(f[O+(U<<2)>>2]|0)&7;m=m+(f[P+(U<<2)>>2]|0)&7;U=bb(N,R)|0;n=n+(f[O+(U<<2)>>2]|0)&7;o=o+(f[P+(U<<2)>>2]|0)&7;U=bb(N,R)|0;p=p+(f[O+(U<<2)>>2]|0)&7;q=q+(f[P+(U<<2)>>2]|0)&7;U=bb(N,R)|0;r=r+(f[O+(U<<2)>>2]|0)&7;s=s+(f[P+(U<<2)>>2]|0)&7;U=bb(N,R)|0;t=t+(f[O+(U<<2)>>2]|0)&7;v=v+(f[P+(U<<2)>>2]|0)&7;U=h[1445+k>>0]|0;d[c>>1]=(h[1445+g>>0]|0)<<3|(h[1445+e>>0]|0)|(h[1445+i>>0]|0)<<6|(h[1445+a>>0]|0)<<9|(h[1445+j>>0]|0)<<12|U<<15;T=h[1445+p>>0]|0;d[c+2>>1]=(h[1445+l>>0]|0)<<2|U>>>1|(h[1445+m>>0]|0)<<5|(h[1445+n>>0]|0)<<8|(h[1445+o>>0]|0)<<11|T<<14;d[c+4>>1]=(h[1445+q>>0]|0)<<1|T>>>2|(h[1445+r>>0]|0)<<4|(h[1445+s>>0]|0)<<7|(h[1445+t>>0]|0)<<10|(h[1445+v>>0]|0)<<13;w=w+1|0;if(w>>>0>=M>>>0)break;else c=c+6|0;}f[Q>>2]=e;f[x>>2]=g;f[y>>2]=i;f[z>>2]=a;f[A>>2]=j;f[B>>2]=k;f[C>>2]=l;f[D>>2]=m;f[E>>2]=n;f[F>>2]=o;f[G>>2]=p;f[H>>2]=q;f[I>>2]=r;f[J>>2]=s;f[K>>2]=t;f[L>>2]=v;c=1;}while(0)}else c=0;Cb(R);U=c;u=S;return U|0}function Xa(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;D=u;u=u+1008|0;j=D;i=D+496|0;C=D+472|0;z=D+276|0;A=D+80|0;B=D+16|0;d=f[a+88>>2]|0;x=(h[d+47>>0]|0)<<8|(h[d+48>>0]|0);y=a+92|0;c=(f[a+4>>2]|0)+((h[d+42>>0]|0)<<8|(h[d+41>>0]|0)<<16|(h[d+43>>0]|0))|0;d=(h[d+45>>0]|0)<<8|(h[d+44>>0]|0)<<16|(h[d+46>>0]|0);if(!d){C=0;u=D;return C|0}f[y>>2]=c;f[a+96>>2]=c;f[a+104>>2]=d;f[a+100>>2]=c+d;f[a+108>>2]=0;f[a+112>>2]=0;f[C+20>>2]=0;f[C>>2]=0;f[C+4>>2]=0;f[C+8>>2]=0;f[C+12>>2]=0;b[C+16>>0]=0;if(Pa(y,C)|0){c=0;d=-3;e=-3;while(1){f[z+(c<<2)>>2]=e;f[A+(c<<2)>>2]=d;g=(e|0)>2;c=c+1|0;if((c|0)==49)break;else{d=(g&1)+d|0;e=g?-3:e+1|0;}}c=B;d=c+64|0;do{f[c>>2]=0;c=c+4|0;}while((c|0)<(d|0));e=a+252|0;d=a+256|0;c=f[d>>2]|0;a:do if((c|0)==(x|0))k=13;else{if(c>>>0<=x>>>0){do if((f[a+260>>2]|0)>>>0<x>>>0)if(fb(e,x,(c+1|0)==(x|0),4,0)|0){c=f[d>>2]|0;break}else{b[a+264>>0]=1;c=0;break a}while(0);Ib((f[e>>2]|0)+(c<<2)|0,0,x-c<<2|0)|0;}f[d>>2]=x;k=13;}while(0);do if((k|0)==13){if(!x){f[j>>2]=866;f[j+4>>2]=910;f[j+8>>2]=1497;vc(i,812,j)|0;Ub(i)|0;c=1;break}a=B+4|0;i=B+8|0;j=B+12|0;k=B+16|0;l=B+20|0;m=B+24|0;n=B+28|0;o=B+32|0;p=B+36|0;q=B+40|0;r=B+44|0;s=B+48|0;t=B+52|0;v=B+56|0;w=B+60|0;g=0;c=f[e>>2]|0;d=f[a>>2]|0;e=f[B>>2]|0;while(1){Q=bb(y,C)|0;e=e+(f[z+(Q<<2)>>2]|0)&3;d=d+(f[A+(Q<<2)>>2]|0)&3;Q=bb(y,C)|0;R=(f[i>>2]|0)+(f[z+(Q<<2)>>2]|0)&3;f[i>>2]=R;Q=(f[j>>2]|0)+(f[A+(Q<<2)>>2]|0)&3;f[j>>2]=Q;O=bb(y,C)|0;P=(f[k>>2]|0)+(f[z+(O<<2)>>2]|0)&3;f[k>>2]=P;O=(f[l>>2]|0)+(f[A+(O<<2)>>2]|0)&3;f[l>>2]=O;M=bb(y,C)|0;N=(f[m>>2]|0)+(f[z+(M<<2)>>2]|0)&3;f[m>>2]=N;M=(f[n>>2]|0)+(f[A+(M<<2)>>2]|0)&3;f[n>>2]=M;K=bb(y,C)|0;L=(f[o>>2]|0)+(f[z+(K<<2)>>2]|0)&3;f[o>>2]=L;K=(f[p>>2]|0)+(f[A+(K<<2)>>2]|0)&3;f[p>>2]=K;I=bb(y,C)|0;J=(f[q>>2]|0)+(f[z+(I<<2)>>2]|0)&3;f[q>>2]=J;I=(f[r>>2]|0)+(f[A+(I<<2)>>2]|0)&3;f[r>>2]=I;G=bb(y,C)|0;H=(f[s>>2]|0)+(f[z+(G<<2)>>2]|0)&3;f[s>>2]=H;G=(f[t>>2]|0)+(f[A+(G<<2)>>2]|0)&3;f[t>>2]=G;E=bb(y,C)|0;F=(f[v>>2]|0)+(f[z+(E<<2)>>2]|0)&3;f[v>>2]=F;E=(f[w>>2]|0)+(f[A+(E<<2)>>2]|0)&3;f[w>>2]=E;f[c>>2]=(h[1441+d>>0]|0)<<2|(h[1441+e>>0]|0)|(h[1441+R>>0]|0)<<4|(h[1441+Q>>0]|0)<<6|(h[1441+P>>0]|0)<<8|(h[1441+O>>0]|0)<<10|(h[1441+N>>0]|0)<<12|(h[1441+M>>0]|0)<<14|(h[1441+L>>0]|0)<<16|(h[1441+K>>0]|0)<<18|(h[1441+J>>0]|0)<<20|(h[1441+I>>0]|0)<<22|(h[1441+H>>0]|0)<<24|(h[1441+G>>0]|0)<<26|(h[1441+F>>0]|0)<<28|(h[1441+E>>0]|0)<<30;g=g+1|0;if(g>>>0>=x>>>0)break;else c=c+4|0;}f[B>>2]=e;f[a>>2]=d;c=1;}while(0)}else c=0;Cb(C);R=c;u=D;return R|0}function Ya(a,c,d,e,g,i,k,l){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;aa=u;u=u+592|0;Z=aa+48|0;$=aa+32|0;_=aa+16|0;Y=aa;W=aa+80|0;X=aa+64|0;I=a+272|0;J=f[I>>2]|0;V=f[a+88>>2]|0;K=(h[V+63>>0]|0)<<8|(h[V+64>>0]|0);V=b[V+17>>0]|0;L=V&255;if(!(V<<24>>24)){u=aa;return 1}M=(l|0)==0;N=k+-1|0;O=N<<4;P=l+-1|0;Q=e<<1;R=a+92|0;S=a+116|0;T=a+164|0;U=a+268|0;V=a+212|0;H=(g&1|0)==0;G=(i&1|0)==0;F=a+288|0;E=a+284|0;D=0;g=0;d=0;i=1;do{if(!M){B=f[c+(D<<2)>>2]|0;C=0;while(1){A=C&1;m=(A|0)==0;z=(A<<5^32)+-16|0;A=(A<<1^2)+-1|0;x=m?k:-1;a=m?0:N;if((a|0)!=(x|0)){y=G|(C|0)!=(P|0);w=m?B:B+O|0;while(1){if((i|0)==1)i=bb(R,S)|0|512;v=i&7;i=i>>>3;n=h[1539+v>>0]|0;m=0;do{r=(bb(R,T)|0)+d|0;s=r-J|0;t=s>>31;d=t&r|s&~t;if((f[I>>2]|0)>>>0<=d>>>0){f[Y>>2]=866;f[Y+4>>2]=910;f[Y+8>>2]=1497;vc(W,812,Y)|0;Ub(W)|0;}f[X+(m<<2)>>2]=j[(f[U>>2]|0)+(d<<1)>>1];m=m+1|0;}while(m>>>0<n>>>0);t=H|(a|0)!=(N|0);r=0;s=w;while(1){q=y|(r|0)==0;n=r<<1;m=(bb(R,V)|0)+g|0;o=m-K|0;p=o>>31;p=p&m|o&~p;if(t){if(q){g=h[1547+(v<<2)+n>>0]|0;m=p*3|0;if((f[F>>2]|0)>>>0<=m>>>0){f[_>>2]=866;f[_+4>>2]=910;f[_+8>>2]=1497;vc(W,812,_)|0;Ub(W)|0;}o=(f[E>>2]|0)+(m<<1)|0;f[s>>2]=(j[o>>1]|0)<<16|f[X+(g<<2)>>2];f[s+4>>2]=(j[o+4>>1]|0)<<16|(j[o+2>>1]|0);}o=s+8|0;m=(bb(R,V)|0)+p|0;p=m-K|0;g=p>>31;g=g&m|p&~g;if(q){m=h[(n|1)+(1547+(v<<2))>>0]|0;n=g*3|0;if((f[F>>2]|0)>>>0<=n>>>0){f[Z>>2]=866;f[Z+4>>2]=910;f[Z+8>>2]=1497;vc(W,812,Z)|0;Ub(W)|0;}q=(f[E>>2]|0)+(n<<1)|0;f[o>>2]=(j[q>>1]|0)<<16|f[X+(m<<2)>>2];f[s+12>>2]=(j[q+4>>1]|0)<<16|(j[q+2>>1]|0);}}else{if(q){g=h[1547+(v<<2)+n>>0]|0;m=p*3|0;if((f[F>>2]|0)>>>0<=m>>>0){f[$>>2]=866;f[$+4>>2]=910;f[$+8>>2]=1497;vc(W,812,$)|0;Ub(W)|0;}q=(f[E>>2]|0)+(m<<1)|0;f[s>>2]=(j[q>>1]|0)<<16|f[X+(g<<2)>>2];f[s+4>>2]=(j[q+4>>1]|0)<<16|(j[q+2>>1]|0);}p=(bb(R,V)|0)+p|0;q=p-K|0;g=q>>31;g=g&p|q&~g;}r=r+1|0;if((r|0)==2)break;else s=s+e|0;}a=A+a|0;if((a|0)==(x|0))break;else w=w+z|0;}}C=C+1|0;if((C|0)==(l|0))break;else B=B+Q|0;}}D=D+1|0;}while((D|0)!=(L|0));u=aa;return 1}function Za(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=c;n=d;i=n;if(!k){g=(e|0)!=0;if(!i){if(g){f[e>>2]=(l>>>0)%(h>>>0);f[e+4>>2]=0;}n=0;e=(l>>>0)/(h>>>0)>>>0;return (I=n,e)|0}else{if(!g){n=0;e=0;return (I=n,e)|0}f[e>>2]=a|0;f[e+4>>2]=b&0;n=0;e=0;return (I=n,e)|0}}g=(i|0)==0;do if(h){if(!g){g=(_(i|0)|0)-(_(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!e){n=0;e=0;return (I=n,e)|0}f[e>>2]=a|0;f[e+4>>2]=j|b&0;n=0;e=0;return (I=n,e)|0}g=h-1|0;if(g&h|0){i=(_(h|0)|0)+33-(_(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(e|0){f[e>>2]=g&l;f[e+4>>2]=0;}if((h|0)==1){o=j|b&0;p=a|0|0;return (I=o,p)|0}else{p=ic(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (I=o,p)|0}}else{if(g){if(e|0){f[e>>2]=(k>>>0)%(h>>>0);f[e+4>>2]=0;}o=0;p=(k>>>0)/(h>>>0)>>>0;return (I=o,p)|0}if(!l){if(e|0){f[e>>2]=0;f[e+4>>2]=(k>>>0)%(i>>>0);}o=0;p=(k>>>0)/(i>>>0)>>>0;return (I=o,p)|0}g=i-1|0;if(!(g&i)){if(e|0){f[e>>2]=a|0;f[e+4>>2]=g&k|b&0;}o=0;p=k>>>((ic(i|0)|0)>>>0);return (I=o,p)|0}g=(_(i|0)|0)-(_(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!e){o=0;p=0;return (I=o,p)|0}f[e>>2]=a|0;f[e+4>>2]=j|b&0;o=0;p=0;return (I=o,p)|0}while(0);if(!h){k=i;j=0;i=0;}else{m=c|0|0;l=n|d&0;k=Gc(m|0,l|0,-1,-1)|0;c=I;j=i;i=0;do{d=j;j=g>>>31|j<<1;g=i|g<<1;d=a<<1|d>>>31|0;n=a>>>31|b<<1|0;Cc(k|0,c|0,d|0,n|0)|0;p=I;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=Cc(d|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=I;h=h-1|0;}while((h|0)!=0);k=j;j=0;}h=0;if(e|0){f[e>>2]=a;f[e+4>>2]=b;}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (I=o,p)|0}function _a(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=a+4|0;l=f[m>>2]|0;c=l&-8;i=a+c|0;if(!(l&3)){if(b>>>0<256){a=0;return a|0}if(c>>>0>=(b+4|0)>>>0?(c-b|0)>>>0<=f[1264]<<1>>>0:0)return a|0;a=0;return a|0}if(c>>>0>=b>>>0){c=c-b|0;if(c>>>0<=15)return a|0;k=a+b|0;f[m>>2]=l&1|b|2;f[k+4>>2]=c|3;m=k+c+4|0;f[m>>2]=f[m>>2]|1;Va(k,c);return a|0}if((i|0)==(f[1150]|0)){k=(f[1147]|0)+c|0;c=k-b|0;d=a+b|0;if(k>>>0<=b>>>0){a=0;return a|0}f[m>>2]=l&1|b|2;f[d+4>>2]=c|1;f[1150]=d;f[1147]=c;return a|0}if((i|0)==(f[1149]|0)){e=(f[1146]|0)+c|0;if(e>>>0<b>>>0){a=0;return a|0}c=e-b|0;d=l&1;if(c>>>0>15){l=a+b|0;k=l+c|0;f[m>>2]=d|b|2;f[l+4>>2]=c|1;f[k>>2]=c;d=k+4|0;f[d>>2]=f[d>>2]&-2;d=l;}else{f[m>>2]=d|e|2;d=a+e+4|0;f[d>>2]=f[d>>2]|1;d=0;c=0;}f[1146]=c;f[1149]=d;return a|0}d=f[i+4>>2]|0;if(d&2|0){a=0;return a|0}j=(d&-8)+c|0;if(j>>>0<b>>>0){a=0;return a|0}k=j-b|0;e=d>>>3;do if(d>>>0<256){d=f[i+8>>2]|0;c=f[i+12>>2]|0;if((c|0)==(d|0)){f[1144]=f[1144]&~(1<<e);break}else{f[d+12>>2]=c;f[c+8>>2]=d;break}}else{h=f[i+24>>2]|0;c=f[i+12>>2]|0;do if((c|0)==(i|0)){e=i+16|0;d=e+4|0;c=f[d>>2]|0;if(!c){c=f[e>>2]|0;if(!c){e=0;break}else g=e;}else g=d;while(1){e=c+20|0;d=f[e>>2]|0;if(d|0){c=d;g=e;continue}d=c+16|0;e=f[d>>2]|0;if(!e)break;else{c=e;g=d;}}f[g>>2]=0;e=c;}else{e=f[i+8>>2]|0;f[e+12>>2]=c;f[c+8>>2]=e;e=c;}while(0);if(h|0){c=f[i+28>>2]|0;d=4880+(c<<2)|0;if((i|0)==(f[d>>2]|0)){f[d>>2]=e;if(!e){f[1145]=f[1145]&~(1<<c);break}}else{f[h+16+(((f[h+16>>2]|0)!=(i|0)&1)<<2)>>2]=e;if(!e)break}f[e+24>>2]=h;c=i+16|0;d=f[c>>2]|0;if(d|0){f[e+16>>2]=d;f[d+24>>2]=e;}c=f[c+4>>2]|0;if(c|0){f[e+20>>2]=c;f[c+24>>2]=e;}}}while(0);c=l&1;if(k>>>0<16){f[m>>2]=j|c|2;m=a+j+4|0;f[m>>2]=f[m>>2]|1;return a|0}else{l=a+b|0;f[m>>2]=c|b|2;f[l+4>>2]=k|3;m=l+k+4|0;f[m>>2]=f[m>>2]|1;Va(l,k);return a|0}}function $a(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=u;u=u+592|0;o=p+56|0;j=p+40|0;m=p+72|0;l=p;n=p+68|0;f[l>>2]=40;tb(a,b,l)|0;h=(f[l+4>>2]|0)>>>e;i=(f[l+8>>2]|0)>>>e;l=l+32|0;d=f[l+4>>2]|0;do switch(f[l>>2]|0){case 0:{if(!d)l=8;else k=14;break}case 1:{if(!d)k=13;else k=14;break}case 2:{if(!d)k=13;else k=14;break}case 3:{if(!d)k=13;else k=14;break}case 4:{if(!d)k=13;else k=14;break}case 5:{if(!d)k=13;else k=14;break}case 6:{if(!d)k=13;else k=14;break}case 7:{if(!d)k=13;else k=14;break}case 8:{if(!d)k=13;else k=14;break}case 9:{if(!d)l=8;else k=14;break}case 10:{if(!d)l=8;else k=14;break}default:k=14;}while(0);if((k|0)==13)l=16;else if((k|0)==14){f[j>>2]=866;f[j+4>>2]=2672;f[j+8>>2]=1251;vc(m,812,j)|0;Ub(m)|0;l=0;}f[n>>2]=c;k=gb(a,b)|0;b=g+e|0;do if(b>>>0>e>>>0){if(!k){d=c;while(1){d=d+(X(X((h+3|0)>>>2,l)|0,(i+3|0)>>>2)|0)|0;e=e+1|0;if((e|0)==(b|0))break;else{i=i>>>1;h=h>>>1;}}f[n>>2]=d;break}else{a=i;d=c;}while(1){i=X((h+3|0)>>>2,l)|0;j=X(i,(a+3|0)>>>2)|0;if(!(e>>>0>15|j>>>0<8)?(f[k>>2]|0)==519686845:0){wb(k,n,j,i,e)|0;d=f[n>>2]|0;}d=d+j|0;f[n>>2]=d;e=e+1|0;if((e|0)==(b|0))break;else{a=a>>>1;h=h>>>1;}}}while(0);if(!k){u=p;return}if((f[k>>2]|0)!=519686845){u=p;return}cb(k);if(!(k&7)){Nb(k,0,0,1,0)|0;u=p;return}else{f[o>>2]=866;f[o+4>>2]=2506;f[o+8>>2]=1232;vc(m,812,o)|0;Ub(m)|0;u=p;return}}function ab(a){a=a|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;q=u;u=u+576|0;j=q;g=q+64|0;p=q+16|0;e=a+88|0;c=f[e>>2]|0;o=(h[c+39>>0]|0)<<8|(h[c+40>>0]|0);m=a+236|0;i=a+240|0;d=f[i>>2]|0;if((d|0)!=(o|0)){if(d>>>0<=o>>>0){do if((f[a+244>>2]|0)>>>0<o>>>0){if(fb(m,o,(d+1|0)==(o|0),4,0)|0){c=f[i>>2]|0;break}b[a+248>>0]=1;p=0;u=q;return p|0}else c=d;while(0);Ib((f[m>>2]|0)+(c<<2)|0,0,o-c<<2|0)|0;c=f[e>>2]|0;}f[i>>2]=o;}n=a+92|0;d=(f[a+4>>2]|0)+((h[c+34>>0]|0)<<8|(h[c+33>>0]|0)<<16|(h[c+35>>0]|0))|0;c=(h[c+37>>0]|0)<<8|(h[c+36>>0]|0)<<16|(h[c+38>>0]|0);if(!c){p=0;u=q;return p|0}f[n>>2]=d;f[a+96>>2]=d;f[a+104>>2]=c;f[a+100>>2]=d+c;f[a+108>>2]=0;f[a+112>>2]=0;k=p+20|0;f[p>>2]=0;f[p+4>>2]=0;f[p+8>>2]=0;f[p+12>>2]=0;b[p+16>>0]=0;l=p+24|0;f[p+44>>2]=0;f[k>>2]=0;f[k+4>>2]=0;f[k+8>>2]=0;f[k+12>>2]=0;f[k+16>>2]=0;b[k+20>>0]=0;if(Pa(n,p)|0?Pa(n,l)|0:0){if(!(f[i>>2]|0)){f[j>>2]=866;f[j+4>>2]=910;f[j+8>>2]=1497;vc(g,812,j)|0;Ub(g)|0;}if(!o)c=1;else{j=0;k=0;d=f[m>>2]|0;e=0;a=0;c=0;g=0;i=0;while(1){j=(bb(n,p)|0)+j&31;i=(bb(n,l)|0)+i&63;g=(bb(n,p)|0)+g&31;c=(bb(n,p)|0)+c|0;a=(bb(n,l)|0)+a&63;e=(bb(n,p)|0)+e&31;f[d>>2]=i<<5|j<<11|g|c<<27|a<<21|e<<16;k=k+1|0;if(k>>>0>=o>>>0){c=1;break}else{d=d+4|0;c=c&31;}}}}else c=0;Cb(p+24|0);Cb(p);p=c;u=q;return p|0}function bb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=u;u=u+576|0;m=s+48|0;o=s+32|0;n=s+16|0;l=s;q=s+64|0;p=f[b+20>>2]|0;r=a+20|0;k=f[r>>2]|0;if((k|0)<24){i=a+4|0;c=f[i>>2]|0;e=f[a+8>>2]|0;d=c>>>0<e>>>0;if((k|0)<16){if(d){g=(h[c>>0]|0)<<8;c=c+1|0;}else g=0;if(c>>>0<e>>>0){e=h[c>>0]|0;c=c+1|0;}else e=0;f[i>>2]=c;f[r>>2]=k+16;d=16;c=e|g;}else{if(d){f[i>>2]=c+1;c=h[c>>0]|0;}else c=0;f[r>>2]=k+8;d=24;}i=a+16|0;e=f[i>>2]|c<<d-k;f[i>>2]=e;}else{e=a+16|0;i=e;e=f[e>>2]|0;}g=(e>>>16)+1|0;do if(g>>>0<=(f[p+16>>2]|0)>>>0){d=f[(f[p+168>>2]|0)+(e>>>(32-(f[p+8>>2]|0)|0)<<2)>>2]|0;if((d|0)==-1){f[l>>2]=866;f[l+4>>2]=3253;f[l+8>>2]=1393;vc(q,812,l)|0;Ub(q)|0;}c=d&65535;d=d>>>16;if((f[b+8>>2]|0)>>>0<=c>>>0){f[n>>2]=866;f[n+4>>2]=909;f[n+8>>2]=1497;vc(q,812,n)|0;Ub(q)|0;}if((h[(f[b+4>>2]|0)+c>>0]|0|0)!=(d|0)){f[o>>2]=866;f[o+4>>2]=3257;f[o+8>>2]=1410;vc(q,812,o)|0;Ub(q)|0;}}else{d=f[p+20>>2]|0;while(1){c=d+-1|0;if(g>>>0>(f[p+28+(c<<2)>>2]|0)>>>0)d=d+1|0;else break}c=(e>>>(32-d|0))+(f[p+96+(c<<2)>>2]|0)|0;if(c>>>0<(f[b>>2]|0)>>>0){c=j[(f[p+176>>2]|0)+(c<<1)>>1]|0;break}f[m>>2]=866;f[m+4>>2]=3275;f[m+8>>2]=1348;vc(q,812,m)|0;Ub(q)|0;r=0;u=s;return r|0}while(0);f[i>>2]=f[i>>2]<<d;f[r>>2]=(f[r>>2]|0)-d;r=c;u=s;return r|0}function cb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0,k=0;k=u;u=u+576|0;j=k+48|0;h=k+32|0;g=k+16|0;e=k;i=k+64|0;f[a>>2]=0;c=a+284|0;d=f[c>>2]|0;if(d|0){if(!(d&7))Nb(d,0,0,1,0)|0;else{f[e>>2]=866;f[e+4>>2]=2506;f[e+8>>2]=1232;vc(i,812,e)|0;Ub(i)|0;}f[c>>2]=0;f[a+288>>2]=0;f[a+292>>2]=0;}b[a+296>>0]=0;c=a+268|0;d=f[c>>2]|0;if(d|0){if(!(d&7))Nb(d,0,0,1,0)|0;else{f[g>>2]=866;f[g+4>>2]=2506;f[g+8>>2]=1232;vc(i,812,g)|0;Ub(i)|0;}f[c>>2]=0;f[a+272>>2]=0;f[a+276>>2]=0;}b[a+280>>0]=0;c=a+252|0;d=f[c>>2]|0;if(d|0){if(!(d&7))Nb(d,0,0,1,0)|0;else{f[h>>2]=866;f[h+4>>2]=2506;f[h+8>>2]=1232;vc(i,812,h)|0;Ub(i)|0;}f[c>>2]=0;f[a+256>>2]=0;f[a+260>>2]=0;}b[a+264>>0]=0;c=a+236|0;d=f[c>>2]|0;if(!d){j=a+248|0;b[j>>0]=0;j=a+212|0;Cb(j);j=a+188|0;Cb(j);j=a+164|0;Cb(j);j=a+140|0;Cb(j);j=a+116|0;Cb(j);u=k;return}if(!(d&7))Nb(d,0,0,1,0)|0;else{f[j>>2]=866;f[j+4>>2]=2506;f[j+8>>2]=1232;vc(i,812,j)|0;Ub(i)|0;}f[c>>2]=0;f[a+240>>2]=0;f[a+244>>2]=0;j=a+248|0;b[j>>0]=0;j=a+212|0;Cb(j);j=a+188|0;Cb(j);j=a+164|0;Cb(j);j=a+140|0;Cb(j);j=a+116|0;Cb(j);u=k;return}function db(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(f[c>>2]|0)+(4-1)&~(4-1);b=f[d>>2]|0;f[c>>2]=d+4;f[a>>2]=b;break a}case 10:{d=(f[c>>2]|0)+(4-1)&~(4-1);b=f[d>>2]|0;f[c>>2]=d+4;d=a;f[d>>2]=b;f[d+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{d=(f[c>>2]|0)+(4-1)&~(4-1);b=f[d>>2]|0;f[c>>2]=d+4;d=a;f[d>>2]=b;f[d+4>>2]=0;break a}case 12:{d=(f[c>>2]|0)+(8-1)&~(8-1);b=d;e=f[b>>2]|0;b=f[b+4>>2]|0;f[c>>2]=d+8;d=a;f[d>>2]=e;f[d+4>>2]=b;break a}case 13:{e=(f[c>>2]|0)+(4-1)&~(4-1);d=f[e>>2]|0;f[c>>2]=e+4;d=(d&65535)<<16>>16;e=a;f[e>>2]=d;f[e+4>>2]=((d|0)<0)<<31>>31;break a}case 14:{e=(f[c>>2]|0)+(4-1)&~(4-1);d=f[e>>2]|0;f[c>>2]=e+4;e=a;f[e>>2]=d&65535;f[e+4>>2]=0;break a}case 15:{e=(f[c>>2]|0)+(4-1)&~(4-1);d=f[e>>2]|0;f[c>>2]=e+4;d=(d&255)<<24>>24;e=a;f[e>>2]=d;f[e+4>>2]=((d|0)<0)<<31>>31;break a}case 16:{e=(f[c>>2]|0)+(4-1)&~(4-1);d=f[e>>2]|0;f[c>>2]=e+4;e=a;f[e>>2]=d&255;f[e+4>>2]=0;break a}case 17:{e=(f[c>>2]|0)+(8-1)&~(8-1);g=+p[e>>3];f[c>>2]=e+8;p[a>>3]=g;break a}case 18:{e=(f[c>>2]|0)+(8-1)&~(8-1);g=+p[e>>3];f[c>>2]=e+8;p[a>>3]=g;break a}default:break a}while(0);while(0);return}function eb(a){a=a|0;var c=0,e=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0;n=u;u=u+560|0;i=n;g=n+40|0;m=n+16|0;e=f[a+88>>2]|0;k=(h[e+55>>0]|0)<<8|(h[e+56>>0]|0);l=a+92|0;c=(f[a+4>>2]|0)+((h[e+50>>0]|0)<<8|(h[e+49>>0]|0)<<16|(h[e+51>>0]|0))|0;e=(h[e+53>>0]|0)<<8|(h[e+52>>0]|0)<<16|(h[e+54>>0]|0);if(!e){m=0;u=n;return m|0}f[l>>2]=c;f[a+96>>2]=c;f[a+104>>2]=e;f[a+100>>2]=c+e;f[a+108>>2]=0;f[a+112>>2]=0;f[m+20>>2]=0;f[m>>2]=0;f[m+4>>2]=0;f[m+8>>2]=0;f[m+12>>2]=0;b[m+16>>0]=0;a:do if(Pa(l,m)|0){j=a+268|0;e=a+272|0;c=f[e>>2]|0;if((c|0)!=(k|0)){if(c>>>0<=k>>>0){do if((f[a+276>>2]|0)>>>0<k>>>0)if(fb(j,k,(c+1|0)==(k|0),2,0)|0){c=f[e>>2]|0;break}else{b[a+280>>0]=1;c=0;break a}while(0);Ib((f[j>>2]|0)+(c<<1)|0,0,k-c<<1|0)|0;}f[e>>2]=k;}if(!k){f[i>>2]=866;f[i+4>>2]=910;f[i+8>>2]=1497;vc(g,812,i)|0;Ub(g)|0;c=1;break}e=0;a=0;g=0;c=f[j>>2]|0;while(1){j=bb(l,m)|0;g=j+g&255;a=(bb(l,m)|0)+a&255;d[c>>1]=a<<8|g;e=e+1|0;if(e>>>0>=k>>>0){c=1;break}else c=c+2|0;}}else c=0;while(0);Cb(m);m=c;u=n;return m|0}function fb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=u;u=u+576|0;m=p+48|0;j=p+32|0;h=p+16|0;g=p;l=p+64|0;n=p+60|0;k=a+4|0;o=a+8|0;if((f[k>>2]|0)>>>0>(f[o>>2]|0)>>>0){f[g>>2]=866;f[g+4>>2]=2123;f[g+8>>2]=845;vc(l,812,g)|0;Ub(l)|0;}if((2147418112/(d>>>0)|0)>>>0<=b>>>0){f[h>>2]=866;f[h+4>>2]=2124;f[h+8>>2]=885;vc(l,812,h)|0;Ub(l)|0;}g=f[o>>2]|0;if(g>>>0>=b>>>0){o=1;u=p;return o|0}if(c?(i=b+-1|0,(i&b|0)!=0):0){b=i>>>16|i;b=b>>>8|b;b=b>>>4|b;b=b>>>2|b;b=(b>>>1|b)+1|0;if(!b){b=0;c=10;}else c=9;}else c=9;if((c|0)==9)if(b>>>0<=g>>>0)c=10;if((c|0)==10){f[j>>2]=866;f[j+4>>2]=2133;f[j+8>>2]=933;vc(l,812,j)|0;Ub(l)|0;}i=X(b,d)|0;if(!e){g=Gb(f[a>>2]|0,i,n,1)|0;if(!g)b=0;else{f[a>>2]=g;c=20;}}else{h=Db(i,n)|0;if(!h)b=0;else{Ia[e&0](h,f[a>>2]|0,f[k>>2]|0);g=f[a>>2]|0;do if(g|0)if(!(g&7)){Nb(g,0,0,1,0)|0;break}else{f[m>>2]=866;f[m+4>>2]=2506;f[m+8>>2]=1232;vc(l,812,m)|0;Ub(l)|0;break}while(0);f[a>>2]=h;c=20;}}if((c|0)==20){g=f[n>>2]|0;if(g>>>0>i>>>0)b=(g>>>0)/(d>>>0)|0;f[o>>2]=b;b=1;}o=b;u=p;return o|0}function gb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=u;u=u+528|0;m=o;j=o+16|0;if((a|0)==0|c>>>0<62){p=0;u=o;return p|0}k=Db(300,0)|0;if(!k){p=0;u=o;return p|0}f[k>>2]=519686845;f[k+4>>2]=0;f[k+8>>2]=0;l=k+88|0;d=k+136|0;e=k+160|0;g=k+184|0;h=k+208|0;i=k+232|0;n=k+252|0;f[n>>2]=0;f[n+4>>2]=0;f[n+8>>2]=0;b[n+12>>0]=0;n=k+268|0;f[n>>2]=0;f[n+4>>2]=0;f[n+8>>2]=0;b[n+12>>0]=0;n=k+284|0;f[n>>2]=0;f[n+4>>2]=0;f[n+8>>2]=0;b[n+12>>0]=0;n=l;p=n+44|0;do{f[n>>2]=0;n=n+4|0;}while((n|0)<(p|0));b[l+44>>0]=0;f[d>>2]=0;f[d+4>>2]=0;f[d+8>>2]=0;f[d+12>>2]=0;f[d+16>>2]=0;b[d+20>>0]=0;f[e>>2]=0;f[e+4>>2]=0;f[e+8>>2]=0;f[e+12>>2]=0;f[e+16>>2]=0;b[e+20>>0]=0;f[g>>2]=0;f[g+4>>2]=0;f[g+8>>2]=0;f[g+12>>2]=0;f[g+16>>2]=0;b[g+20>>0]=0;f[h>>2]=0;f[h+4>>2]=0;f[h+8>>2]=0;f[h+12>>2]=0;f[h+16>>2]=0;b[h+20>>0]=0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;b[i+16>>0]=0;if(xb(k,a,c)|0){p=k;u=o;return p|0}cb(k);if(!(k&7)){Nb(k,0,0,1,0)|0;p=0;u=o;return p|0}else{f[m>>2]=866;f[m+4>>2]=2506;f[m+8>>2]=1232;vc(j,812,m)|0;Ub(j)|0;p=0;u=o;return p|0}}function hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0;i=u;u=u+576|0;g=i+40|0;e=i+56|0;j=i;f[j>>2]=40;tb(a,b,j)|0;d=(((f[j+4>>2]|0)>>>c)+3|0)>>>2;b=(((f[j+8>>2]|0)>>>c)+3|0)>>>2;c=j+32|0;a=f[c+4>>2]|0;do switch(f[c>>2]|0){case 0:{if(!a)a=8;else h=14;break}case 1:{if(!a)h=13;else h=14;break}case 2:{if(!a)h=13;else h=14;break}case 3:{if(!a)h=13;else h=14;break}case 4:{if(!a)h=13;else h=14;break}case 5:{if(!a)h=13;else h=14;break}case 6:{if(!a)h=13;else h=14;break}case 7:{if(!a)h=13;else h=14;break}case 8:{if(!a)h=13;else h=14;break}case 9:{if(!a)a=8;else h=14;break}case 10:{if(!a)a=8;else h=14;break}default:h=14;}while(0);if((h|0)==13)a=16;else if((h|0)==14){f[g>>2]=866;f[g+4>>2]=2672;f[g+8>>2]=1251;vc(e,812,g)|0;Ub(e)|0;a=0;}j=X(X(b,d)|0,a)|0;u=i;return j|0}function ib(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0;e=u;u=u+576|0;d=e+40|0;c=e+56|0;g=e;f[g>>2]=40;tb(a,b,g)|0;b=g+32|0;a=f[b+4>>2]|0;do switch(f[b>>2]|0){case 0:{if(!a){g=8;u=e;return g|0}else a=14;break}case 1:{if(!a)a=13;else a=14;break}case 2:{if(!a)a=13;else a=14;break}case 3:{if(!a)a=13;else a=14;break}case 4:{if(!a)a=13;else a=14;break}case 5:{if(!a)a=13;else a=14;break}case 6:{if(!a)a=13;else a=14;break}case 7:{if(!a)a=13;else a=14;break}case 8:{if(!a)a=13;else a=14;break}case 9:{if(!a){g=8;u=e;return g|0}else a=14;break}case 10:{if(!a){g=8;u=e;return g|0}else a=14;break}default:a=14;}while(0);if((a|0)==13){g=16;u=e;return g|0}else if((a|0)==14){f[d>>2]=866;f[d+4>>2]=2672;f[d+8>>2]=1251;vc(c,812,d)|0;Ub(c)|0;g=0;u=e;return g|0}return 0}function jb(a,c,d,e,g,i,j){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0;n=f[a+88>>2]|0;l=(h[n+12>>0]<<8|h[n+13>>0])>>>j;m=(h[n+14>>0]<<8|h[n+15>>0])>>>j;l=((l>>>0>1?l:1)+3|0)>>>2;m=((m>>>0>1?m:1)+3|0)>>>2;n=n+18|0;j=b[n>>0]|0;j=X(l,j<<24>>24==0|j<<24>>24==9?8:16)|0;if(i)if((i&3|0)==0&j>>>0<=i>>>0)j=i;else{g=0;return g|0}if((X(j,m)|0)>>>0>g>>>0){g=0;return g|0}i=(l+1|0)>>>1;k=(m+1|0)>>>1;if(!d){g=0;return g|0}f[a+92>>2]=c;f[a+96>>2]=c;f[a+104>>2]=d;f[a+100>>2]=c+d;f[a+108>>2]=0;f[a+112>>2]=0;switch(b[n>>0]|0){case 0:{if(!(Ra(a,e,g,j,l,m,i,k)|0)){g=0;return g|0}break}case 4:case 6:case 5:case 3:case 2:{if(!(Ua(a,e,g,j,l,m,i,k)|0)){g=0;return g|0}break}case 9:{if(!(Ya(a,e,g,j,l,m,i,k)|0)){g=0;return g|0}break}case 8:case 7:{if(!(Sa(a,e,g,j,l,m,i,k)|0)){g=0;return g|0}break}default:{g=0;return g|0}}g=1;return g|0}function kb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0;if((d|0)>=8192)return va(a|0,c|0,d|0)|0;h=a|0;g=a+d|0;if((a&3)==(c&3)){while(a&3){if(!d)return h|0;b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0;d=d-1|0;}d=g&-4|0;e=d-64|0;while((a|0)<=(e|0)){f[a>>2]=f[c>>2];f[a+4>>2]=f[c+4>>2];f[a+8>>2]=f[c+8>>2];f[a+12>>2]=f[c+12>>2];f[a+16>>2]=f[c+16>>2];f[a+20>>2]=f[c+20>>2];f[a+24>>2]=f[c+24>>2];f[a+28>>2]=f[c+28>>2];f[a+32>>2]=f[c+32>>2];f[a+36>>2]=f[c+36>>2];f[a+40>>2]=f[c+40>>2];f[a+44>>2]=f[c+44>>2];f[a+48>>2]=f[c+48>>2];f[a+52>>2]=f[c+52>>2];f[a+56>>2]=f[c+56>>2];f[a+60>>2]=f[c+60>>2];a=a+64|0;c=c+64|0;}while((a|0)<(d|0)){f[a>>2]=f[c>>2];a=a+4|0;c=c+4|0;}}else{d=g-4|0;while((a|0)<(d|0)){b[a>>0]=b[c>>0]|0;b[a+1>>0]=b[c+1>>0]|0;b[a+2>>0]=b[c+2>>0]|0;b[a+3>>0]=b[c+3>>0]|0;a=a+4|0;c=c+4|0;}}while((a|0)<(g|0)){b[a>>0]=b[c>>0]|0;a=a+1|0;c=c+1|0;}return h|0}function lb(a){a=a|0;var b=0,c=0,d=0,e=0;e=a+92|0;d=a+88|0;c=f[d>>2]|0;b=(f[a+4>>2]|0)+((h[c+68>>0]|0)<<8|(h[c+67>>0]|0)<<16|(h[c+69>>0]|0))|0;c=(h[c+65>>0]|0)<<8|(h[c+66>>0]|0);if(!c){e=0;return e|0}f[e>>2]=b;f[a+96>>2]=b;f[a+104>>2]=c;f[a+100>>2]=b+c;f[a+108>>2]=0;f[a+112>>2]=0;if(!(Pa(e,a+116|0)|0)){e=0;return e|0}b=f[d>>2]|0;do if(!((h[b+39>>0]|0)<<8|(h[b+40>>0]|0))){if(!((h[b+55>>0]|0)<<8|(h[b+56>>0]|0))){e=0;return e|0}}else{if(!(Pa(e,a+140|0)|0)){e=0;return e|0}if(Pa(e,a+188|0)|0){b=f[d>>2]|0;break}else{e=0;return e|0}}while(0);if((h[b+55>>0]|0)<<8|(h[b+56>>0]|0)|0){if(!(Pa(e,a+164|0)|0)){e=0;return e|0}if(!(Pa(e,a+212|0)|0)){e=0;return e|0}}e=1;return e|0}function mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;m=u;u=u+48|0;k=m+16|0;g=m;e=m+32|0;i=a+28|0;d=f[i>>2]|0;f[e>>2]=d;j=a+20|0;d=(f[j>>2]|0)-d|0;f[e+4>>2]=d;f[e+8>>2]=b;f[e+12>>2]=c;d=d+c|0;h=a+60|0;f[g>>2]=f[h>>2];f[g+4>>2]=e;f[g+8>>2]=2;g=Ic(Aa(146,g|0)|0)|0;a:do if((d|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;d=d-g|0;o=f[e+4>>2]|0;n=g>>>0>o>>>0;e=n?e+8|0:e;b=(n<<31>>31)+b|0;o=g-(n?o:0)|0;f[e>>2]=(f[e>>2]|0)+o;n=e+4|0;f[n>>2]=(f[n>>2]|0)-o;f[k>>2]=f[h>>2];f[k+4>>2]=e;f[k+8>>2]=b;g=Ic(Aa(146,k|0)|0)|0;if((d|0)==(g|0)){l=3;break a}}f[a+16>>2]=0;f[i>>2]=0;f[j>>2]=0;f[a>>2]=f[a>>2]|32;if((b|0)==2)c=0;else c=c-(f[e+4>>2]|0)|0;}else l=3;while(0);if((l|0)==3){o=f[a+44>>2]|0;f[a+16>>2]=o+(f[a+48>>2]|0);f[i>>2]=o;f[j>>2]=o;}u=m;return c|0}function nb(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0;do if(!(Sc(a,f[c+8>>2]|0)|0)){h=a+8|0;if(!(Sc(a,f[c>>2]|0)|0)){j=f[h>>2]|0;Fa[f[(f[j>>2]|0)+24>>2]&3](j,c,d,e,g);break}a=c+32|0;if((f[c+16>>2]|0)!=(d|0)?(i=c+20|0,(f[i>>2]|0)!=(d|0)):0){f[a>>2]=e;e=c+44|0;if((f[e>>2]|0)==4)break;a=c+52|0;b[a>>0]=0;k=c+53|0;b[k>>0]=0;h=f[h>>2]|0;Ka[f[(f[h>>2]|0)+20>>2]&3](h,c,d,d,1,g);if(b[k>>0]|0)if(!(b[a>>0]|0)){a=3;j=11;}else a=3;else{a=4;j=11;}if((j|0)==11){f[i>>2]=d;k=c+40|0;f[k>>2]=(f[k>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0)b[c+54>>0]=1;}f[e>>2]=a;break}if((e|0)==1)f[a>>2]=1;}else jc(0,c,d,e);while(0);return}function ob(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0;r=u;u=u+224|0;m=r+120|0;n=r+80|0;p=r;q=r+136|0;e=n;g=e+40|0;do{f[e>>2]=0;e=e+4|0;}while((e|0)<(g|0));f[m>>2]=f[d>>2];if((Oa(0,c,m,p,n)|0)<0)d=-1;else{if((f[a+76>>2]|0)>-1);d=f[a>>2]|0;l=d&32;if((b[a+74>>0]|0)<1)f[a>>2]=d&-33;e=a+48|0;if(!(f[e>>2]|0)){g=a+44|0;h=f[g>>2]|0;f[g>>2]=q;i=a+28|0;f[i>>2]=q;j=a+20|0;f[j>>2]=q;f[e>>2]=80;k=a+16|0;f[k>>2]=q+80;d=Oa(a,c,m,p,n)|0;if(h){Ea[f[a+36>>2]&7](a,0,0)|0;d=(f[j>>2]|0)==0?-1:d;f[g>>2]=h;f[e>>2]=0;f[k>>2]=0;f[i>>2]=0;f[j>>2]=0;}}else d=Oa(a,c,m,p,n)|0;e=f[a>>2]|0;f[a>>2]=e|l;d=(e&32|0)==0?d:-1;}u=r;return d|0}function pb(a,c,e,g){a=a|0;c=c|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;p=u;u=u+64|0;n=p;m=f[a>>2]|0;o=a+(f[m+-8>>2]|0)|0;m=f[m+-4>>2]|0;f[n>>2]=e;f[n+4>>2]=a;f[n+8>>2]=c;f[n+12>>2]=g;a=n+16|0;c=n+20|0;g=n+24|0;h=n+28|0;i=n+32|0;j=n+40|0;k=a;l=k+36|0;do{f[k>>2]=0;k=k+4|0;}while((k|0)<(l|0));d[a+36>>1]=0;b[a+38>>0]=0;a:do if(Sc(m,e)|0){f[n+48>>2]=1;Ka[f[(f[m>>2]|0)+20>>2]&3](m,n,o,o,1,0);a=(f[g>>2]|0)==1?o:0;}else{Fa[f[(f[m>>2]|0)+24>>2]&3](m,n,o,1,0);switch(f[n+36>>2]|0){case 0:{a=(f[j>>2]|0)==1&(f[h>>2]|0)==1&(f[i>>2]|0)==1?f[c>>2]|0:0;break a}case 1:break;default:{a=0;break a}}if((f[g>>2]|0)!=1?!((f[j>>2]|0)==0&(f[h>>2]|0)==1&(f[i>>2]|0)==1):0){a=0;break}a=f[a>>2]|0;}while(0);u=p;return a|0}function qb(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;j=u;u=u+544|0;h=j+16|0;b=j;e=j+32|0;g=a+8|0;c=f[g>>2]|0;if((c+-1|0)>>>0>=8192){f[b>>2]=866;f[b+4>>2]=3006;f[b+8>>2]=1257;vc(e,812,b)|0;Ub(e)|0;}f[a>>2]=c;d=a+20|0;b=f[d>>2]|0;if(!b){b=Db(180,0)|0;if(!b)b=0;else{i=b+164|0;f[i>>2]=0;f[i+4>>2]=0;f[i+8>>2]=0;f[i+12>>2]=0;}f[d>>2]=b;i=f[a>>2]|0;}else i=c;if(!(f[g>>2]|0)){f[h>>2]=866;f[h+4>>2]=910;f[h+8>>2]=1497;vc(e,812,h)|0;Ub(e)|0;h=f[a>>2]|0;}else h=i;e=f[a+4>>2]|0;if(h>>>0>16){c=h;d=0;}else{a=0;a=Qa(b,i,e,a)|0;u=j;return a|0}while(1){g=d+1|0;if(c>>>0>3){c=c>>>1;d=g;}else break}a=d+2+((g|0)!=32&1<<g>>>0<h>>>0&1)|0;a=(a>>>0<11?a:11)&255;a=Qa(b,i,e,a)|0;u=j;return a|0}function rb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(f[a>>2]|0)+1794895138|0;h=Tc(f[a+8>>2]|0,o)|0;e=Tc(f[a+12>>2]|0,o)|0;g=Tc(f[a+16>>2]|0,o)|0;a:do if((h>>>0<c>>>2>>>0?(n=c-(h<<2)|0,e>>>0<n>>>0&g>>>0<n>>>0):0)?((g|e)&3|0)==0:0){n=e>>>2;m=g>>>2;l=0;while(1){j=h>>>1;k=l+j|0;i=k<<1;g=i+n|0;e=Tc(f[a+(g<<2)>>2]|0,o)|0;g=Tc(f[a+(g+1<<2)>>2]|0,o)|0;if(!(g>>>0<c>>>0&e>>>0<(c-g|0)>>>0)){e=0;break a}if(b[a+(g+e)>>0]|0){e=0;break a}e=_b(d,a+g|0)|0;if(!e)break;e=(e|0)<0;if((h|0)==1){e=0;break a}else{l=e?l:k;h=e?j:h-j|0;}}e=i+m|0;g=Tc(f[a+(e<<2)>>2]|0,o)|0;e=Tc(f[a+(e+1<<2)>>2]|0,o)|0;if(e>>>0<c>>>0&g>>>0<(c-e|0)>>>0)e=(b[a+(e+g)>>0]|0)==0?a+e|0:0;else e=0;}else e=0;while(0);return e|0}function sb(a){a=a|0;var b=0,c=0,d=0,e=0,g=0,h=0,i=0,j=0;i=u;u=u+576|0;g=i+48|0;h=i+32|0;d=i+16|0;c=i;e=i+64|0;b=f[a+168>>2]|0;do if(b|0){j=f[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~f[b>>2]|0):0)){f[c>>2]=866;f[c+4>>2]=651;f[c+8>>2]=1579;vc(e,812,c)|0;Ub(e)|0;}if(!(b&7)){Nb(b,0,0,1,0)|0;break}else{f[d>>2]=866;f[d+4>>2]=2506;f[d+8>>2]=1232;vc(e,812,d)|0;Ub(e)|0;break}}while(0);b=f[a+176>>2]|0;if(!b){u=i;return}j=f[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~f[b>>2]|0):0)){f[h>>2]=866;f[h+4>>2]=651;f[h+8>>2]=1579;vc(e,812,h)|0;Ub(e)|0;}if(!(b&7)){Nb(b,0,0,1,0)|0;u=i;return}else{f[g>>2]=866;f[g+4>>2]=2506;f[g+8>>2]=1232;vc(e,812,g)|0;Ub(e)|0;u=i;return}}function tb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;if(!((a|0)!=0&c>>>0>73&(d|0)!=0)){d=0;return d|0}if((f[d>>2]|0)!=40){d=0;return d|0}if(((h[a>>0]|0)<<8|(h[a+1>>0]|0)|0)!=18552){d=0;return d|0}if(((h[a+2>>0]|0)<<8|(h[a+3>>0]|0))>>>0<74){d=0;return d|0}if(((h[a+7>>0]|0)<<16|(h[a+6>>0]|0)<<24|(h[a+8>>0]|0)<<8|(h[a+9>>0]|0))>>>0>c>>>0){d=0;return d|0}f[d+4>>2]=(h[a+12>>0]|0)<<8|(h[a+13>>0]|0);f[d+8>>2]=(h[a+14>>0]|0)<<8|(h[a+15>>0]|0);f[d+12>>2]=h[a+16>>0];f[d+16>>2]=h[a+17>>0];c=a+18|0;e=d+32|0;f[e>>2]=h[c>>0];f[e+4>>2]=0;c=b[c>>0]|0;f[d+20>>2]=c<<24>>24==0|c<<24>>24==9?8:16;f[d+24>>2]=(h[a+26>>0]|0)<<16|(h[a+25>>0]|0)<<24|(h[a+27>>0]|0)<<8|(h[a+28>>0]|0);f[d+28>>2]=(h[a+30>>0]|0)<<16|(h[a+29>>0]|0)<<24|(h[a+31>>0]|0)<<8|(h[a+32>>0]|0);d=1;return d|0}function ub(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0;l=u;u=u+544|0;j=l+16|0;c=l;i=l+32|0;if(b>>>0>=33){f[c>>2]=866;f[c+4>>2]=3199;f[c+8>>2]=1350;vc(i,812,c)|0;Ub(i)|0;}k=a+20|0;c=f[k>>2]|0;if((c|0)>=(b|0)){e=a+16|0;g=e;e=f[e>>2]|0;i=c;j=32-b|0;j=e>>>j;e=e<<b;f[g>>2]=e;b=i-b|0;f[k>>2]=b;u=l;return j|0}e=a+4|0;g=a+8|0;d=a+16|0;do{a=f[e>>2]|0;if((a|0)==(f[g>>2]|0))a=0;else{f[e>>2]=a+1;a=h[a>>0]|0;}c=c+8|0;f[k>>2]=c;if((c|0)>=33){f[j>>2]=866;f[j+4>>2]=3208;f[j+8>>2]=1366;vc(i,812,j)|0;Ub(i)|0;c=f[k>>2]|0;}a=a<<32-c|f[d>>2];f[d>>2]=a;}while((c|0)<(b|0));j=32-b|0;j=a>>>j;i=a<<b;f[d>>2]=i;b=c-b|0;f[k>>2]=b;u=l;return j|0}function vb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;h=c&255;e=(d|0)!=0;a:do if(e&(a&3|0)!=0){g=c&255;while(1){if((b[a>>0]|0)==g<<24>>24){i=6;break a}a=a+1|0;d=d+-1|0;e=(d|0)!=0;if(!(e&(a&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(e)i=6;else d=0;b:do if((i|0)==6){g=c&255;if((b[a>>0]|0)!=g<<24>>24){e=X(h,16843009)|0;c:do if(d>>>0>3)while(1){h=f[a>>2]^e;if((h&-2139062144^-2139062144)&h+-16843009|0)break;a=a+4|0;d=d+-4|0;if(d>>>0<=3){i=11;break c}}else i=11;while(0);if((i|0)==11)if(!d){d=0;break}while(1){if((b[a>>0]|0)==g<<24>>24)break b;a=a+1|0;d=d+-1|0;if(!d){d=0;break}}}}while(0);return (d|0?a:0)|0}function wb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var g=0,i=0,j=0,k=0,l=0,m=0;m=u;u=u+528|0;l=m;k=m+16|0;i=f[a+88>>2]|0;j=(h[i+70+(e<<2)+1>>0]|0)<<16|(h[i+70+(e<<2)>>0]|0)<<24|(h[i+70+(e<<2)+2>>0]|0)<<8|(h[i+70+(e<<2)+3>>0]|0);g=e+1|0;if(g>>>0<(h[i+16>>0]|0)>>>0)g=(h[i+70+(g<<2)+1>>0]|0)<<16|(h[i+70+(g<<2)>>0]|0)<<24|(h[i+70+(g<<2)+2>>0]|0)<<8|(h[i+70+(g<<2)+3>>0]|0);else g=f[a+8>>2]|0;if(g>>>0>j>>>0){k=a+4|0;k=f[k>>2]|0;k=k+j|0;l=g-j|0;l=jb(a,k,l,b,c,d,e)|0;u=m;return l|0}f[l>>2]=866;f[l+4>>2]=3694;f[l+8>>2]=1508;vc(k,812,l)|0;Ub(k)|0;k=a+4|0;k=f[k>>2]|0;k=k+j|0;l=g-j|0;l=jb(a,k,l,b,c,d,e)|0;u=m;return l|0}function xb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(((!((b|0)==0|c>>>0<74)?((h[b>>0]|0)<<8|(h[b+1>>0]|0)|0)==18552:0)?((h[b+2>>0]|0)<<8|(h[b+3>>0]|0))>>>0>=74:0)?((h[b+7>>0]|0)<<16|(h[b+6>>0]|0)<<24|(h[b+8>>0]|0)<<8|(h[b+9>>0]|0))>>>0<=c>>>0:0){d=a+88|0;f[d>>2]=b;f[a+4>>2]=b;f[a+8>>2]=c;if(!(lb(a)|0)){e=0;return e|0}b=f[d>>2]|0;if((h[b+39>>0]|0)<<8|(h[b+40>>0]|0)){if(ab(a)|0?Xa(a)|0:0){b=f[d>>2]|0;e=11;}}else e=11;if((e|0)==11){if(!((h[b+55>>0]|0)<<8|(h[b+56>>0]|0))){e=1;return e|0}if(eb(a)|0?Wa(a)|0:0){e=1;return e|0}}e=0;return e|0}f[a+88>>2]=0;e=0;return e|0}function yb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,i=0,j=0,k=0,l=0;l=u;u=u+528|0;i=l;g=l+16|0;if(!b){k=0;u=l;return k|0}if(b>>>0<=16){k=ub(a,b)|0;u=l;return k|0}j=ub(a,b+-16|0)|0;k=a+20|0;b=f[k>>2]|0;if((b|0)<16){d=a+4|0;e=a+8|0;c=a+16|0;do{a=f[d>>2]|0;if((a|0)==(f[e>>2]|0))a=0;else{f[d>>2]=a+1;a=h[a>>0]|0;}b=b+8|0;f[k>>2]=b;if((b|0)>=33){f[i>>2]=866;f[i+4>>2]=3208;f[i+8>>2]=1366;vc(g,812,i)|0;Ub(g)|0;b=f[k>>2]|0;}a=a<<32-b|f[c>>2];f[c>>2]=a;}while((b|0)<16)}else{a=a+16|0;c=a;a=f[a>>2]|0;}f[c>>2]=a<<16;f[k>>2]=b+-16;k=a>>>16|j<<16;u=l;return k|0}function zb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0;e=d+16|0;g=f[e>>2]|0;if(!g)if(!(Zb(d)|0)){g=f[e>>2]|0;h=5;}else e=0;else h=5;a:do if((h|0)==5){j=d+20|0;i=f[j>>2]|0;e=i;if((g-i|0)>>>0<c>>>0){e=Ea[f[d+36>>2]&7](d,a,c)|0;break}b:do if((b[d+75>>0]|0)>-1){i=c;while(1){if(!i){h=0;g=a;break b}g=i+-1|0;if((b[a+g>>0]|0)==10)break;else i=g;}e=Ea[f[d+36>>2]&7](d,a,i)|0;if(e>>>0<i>>>0)break a;h=i;g=a+i|0;c=c-i|0;e=f[j>>2]|0;}else{h=0;g=a;}while(0);kb(e|0,g|0,c|0)|0;f[j>>2]=(f[j>>2]|0)+c;e=h+c|0;}while(0);return e|0}function Ab(a,c,d){a=a|0;c=c|0;d=d|0;do if(a){if(c>>>0<128){b[a>>0]=c;a=1;break}d=(ld()|0)+188|0;if(!(f[f[d>>2]>>2]|0))if((c&-128|0)==57216){b[a>>0]=c;a=1;break}else{a=jd()|0;f[a>>2]=84;a=-1;break}if(c>>>0<2048){b[a>>0]=c>>>6|192;b[a+1>>0]=c&63|128;a=2;break}if(c>>>0<55296|(c&-8192|0)==57344){b[a>>0]=c>>>12|224;b[a+1>>0]=c>>>6&63|128;b[a+2>>0]=c&63|128;a=3;break}if((c+-65536|0)>>>0<1048576){b[a>>0]=c>>>18|240;b[a+1>>0]=c>>>12&63|128;b[a+2>>0]=c>>>6&63|128;b[a+3>>0]=c&63|128;a=4;break}else{a=jd()|0;f[a>>2]=84;a=-1;break}}else a=1;while(0);return a|0}function Bb(){var a=0,b=0,c=0,d=0,e=0,g=0,h=0,i=0;e=u;u=u+48|0;h=e+32|0;c=e+24|0;i=e+16|0;g=e;e=e+36|0;a=rc()|0;if(a|0?(d=f[a>>2]|0,d|0):0){a=d+48|0;b=f[a>>2]|0;a=f[a+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){f[c>>2]=4168;Ac(4118,c);}if((b|0)==1126902529&(a|0)==1129074247)a=f[d+44>>2]|0;else a=d+80|0;f[e>>2]=a;d=f[d>>2]|0;a=f[d+4>>2]|0;if(Ea[f[(f[2]|0)+16>>2]&7](8,d,e)|0){i=f[e>>2]|0;i=Ha[f[(f[i>>2]|0)+8>>2]&1](i)|0;f[g>>2]=4168;f[g+4>>2]=a;f[g+8>>2]=i;Ac(4032,g);}else{f[i>>2]=4168;f[i+4>>2]=a;Ac(4077,i);}}Ac(4156,h);}function Cb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0;h=u;u=u+544|0;g=h+16|0;d=h;e=h+32|0;c=f[a+20>>2]|0;do if(c|0){sb(c);if(!(c&7)){Nb(c,0,0,1,0)|0;break}else{f[d>>2]=866;f[d+4>>2]=2506;f[d+8>>2]=1232;vc(e,812,d)|0;Ub(e)|0;break}}while(0);c=a+4|0;d=f[c>>2]|0;if(!d){g=a+16|0;b[g>>0]=0;u=h;return}if(!(d&7))Nb(d,0,0,1,0)|0;else{f[g>>2]=866;f[g+4>>2]=2506;f[g+8>>2]=1232;vc(e,812,g)|0;Ub(e)|0;}f[c>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;g=a+16|0;b[g>>0]=0;u=h;return}function Db(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,g=0,h=0,i=0,j=0;j=u;u=u+560|0;i=j+32|0;h=j+16|0;c=j;g=j+48|0;e=j+44|0;d=a+3&-4;d=d|0?d:4;if(d>>>0>2147418112){f[c>>2]=866;f[c+4>>2]=2506;f[c+8>>2]=1103;vc(g,812,c)|0;Ub(g)|0;i=0;u=j;return i|0}f[e>>2]=d;a=Nb(0,d,e,1,0)|0;c=f[e>>2]|0;if(b|0)f[b>>2]=c;if(!((a|0)==0|c>>>0<d>>>0)){if(a&7){f[i>>2]=866;f[i+4>>2]=2533;f[i+8>>2]=1156;vc(g,812,i)|0;Ub(g)|0;}}else{f[h>>2]=866;f[h+4>>2]=2506;f[h+8>>2]=1129;vc(g,812,h)|0;Ub(g)|0;a=0;}i=a;u=j;return i|0}function Eb(a){a=a|0;var c=0,d=0,e=0,g=0,h=0,i=0;i=u;u=u+544|0;h=i+16|0;e=i;g=i+32|0;f[a>>2]=0;c=a+4|0;d=f[c>>2]|0;if(d|0){if(!(d&7))Nb(d,0,0,1,0)|0;else{f[e>>2]=866;f[e+4>>2]=2506;f[e+8>>2]=1232;vc(g,812,e)|0;Ub(g)|0;}f[c>>2]=0;f[a+8>>2]=0;f[a+12>>2]=0;}b[a+16>>0]=0;a=a+20|0;c=f[a>>2]|0;if(!c){u=i;return}sb(c);if(!(c&7))Nb(c,0,0,1,0)|0;else{f[h>>2]=866;f[h+4>>2]=2506;f[h+8>>2]=1232;vc(g,812,h)|0;Ub(g)|0;}f[a>>2]=0;u=i;return}function Fb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=u;u=u+128|0;g=m+124|0;l=m;h=l;i=604;j=h+124|0;do{f[h>>2]=f[i>>2];h=h+4|0;i=i+4|0;}while((h|0)<(j|0));if((c+-1|0)>>>0>2147483646)if(!c){a=g;c=1;k=4;}else{c=jd()|0;f[c>>2]=75;c=-1;}else k=4;if((k|0)==4){k=-2-a|0;k=c>>>0>k>>>0?k:c;f[l+48>>2]=k;g=l+20|0;f[g>>2]=a;f[l+44>>2]=a;c=a+k|0;a=l+16|0;f[a>>2]=c;f[l+28>>2]=c;c=ob(l,d,e)|0;if(k){l=f[g>>2]|0;b[l+(((l|0)==(f[a>>2]|0))<<31>>31)>>0]=0;}}u=m;return c|0}function Gb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0,j=0,k=0;k=u;u=u+560|0;j=k+32|0;g=k+16|0;e=k;h=k+48|0;i=k+44|0;if(a&7|0){f[e>>2]=866;f[e+4>>2]=2506;f[e+8>>2]=1210;vc(h,812,e)|0;Ub(h)|0;j=0;u=k;return j|0}if(b>>>0>2147418112){f[g>>2]=866;f[g+4>>2]=2506;f[g+8>>2]=1103;vc(h,812,g)|0;Ub(h)|0;j=0;u=k;return j|0}f[i>>2]=b;a=Nb(a,b,i,d,0)|0;if(c|0)f[c>>2]=f[i>>2];if(a&7|0){f[j>>2]=866;f[j+4>>2]=2558;f[j+8>>2]=1156;vc(h,812,j)|0;Ub(h)|0;}j=a;u=k;return j|0}function Hb(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;var h=0;do if(!(Sc(a,f[c+8>>2]|0)|0)){if(Sc(a,f[c>>2]|0)|0){a=c+32|0;if((f[c+16>>2]|0)!=(d|0)?(h=c+20|0,(f[h>>2]|0)!=(d|0)):0){f[a>>2]=e;f[h>>2]=d;e=c+40|0;f[e>>2]=(f[e>>2]|0)+1;if((f[c+36>>2]|0)==1?(f[c+24>>2]|0)==2:0)b[c+54>>0]=1;f[c+44>>2]=4;break}if((e|0)==1)f[a>>2]=1;}}else jc(0,c,d,e);while(0);return}function Ib(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0,h=0,i=0;h=a+d|0;c=c&255;if((d|0)>=67){while(a&3){b[a>>0]=c;a=a+1|0;}e=h&-4|0;g=e-64|0;i=c|c<<8|c<<16|c<<24;while((a|0)<=(g|0)){f[a>>2]=i;f[a+4>>2]=i;f[a+8>>2]=i;f[a+12>>2]=i;f[a+16>>2]=i;f[a+20>>2]=i;f[a+24>>2]=i;f[a+28>>2]=i;f[a+32>>2]=i;f[a+36>>2]=i;f[a+40>>2]=i;f[a+44>>2]=i;f[a+48>>2]=i;f[a+52>>2]=i;f[a+56>>2]=i;f[a+60>>2]=i;a=a+64|0;}while((a|0)<(e|0)){f[a>>2]=i;a=a+4|0;}}while((a|0)<(h|0)){b[a>>0]=c;a=a+1|0;}return h-d|0}function Jb(a,c,d,e,g){a=a|0;c=c|0;d=d|0;e=e|0;g=g|0;var h=0,i=0,j=0,k=0;b[c+53>>0]=1;do if((f[c+4>>2]|0)==(e|0)){b[c+52>>0]=1;e=c+16|0;h=f[e>>2]|0;j=c+54|0;k=c+48|0;i=c+24|0;a=c+36|0;if(!h){f[e>>2]=d;f[i>>2]=g;f[a>>2]=1;if(!((f[k>>2]|0)==1&(g|0)==1))break;b[j>>0]=1;break}if((h|0)!=(d|0)){f[a>>2]=(f[a>>2]|0)+1;b[j>>0]=1;break}a=f[i>>2]|0;if((a|0)==2){f[i>>2]=g;a=g;}if((f[k>>2]|0)==1&(a|0)==1)b[j>>0]=1;}while(0);return}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0,h=0;h=u;u=u+64|0;e=h;if(!(Sc(a,b)|0))if((b|0)!=0?(g=pb(b,32,16,0)|0,(g|0)!=0):0){b=e+4|0;d=b+52|0;do{f[b>>2]=0;b=b+4|0;}while((b|0)<(d|0));f[e>>2]=g;f[e+8>>2]=a;f[e+12>>2]=-1;f[e+48>>2]=1;La[f[(f[g>>2]|0)+28>>2]&3](g,e,f[c>>2]|0,1);if((f[e+24>>2]|0)==1){f[c>>2]=f[e+16>>2];b=1;}else b=0;}else b=0;else b=1;u=h;return b|0}function Lb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,i=0,j=0,k=0,l=0;l=u;u=u+16|0;j=l;k=c&255;b[j>>0]=k;e=a+16|0;g=f[e>>2]|0;if(!g)if(!(Zb(a)|0)){g=f[e>>2]|0;i=4;}else d=-1;else i=4;do if((i|0)==4){i=a+20|0;e=f[i>>2]|0;if(e>>>0<g>>>0?(d=c&255,(d|0)!=(b[a+75>>0]|0)):0){f[i>>2]=e+1;b[e>>0]=k;break}if((Ea[f[a+36>>2]&7](a,j,1)|0)==1)d=h[j>>0]|0;else d=-1;}while(0);u=l;return d|0}function Mb(a,c){a=a|0;c=c|0;var d=0,e=0,g=0,h=0,i=0,j=0,k=0;j=a&255;d=a&255;if((f[c+76>>2]|0)>=0?(td()|0)!=0:0){if((d|0)!=(b[c+75>>0]|0)?(h=c+20|0,i=f[h>>2]|0,i>>>0<(f[c+16>>2]|0)>>>0):0){f[h>>2]=i+1;b[i>>0]=j;}else d=Lb(c,a)|0;}else k=3;do if((k|0)==3){if((d|0)!=(b[c+75>>0]|0)?(e=c+20|0,g=f[e>>2]|0,g>>>0<(f[c+16>>2]|0)>>>0):0){f[e>>2]=g+1;b[g>>0]=j;break}d=Lb(c,a)|0;}while(0);return d|0}function Nb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;do if(!a){b=Ma(b)|0;if(c){if(!b)a=0;else a=uc(b)|0;f[c>>2]=a;}}else{if(!b){Ta(a);if(!c){b=0;break}f[c>>2]=0;b=0;break}if(d){b=Sb(a,b)|0;a=(b|0)==0?a:b;}else b=0;if(c){e=uc(a)|0;f[c>>2]=e;}}while(0);return b|0}function Ob(a){a=a|0;var c=0,d=0,e=0;e=a;a:do if(!(e&3))d=4;else{c=e;while(1){if(!(b[a>>0]|0)){a=c;break a}a=a+1|0;c=a;if(!(c&3)){d=4;break}}}while(0);if((d|0)==4){while(1){c=f[a>>2]|0;if(!((c&-2139062144^-2139062144)&c+-16843009))a=a+4|0;else break}if((c&255)<<24>>24)do a=a+1|0;while((b[a>>0]|0)!=0)}return a-e|0}function Pb(a,b){a=+a;b=b|0;var c=0,d=0,e=0;p[s>>3]=a;c=f[s>>2]|0;d=f[s+4>>2]|0;e=zc(c|0,d|0,52)|0;switch(e&2047){case 0:{if(a!=0.0){a=+Pb(a*18446744073709551616.0,b);c=(f[b>>2]|0)+-64|0;}else c=0;f[b>>2]=c;break}case 2047:break;default:{f[b>>2]=(e&2047)+-1022;f[s>>2]=c;f[s+4>>2]=d&-2146435073|1071644672;a=+p[s>>3];}}return +a}function Qb(a,c){a=a|0;c=c|0;var d=0,e=0;e=0;while(1){if((h[2140+e>>0]|0)==(a|0)){a=2;break}d=e+1|0;if((d|0)==87){d=2228;e=87;a=5;break}else e=d;}if((a|0)==2)if(!e)d=2228;else{d=2228;a=5;}if((a|0)==5)while(1){do{a=d;d=d+1|0;}while((b[a>>0]|0)!=0);e=e+-1|0;if(!e)break;else a=5;}return ed(d,f[c+20>>2]|0)|0}function Rb(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;if(c>>>0>0|(c|0)==0&a>>>0>4294967295){while(1){e=mc(a|0,c|0,10,0)|0;d=d+-1|0;b[d>>0]=e&255|48;e=a;a=Uc(a|0,c|0,10,0)|0;if(!(c>>>0>9|(c|0)==9&e>>>0>4294967295))break;else c=I;}c=a;}else c=a;if(c)while(1){d=d+-1|0;b[d>>0]=(c>>>0)%10|0|48;if(c>>>0<10)break;else c=(c>>>0)/10|0;}return d|0}function Sb(a,b){a=a|0;b=b|0;var c=0,d=0;if(!a){b=Ma(b)|0;return b|0}if(b>>>0>4294967231){b=jd()|0;f[b>>2]=12;b=0;return b|0}c=_a(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(c|0){b=c+8|0;return b|0}c=Ma(b)|0;if(!c){b=0;return b|0}d=f[a+-4>>2]|0;d=(d&-8)-((d&3|0)==0?8:4)|0;kb(c|0,a|0,(d>>>0<b>>>0?d:b)|0)|0;Ta(a);b=c;return b|0}function Tb(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;var g=0,h=0,i=0;a=c+16|0;g=f[a>>2]|0;h=c+36|0;i=c+24|0;do if(g){if((g|0)!=(d|0)){f[h>>2]=(f[h>>2]|0)+1;f[i>>2]=2;b[c+54>>0]=1;break}if((f[i>>2]|0)==2)f[i>>2]=e;}else{f[a>>2]=d;f[i>>2]=e;f[h>>2]=1;}while(0);return}function Ub(a){a=a|0;var c=0,d=0,e=0;e=f[119]|0;if((f[e+76>>2]|0)>-1);do if((Mc(a,e)|0)<0)a=1;else{if((b[e+75>>0]|0)!=10?(c=e+20|0,d=f[c>>2]|0,d>>>0<(f[e+16>>2]|0)>>>0):0){f[c>>2]=d+1;b[d>>0]=10;a=0;break}a=(Lb(e,10)|0)<0;}while(0);return a<<31>>31|0}function Vb(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;g=g|0;if(Sc(a,f[b+8>>2]|0)|0)Jb(0,b,c,d,e);else{a=f[a+8>>2]|0;Ka[f[(f[a>>2]|0)+20>>2]&3](a,b,c,d,e,g);}return}function Wb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=u;u=u+256|0;f=g;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;Ib(f|0,b|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;do{Nc(a,f,256);e=e+-256|0;}while(e>>>0>255);e=b&255;}Nc(a,f,e);}u=g;return}function Xb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(Sc(a,f[b+8>>2]|0)|0)Tb(0,b,c,d);else{a=f[a+8>>2]|0;La[f[(f[a>>2]|0)+28>>2]&3](a,b,c,d);}return}function Yb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,g=0;e=u;u=u+32|0;g=e;d=e+20|0;f[g>>2]=f[a+60>>2];f[g+4>>2]=0;f[g+8>>2]=b;f[g+12>>2]=d;f[g+16>>2]=c;if((Ic(xa(140,g|0)|0)|0)<0){f[d>>2]=-1;a=-1;}else a=f[d>>2]|0;u=e;return a|0}function Zb(a){a=a|0;var c=0,d=0;c=a+74|0;d=b[c>>0]|0;b[c>>0]=d+255|d;c=f[a>>2]|0;if(!(c&8)){f[a+8>>2]=0;f[a+4>>2]=0;d=f[a+44>>2]|0;f[a+28>>2]=d;f[a+20>>2]=d;f[a+16>>2]=d+(f[a+48>>2]|0);a=0;}else{f[a>>2]=c|32;a=-1;}return a|0}function _b(a,c){a=a|0;c=c|0;var d=0,e=0;d=b[a>>0]|0;e=b[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)a=e;else{do{a=a+1|0;c=c+1|0;d=b[a>>0]|0;e=b[c>>0]|0;}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));a=e;}return (d&255)-(a&255)|0}function $b(a,c,d){a=a|0;c=c|0;d=d|0;var e=0,g=0;g=u;u=u+32|0;e=g;f[a+36>>2]=1;if((f[a>>2]&64|0)==0?(f[e>>2]=f[a+60>>2],f[e+4>>2]=21523,f[e+8>>2]=g+16,na(54,e|0)|0):0)b[a+75>>0]=-1;e=mb(a,c,d)|0;u=g;return e|0}function ac(a){a=a|0;var b=0,c=0;c=a+15&-16|0;b=f[r>>2]|0;a=b+c|0;if((c|0)>0&(a|0)<(b|0)|(a|0)<0){da()|0;ra(12);return -1}f[r>>2]=a;if((a|0)>(ca()|0)?(ba()|0)==0:0){f[r>>2]=b;ra(12);return -1}return b|0}function bc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=X(c,b)|0;c=(b|0)==0?0:c;if((f[d+76>>2]|0)>-1){a=zb(a,e,d)|0;}else a=zb(a,e,d)|0;if((a|0)!=(e|0))c=(a>>>0)/(b>>>0)|0;return c|0}function cc(a,b,c,d,e,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if(Sc(a,f[b+8>>2]|0)|0)Jb(0,b,c,d,e);return}function dc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(Sc(a,f[b+8>>2]|0)|0)Tb(0,b,c,d);return}function ec(a){a=a|0;var c=0,d=0,e=0;d=f[a>>2]|0;e=(b[d>>0]|0)+-48|0;if(e>>>0<10){c=0;do{c=e+(c*10|0)|0;d=d+1|0;f[a>>2]=d;e=(b[d>>0]|0)+-48|0;}while(e>>>0<10)}else c=0;return c|0}function gc(a,c,d,e){a=a|0;c=c|0;d=d|0;e=e|0;if(!((a|0)==0&(c|0)==0))do{d=d+-1|0;b[d>>0]=h[2122+(a&15)>>0]|0|e;a=zc(a|0,c|0,4)|0;c=I;}while(!((a|0)==0&(c|0)==0));return d|0}function hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=u;u=u+16|0;d=e;f[d>>2]=f[c>>2];a=Ea[f[(f[a>>2]|0)+16>>2]&7](a,b,d)|0;if(a)f[c>>2]=f[d>>2];u=e;return a&1|0}function ic(a){a=a|0;var c=0;c=b[w+(a&255)>>0]|0;if((c|0)<8)return c|0;c=b[w+(a>>8&255)>>0]|0;if((c|0)<8)return c+8|0;c=b[w+(a>>16&255)>>0]|0;if((c|0)<8)return c+16|0;return (b[w+(a>>>24)>>0]|0)+24|0}function jc(a,b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((f[b+4>>2]|0)==(c|0)?(e=b+28|0,(f[e>>2]|0)!=1):0)f[e>>2]=d;return}function kc(a,c,d){a=a|0;c=c|0;d=d|0;if(!((a|0)==0&(c|0)==0))do{d=d+-1|0;b[d>>0]=a&7|48;a=zc(a|0,c|0,3)|0;c=I;}while(!((a|0)==0&(c|0)==0));return d|0}function lc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+20|0;e=f[d>>2]|0;a=(f[a+16>>2]|0)-e|0;a=a>>>0>c>>>0?c:a;kb(e|0,b|0,a|0)|0;f[d>>2]=(f[d>>2]|0)+a;return c|0}function mc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,g=0;g=u;u=u+16|0;e=g|0;Za(a,b,c,d,e)|0;u=g;return (I=f[e+4>>2]|0,f[e>>2]|0)|0}function nc(a,b){a=a|0;b=b|0;var c=0,d=0;d=u;u=u+48|0;c=d;f[c>>2]=40;tb(a,b,c)|0;u=d;return f[c+32>>2]|0}function oc(a,b){a=a|0;b=b|0;var c=0,d=0;d=u;u=u+48|0;c=d;f[c>>2]=40;tb(a,b,c)|0;u=d;return f[c+12>>2]|0}function pc(a,b){a=a|0;b=b|0;var c=0,d=0;d=u;u=u+48|0;c=d;f[c>>2]=40;tb(a,b,c)|0;u=d;return f[c+8>>2]|0}function qc(a,b){a=a|0;b=b|0;var c=0,d=0;d=u;u=u+48|0;c=d;f[c>>2]=40;tb(a,b,c)|0;u=d;return f[c+4>>2]|0}function rc(){var a=0,b=0;a=u;u=u+16|0;if(!(ua(5136,2)|0)){b=ma(f[1285]|0)|0;u=a;return b|0}else Ac(4307,a);return 0}function sc(a){a=a|0;var b=0,c=0;b=u;u=u+16|0;c=b;a=pd(f[a+60>>2]|0)|0;f[c>>2]=a;a=Ic(qa(6,c|0)|0)|0;u=b;return a|0}function tc(a){a=a|0;var b=0;b=u;u=u+16|0;Ta(a);if(!(oa(f[1285]|0,0)|0)){u=b;return}else Ac(4406,b);}function uc(a){a=a|0;var b=0;if(!a)return 0;else{b=f[a+-4>>2]|0;a=b&3;return ((a|0)==1?0:(b&-8)-((a|0)==0?8:4)|0)|0}}function vc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=u;u=u+16|0;e=d;f[e>>2]=c;c=Yc(a,b,e)|0;u=d;return c|0}function wc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Ka[a&3](b|0,c|0,d|0,e|0,f|0,g|0);}function xc(){var a=0;a=u;u=u+16|0;if(!(wa(5140,6)|0)){u=a;return}else Ac(4356,a);}function yc(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}I=a<<c-32;return 0}function zc(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}I=0;return b>>>c-32|0}function Ac(a,b){a=a|0;b=b|0;var c=0;c=u;u=u+16|0;f[c>>2]=b;b=f[26]|0;ob(b,a,c)|0;Mb(10,b)|0;sa();}function Bc(){}function Cc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (I=d,a-c>>>0|0)|0}function Dc(a,b){a=a|0;b=b|0;if(!b)b=0;else b=rb(f[b>>2]|0,f[b+4>>2]|0,a)|0;return (b|0?b:a)|0}function Ec(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Fa[a&3](b|0,c|0,d|0,e|0,f|0);}function Fc(a){a=+a;var b=0;p[s>>3]=a;b=f[s>>2]|0;I=f[s+4>>2]|0;return b|0}function Gc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (I=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function Hc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;La[a&3](b|0,c|0,d|0,e|0);}function Ic(a){a=a|0;var b=0;if(a>>>0>4294963200){b=jd()|0;f[b>>2]=0-a;a=-1;}return a|0}function Kc(a){a=a|0;if(!a)a=0;else a=(pb(a,32,88,0)|0)!=0;return a&1|0}function Lc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ea[a&7](b|0,c|0,d|0)|0}function Mc(a,b){a=a|0;b=b|0;var c=0;c=Ob(a)|0;return ((bc(a,1,c,b)|0)!=(c|0))<<31>>31|0}function Nc(a,b,c){a=a|0;b=b|0;c=c|0;if(!(f[a>>2]&32))zb(b,c,a)|0;return}function Oc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ia[a&0](b|0,c|0,d|0);}function Pc(a){a=a|0;var b=0;b=u;u=u+a|0;u=u+15&-16;return b|0}function Qc(a){a=a|0;var b=0;b=(ld()|0)+188|0;return Qb(a,f[b>>2]|0)|0}function Rc(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Ab(a,b,0)|0;return a|0}function Sc(a,b,c){a=a|0;b=b|0;return (a|0)==(b|0)|0}function Tc(a,b){a=a|0;b=b|0;var c=0;c=Vc(a|0)|0;return ((b|0)==0?a:c)|0}function Uc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Za(a,b,c,d,0)|0}function Vc(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Wc(a,b,c,d,e,f){$(6);}function Xc(a,b){}function Yc(a,b,c){a=a|0;b=b|0;c=c|0;return Fb(a,2147483647,b,c)|0}function Zc(a,b,c,d,e){$(1);}function _c(a){a=a|0;nd(a);return}function bd(a,b){a=a|0;b=b|0;return Ha[a&1](b|0)|0}function cd(a,b){a=a|0;b=b|0;u=a;v=b;}function dd(a,b,c,d){$(7);}function ed(a,b){a=a|0;b=b|0;return Dc(a,b)|0}function fd(a,b){a=a|0;b=b|0;Ga[a&7](b|0);}function gd(a,b,c){$(0);return 0}function hd(a,b){a=+a;b=b|0;return +(+Pb(a,b))}function id(a,b,c){$(4);}function jd(){return (ld()|0)+64|0}function kd(a){a=a|0;Ja[a&3]();}function ld(){return xd()|0}function md(a){a=a|0;u=a;}function nd(a){a=a|0;Ta(a);return}function od(a){a=a|0;I=a;}function pd(a){a=a|0;return a|0}function qd(){return 5072}function rd(a){$(3);return 0}function sd(a){return}function td(a){return 0}function ud(){return I|0}function vd(){return u|0}function wd(a){$(2);}function xd(){return 232}function yd(){$(5);}
-
-    // EMSCRIPTEN_END_FUNCS
-    var Ea=[gd,mb,Yb,$b,lc,Kb,gd,gd];var Fa=[Zc,Hb,nb,Zc];var Ga=[wd,sd,_c,sd,sd,_c,tc,wd];var Ha=[rd,sc];var Ia=[id];var Ja=[yd,Bb,xc,yd];var Ka=[Wc,cc,Vb,Wc];var La=[dd,dc,Xb,dd];return {stackSave:vd,_i64Subtract:Cc,_crn_get_bytes_per_block:ib,setThrew:Xc,dynCall_viii:Oc,_bitshift64Lshr:zc,_bitshift64Shl:yc,dynCall_viiii:Hc,setTempRet0:od,_crn_decompress:$a,_memset:Ib,_sbrk:ac,_memcpy:kb,stackAlloc:Pc,_crn_get_height:pc,dynCall_vi:fd,getTempRet0:ud,_crn_get_levels:oc,_crn_get_uncompressed_size:hb,_i64Add:Gc,dynCall_iiii:Lc,_emscripten_get_global_libc:qd,dynCall_ii:bd,___udivdi3:Uc,_llvm_bswap_i32:Vc,dynCall_viiiii:Ec,___cxa_can_catch:hc,_free:Ta,runPostSets:Bc,dynCall_viiiiii:wc,establishStackSpace:cd,___uremdi3:mc,___cxa_is_pointer_type:Kc,stackRestore:md,_malloc:Ma,_emscripten_replace_memory:Da,dynCall_v:kd,_crn_get_width:qc,_crn_get_dxt_format:nc}})
-
-
-    // EMSCRIPTEN_END_ASM
-    (Module.asmGlobalArg,Module.asmLibraryArg,buffer);var stackSave=Module["stackSave"]=asm["stackSave"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var _memset=Module["_memset"]=asm["_memset"];var setThrew=Module["setThrew"]=asm["setThrew"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var _crn_decompress=Module["_crn_decompress"]=asm["_crn_decompress"];var _crn_get_bytes_per_block=Module["_crn_get_bytes_per_block"]=asm["_crn_get_bytes_per_block"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var _crn_get_height=Module["_crn_get_height"]=asm["_crn_get_height"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _crn_get_levels=Module["_crn_get_levels"]=asm["_crn_get_levels"];var _crn_get_uncompressed_size=Module["_crn_get_uncompressed_size"]=asm["_crn_get_uncompressed_size"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=asm["_emscripten_get_global_libc"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var _free=Module["_free"]=asm["_free"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var _malloc=Module["_malloc"]=asm["_malloc"];var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=asm["_emscripten_replace_memory"];var _crn_get_width=Module["_crn_get_width"]=asm["_crn_get_width"];var _crn_get_dxt_format=Module["_crn_get_dxt_format"]=asm["_crn_get_dxt_format"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=Module["stackAlloc"];Runtime.stackSave=Module["stackSave"];Runtime.stackRestore=Module["stackRestore"];Runtime.establishStackSpace=Module["establishStackSpace"];Runtime.setTempRet0=Module["setTempRet0"];Runtime.getTempRet0=Module["getTempRet0"];Module["asm"]=asm;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status;}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller;};Module["callMain"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0);}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),"i8",ALLOC_NORMAL));pad();}argv.push(0);argv=allocate(argv,"i32",ALLOC_NORMAL);try{var ret=Module["_main"](argc,argv,0);exit(ret,true);}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack];}Module.printErr("exception thrown: "+toLog);Module["quit"](1,e);}}finally{}};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun();}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("");}),1);doRun();}),1);}else{doRun();}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]);else{ABORT=true;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status);}if(ENVIRONMENT_IS_NODE){process["exit"](status);}Module["quit"](status,new ExitStatus(status));}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(Module["onAbort"]){Module["onAbort"](what);}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what);}else{what="";}ABORT=true;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what);}));}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()();}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false;}Module["noExitRuntime"]=true;run();
-
-    var crunch = Module;
-
-    // Modified from texture-tester
-    // See:
-    //     https://github.com/toji/texture-tester/blob/master/js/webgl-texture-util.js
-    //     http://toji.github.io/texture-tester/
-
-    /**
-     * @license
-     *
-     * Copyright (c) 2014, Brandon Jones. All rights reserved.
-     *
-     * Redistribution and use in source and binary forms, with or without modification,
-     * are permitted provided that the following conditions are met:
-     *
-     *  * Redistributions of source code must retain the above copyright notice, this
-     *  list of conditions and the following disclaimer.
-     *  * Redistributions in binary form must reproduce the above copyright notice,
-     *  this list of conditions and the following disclaimer in the documentation
-     *  and/or other materials provided with the distribution.
-     *
-     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-     * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-     * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-     * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-     */
-
-    // Taken from crnlib.h
-    var CRN_FORMAT = {
-        cCRNFmtInvalid: -1,
-
-        cCRNFmtDXT1: 0,
-        // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS.
-        cCRNFmtDXT3: 1,
-        cCRNFmtDXT5: 2
-
-        // Crunch supports more formats than this, but we can't use them here.
-    };
-
-    // Mapping of Crunch formats to DXT formats.
-    var DXT_FORMAT_MAP = {};
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.PixelFormat.RGB_DXT1;
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.PixelFormat.RGBA_DXT3;
-    DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.PixelFormat.RGBA_DXT5;
-
-    var dst;
-    var dxtData;
-    var cachedDstSize = 0;
-
-    // Copy an array of bytes into or out of the emscripten heap.
-    function arrayBufferCopy(src, dst, dstByteOffset, numBytes) {
-        var i;
-        var dst32Offset = dstByteOffset / 4;
-        var tail = (numBytes % 4);
-        var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4);
-        var dst32 = new Uint32Array(dst.buffer);
-        for (i = 0; i < src32.length; i++) {
-            dst32[dst32Offset + i] = src32[i];
-        }
-        for (i = numBytes - tail; i < numBytes; i++) {
-            dst[dstByteOffset + i] = src[i];
-        }
-    }
-
-    /**
-     * @private
-     */
-    function transcodeCRNToDXT(arrayBuffer, transferableObjects) {
-        // Copy the contents of the arrayBuffer into emscriptens heap.
-        var srcSize = arrayBuffer.byteLength;
-        var bytes = new Uint8Array(arrayBuffer);
-        var src = crunch._malloc(srcSize);
-        arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize);
-
-        // Determine what type of compressed data the file contains.
-        var crnFormat = crunch._crn_get_dxt_format(src, srcSize);
-        var format = DXT_FORMAT_MAP[crnFormat];
-        if (!when.defined(format)) {
-            throw new RuntimeError.RuntimeError('Unsupported compressed format.');
-        }
-
-        // Gather basic metrics about the DXT data.
-        var levels = crunch._crn_get_levels(src, srcSize);
-        var width = crunch._crn_get_width(src, srcSize);
-        var height = crunch._crn_get_height(src, srcSize);
-
-        // Determine the size of the decoded DXT data.
-        var dstSize = 0;
-        var i;
-        for (i = 0; i < levels; ++i) {
-            dstSize += PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width >> i, height >> i);
-        }
-
-        // Allocate enough space on the emscripten heap to hold the decoded DXT data
-        // or reuse the existing allocation if a previous call to this function has
-        // already acquired a large enough buffer.
-        if(cachedDstSize < dstSize) {
-            if(when.defined(dst)) {
-                crunch._free(dst);
-            }
-            dst = crunch._malloc(dstSize);
-            dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize);
-            cachedDstSize = dstSize;
-        }
-
-        // Decompress the DXT data from the Crunch file into the allocated space.
-        crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels);
-
-        // Release the crunch file data from the emscripten heap.
-        crunch._free(src);
-
-        // Mipmaps are unsupported, so copy the level 0 texture
-        // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap.
-        var length = PixelFormat.PixelFormat.compressedTextureSizeInBytes(format, width, height);
-
-        // Get a copy of the 0th mip level. dxtData will exceed length when there are more mip levels.
-        // Equivalent to dxtData.slice(0, length), which is not supported in IE11
-        var level0DXTDataView = dxtData.subarray(0, length);
-        var level0DXTData = new Uint8Array(length);
-        level0DXTData.set(level0DXTDataView, 0);
-
-        transferableObjects.push(level0DXTData.buffer);
-        return new PixelFormat.CompressedTextureBuffer(format, width, height, level0DXTData);
-    }
-
-    var transcodeCRNToDXTprevious = createTaskProcessorWorker(transcodeCRNToDXT);
-
-    return transcodeCRNToDXTprevious;
-
-});
diff --git a/public/libs/Cesium/Workers/transferTypedArrayTest.js b/public/libs/Cesium/Workers/transferTypedArrayTest.js
deleted file mode 100644
index 88f0cbb..0000000
--- a/public/libs/Cesium/Workers/transferTypedArrayTest.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-"undefined"==typeof self&&(self={}),self.onmessage=function(e){"use strict";var s=e.data.array,a=self.webkitPostMessage||self.postMessage;try{a({array:s},[s.buffer])}catch(e){a({})}};
\ No newline at end of file
diff --git a/public/libs/Cesium/Workers/unzip-b0fc9445.js b/public/libs/Cesium/Workers/unzip-b0fc9445.js
deleted file mode 100644
index ad63e22..0000000
--- a/public/libs/Cesium/Workers/unzip-b0fc9445.js
+++ /dev/null
@@ -1,1718 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports'], function (exports) { 'use strict';
-
-	// Copyright 2010 The Emscripten Authors.  All rights reserved.
-	// Emscripten is available under two separate licenses, the MIT license and the
-	// University of Illinois/NCSA Open Source License.  Both these licenses can be
-	// found in the LICENSE file.
-
-	// The Module object: Our interface to the outside world. We import
-	// and export values on it. There are various ways Module can be used:
-	// 1. Not defined. We create it here
-	// 2. A function parameter, function(Module) { ..generated code.. }
-	// 3. pre-run appended it, var Module = {}; ..generated code..
-	// 4. External script tag defines var Module.
-	// We need to check if Module already exists (e.g. case 3 above).
-	// Substitution will be replaced with actual code on later stage of the build,
-	// this way Closure Compiler will not mangle it (e.g. case 4. above).
-	// Note that if you want to run closure, and also to use Module
-	// after the generated code, you will need to define   var Module = {};
-	// before the code. Then that object will be used in the code, and you
-	// can continue to use Module afterwards as well.
-	if (typeof WebAssembly !== 'undefined') {
-		var Module = typeof Module !== 'undefined' ? Module : {};
-
-		// --pre-jses are emitted after the Module integration code, so that they can
-		// refer to Module (if they choose; they can also define Module)
-		// {{PRE_JSES}}
-
-		// Sometimes an existing Module object exists with properties
-		// meant to overwrite the default module functionality. Here
-		// we collect those properties and reapply _after_ we configure
-		// the current environment's defaults to avoid having to be so
-		// defensive during initialization.
-		var moduleOverrides = {};
-		var key;
-		for (key in Module) {
-		  if (Module.hasOwnProperty(key)) {
-			moduleOverrides[key] = Module[key];
-		  }
-		}
-
-		Module['arguments'] = [];
-		Module['thisProgram'] = './this.program';
-		Module['quit'] = function(status, toThrow) {
-		  throw toThrow;
-		};
-		Module['preRun'] = [];
-		Module['postRun'] = [];
-
-		// Determine the runtime environment we are in. You can customize this by
-		// setting the ENVIRONMENT setting at compile time (see settings.js).
-
-		var ENVIRONMENT_IS_WEB = false;
-		var ENVIRONMENT_IS_WORKER = false;
-		var ENVIRONMENT_IS_NODE = false;
-		var ENVIRONMENT_HAS_NODE = false;
-		var ENVIRONMENT_IS_SHELL = false;
-		ENVIRONMENT_IS_WEB = typeof window === 'object';
-		ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
-		// A web environment like Electron.js can have Node enabled, so we must
-		// distinguish between Node-enabled environments and Node environments per se.
-		// This will allow the former to do things like mount NODEFS.
-		ENVIRONMENT_HAS_NODE = typeof process === 'object' && typeof require === 'function';
-		ENVIRONMENT_IS_NODE = ENVIRONMENT_HAS_NODE && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;
-		ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
-
-		if (Module['ENVIRONMENT']) {
-		  throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)');
-		}
-
-
-		// Three configurations we can be running in:
-		// 1) We could be the application main() thread running in the main JS UI thread. (ENVIRONMENT_IS_WORKER == false and ENVIRONMENT_IS_PTHREAD == false)
-		// 2) We could be the application main() thread proxied to worker. (with Emscripten -s PROXY_TO_WORKER=1) (ENVIRONMENT_IS_WORKER == true, ENVIRONMENT_IS_PTHREAD == false)
-		// 3) We could be an application pthread running in a worker. (ENVIRONMENT_IS_WORKER == true and ENVIRONMENT_IS_PTHREAD == true)
-
-
-
-
-		// `/` should be present at the end if `scriptDirectory` is not empty
-		var scriptDirectory = '';
-		function locateFile(path) {
-		  if (Module['locateFile']) {
-			return Module['locateFile'](path, scriptDirectory);
-		  } else {
-			return scriptDirectory + path;
-		  }
-		}
-
-		if (ENVIRONMENT_IS_NODE) {
-		  scriptDirectory = __dirname + '/';
-
-		  // Expose functionality in the same simple way that the shells work
-		  // Note that we pollute the global namespace here, otherwise we break in node
-		  var nodeFS;
-		  var nodePath;
-
-		  Module['read'] = function shell_read(filename, binary) {
-			var ret;
-			  if (!nodeFS) nodeFS = require('fs');
-			  if (!nodePath) nodePath = require('path');
-			  filename = nodePath['normalize'](filename);
-			  ret = nodeFS['readFileSync'](filename);
-			return binary ? ret : ret.toString();
-		  };
-
-		  Module['readBinary'] = function readBinary(filename) {
-			var ret = Module['read'](filename, true);
-			if (!ret.buffer) {
-			  ret = new Uint8Array(ret);
-			}
-			assert(ret.buffer);
-			return ret;
-		  };
-
-		  if (process['argv'].length > 1) {
-			Module['thisProgram'] = process['argv'][1].replace(/\\/g, '/');
-		  }
-
-		  Module['arguments'] = process['argv'].slice(2);
-
-		  if (typeof module !== 'undefined') {
-			module['exports'] = Module;
-		  }
-
-		  process['on']('uncaughtException', function(ex) {
-			// suppress ExitStatus exceptions from showing an error
-			if (!(ex instanceof ExitStatus)) {
-			  throw ex;
-			}
-		  });
-		  // Currently node will swallow unhandled rejections, but this behavior is
-		  // deprecated, and in the future it will exit with error status.
-		  process['on']('unhandledRejection', abort);
-
-		  Module['quit'] = function(status) {
-			process['exit'](status);
-		  };
-
-		  Module['inspect'] = function () { return '[Emscripten Module object]'; };
-		} else
-		if (ENVIRONMENT_IS_SHELL) {
-
-
-		  if (typeof read != 'undefined') {
-			Module['read'] = function shell_read(f) {
-			  return read(f);
-			};
-		  }
-
-		  Module['readBinary'] = function readBinary(f) {
-			var data;
-			if (typeof readbuffer === 'function') {
-			  return new Uint8Array(readbuffer(f));
-			}
-			data = read(f, 'binary');
-			assert(typeof data === 'object');
-			return data;
-		  };
-
-		  if (typeof scriptArgs != 'undefined') {
-			Module['arguments'] = scriptArgs;
-		  } else if (typeof arguments != 'undefined') {
-			Module['arguments'] = arguments;
-		  }
-
-		  if (typeof quit === 'function') {
-			Module['quit'] = function(status) {
-			  quit(status);
-			};
-		  }
-		} else
-		if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
-		  if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled
-			scriptDirectory = self.location.href;
-		  } else if (document.currentScript) { // web
-			scriptDirectory = document.currentScript.src;
-		  }
-		  // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.
-		  // otherwise, slice off the final part of the url to find the script directory.
-		  // if scriptDirectory does not contain a slash, lastIndexOf will return -1,
-		  // and scriptDirectory will correctly be replaced with an empty string.
-		  if (scriptDirectory.indexOf('blob:') !== 0) {
-			scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1);
-		  } else {
-			scriptDirectory = '';
-		  }
-
-
-		  Module['read'] = function shell_read(url) {
-			  var xhr = new XMLHttpRequest();
-			  xhr.open('GET', url, false);
-			  xhr.send(null);
-			  return xhr.responseText;
-		  };
-
-		  if (ENVIRONMENT_IS_WORKER) {
-			Module['readBinary'] = function readBinary(url) {
-				var xhr = new XMLHttpRequest();
-				xhr.open('GET', url, false);
-				xhr.responseType = 'arraybuffer';
-				xhr.send(null);
-				return new Uint8Array(xhr.response);
-			};
-		  }
-
-		  Module['readAsync'] = function readAsync(url, onload, onerror) {
-			var xhr = new XMLHttpRequest();
-			xhr.open('GET', url, true);
-			xhr.responseType = 'arraybuffer';
-			xhr.onload = function xhr_onload() {
-			  if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
-				onload(xhr.response);
-				return;
-			  }
-			  onerror();
-			};
-			xhr.onerror = onerror;
-			xhr.send(null);
-		  };
-
-		  Module['setWindowTitle'] = function(title) { document.title = title; };
-		} else
-		{
-		  throw new Error('environment detection error');
-		}
-
-		// Set up the out() and err() hooks, which are how we can print to stdout or
-		// stderr, respectively.
-		// If the user provided Module.print or printErr, use that. Otherwise,
-		// console.log is checked first, as 'print' on the web will open a print dialogue
-		// printErr is preferable to console.warn (works better in shells)
-		// bind(console) is necessary to fix IE/Edge closed dev tools panel behavior.
-		var out = Module['print'] || (typeof console !== 'undefined' ? console.log.bind(console) : (typeof print !== 'undefined' ? print : null));
-		var err = Module['printErr'] || (typeof printErr !== 'undefined' ? printErr : ((typeof console !== 'undefined' && console.warn.bind(console)) || out));
-
-		// Merge back in the overrides
-		for (key in moduleOverrides) {
-		  if (moduleOverrides.hasOwnProperty(key)) {
-			Module[key] = moduleOverrides[key];
-		  }
-		}
-		// Free the object hierarchy contained in the overrides, this lets the GC
-		// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.
-		moduleOverrides = undefined;
-
-		// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
-		assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead');
-		assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead');
-		assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead');
-		assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead');
-
-		// stack management, and other functionality that is provided by the compiled code,
-		// should not be used before it is ready
-		stackSave = stackRestore = stackAlloc = function() {
-		  abort('cannot use the stack before compiled code is ready to run, and has provided stack access');
-		};
-
-		function warnOnce(text) {
-		  if (!warnOnce.shown) warnOnce.shown = {};
-		  if (!warnOnce.shown[text]) {
-			warnOnce.shown[text] = 1;
-			//err(text);
-		  }
-		}
-
-		var asm2wasmImports = { // special asm2wasm imports
-			"f64-rem": function(x, y) {
-				return x % y;
-			},
-			"debugger": function() {
-				debugger;
-			}
-		};
-		var functionPointers = new Array(0);
-
-		var tempRet0 = 0;
-
-		var setTempRet0 = function(value) {
-		  tempRet0 = value;
-		};
-
-		var getTempRet0 = function() {
-		  return tempRet0;
-		};
-
-
-
-
-		// === Preamble library stuff ===
-
-		// Documentation for the public APIs defined in this file must be updated in:
-		//    site/source/docs/api_reference/preamble.js.rst
-		// A prebuilt local version of the documentation is available at:
-		//    site/build/text/docs/api_reference/preamble.js.txt
-		// You can also build docs locally as HTML or other formats in site/
-		// An online HTML version (which may be of a different version of Emscripten)
-		//    is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
-
-
-
-		if (typeof WebAssembly !== 'object') {
-		  abort('No WebAssembly support found. Build with -s WASM=0 to target JavaScript instead.');
-		}
-
-		/** @type {function(number, string, boolean=)} */
-		function getValue(ptr, type, noSafe) {
-		  type = type || 'i8';
-		  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
-			switch(type) {
-			  case 'i1': return HEAP8[((ptr)>>0)];
-			  case 'i8': return HEAP8[((ptr)>>0)];
-			  case 'i16': return HEAP16[((ptr)>>1)];
-			  case 'i32': return HEAP32[((ptr)>>2)];
-			  case 'i64': return HEAP32[((ptr)>>2)];
-			  case 'float': return HEAPF32[((ptr)>>2)];
-			  case 'double': return HEAPF64[((ptr)>>3)];
-			  default: abort('invalid type for getValue: ' + type);
-			}
-		  return null;
-		}
-
-
-
-
-
-		// Wasm globals
-
-		var wasmMemory;
-
-		// Potentially used for direct table calls.
-		var wasmTable;
-
-
-		//========================================
-		// Runtime essentials
-		//========================================
-
-		// whether we are quitting the application. no code should run after this.
-		// set in exit() and abort()
-		var ABORT = false;
-
-		/** @type {function(*, string=)} */
-		function assert(condition, text) {
-		  if (!condition) {
-			abort('Assertion failed: ' + text);
-		  }
-		}
-
-		// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
-		function getCFunc(ident) {
-		  var func = Module['_' + ident]; // closure exported function
-		  assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported');
-		  return func;
-		}
-
-		// C calling interface.
-		function ccall(ident, returnType, argTypes, args, opts) {
-		  // For fast lookup of conversion functions
-		  var toC = {
-			'string': function(str) {
-			  var ret = 0;
-			  if (str !== null && str !== undefined && str !== 0) { // null string
-				// at most 4 bytes per UTF-8 code point, +1 for the trailing '\0'
-				var len = (str.length << 2) + 1;
-				ret = stackAlloc(len);
-				stringToUTF8(str, ret, len);
-			  }
-			  return ret;
-			},
-			'array': function(arr) {
-			  var ret = stackAlloc(arr.length);
-			  writeArrayToMemory(arr, ret);
-			  return ret;
-			}
-		  };
-
-		  function convertReturnValue(ret) {
-			if (returnType === 'string') return UTF8ToString(ret);
-			if (returnType === 'boolean') return Boolean(ret);
-			return ret;
-		  }
-
-		  var func = getCFunc(ident);
-		  var cArgs = [];
-		  var stack = 0;
-		  assert(returnType !== 'array', 'Return type should not be "array".');
-		  if (args) {
-			for (var i = 0; i < args.length; i++) {
-			  var converter = toC[argTypes[i]];
-			  if (converter) {
-				if (stack === 0) stack = stackSave();
-				cArgs[i] = converter(args[i]);
-			  } else {
-				cArgs[i] = args[i];
-			  }
-			}
-		  }
-		  var ret = func.apply(null, cArgs);
-		  ret = convertReturnValue(ret);
-		  if (stack !== 0) stackRestore(stack);
-		  return ret;
-		}
-
-		function cwrap(ident, returnType, argTypes, opts) {
-		  return function() {
-			return ccall(ident, returnType, argTypes, arguments);
-		  }
-		}
-
-
-		// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns
-		// a copy of that string as a Javascript String object.
-
-		var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined;
-
-		/**
-		 * @param {number} idx
-		 * @param {number=} maxBytesToRead
-		 * @return {string}
-		 */
-		function UTF8ArrayToString(u8Array, idx, maxBytesToRead) {
-		  var endIdx = idx + maxBytesToRead;
-		  var endPtr = idx;
-		  // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
-		  // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
-		  // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity)
-		  while (u8Array[endPtr] && !(endPtr >= endIdx)) ++endPtr;
-
-		  if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
-			return UTF8Decoder.decode(u8Array.subarray(idx, endPtr));
-		  } else {
-			var str = '';
-			// If building with TextDecoder, we have already computed the string length above, so test loop end condition against that
-			while (idx < endPtr) {
-			  // For UTF8 byte structure, see:
-			  // http://en.wikipedia.org/wiki/UTF-8#Description
-			  // https://www.ietf.org/rfc/rfc2279.txt
-			  // https://tools.ietf.org/html/rfc3629
-			  var u0 = u8Array[idx++];
-			  if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }
-			  var u1 = u8Array[idx++] & 63;
-			  if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }
-			  var u2 = u8Array[idx++] & 63;
-			  if ((u0 & 0xF0) == 0xE0) {
-				u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
-			  } else {
-				if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!');
-				u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (u8Array[idx++] & 63);
-			  }
-
-			  if (u0 < 0x10000) {
-				str += String.fromCharCode(u0);
-			  } else {
-				var ch = u0 - 0x10000;
-				str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
-			  }
-			}
-		  }
-		  return str;
-		}
-
-		// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a
-		// copy of that string as a Javascript String object.
-		// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit
-		//                 this parameter to scan the string until the first \0 byte. If maxBytesToRead is
-		//                 passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the
-		//                 middle, then the string will cut short at that byte index (i.e. maxBytesToRead will
-		//                 not produce a string of exact length [ptr, ptr+maxBytesToRead[)
-		//                 N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may
-		//                 throw JS JIT optimizations off, so it is worth to consider consistently using one
-		//                 style or the other.
-		/**
-		 * @param {number} ptr
-		 * @param {number=} maxBytesToRead
-		 * @return {string}
-		 */
-		function UTF8ToString(ptr, maxBytesToRead) {
-		  return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';
-		}
-
-		// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx',
-		// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP.
-		// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
-		// Parameters:
-		//   str: the Javascript string to copy.
-		//   outU8Array: the array to copy to. Each index in this array is assumed to be one 8-byte element.
-		//   outIdx: The starting offset in the array to begin the copying.
-		//   maxBytesToWrite: The maximum number of bytes this function can write to the array.
-		//                    This count should include the null terminator,
-		//                    i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else.
-		//                    maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator.
-		// Returns the number of bytes written, EXCLUDING the null terminator.
-
-		function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
-		  if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes.
-			return 0;
-
-		  var startIdx = outIdx;
-		  var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
-		  for (var i = 0; i < str.length; ++i) {
-			// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
-			// See http://unicode.org/faq/utf_bom.html#utf16-3
-			// For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629
-			var u = str.charCodeAt(i); // possibly a lead surrogate
-			if (u >= 0xD800 && u <= 0xDFFF) {
-			  var u1 = str.charCodeAt(++i);
-			  u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);
-			}
-			if (u <= 0x7F) {
-			  if (outIdx >= endIdx) break;
-			  outU8Array[outIdx++] = u;
-			} else if (u <= 0x7FF) {
-			  if (outIdx + 1 >= endIdx) break;
-			  outU8Array[outIdx++] = 0xC0 | (u >> 6);
-			  outU8Array[outIdx++] = 0x80 | (u & 63);
-			} else if (u <= 0xFFFF) {
-			  if (outIdx + 2 >= endIdx) break;
-			  outU8Array[outIdx++] = 0xE0 | (u >> 12);
-			  outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
-			  outU8Array[outIdx++] = 0x80 | (u & 63);
-			} else {
-			  if (outIdx + 3 >= endIdx) break;
-			  if (u >= 0x200000) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).');
-			  outU8Array[outIdx++] = 0xF0 | (u >> 18);
-			  outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63);
-			  outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
-			  outU8Array[outIdx++] = 0x80 | (u & 63);
-			}
-		  }
-		  // Null-terminate the pointer to the buffer.
-		  outU8Array[outIdx] = 0;
-		  return outIdx - startIdx;
-		}
-
-		// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
-		// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP.
-		// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
-		// Returns the number of bytes written, EXCLUDING the null terminator.
-
-		function stringToUTF8(str, outPtr, maxBytesToWrite) {
-		  assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
-		  return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite);
-		}
-
-
-		// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
-		// a copy of that string as a Javascript String object.
-
-		var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined;
-
-		function writeArrayToMemory(array, buffer) {
-		  assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)');
-		  HEAP8.set(array, buffer);
-		}
-
-
-
-
-
-		function demangle(func) {
-		  return func;
-		}
-
-		function demangleAll(text) {
-		  var regex =
-			/__Z[\w\d_]+/g;
-		  return text.replace(regex,
-			function(x) {
-			  var y = demangle(x);
-			  return x === y ? x : (y + ' [' + x + ']');
-			});
-		}
-
-		function jsStackTrace() {
-		  var err = new Error();
-		  if (!err.stack) {
-			// IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown,
-			// so try that as a special-case.
-			try {
-			  throw new Error(0);
-			} catch(e) {
-			  err = e;
-			}
-			if (!err.stack) {
-			  return '(no stack trace available)';
-			}
-		  }
-		  return err.stack.toString();
-		}
-
-		function stackTrace() {
-		  var js = jsStackTrace();
-		  if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace']();
-		  return demangleAll(js);
-		}
-		var WASM_PAGE_SIZE = 65536;
-
-		function alignUp(x, multiple) {
-		  if (x % multiple > 0) {
-			x += multiple - (x % multiple);
-		  }
-		  return x;
-		}
-
-		var /** @type {ArrayBuffer} */
-		  buffer,
-		/** @type {Int8Array} */
-		  HEAP8,
-		/** @type {Uint8Array} */
-		  HEAPU8,
-		/** @type {Int16Array} */
-		  HEAP16,
-		/** @type {Uint16Array} */
-		  HEAPU16,
-		/** @type {Int32Array} */
-		  HEAP32,
-		/** @type {Uint32Array} */
-		  HEAPU32,
-		/** @type {Float32Array} */
-		  HEAPF32,
-		/** @type {Float64Array} */
-		  HEAPF64;
-
-		function updateGlobalBufferViews() {
-		  Module['HEAP8'] = HEAP8 = new Int8Array(buffer);
-		  Module['HEAP16'] = HEAP16 = new Int16Array(buffer);
-		  Module['HEAP32'] = HEAP32 = new Int32Array(buffer);
-		  Module['HEAPU8'] = HEAPU8 = new Uint8Array(buffer);
-		  Module['HEAPU16'] = HEAPU16 = new Uint16Array(buffer);
-		  Module['HEAPU32'] = HEAPU32 = new Uint32Array(buffer);
-		  Module['HEAPF32'] = HEAPF32 = new Float32Array(buffer);
-		  Module['HEAPF64'] = HEAPF64 = new Float64Array(buffer);
-		}
-
-
-		var STACK_BASE = 15104,
-			STACK_MAX = 5257984,
-			DYNAMIC_BASE = 5257984,
-			DYNAMICTOP_PTR = 15072;
-
-		assert(STACK_BASE % 16 === 0, 'stack must start aligned');
-		assert(DYNAMIC_BASE % 16 === 0, 'heap must start aligned');
-
-
-
-		var TOTAL_STACK = 5242880;
-		if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime');
-
-		var INITIAL_TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;
-		if (INITIAL_TOTAL_MEMORY < TOTAL_STACK) err('TOTAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_TOTAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')');
-
-		// Initialize the runtime's memory
-		// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
-		assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined,
-			   'JS engine does not provide full typed array support');
-
-
-
-
-
-
-
-		// Use a provided buffer, if there is one, or else allocate a new one
-		if (Module['buffer']) {
-		  buffer = Module['buffer'];
-		  assert(buffer.byteLength === INITIAL_TOTAL_MEMORY, 'provided buffer should be ' + INITIAL_TOTAL_MEMORY + ' bytes, but it is ' + buffer.byteLength);
-		} else {
-		  // Use a WebAssembly memory where available
-		  if (typeof WebAssembly === 'object' && typeof WebAssembly.Memory === 'function') {
-			assert(INITIAL_TOTAL_MEMORY % WASM_PAGE_SIZE === 0);
-			wasmMemory = new WebAssembly.Memory({ 'initial': INITIAL_TOTAL_MEMORY / WASM_PAGE_SIZE });
-			buffer = wasmMemory.buffer;
-		  } else
-		  {
-			buffer = new ArrayBuffer(INITIAL_TOTAL_MEMORY);
-		  }
-		  assert(buffer.byteLength === INITIAL_TOTAL_MEMORY);
-		}
-		updateGlobalBufferViews();
-
-
-		HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE;
-
-
-		// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
-		function writeStackCookie() {
-		  assert((STACK_MAX & 3) == 0);
-		  HEAPU32[(STACK_MAX >> 2)-1] = 0x02135467;
-		  HEAPU32[(STACK_MAX >> 2)-2] = 0x89BACDFE;
-		}
-
-		function checkStackCookie() {
-		  if (HEAPU32[(STACK_MAX >> 2)-1] != 0x02135467 || HEAPU32[(STACK_MAX >> 2)-2] != 0x89BACDFE) {
-			abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x02135467, but received 0x' + HEAPU32[(STACK_MAX >> 2)-2].toString(16) + ' ' + HEAPU32[(STACK_MAX >> 2)-1].toString(16));
-		  }
-		  // Also test the global address 0 for integrity.
-		  if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!');
-		}
-
-		function abortStackOverflow(allocSize) {
-		  abort('Stack overflow! Attempted to allocate ' + allocSize + ' bytes on the stack, but stack has only ' + (STACK_MAX - stackSave() + allocSize) + ' bytes available!');
-		}
-
-
-		  HEAP32[0] = 0x63736d65; /* 'emsc' */
-
-
-
-		// Endianness check (note: assumes compiler arch was little-endian)
-		HEAP16[1] = 0x6373;
-		if (HEAPU8[2] !== 0x73 || HEAPU8[3] !== 0x63) throw 'Runtime error: expected the system to be little-endian!';
-
-		function callRuntimeCallbacks(callbacks) {
-		  while(callbacks.length > 0) {
-			var callback = callbacks.shift();
-			if (typeof callback == 'function') {
-			  callback();
-			  continue;
-			}
-			var func = callback.func;
-			if (typeof func === 'number') {
-			  if (callback.arg === undefined) {
-				Module['dynCall_v'](func);
-			  } else {
-				Module['dynCall_vi'](func, callback.arg);
-			  }
-			} else {
-			  func(callback.arg === undefined ? null : callback.arg);
-			}
-		  }
-		}
-
-		var __ATPRERUN__  = []; // functions called before the runtime is initialized
-		var __ATINIT__    = []; // functions called during startup
-		var __ATMAIN__    = []; // functions called when main() is to be run
-		var __ATPOSTRUN__ = []; // functions called after the main() is called
-
-		var runtimeInitialized = false;
-		var runtimeExited = false;
-
-
-		function preRun() {
-		  // compatibility - merge in anything from Module['preRun'] at this time
-		  if (Module['preRun']) {
-			if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
-			while (Module['preRun'].length) {
-			  addOnPreRun(Module['preRun'].shift());
-			}
-		  }
-		  callRuntimeCallbacks(__ATPRERUN__);
-		}
-
-		function ensureInitRuntime() {
-		  checkStackCookie();
-		  if (runtimeInitialized) return;
-		  runtimeInitialized = true;
-		  
-		  callRuntimeCallbacks(__ATINIT__);
-		}
-
-		function preMain() {
-		  checkStackCookie();
-		  
-		  callRuntimeCallbacks(__ATMAIN__);
-		}
-
-		function postRun() {
-		  checkStackCookie();
-		  // compatibility - merge in anything from Module['postRun'] at this time
-		  if (Module['postRun']) {
-			if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
-			while (Module['postRun'].length) {
-			  addOnPostRun(Module['postRun'].shift());
-			}
-		  }
-		  callRuntimeCallbacks(__ATPOSTRUN__);
-		}
-
-		function addOnPreRun(cb) {
-		  __ATPRERUN__.unshift(cb);
-		}
-
-		function addOnPostRun(cb) {
-		  __ATPOSTRUN__.unshift(cb);
-		}
-
-
-		assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
-		assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
-		assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
-		assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
-
-
-
-		// A counter of dependencies for calling run(). If we need to
-		// do asynchronous work before running, increment this and
-		// decrement it. Incrementing must happen in a place like
-		// Module.preRun (used by emcc to add file preloading).
-		// Note that you can add dependencies in preRun, even though
-		// it happens right before run - run will be postponed until
-		// the dependencies are met.
-		var runDependencies = 0;
-		var runDependencyWatcher = null;
-		var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
-		var runDependencyTracking = {};
-
-		function addRunDependency(id) {
-		  runDependencies++;
-		  if (Module['monitorRunDependencies']) {
-			Module['monitorRunDependencies'](runDependencies);
-		  }
-		  if (id) {
-			assert(!runDependencyTracking[id]);
-			runDependencyTracking[id] = 1;
-			if (runDependencyWatcher === null && typeof setInterval !== 'undefined') {
-			  // Check for missing dependencies every few seconds
-			  runDependencyWatcher = setInterval(function() {
-				if (ABORT) {
-				  clearInterval(runDependencyWatcher);
-				  runDependencyWatcher = null;
-				  return;
-				}
-			  }, 10000);
-			}
-		  }
-		}
-
-		function removeRunDependency(id) {
-		  runDependencies--;
-		  if (Module['monitorRunDependencies']) {
-			Module['monitorRunDependencies'](runDependencies);
-		  }
-		  if (id) {
-			assert(runDependencyTracking[id]);
-			delete runDependencyTracking[id];
-		  } else {
-			err('warning: run dependency removed without ID');
-		  }
-		  if (runDependencies == 0) {
-			if (runDependencyWatcher !== null) {
-			  clearInterval(runDependencyWatcher);
-			  runDependencyWatcher = null;
-			}
-			if (dependenciesFulfilled) {
-			  var callback = dependenciesFulfilled;
-			  dependenciesFulfilled = null;
-			  callback(); // can add another dependenciesFulfilled
-			}
-		  }
-		}
-
-		Module["preloadedImages"] = {}; // maps url to image data
-		Module["preloadedAudios"] = {}; // maps url to audio data
-
-
-
-		// show errors on likely calls to FS when it was not included
-		var FS = {
-		  error: function() {
-			abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with  -s FORCE_FILESYSTEM=1');
-		  },
-		  init: function() { FS.error(); },
-		  createDataFile: function() { FS.error(); },
-		  createPreloadedFile: function() { FS.error(); },
-		  createLazyFile: function() { FS.error(); },
-		  open: function() { FS.error(); },
-		  mkdev: function() { FS.error(); },
-		  registerDevice: function() { FS.error(); },
-		  analyzePath: function() { FS.error(); },
-		  loadFilesFromDB: function() { FS.error(); },
-
-		  ErrnoError: function ErrnoError() { FS.error(); },
-		};
-		Module['FS_createDataFile'] = FS.createDataFile;
-		Module['FS_createPreloadedFile'] = FS.createPreloadedFile;
-
-
-
-		// Copyright 2017 The Emscripten Authors.  All rights reserved.
-		// Emscripten is available under two separate licenses, the MIT license and the
-		// University of Illinois/NCSA Open Source License.  Both these licenses can be
-		// found in the LICENSE file.
-
-		// Prefix of data URIs emitted by SINGLE_FILE and related options.
-		var dataURIPrefix = 'data:application/octet-stream;base64,';
-
-		// Indicates whether filename is a base64 data URI.
-		function isDataURI(filename) {
-		  return String.prototype.startsWith ?
-			  filename.startsWith(dataURIPrefix) :
-			  filename.indexOf(dataURIPrefix) === 0;
-		}
-
-
-
-
-		var wasmBinaryFile = 'ThirdParty/unzip.wasm';
-		if (!isDataURI(wasmBinaryFile)) {
-		  wasmBinaryFile = locateFile(wasmBinaryFile);
-		}
-
-		function getBinary() {
-		  try {
-			if (Module['wasmBinary']) {
-			  return new Uint8Array(Module['wasmBinary']);
-			}
-			if (Module['readBinary']) {
-			  return Module['readBinary'](wasmBinaryFile);
-			} else {
-			  throw "both async and sync fetching of the wasm failed";
-			}
-		  }
-		  catch (err) {
-			abort(err);
-		  }
-		}
-
-		function getBinaryPromise() {
-		  // if we don't have the binary yet, and have the Fetch api, use that
-		  // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web
-		  if (!Module['wasmBinary'] && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function') {
-			return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) {
-			  if (!response['ok']) {
-				throw "failed to load wasm binary file at '" + wasmBinaryFile + "'";
-			  }
-			  return response['arrayBuffer']();
-			}).catch(function () {
-			  return getBinary();
-			});
-		  }
-		  // Otherwise, getBinary should be able to get it synchronously
-		  return new Promise(function(resolve, reject) {
-			resolve(getBinary());
-		  });
-		}
-
-
-
-		// Create the wasm instance.
-		// Receives the wasm imports, returns the exports.
-		function createWasm(env) {
-
-		  // prepare imports
-		  var info = {
-			'env': env
-			,
-			'global': {
-			  'NaN': NaN,
-			  'Infinity': Infinity
-			},
-			'global.Math': Math,
-			'asm2wasm': asm2wasmImports
-		  };
-		  // Load the wasm module and create an instance of using native support in the JS engine.
-		  // handle a generated wasm instance, receiving its exports and
-		  // performing other necessary setup
-		  function receiveInstance(instance, module) {
-			var exports = instance.exports;
-			Module['asm'] = exports;
-			removeRunDependency('wasm-instantiate');
-		  }
-		  addRunDependency('wasm-instantiate');
-
-
-		  // Async compilation can be confusing when an error on the page overwrites Module
-		  // (for example, if the order of elements is wrong, and the one defining Module is
-		  // later), so we save Module and check it later.
-		  var trueModule = Module;
-		  function receiveInstantiatedSource(output) {
-			// 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance.
-			// receiveInstance() will swap in the exports (to Module.asm) so they can be called
-			assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?');
-			trueModule = null;
-			  // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
-			  // When the regression is fixed, can restore the above USE_PTHREADS-enabled path.
-			receiveInstance(output['instance']);
-		  }
-
-
-		  function instantiateArrayBuffer(receiver) {
-			return getBinaryPromise().then(function(binary) {
-			  return WebAssembly.instantiate(binary, info);
-			}).then(receiver, function(reason) {
-			  //err('failed to asynchronously prepare wasm: ' + reason);
-			  //abort(reason);
-			});
-		  }
-
-		  // Prefer streaming instantiation if available.
-		  function instantiateAsync() {
-			if (!Module['wasmBinary'] &&
-				typeof WebAssembly.instantiateStreaming === 'function' &&
-				!isDataURI(wasmBinaryFile) &&
-				typeof fetch === 'function') {
-			  fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) {
-				return WebAssembly.instantiateStreaming(response, info)
-				  .then(receiveInstantiatedSource, function(reason) {
-					// We expect the most common failure cause to be a bad MIME type for the binary,
-					// in which case falling back to ArrayBuffer instantiation should work.
-					// err('wasm streaming compile failed: ' + reason);
-					// err('falling back to ArrayBuffer instantiation');
-					instantiateArrayBuffer(receiveInstantiatedSource);
-				  });
-			  });
-			} else {
-			  return instantiateArrayBuffer(receiveInstantiatedSource);
-			}
-		  }
-		  // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
-		  // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel
-		  // to any other async startup actions they are performing.
-		  if (Module['instantiateWasm']) {
-			try {
-			  return Module['instantiateWasm'](info, receiveInstance);
-			} catch(e) {
-			  //err('Module.instantiateWasm callback failed with error: ' + e);
-			  return false;
-			}
-		  }
-
-		  instantiateAsync();
-		  return {}; // no exports yet; we'll fill them in later
-		}
-
-		// Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate
-		// the wasm module at that time, and it receives imports and provides exports and so forth, the app
-		// doesn't need to care that it is wasm or asm.js.
-
-		Module['asm'] = function(global, env, providedBuffer) {
-		  // memory was already allocated (so js could use the buffer)
-		  env['memory'] = wasmMemory
-		  ;
-		  // import table
-		  env['table'] = wasmTable = new WebAssembly.Table({
-			'initial': 22,
-			'maximum': 22,
-			'element': 'anyfunc'
-		  });
-		  // With the wasm backend __memory_base and __table_base and only needed for
-		  // relocatable output.
-		  env['__memory_base'] = 1024; // tell the memory segments where to place themselves
-		  // table starts at 0 by default (even in dynamic linking, for the main module)
-		  env['__table_base'] = 0;
-
-		  var exports = createWasm(env);
-		  assert(exports, 'binaryen setup failed (no wasm support?)');
-		  return exports;
-		};
-
-
-
-
-
-		// STATICTOP = STATIC_BASE + 14080;
-		/* global initializers */ /*__ATINIT__.push();*/
-
-
-
-
-
-
-
-
-		/* no memory initializer */
-		var tempDoublePtr = 15088;
-		assert(tempDoublePtr % 8 == 0);
-
-		// {{PRE_LIBRARY}}
-
-
-		  function ___lock() {}
-	var SYSCALLS={buffers:[null,[],[]],printChar:function (stream, curr) {
-				var buffer = SYSCALLS.buffers[stream];
-				assert(buffer);
-				if (curr === 0 || curr === 10) {
-				  (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
-				  buffer.length = 0;
-				} else {
-				  buffer.push(curr);
-				}
-			  },varargs:0,get:function (varargs) {
-				SYSCALLS.varargs += 4;
-				var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
-				return ret;
-			  },getStr:function () {
-				var ret = UTF8ToString(SYSCALLS.get());
-				return ret;
-			  },get64:function () {
-				var low = SYSCALLS.get(), high = SYSCALLS.get();
-				if (low >= 0) assert(high === 0);
-				else assert(high === -1);
-				return low;
-			  },getZero:function () {
-				assert(SYSCALLS.get() === 0);
-			  }};function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs;
-		  try {
-		   // llseek
-			  var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get();
-			  abort('it should not be possible to operate on streams when !SYSCALLS_REQUIRE_FILESYSTEM');
-			  return 0;
-			} catch (e) {
-			if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-			return -e.errno;
-		  }
-		  }
-
-		  
-		  function flush_NO_FILESYSTEM() {
-			  // flush anything remaining in the buffers during shutdown
-			  var fflush = Module["_fflush"];
-			  if (fflush) fflush(0);
-			  var buffers = SYSCALLS.buffers;
-			  if (buffers[1].length) SYSCALLS.printChar(1, 10);
-			  if (buffers[2].length) SYSCALLS.printChar(2, 10);
-			}function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs;
-		  try {
-		   // writev
-			  // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
-			  var stream = SYSCALLS.get(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
-			  var ret = 0;
-			  for (var i = 0; i < iovcnt; i++) {
-				var ptr = HEAP32[(((iov)+(i*8))>>2)];
-				var len = HEAP32[(((iov)+(i*8 + 4))>>2)];
-				for (var j = 0; j < len; j++) {
-				  SYSCALLS.printChar(stream, HEAPU8[ptr+j]);
-				}
-				ret += len;
-			  }
-			  return ret;
-			} catch (e) {
-			if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-			return -e.errno;
-		  }
-		  }
-
-		  function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs;
-		  try {
-		   // ioctl
-			  return 0;
-			} catch (e) {
-			if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-			return -e.errno;
-		  }
-		  }
-
-		  function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs;
-		  try {
-		   // close
-			  var stream = SYSCALLS.getStreamFromFD();
-			  abort('it should not be possible to operate on streams when !SYSCALLS_REQUIRE_FILESYSTEM');
-			  return 0;
-			} catch (e) {
-			if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
-			return -e.errno;
-		  }
-		  }
-
-		  function ___unlock() {}
-
-		  function _emscripten_get_heap_size() {
-			  return HEAP8.length;
-			}
-
-		   
-
-		  
-		  function _emscripten_memcpy_big(dest, src, num) {
-			  HEAPU8.set(HEAPU8.subarray(src, src+num), dest);
-			}
-		  
-		   
-
-		   
-
-		  
-		  function ___setErrNo(value) {
-			  if (Module['___errno_location']) HEAP32[((Module['___errno_location']())>>2)]=value;
-			  else err('failed to set errno from JS');
-			  return value;
-			}
-		  
-		  
-		  function abortOnCannotGrowMemory(requestedSize) {
-			  abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value ' + HEAP8.length + ', (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 ');
-			}
-		  
-		  function emscripten_realloc_buffer(size) {
-			  var PAGE_MULTIPLE = 65536;
-			  size = alignUp(size, PAGE_MULTIPLE); // round up to wasm page size
-			  var oldSize = buffer.byteLength;
-			  // native wasm support
-			  // note that this is *not* threadsafe. multiple threads can call .grow(), and each
-			  // presents a delta, so in theory we may over-allocate here (e.g. if two threads
-			  // ask to grow from 256MB to 512MB, we get 2 requests to add +256MB, and may end
-			  // up growing to 768MB (even though we may have been able to make do with 512MB).
-			  // TODO: consider decreasing the step sizes in emscripten_resize_heap
-			  try {
-				var result = wasmMemory.grow((size - oldSize) / 65536); // .grow() takes a delta compared to the previous size
-				if (result !== (-1 | 0)) {
-				  // success in native wasm memory growth, get the buffer from the memory
-				  buffer = wasmMemory.buffer;
-				  return true;
-				} else {
-				  return false;
-				}
-			  } catch(e) {
-				console.error('emscripten_realloc_buffer: Attempted to grow from ' + oldSize  + ' bytes to ' + size + ' bytes, but got error: ' + e);
-				return false;
-			  }
-			}function _emscripten_resize_heap(requestedSize) {
-			  var oldSize = _emscripten_get_heap_size();
-			  // With pthreads, races can happen (another thread might increase the size in between), so return a failure, and let the caller retry.
-			  assert(requestedSize > oldSize);
-		  
-		  
-			  var PAGE_MULTIPLE = 65536;
-			  var LIMIT = 2147483648 - PAGE_MULTIPLE; // We can do one page short of 2GB as theoretical maximum.
-		  
-			  if (requestedSize > LIMIT) {
-				err('Cannot enlarge memory, asked to go up to ' + requestedSize + ' bytes, but the limit is ' + LIMIT + ' bytes!');
-				return false;
-			  }
-		  
-			  var MIN_TOTAL_MEMORY = 16777216;
-			  var newSize = Math.max(oldSize, MIN_TOTAL_MEMORY); // So the loop below will not be infinite, and minimum asm.js memory size is 16MB.
-		  
-			  // TODO: see realloc_buffer - for PTHREADS we may want to decrease these jumps
-			  while (newSize < requestedSize) { // Keep incrementing the heap size as long as it's less than what is requested.
-				if (newSize <= 536870912) {
-				  newSize = alignUp(2 * newSize, PAGE_MULTIPLE); // Simple heuristic: double until 1GB...
-				} else {
-				  // ..., but after that, add smaller increments towards 2GB, which we cannot reach
-				  newSize = Math.min(alignUp((3 * newSize + 2147483648) / 4, PAGE_MULTIPLE), LIMIT);
-				}
-		  
-				if (newSize === oldSize) {
-				  warnOnce('Cannot ask for more memory since we reached the practical limit in browsers (which is just below 2GB), so the request would have failed. Requesting only ' + HEAP8.length);
-				}
-			  }
-		  
-			  if (!emscripten_realloc_buffer(newSize)) {
-				err('Failed to grow the heap from ' + oldSize + ' bytes to ' + newSize + ' bytes, not enough memory!');
-				return false;
-			  }
-		  
-			  updateGlobalBufferViews();
-		  
-		  
-		  
-			  return true;
-			} 
-
-
-		// ASM_LIBRARY EXTERN PRIMITIVES: Int8Array,Int32Array
-
-
-		function nullFunc_ii(x) { err("Invalid function pointer called with signature 'ii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-		function nullFunc_iiii(x) { err("Invalid function pointer called with signature 'iiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-		function nullFunc_jiji(x) { err("Invalid function pointer called with signature 'jiji'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-		function nullFunc_vii(x) { err("Invalid function pointer called with signature 'vii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)");  err("Build with ASSERTIONS=2 for more info.");abort(x); }
-
-		var asmGlobalArg = {};
-
-		var asmLibraryArg = {
-		  "abort": abort,
-		  "setTempRet0": setTempRet0,
-		  "getTempRet0": getTempRet0,
-		  "abortStackOverflow": abortStackOverflow,
-		  "nullFunc_ii": nullFunc_ii,
-		  "nullFunc_iiii": nullFunc_iiii,
-		  "nullFunc_jiji": nullFunc_jiji,
-		  "nullFunc_vii": nullFunc_vii,
-		  "___lock": ___lock,
-		  "___setErrNo": ___setErrNo,
-		  "___syscall140": ___syscall140,
-		  "___syscall146": ___syscall146,
-		  "___syscall54": ___syscall54,
-		  "___syscall6": ___syscall6,
-		  "___unlock": ___unlock,
-		  "_emscripten_get_heap_size": _emscripten_get_heap_size,
-		  "_emscripten_memcpy_big": _emscripten_memcpy_big,
-		  "_emscripten_resize_heap": _emscripten_resize_heap,
-		  "abortOnCannotGrowMemory": abortOnCannotGrowMemory,
-		  "emscripten_realloc_buffer": emscripten_realloc_buffer,
-		  "flush_NO_FILESYSTEM": flush_NO_FILESYSTEM,
-		  "tempDoublePtr": tempDoublePtr,
-		  "DYNAMICTOP_PTR": DYNAMICTOP_PTR
-		};
-		// EMSCRIPTEN_START_ASM
-		var asm =Module["asm"]// EMSCRIPTEN_END_ASM
-		(asmGlobalArg, asmLibraryArg, buffer);
-
-		var real____errno_location = asm["___errno_location"];
-		asm["___errno_location"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real____errno_location.apply(null, arguments);
-		};
-
-		var real__fflush = asm["_fflush"];
-		asm["_fflush"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real__fflush.apply(null, arguments);
-		};
-
-		var real__free = asm["_free"];
-		asm["_free"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real__free.apply(null, arguments);
-		};
-
-		var real__freePointer = asm["_freePointer"];
-		asm["_freePointer"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real__freePointer.apply(null, arguments);
-		};
-
-		var real__llvm_bswap_i32 = asm["_llvm_bswap_i32"];
-		asm["_llvm_bswap_i32"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real__llvm_bswap_i32.apply(null, arguments);
-		};
-
-		var real__malloc = asm["_malloc"];
-		asm["_malloc"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real__malloc.apply(null, arguments);
-		};
-
-		var real__sbrk = asm["_sbrk"];
-		asm["_sbrk"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real__sbrk.apply(null, arguments);
-		};
-
-		var real__unzip = asm["_unzip"];
-		asm["_unzip"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real__unzip.apply(null, arguments);
-		};
-
-		var real_establishStackSpace = asm["establishStackSpace"];
-		asm["establishStackSpace"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real_establishStackSpace.apply(null, arguments);
-		};
-
-		var real_stackAlloc = asm["stackAlloc"];
-		asm["stackAlloc"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real_stackAlloc.apply(null, arguments);
-		};
-
-		var real_stackRestore = asm["stackRestore"];
-		asm["stackRestore"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real_stackRestore.apply(null, arguments);
-		};
-
-		var real_stackSave = asm["stackSave"];
-		asm["stackSave"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return real_stackSave.apply(null, arguments);
-		};
-		Module["asm"] = asm;
-		var ___errno_location = Module["___errno_location"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["___errno_location"].apply(null, arguments)
-		};
-
-		var _emscripten_replace_memory = Module["_emscripten_replace_memory"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_emscripten_replace_memory"].apply(null, arguments)
-		};
-
-		var _fflush = Module["_fflush"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_fflush"].apply(null, arguments)
-		};
-
-		var _free = Module["_free"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_free"].apply(null, arguments)
-		};
-
-		var _freePointer = Module["_freePointer"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_freePointer"].apply(null, arguments)
-		};
-
-		var _llvm_bswap_i32 = Module["_llvm_bswap_i32"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_llvm_bswap_i32"].apply(null, arguments)
-		};
-
-		var _malloc = Module["_malloc"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_malloc"].apply(null, arguments)
-		};
-
-		var _memcpy = Module["_memcpy"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_memcpy"].apply(null, arguments)
-		};
-
-		var _memset = Module["_memset"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_memset"].apply(null, arguments)
-		};
-
-		var _sbrk = Module["_sbrk"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_sbrk"].apply(null, arguments)
-		};
-
-		var _unzip = Module["_unzip"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["_unzip"].apply(null, arguments)
-		};
-
-		var establishStackSpace = Module["establishStackSpace"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["establishStackSpace"].apply(null, arguments)
-		};
-
-		var stackAlloc = Module["stackAlloc"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["stackAlloc"].apply(null, arguments)
-		};
-
-		var stackRestore = Module["stackRestore"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["stackRestore"].apply(null, arguments)
-		};
-
-		var stackSave = Module["stackSave"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["stackSave"].apply(null, arguments)
-		};
-
-		var dynCall_ii = Module["dynCall_ii"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["dynCall_ii"].apply(null, arguments)
-		};
-
-		var dynCall_iiii = Module["dynCall_iiii"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["dynCall_iiii"].apply(null, arguments)
-		};
-
-		var dynCall_jiji = Module["dynCall_jiji"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["dynCall_jiji"].apply(null, arguments)
-		};
-
-		var dynCall_vii = Module["dynCall_vii"] = function() {
-		  assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)');
-		  assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
-		  return Module["asm"]["dynCall_vii"].apply(null, arguments)
-		};
-
-
-
-		// === Auto-generated postamble setup entry stuff ===
-
-		Module['asm'] = asm;
-
-		if (!Module["intArrayFromString"]) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["intArrayToString"]) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		Module["ccall"] = ccall;
-		Module["cwrap"] = cwrap;
-		if (!Module["setValue"]) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		Module["getValue"] = getValue;
-		if (!Module["allocate"]) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["getMemory"]) Module["getMemory"] = function() { abort("'getMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["AsciiToString"]) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["stringToAscii"]) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["UTF8ArrayToString"]) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["UTF8ToString"]) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["stringToUTF8Array"]) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["stringToUTF8"]) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["lengthBytesUTF8"]) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["UTF16ToString"]) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["stringToUTF16"]) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["lengthBytesUTF16"]) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["UTF32ToString"]) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["stringToUTF32"]) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["lengthBytesUTF32"]) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["allocateUTF8"]) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["stackTrace"]) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["addOnPreRun"]) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["addOnInit"]) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["addOnPreMain"]) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["addOnExit"]) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["addOnPostRun"]) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["writeStringToMemory"]) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["writeArrayToMemory"]) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["writeAsciiToMemory"]) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["addRunDependency"]) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["removeRunDependency"]) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["ENV"]) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["FS"]) Module["FS"] = function() { abort("'FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["FS_createFolder"]) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["FS_createPath"]) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["FS_createDataFile"]) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["FS_createPreloadedFile"]) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["FS_createLazyFile"]) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["FS_createLink"]) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["FS_createDevice"]) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["FS_unlink"]) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you"); };
-		if (!Module["GL"]) Module["GL"] = function() { abort("'GL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["dynamicAlloc"]) Module["dynamicAlloc"] = function() { abort("'dynamicAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["warnOnce"]) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["loadDynamicLibrary"]) Module["loadDynamicLibrary"] = function() { abort("'loadDynamicLibrary' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["loadWebAssemblyModule"]) Module["loadWebAssemblyModule"] = function() { abort("'loadWebAssemblyModule' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["getLEB"]) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["getFunctionTables"]) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["alignFunctionTables"]) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["registerFunctions"]) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["addFunction"]) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["removeFunction"]) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["getFuncWrapper"]) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["prettyPrint"]) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["makeBigInt"]) Module["makeBigInt"] = function() { abort("'makeBigInt' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["dynCall"]) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["getCompilerSetting"]) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["stackSave"]) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["stackRestore"]) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["stackAlloc"]) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["establishStackSpace"]) Module["establishStackSpace"] = function() { abort("'establishStackSpace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["print"]) Module["print"] = function() { abort("'print' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["printErr"]) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["getTempRet0"]) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["setTempRet0"]) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };
-		if (!Module["Pointer_stringify"]) Module["Pointer_stringify"] = function() { abort("'Pointer_stringify' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); };if (!Module["ALLOC_NORMAL"]) Object.defineProperty(Module, "ALLOC_NORMAL", { get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); } });
-		if (!Module["ALLOC_STACK"]) Object.defineProperty(Module, "ALLOC_STACK", { get: function() { abort("'ALLOC_STACK' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); } });
-		if (!Module["ALLOC_DYNAMIC"]) Object.defineProperty(Module, "ALLOC_DYNAMIC", { get: function() { abort("'ALLOC_DYNAMIC' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); } });
-		if (!Module["ALLOC_NONE"]) Object.defineProperty(Module, "ALLOC_NONE", { get: function() { abort("'ALLOC_NONE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)"); } });
-
-
-
-
-		/**
-		 * @constructor
-		 * @extends {Error}
-		 * @this {ExitStatus}
-		 */
-		function ExitStatus(status) {
-		  this.name = "ExitStatus";
-		  this.message = "Program terminated with exit(" + status + ")";
-		  this.status = status;
-		}	ExitStatus.prototype = new Error();
-		ExitStatus.prototype.constructor = ExitStatus;
-
-		dependenciesFulfilled = function runCaller() {
-		  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
-		  if (!Module['calledRun']) run();
-		  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
-		};
-
-
-
-
-
-		/** @type {function(Array=)} */
-		function run(args) {
-		  args = args || Module['arguments'];
-
-		  if (runDependencies > 0) {
-			return;
-		  }
-
-		  writeStackCookie();
-
-		  preRun();
-
-		  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later
-		  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame
-
-		  function doRun() {
-			if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening
-			Module['calledRun'] = true;
-
-			if (ABORT) return;
-
-			ensureInitRuntime();
-
-			preMain();
-
-			if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();
-
-			assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]');
-
-			postRun();
-		  }
-
-		  if (Module['setStatus']) {
-			Module['setStatus']('Running...');
-			setTimeout(function() {
-			  setTimeout(function() {
-				Module['setStatus']('');
-			  }, 1);
-			  doRun();
-			}, 1);
-		  } else {
-			doRun();
-		  }
-		  checkStackCookie();
-		}
-		Module['run'] = run;
-
-		var abortDecorators = [];
-
-		function abort(what) {
-		  if (Module['onAbort']) {
-			Module['onAbort'](what);
-		  }
-
-		  if (what !== undefined) {
-			//out(what);
-			//err(what);
-			what = '"' + what + '"';
-		  } else {
-			what = '';
-		  }
-
-		  ABORT = true;
-
-		  var extra = '';
-		  var output = 'abort(' + what + ') at ' + stackTrace() + extra;
-		  if (abortDecorators) {
-			abortDecorators.forEach(function(decorator) {
-			  output = decorator(output, what);
-			});
-		  }
-		  throw output;
-		}
-		Module['abort'] = abort;
-
-		if (Module['preInit']) {
-		  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
-		  while (Module['preInit'].length > 0) {
-			Module['preInit'].pop()();
-		  }
-		}
-
-
-		  Module["noExitRuntime"] = true;
-
-		run();
-	} else {
-	    var Module = null;
-	}
-
-	var unzip = Module;
-
-
-
-
-	// {{MODULE_ADDITIONS}}
-
-	exports.unzip = unzip;
-
-});
diff --git a/public/libs/Cesium/Workers/upsampleQuantizedTerrainMesh.js b/public/libs/Cesium/Workers/upsampleQuantizedTerrainMesh.js
deleted file mode 100644
index 2d3f242..0000000
--- a/public/libs/Cesium/Workers/upsampleQuantizedTerrainMesh.js
+++ /dev/null
@@ -1,861 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['./when-8d13db60', './Check-70bec281', './Math-61ede240', './Cartographic-fe4be337', './Cartesian2-85064f09', './BoundingSphere-775c5788', './Cartesian4-5af5bb24', './RuntimeError-ba10bc3e', './WebGLConstants-4c11ee5f', './ComponentDatatype-5862616f', './FeatureDetection-7bd32c34', './Transforms-a1cf7267', './buildModuleUrl-e7952659', './AttributeCompression-84a90a13', './IndexDatatype-9435b55f', './IntersectionTests-397d9494', './Plane-8390418f', './createTaskProcessorWorker', './EllipsoidTangentPlane-e324bfa4', './OrientedBoundingBox-0ede1598', './TerrainEncoding-a807a704'], function (when, Check, _Math, Cartographic, Cartesian2, BoundingSphere, Cartesian4, RuntimeError, WebGLConstants, ComponentDatatype, FeatureDetection, Transforms, buildModuleUrl, AttributeCompression, IndexDatatype, IntersectionTests, Plane, createTaskProcessorWorker, EllipsoidTangentPlane, OrientedBoundingBox, TerrainEncoding) { 'use strict';
-
-    /**
-         * Contains functions for operating on 2D triangles.
-         *
-         * @exports Intersections2D
-         */
-        var Intersections2D = {};
-
-        /**
-         * Splits a 2D triangle at given axis-aligned threshold value and returns the resulting
-         * polygon on a given side of the threshold.  The resulting polygon may have 0, 1, 2,
-         * 3, or 4 vertices.
-         *
-         * @param {Number} threshold The threshold coordinate value at which to clip the triangle.
-         * @param {Boolean} keepAbove true to keep the portion of the triangle above the threshold, or false
-         *                            to keep the portion below.
-         * @param {Number} u0 The coordinate of the first vertex in the triangle, in counter-clockwise order.
-         * @param {Number} u1 The coordinate of the second vertex in the triangle, in counter-clockwise order.
-         * @param {Number} u2 The coordinate of the third vertex in the triangle, in counter-clockwise order.
-         * @param {Number[]} [result] The array into which to copy the result.  If this parameter is not supplied,
-         *                            a new array is constructed and returned.
-         * @returns {Number[]} The polygon that results after the clip, specified as a list of
-         *                     vertices.  The vertices are specified in counter-clockwise order.
-         *                     Each vertex is either an index from the existing list (identified as
-         *                     a 0, 1, or 2) or -1 indicating a new vertex not in the original triangle.
-         *                     For new vertices, the -1 is followed by three additional numbers: the
-         *                     index of each of the two original vertices forming the line segment that
-         *                     the new vertex lies on, and the fraction of the distance from the first
-         *                     vertex to the second one.
-         *
-         * @example
-         * var result = Cesium.Intersections2D.clipTriangleAtAxisAlignedThreshold(0.5, false, 0.2, 0.6, 0.4);
-         * // result === [2, 0, -1, 1, 0, 0.25, -1, 1, 2, 0.5]
-         */
-        Intersections2D.clipTriangleAtAxisAlignedThreshold = function(threshold, keepAbove, u0, u1, u2, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(threshold)) {
-                throw new Check.DeveloperError('threshold is required.');
-            }
-            if (!when.defined(keepAbove)) {
-                throw new Check.DeveloperError('keepAbove is required.');
-            }
-            if (!when.defined(u0)) {
-                throw new Check.DeveloperError('u0 is required.');
-            }
-            if (!when.defined(u1)) {
-                throw new Check.DeveloperError('u1 is required.');
-            }
-            if (!when.defined(u2)) {
-                throw new Check.DeveloperError('u2 is required.');
-            }
-            //>>includeEnd('debug');
-
-            if (!when.defined(result)) {
-                result = [];
-            } else {
-                result.length = 0;
-            }
-
-            var u0Behind;
-            var u1Behind;
-            var u2Behind;
-            if (keepAbove) {
-                u0Behind = u0 < threshold;
-                u1Behind = u1 < threshold;
-                u2Behind = u2 < threshold;
-            } else {
-                u0Behind = u0 > threshold;
-                u1Behind = u1 > threshold;
-                u2Behind = u2 > threshold;
-            }
-
-            var numBehind = u0Behind + u1Behind + u2Behind;
-
-            var u01Ratio;
-            var u02Ratio;
-            var u12Ratio;
-            var u10Ratio;
-            var u20Ratio;
-            var u21Ratio;
-
-            if (numBehind === 1) {
-                if (u0Behind) {
-                    u01Ratio = (threshold - u0) / (u1 - u0);
-                    u02Ratio = (threshold - u0) / (u2 - u0);
-
-                    result.push(1);
-
-                    result.push(2);
-
-                    if (u02Ratio !== 1.0) {
-                        result.push(-1);
-                        result.push(0);
-                        result.push(2);
-                        result.push(u02Ratio);
-                    }
-
-                    if (u01Ratio !== 1.0) {
-                        result.push(-1);
-                        result.push(0);
-                        result.push(1);
-                        result.push(u01Ratio);
-                    }
-                } else if (u1Behind) {
-                    u12Ratio = (threshold - u1) / (u2 - u1);
-                    u10Ratio = (threshold - u1) / (u0 - u1);
-
-                    result.push(2);
-
-                    result.push(0);
-
-                    if (u10Ratio !== 1.0) {
-                        result.push(-1);
-                        result.push(1);
-                        result.push(0);
-                        result.push(u10Ratio);
-                    }
-
-                    if (u12Ratio !== 1.0) {
-                        result.push(-1);
-                        result.push(1);
-                        result.push(2);
-                        result.push(u12Ratio);
-                    }
-                } else if (u2Behind) {
-                    u20Ratio = (threshold - u2) / (u0 - u2);
-                    u21Ratio = (threshold - u2) / (u1 - u2);
-
-                    result.push(0);
-
-                    result.push(1);
-
-                    if (u21Ratio !== 1.0) {
-                        result.push(-1);
-                        result.push(2);
-                        result.push(1);
-                        result.push(u21Ratio);
-                    }
-
-                    if (u20Ratio !== 1.0) {
-                        result.push(-1);
-                        result.push(2);
-                        result.push(0);
-                        result.push(u20Ratio);
-                    }
-                }
-            } else if (numBehind === 2) {
-                if (!u0Behind && u0 !== threshold) {
-                    u10Ratio = (threshold - u1) / (u0 - u1);
-                    u20Ratio = (threshold - u2) / (u0 - u2);
-
-                    result.push(0);
-
-                    result.push(-1);
-                    result.push(1);
-                    result.push(0);
-                    result.push(u10Ratio);
-
-                    result.push(-1);
-                    result.push(2);
-                    result.push(0);
-                    result.push(u20Ratio);
-                } else if (!u1Behind && u1 !== threshold) {
-                    u21Ratio = (threshold - u2) / (u1 - u2);
-                    u01Ratio = (threshold - u0) / (u1 - u0);
-
-                    result.push(1);
-
-                    result.push(-1);
-                    result.push(2);
-                    result.push(1);
-                    result.push(u21Ratio);
-
-                    result.push(-1);
-                    result.push(0);
-                    result.push(1);
-                    result.push(u01Ratio);
-                } else if (!u2Behind && u2 !== threshold) {
-                    u02Ratio = (threshold - u0) / (u2 - u0);
-                    u12Ratio = (threshold - u1) / (u2 - u1);
-
-                    result.push(2);
-
-                    result.push(-1);
-                    result.push(0);
-                    result.push(2);
-                    result.push(u02Ratio);
-
-                    result.push(-1);
-                    result.push(1);
-                    result.push(2);
-                    result.push(u12Ratio);
-                }
-            } else if (numBehind !== 3) {
-                // Completely in front of threshold
-                result.push(0);
-                result.push(1);
-                result.push(2);
-            }
-            // else Completely behind threshold
-
-            return result;
-        };
-
-        /**
-         * Compute the barycentric coordinates of a 2D position within a 2D triangle.
-         *
-         * @param {Number} x The x coordinate of the position for which to find the barycentric coordinates.
-         * @param {Number} y The y coordinate of the position for which to find the barycentric coordinates.
-         * @param {Number} x1 The x coordinate of the triangle's first vertex.
-         * @param {Number} y1 The y coordinate of the triangle's first vertex.
-         * @param {Number} x2 The x coordinate of the triangle's second vertex.
-         * @param {Number} y2 The y coordinate of the triangle's second vertex.
-         * @param {Number} x3 The x coordinate of the triangle's third vertex.
-         * @param {Number} y3 The y coordinate of the triangle's third vertex.
-         * @param {Cartesian3} [result] The instance into to which to copy the result.  If this parameter
-         *                     is undefined, a new instance is created and returned.
-         * @returns {Cartesian3} The barycentric coordinates of the position within the triangle.
-         *
-         * @example
-         * var result = Cesium.Intersections2D.computeBarycentricCoordinates(0.0, 0.0, 0.0, 1.0, -1, -0.5, 1, -0.5);
-         * // result === new Cesium.Cartesian3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0);
-         */
-        Intersections2D.computeBarycentricCoordinates = function(x, y, x1, y1, x2, y2, x3, y3, result) {
-            //>>includeStart('debug', pragmas.debug);
-            if (!when.defined(x)) {
-                throw new Check.DeveloperError('x is required.');
-            }
-            if (!when.defined(y)) {
-                throw new Check.DeveloperError('y is required.');
-            }
-            if (!when.defined(x1)) {
-                throw new Check.DeveloperError('x1 is required.');
-            }
-            if (!when.defined(y1)) {
-                throw new Check.DeveloperError('y1 is required.');
-            }
-            if (!when.defined(x2)) {
-                throw new Check.DeveloperError('x2 is required.');
-            }
-            if (!when.defined(y2)) {
-                throw new Check.DeveloperError('y2 is required.');
-            }
-            if (!when.defined(x3)) {
-                throw new Check.DeveloperError('x3 is required.');
-            }
-            if (!when.defined(y3)) {
-                throw new Check.DeveloperError('y3 is required.');
-            }
-            //>>includeEnd('debug');
-
-            var x1mx3 = x1 - x3;
-            var x3mx2 = x3 - x2;
-            var y2my3 = y2 - y3;
-            var y1my3 = y1 - y3;
-            var inverseDeterminant = 1.0 / (y2my3 * x1mx3 + x3mx2 * y1my3);
-            var ymy3 = y - y3;
-            var xmx3 = x - x3;
-            var l1 = (y2my3 * xmx3 + x3mx2 * ymy3) * inverseDeterminant;
-            var l2 = (-y1my3 * xmx3 + x1mx3 * ymy3) * inverseDeterminant;
-            var l3 = 1.0 - l1 - l2;
-
-            if (when.defined(result)) {
-                result.x = l1;
-                result.y = l2;
-                result.z = l3;
-                return result;
-            }
-            return new Cartographic.Cartesian3(l1, l2, l3);
-        };
-
-        /**
-         * Compute the intersection between 2 line segments
-         *
-         * @param {Number} x00 The x coordinate of the first line's first vertex.
-         * @param {Number} y00 The y coordinate of the first line's first vertex.
-         * @param {Number} x01 The x coordinate of the first line's second vertex.
-         * @param {Number} y01 The y coordinate of the first line's second vertex.
-         * @param {Number} x10 The x coordinate of the second line's first vertex.
-         * @param {Number} y10 The y coordinate of the second line's first vertex.
-         * @param {Number} x11 The x coordinate of the second line's second vertex.
-         * @param {Number} y11 The y coordinate of the second line's second vertex.
-         * @param {Cartesian2} [result] The instance into to which to copy the result. If this parameter
-         *                     is undefined, a new instance is created and returned.
-         * @returns {Cartesian2} The intersection point, undefined if there is no intersection point or lines are coincident.
-         *
-         * @example
-         * var result = Cesium.Intersections2D.computeLineSegmentLineSegmentIntersection(0.0, 0.0, 0.0, 2.0, -1, 1, 1, 1);
-         * // result === new Cesium.Cartesian2(0.0, 1.0);
-         */
-        Intersections2D.computeLineSegmentLineSegmentIntersection = function(x00, y00, x01, y01, x10, y10, x11, y11, result) {
-            //>>includeStart('debug', pragmas.debug);
-            Check.Check.typeOf.number('x00', x00);
-            Check.Check.typeOf.number('y00', y00);
-            Check.Check.typeOf.number('x01', x01);
-            Check.Check.typeOf.number('y01', y01);
-            Check.Check.typeOf.number('x10', x10);
-            Check.Check.typeOf.number('y10', y10);
-            Check.Check.typeOf.number('x11', x11);
-            Check.Check.typeOf.number('y11', y11);
-            //>>includeEnd('debug');
-
-            var numerator1A = (x11 - x10) * (y00 - y10) - (y11 - y10) * (x00 - x10);
-            var numerator1B = (x01 - x00) * (y00 - y10) - (y01 - y00) * (x00 - x10);
-            var denominator1 = (y11 - y10) * (x01 - x00) - (x11 - x10) * (y01 - y00);
-
-            // If denominator = 0, then lines are parallel. If denominator = 0 and both numerators are 0, then coincident
-            if (denominator1 === 0) {
-                return;
-            }
-
-            var ua1 = numerator1A / denominator1;
-            var ub1 = numerator1B / denominator1;
-
-            if (ua1 >= 0 && ua1 <= 1 && ub1 >= 0 && ub1 <= 1) {
-                if (!when.defined(result)) {
-                    result = new Cartesian2.Cartesian2();
-                }
-
-                result.x = x00 + ua1 * (x01 - x00);
-                result.y = y00 + ua1 * (y01 - y00);
-
-                return result;
-            }
-        };
-
-    var maxShort = 32767;
-        var halfMaxShort = (maxShort / 2) | 0;
-
-        var clipScratch = [];
-        var clipScratch2 = [];
-        var verticesScratch = [];
-        var cartographicScratch = new Cartographic.Cartographic();
-        var cartesian3Scratch = new Cartographic.Cartesian3();
-        var uScratch = [];
-        var vScratch = [];
-        var heightScratch = [];
-        var indicesScratch = [];
-        var normalsScratch = [];
-        var horizonOcclusionPointScratch = new Cartographic.Cartesian3();
-        var boundingSphereScratch = new BoundingSphere.BoundingSphere();
-        var orientedBoundingBoxScratch = new OrientedBoundingBox.OrientedBoundingBox();
-        var decodeTexCoordsScratch = new Cartesian2.Cartesian2();
-        var octEncodedNormalScratch = new Cartographic.Cartesian3();
-
-        function upsampleQuantizedTerrainMesh(parameters, transferableObjects) {
-            var isEastChild = parameters.isEastChild;
-            var isNorthChild = parameters.isNorthChild;
-
-            var minU = isEastChild ? halfMaxShort : 0;
-            var maxU = isEastChild ? maxShort : halfMaxShort;
-            var minV = isNorthChild ? halfMaxShort : 0;
-            var maxV = isNorthChild ? maxShort : halfMaxShort;
-
-            var uBuffer = uScratch;
-            var vBuffer = vScratch;
-            var heightBuffer = heightScratch;
-            var normalBuffer = normalsScratch;
-
-            uBuffer.length = 0;
-            vBuffer.length = 0;
-            heightBuffer.length = 0;
-            normalBuffer.length = 0;
-
-            var indices = indicesScratch;
-            indices.length = 0;
-
-            var vertexMap = {};
-
-            var parentVertices = parameters.vertices;
-            var parentIndices = parameters.indices;
-            parentIndices = parentIndices.subarray(0, parameters.indexCountWithoutSkirts);
-
-            var encoding = TerrainEncoding.TerrainEncoding.clone(parameters.encoding);
-            var hasVertexNormals = encoding.hasVertexNormals;
-            var exaggeration = parameters.exaggeration;
-
-            var vertexCount = 0;
-            var quantizedVertexCount = parameters.vertexCountWithoutSkirts;
-
-            var parentMinimumHeight = parameters.minimumHeight;
-            var parentMaximumHeight = parameters.maximumHeight;
-
-            var parentUBuffer = new Array(quantizedVertexCount);
-            var parentVBuffer = new Array(quantizedVertexCount);
-            var parentHeightBuffer = new Array(quantizedVertexCount);
-            var parentNormalBuffer = hasVertexNormals ? new Array(quantizedVertexCount * 2) : undefined;
-
-            var threshold = 20;
-            var height;
-
-            var i, n;
-            var u, v;
-            for (i = 0, n = 0; i < quantizedVertexCount; ++i, n += 2) {
-                var texCoords = encoding.decodeTextureCoordinates(parentVertices, i, decodeTexCoordsScratch);
-                height  = encoding.decodeHeight(parentVertices, i) / exaggeration;
-
-                u = _Math.CesiumMath.clamp((texCoords.x * maxShort) | 0, 0, maxShort);
-                v = _Math.CesiumMath.clamp((texCoords.y * maxShort) | 0, 0, maxShort);
-                parentHeightBuffer[i] = _Math.CesiumMath.clamp((((height - parentMinimumHeight) / (parentMaximumHeight - parentMinimumHeight)) * maxShort) | 0, 0, maxShort);
-
-                if (u < threshold) {
-                    u = 0;
-                }
-
-                if (v < threshold) {
-                    v = 0;
-                }
-
-                if (maxShort - u < threshold) {
-                    u = maxShort;
-                }
-
-                if (maxShort - v < threshold) {
-                    v = maxShort;
-                }
-
-                parentUBuffer[i] = u;
-                parentVBuffer[i] = v;
-
-                if (hasVertexNormals) {
-                    var encodedNormal = encoding.getOctEncodedNormal(parentVertices, i, octEncodedNormalScratch);
-                    parentNormalBuffer[n] = encodedNormal.x;
-                    parentNormalBuffer[n + 1] = encodedNormal.y;
-                }
-
-                if ((isEastChild && u >= halfMaxShort || !isEastChild && u <= halfMaxShort) &&
-                    (isNorthChild && v >= halfMaxShort || !isNorthChild && v <= halfMaxShort)) {
-
-                    vertexMap[i] = vertexCount;
-                    uBuffer.push(u);
-                    vBuffer.push(v);
-                    heightBuffer.push(parentHeightBuffer[i]);
-                    if (hasVertexNormals) {
-                        normalBuffer.push(parentNormalBuffer[n]);
-                        normalBuffer.push(parentNormalBuffer[n + 1]);
-                    }
-
-                    ++vertexCount;
-                }
-            }
-
-            var triangleVertices = [];
-            triangleVertices.push(new Vertex());
-            triangleVertices.push(new Vertex());
-            triangleVertices.push(new Vertex());
-
-            var clippedTriangleVertices = [];
-            clippedTriangleVertices.push(new Vertex());
-            clippedTriangleVertices.push(new Vertex());
-            clippedTriangleVertices.push(new Vertex());
-
-            var clippedIndex;
-            var clipped2;
-
-            for (i = 0; i < parentIndices.length; i += 3) {
-                var i0 = parentIndices[i];
-                var i1 = parentIndices[i + 1];
-                var i2 = parentIndices[i + 2];
-
-                var u0 = parentUBuffer[i0];
-                var u1 = parentUBuffer[i1];
-                var u2 = parentUBuffer[i2];
-
-                triangleVertices[0].initializeIndexed(parentUBuffer, parentVBuffer, parentHeightBuffer, parentNormalBuffer, i0);
-                triangleVertices[1].initializeIndexed(parentUBuffer, parentVBuffer, parentHeightBuffer, parentNormalBuffer, i1);
-                triangleVertices[2].initializeIndexed(parentUBuffer, parentVBuffer, parentHeightBuffer, parentNormalBuffer, i2);
-
-                // Clip triangle on the east-west boundary.
-                var clipped = Intersections2D.clipTriangleAtAxisAlignedThreshold(halfMaxShort, isEastChild, u0, u1, u2, clipScratch);
-
-                // Get the first clipped triangle, if any.
-                clippedIndex = 0;
-
-                if (clippedIndex >= clipped.length) {
-                    continue;
-                }
-                clippedIndex = clippedTriangleVertices[0].initializeFromClipResult(clipped, clippedIndex, triangleVertices);
-
-                if (clippedIndex >= clipped.length) {
-                    continue;
-                }
-                clippedIndex = clippedTriangleVertices[1].initializeFromClipResult(clipped, clippedIndex, triangleVertices);
-
-                if (clippedIndex >= clipped.length) {
-                    continue;
-                }
-                clippedIndex = clippedTriangleVertices[2].initializeFromClipResult(clipped, clippedIndex, triangleVertices);
-
-                // Clip the triangle against the North-south boundary.
-                clipped2 = Intersections2D.clipTriangleAtAxisAlignedThreshold(halfMaxShort, isNorthChild, clippedTriangleVertices[0].getV(), clippedTriangleVertices[1].getV(), clippedTriangleVertices[2].getV(), clipScratch2);
-                addClippedPolygon(uBuffer, vBuffer, heightBuffer, normalBuffer, indices, vertexMap, clipped2, clippedTriangleVertices, hasVertexNormals, parentMaximumHeight, parentMinimumHeight);
-
-                // If there's another vertex in the original clipped result,
-                // it forms a second triangle.  Clip it as well.
-                if (clippedIndex < clipped.length) {
-                    clippedTriangleVertices[2].clone(clippedTriangleVertices[1]);
-                    clippedTriangleVertices[2].initializeFromClipResult(clipped, clippedIndex, triangleVertices);
-
-                    clipped2 = Intersections2D.clipTriangleAtAxisAlignedThreshold(halfMaxShort, isNorthChild, clippedTriangleVertices[0].getV(), clippedTriangleVertices[1].getV(), clippedTriangleVertices[2].getV(), clipScratch2);
-                    addClippedPolygon(uBuffer, vBuffer, heightBuffer, normalBuffer, indices, vertexMap, clipped2, clippedTriangleVertices, hasVertexNormals, parentMaximumHeight, parentMinimumHeight);
-                }
-            }
-
-            var uOffset = isEastChild ? -maxShort : 0;
-            var vOffset = isNorthChild ? -maxShort : 0;
-
-            var westIndices = [];
-            var southIndices = [];
-            var eastIndices = [];
-            var northIndices = [];
-
-            var minimumHeight = Number.MAX_VALUE;
-            var maximumHeight = -minimumHeight;
-
-            var cartesianVertices = verticesScratch;
-            cartesianVertices.length = 0;
-
-            var ellipsoid = Cartesian2.Ellipsoid.clone(parameters.ellipsoid);
-            var rectangle = Cartesian2.Rectangle.clone(parameters.childRectangle);
-
-            var north = rectangle.north;
-            var south = rectangle.south;
-            var east = rectangle.east;
-            var west = rectangle.west;
-
-            if (east < west) {
-                east += _Math.CesiumMath.TWO_PI;
-            }
-
-            for (i = 0; i < uBuffer.length; ++i) {
-                u = Math.round(uBuffer[i]);
-                if (u <= minU) {
-                    westIndices.push(i);
-                    u = 0;
-                } else if (u >= maxU) {
-                    eastIndices.push(i);
-                    u = maxShort;
-                } else {
-                    u = u * 2 + uOffset;
-                }
-
-                uBuffer[i] = u;
-
-                v = Math.round(vBuffer[i]);
-                if (v <= minV) {
-                    southIndices.push(i);
-                    v = 0;
-                } else if (v >= maxV) {
-                    northIndices.push(i);
-                    v = maxShort;
-                } else {
-                    v = v * 2 + vOffset;
-                }
-
-                vBuffer[i] = v;
-
-                height = _Math.CesiumMath.lerp(parentMinimumHeight, parentMaximumHeight, heightBuffer[i] / maxShort);
-                if (height < minimumHeight) {
-                    minimumHeight = height;
-                }
-                if (height > maximumHeight) {
-                    maximumHeight = height;
-                }
-
-                heightBuffer[i] = height;
-
-                cartographicScratch.longitude = _Math.CesiumMath.lerp(west, east, u / maxShort);
-                cartographicScratch.latitude = _Math.CesiumMath.lerp(south, north, v / maxShort);
-                cartographicScratch.height = height;
-
-                ellipsoid.cartographicToCartesian(cartographicScratch, cartesian3Scratch);
-
-                cartesianVertices.push(cartesian3Scratch.x);
-                cartesianVertices.push(cartesian3Scratch.y);
-                cartesianVertices.push(cartesian3Scratch.z);
-            }
-
-            var boundingSphere = BoundingSphere.BoundingSphere.fromVertices(cartesianVertices, Cartographic.Cartesian3.ZERO, 3, boundingSphereScratch);
-            var orientedBoundingBox = OrientedBoundingBox.OrientedBoundingBox.fromRectangle(rectangle, minimumHeight, maximumHeight, ellipsoid, orientedBoundingBoxScratch);
-
-            var occluder = new TerrainEncoding.EllipsoidalOccluder(ellipsoid);
-            var horizonOcclusionPoint = occluder.computeHorizonCullingPointFromVerticesPossiblyUnderEllipsoid(boundingSphere.center, cartesianVertices, 3, boundingSphere.center, minimumHeight, horizonOcclusionPointScratch);
-
-            var heightRange = maximumHeight - minimumHeight;
-
-            var vertices = new Uint16Array(uBuffer.length + vBuffer.length + heightBuffer.length);
-
-            for (i = 0; i < uBuffer.length; ++i) {
-                vertices[i] = uBuffer[i];
-            }
-
-            var start = uBuffer.length;
-
-            for (i = 0; i < vBuffer.length; ++i) {
-                vertices[start + i] = vBuffer[i];
-            }
-
-            start += vBuffer.length;
-
-            for (i = 0; i < heightBuffer.length; ++i) {
-                vertices[start + i] = maxShort * (heightBuffer[i] - minimumHeight) / heightRange;
-            }
-
-            var indicesTypedArray = IndexDatatype.IndexDatatype.createTypedArray(uBuffer.length, indices);
-
-            var encodedNormals;
-            if (hasVertexNormals) {
-                var normalArray = new Uint8Array(normalBuffer);
-                transferableObjects.push(vertices.buffer, indicesTypedArray.buffer, normalArray.buffer);
-                encodedNormals = normalArray.buffer;
-            } else {
-                transferableObjects.push(vertices.buffer, indicesTypedArray.buffer);
-            }
-
-            return {
-                vertices : vertices.buffer,
-                encodedNormals : encodedNormals,
-                indices : indicesTypedArray.buffer,
-                minimumHeight : minimumHeight,
-                maximumHeight : maximumHeight,
-                westIndices : westIndices,
-                southIndices : southIndices,
-                eastIndices : eastIndices,
-                northIndices : northIndices,
-                boundingSphere : boundingSphere,
-                orientedBoundingBox : orientedBoundingBox,
-                horizonOcclusionPoint : horizonOcclusionPoint
-            };
-        }
-
-        function Vertex() {
-            this.vertexBuffer = undefined;
-            this.index = undefined;
-            this.first = undefined;
-            this.second = undefined;
-            this.ratio = undefined;
-        }
-
-        Vertex.prototype.clone = function(result) {
-            if (!when.defined(result)) {
-                result = new Vertex();
-            }
-
-            result.uBuffer = this.uBuffer;
-            result.vBuffer = this.vBuffer;
-            result.heightBuffer = this.heightBuffer;
-            result.normalBuffer = this.normalBuffer;
-            result.index = this.index;
-            result.first = this.first;
-            result.second = this.second;
-            result.ratio = this.ratio;
-
-            return result;
-        };
-
-        Vertex.prototype.initializeIndexed = function(uBuffer, vBuffer, heightBuffer, normalBuffer, index) {
-            this.uBuffer = uBuffer;
-            this.vBuffer = vBuffer;
-            this.heightBuffer = heightBuffer;
-            this.normalBuffer = normalBuffer;
-            this.index = index;
-            this.first = undefined;
-            this.second = undefined;
-            this.ratio = undefined;
-        };
-
-        Vertex.prototype.initializeFromClipResult = function(clipResult, index, vertices) {
-            var nextIndex = index + 1;
-
-            if (clipResult[index] !== -1) {
-                vertices[clipResult[index]].clone(this);
-            } else {
-                this.vertexBuffer = undefined;
-                this.index = undefined;
-                this.first = vertices[clipResult[nextIndex]];
-                ++nextIndex;
-                this.second = vertices[clipResult[nextIndex]];
-                ++nextIndex;
-                this.ratio = clipResult[nextIndex];
-                ++nextIndex;
-            }
-
-            return nextIndex;
-        };
-
-        Vertex.prototype.getKey = function() {
-            if (this.isIndexed()) {
-                return this.index;
-            }
-            return JSON.stringify({
-                first : this.first.getKey(),
-                second : this.second.getKey(),
-                ratio : this.ratio
-            });
-        };
-
-        Vertex.prototype.isIndexed = function() {
-            return when.defined(this.index);
-        };
-
-        Vertex.prototype.getH = function(parentMaximumHeight, parentMinimumHeight) {
-            if (when.defined(this.index)) {
-                return this.heightBuffer[this.index];
-            }
-            var firstH = this.first.getH(parentMaximumHeight, parentMinimumHeight);
-            var secondH = this.second.getH(parentMaximumHeight, parentMinimumHeight);
-            var realFH = parentMinimumHeight + firstH / maxShort * parentMaximumHeight;
-            var realSH = parentMinimumHeight + secondH / maxShort * parentMaximumHeight;
-            if(realFH === 0 || realSH === 0) {
-                return 0;
-            }
-            return _Math.CesiumMath.lerp(this.first.getH(), this.second.getH(), this.ratio);
-        };
-
-        Vertex.prototype.getU = function() {
-            if (when.defined(this.index)) {
-                return this.uBuffer[this.index];
-            }
-            return _Math.CesiumMath.lerp(this.first.getU(), this.second.getU(), this.ratio);
-        };
-
-        Vertex.prototype.getV = function() {
-            if (when.defined(this.index)) {
-                return this.vBuffer[this.index];
-            }
-            return _Math.CesiumMath.lerp(this.first.getV(), this.second.getV(), this.ratio);
-        };
-
-        var encodedScratch = new Cartesian2.Cartesian2();
-        // An upsampled triangle may be clipped twice before it is assigned an index
-        // In this case, we need a buffer to handle the recursion of getNormalX() and getNormalY().
-        var depth = -1;
-        var cartesianScratch1 = [new Cartographic.Cartesian3(), new Cartographic.Cartesian3()];
-        var cartesianScratch2 = [new Cartographic.Cartesian3(), new Cartographic.Cartesian3()];
-        function lerpOctEncodedNormal(vertex, result) {
-            ++depth;
-
-            var first = cartesianScratch1[depth];
-            var second = cartesianScratch2[depth];
-
-            first = AttributeCompression.AttributeCompression.octDecode(vertex.first.getNormalX(), vertex.first.getNormalY(), first);
-            second = AttributeCompression.AttributeCompression.octDecode(vertex.second.getNormalX(), vertex.second.getNormalY(), second);
-            cartesian3Scratch = Cartographic.Cartesian3.lerp(first, second, vertex.ratio, cartesian3Scratch);
-            Cartographic.Cartesian3.normalize(cartesian3Scratch, cartesian3Scratch);
-
-            AttributeCompression.AttributeCompression.octEncode(cartesian3Scratch, result);
-
-            --depth;
-
-            return result;
-        }
-
-        Vertex.prototype.getNormalX = function() {
-            if (when.defined(this.index)) {
-                return this.normalBuffer[this.index * 2];
-            }
-
-            encodedScratch = lerpOctEncodedNormal(this, encodedScratch);
-            return encodedScratch.x;
-        };
-
-        Vertex.prototype.getNormalY = function() {
-            if (when.defined(this.index)) {
-                return this.normalBuffer[this.index * 2 + 1];
-            }
-
-            encodedScratch = lerpOctEncodedNormal(this, encodedScratch);
-            return encodedScratch.y;
-        };
-
-        var polygonVertices = [];
-        polygonVertices.push(new Vertex());
-        polygonVertices.push(new Vertex());
-        polygonVertices.push(new Vertex());
-        polygonVertices.push(new Vertex());
-
-        function addClippedPolygon(uBuffer, vBuffer, heightBuffer, normalBuffer, indices, vertexMap, clipped, triangleVertices, hasVertexNormals, parentMaximumHeight, parentMinimumHeight) {
-            if (clipped.length === 0) {
-                return;
-            }
-
-            var numVertices = 0;
-            var clippedIndex = 0;
-            while (clippedIndex < clipped.length) {
-                clippedIndex = polygonVertices[numVertices++].initializeFromClipResult(clipped, clippedIndex, triangleVertices);
-            }
-
-            for (var i = 0; i < numVertices; ++i) {
-                var polygonVertex = polygonVertices[i];
-                if (!polygonVertex.isIndexed()) {
-                    var key = polygonVertex.getKey();
-                    if (when.defined(vertexMap[key])) {
-                        polygonVertex.newIndex = vertexMap[key];
-                    } else {
-                        var newIndex = uBuffer.length;
-                        uBuffer.push(polygonVertex.getU());
-                        vBuffer.push(polygonVertex.getV());
-                        heightBuffer.push(polygonVertex.getH(parentMaximumHeight, parentMinimumHeight));
-                        if (hasVertexNormals) {
-                            normalBuffer.push(polygonVertex.getNormalX());
-                            normalBuffer.push(polygonVertex.getNormalY());
-                        }
-                        polygonVertex.newIndex = newIndex;
-                        vertexMap[key] = newIndex;
-                    }
-                } else {
-                    polygonVertex.newIndex = vertexMap[polygonVertex.index];
-                    polygonVertex.uBuffer = uBuffer;
-                    polygonVertex.vBuffer = vBuffer;
-                    polygonVertex.heightBuffer = heightBuffer;
-                    if (hasVertexNormals) {
-                        polygonVertex.normalBuffer = normalBuffer;
-                    }
-                }
-            }
-
-            if (numVertices === 3) {
-                // A triangle.
-                indices.push(polygonVertices[0].newIndex);
-                indices.push(polygonVertices[1].newIndex);
-                indices.push(polygonVertices[2].newIndex);
-            } else if (numVertices === 4) {
-                // A quad - two triangles.
-                indices.push(polygonVertices[0].newIndex);
-                indices.push(polygonVertices[1].newIndex);
-                indices.push(polygonVertices[2].newIndex);
-
-                indices.push(polygonVertices[0].newIndex);
-                indices.push(polygonVertices[2].newIndex);
-                indices.push(polygonVertices[3].newIndex);
-            }
-        }
-    var upsampleQuantizedTerrainMesh$1 = createTaskProcessorWorker(upsampleQuantizedTerrainMesh);
-
-    return upsampleQuantizedTerrainMesh$1;
-
-});
diff --git a/public/libs/Cesium/Workers/when-8d13db60.js b/public/libs/Cesium/Workers/when-8d13db60.js
deleted file mode 100644
index 9544409..0000000
--- a/public/libs/Cesium/Workers/when-8d13db60.js
+++ /dev/null
@@ -1,913 +0,0 @@
-/**
- * Cesium - https://github.com/CesiumGS/cesium
- *
- * Copyright 2011-2020 Cesium Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Columbus View (Pat. Pend.)
- *
- * Portions licensed separately.
- * See https://github.com/CesiumGS/cesium/blob/master/LICENSE.md for full licensing details.
- */
-define(['exports'], function (exports) { 'use strict';
-
-    /**
-         * @exports defined
-         *
-         * @param {*} value The object.
-         * @returns {Boolean} Returns true if the object is defined, returns false otherwise.
-         *
-         * @example
-         * if (Cesium.defined(positions)) {
-         *      doSomething();
-         * } else {
-         *      doSomethingElse();
-         * }
-         */
-        function defined(value) {
-            return value !== undefined && value !== null;
-        }
-
-    /**
-         * Returns the first parameter if not undefined, otherwise the second parameter.
-         * Useful for setting a default value for a parameter.
-         *
-         * @exports defaultValue
-         *
-         * @param {*} a
-         * @param {*} b
-         * @returns {*} Returns the first parameter if not undefined, otherwise the second parameter.
-         *
-         * @example
-         * param = Cesium.defaultValue(param, 'default');
-         */
-        function defaultValue(a, b) {
-            if (a !== undefined && a !== null) {
-                return a;
-            }
-            return b;
-        }
-
-        /**
-         * A frozen empty object that can be used as the default value for options passed as
-         * an object literal.
-         * @type {Object}
-         */
-        defaultValue.EMPTY_OBJECT = Object.freeze({});
-
-    /**
-      @license
-      when.js - https://github.com/cujojs/when
-
-      MIT License (c) copyright B Cavalier & J Hann
-
-     * A lightweight CommonJS Promises/A and when() implementation
-     * when is part of the cujo.js family of libraries (http://cujojs.com/)
-     *
-     * Licensed under the MIT License at:
-     * http://www.opensource.org/licenses/mit-license.php
-     *
-     * @version 1.7.1
-     */
-
-    	var reduceArray, slice, undef;
-
-    	//
-    	// Public API
-    	//
-
-    	when.defer     = defer;     // Create a deferred
-    	when.resolve   = resolve;   // Create a resolved promise
-    	when.reject    = reject;    // Create a rejected promise
-
-    	when.join      = join;      // Join 2 or more promises
-
-    	when.all       = all;       // Resolve a list of promises
-    	when.map       = map;       // Array.map() for promises
-    	when.reduce    = reduce;    // Array.reduce() for promises
-
-    	when.any       = any;       // One-winner race
-    	when.some      = some;      // Multi-winner race
-
-    	when.allSettled = allSettled; // Resolve a list of promises no reject
-
-    	when.chain     = chain;     // Make a promise trigger another resolver
-
-    	when.isPromise = isPromise; // Determine if a thing is a promise
-
-    	/**
-    	 * Register an observer for a promise or immediate value.
-    	 *
-    	 * @param {*} promiseOrValue
-    	 * @param {function?} [onFulfilled] callback to be called when promiseOrValue is
-    	 *   successfully fulfilled.  If promiseOrValue is an immediate value, callback
-    	 *   will be invoked immediately.
-    	 * @param {function?} [onRejected] callback to be called when promiseOrValue is
-    	 *   rejected.
-    	 * @param {function?} [onProgress] callback to be called when progress updates
-    	 *   are issued for promiseOrValue.
-    	 * @returns {Promise} a new {@link Promise} that will complete with the return
-    	 *   value of callback or errback or the completion value of promiseOrValue if
-    	 *   callback and/or errback is not supplied.
-    	 */
-    	function when(promiseOrValue, onFulfilled, onRejected, onProgress) {
-    		// Get a trusted promise for the input promiseOrValue, and then
-    		// register promise handlers
-    		return resolve(promiseOrValue).then(onFulfilled, onRejected, onProgress);
-    	}
-
-    	/**
-    	 * Returns promiseOrValue if promiseOrValue is a {@link Promise}, a new Promise if
-    	 * promiseOrValue is a foreign promise, or a new, already-fulfilled {@link Promise}
-    	 * whose value is promiseOrValue if promiseOrValue is an immediate value.
-    	 *
-    	 * @param {*} promiseOrValue
-    	 * @returns Guaranteed to return a trusted Promise.  If promiseOrValue is a when.js {@link Promise}
-    	 *   returns promiseOrValue, otherwise, returns a new, already-resolved, when.js {@link Promise}
-    	 *   whose resolution value is:
-    	 *   * the resolution value of promiseOrValue if it's a foreign promise, or
-    	 *   * promiseOrValue if it's a value
-    	 */
-    	function resolve(promiseOrValue) {
-    		var promise, deferred;
-
-    		if(promiseOrValue instanceof Promise) {
-    			// It's a when.js promise, so we trust it
-    			promise = promiseOrValue;
-
-    		} else {
-    			// It's not a when.js promise. See if it's a foreign promise or a value.
-    			if(isPromise(promiseOrValue)) {
-    				// It's a thenable, but we don't know where it came from, so don't trust
-    				// its implementation entirely.  Introduce a trusted middleman when.js promise
-    				deferred = defer();
-
-    				// IMPORTANT: This is the only place when.js should ever call .then() on an
-    				// untrusted promise. Don't expose the return value to the untrusted promise
-    				promiseOrValue.then(
-    					function(value)  { deferred.resolve(value); },
-    					function(reason) { deferred.reject(reason); },
-    					function(update) { deferred.progress(update); }
-    				);
-
-    				promise = deferred.promise;
-
-    			} else {
-    				// It's a value, not a promise.  Create a resolved promise for it.
-    				promise = fulfilled(promiseOrValue);
-    			}
-    		}
-
-    		return promise;
-    	}
-
-    	/**
-    	 * Returns a rejected promise for the supplied promiseOrValue.  The returned
-    	 * promise will be rejected with:
-    	 * - promiseOrValue, if it is a value, or
-    	 * - if promiseOrValue is a promise
-    	 *   - promiseOrValue's value after it is fulfilled
-    	 *   - promiseOrValue's reason after it is rejected
-    	 * @param {*} promiseOrValue the rejected value of the returned {@link Promise}
-    	 * @returns {Promise} rejected {@link Promise}
-    	 */
-    	function reject(promiseOrValue) {
-    		return when(promiseOrValue, rejected);
-    	}
-
-    	/**
-    	 * Trusted Promise constructor.  A Promise created from this constructor is
-    	 * a trusted when.js promise.  Any other duck-typed promise is considered
-    	 * untrusted.
-    	 * @constructor
-    	 * @name Promise
-    	 */
-    	function Promise(then) {
-    		this.then = then;
-    	}
-
-    	Promise.prototype = {
-    		/**
-    		 * Register a callback that will be called when a promise is
-    		 * fulfilled or rejected.  Optionally also register a progress handler.
-    		 * Shortcut for .then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress)
-    		 * @param {function?} [onFulfilledOrRejected]
-    		 * @param {function?} [onProgress]
-    		 * @returns {Promise}
-    		 */
-    		always: function(onFulfilledOrRejected, onProgress) {
-    			return this.then(onFulfilledOrRejected, onFulfilledOrRejected, onProgress);
-    		},
-
-    		/**
-    		 * Register a rejection handler.  Shortcut for .then(undefined, onRejected)
-    		 * @param {function?} onRejected
-    		 * @returns {Promise}
-    		 */
-    		otherwise: function(onRejected) {
-    			return this.then(undef, onRejected);
-    		},
-
-    		/**
-    		 * Shortcut for .then(function() { return value; })
-    		 * @param  {*} value
-    		 * @returns {Promise} a promise that:
-    		 *  - is fulfilled if value is not a promise, or
-    		 *  - if value is a promise, will fulfill with its value, or reject
-    		 *    with its reason.
-    		 */
-    		yield: function(value) {
-    			return this.then(function() {
-    				return value;
-    			});
-    		},
-
-    		/**
-    		 * Assumes that this promise will fulfill with an array, and arranges
-    		 * for the onFulfilled to be called with the array as its argument list
-    		 * i.e. onFulfilled.spread(undefined, array).
-    		 * @param {function} onFulfilled function to receive spread arguments
-    		 * @returns {Promise}
-    		 */
-    		spread: function(onFulfilled) {
-    			return this.then(function(array) {
-    				// array may contain promises, so resolve its contents.
-    				return all(array, function(array) {
-    					return onFulfilled.apply(undef, array);
-    				});
-    			});
-    		}
-    	};
-
-    	/**
-    	 * Create an already-resolved promise for the supplied value
-    	 * @private
-    	 *
-    	 * @param {*} value
-    	 * @returns {Promise} fulfilled promise
-    	 */
-    	function fulfilled(value) {
-    		var p = new Promise(function(onFulfilled) {
-    			// TODO: Promises/A+ check typeof onFulfilled
-    			try {
-    				return resolve(onFulfilled ? onFulfilled(value) : value);
-    			} catch(e) {
-    				return rejected(e);
-    			}
-    		});
-
-    		return p;
-    	}
-
-    	/**
-    	 * Create an already-rejected {@link Promise} with the supplied
-    	 * rejection reason.
-    	 * @private
-    	 *
-    	 * @param {*} reason
-    	 * @returns {Promise} rejected promise
-    	 */
-    	function rejected(reason) {
-    		var p = new Promise(function(_, onRejected) {
-    			// TODO: Promises/A+ check typeof onRejected
-    			try {
-    				return onRejected ? resolve(onRejected(reason)) : rejected(reason);
-    			} catch(e) {
-    				return rejected(e);
-    			}
-    		});
-
-    		return p;
-    	}
-
-    	/**
-    	 * Creates a new, Deferred with fully isolated resolver and promise parts,
-    	 * either or both of which may be given out safely to consumers.
-    	 * The Deferred itself has the full API: resolve, reject, progress, and
-    	 * then. The resolver has resolve, reject, and progress.  The promise
-    	 * only has then.
-    	 *
-    	 * @returns {Deferred}
-    	 */
-    	function defer() {
-    		var deferred, promise, handlers, progressHandlers,
-    			_then, _progress, _resolve;
-
-    		/**
-    		 * The promise for the new deferred
-    		 * @type {Promise}
-    		 */
-    		promise = new Promise(then);
-
-    		/**
-    		 * The full Deferred object, with {@link Promise} and {@link Resolver} parts
-    		 * @class Deferred
-    		 * @name Deferred
-    		 */
-    		deferred = {
-    			then:     then, // DEPRECATED: use deferred.promise.then
-    			resolve:  promiseResolve,
-    			reject:   promiseReject,
-    			// TODO: Consider renaming progress() to notify()
-    			progress: promiseProgress,
-
-    			promise:  promise,
-
-    			resolver: {
-    				resolve:  promiseResolve,
-    				reject:   promiseReject,
-    				progress: promiseProgress
-    			}
-    		};
-
-    		handlers = [];
-    		progressHandlers = [];
-
-    		/**
-    		 * Pre-resolution then() that adds the supplied callback, errback, and progback
-    		 * functions to the registered listeners
-    		 * @private
-    		 *
-    		 * @param {function?} [onFulfilled] resolution handler
-    		 * @param {function?} [onRejected] rejection handler
-    		 * @param {function?} [onProgress] progress handler
-    		 */
-    		_then = function(onFulfilled, onRejected, onProgress) {
-    			// TODO: Promises/A+ check typeof onFulfilled, onRejected, onProgress
-    			var deferred, progressHandler;
-
-    			deferred = defer();
-
-    			progressHandler = typeof onProgress === 'function'
-    				? function(update) {
-    					try {
-    						// Allow progress handler to transform progress event
-    						deferred.progress(onProgress(update));
-    					} catch(e) {
-    						// Use caught value as progress
-    						deferred.progress(e);
-    					}
-    				}
-    				: function(update) { deferred.progress(update); };
-
-    			handlers.push(function(promise) {
-    				promise.then(onFulfilled, onRejected)
-    					.then(deferred.resolve, deferred.reject, progressHandler);
-    			});
-
-    			progressHandlers.push(progressHandler);
-
-    			return deferred.promise;
-    		};
-
-    		/**
-    		 * Issue a progress event, notifying all progress listeners
-    		 * @private
-    		 * @param {*} update progress event payload to pass to all listeners
-    		 */
-    		_progress = function(update) {
-    			processQueue(progressHandlers, update);
-    			return update;
-    		};
-
-    		/**
-    		 * Transition from pre-resolution state to post-resolution state, notifying
-    		 * all listeners of the resolution or rejection
-    		 * @private
-    		 * @param {*} value the value of this deferred
-    		 */
-    		_resolve = function(value) {
-    			value = resolve(value);
-
-    			// Replace _then with one that directly notifies with the result.
-    			_then = value.then;
-    			// Replace _resolve so that this Deferred can only be resolved once
-    			_resolve = resolve;
-    			// Make _progress a noop, to disallow progress for the resolved promise.
-    			_progress = noop;
-
-    			// Notify handlers
-    			processQueue(handlers, value);
-
-    			// Free progressHandlers array since we'll never issue progress events
-    			progressHandlers = handlers = undef;
-
-    			return value;
-    		};
-
-    		return deferred;
-
-    		/**
-    		 * Wrapper to allow _then to be replaced safely
-    		 * @param {function?} [onFulfilled] resolution handler
-    		 * @param {function?} [onRejected] rejection handler
-    		 * @param {function?} [onProgress] progress handler
-    		 * @returns {Promise} new promise
-    		 */
-    		function then(onFulfilled, onRejected, onProgress) {
-    			// TODO: Promises/A+ check typeof onFulfilled, onRejected, onProgress
-    			return _then(onFulfilled, onRejected, onProgress);
-    		}
-
-    		/**
-    		 * Wrapper to allow _resolve to be replaced
-    		 */
-    		function promiseResolve(val) {
-    			return _resolve(val);
-    		}
-
-    		/**
-    		 * Wrapper to allow _reject to be replaced
-    		 */
-    		function promiseReject(err) {
-    			return _resolve(rejected(err));
-    		}
-
-    		/**
-    		 * Wrapper to allow _progress to be replaced
-    		 */
-    		function promiseProgress(update) {
-    			return _progress(update);
-    		}
-    	}
-
-    	/**
-    	 * Determines if promiseOrValue is a promise or not.  Uses the feature
-    	 * test from http://wiki.commonjs.org/wiki/Promises/A to determine if
-    	 * promiseOrValue is a promise.
-    	 *
-    	 * @param {*} promiseOrValue anything
-    	 * @returns {boolean} true if promiseOrValue is a {@link Promise}
-    	 */
-    	function isPromise(promiseOrValue) {
-    		return promiseOrValue && typeof promiseOrValue.then === 'function';
-    	}
-
-    	/**
-    	 * Initiates a competitive race, returning a promise that will resolve when
-    	 * howMany of the supplied promisesOrValues have resolved, or will reject when
-    	 * it becomes impossible for howMany to resolve, for example, when
-    	 * (promisesOrValues.length - howMany) + 1 input promises reject.
-    	 *
-    	 * @param {Array} promisesOrValues array of anything, may contain a mix
-    	 *      of promises and values
-    	 * @param howMany {number} number of promisesOrValues to resolve
-    	 * @param {function?} [onFulfilled] resolution handler
-    	 * @param {function?} [onRejected] rejection handler
-    	 * @param {function?} [onProgress] progress handler
-    	 * @returns {Promise} promise that will resolve to an array of howMany values that
-    	 * resolved first, or will reject with an array of (promisesOrValues.length - howMany) + 1
-    	 * rejection reasons.
-    	 */
-    	function some(promisesOrValues, howMany, onFulfilled, onRejected, onProgress) {
-
-    		checkCallbacks(2, arguments);
-
-    		return when(promisesOrValues, function(promisesOrValues) {
-
-    			var toResolve, toReject, values, reasons, deferred, fulfillOne, rejectOne, progress, len, i;
-
-    			len = promisesOrValues.length >>> 0;
-
-    			toResolve = Math.max(0, Math.min(howMany, len));
-    			values = [];
-
-    			toReject = (len - toResolve) + 1;
-    			reasons = [];
-
-    			deferred = defer();
-
-    			// No items in the input, resolve immediately
-    			if (!toResolve) {
-    				deferred.resolve(values);
-
-    			} else {
-    				progress = deferred.progress;
-
-    				rejectOne = function(reason) {
-    					reasons.push(reason);
-    					if(!--toReject) {
-    						fulfillOne = rejectOne = noop;
-    						deferred.reject(reasons);
-    					}
-    				};
-
-    				fulfillOne = function(val) {
-    					// This orders the values based on promise resolution order
-    					// Another strategy would be to use the original position of
-    					// the corresponding promise.
-    					values.push(val);
-
-    					if (!--toResolve) {
-    						fulfillOne = rejectOne = noop;
-    						deferred.resolve(values);
-    					}
-    				};
-
-    				for(i = 0; i < len; ++i) {
-    					if(i in promisesOrValues) {
-    						when(promisesOrValues[i], fulfiller, rejecter, progress);
-    					}
-    				}
-    			}
-
-    			return deferred.then(onFulfilled, onRejected, onProgress);
-
-    			function rejecter(reason) {
-    				rejectOne(reason);
-    			}
-
-    			function fulfiller(val) {
-    				fulfillOne(val);
-    			}
-
-    		});
-    	}
-
-
-    function allSettled(promisesOrValues, onFulfilled, onRejected, onProgress) {
-
-        checkCallbacks(1, arguments);
-
-        return when(promisesOrValues, function(promisesOrValues) {
-
-            var values, reasons, deferred, fulfillOne, rejectOne, progress, len, dealLen, i;
-
-            len = promisesOrValues.length >>> 0;
-
-            dealLen = promisesOrValues.length >>> 0;
-
-
-            values = [];
-
-            reasons = [];
-
-            deferred = defer();
-
-            progress = deferred.progress;
-
-            rejectOne = function(reason) {
-                reasons.push(reason);
-
-                if(!--dealLen) {
-                    fulfillOne = rejectOne = noop;
-                    deferred.resolve(values);
-                }
-            };
-
-            fulfillOne = function(val, index) {
-                // This orders the values based on promise resolution order
-                // Another strategy would be to use the original position of
-                // the corresponding promise.
-
-                values[index] = val;
-
-                if(!--dealLen) {
-                    fulfillOne = rejectOne = noop;
-                    deferred.resolve(values);
-                }
-            };
-
-            for(i = 0; i < len; ++i) {
-
-                switch (i) {
-                    case 0:
-                        when(promisesOrValues[i], fulfiller0, rejecter, progress);
-                        break;
-                    case 1:
-                        when(promisesOrValues[i], fulfiller1, rejecter, progress);
-                        break;
-                    case 2:
-                        when(promisesOrValues[i], fulfiller2, rejecter, progress);
-                        break;
-                    case 3:
-                        when(promisesOrValues[i], fulfiller3, rejecter, progress);
-                        break;
-                    case 4:
-                        when(promisesOrValues[i], fulfiller4, rejecter, progress);
-                        break;
-                    default:
-                        when(promisesOrValues[i], fulfiller, rejecter, progress);
-                        break;
-                }
-            }
-
-
-            return deferred.then(onFulfilled, onRejected, onProgress);
-
-            function rejecter(reason) {
-                rejectOne(reason);
-            }
-
-            function fulfiller(val) {
-                fulfillOne(val,0);
-            }
-
-            function fulfiller0(val) {
-                fulfillOne(val,0);
-            }
-
-            function fulfiller1(val) {
-                fulfillOne(val,1);
-            }
-
-            function fulfiller2(val) {
-                fulfillOne(val,2);
-            }
-
-            function fulfiller3(val) {
-                fulfillOne(val,3);
-            }
-
-            function fulfiller4(val) {
-                fulfillOne(val,4);
-            }
-
-        });
-    }
-
-    	/**
-    	 * Initiates a competitive race, returning a promise that will resolve when
-    	 * any one of the supplied promisesOrValues has resolved or will reject when
-    	 * *all* promisesOrValues have rejected.
-    	 *
-    	 * @param {Array|Promise} promisesOrValues array of anything, may contain a mix
-    	 *      of {@link Promise}s and values
-    	 * @param {function?} [onFulfilled] resolution handler
-    	 * @param {function?} [onRejected] rejection handler
-    	 * @param {function?} [onProgress] progress handler
-    	 * @returns {Promise} promise that will resolve to the value that resolved first, or
-    	 * will reject with an array of all rejected inputs.
-    	 */
-    	function any(promisesOrValues, onFulfilled, onRejected, onProgress) {
-
-    		function unwrapSingleResult(val) {
-    			return onFulfilled ? onFulfilled(val[0]) : val[0];
-    		}
-
-    		return some(promisesOrValues, 1, unwrapSingleResult, onRejected, onProgress);
-    	}
-
-    	/**
-    	 * Return a promise that will resolve only once all the supplied promisesOrValues
-    	 * have resolved. The resolution value of the returned promise will be an array
-    	 * containing the resolution values of each of the promisesOrValues.
-    	 * @memberOf when
-    	 *
-    	 * @param {Array|Promise} promisesOrValues array of anything, may contain a mix
-    	 *      of {@link Promise}s and values
-    	 * @param {function?} [onFulfilled] resolution handler
-    	 * @param {function?} [onRejected] rejection handler
-    	 * @param {function?} [onProgress] progress handler
-    	 * @returns {Promise}
-    	 */
-    	function all(promisesOrValues, onFulfilled, onRejected, onProgress) {
-    		checkCallbacks(1, arguments);
-    		return map(promisesOrValues, identity).then(onFulfilled, onRejected, onProgress);
-    	}
-
-    	/**
-    	 * Joins multiple promises into a single returned promise.
-    	 * @returns {Promise} a promise that will fulfill when *all* the input promises
-    	 * have fulfilled, or will reject when *any one* of the input promises rejects.
-    	 */
-    	function join(/* ...promises */) {
-    		return map(arguments, identity);
-    	}
-
-    	/**
-    	 * Traditional map function, similar to `Array.prototype.map()`, but allows
-    	 * input to contain {@link Promise}s and/or values, and mapFunc may return
-    	 * either a value or a {@link Promise}
-    	 *
-    	 * @param {Array|Promise} promise array of anything, may contain a mix
-    	 *      of {@link Promise}s and values
-    	 * @param {function} mapFunc mapping function mapFunc(value) which may return
-    	 *      either a {@link Promise} or value
-    	 * @returns {Promise} a {@link Promise} that will resolve to an array containing
-    	 *      the mapped output values.
-    	 */
-    	function map(promise, mapFunc) {
-    		return when(promise, function(array) {
-    			var results, len, toResolve, resolve, i, d;
-
-    			// Since we know the resulting length, we can preallocate the results
-    			// array to avoid array expansions.
-    			toResolve = len = array.length >>> 0;
-    			results = [];
-    			d = defer();
-
-    			if(!toResolve) {
-    				d.resolve(results);
-    			} else {
-
-    				resolve = function resolveOne(item, i) {
-    					when(item, mapFunc).then(function(mapped) {
-    						results[i] = mapped;
-
-    						if(!--toResolve) {
-    							d.resolve(results);
-    						}
-    					}, d.reject);
-    				};
-
-    				// Since mapFunc may be async, get all invocations of it into flight
-    				for(i = 0; i < len; i++) {
-    					if(i in array) {
-    						resolve(array[i], i);
-    					} else {
-    						--toResolve;
-    					}
-    				}
-
-    			}
-
-    			return d.promise;
-
-    		});
-    	}
-
-    	/**
-    	 * Traditional reduce function, similar to `Array.prototype.reduce()`, but
-    	 * input may contain promises and/or values, and reduceFunc
-    	 * may return either a value or a promise, *and* initialValue may
-    	 * be a promise for the starting value.
-    	 *
-    	 * @param {Array|Promise} promise array or promise for an array of anything,
-    	 *      may contain a mix of promises and values.
-    	 * @param {function} reduceFunc reduce function reduce(currentValue, nextValue, index, total),
-    	 *      where total is the total number of items being reduced, and will be the same
-    	 *      in each call to reduceFunc.
-    	 * @returns {Promise} that will resolve to the final reduced value
-    	 */
-    	function reduce(promise, reduceFunc /*, initialValue */) {
-    		var args = slice.call(arguments, 1);
-
-    		return when(promise, function(array) {
-    			var total;
-
-    			total = array.length;
-
-    			// Wrap the supplied reduceFunc with one that handles promises and then
-    			// delegates to the supplied.
-    			args[0] = function (current, val, i) {
-    				return when(current, function (c) {
-    					return when(val, function (value) {
-    						return reduceFunc(c, value, i, total);
-    					});
-    				});
-    			};
-
-    			return reduceArray.apply(array, args);
-    		});
-    	}
-
-    	/**
-    	 * Ensure that resolution of promiseOrValue will trigger resolver with the
-    	 * value or reason of promiseOrValue, or instead with resolveValue if it is provided.
-    	 *
-    	 * @param promiseOrValue
-    	 * @param {Object} resolver
-    	 * @param {function} resolver.resolve
-    	 * @param {function} resolver.reject
-    	 * @param {*} [resolveValue]
-    	 * @returns {Promise}
-    	 */
-    	function chain(promiseOrValue, resolver, resolveValue) {
-    		var useResolveValue = arguments.length > 2;
-
-    		return when(promiseOrValue,
-    			function(val) {
-    				val = useResolveValue ? resolveValue : val;
-    				resolver.resolve(val);
-    				return val;
-    			},
-    			function(reason) {
-    				resolver.reject(reason);
-    				return rejected(reason);
-    			},
-    			resolver.progress
-    		);
-    	}
-
-    	//
-    	// Utility functions
-    	//
-
-    	/**
-    	 * Apply all functions in queue to value
-    	 * @param {Array} queue array of functions to execute
-    	 * @param {*} value argument passed to each function
-    	 */
-    	function processQueue(queue, value) {
-    		var handler, i = 0;
-
-    		while (handler = queue[i++]) {
-    			handler(value);
-    		}
-    	}
-
-    	/**
-    	 * Helper that checks arrayOfCallbacks to ensure that each element is either
-    	 * a function, or null or undefined.
-    	 * @private
-    	 * @param {number} start index at which to start checking items in arrayOfCallbacks
-    	 * @param {Array} arrayOfCallbacks array to check
-    	 * @throws {Error} if any element of arrayOfCallbacks is something other than
-    	 * a functions, null, or undefined.
-    	 */
-    	function checkCallbacks(start, arrayOfCallbacks) {
-    		// TODO: Promises/A+ update type checking and docs
-    		var arg, i = arrayOfCallbacks.length;
-
-    		while(i > start) {
-    			arg = arrayOfCallbacks[--i];
-
-    			if (arg != null && typeof arg != 'function') {
-    				throw new Error('arg '+i+' must be a function');
-    			}
-    		}
-    	}
-
-    	/**
-    	 * No-Op function used in method replacement
-    	 * @private
-    	 */
-    	function noop() {}
-
-    	slice = [].slice;
-
-    	// ES5 reduce implementation if native not available
-    	// See: http://es5.github.com/#x15.4.4.21 as there are many
-    	// specifics and edge cases.
-    	reduceArray = [].reduce ||
-    		function(reduceFunc /*, initialValue */) {
-    			/*jshint maxcomplexity: 7*/
-
-    			// ES5 dictates that reduce.length === 1
-
-    			// This implementation deviates from ES5 spec in the following ways:
-    			// 1. It does not check if reduceFunc is a Callable
-
-    			var arr, args, reduced, len, i;
-
-    			i = 0;
-    			// This generates a jshint warning, despite being valid
-    			// "Missing 'new' prefix when invoking a constructor."
-    			// See https://github.com/jshint/jshint/issues/392
-    			arr = Object(this);
-    			len = arr.length >>> 0;
-    			args = arguments;
-
-    			// If no initialValue, use first item of array (we know length !== 0 here)
-    			// and adjust i to start at second item
-    			if(args.length <= 1) {
-    				// Skip to the first real element in the array
-    				for(;;) {
-    					if(i in arr) {
-    						reduced = arr[i++];
-    						break;
-    					}
-
-    					// If we reached the end of the array without finding any real
-    					// elements, it's a TypeError
-    					if(++i >= len) {
-    						throw new TypeError();
-    					}
-    				}
-    			} else {
-    				// If initialValue provided, use it
-    				reduced = args[1];
-    			}
-
-    			// Do the actual reduce
-    			for(;i < len; ++i) {
-    				// Skip holes
-    				if(i in arr) {
-    					reduced = reduceFunc(reduced, arr[i], i, arr);
-    				}
-    			}
-
-    			return reduced;
-    		};
-
-    	function identity(x) {
-    		return x;
-    	}
-
-    exports.defaultValue = defaultValue;
-    exports.defined = defined;
-    exports.when = when;
-
-});
diff --git a/public/pfd/build/generic/web/cmaps/Adobe-Japan1-5.bcmap b/public/pfd/build/generic/web/cmaps/Adobe-Japan1-5.bcmap
deleted file mode 100644
index 5b4b65c..0000000
--- a/public/pfd/build/generic/web/cmaps/Adobe-Japan1-5.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Adobe-Japan1-6.bcmap b/public/pfd/build/generic/web/cmaps/Adobe-Japan1-6.bcmap
deleted file mode 100644
index e77d699..0000000
--- a/public/pfd/build/generic/web/cmaps/Adobe-Japan1-6.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Adobe-Japan1-UCS2.bcmap b/public/pfd/build/generic/web/cmaps/Adobe-Japan1-UCS2.bcmap
deleted file mode 100644
index 128a141..0000000
--- a/public/pfd/build/generic/web/cmaps/Adobe-Japan1-UCS2.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Adobe-Korea1-0.bcmap b/public/pfd/build/generic/web/cmaps/Adobe-Korea1-0.bcmap
deleted file mode 100644
index cef1a99..0000000
--- a/public/pfd/build/generic/web/cmaps/Adobe-Korea1-0.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Adobe-Korea1-1.bcmap b/public/pfd/build/generic/web/cmaps/Adobe-Korea1-1.bcmap
deleted file mode 100644
index 11ffa36..0000000
--- a/public/pfd/build/generic/web/cmaps/Adobe-Korea1-1.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Adobe-Korea1-2.bcmap b/public/pfd/build/generic/web/cmaps/Adobe-Korea1-2.bcmap
deleted file mode 100644
index 3172308..0000000
--- a/public/pfd/build/generic/web/cmaps/Adobe-Korea1-2.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Adobe-Korea1-UCS2.bcmap b/public/pfd/build/generic/web/cmaps/Adobe-Korea1-UCS2.bcmap
deleted file mode 100644
index f3371c0..0000000
--- a/public/pfd/build/generic/web/cmaps/Adobe-Korea1-UCS2.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/B5-H.bcmap b/public/pfd/build/generic/web/cmaps/B5-H.bcmap
deleted file mode 100644
index beb4d22..0000000
--- a/public/pfd/build/generic/web/cmaps/B5-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/B5-V.bcmap b/public/pfd/build/generic/web/cmaps/B5-V.bcmap
deleted file mode 100644
index 2d4f87d..0000000
--- a/public/pfd/build/generic/web/cmaps/B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/B5pc-H.bcmap b/public/pfd/build/generic/web/cmaps/B5pc-H.bcmap
deleted file mode 100644
index ce00131..0000000
--- a/public/pfd/build/generic/web/cmaps/B5pc-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/B5pc-V.bcmap b/public/pfd/build/generic/web/cmaps/B5pc-V.bcmap
deleted file mode 100644
index 73b99ff..0000000
--- a/public/pfd/build/generic/web/cmaps/B5pc-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/CNS-EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/CNS-EUC-H.bcmap
deleted file mode 100644
index 61d1d0c..0000000
--- a/public/pfd/build/generic/web/cmaps/CNS-EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/CNS-EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/CNS-EUC-V.bcmap
deleted file mode 100644
index 1a393a5..0000000
--- a/public/pfd/build/generic/web/cmaps/CNS-EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/CNS1-H.bcmap b/public/pfd/build/generic/web/cmaps/CNS1-H.bcmap
deleted file mode 100644
index f738e21..0000000
--- a/public/pfd/build/generic/web/cmaps/CNS1-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/CNS1-V.bcmap b/public/pfd/build/generic/web/cmaps/CNS1-V.bcmap
deleted file mode 100644
index 9c3169f..0000000
--- a/public/pfd/build/generic/web/cmaps/CNS1-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/CNS2-H.bcmap b/public/pfd/build/generic/web/cmaps/CNS2-H.bcmap
deleted file mode 100644
index c89b352..0000000
--- a/public/pfd/build/generic/web/cmaps/CNS2-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/CNS2-V.bcmap b/public/pfd/build/generic/web/cmaps/CNS2-V.bcmap
deleted file mode 100644
index 7588cec..0000000
--- a/public/pfd/build/generic/web/cmaps/CNS2-V.bcmap
+++ /dev/null
@@ -1,3 +0,0 @@
-�RCopyright 1990-2009 Adobe Systems Incorporated.
-All rights reserved.
-See ./LICENSE�CNS2-H
\ No newline at end of file
diff --git a/public/pfd/build/generic/web/cmaps/ETHK-B5-H.bcmap b/public/pfd/build/generic/web/cmaps/ETHK-B5-H.bcmap
deleted file mode 100644
index cb29415..0000000
--- a/public/pfd/build/generic/web/cmaps/ETHK-B5-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/ETHK-B5-V.bcmap b/public/pfd/build/generic/web/cmaps/ETHK-B5-V.bcmap
deleted file mode 100644
index f09aec6..0000000
--- a/public/pfd/build/generic/web/cmaps/ETHK-B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/ETen-B5-H.bcmap b/public/pfd/build/generic/web/cmaps/ETen-B5-H.bcmap
deleted file mode 100644
index c2d7746..0000000
--- a/public/pfd/build/generic/web/cmaps/ETen-B5-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/ETen-B5-V.bcmap b/public/pfd/build/generic/web/cmaps/ETen-B5-V.bcmap
deleted file mode 100644
index 89bff15..0000000
--- a/public/pfd/build/generic/web/cmaps/ETen-B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/ETenms-B5-H.bcmap b/public/pfd/build/generic/web/cmaps/ETenms-B5-H.bcmap
deleted file mode 100644
index a7d69db..0000000
--- a/public/pfd/build/generic/web/cmaps/ETenms-B5-H.bcmap
+++ /dev/null
@@ -1,3 +0,0 @@
-�RCopyright 1990-2009 Adobe Systems Incorporated.
-All rights reserved.
-See ./LICENSE�	ETen-B5-H` ^
\ No newline at end of file
diff --git a/public/pfd/build/generic/web/cmaps/ETenms-B5-V.bcmap b/public/pfd/build/generic/web/cmaps/ETenms-B5-V.bcmap
deleted file mode 100644
index adc5d61..0000000
--- a/public/pfd/build/generic/web/cmaps/ETenms-B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/EUC-H.bcmap
deleted file mode 100644
index e92ea5b..0000000
--- a/public/pfd/build/generic/web/cmaps/EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/EUC-V.bcmap
deleted file mode 100644
index 7a7c183..0000000
--- a/public/pfd/build/generic/web/cmaps/EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Ext-H.bcmap b/public/pfd/build/generic/web/cmaps/Ext-H.bcmap
deleted file mode 100644
index 3b5cde4..0000000
--- a/public/pfd/build/generic/web/cmaps/Ext-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Ext-RKSJ-H.bcmap b/public/pfd/build/generic/web/cmaps/Ext-RKSJ-H.bcmap
deleted file mode 100644
index ea4d2d9..0000000
--- a/public/pfd/build/generic/web/cmaps/Ext-RKSJ-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Ext-RKSJ-V.bcmap b/public/pfd/build/generic/web/cmaps/Ext-RKSJ-V.bcmap
deleted file mode 100644
index 3457c27..0000000
--- a/public/pfd/build/generic/web/cmaps/Ext-RKSJ-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Ext-V.bcmap b/public/pfd/build/generic/web/cmaps/Ext-V.bcmap
deleted file mode 100644
index 4999ca4..0000000
--- a/public/pfd/build/generic/web/cmaps/Ext-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GB-EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/GB-EUC-H.bcmap
deleted file mode 100644
index e39908b..0000000
--- a/public/pfd/build/generic/web/cmaps/GB-EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GB-EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/GB-EUC-V.bcmap
deleted file mode 100644
index d5be544..0000000
--- a/public/pfd/build/generic/web/cmaps/GB-EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GB-H.bcmap b/public/pfd/build/generic/web/cmaps/GB-H.bcmap
deleted file mode 100644
index 39189c5..0000000
--- a/public/pfd/build/generic/web/cmaps/GB-H.bcmap
+++ /dev/null
@@ -1,4 +0,0 @@
-�RCopyright 1990-2009 Adobe Systems Incorporated.
-All rights reserved.
-See ./LICENSE!!��]aX!!]`�21�>	�p�z�$]��"R�d�-U�7�*�
4�%�+ �Z �{�/�%�<�9K�b�1]�.�"��`]�,�"]�
-�"]�h�"]�F�"]�$�"]��"]�`�"]�>�"]��"]�z�"]�X�"]�6�"]��"]�r�"]�P�"]�.�"]��"]�j�"]�H�"]�&�"]��"]�b�"]�@�"]��"]�|�"]�Z�"]�8�"]��"]�t�"]�R�"]�0�"]��"]�l�"]�J�"]�(�"]��"]�d�"]�B�"]� �"X�~�']�W�"]�5�"]��"]�q�"]�O�"]�-�"]��"]�i�"]�G�"]�%�"]��"]�a�"]�?�"]��"]�{�"]�Y�"]�7�"]��"]�s�"]�Q�"]�/�"]�
�"]�k�"]�I�"]�'�"]��"]�c�"]�A�"]��"]�}�"]�[�"]�9
\ No newline at end of file
diff --git a/public/pfd/build/generic/web/cmaps/GB-V.bcmap b/public/pfd/build/generic/web/cmaps/GB-V.bcmap
deleted file mode 100644
index 3108345..0000000
--- a/public/pfd/build/generic/web/cmaps/GB-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBK-EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/GBK-EUC-H.bcmap
deleted file mode 100644
index 05fff7e..0000000
--- a/public/pfd/build/generic/web/cmaps/GBK-EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBK-EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/GBK-EUC-V.bcmap
deleted file mode 100644
index 0cdf6be..0000000
--- a/public/pfd/build/generic/web/cmaps/GBK-EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBK2K-H.bcmap b/public/pfd/build/generic/web/cmaps/GBK2K-H.bcmap
deleted file mode 100644
index 46f6ba5..0000000
--- a/public/pfd/build/generic/web/cmaps/GBK2K-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBK2K-V.bcmap b/public/pfd/build/generic/web/cmaps/GBK2K-V.bcmap
deleted file mode 100644
index d9a9479..0000000
--- a/public/pfd/build/generic/web/cmaps/GBK2K-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBKp-EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/GBKp-EUC-H.bcmap
deleted file mode 100644
index 5cb0af6..0000000
--- a/public/pfd/build/generic/web/cmaps/GBKp-EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBKp-EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/GBKp-EUC-V.bcmap
deleted file mode 100644
index bca93b8..0000000
--- a/public/pfd/build/generic/web/cmaps/GBKp-EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBT-EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/GBT-EUC-H.bcmap
deleted file mode 100644
index 4b4e2d3..0000000
--- a/public/pfd/build/generic/web/cmaps/GBT-EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBT-EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/GBT-EUC-V.bcmap
deleted file mode 100644
index 38f7066..0000000
--- a/public/pfd/build/generic/web/cmaps/GBT-EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBT-H.bcmap b/public/pfd/build/generic/web/cmaps/GBT-H.bcmap
deleted file mode 100644
index 8437ac3..0000000
--- a/public/pfd/build/generic/web/cmaps/GBT-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBT-V.bcmap b/public/pfd/build/generic/web/cmaps/GBT-V.bcmap
deleted file mode 100644
index 697ab4a..0000000
--- a/public/pfd/build/generic/web/cmaps/GBT-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBTpc-EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/GBTpc-EUC-H.bcmap
deleted file mode 100644
index f6e50e8..0000000
--- a/public/pfd/build/generic/web/cmaps/GBTpc-EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBTpc-EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/GBTpc-EUC-V.bcmap
deleted file mode 100644
index 6c0d71a..0000000
--- a/public/pfd/build/generic/web/cmaps/GBTpc-EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBpc-EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/GBpc-EUC-H.bcmap
deleted file mode 100644
index c9edf67..0000000
--- a/public/pfd/build/generic/web/cmaps/GBpc-EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/GBpc-EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/GBpc-EUC-V.bcmap
deleted file mode 100644
index 31450c9..0000000
--- a/public/pfd/build/generic/web/cmaps/GBpc-EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/H.bcmap b/public/pfd/build/generic/web/cmaps/H.bcmap
deleted file mode 100644
index 7b24ea4..0000000
--- a/public/pfd/build/generic/web/cmaps/H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKdla-B5-H.bcmap b/public/pfd/build/generic/web/cmaps/HKdla-B5-H.bcmap
deleted file mode 100644
index 7d30c05..0000000
--- a/public/pfd/build/generic/web/cmaps/HKdla-B5-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKdla-B5-V.bcmap b/public/pfd/build/generic/web/cmaps/HKdla-B5-V.bcmap
deleted file mode 100644
index 7894694..0000000
--- a/public/pfd/build/generic/web/cmaps/HKdla-B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKdlb-B5-H.bcmap b/public/pfd/build/generic/web/cmaps/HKdlb-B5-H.bcmap
deleted file mode 100644
index d829a23..0000000
--- a/public/pfd/build/generic/web/cmaps/HKdlb-B5-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKdlb-B5-V.bcmap b/public/pfd/build/generic/web/cmaps/HKdlb-B5-V.bcmap
deleted file mode 100644
index 2b572b5..0000000
--- a/public/pfd/build/generic/web/cmaps/HKdlb-B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKgccs-B5-H.bcmap b/public/pfd/build/generic/web/cmaps/HKgccs-B5-H.bcmap
deleted file mode 100644
index 971a4f2..0000000
--- a/public/pfd/build/generic/web/cmaps/HKgccs-B5-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKgccs-B5-V.bcmap b/public/pfd/build/generic/web/cmaps/HKgccs-B5-V.bcmap
deleted file mode 100644
index d353ca2..0000000
--- a/public/pfd/build/generic/web/cmaps/HKgccs-B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKm314-B5-H.bcmap b/public/pfd/build/generic/web/cmaps/HKm314-B5-H.bcmap
deleted file mode 100644
index 576dc01..0000000
--- a/public/pfd/build/generic/web/cmaps/HKm314-B5-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKm314-B5-V.bcmap b/public/pfd/build/generic/web/cmaps/HKm314-B5-V.bcmap
deleted file mode 100644
index 0e96d0e..0000000
--- a/public/pfd/build/generic/web/cmaps/HKm314-B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKm471-B5-H.bcmap b/public/pfd/build/generic/web/cmaps/HKm471-B5-H.bcmap
deleted file mode 100644
index 11d170c..0000000
--- a/public/pfd/build/generic/web/cmaps/HKm471-B5-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKm471-B5-V.bcmap b/public/pfd/build/generic/web/cmaps/HKm471-B5-V.bcmap
deleted file mode 100644
index 54959bf..0000000
--- a/public/pfd/build/generic/web/cmaps/HKm471-B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKscs-B5-H.bcmap b/public/pfd/build/generic/web/cmaps/HKscs-B5-H.bcmap
deleted file mode 100644
index 6ef7857..0000000
--- a/public/pfd/build/generic/web/cmaps/HKscs-B5-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/HKscs-B5-V.bcmap b/public/pfd/build/generic/web/cmaps/HKscs-B5-V.bcmap
deleted file mode 100644
index 1fb2fa2..0000000
--- a/public/pfd/build/generic/web/cmaps/HKscs-B5-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Hankaku.bcmap b/public/pfd/build/generic/web/cmaps/Hankaku.bcmap
deleted file mode 100644
index 4b8ec7f..0000000
--- a/public/pfd/build/generic/web/cmaps/Hankaku.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Hiragana.bcmap b/public/pfd/build/generic/web/cmaps/Hiragana.bcmap
deleted file mode 100644
index 17e983e..0000000
--- a/public/pfd/build/generic/web/cmaps/Hiragana.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSC-EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/KSC-EUC-H.bcmap
deleted file mode 100644
index a45c65f..0000000
--- a/public/pfd/build/generic/web/cmaps/KSC-EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSC-EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/KSC-EUC-V.bcmap
deleted file mode 100644
index 0e7b21f..0000000
--- a/public/pfd/build/generic/web/cmaps/KSC-EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSC-H.bcmap b/public/pfd/build/generic/web/cmaps/KSC-H.bcmap
deleted file mode 100644
index b9b22b6..0000000
--- a/public/pfd/build/generic/web/cmaps/KSC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSC-Johab-H.bcmap b/public/pfd/build/generic/web/cmaps/KSC-Johab-H.bcmap
deleted file mode 100644
index 2531ffc..0000000
--- a/public/pfd/build/generic/web/cmaps/KSC-Johab-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSC-Johab-V.bcmap b/public/pfd/build/generic/web/cmaps/KSC-Johab-V.bcmap
deleted file mode 100644
index 367ceb2..0000000
--- a/public/pfd/build/generic/web/cmaps/KSC-Johab-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSC-V.bcmap b/public/pfd/build/generic/web/cmaps/KSC-V.bcmap
deleted file mode 100644
index 6ae2f0b..0000000
--- a/public/pfd/build/generic/web/cmaps/KSC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSCms-UHC-H.bcmap b/public/pfd/build/generic/web/cmaps/KSCms-UHC-H.bcmap
deleted file mode 100644
index a8d4240..0000000
--- a/public/pfd/build/generic/web/cmaps/KSCms-UHC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSCms-UHC-HW-H.bcmap b/public/pfd/build/generic/web/cmaps/KSCms-UHC-HW-H.bcmap
deleted file mode 100644
index 8b4ae18..0000000
--- a/public/pfd/build/generic/web/cmaps/KSCms-UHC-HW-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSCms-UHC-HW-V.bcmap b/public/pfd/build/generic/web/cmaps/KSCms-UHC-HW-V.bcmap
deleted file mode 100644
index b655dbc..0000000
--- a/public/pfd/build/generic/web/cmaps/KSCms-UHC-HW-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSCms-UHC-V.bcmap b/public/pfd/build/generic/web/cmaps/KSCms-UHC-V.bcmap
deleted file mode 100644
index 21f97f6..0000000
--- a/public/pfd/build/generic/web/cmaps/KSCms-UHC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSCpc-EUC-H.bcmap b/public/pfd/build/generic/web/cmaps/KSCpc-EUC-H.bcmap
deleted file mode 100644
index e06f361..0000000
--- a/public/pfd/build/generic/web/cmaps/KSCpc-EUC-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/KSCpc-EUC-V.bcmap b/public/pfd/build/generic/web/cmaps/KSCpc-EUC-V.bcmap
deleted file mode 100644
index f3c9113..0000000
--- a/public/pfd/build/generic/web/cmaps/KSCpc-EUC-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Katakana.bcmap b/public/pfd/build/generic/web/cmaps/Katakana.bcmap
deleted file mode 100644
index 524303c..0000000
--- a/public/pfd/build/generic/web/cmaps/Katakana.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/LICENSE b/public/pfd/build/generic/web/cmaps/LICENSE
deleted file mode 100644
index b1ad168..0000000
--- a/public/pfd/build/generic/web/cmaps/LICENSE
+++ /dev/null
@@ -1,36 +0,0 @@
-%%Copyright: -----------------------------------------------------------
-%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated.
-%%Copyright: All rights reserved.
-%%Copyright:
-%%Copyright: Redistribution and use in source and binary forms, with or
-%%Copyright: without modification, are permitted provided that the
-%%Copyright: following conditions are met:
-%%Copyright:
-%%Copyright: Redistributions of source code must retain the above
-%%Copyright: copyright notice, this list of conditions and the following
-%%Copyright: disclaimer.
-%%Copyright:
-%%Copyright: Redistributions in binary form must reproduce the above
-%%Copyright: copyright notice, this list of conditions and the following
-%%Copyright: disclaimer in the documentation and/or other materials
-%%Copyright: provided with the distribution. 
-%%Copyright:
-%%Copyright: Neither the name of Adobe Systems Incorporated nor the names
-%%Copyright: of its contributors may be used to endorse or promote
-%%Copyright: products derived from this software without specific prior
-%%Copyright: written permission. 
-%%Copyright:
-%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-%%Copyright: CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
-%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-%%Copyright: -----------------------------------------------------------
diff --git a/public/pfd/build/generic/web/cmaps/NWP-H.bcmap b/public/pfd/build/generic/web/cmaps/NWP-H.bcmap
deleted file mode 100644
index afc5e4b..0000000
--- a/public/pfd/build/generic/web/cmaps/NWP-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/NWP-V.bcmap b/public/pfd/build/generic/web/cmaps/NWP-V.bcmap
deleted file mode 100644
index bb5785e..0000000
--- a/public/pfd/build/generic/web/cmaps/NWP-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/RKSJ-H.bcmap b/public/pfd/build/generic/web/cmaps/RKSJ-H.bcmap
deleted file mode 100644
index fb8d298..0000000
--- a/public/pfd/build/generic/web/cmaps/RKSJ-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/RKSJ-V.bcmap b/public/pfd/build/generic/web/cmaps/RKSJ-V.bcmap
deleted file mode 100644
index a2555a6..0000000
--- a/public/pfd/build/generic/web/cmaps/RKSJ-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/Roman.bcmap b/public/pfd/build/generic/web/cmaps/Roman.bcmap
deleted file mode 100644
index f896dcf..0000000
--- a/public/pfd/build/generic/web/cmaps/Roman.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniCNS-UCS2-H.bcmap b/public/pfd/build/generic/web/cmaps/UniCNS-UCS2-H.bcmap
deleted file mode 100644
index d5db27c..0000000
--- a/public/pfd/build/generic/web/cmaps/UniCNS-UCS2-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniCNS-UCS2-V.bcmap b/public/pfd/build/generic/web/cmaps/UniCNS-UCS2-V.bcmap
deleted file mode 100644
index 1dc9b7a..0000000
--- a/public/pfd/build/generic/web/cmaps/UniCNS-UCS2-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniCNS-UTF16-H.bcmap b/public/pfd/build/generic/web/cmaps/UniCNS-UTF16-H.bcmap
deleted file mode 100644
index 961afef..0000000
--- a/public/pfd/build/generic/web/cmaps/UniCNS-UTF16-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniCNS-UTF16-V.bcmap b/public/pfd/build/generic/web/cmaps/UniCNS-UTF16-V.bcmap
deleted file mode 100644
index df0cffe..0000000
--- a/public/pfd/build/generic/web/cmaps/UniCNS-UTF16-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniCNS-UTF32-H.bcmap b/public/pfd/build/generic/web/cmaps/UniCNS-UTF32-H.bcmap
deleted file mode 100644
index 1ab18a1..0000000
--- a/public/pfd/build/generic/web/cmaps/UniCNS-UTF32-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniCNS-UTF32-V.bcmap b/public/pfd/build/generic/web/cmaps/UniCNS-UTF32-V.bcmap
deleted file mode 100644
index ad14662..0000000
--- a/public/pfd/build/generic/web/cmaps/UniCNS-UTF32-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniCNS-UTF8-H.bcmap b/public/pfd/build/generic/web/cmaps/UniCNS-UTF8-H.bcmap
deleted file mode 100644
index 83c6bd7..0000000
--- a/public/pfd/build/generic/web/cmaps/UniCNS-UTF8-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniCNS-UTF8-V.bcmap b/public/pfd/build/generic/web/cmaps/UniCNS-UTF8-V.bcmap
deleted file mode 100644
index 22a27e4..0000000
--- a/public/pfd/build/generic/web/cmaps/UniCNS-UTF8-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniGB-UCS2-H.bcmap b/public/pfd/build/generic/web/cmaps/UniGB-UCS2-H.bcmap
deleted file mode 100644
index 5bd6228..0000000
--- a/public/pfd/build/generic/web/cmaps/UniGB-UCS2-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniGB-UCS2-V.bcmap b/public/pfd/build/generic/web/cmaps/UniGB-UCS2-V.bcmap
deleted file mode 100644
index 53c534b..0000000
--- a/public/pfd/build/generic/web/cmaps/UniGB-UCS2-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniGB-UTF16-H.bcmap b/public/pfd/build/generic/web/cmaps/UniGB-UTF16-H.bcmap
deleted file mode 100644
index b95045b..0000000
--- a/public/pfd/build/generic/web/cmaps/UniGB-UTF16-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniGB-UTF16-V.bcmap b/public/pfd/build/generic/web/cmaps/UniGB-UTF16-V.bcmap
deleted file mode 100644
index 51f023e..0000000
--- a/public/pfd/build/generic/web/cmaps/UniGB-UTF16-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniGB-UTF32-H.bcmap b/public/pfd/build/generic/web/cmaps/UniGB-UTF32-H.bcmap
deleted file mode 100644
index f0dbd14..0000000
--- a/public/pfd/build/generic/web/cmaps/UniGB-UTF32-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniGB-UTF32-V.bcmap b/public/pfd/build/generic/web/cmaps/UniGB-UTF32-V.bcmap
deleted file mode 100644
index ce9c30a..0000000
--- a/public/pfd/build/generic/web/cmaps/UniGB-UTF32-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniGB-UTF8-H.bcmap b/public/pfd/build/generic/web/cmaps/UniGB-UTF8-H.bcmap
deleted file mode 100644
index 982ca46..0000000
--- a/public/pfd/build/generic/web/cmaps/UniGB-UTF8-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniGB-UTF8-V.bcmap b/public/pfd/build/generic/web/cmaps/UniGB-UTF8-V.bcmap
deleted file mode 100644
index f78020d..0000000
--- a/public/pfd/build/generic/web/cmaps/UniGB-UTF8-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-H.bcmap
deleted file mode 100644
index 7daf56a..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-HW-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-HW-H.bcmap
deleted file mode 100644
index ac9975c..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-HW-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-HW-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-HW-V.bcmap
deleted file mode 100644
index 3da0a1c..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-HW-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-V.bcmap
deleted file mode 100644
index c50b9dd..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UCS2-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UTF16-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UTF16-H.bcmap
deleted file mode 100644
index 6761344..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UTF16-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UTF16-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UTF16-V.bcmap
deleted file mode 100644
index 70bf90c..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UTF16-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UTF32-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UTF32-H.bcmap
deleted file mode 100644
index 7a83d53..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UTF32-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UTF32-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UTF32-V.bcmap
deleted file mode 100644
index 7a87135..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UTF32-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UTF8-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UTF8-H.bcmap
deleted file mode 100644
index 9f0334c..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UTF8-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS-UTF8-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS-UTF8-V.bcmap
deleted file mode 100644
index 808a94f..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS-UTF8-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF16-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF16-H.bcmap
deleted file mode 100644
index d768bf8..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF16-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF16-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF16-V.bcmap
deleted file mode 100644
index 3d5bf6f..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF16-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF32-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF32-H.bcmap
deleted file mode 100644
index 09eee10..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF32-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF32-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF32-V.bcmap
deleted file mode 100644
index 6c54600..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF32-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF8-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF8-H.bcmap
deleted file mode 100644
index 1b1a64f..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF8-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF8-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF8-V.bcmap
deleted file mode 100644
index 994aa9e..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJIS2004-UTF8-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJISPro-UCS2-HW-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJISPro-UCS2-HW-V.bcmap
deleted file mode 100644
index 643f921..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJISPro-UCS2-HW-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJISPro-UCS2-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJISPro-UCS2-V.bcmap
deleted file mode 100644
index c148f67..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJISPro-UCS2-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJISPro-UTF8-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJISPro-UTF8-V.bcmap
deleted file mode 100644
index 1849d80..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJISPro-UTF8-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJISX0213-UTF32-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJISX0213-UTF32-H.bcmap
deleted file mode 100644
index a83a677..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJISX0213-UTF32-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJISX0213-UTF32-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJISX0213-UTF32-V.bcmap
deleted file mode 100644
index f527248..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJISX0213-UTF32-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJISX02132004-UTF32-H.bcmap b/public/pfd/build/generic/web/cmaps/UniJISX02132004-UTF32-H.bcmap
deleted file mode 100644
index e1a988d..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJISX02132004-UTF32-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniJISX02132004-UTF32-V.bcmap b/public/pfd/build/generic/web/cmaps/UniJISX02132004-UTF32-V.bcmap
deleted file mode 100644
index 47e054a..0000000
--- a/public/pfd/build/generic/web/cmaps/UniJISX02132004-UTF32-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniKS-UCS2-H.bcmap b/public/pfd/build/generic/web/cmaps/UniKS-UCS2-H.bcmap
deleted file mode 100644
index b5b9485..0000000
--- a/public/pfd/build/generic/web/cmaps/UniKS-UCS2-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniKS-UCS2-V.bcmap b/public/pfd/build/generic/web/cmaps/UniKS-UCS2-V.bcmap
deleted file mode 100644
index 026adca..0000000
--- a/public/pfd/build/generic/web/cmaps/UniKS-UCS2-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniKS-UTF16-H.bcmap b/public/pfd/build/generic/web/cmaps/UniKS-UTF16-H.bcmap
deleted file mode 100644
index fd4e66e..0000000
--- a/public/pfd/build/generic/web/cmaps/UniKS-UTF16-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniKS-UTF16-V.bcmap b/public/pfd/build/generic/web/cmaps/UniKS-UTF16-V.bcmap
deleted file mode 100644
index 075efb7..0000000
--- a/public/pfd/build/generic/web/cmaps/UniKS-UTF16-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniKS-UTF32-H.bcmap b/public/pfd/build/generic/web/cmaps/UniKS-UTF32-H.bcmap
deleted file mode 100644
index 769d214..0000000
--- a/public/pfd/build/generic/web/cmaps/UniKS-UTF32-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniKS-UTF32-V.bcmap b/public/pfd/build/generic/web/cmaps/UniKS-UTF32-V.bcmap
deleted file mode 100644
index bdab208..0000000
--- a/public/pfd/build/generic/web/cmaps/UniKS-UTF32-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniKS-UTF8-H.bcmap b/public/pfd/build/generic/web/cmaps/UniKS-UTF8-H.bcmap
deleted file mode 100644
index 6ff8674..0000000
--- a/public/pfd/build/generic/web/cmaps/UniKS-UTF8-H.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/UniKS-UTF8-V.bcmap b/public/pfd/build/generic/web/cmaps/UniKS-UTF8-V.bcmap
deleted file mode 100644
index 8dfa76a..0000000
--- a/public/pfd/build/generic/web/cmaps/UniKS-UTF8-V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/V.bcmap b/public/pfd/build/generic/web/cmaps/V.bcmap
deleted file mode 100644
index fdec990..0000000
--- a/public/pfd/build/generic/web/cmaps/V.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/cmaps/WP-Symbol.bcmap b/public/pfd/build/generic/web/cmaps/WP-Symbol.bcmap
deleted file mode 100644
index 46729bb..0000000
--- a/public/pfd/build/generic/web/cmaps/WP-Symbol.bcmap
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/compatibility.js b/public/pfd/build/generic/web/compatibility.js
deleted file mode 100644
index 06f54bf..0000000
--- a/public/pfd/build/generic/web/compatibility.js
+++ /dev/null
@@ -1,577 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* globals VBArray, PDFJS */
-
-'use strict';
-
-// Initializing PDFJS global object here, it case if we need to change/disable
-// some PDF.js features, e.g. range requests
-if (typeof PDFJS === 'undefined') {
-  (typeof window !== 'undefined' ? window : this).PDFJS = {};
-}
-
-// Checking if the typed arrays are supported
-// Support: iOS<6.0 (subarray), IE<10, Android<4.0
-(function checkTypedArrayCompatibility() {
-  if (typeof Uint8Array !== 'undefined') {
-    // Support: iOS<6.0
-    if (typeof Uint8Array.prototype.subarray === 'undefined') {
-        Uint8Array.prototype.subarray = function subarray(start, end) {
-          return new Uint8Array(this.slice(start, end));
-        };
-        Float32Array.prototype.subarray = function subarray(start, end) {
-          return new Float32Array(this.slice(start, end));
-        };
-    }
-
-    // Support: Android<4.1
-    if (typeof Float64Array === 'undefined') {
-      window.Float64Array = Float32Array;
-    }
-    return;
-  }
-
-  function subarray(start, end) {
-    return new TypedArray(this.slice(start, end));
-  }
-
-  function setArrayOffset(array, offset) {
-    if (arguments.length < 2) {
-      offset = 0;
-    }
-    for (var i = 0, n = array.length; i < n; ++i, ++offset) {
-      this[offset] = array[i] & 0xFF;
-    }
-  }
-
-  function TypedArray(arg1) {
-    var result, i, n;
-    if (typeof arg1 === 'number') {
-      result = [];
-      for (i = 0; i < arg1; ++i) {
-        result[i] = 0;
-      }
-    } else if ('slice' in arg1) {
-      result = arg1.slice(0);
-    } else {
-      result = [];
-      for (i = 0, n = arg1.length; i < n; ++i) {
-        result[i] = arg1[i];
-      }
-    }
-
-    result.subarray = subarray;
-    result.buffer = result;
-    result.byteLength = result.length;
-    result.set = setArrayOffset;
-
-    if (typeof arg1 === 'object' && arg1.buffer) {
-      result.buffer = arg1.buffer;
-    }
-    return result;
-  }
-
-  window.Uint8Array = TypedArray;
-  window.Int8Array = TypedArray;
-
-  // we don't need support for set, byteLength for 32-bit array
-  // so we can use the TypedArray as well
-  window.Uint32Array = TypedArray;
-  window.Int32Array = TypedArray;
-  window.Uint16Array = TypedArray;
-  window.Float32Array = TypedArray;
-  window.Float64Array = TypedArray;
-})();
-
-// URL = URL || webkitURL
-// Support: Safari<7, Android 4.2+
-(function normalizeURLObject() {
-  if (!window.URL) {
-    window.URL = window.webkitURL;
-  }
-})();
-
-// Object.defineProperty()?
-// Support: Android<4.0, Safari<5.1
-(function checkObjectDefinePropertyCompatibility() {
-  if (typeof Object.defineProperty !== 'undefined') {
-    var definePropertyPossible = true;
-    try {
-      // some browsers (e.g. safari) cannot use defineProperty() on DOM objects
-      // and thus the native version is not sufficient
-      Object.defineProperty(new Image(), 'id', { value: 'test' });
-      // ... another test for android gb browser for non-DOM objects
-      var Test = function Test() {};
-      Test.prototype = { get id() { } };
-      Object.defineProperty(new Test(), 'id',
-        { value: '', configurable: true, enumerable: true, writable: false });
-    } catch (e) {
-      definePropertyPossible = false;
-    }
-    if (definePropertyPossible) {
-      return;
-    }
-  }
-
-  Object.defineProperty = function objectDefineProperty(obj, name, def) {
-    delete obj[name];
-    if ('get' in def) {
-      obj.__defineGetter__(name, def['get']);
-    }
-    if ('set' in def) {
-      obj.__defineSetter__(name, def['set']);
-    }
-    if ('value' in def) {
-      obj.__defineSetter__(name, function objectDefinePropertySetter(value) {
-        this.__defineGetter__(name, function objectDefinePropertyGetter() {
-          return value;
-        });
-        return value;
-      });
-      obj[name] = def.value;
-    }
-  };
-})();
-
-
-// No XMLHttpRequest#response?
-// Support: IE<11, Android <4.0
-(function checkXMLHttpRequestResponseCompatibility() {
-  var xhrPrototype = XMLHttpRequest.prototype;
-  var xhr = new XMLHttpRequest();
-  if (!('overrideMimeType' in xhr)) {
-    // IE10 might have response, but not overrideMimeType
-    // Support: IE10
-    Object.defineProperty(xhrPrototype, 'overrideMimeType', {
-      value: function xmlHttpRequestOverrideMimeType(mimeType) {}
-    });
-  }
-  if ('responseType' in xhr) {
-    return;
-  }
-
-  // The worker will be using XHR, so we can save time and disable worker.
-  PDFJS.disableWorker = true;
-
-  Object.defineProperty(xhrPrototype, 'responseType', {
-    get: function xmlHttpRequestGetResponseType() {
-      return this._responseType || 'text';
-    },
-    set: function xmlHttpRequestSetResponseType(value) {
-      if (value === 'text' || value === 'arraybuffer') {
-        this._responseType = value;
-        if (value === 'arraybuffer' &&
-            typeof this.overrideMimeType === 'function') {
-          this.overrideMimeType('text/plain; charset=x-user-defined');
-        }
-      }
-    }
-  });
-
-  // Support: IE9
-  if (typeof VBArray !== 'undefined') {
-    Object.defineProperty(xhrPrototype, 'response', {
-      get: function xmlHttpRequestResponseGet() {
-        if (this.responseType === 'arraybuffer') {
-          return new Uint8Array(new VBArray(this.responseBody).toArray());
-        } else {
-          return this.responseText;
-        }
-      }
-    });
-    return;
-  }
-
-  Object.defineProperty(xhrPrototype, 'response', {
-    get: function xmlHttpRequestResponseGet() {
-      if (this.responseType !== 'arraybuffer') {
-        return this.responseText;
-      }
-      var text = this.responseText;
-      var i, n = text.length;
-      var result = new Uint8Array(n);
-      for (i = 0; i < n; ++i) {
-        result[i] = text.charCodeAt(i) & 0xFF;
-      }
-      return result.buffer;
-    }
-  });
-})();
-
-// window.btoa (base64 encode function) ?
-// Support: IE<10
-(function checkWindowBtoaCompatibility() {
-  if ('btoa' in window) {
-    return;
-  }
-
-  var digits =
-    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
-
-  window.btoa = function windowBtoa(chars) {
-    var buffer = '';
-    var i, n;
-    for (i = 0, n = chars.length; i < n; i += 3) {
-      var b1 = chars.charCodeAt(i) & 0xFF;
-      var b2 = chars.charCodeAt(i + 1) & 0xFF;
-      var b3 = chars.charCodeAt(i + 2) & 0xFF;
-      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
-      var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
-      var d4 = i + 2 < n ? (b3 & 0x3F) : 64;
-      buffer += (digits.charAt(d1) + digits.charAt(d2) +
-                 digits.charAt(d3) + digits.charAt(d4));
-    }
-    return buffer;
-  };
-})();
-
-// window.atob (base64 encode function)?
-// Support: IE<10
-(function checkWindowAtobCompatibility() {
-  if ('atob' in window) {
-    return;
-  }
-
-  // https://github.com/davidchambers/Base64.js
-  var digits =
-    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
-  window.atob = function (input) {
-    input = input.replace(/=+$/, '');
-    if (input.length % 4 === 1) {
-      throw new Error('bad atob input');
-    }
-    for (
-      // initialize result and counters
-      var bc = 0, bs, buffer, idx = 0, output = '';
-      // get next character
-      buffer = input.charAt(idx++);
-      // character found in table?
-      // initialize bit storage and add its ascii value
-      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
-        // and if not first of each 4 characters,
-        // convert the first 8 bits to one ascii character
-        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
-    ) {
-      // try to find character in table (0-63, not found => -1)
-      buffer = digits.indexOf(buffer);
-    }
-    return output;
-  };
-})();
-
-// Function.prototype.bind?
-// Support: Android<4.0, iOS<6.0
-(function checkFunctionPrototypeBindCompatibility() {
-  if (typeof Function.prototype.bind !== 'undefined') {
-    return;
-  }
-
-  Function.prototype.bind = function functionPrototypeBind(obj) {
-    var fn = this, headArgs = Array.prototype.slice.call(arguments, 1);
-    var bound = function functionPrototypeBindBound() {
-      var args = headArgs.concat(Array.prototype.slice.call(arguments));
-      return fn.apply(obj, args);
-    };
-    return bound;
-  };
-})();
-
-// HTMLElement dataset property
-// Support: IE<11, Safari<5.1, Android<4.0
-(function checkDatasetProperty() {
-  var div = document.createElement('div');
-  if ('dataset' in div) {
-    return; // dataset property exists
-  }
-
-  Object.defineProperty(HTMLElement.prototype, 'dataset', {
-    get: function() {
-      if (this._dataset) {
-        return this._dataset;
-      }
-
-      var dataset = {};
-      for (var j = 0, jj = this.attributes.length; j < jj; j++) {
-        var attribute = this.attributes[j];
-        if (attribute.name.substring(0, 5) !== 'data-') {
-          continue;
-        }
-        var key = attribute.name.substring(5).replace(/\-([a-z])/g,
-          function(all, ch) {
-            return ch.toUpperCase();
-          });
-        dataset[key] = attribute.value;
-      }
-
-      Object.defineProperty(this, '_dataset', {
-        value: dataset,
-        writable: false,
-        enumerable: false
-      });
-      return dataset;
-    },
-    enumerable: true
-  });
-})();
-
-// HTMLElement classList property
-// Support: IE<10, Android<4.0, iOS<5.0
-(function checkClassListProperty() {
-  var div = document.createElement('div');
-  if ('classList' in div) {
-    return; // classList property exists
-  }
-
-  function changeList(element, itemName, add, remove) {
-    var s = element.className || '';
-    var list = s.split(/\s+/g);
-    if (list[0] === '') {
-      list.shift();
-    }
-    var index = list.indexOf(itemName);
-    if (index < 0 && add) {
-      list.push(itemName);
-    }
-    if (index >= 0 && remove) {
-      list.splice(index, 1);
-    }
-    element.className = list.join(' ');
-    return (index >= 0);
-  }
-
-  var classListPrototype = {
-    add: function(name) {
-      changeList(this.element, name, true, false);
-    },
-    contains: function(name) {
-      return changeList(this.element, name, false, false);
-    },
-    remove: function(name) {
-      changeList(this.element, name, false, true);
-    },
-    toggle: function(name) {
-      changeList(this.element, name, true, true);
-    }
-  };
-
-  Object.defineProperty(HTMLElement.prototype, 'classList', {
-    get: function() {
-      if (this._classList) {
-        return this._classList;
-      }
-
-      var classList = Object.create(classListPrototype, {
-        element: {
-          value: this,
-          writable: false,
-          enumerable: true
-        }
-      });
-      Object.defineProperty(this, '_classList', {
-        value: classList,
-        writable: false,
-        enumerable: false
-      });
-      return classList;
-    },
-    enumerable: true
-  });
-})();
-
-// Check console compatibility
-// In older IE versions the console object is not available
-// unless console is open.
-// Support: IE<10
-(function checkConsoleCompatibility() {
-  if (!('console' in window)) {
-    window.console = {
-      log: function() {},
-      error: function() {},
-      warn: function() {}
-    };
-  } else if (!('bind' in console.log)) {
-    // native functions in IE9 might not have bind
-    console.log = (function(fn) {
-      return function(msg) { return fn(msg); };
-    })(console.log);
-    console.error = (function(fn) {
-      return function(msg) { return fn(msg); };
-    })(console.error);
-    console.warn = (function(fn) {
-      return function(msg) { return fn(msg); };
-    })(console.warn);
-  }
-})();
-
-// Check onclick compatibility in Opera
-// Support: Opera<15
-(function checkOnClickCompatibility() {
-  // workaround for reported Opera bug DSK-354448:
-  // onclick fires on disabled buttons with opaque content
-  function ignoreIfTargetDisabled(event) {
-    if (isDisabled(event.target)) {
-      event.stopPropagation();
-    }
-  }
-  function isDisabled(node) {
-    return node.disabled || (node.parentNode && isDisabled(node.parentNode));
-  }
-  if (navigator.userAgent.indexOf('Opera') !== -1) {
-    // use browser detection since we cannot feature-check this bug
-    document.addEventListener('click', ignoreIfTargetDisabled, true);
-  }
-})();
-
-// Checks if possible to use URL.createObjectURL()
-// Support: IE
-(function checkOnBlobSupport() {
-  // sometimes IE loosing the data created with createObjectURL(), see #3977
-  if (navigator.userAgent.indexOf('Trident') >= 0) {
-    PDFJS.disableCreateObjectURL = true;
-  }
-})();
-
-// Checks if navigator.language is supported
-(function checkNavigatorLanguage() {
-  if ('language' in navigator) {
-    return;
-  }
-  PDFJS.locale = navigator.userLanguage || 'en-US';
-})();
-
-(function checkRangeRequests() {
-  // Safari has issues with cached range requests see:
-  // https://github.com/mozilla/pdf.js/issues/3260
-  // Last tested with version 6.0.4.
-  // Support: Safari 6.0+
-  var isSafari = Object.prototype.toString.call(
-                  window.HTMLElement).indexOf('Constructor') > 0;
-
-  // Older versions of Android (pre 3.0) has issues with range requests, see:
-  // https://github.com/mozilla/pdf.js/issues/3381.
-  // Make sure that we only match webkit-based Android browsers,
-  // since Firefox/Fennec works as expected.
-  // Support: Android<3.0
-  var regex = /Android\s[0-2][^\d]/;
-  var isOldAndroid = regex.test(navigator.userAgent);
-
-  // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318
-  var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent);
-
-  if (isSafari || isOldAndroid || isChromeWithRangeBug) {
-    PDFJS.disableRange = true;
-    PDFJS.disableStream = true;
-  }
-})();
-
-// Check if the browser supports manipulation of the history.
-// Support: IE<10, Android<4.2
-(function checkHistoryManipulation() {
-  // Android 2.x has so buggy pushState support that it was removed in
-  // Android 3.0 and restored as late as in Android 4.2.
-  // Support: Android 2.x
-  if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) {
-    PDFJS.disableHistory = true;
-  }
-})();
-
-// Support: IE<11, Chrome<21, Android<4.4, Safari<6
-(function checkSetPresenceInImageData() {
-  // IE < 11 will use window.CanvasPixelArray which lacks set function.
-  if (window.CanvasPixelArray) {
-    if (typeof window.CanvasPixelArray.prototype.set !== 'function') {
-      window.CanvasPixelArray.prototype.set = function(arr) {
-        for (var i = 0, ii = this.length; i < ii; i++) {
-          this[i] = arr[i];
-        }
-      };
-    }
-  } else {
-    // Old Chrome and Android use an inaccessible CanvasPixelArray prototype.
-    // Because we cannot feature detect it, we rely on user agent parsing.
-    var polyfill = false, versionMatch;
-    if (navigator.userAgent.indexOf('Chrom') >= 0) {
-      versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
-      // Chrome < 21 lacks the set function.
-      polyfill = versionMatch && parseInt(versionMatch[2]) < 21;
-    } else if (navigator.userAgent.indexOf('Android') >= 0) {
-      // Android < 4.4 lacks the set function.
-      // Android >= 4.4 will contain Chrome in the user agent,
-      // thus pass the Chrome check above and not reach this block.
-      polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent);
-    } else if (navigator.userAgent.indexOf('Safari') >= 0) {
-      versionMatch = navigator.userAgent.
-        match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//);
-      // Safari < 6 lacks the set function.
-      polyfill = versionMatch && parseInt(versionMatch[1]) < 6;
-    }
-
-    if (polyfill) {
-      var contextPrototype = window.CanvasRenderingContext2D.prototype;
-      contextPrototype._createImageData = contextPrototype.createImageData;
-      contextPrototype.createImageData = function(w, h) {
-        var imageData = this._createImageData(w, h);
-        imageData.data.set = function(arr) {
-          for (var i = 0, ii = this.length; i < ii; i++) {
-            this[i] = arr[i];
-          }
-        };
-        return imageData;
-      };
-    }
-  }
-})();
-
-// Support: IE<10, Android<4.0, iOS
-(function checkRequestAnimationFrame() {
-  function fakeRequestAnimationFrame(callback) {
-    window.setTimeout(callback, 20);
-  }
-
-  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
-  if (isIOS) {
-    // requestAnimationFrame on iOS is broken, replacing with fake one.
-    window.requestAnimationFrame = fakeRequestAnimationFrame;
-    return;
-  }
-  if ('requestAnimationFrame' in window) {
-    return;
-  }
-  window.requestAnimationFrame =
-    window.mozRequestAnimationFrame ||
-    window.webkitRequestAnimationFrame ||
-    fakeRequestAnimationFrame;
-})();
-
-(function checkCanvasSizeLimitation() {
-  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
-  var isAndroid = /Android/g.test(navigator.userAgent);
-  if (isIOS || isAndroid) {
-    // 5MP
-    PDFJS.maxCanvasPixels = 5242880;
-  }
-})();
-
-// Disable fullscreen support for certain problematic configurations.
-// Support: IE11+ (when embedded).
-(function checkFullscreenSupport() {
-  var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 &&
-                      window.parent !== window);
-  if (isEmbeddedIE) {
-    PDFJS.disableFullscreen = true;
-  }
-})();
diff --git a/public/pfd/build/generic/web/compressed.tracemonkey-pldi-09.pdf b/public/pfd/build/generic/web/compressed.tracemonkey-pldi-09.pdf
deleted file mode 100644
index 6557018..0000000
--- a/public/pfd/build/generic/web/compressed.tracemonkey-pldi-09.pdf
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/debugger.js b/public/pfd/build/generic/web/debugger.js
deleted file mode 100644
index 046fd34..0000000
--- a/public/pfd/build/generic/web/debugger.js
+++ /dev/null
@@ -1,620 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* globals PDFJS */
-
-'use strict';
-
-var FontInspector = (function FontInspectorClosure() {
-  var fonts;
-  var active = false;
-  var fontAttribute = 'data-font-name';
-  function removeSelection() {
-    var divs = document.querySelectorAll('div[' + fontAttribute + ']');
-    for (var i = 0, ii = divs.length; i < ii; ++i) {
-      var div = divs[i];
-      div.className = '';
-    }
-  }
-  function resetSelection() {
-    var divs = document.querySelectorAll('div[' + fontAttribute + ']');
-    for (var i = 0, ii = divs.length; i < ii; ++i) {
-      var div = divs[i];
-      div.className = 'debuggerHideText';
-    }
-  }
-  function selectFont(fontName, show) {
-    var divs = document.querySelectorAll('div[' + fontAttribute + '=' +
-                                         fontName + ']');
-    for (var i = 0, ii = divs.length; i < ii; ++i) {
-      var div = divs[i];
-      div.className = show ? 'debuggerShowText' : 'debuggerHideText';
-    }
-  }
-  function textLayerClick(e) {
-    if (!e.target.dataset.fontName ||
-        e.target.tagName.toUpperCase() !== 'DIV') {
-      return;
-    }
-    var fontName = e.target.dataset.fontName;
-    var selects = document.getElementsByTagName('input');
-    for (var i = 0; i < selects.length; ++i) {
-      var select = selects[i];
-      if (select.dataset.fontName !== fontName) {
-        continue;
-      }
-      select.checked = !select.checked;
-      selectFont(fontName, select.checked);
-      select.scrollIntoView();
-    }
-  }
-  return {
-    // Properties/functions needed by PDFBug.
-    id: 'FontInspector',
-    name: 'Font Inspector',
-    panel: null,
-    manager: null,
-    init: function init() {
-      var panel = this.panel;
-      panel.setAttribute('style', 'padding: 5px;');
-      var tmp = document.createElement('button');
-      tmp.addEventListener('click', resetSelection);
-      tmp.textContent = 'Refresh';
-      panel.appendChild(tmp);
-
-      fonts = document.createElement('div');
-      panel.appendChild(fonts);
-    },
-    cleanup: function cleanup() {
-      fonts.textContent = '';
-    },
-    enabled: false,
-    get active() {
-      return active;
-    },
-    set active(value) {
-      active = value;
-      if (active) {
-        document.body.addEventListener('click', textLayerClick, true);
-        resetSelection();
-      } else {
-        document.body.removeEventListener('click', textLayerClick, true);
-        removeSelection();
-      }
-    },
-    // FontInspector specific functions.
-    fontAdded: function fontAdded(fontObj, url) {
-      function properties(obj, list) {
-        var moreInfo = document.createElement('table');
-        for (var i = 0; i < list.length; i++) {
-          var tr = document.createElement('tr');
-          var td1 = document.createElement('td');
-          td1.textContent = list[i];
-          tr.appendChild(td1);
-          var td2 = document.createElement('td');
-          td2.textContent = obj[list[i]].toString();
-          tr.appendChild(td2);
-          moreInfo.appendChild(tr);
-        }
-        return moreInfo;
-      }
-      var moreInfo = properties(fontObj, ['name', 'type']);
-      var fontName = fontObj.loadedName;
-      var font = document.createElement('div');
-      var name = document.createElement('span');
-      name.textContent = fontName;
-      var download = document.createElement('a');
-      if (url) {
-        url = /url\(['"]?([^\)"']+)/.exec(url);
-        download.href = url[1];
-      } else if (fontObj.data) {
-        url = URL.createObjectURL(new Blob([fontObj.data], {
-          type: fontObj.mimeType
-        }));
-        download.href = url;
-      }
-      download.textContent = 'Download';
-      var logIt = document.createElement('a');
-      logIt.href = '';
-      logIt.textContent = 'Log';
-      logIt.addEventListener('click', function(event) {
-        event.preventDefault();
-        console.log(fontObj);
-      });
-      var select = document.createElement('input');
-      select.setAttribute('type', 'checkbox');
-      select.dataset.fontName = fontName;
-      select.addEventListener('click', (function(select, fontName) {
-        return (function() {
-           selectFont(fontName, select.checked);
-        });
-      })(select, fontName));
-      font.appendChild(select);
-      font.appendChild(name);
-      font.appendChild(document.createTextNode(' '));
-      font.appendChild(download);
-      font.appendChild(document.createTextNode(' '));
-      font.appendChild(logIt);
-      font.appendChild(moreInfo);
-      fonts.appendChild(font);
-      // Somewhat of a hack, should probably add a hook for when the text layer
-      // is done rendering.
-      setTimeout(function() {
-        if (this.active) {
-          resetSelection();
-        }
-      }.bind(this), 2000);
-    }
-  };
-})();
-
-// Manages all the page steppers.
-var StepperManager = (function StepperManagerClosure() {
-  var steppers = [];
-  var stepperDiv = null;
-  var stepperControls = null;
-  var stepperChooser = null;
-  var breakPoints = {};
-  return {
-    // Properties/functions needed by PDFBug.
-    id: 'Stepper',
-    name: 'Stepper',
-    panel: null,
-    manager: null,
-    init: function init() {
-      var self = this;
-      this.panel.setAttribute('style', 'padding: 5px;');
-      stepperControls = document.createElement('div');
-      stepperChooser = document.createElement('select');
-      stepperChooser.addEventListener('change', function(event) {
-        self.selectStepper(this.value);
-      });
-      stepperControls.appendChild(stepperChooser);
-      stepperDiv = document.createElement('div');
-      this.panel.appendChild(stepperControls);
-      this.panel.appendChild(stepperDiv);
-      if (sessionStorage.getItem('pdfjsBreakPoints')) {
-        breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));
-      }
-    },
-    cleanup: function cleanup() {
-      stepperChooser.textContent = '';
-      stepperDiv.textContent = '';
-      steppers = [];
-    },
-    enabled: false,
-    active: false,
-    // Stepper specific functions.
-    create: function create(pageIndex) {
-      var debug = document.createElement('div');
-      debug.id = 'stepper' + pageIndex;
-      debug.setAttribute('hidden', true);
-      debug.className = 'stepper';
-      stepperDiv.appendChild(debug);
-      var b = document.createElement('option');
-      b.textContent = 'Page ' + (pageIndex + 1);
-      b.value = pageIndex;
-      stepperChooser.appendChild(b);
-      var initBreakPoints = breakPoints[pageIndex] || [];
-      var stepper = new Stepper(debug, pageIndex, initBreakPoints);
-      steppers.push(stepper);
-      if (steppers.length === 1) {
-        this.selectStepper(pageIndex, false);
-      }
-      return stepper;
-    },
-    selectStepper: function selectStepper(pageIndex, selectPanel) {
-      var i;
-      pageIndex = pageIndex | 0;
-      if (selectPanel) {
-        this.manager.selectPanel(this);
-      }
-      for (i = 0; i < steppers.length; ++i) {
-        var stepper = steppers[i];
-        if (stepper.pageIndex === pageIndex) {
-          stepper.panel.removeAttribute('hidden');
-        } else {
-          stepper.panel.setAttribute('hidden', true);
-        }
-      }
-      var options = stepperChooser.options;
-      for (i = 0; i < options.length; ++i) {
-        var option = options[i];
-        option.selected = (option.value | 0) === pageIndex;
-      }
-    },
-    saveBreakPoints: function saveBreakPoints(pageIndex, bps) {
-      breakPoints[pageIndex] = bps;
-      sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));
-    }
-  };
-})();
-
-// The stepper for each page's IRQueue.
-var Stepper = (function StepperClosure() {
-  // Shorter way to create element and optionally set textContent.
-  function c(tag, textContent) {
-    var d = document.createElement(tag);
-    if (textContent) {
-      d.textContent = textContent;
-    }
-    return d;
-  }
-
-  var opMap = null;
-
-  function simplifyArgs(args) {
-    if (typeof args === 'string') {
-      var MAX_STRING_LENGTH = 75;
-      return args.length <= MAX_STRING_LENGTH ? args :
-        args.substr(0, MAX_STRING_LENGTH) + '...';
-    }
-    if (typeof args !== 'object' || args === null) {
-      return args;
-    }
-    if ('length' in args) { // array
-      var simpleArgs = [], i, ii;
-      var MAX_ITEMS = 10;
-      for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {
-        simpleArgs.push(simplifyArgs(args[i]));
-      }
-      if (i < args.length) {
-        simpleArgs.push('...');
-      }
-      return simpleArgs;
-    }
-    var simpleObj = {};
-    for (var key in args) {
-      simpleObj[key] = simplifyArgs(args[key]);
-    }
-    return simpleObj;
-  }
-
-  function Stepper(panel, pageIndex, initialBreakPoints) {
-    this.panel = panel;
-    this.breakPoint = 0;
-    this.nextBreakPoint = null;
-    this.pageIndex = pageIndex;
-    this.breakPoints = initialBreakPoints;
-    this.currentIdx = -1;
-    this.operatorListIdx = 0;
-  }
-  Stepper.prototype = {
-    init: function init() {
-      var panel = this.panel;
-      var content = c('div', 'c=continue, s=step');
-      var table = c('table');
-      content.appendChild(table);
-      table.cellSpacing = 0;
-      var headerRow = c('tr');
-      table.appendChild(headerRow);
-      headerRow.appendChild(c('th', 'Break'));
-      headerRow.appendChild(c('th', 'Idx'));
-      headerRow.appendChild(c('th', 'fn'));
-      headerRow.appendChild(c('th', 'args'));
-      panel.appendChild(content);
-      this.table = table;
-      if (!opMap) {
-        opMap = Object.create(null);
-        for (var key in PDFJS.OPS) {
-          opMap[PDFJS.OPS[key]] = key;
-        }
-      }
-    },
-    updateOperatorList: function updateOperatorList(operatorList) {
-      var self = this;
-
-      function cboxOnClick() {
-        var x = +this.dataset.idx;
-        if (this.checked) {
-          self.breakPoints.push(x);
-        } else {
-          self.breakPoints.splice(self.breakPoints.indexOf(x), 1);
-        }
-        StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);
-      }
-
-      var MAX_OPERATORS_COUNT = 15000;
-      if (this.operatorListIdx > MAX_OPERATORS_COUNT) {
-        return;
-      }
-
-      var chunk = document.createDocumentFragment();
-      var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,
-                                        operatorList.fnArray.length);
-      for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {
-        var line = c('tr');
-        line.className = 'line';
-        line.dataset.idx = i;
-        chunk.appendChild(line);
-        var checked = this.breakPoints.indexOf(i) !== -1;
-        var args = operatorList.argsArray[i] || [];
-
-        var breakCell = c('td');
-        var cbox = c('input');
-        cbox.type = 'checkbox';
-        cbox.className = 'points';
-        cbox.checked = checked;
-        cbox.dataset.idx = i;
-        cbox.onclick = cboxOnClick;
-
-        breakCell.appendChild(cbox);
-        line.appendChild(breakCell);
-        line.appendChild(c('td', i.toString()));
-        var fn = opMap[operatorList.fnArray[i]];
-        var decArgs = args;
-        if (fn === 'showText') {
-          var glyphs = args[0];
-          var newArgs = [];
-          var str = [];
-          for (var j = 0; j < glyphs.length; j++) {
-            var glyph = glyphs[j];
-            if (typeof glyph === 'object' && glyph !== null) {
-              str.push(glyph.fontChar);
-            } else {
-              if (str.length > 0) {
-                newArgs.push(str.join(''));
-                str = [];
-              }
-              newArgs.push(glyph); // null or number
-            }
-          }
-          if (str.length > 0) {
-            newArgs.push(str.join(''));
-          }
-          decArgs = [newArgs];
-        }
-        line.appendChild(c('td', fn));
-        line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));
-      }
-      if (operatorsToDisplay < operatorList.fnArray.length) {
-        line = c('tr');
-        var lastCell = c('td', '...');
-        lastCell.colspan = 4;
-        chunk.appendChild(lastCell);
-      }
-      this.operatorListIdx = operatorList.fnArray.length;
-      this.table.appendChild(chunk);
-    },
-    getNextBreakPoint: function getNextBreakPoint() {
-      this.breakPoints.sort(function(a, b) { return a - b; });
-      for (var i = 0; i < this.breakPoints.length; i++) {
-        if (this.breakPoints[i] > this.currentIdx) {
-          return this.breakPoints[i];
-        }
-      }
-      return null;
-    },
-    breakIt: function breakIt(idx, callback) {
-      StepperManager.selectStepper(this.pageIndex, true);
-      var self = this;
-      var dom = document;
-      self.currentIdx = idx;
-      var listener = function(e) {
-        switch (e.keyCode) {
-          case 83: // step
-            dom.removeEventListener('keydown', listener, false);
-            self.nextBreakPoint = self.currentIdx + 1;
-            self.goTo(-1);
-            callback();
-            break;
-          case 67: // continue
-            dom.removeEventListener('keydown', listener, false);
-            var breakPoint = self.getNextBreakPoint();
-            self.nextBreakPoint = breakPoint;
-            self.goTo(-1);
-            callback();
-            break;
-        }
-      };
-      dom.addEventListener('keydown', listener, false);
-      self.goTo(idx);
-    },
-    goTo: function goTo(idx) {
-      var allRows = this.panel.getElementsByClassName('line');
-      for (var x = 0, xx = allRows.length; x < xx; ++x) {
-        var row = allRows[x];
-        if ((row.dataset.idx | 0) === idx) {
-          row.style.backgroundColor = 'rgb(251,250,207)';
-          row.scrollIntoView();
-        } else {
-          row.style.backgroundColor = null;
-        }
-      }
-    }
-  };
-  return Stepper;
-})();
-
-var Stats = (function Stats() {
-  var stats = [];
-  function clear(node) {
-    while (node.hasChildNodes()) {
-      node.removeChild(node.lastChild);
-    }
-  }
-  function getStatIndex(pageNumber) {
-    for (var i = 0, ii = stats.length; i < ii; ++i) {
-      if (stats[i].pageNumber === pageNumber) {
-        return i;
-      }
-    }
-    return false;
-  }
-  return {
-    // Properties/functions needed by PDFBug.
-    id: 'Stats',
-    name: 'Stats',
-    panel: null,
-    manager: null,
-    init: function init() {
-      this.panel.setAttribute('style', 'padding: 5px;');
-      PDFJS.enableStats = true;
-    },
-    enabled: false,
-    active: false,
-    // Stats specific functions.
-    add: function(pageNumber, stat) {
-      if (!stat) {
-        return;
-      }
-      var statsIndex = getStatIndex(pageNumber);
-      if (statsIndex !== false) {
-        var b = stats[statsIndex];
-        this.panel.removeChild(b.div);
-        stats.splice(statsIndex, 1);
-      }
-      var wrapper = document.createElement('div');
-      wrapper.className = 'stats';
-      var title = document.createElement('div');
-      title.className = 'title';
-      title.textContent = 'Page: ' + pageNumber;
-      var statsDiv = document.createElement('div');
-      statsDiv.textContent = stat.toString();
-      wrapper.appendChild(title);
-      wrapper.appendChild(statsDiv);
-      stats.push({ pageNumber: pageNumber, div: wrapper });
-      stats.sort(function(a, b) { return a.pageNumber - b.pageNumber; });
-      clear(this.panel);
-      for (var i = 0, ii = stats.length; i < ii; ++i) {
-        this.panel.appendChild(stats[i].div);
-      }
-    },
-    cleanup: function () {
-      stats = [];
-      clear(this.panel);
-    }
-  };
-})();
-
-// Manages all the debugging tools.
-var PDFBug = (function PDFBugClosure() {
-  var panelWidth = 300;
-  var buttons = [];
-  var activePanel = null;
-
-  return {
-    tools: [
-      FontInspector,
-      StepperManager,
-      Stats
-    ],
-    enable: function(ids) {
-      var all = false, tools = this.tools;
-      if (ids.length === 1 && ids[0] === 'all') {
-        all = true;
-      }
-      for (var i = 0; i < tools.length; ++i) {
-        var tool = tools[i];
-        if (all || ids.indexOf(tool.id) !== -1) {
-          tool.enabled = true;
-        }
-      }
-      if (!all) {
-        // Sort the tools by the order they are enabled.
-        tools.sort(function(a, b) {
-          var indexA = ids.indexOf(a.id);
-          indexA = indexA < 0 ? tools.length : indexA;
-          var indexB = ids.indexOf(b.id);
-          indexB = indexB < 0 ? tools.length : indexB;
-          return indexA - indexB;
-        });
-      }
-    },
-    init: function init() {
-      /*
-       * Basic Layout:
-       * PDFBug
-       *  Controls
-       *  Panels
-       *    Panel
-       *    Panel
-       *    ...
-       */
-      var ui = document.createElement('div');
-      ui.id = 'PDFBug';
-
-      var controls = document.createElement('div');
-      controls.setAttribute('class', 'controls');
-      ui.appendChild(controls);
-
-      var panels = document.createElement('div');
-      panels.setAttribute('class', 'panels');
-      ui.appendChild(panels);
-
-      var container = document.getElementById('viewerContainer');
-      container.appendChild(ui);
-      container.style.right = panelWidth + 'px';
-
-      // Initialize all the debugging tools.
-      var tools = this.tools;
-      var self = this;
-      for (var i = 0; i < tools.length; ++i) {
-        var tool = tools[i];
-        var panel = document.createElement('div');
-        var panelButton = document.createElement('button');
-        panelButton.textContent = tool.name;
-        panelButton.addEventListener('click', (function(selected) {
-          return function(event) {
-            event.preventDefault();
-            self.selectPanel(selected);
-          };
-        })(i));
-        controls.appendChild(panelButton);
-        panels.appendChild(panel);
-        tool.panel = panel;
-        tool.manager = this;
-        if (tool.enabled) {
-          tool.init();
-        } else {
-          panel.textContent = tool.name + ' is disabled. To enable add ' +
-                              ' "' + tool.id + '" to the pdfBug parameter ' +
-                              'and refresh (seperate multiple by commas).';
-        }
-        buttons.push(panelButton);
-      }
-      this.selectPanel(0);
-    },
-    cleanup: function cleanup() {
-      for (var i = 0, ii = this.tools.length; i < ii; i++) {
-        if (this.tools[i].enabled) {
-          this.tools[i].cleanup();
-        }
-      }
-    },
-    selectPanel: function selectPanel(index) {
-      if (typeof index !== 'number') {
-        index = this.tools.indexOf(index);
-      }
-      if (index === activePanel) {
-        return;
-      }
-      activePanel = index;
-      var tools = this.tools;
-      for (var j = 0; j < tools.length; ++j) {
-        if (j === index) {
-          buttons[j].setAttribute('class', 'active');
-          tools[j].active = true;
-          tools[j].panel.removeAttribute('hidden');
-        } else {
-          buttons[j].setAttribute('class', '');
-          tools[j].active = false;
-          tools[j].panel.setAttribute('hidden', 'true');
-        }
-      }
-    }
-  };
-})();
diff --git a/public/pfd/build/generic/web/images/annotation-check.svg b/public/pfd/build/generic/web/images/annotation-check.svg
deleted file mode 100644
index 71cd16d..0000000
--- a/public/pfd/build/generic/web/images/annotation-check.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   width="40"
-   height="40"
-   viewBox="0 0 40 40">
-  <path
-     d="M 1.5006714,23.536225 6.8925879,18.994244 14.585721,26.037937 34.019683,4.5410479 38.499329,9.2235032 14.585721,35.458952 z"
-     id="path4"
-     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.25402856;stroke-opacity:1" />
-</svg>
diff --git a/public/pfd/build/generic/web/images/annotation-comment.svg b/public/pfd/build/generic/web/images/annotation-comment.svg
deleted file mode 100644
index 86f1f17..0000000
--- a/public/pfd/build/generic/web/images/annotation-comment.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   height="40"
-   width="40"
-   viewBox="0 0 40 40">
-  <rect
-     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     width="33.76017"
-     height="33.76017"
-     x="3.119915"
-     y="3.119915" />
-  <path
-     d="m 20.677967,8.54499 c -7.342801,0 -13.295293,4.954293 -13.295293,11.065751 0,2.088793 0.3647173,3.484376 1.575539,5.150563 L 6.0267418,31.45501 13.560595,29.011117 c 2.221262,1.387962 4.125932,1.665377 7.117372,1.665377 7.3428,0 13.295291,-4.954295 13.295291,-11.065753 0,-6.111458 -5.952491,-11.065751 -13.295291,-11.065751 z"
-     style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.93031836;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
-</svg>
diff --git a/public/pfd/build/generic/web/images/annotation-help.svg b/public/pfd/build/generic/web/images/annotation-help.svg
deleted file mode 100644
index 00938fe..0000000
--- a/public/pfd/build/generic/web/images/annotation-help.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   width="40"
-   height="40"
-   viewBox="0 0 40 40">
-  <g
-     transform="translate(0,-60)"
-     id="layer1">
-    <rect
-       width="36.460953"
-       height="34.805603"
-       x="1.7695236"
-       y="62.597198"
-       style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.30826771;stroke-opacity:1" />
-    <g
-       transform="matrix(0.88763677,0,0,0.88763677,2.2472646,8.9890584)">
-      <path
-         d="M 20,64.526342 C 11.454135,64.526342 4.5263421,71.454135 4.5263421,80 4.5263421,88.545865 11.454135,95.473658 20,95.473658 28.545865,95.473658 35.473658,88.545865 35.473658,80 35.473658,71.454135 28.545865,64.526342 20,64.526342 z m -0.408738,9.488564 c 3.527079,0 6.393832,2.84061 6.393832,6.335441 0,3.494831 -2.866753,6.335441 -6.393832,6.335441 -3.527079,0 -6.393832,-2.84061 -6.393832,-6.335441 0,-3.494831 2.866753,-6.335441 6.393832,-6.335441 z"
-         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.02768445;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         d="m 7.2335209,71.819938 4.9702591,4.161823 c -1.679956,2.581606 -1.443939,6.069592 0.159325,8.677725 l -5.1263071,3.424463 c 0.67516,1.231452 3.0166401,3.547686 4.2331971,4.194757 l 3.907728,-4.567277 c 2.541952,1.45975 5.730694,1.392161 8.438683,-0.12614 l 3.469517,6.108336 c 1.129779,-0.44367 4.742234,-3.449633 5.416358,-5.003859 l -5.46204,-4.415541 c 1.44319,-2.424098 1.651175,-5.267515 0.557303,-7.748623 l 5.903195,-3.833951 C 33.14257,71.704996 30.616217,69.018606 29.02952,67.99296 l -4.118813,4.981678 C 22.411934,71.205099 18.900853,70.937534 16.041319,72.32916 l -3.595408,-5.322091 c -1.345962,0.579488 -4.1293881,2.921233 -5.2123901,4.812869 z m 8.1010311,3.426672 c 2.75284,-2.446266 6.769149,-2.144694 9.048998,0.420874 2.279848,2.56557 2.113919,6.596919 -0.638924,9.043185 -2.752841,2.446267 -6.775754,2.13726 -9.055604,-0.428308 -2.279851,-2.565568 -2.107313,-6.589485 0.64553,-9.035751 z"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-    </g>
-  </g>
-</svg>
diff --git a/public/pfd/build/generic/web/images/annotation-insert.svg b/public/pfd/build/generic/web/images/annotation-insert.svg
deleted file mode 100644
index 519ef68..0000000
--- a/public/pfd/build/generic/web/images/annotation-insert.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   width="64"
-   height="64"
-   viewBox="0 0 64 64">
-  <path
-     d="M 32.003143,1.4044602 57.432701,62.632577 6.5672991,62.627924 z"
-     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:1.00493038;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-</svg>
diff --git a/public/pfd/build/generic/web/images/annotation-key.svg b/public/pfd/build/generic/web/images/annotation-key.svg
deleted file mode 100644
index 8d09d53..0000000
--- a/public/pfd/build/generic/web/images/annotation-key.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   width="64"
-   height="64"
-   viewBox="0 0 64 64">
-  <path
-     d="M 25.470843,9.4933766 C 25.30219,12.141818 30.139101,14.445969 34.704831,13.529144 40.62635,12.541995 41.398833,7.3856498 35.97505,5.777863 31.400921,4.1549155 25.157674,6.5445892 25.470843,9.4933766 z M 4.5246282,17.652051 C 4.068249,11.832873 9.2742983,5.9270407 18.437379,3.0977088 29.751911,-0.87185184 45.495663,1.4008022 53.603953,7.1104009 c 9.275765,6.1889221 7.158128,16.2079421 -3.171076,21.5939521 -1.784316,1.635815 -6.380222,1.21421 -7.068351,3.186186 -1.04003,0.972427 -1.288046,2.050158 -1.232864,3.168203 1.015111,2.000108 -3.831548,1.633216 -3.270553,3.759574 0.589477,5.264544 -0.179276,10.53738 -0.362842,15.806257 -0.492006,2.184998 1.163456,4.574232 -0.734888,6.610642 -2.482919,2.325184 -7.30604,2.189143 -9.193497,-0.274767 -2.733688,-1.740626 -8.254447,-3.615254 -6.104247,-6.339626 3.468112,-1.708686 -2.116197,-3.449897 0.431242,-5.080274 5.058402,-1.39256 -2.393215,-2.304318 -0.146889,-4.334645 3.069198,-0.977415 2.056986,-2.518352 -0.219121,-3.540397 1.876567,-1.807151 1.484149,-4.868919 -2.565455,-5.942205 0.150866,-1.805474 2.905737,-4.136876 -1.679967,-5.20493 C 10.260902,27.882167 4.6872697,22.95045 4.5245945,17.652051 z"
-     id="path604"
-     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.72665179;stroke-opacity:1" />
-</svg>
diff --git a/public/pfd/build/generic/web/images/annotation-newparagraph.svg b/public/pfd/build/generic/web/images/annotation-newparagraph.svg
deleted file mode 100644
index 38d2497..0000000
--- a/public/pfd/build/generic/web/images/annotation-newparagraph.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   width="64"
-   height="64"
-   viewBox="0 0 64 64">
-  <path
-     d="M 32.003143,10.913072 57.432701,53.086929 6.567299,53.083723 z"
-     id="path2985"
-     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:0.83403099;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-</svg>
diff --git a/public/pfd/build/generic/web/images/annotation-noicon.svg b/public/pfd/build/generic/web/images/annotation-noicon.svg
deleted file mode 100644
index c07d108..0000000
--- a/public/pfd/build/generic/web/images/annotation-noicon.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   width="40"
-   height="40"
-   viewBox="0 0 40 40">
-</svg>
diff --git a/public/pfd/build/generic/web/images/annotation-note.svg b/public/pfd/build/generic/web/images/annotation-note.svg
deleted file mode 100644
index 7017365..0000000
--- a/public/pfd/build/generic/web/images/annotation-note.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   width="40"
-   height="40"
-   viewBox="0 0 40 40">
-  <rect
-     width="36.075428"
-     height="31.096582"
-     x="1.962286"
-     y="4.4517088"
-     id="rect4"
-     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.23004246;stroke-opacity:1" />
-  <rect
-     width="27.96859"
-     height="1.5012145"
-     x="6.0157046"
-     y="10.285"
-     id="rect6"
-     style="fill:#000000;fill-opacity:1;stroke:none" />
-  <rect
-     width="27.96859"
-     height="0.85783684"
-     x="6.0157056"
-     y="23.21689"
-     id="rect8"
-     style="fill:#000000;fill-opacity:1;stroke:none" />
-  <rect
-     width="27.96859"
-     height="0.85783684"
-     x="5.8130345"
-     y="28.964394"
-     id="rect10"
-     style="fill:#000000;fill-opacity:1;stroke:none" />
-  <rect
-     width="27.96859"
-     height="0.85783684"
-     x="6.0157046"
-     y="17.426493"
-     id="rect12"
-     style="fill:#000000;fill-opacity:1;stroke:none" />
-</svg>
diff --git a/public/pfd/build/generic/web/images/annotation-paragraph.svg b/public/pfd/build/generic/web/images/annotation-paragraph.svg
deleted file mode 100644
index 6ae5212..0000000
--- a/public/pfd/build/generic/web/images/annotation-paragraph.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   width="40"
-   height="40"
-   viewBox="0 0 40 40">
-  <rect
-     width="33.76017"
-     height="33.76017"
-     x="3.119915"
-     y="3.119915"
-     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-  <path
-     d="m 17.692678,34.50206 0,-16.182224 c -1.930515,-0.103225 -3.455824,-0.730383 -4.57593,-1.881473 -1.12011,-1.151067 -1.680164,-2.619596 -1.680164,-4.405591 0,-1.992435 0.621995,-3.5796849 1.865988,-4.7617553 1.243989,-1.1820288 3.06352,-1.7730536 5.458598,-1.7730764 l 9.802246,0 0,2.6789711 -2.229895,0 0,26.3251486 -2.632515,0 0,-26.3251486 -3.45324,0 0,26.3251486 z"
-     style="font-size:29.42051125px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.07795751;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
-</svg>
diff --git a/public/pfd/build/generic/web/images/findbarButton-next-rtl.png b/public/pfd/build/generic/web/images/findbarButton-next-rtl.png
deleted file mode 100644
index bef0274..0000000
--- a/public/pfd/build/generic/web/images/findbarButton-next-rtl.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/findbarButton-next-rtl@2x.png b/public/pfd/build/generic/web/images/findbarButton-next-rtl@2x.png
deleted file mode 100644
index 1da6dc9..0000000
--- a/public/pfd/build/generic/web/images/findbarButton-next-rtl@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/findbarButton-next.png b/public/pfd/build/generic/web/images/findbarButton-next.png
deleted file mode 100644
index de1d0fc..0000000
--- a/public/pfd/build/generic/web/images/findbarButton-next.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/findbarButton-next@2x.png b/public/pfd/build/generic/web/images/findbarButton-next@2x.png
deleted file mode 100644
index 0250307..0000000
--- a/public/pfd/build/generic/web/images/findbarButton-next@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/findbarButton-previous-rtl.png b/public/pfd/build/generic/web/images/findbarButton-previous-rtl.png
deleted file mode 100644
index de1d0fc..0000000
--- a/public/pfd/build/generic/web/images/findbarButton-previous-rtl.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/findbarButton-previous-rtl@2x.png b/public/pfd/build/generic/web/images/findbarButton-previous-rtl@2x.png
deleted file mode 100644
index 0250307..0000000
--- a/public/pfd/build/generic/web/images/findbarButton-previous-rtl@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/findbarButton-previous.png b/public/pfd/build/generic/web/images/findbarButton-previous.png
deleted file mode 100644
index bef0274..0000000
--- a/public/pfd/build/generic/web/images/findbarButton-previous.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/findbarButton-previous@2x.png b/public/pfd/build/generic/web/images/findbarButton-previous@2x.png
deleted file mode 100644
index 1da6dc9..0000000
--- a/public/pfd/build/generic/web/images/findbarButton-previous@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/grab.cur b/public/pfd/build/generic/web/images/grab.cur
deleted file mode 100644
index db7ad5a..0000000
--- a/public/pfd/build/generic/web/images/grab.cur
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/grabbing.cur b/public/pfd/build/generic/web/images/grabbing.cur
deleted file mode 100644
index e0dfd04..0000000
--- a/public/pfd/build/generic/web/images/grabbing.cur
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/loading-icon.gif b/public/pfd/build/generic/web/images/loading-icon.gif
deleted file mode 100644
index 1c72ebb..0000000
--- a/public/pfd/build/generic/web/images/loading-icon.gif
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/loading-small.png b/public/pfd/build/generic/web/images/loading-small.png
deleted file mode 100644
index 8831a80..0000000
--- a/public/pfd/build/generic/web/images/loading-small.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/loading-small@2x.png b/public/pfd/build/generic/web/images/loading-small@2x.png
deleted file mode 100644
index b25b445..0000000
--- a/public/pfd/build/generic/web/images/loading-small@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-documentProperties.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-documentProperties.png
deleted file mode 100644
index 40925e2..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-documentProperties.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-documentProperties@2x.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-documentProperties@2x.png
deleted file mode 100644
index adb240e..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-documentProperties@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-firstPage.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-firstPage.png
deleted file mode 100644
index e68846a..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-firstPage.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-firstPage@2x.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-firstPage@2x.png
deleted file mode 100644
index 3ad8af5..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-firstPage@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-handTool.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-handTool.png
deleted file mode 100644
index cb85a84..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-handTool.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-handTool@2x.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-handTool@2x.png
deleted file mode 100644
index 5c13f77..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-handTool@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-lastPage.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-lastPage.png
deleted file mode 100644
index be763e0..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-lastPage.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-lastPage@2x.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-lastPage@2x.png
deleted file mode 100644
index 8570984..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-lastPage@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCcw.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCcw.png
deleted file mode 100644
index 675d6da..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCcw.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCcw@2x.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCcw@2x.png
deleted file mode 100644
index b9e7431..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCcw@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCw.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCw.png
deleted file mode 100644
index e1c7598..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCw.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCw@2x.png b/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCw@2x.png
deleted file mode 100644
index cb257b4..0000000
--- a/public/pfd/build/generic/web/images/secondaryToolbarButton-rotateCw@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/shadow.png b/public/pfd/build/generic/web/images/shadow.png
deleted file mode 100644
index 31d3bdb..0000000
--- a/public/pfd/build/generic/web/images/shadow.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/texture.png b/public/pfd/build/generic/web/images/texture.png
deleted file mode 100644
index eb5ccb5..0000000
--- a/public/pfd/build/generic/web/images/texture.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-bookmark.png b/public/pfd/build/generic/web/images/toolbarButton-bookmark.png
deleted file mode 100644
index a187be6..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-bookmark.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-bookmark@2x.png b/public/pfd/build/generic/web/images/toolbarButton-bookmark@2x.png
deleted file mode 100644
index 4efbaa6..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-bookmark@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-download.png b/public/pfd/build/generic/web/images/toolbarButton-download.png
deleted file mode 100644
index eaab35f..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-download.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-download@2x.png b/public/pfd/build/generic/web/images/toolbarButton-download@2x.png
deleted file mode 100644
index 896face..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-download@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-menuArrows.png b/public/pfd/build/generic/web/images/toolbarButton-menuArrows.png
deleted file mode 100644
index 306eb43..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-menuArrows.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-menuArrows@2x.png b/public/pfd/build/generic/web/images/toolbarButton-menuArrows@2x.png
deleted file mode 100644
index f7570bc..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-menuArrows@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-openFile.png b/public/pfd/build/generic/web/images/toolbarButton-openFile.png
deleted file mode 100644
index b5cf1bd..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-openFile.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-openFile@2x.png b/public/pfd/build/generic/web/images/toolbarButton-openFile@2x.png
deleted file mode 100644
index 91ab765..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-openFile@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-pageDown-rtl.png b/public/pfd/build/generic/web/images/toolbarButton-pageDown-rtl.png
deleted file mode 100644
index 1957f79..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-pageDown-rtl.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-pageDown-rtl@2x.png b/public/pfd/build/generic/web/images/toolbarButton-pageDown-rtl@2x.png
deleted file mode 100644
index 16ebcb8..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-pageDown-rtl@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-pageDown.png b/public/pfd/build/generic/web/images/toolbarButton-pageDown.png
deleted file mode 100644
index 8219ecf..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-pageDown.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-pageDown@2x.png b/public/pfd/build/generic/web/images/toolbarButton-pageDown@2x.png
deleted file mode 100644
index 758c01d..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-pageDown@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-pageUp-rtl.png b/public/pfd/build/generic/web/images/toolbarButton-pageUp-rtl.png
deleted file mode 100644
index 98e7ce4..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-pageUp-rtl.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-pageUp-rtl@2x.png b/public/pfd/build/generic/web/images/toolbarButton-pageUp-rtl@2x.png
deleted file mode 100644
index a01b023..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-pageUp-rtl@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-pageUp.png b/public/pfd/build/generic/web/images/toolbarButton-pageUp.png
deleted file mode 100644
index fb9daa3..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-pageUp.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-pageUp@2x.png b/public/pfd/build/generic/web/images/toolbarButton-pageUp@2x.png
deleted file mode 100644
index a5cfd75..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-pageUp@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-presentationMode.png b/public/pfd/build/generic/web/images/toolbarButton-presentationMode.png
deleted file mode 100644
index 3ac2124..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-presentationMode.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-presentationMode@2x.png b/public/pfd/build/generic/web/images/toolbarButton-presentationMode@2x.png
deleted file mode 100644
index cada9e7..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-presentationMode@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-print.png b/public/pfd/build/generic/web/images/toolbarButton-print.png
deleted file mode 100644
index 51275e5..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-print.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-print@2x.png b/public/pfd/build/generic/web/images/toolbarButton-print@2x.png
deleted file mode 100644
index 53d18da..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-print@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-search.png b/public/pfd/build/generic/web/images/toolbarButton-search.png
deleted file mode 100644
index f9b7557..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-search.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-search@2x.png b/public/pfd/build/generic/web/images/toolbarButton-search@2x.png
deleted file mode 100644
index 456b133..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-search@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl.png b/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl.png
deleted file mode 100644
index 8437095..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png b/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png
deleted file mode 100644
index 9d9bfa4..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle.png b/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle.png
deleted file mode 100644
index 1f90f83..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle@2x.png b/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle@2x.png
deleted file mode 100644
index b066fe5..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-secondaryToolbarToggle@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle-rtl.png b/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle-rtl.png
deleted file mode 100644
index 6f85ec0..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle-rtl.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle-rtl@2x.png b/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle-rtl@2x.png
deleted file mode 100644
index 291e006..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle-rtl@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle.png b/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle.png
deleted file mode 100644
index 025dc90..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle@2x.png b/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle@2x.png
deleted file mode 100644
index 7f834df..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-sidebarToggle@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-viewAttachments.png b/public/pfd/build/generic/web/images/toolbarButton-viewAttachments.png
deleted file mode 100644
index fcd0b26..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-viewAttachments.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-viewAttachments@2x.png b/public/pfd/build/generic/web/images/toolbarButton-viewAttachments@2x.png
deleted file mode 100644
index b979e52..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-viewAttachments@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-viewOutline-rtl.png b/public/pfd/build/generic/web/images/toolbarButton-viewOutline-rtl.png
deleted file mode 100644
index aaa9430..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-viewOutline-rtl.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-viewOutline-rtl@2x.png b/public/pfd/build/generic/web/images/toolbarButton-viewOutline-rtl@2x.png
deleted file mode 100644
index 3410f70..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-viewOutline-rtl@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-viewOutline.png b/public/pfd/build/generic/web/images/toolbarButton-viewOutline.png
deleted file mode 100644
index 976365a..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-viewOutline.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-viewOutline@2x.png b/public/pfd/build/generic/web/images/toolbarButton-viewOutline@2x.png
deleted file mode 100644
index b6a197f..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-viewOutline@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-viewThumbnail.png b/public/pfd/build/generic/web/images/toolbarButton-viewThumbnail.png
deleted file mode 100644
index 584ba55..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-viewThumbnail.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-viewThumbnail@2x.png b/public/pfd/build/generic/web/images/toolbarButton-viewThumbnail@2x.png
deleted file mode 100644
index fb7db93..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-viewThumbnail@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-zoomIn.png b/public/pfd/build/generic/web/images/toolbarButton-zoomIn.png
deleted file mode 100644
index 513d081..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-zoomIn.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-zoomIn@2x.png b/public/pfd/build/generic/web/images/toolbarButton-zoomIn@2x.png
deleted file mode 100644
index d5d49d5..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-zoomIn@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-zoomOut.png b/public/pfd/build/generic/web/images/toolbarButton-zoomOut.png
deleted file mode 100644
index 156c26b..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-zoomOut.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/images/toolbarButton-zoomOut@2x.png b/public/pfd/build/generic/web/images/toolbarButton-zoomOut@2x.png
deleted file mode 100644
index 959e191..0000000
--- a/public/pfd/build/generic/web/images/toolbarButton-zoomOut@2x.png
+++ /dev/null
Binary files differ
diff --git a/public/pfd/build/generic/web/l10n.js b/public/pfd/build/generic/web/l10n.js
deleted file mode 100644
index 3d5ecff..0000000
--- a/public/pfd/build/generic/web/l10n.js
+++ /dev/null
@@ -1,1033 +0,0 @@
-/**
- * Copyright (c) 2011-2013 Fabien Cazenave, Mozilla.
- *
- * 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.
- */
-/*
-  Additional modifications for PDF.js project:
-    - Disables language initialization on page loading;
-    - Removes consoleWarn and consoleLog and use console.log/warn directly.
-    - Removes window._ assignment.
-    - Remove compatibility code for OldIE.
-*/
-
-/*jshint browser: true, devel: true, es5: true, globalstrict: true */
-'use strict';
-
-document.webL10n = (function(window, document, undefined) {
-  var gL10nData = {};
-  var gTextData = '';
-  var gTextProp = 'textContent';
-  var gLanguage = '';
-  var gMacros = {};
-  var gReadyState = 'loading';
-
-
-  /**
-   * Synchronously loading l10n resources significantly minimizes flickering
-   * from displaying the app with non-localized strings and then updating the
-   * strings. Although this will block all script execution on this page, we
-   * expect that the l10n resources are available locally on flash-storage.
-   *
-   * As synchronous XHR is generally considered as a bad idea, we're still
-   * loading l10n resources asynchronously -- but we keep this in a setting,
-   * just in case... and applications using this library should hide their
-   * content until the `localized' event happens.
-   */
-
-  var gAsyncResourceLoading = true; // read-only
-
-
-  /**
-   * DOM helpers for the so-called "HTML API".
-   *
-   * These functions are written for modern browsers. For old versions of IE,
-   * they're overridden in the 'startup' section at the end of this file.
-   */
-
-  function getL10nResourceLinks() {
-    return document.querySelectorAll('link[type="application/l10n"]');
-  }
-
-  function getL10nDictionary() {
-    var script = document.querySelector('script[type="application/l10n"]');
-    // TODO: support multiple and external JSON dictionaries
-    return script ? JSON.parse(script.innerHTML) : null;
-  }
-
-  function getTranslatableChildren(element) {
-    return element ? element.querySelectorAll('*[data-l10n-id]') : [];
-  }
-
-  function getL10nAttributes(element) {
-    if (!element)
-      return {};
-
-    var l10nId = element.getAttribute('data-l10n-id');
-    var l10nArgs = element.getAttribute('data-l10n-args');
-    var args = {};
-    if (l10nArgs) {
-      try {
-        args = JSON.parse(l10nArgs);
-      } catch (e) {
-        console.warn('could not parse arguments for #' + l10nId);
-      }
-    }
-    return { id: l10nId, args: args };
-  }
-
-  function fireL10nReadyEvent(lang) {
-    var evtObject = document.createEvent('Event');
-    evtObject.initEvent('localized', true, false);
-    evtObject.language = lang;
-    document.dispatchEvent(evtObject);
-  }
-
-  function xhrLoadText(url, onSuccess, onFailure) {
-    onSuccess = onSuccess || function _onSuccess(data) {};
-    onFailure = onFailure || function _onFailure() {
-      console.warn(url + ' not found.');
-    };
-
-    var xhr = new XMLHttpRequest();
-    xhr.open('GET', url, gAsyncResourceLoading);
-    if (xhr.overrideMimeType) {
-      xhr.overrideMimeType('text/plain; charset=utf-8');
-    }
-    xhr.onreadystatechange = function() {
-      if (xhr.readyState == 4) {
-        if (xhr.status == 200 || xhr.status === 0) {
-          onSuccess(xhr.responseText);
-        } else {
-          onFailure();
-        }
-      }
-    };
-    xhr.onerror = onFailure;
-    xhr.ontimeout = onFailure;
-
-    // in Firefox OS with the app:// protocol, trying to XHR a non-existing
-    // URL will raise an exception here -- hence this ugly try...catch.
-    try {
-      xhr.send(null);
-    } catch (e) {
-      onFailure();
-    }
-  }
-
-
-  /**
-   * l10n resource parser:
-   *  - reads (async XHR) the l10n resource matching `lang';
-   *  - imports linked resources (synchronously) when specified;
-   *  - parses the text data (fills `gL10nData' and `gTextData');
-   *  - triggers success/failure callbacks when done.
-   *
-   * @param {string} href
-   *    URL of the l10n resource to parse.
-   *
-   * @param {string} lang
-   *    locale (language) to parse. Must be a lowercase string.
-   *
-   * @param {Function} successCallback
-   *    triggered when the l10n resource has been successully parsed.
-   *
-   * @param {Function} failureCallback
-   *    triggered when the an error has occured.
-   *
-   * @return {void}
-   *    uses the following global variables: gL10nData, gTextData, gTextProp.
-   */
-
-  function parseResource(href, lang, successCallback, failureCallback) {
-    var baseURL = href.replace(/[^\/]*$/, '') || './';
-
-    // handle escaped characters (backslashes) in a string
-    function evalString(text) {
-      if (text.lastIndexOf('\\') < 0)
-        return text;
-      return text.replace(/\\\\/g, '\\')
-                 .replace(/\\n/g, '\n')
-                 .replace(/\\r/g, '\r')
-                 .replace(/\\t/g, '\t')
-                 .replace(/\\b/g, '\b')
-                 .replace(/\\f/g, '\f')
-                 .replace(/\\{/g, '{')
-                 .replace(/\\}/g, '}')
-                 .replace(/\\"/g, '"')
-                 .replace(/\\'/g, "'");
-    }
-
-    // parse *.properties text data into an l10n dictionary
-    // If gAsyncResourceLoading is false, then the callback will be called
-    // synchronously. Otherwise it is called asynchronously.
-    function parseProperties(text, parsedPropertiesCallback) {
-      var dictionary = {};
-
-      // token expressions
-      var reBlank = /^\s*|\s*$/;
-      var reComment = /^\s*#|^\s*$/;
-      var reSection = /^\s*\[(.*)\]\s*$/;
-      var reImport = /^\s*@import\s+url\((.*)\)\s*$/i;
-      var reSplit = /^([^=\s]*)\s*=\s*(.+)$/; // TODO: escape EOLs with '\'
-
-      // parse the *.properties file into an associative array
-      function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {
-        var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
-        var currentLang = '*';
-        var genericLang = lang.split('-', 1)[0];
-        var skipLang = false;
-        var match = '';
-
-        function nextEntry() {
-          // Use infinite loop instead of recursion to avoid reaching the
-          // maximum recursion limit for content with many lines.
-          while (true) {
-            if (!entries.length) {
-              parsedRawLinesCallback();
-              return;
-            }
-            var line = entries.shift();
-
-            // comment or blank line?
-            if (reComment.test(line))
-              continue;
-
-            // the extended syntax supports [lang] sections and @import rules
-            if (extendedSyntax) {
-              match = reSection.exec(line);
-              if (match) { // section start?
-                // RFC 4646, section 4.4, "All comparisons MUST be performed
-                // in a case-insensitive manner."
-
-                currentLang = match[1].toLowerCase();
-                skipLang = (currentLang !== '*') &&
-                    (currentLang !== lang) && (currentLang !== genericLang);
-                continue;
-              } else if (skipLang) {
-                continue;
-              }
-              match = reImport.exec(line);
-              if (match) { // @import rule?
-                loadImport(baseURL + match[1], nextEntry);
-                return;
-              }
-            }
-
-            // key-value pair
-            var tmp = line.match(reSplit);
-            if (tmp && tmp.length == 3) {
-              dictionary[tmp[1]] = evalString(tmp[2]);
-            }
-          }
-        }
-        nextEntry();
-      }
-
-      // import another *.properties file
-      function loadImport(url, callback) {
-        xhrLoadText(url, function(content) {
-          parseRawLines(content, false, callback); // don't allow recursive imports
-        }, null);
-      }
-
-      // fill the dictionary
-      parseRawLines(text, true, function() {
-        parsedPropertiesCallback(dictionary);
-      });
-    }
-
-    // load and parse l10n data (warning: global variables are used here)
-    xhrLoadText(href, function(response) {
-      gTextData += response; // mostly for debug
-
-      // parse *.properties text data into an l10n dictionary
-      parseProperties(response, function(data) {
-
-        // find attribute descriptions, if any
-        for (var key in data) {
-          var id, prop, index = key.lastIndexOf('.');
-          if (index > 0) { // an attribute has been specified
-            id = key.substring(0, index);
-            prop = key.substr(index + 1);
-          } else { // no attribute: assuming text content by default
-            id = key;
-            prop = gTextProp;
-          }
-          if (!gL10nData[id]) {
-            gL10nData[id] = {};
-          }
-          gL10nData[id][prop] = data[key];
-        }
-
-        // trigger callback
-        if (successCallback) {
-          successCallback();
-        }
-      });
-    }, failureCallback);
-  }
-
-  // load and parse all resources for the specified locale
-  function loadLocale(lang, callback) {
-    // RFC 4646, section 2.1 states that language tags have to be treated as
-    // case-insensitive. Convert to lowercase for case-insensitive comparisons.
-    if (lang) {
-      lang = lang.toLowerCase();
-    }
-
-    callback = callback || function _callback() {};
-
-    clear();
-    gLanguage = lang;
-
-    // check all <link type="application/l10n" href="..." /> nodes
-    // and load the resource files
-    var langLinks = getL10nResourceLinks();
-    var langCount = langLinks.length;
-    if (langCount === 0) {
-      // we might have a pre-compiled dictionary instead
-      var dict = getL10nDictionary();
-      if (dict && dict.locales && dict.default_locale) {
-        console.log('using the embedded JSON directory, early way out');
-        gL10nData = dict.locales[lang];
-        if (!gL10nData) {
-          var defaultLocale = dict.default_locale.toLowerCase();
-          for (var anyCaseLang in dict.locales) {
-            anyCaseLang = anyCaseLang.toLowerCase();
-            if (anyCaseLang === lang) {
-              gL10nData = dict.locales[lang];
-              break;
-            } else if (anyCaseLang === defaultLocale) {
-              gL10nData = dict.locales[defaultLocale];
-            }
-          }
-        }
-        callback();
-      } else {
-        console.log('no resource to load, early way out');
-      }
-      // early way out
-      fireL10nReadyEvent(lang);
-      gReadyState = 'complete';
-      return;
-    }
-
-    // start the callback when all resources are loaded
-    var onResourceLoaded = null;
-    var gResourceCount = 0;
-    onResourceLoaded = function() {
-      gResourceCount++;
-      if (gResourceCount >= langCount) {
-        callback();
-        fireL10nReadyEvent(lang);
-        gReadyState = 'complete';
-      }
-    };
-
-    // load all resource files
-    function L10nResourceLink(link) {
-      var href = link.href;
-      // Note: If |gAsyncResourceLoading| is false, then the following callbacks
-      // are synchronously called.
-      this.load = function(lang, callback) {
-        parseResource(href, lang, callback, function() {
-          console.warn(href + ' not found.');
-          // lang not found, used default resource instead
-          console.warn('"' + lang + '" resource not found');
-          gLanguage = '';
-          // Resource not loaded, but we still need to call the callback.
-          callback();
-        });
-      };
-    }
-
-    for (var i = 0; i < langCount; i++) {
-      var resource = new L10nResourceLink(langLinks[i]);
-      resource.load(lang, onResourceLoaded);
-    }
-  }
-
-  // clear all l10n data
-  function clear() {
-    gL10nData = {};
-    gTextData = '';
-    gLanguage = '';
-    // TODO: clear all non predefined macros.
-    // There's no such macro /yet/ but we're planning to have some...
-  }
-
-
-  /**
-   * Get rules for plural forms (shared with JetPack), see:
-   * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
-   * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p
-   *
-   * @param {string} lang
-   *    locale (language) used.
-   *
-   * @return {Function}
-   *    returns a function that gives the plural form name for a given integer:
-   *       var fun = getPluralRules('en');
-   *       fun(1)    -> 'one'
-   *       fun(0)    -> 'other'
-   *       fun(1000) -> 'other'.
-   */
-
-  function getPluralRules(lang) {
-    var locales2rules = {
-      'af': 3,
-      'ak': 4,
-      'am': 4,
-      'ar': 1,
-      'asa': 3,
-      'az': 0,
-      'be': 11,
-      'bem': 3,
-      'bez': 3,
-      'bg': 3,
-      'bh': 4,
-      'bm': 0,
-      'bn': 3,
-      'bo': 0,
-      'br': 20,
-      'brx': 3,
-      'bs': 11,
-      'ca': 3,
-      'cgg': 3,
-      'chr': 3,
-      'cs': 12,
-      'cy': 17,
-      'da': 3,
-      'de': 3,
-      'dv': 3,
-      'dz': 0,
-      'ee': 3,
-      'el': 3,
-      'en': 3,
-      'eo': 3,
-      'es': 3,
-      'et': 3,
-      'eu': 3,
-      'fa': 0,
-      'ff': 5,
-      'fi': 3,
-      'fil': 4,
-      'fo': 3,
-      'fr': 5,
-      'fur': 3,
-      'fy': 3,
-      'ga': 8,
-      'gd': 24,
-      'gl': 3,
-      'gsw': 3,
-      'gu': 3,
-      'guw': 4,
-      'gv': 23,
-      'ha': 3,
-      'haw': 3,
-      'he': 2,
-      'hi': 4,
-      'hr': 11,
-      'hu': 0,
-      'id': 0,
-      'ig': 0,
-      'ii': 0,
-      'is': 3,
-      'it': 3,
-      'iu': 7,
-      'ja': 0,
-      'jmc': 3,
-      'jv': 0,
-      'ka': 0,
-      'kab': 5,
-      'kaj': 3,
-      'kcg': 3,
-      'kde': 0,
-      'kea': 0,
-      'kk': 3,
-      'kl': 3,
-      'km': 0,
-      'kn': 0,
-      'ko': 0,
-      'ksb': 3,
-      'ksh': 21,
-      'ku': 3,
-      'kw': 7,
-      'lag': 18,
-      'lb': 3,
-      'lg': 3,
-      'ln': 4,
-      'lo': 0,
-      'lt': 10,
-      'lv': 6,
-      'mas': 3,
-      'mg': 4,
-      'mk': 16,
-      'ml': 3,
-      'mn': 3,
-      'mo': 9,
-      'mr': 3,
-      'ms': 0,
-      'mt': 15,
-      'my': 0,
-      'nah': 3,
-      'naq': 7,
-      'nb': 3,
-      'nd': 3,
-      'ne': 3,
-      'nl': 3,
-      'nn': 3,
-      'no': 3,
-      'nr': 3,
-      'nso': 4,
-      'ny': 3,
-      'nyn': 3,
-      'om': 3,
-      'or': 3,
-      'pa': 3,
-      'pap': 3,
-      'pl': 13,
-      'ps': 3,
-      'pt': 3,
-      'rm': 3,
-      'ro': 9,
-      'rof': 3,
-      'ru': 11,
-      'rwk': 3,
-      'sah': 0,
-      'saq': 3,
-      'se': 7,
-      'seh': 3,
-      'ses': 0,
-      'sg': 0,
-      'sh': 11,
-      'shi': 19,
-      'sk': 12,
-      'sl': 14,
-      'sma': 7,
-      'smi': 7,
-      'smj': 7,
-      'smn': 7,
-      'sms': 7,
-      'sn': 3,
-      'so': 3,
-      'sq': 3,
-      'sr': 11,
-      'ss': 3,
-      'ssy': 3,
-      'st': 3,
-      'sv': 3,
-      'sw': 3,
-      'syr': 3,
-      'ta': 3,
-      'te': 3,
-      'teo': 3,
-      'th': 0,
-      'ti': 4,
-      'tig': 3,
-      'tk': 3,
-      'tl': 4,
-      'tn': 3,
-      'to': 0,
-      'tr': 0,
-      'ts': 3,
-      'tzm': 22,
-      'uk': 11,
-      'ur': 3,
-      've': 3,
-      'vi': 0,
-      'vun': 3,
-      'wa': 4,
-      'wae': 3,
-      'wo': 0,
-      'xh': 3,
-      'xog': 3,
-      'yo': 0,
-      'zh': 0,
-      'zu': 3
-    };
-
-    // utility functions for plural rules methods
-    function isIn(n, list) {
-      return list.indexOf(n) !== -1;
-    }
-    function isBetween(n, start, end) {
-      return start <= n && n <= end;
-    }
-
-    // list of all plural rules methods:
-    // map an integer to the plural form name to use
-    var pluralRules = {
-      '0': function(n) {
-        return 'other';
-      },
-      '1': function(n) {
-        if ((isBetween((n % 100), 3, 10)))
-          return 'few';
-        if (n === 0)
-          return 'zero';
-        if ((isBetween((n % 100), 11, 99)))
-          return 'many';
-        if (n == 2)
-          return 'two';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '2': function(n) {
-        if (n !== 0 && (n % 10) === 0)
-          return 'many';
-        if (n == 2)
-          return 'two';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '3': function(n) {
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '4': function(n) {
-        if ((isBetween(n, 0, 1)))
-          return 'one';
-        return 'other';
-      },
-      '5': function(n) {
-        if ((isBetween(n, 0, 2)) && n != 2)
-          return 'one';
-        return 'other';
-      },
-      '6': function(n) {
-        if (n === 0)
-          return 'zero';
-        if ((n % 10) == 1 && (n % 100) != 11)
-          return 'one';
-        return 'other';
-      },
-      '7': function(n) {
-        if (n == 2)
-          return 'two';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '8': function(n) {
-        if ((isBetween(n, 3, 6)))
-          return 'few';
-        if ((isBetween(n, 7, 10)))
-          return 'many';
-        if (n == 2)
-          return 'two';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '9': function(n) {
-        if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19)))
-          return 'few';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '10': function(n) {
-        if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19)))
-          return 'few';
-        if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19)))
-          return 'one';
-        return 'other';
-      },
-      '11': function(n) {
-        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))
-          return 'few';
-        if ((n % 10) === 0 ||
-            (isBetween((n % 10), 5, 9)) ||
-            (isBetween((n % 100), 11, 14)))
-          return 'many';
-        if ((n % 10) == 1 && (n % 100) != 11)
-          return 'one';
-        return 'other';
-      },
-      '12': function(n) {
-        if ((isBetween(n, 2, 4)))
-          return 'few';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '13': function(n) {
-        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))
-          return 'few';
-        if (n != 1 && (isBetween((n % 10), 0, 1)) ||
-            (isBetween((n % 10), 5, 9)) ||
-            (isBetween((n % 100), 12, 14)))
-          return 'many';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '14': function(n) {
-        if ((isBetween((n % 100), 3, 4)))
-          return 'few';
-        if ((n % 100) == 2)
-          return 'two';
-        if ((n % 100) == 1)
-          return 'one';
-        return 'other';
-      },
-      '15': function(n) {
-        if (n === 0 || (isBetween((n % 100), 2, 10)))
-          return 'few';
-        if ((isBetween((n % 100), 11, 19)))
-          return 'many';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '16': function(n) {
-        if ((n % 10) == 1 && n != 11)
-          return 'one';
-        return 'other';
-      },
-      '17': function(n) {
-        if (n == 3)
-          return 'few';
-        if (n === 0)
-          return 'zero';
-        if (n == 6)
-          return 'many';
-        if (n == 2)
-          return 'two';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '18': function(n) {
-        if (n === 0)
-          return 'zero';
-        if ((isBetween(n, 0, 2)) && n !== 0 && n != 2)
-          return 'one';
-        return 'other';
-      },
-      '19': function(n) {
-        if ((isBetween(n, 2, 10)))
-          return 'few';
-        if ((isBetween(n, 0, 1)))
-          return 'one';
-        return 'other';
-      },
-      '20': function(n) {
-        if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !(
-            isBetween((n % 100), 10, 19) ||
-            isBetween((n % 100), 70, 79) ||
-            isBetween((n % 100), 90, 99)
-            ))
-          return 'few';
-        if ((n % 1000000) === 0 && n !== 0)
-          return 'many';
-        if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92]))
-          return 'two';
-        if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91]))
-          return 'one';
-        return 'other';
-      },
-      '21': function(n) {
-        if (n === 0)
-          return 'zero';
-        if (n == 1)
-          return 'one';
-        return 'other';
-      },
-      '22': function(n) {
-        if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99)))
-          return 'one';
-        return 'other';
-      },
-      '23': function(n) {
-        if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0)
-          return 'one';
-        return 'other';
-      },
-      '24': function(n) {
-        if ((isBetween(n, 3, 10) || isBetween(n, 13, 19)))
-          return 'few';
-        if (isIn(n, [2, 12]))
-          return 'two';
-        if (isIn(n, [1, 11]))
-          return 'one';
-        return 'other';
-      }
-    };
-
-    // return a function that gives the plural form name for a given integer
-    var index = locales2rules[lang.replace(/-.*$/, '')];
-    if (!(index in pluralRules)) {
-      console.warn('plural form unknown for [' + lang + ']');
-      return function() { return 'other'; };
-    }
-    return pluralRules[index];
-  }
-
-  // pre-defined 'plural' macro
-  gMacros.plural = function(str, param, key, prop) {
-    var n = parseFloat(param);
-    if (isNaN(n))
-      return str;
-
-    // TODO: support other properties (l20n still doesn't...)
-    if (prop != gTextProp)
-      return str;
-
-    // initialize _pluralRules
-    if (!gMacros._pluralRules) {
-      gMacros._pluralRules = getPluralRules(gLanguage);
-    }
-    var index = '[' + gMacros._pluralRules(n) + ']';
-
-    // try to find a [zero|one|two] key if it's defined
-    if (n === 0 && (key + '[zero]') in gL10nData) {
-      str = gL10nData[key + '[zero]'][prop];
-    } else if (n == 1 && (key + '[one]') in gL10nData) {
-      str = gL10nData[key + '[one]'][prop];
-    } else if (n == 2 && (key + '[two]') in gL10nData) {
-      str = gL10nData[key + '[two]'][prop];
-    } else if ((key + index) in gL10nData) {
-      str = gL10nData[key + index][prop];
-    } else if ((key + '[other]') in gL10nData) {
-      str = gL10nData[key + '[other]'][prop];
-    }
-
-    return str;
-  };
-
-
-  /**
-   * l10n dictionary functions
-   */
-
-  // fetch an l10n object, warn if not found, apply `args' if possible
-  function getL10nData(key, args, fallback) {
-    var data = gL10nData[key];
-    if (!data) {
-      console.warn('#' + key + ' is undefined.');
-      if (!fallback) {
-        return null;
-      }
-      data = fallback;
-    }
-
-    /** This is where l10n expressions should be processed.
-      * The plan is to support C-style expressions from the l20n project;
-      * until then, only two kinds of simple expressions are supported:
-      *   {[ index ]} and {{ arguments }}.
-      */
-    var rv = {};
-    for (var prop in data) {
-      var str = data[prop];
-      str = substIndexes(str, args, key, prop);
-      str = substArguments(str, args, key);
-      rv[prop] = str;
-    }
-    return rv;
-  }
-
-  // replace {[macros]} with their values
-  function substIndexes(str, args, key, prop) {
-    var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/;
-    var reMatch = reIndex.exec(str);
-    if (!reMatch || !reMatch.length)
-      return str;
-
-    // an index/macro has been found
-    // Note: at the moment, only one parameter is supported
-    var macroName = reMatch[1];
-    var paramName = reMatch[2];
-    var param;
-    if (args && paramName in args) {
-      param = args[paramName];
-    } else if (paramName in gL10nData) {
-      param = gL10nData[paramName];
-    }
-
-    // there's no macro parser yet: it has to be defined in gMacros
-    if (macroName in gMacros) {
-      var macro = gMacros[macroName];
-      str = macro(str, param, key, prop);
-    }
-    return str;
-  }
-
-  // replace {{arguments}} with their values
-  function substArguments(str, args, key) {
-    var reArgs = /\{\{\s*(.+?)\s*\}\}/g;
-    return str.replace(reArgs, function(matched_text, arg) {
-      if (args && arg in args) {
-        return args[arg];
-      }
-      if (arg in gL10nData) {
-        return gL10nData[arg];
-      }
-      console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');
-      return matched_text;
-    });
-  }
-
-  // translate an HTML element
-  function translateElement(element) {
-    var l10n = getL10nAttributes(element);
-    if (!l10n.id)
-      return;
-
-    // get the related l10n object
-    var data = getL10nData(l10n.id, l10n.args);
-    if (!data) {
-      console.warn('#' + l10n.id + ' is undefined.');
-      return;
-    }
-
-    // translate element (TODO: security checks?)
-    if (data[gTextProp]) { // XXX
-      if (getChildElementCount(element) === 0) {
-        element[gTextProp] = data[gTextProp];
-      } else {
-        // this element has element children: replace the content of the first
-        // (non-empty) child textNode and clear other child textNodes
-        var children = element.childNodes;
-        var found = false;
-        for (var i = 0, l = children.length; i < l; i++) {
-          if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) {
-            if (found) {
-              children[i].nodeValue = '';
-            } else {
-              children[i].nodeValue = data[gTextProp];
-              found = true;
-            }
-          }
-        }
-        // if no (non-empty) textNode is found, insert a textNode before the
-        // first element child.
-        if (!found) {
-          var textNode = document.createTextNode(data[gTextProp]);
-          element.insertBefore(textNode, element.firstChild);
-        }
-      }
-      delete data[gTextProp];
-    }
-
-    for (var k in data) {
-      element[k] = data[k];
-    }
-  }
-
-  // webkit browsers don't currently support 'children' on SVG elements...
-  function getChildElementCount(element) {
-    if (element.children) {
-      return element.children.length;
-    }
-    if (typeof element.childElementCount !== 'undefined') {
-      return element.childElementCount;
-    }
-    var count = 0;
-    for (var i = 0; i < element.childNodes.length; i++) {
-      count += element.nodeType === 1 ? 1 : 0;
-    }
-    return count;
-  }
-
-  // translate an HTML subtree
-  function translateFragment(element) {
-    element = element || document.documentElement;
-
-    // check all translatable children (= w/ a `data-l10n-id' attribute)
-    var children = getTranslatableChildren(element);
-    var elementCount = children.length;
-    for (var i = 0; i < elementCount; i++) {
-      translateElement(children[i]);
-    }
-
-    // translate element itself if necessary
-    translateElement(element);
-  }
-
-  return {
-    // get a localized string
-    get: function(key, args, fallbackString) {
-      var index = key.lastIndexOf('.');
-      var prop = gTextProp;
-      if (index > 0) { // An attribute has been specified
-        prop = key.substr(index + 1);
-        key = key.substring(0, index);
-      }
-      var fallback;
-      if (fallbackString) {
-        fallback = {};
-        fallback[prop] = fallbackString;
-      }
-      var data = getL10nData(key, args, fallback);
-      if (data && prop in data) {
-        return data[prop];
-      }
-      return '{{' + key + '}}';
-    },
-
-    // debug
-    getData: function() { return gL10nData; },
-    getText: function() { return gTextData; },
-
-    // get|set the document language
-    getLanguage: function() { return gLanguage; },
-    setLanguage: function(lang, callback) {
-      loadLocale(lang, function() {
-        if (callback)
-          callback();
-        translateFragment();
-      });
-    },
-
-    // get the direction (ltr|rtl) of the current language
-    getDirection: function() {
-      // http://www.w3.org/International/questions/qa-scripts
-      // Arabic, Hebrew, Farsi, Pashto, Urdu
-      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];
-      var shortCode = gLanguage.split('-', 1)[0];
-      return (rtlList.indexOf(shortCode) >= 0) ? 'rtl' : 'ltr';
-    },
-
-    // translate an element or document fragment
-    translate: translateFragment,
-
-    // this can be used to prevent race conditions
-    getReadyState: function() { return gReadyState; },
-    ready: function(callback) {
-      if (!callback) {
-        return;
-      } else if (gReadyState == 'complete' || gReadyState == 'interactive') {
-        window.setTimeout(function() {
-          callback();
-        });
-      } else if (document.addEventListener) {
-        document.addEventListener('localized', function once() {
-          document.removeEventListener('localized', once);
-          callback();
-        });
-      }
-    }
-  };
-}) (window, document);
diff --git a/public/pfd/build/generic/web/locale/ach/viewer.properties b/public/pfd/build/generic/web/locale/ach/viewer.properties
deleted file mode 100644
index 04cb71a..0000000
--- a/public/pfd/build/generic/web/locale/ach/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Pot buk mukato
-previous_label=Mukato
-next.title=Pot buk malubo
-next_label=Malubo
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Pot buk:
-page_of=pi {{pageCount}}
-
-zoom_out.title=Jwik Matidi
-zoom_out_label=Jwik Matidi
-zoom_in.title=Kwot Madit
-zoom_in_label=Kwot Madit
-zoom.title=Kwoti
-presentation_mode.title=Lokke i kit me tyer
-presentation_mode_label=Kit me tyer
-open_file.title=Yab Pwail
-open_file_label=Yab
-print.title=Go
-print_label=Go
-download.title=Gam
-download_label=Gam
-bookmark.title=Neno ma kombedi (lok onyo yab i dirica manyen)
-bookmark_label=Neno ma kombedi
-
-# Secondary toolbar and context menu
-tools.title=Gintic
-tools_label=Gintic
-first_page.title=Cit i pot buk mukwongo
-first_page.label=Cit i pot buk mukwongo
-first_page_label=Cit i pot buk mukwongo
-last_page.title=Cit i pot buk magiko
-last_page.label=Cit i pot buk magiko
-last_page_label=Cit i pot buk magiko
-page_rotate_cw.title=Wire i tung lacuc
-page_rotate_cw.label=Wire i tung lacuc
-page_rotate_cw_label=Wire i tung lacuc
-page_rotate_ccw.title=Wire i tung lacam
-page_rotate_ccw.label=Wire i tung lacam
-page_rotate_ccw_label=Wire i tung lacam
-
-hand_tool_enable.title=Ye gintic me cing
-hand_tool_enable_label=Ye gintic me cing
-hand_tool_disable.title=Juk gintic me cing
-hand_tool_disable_label=Juk gintic me cing
-
-# Document properties dialog box
-document_properties.title=Jami me gin acoya…
-document_properties_label=Jami me gin acoya…
-document_properties_file_name=Nying pwail:
-document_properties_file_size=Dit pa pwail:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Wiye:
-document_properties_author=Ngat mucoyo:
-document_properties_subject=Lok:
-document_properties_keywords=Lok mapire tek:
-document_properties_creation_date=Nino dwe me cwec:
-document_properties_modification_date=Nino dwe me yub:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Lacwec:
-document_properties_producer=Layub PDF:
-document_properties_version=Kit PDF:
-document_properties_page_count=Kwan me pot buk:
-document_properties_close=Lor
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Lok gintic ma inget
-toggle_sidebar_label=Lok gintic ma inget
-outline.title=Nyut rek pa gin acoya
-outline_label=Pek pa gin acoya
-attachments.title=Nyut twec
-attachments_label=Twec
-thumbs.title=Nyut cal
-thumbs_label=Cal
-findbar.title=Nong iye gin acoya
-findbar_label=Nong
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Pot buk {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Cal me pot buk {{page}}
-
-# Find panel button title and messages
-find_label=Nong:
-find_previous.title=Nong timme pa lok mukato
-find_previous_label=Mukato
-find_next.title=Nong timme pa lok malubo
-find_next_label=Malubo
-find_highlight=Wer weng
-find_match_case_label=Lok marwate
-find_reached_top=Oo iwi gin acoya, omede ki i tere
-find_reached_bottom=Oo i agiki me gin acoya, omede ki iwiye
-find_not_found=Lok pe ononge
-
-# Error panel labels
-error_more_info=Ngec Mukene
-error_less_info=Ngec Manok
-error_close=Lor
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Kwena: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Can kikore {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Pwail: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Rek: {{line}}
-rendering_error=Bal otime i kare me nyuto pot buk.
-
-# Predefined zoom values
-page_scale_width=Lac me iye pot buk
-page_scale_fit=Porre me pot buk
-page_scale_auto=Kwot pire kene
-page_scale_actual=Dite kikome
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Bal
-loading_error=Bal otime kun cano PDF.
-invalid_file_error=Pwail me PDF ma pe atir onyo obale woko.
-missing_file_error=Pwail me PDF tye ka rem.
-unexpected_response_error=Lagam mape kigeno pa lapok tic
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Lok angea manok]
-password_label=Ket mung me donyo me yabo pwail me PDF man.
-password_invalid=Mung me donyo pe atir. Tim ber i tem doki.
-password_ok=OK
-password_cancel=Juk
-
-printing_not_supported=Ciko: Layeny ma pe teno goyo liweng.
-printing_not_ready=Ciko: PDF pe ocane weng me agoya.
-web_fonts_disabled=Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine.
-document_colors_disabled=Pe ki ye ki gin acoya me PDF me tic ki rangi gi kengi: 'Ye pot buk me yero rangi mamegi kengi' kijuko woko i layeny.
diff --git a/public/pfd/build/generic/web/locale/af/viewer.properties b/public/pfd/build/generic/web/locale/af/viewer.properties
deleted file mode 100644
index d866b4d..0000000
--- a/public/pfd/build/generic/web/locale/af/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Vorige bladsy
-previous_label=Vorige
-next.title=Volgende bladsy
-next_label=Volgende
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Bladsy:
-page_of=van {{pageCount}}
-
-zoom_out.title=Zoem uit
-zoom_out_label=Zoem uit
-zoom_in.title=Zoem in
-zoom_in_label=Zoem in
-zoom.title=Zoem
-presentation_mode.title=Wissel na voorleggingsmodus
-presentation_mode_label=Voorleggingsmodus
-open_file.title=Open lêer
-open_file_label=Open
-print.title=Druk
-print_label=Druk
-download.title=Laai af
-download_label=Laai af
-bookmark.title=Huidige aansig (kopieer of open in nuwe venster)
-bookmark_label=Huidige aansig
-
-# Secondary toolbar and context menu
-tools.title=Nutsgoed
-tools_label=Nutsgoed
-first_page.title=Gaan na eerste bladsy
-first_page.label=Gaan na eerste bladsy
-first_page_label=Gaan na eerste bladsy
-last_page.title=Gaan na laaste bladsy
-last_page.label=Gaan na laaste bladsy
-last_page_label=Gaan na laaste bladsy
-page_rotate_cw.title=Roteer kloksgewys
-page_rotate_cw.label=Roteer kloksgewys
-page_rotate_cw_label=Roteer kloksgewys
-page_rotate_ccw.title=Roteer anti-kloksgewys
-page_rotate_ccw.label=Roteer anti-kloksgewys
-page_rotate_ccw_label=Roteer anti-kloksgewys
-
-hand_tool_enable.title=Aktiveer handjie
-hand_tool_enable_label=Aktiveer handjie
-hand_tool_disable.title=Deaktiveer handjie
-hand_tool_disable_label=Deaktiveer handjie
-
-# Document properties dialog box
-document_properties.title=Dokumenteienskappe…
-document_properties_label=Dokumenteienskappe…
-document_properties_file_name=Lêernaam:
-document_properties_file_size=Lêergrootte:
-document_properties_kb={{size_kb}} kG ({{size_b}} grepe)
-document_properties_mb={{size_mb}} MG ({{size_b}} grepe)
-document_properties_title=Titel:
-document_properties_author=Outeur:
-document_properties_subject=Onderwerp:
-document_properties_keywords=Sleutelwoorde:
-document_properties_creation_date=Skeppingsdatum:
-document_properties_modification_date=Wysigingsdatum:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Skepper:
-document_properties_producer=PDF-vervaardiger:
-document_properties_version=PDF-weergawe:
-document_properties_page_count=Aantal bladsye:
-document_properties_close=Sluit
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Sypaneel aan/af
-toggle_sidebar_label=Sypaneel aan/af
-outline.title=Wys dokumentoorsig
-outline_label=Dokumentoorsig
-attachments.title=Wys aanhegsels
-attachments_label=Aanhegsels
-thumbs.title=Wys duimnaels
-thumbs_label=Duimnaels
-findbar.title=Soek in dokument
-findbar_label=Vind
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Bladsy {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Duimnael van bladsy {{page}}
-
-# Find panel button title and messages
-find_label=Vind:
-find_previous.title=Vind die vorige voorkoms van die frase
-find_previous_label=Vorige
-find_next.title=Vind die volgende voorkoms van die frase
-find_next_label=Volgende
-find_highlight=Verlig alle
-find_match_case_label=Kassensitief
-find_reached_top=Bokant van dokument is bereik; gaan voort van onder af
-find_reached_bottom=Einde van dokument is bereik; gaan voort van bo af
-find_not_found=Frase nie gevind nie
-
-# Error panel labels
-error_more_info=Meer inligting
-error_less_info=Minder inligting
-error_close=Sluit
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (ID: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Boodskap: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stapel: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Lêer: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Lyn: {{line}}
-rendering_error='n Fout het voorgekom toe die bladsy weergegee is.
-
-# Predefined zoom values
-page_scale_width=Bladsywydte
-page_scale_fit=Pas bladsy
-page_scale_auto=Outomatiese zoem
-page_scale_actual=Werklike grootte
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Fout
-loading_error='n Fout het voorgekom met die laai van die PDF.
-invalid_file_error=Ongeldige of korrupte PDF-lêer.
-missing_file_error=PDF-lêer is weg.
-unexpected_response_error=Onverwagse antwoord van bediener.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}}-annotasie
-password_label=Gee die wagwoord om dié PDF-lêer mee te open.
-password_invalid=Ongeldige wagwoord. Probeer gerus weer.
-password_ok=OK
-password_cancel=Kanselleer
-
-printing_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie.
-printing_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.
-web_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.
-document_colors_disabled=PDF-dokumente word nie toegelaat om hul eie kleure te gebruik nie: 'Laat bladsye toe om hul eie kleure te kies' is gedeaktiveer in die blaaier.
diff --git a/public/pfd/build/generic/web/locale/ak/viewer.properties b/public/pfd/build/generic/web/locale/ak/viewer.properties
deleted file mode 100644
index 883c2ab..0000000
--- a/public/pfd/build/generic/web/locale/ak/viewer.properties
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Krataafa baako a etwa mu
-previous_label=Ekyiri-baako
-next.title=Krataafa a edi so baako
-next_label=Dea-ɛ-di-so-baako
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Krataafa:
-page_of=wɔ {{pageCount}}
-
-zoom_out.title=Zuum pue
-zoom_out_label=Zuum ba abɔnten
-zoom_in.title=Zuum kɔ mu
-zoom_in_label=Zuum kɔ mu
-zoom.title=Zuum
-presentation_mode.title=Sesa kɔ Yɛkyerɛ Tebea mu
-presentation_mode_label=Yɛkyerɛ Tebea
-open_file.title=Bue Fael
-open_file_label=Bue
-print.title=Prente
-print_label=Prente
-download.title=Twe
-download_label=Twe
-bookmark.title=Seisei nhwɛ (fa anaaso bue wɔ tokuro foforo mu)
-bookmark_label=Seisei nhwɛ
-
-# Secondary toolbar and context menu
-
-
-# Document properties dialog box
-document_properties_title=Ti asɛm:
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Sɔ anaaso dum saedbaa
-toggle_sidebar_label=Sɔ anaaso dum saedbaa
-outline.title=Kyerɛ dɔkomɛnt bɔbea
-outline_label=Dɔkomɛnt bɔbea
-thumbs.title=Kyerɛ mfoniwaa
-thumbs_label=Mfoniwaa
-findbar.title=Hu wɔ dɔkomɛnt no mu
-findbar_label=Hu
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Krataafa {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Krataafa ne mfoniwaa {{page}}
-
-# Find panel button title and messages
-find_label=Hunu:
-find_previous.title=San hu fres wɔ ekyiri baako
-find_previous_label=Ekyiri baako
-find_next.title=San hu fres no wɔ enim baako
-find_next_label=Ndiso
-find_highlight=Hyɛ bibiara nso
-find_match_case_label=Fa susu kaase
-find_reached_top=Edu krataafa ne soro, atoa so efiri ase
-find_reached_bottom=Edu krataafa n'ewiei, atoa so efiri soro
-find_not_found=Ennhu fres
-
-# Error panel labels
-error_more_info=Infɔmehyɛn bio a wɔka ho
-error_less_info=Te infɔmehyɛn bio a wɔka ho so
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{vɛɛhyen}} (nsi: {{si}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Nkrato: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Staake: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fael: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Laen: {{line}}
-rendering_error=Mfomso bae wɔ bere a wɔ rekyerɛ krataafa no.
-
-# Predefined zoom values
-page_scale_width=Krataafa tɛtrɛtɛ
-page_scale_fit=Krataafa ehimtwa
-page_scale_auto=Zuum otomatik
-page_scale_actual=Kɛseyɛ ankasa
-
-# Loading indicator messages
-loading_error_indicator=Mfomso
-loading_error=Mfomso bae wɔ bere a wɔreloode PDF no.
-invalid_file_error=PDF fael no nndi mu anaaso ho atɔ kyima.
-missing_file_error=PDF fael no ayera.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Tɛkst-nyiano]
-password_ok=OK
-password_cancel=Twa-mu
-
-printing_not_supported=Kɔkɔbɔ: Brawsa yi nnhyɛ daa mma prent ho kwan.
-printing_not_ready=Kɔkɔbɔ: Wɔnntwee PDF fael no nyinara mmbaee ama wo ɛ tumi aprente.
-web_fonts_disabled=Ɔedum wɛb-mfɔnt: nntumi mmfa PDF mfɔnt a wɔhyɛ mu nndi dwuma.
-document_colors_disabled=Wɔmma ho kwan sɛ PDF adɔkomɛnt de wɔn ara wɔn ahosu bɛdi dwuma: wɔ adum 'Ma ho kwan ma nkrataafa mpaw wɔn ara wɔn ahosu' wɔ brawsa yi mu.
diff --git a/public/pfd/build/generic/web/locale/an/viewer.properties b/public/pfd/build/generic/web/locale/an/viewer.properties
deleted file mode 100644
index d9b7f66..0000000
--- a/public/pfd/build/generic/web/locale/an/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Pachina anterior
-previous_label=Anterior
-next.title=Pachina siguient
-next_label=Siguient
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Pachina:
-page_of=de {{pageCount}}
-
-zoom_out.title=Achiquir
-zoom_out_label=Achiquir
-zoom_in.title=Agrandir
-zoom_in_label=Agrandir
-zoom.title=Grandaria
-presentation_mode.title=Cambear t'o modo de presentación
-presentation_mode_label=Modo de presentación
-open_file.title=Ubrir o fichero
-open_file_label=Ubrir
-print.title=Imprentar
-print_label=Imprentar
-download.title=Descargar
-download_label=Descargar
-bookmark.title=Vista actual (copiar u ubrir en una nueva finestra)
-bookmark_label=Anvista actual
-
-# Secondary toolbar and context menu
-tools.title=Ferramientas
-tools_label=Ferramientas
-first_page.title=Ir ta la primer pachina
-first_page.label=Ir ta la primer pachina
-first_page_label=Ir ta la primer pachina
-last_page.title=Ir ta la zaguer pachina
-last_page.label=Ir ta la zaguera pachina
-last_page_label=Ir ta la zaguer pachina
-page_rotate_cw.title=Chirar enta la dreita
-page_rotate_cw.label=Chirar enta la dreita
-page_rotate_cw_label=Chira enta la dreita
-page_rotate_ccw.title=Chirar enta la zurda
-page_rotate_ccw.label=Chirar en sentiu antihorario
-page_rotate_ccw_label=Chirar enta la zurda
-
-hand_tool_enable.title=Activar a ferramienta man
-hand_tool_enable_label=Activar a ferramenta man
-hand_tool_disable.title=Desactivar a ferramienta man
-hand_tool_disable_label=Desactivar a ferramienta man
-
-# Document properties dialog box
-document_properties.title=Propiedatz d'o documento...
-document_properties_label=Propiedatz d'o documento...
-document_properties_file_name=Nombre de fichero:
-document_properties_file_size=Grandaria d'o fichero:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Titol:
-document_properties_author=Autor:
-document_properties_subject=Afer:
-document_properties_keywords=Parolas clau:
-document_properties_creation_date=Calendata de creyación:
-document_properties_modification_date=Calendata de modificación:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creyador:
-document_properties_producer=Creyador de PDF:
-document_properties_version=Versión de PDF:
-document_properties_page_count=Numero de pachinas:
-document_properties_close=Zarrar
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Amostrar u amagar a barra lateral
-toggle_sidebar_label=Amostrar a barra lateral
-outline.title=Amostrar o esquema d'o documento
-outline_label=Esquema d'o documento
-attachments.title=Amostrar os adchuntos
-attachments_label=Adchuntos
-thumbs.title=Amostrar as miniaturas
-thumbs_label=Miniaturas
-findbar.title=Trobar en o documento
-findbar_label=Trobar
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Pachina {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura d'a pachina {{page}}
-
-# Find panel button title and messages
-find_label=Trobar:
-find_previous.title=Trobar l'anterior coincidencia d'a frase
-find_previous_label=Anterior
-find_next.title=Trobar a siguient coincidencia d'a frase
-find_next_label=Siguient
-find_highlight=Resaltar-lo tot
-find_match_case_label=Coincidencia de mayusclas/minusclas
-find_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo
-find_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto
-find_not_found=No s'ha trobau a frase
-
-# Error panel labels
-error_more_info=Mas información
-error_less_info=Menos información
-error_close=Zarrar
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mensache: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pila: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fichero: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linia: {{line}}
-rendering_error=Ha ocurriu una error en renderizar a pachina.
-
-# Predefined zoom values
-page_scale_width=Amplaria d'a pachina
-page_scale_fit=Achuste d'a pachina
-page_scale_auto=Grandaria automatica
-page_scale_actual=Grandaria actual
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Error
-loading_error=S'ha produciu una error en cargar o PDF.
-invalid_file_error=O PDF no ye valido u ye estorbau.
-missing_file_error=No i ha fichero PDF.
-unexpected_response_error=Respuesta a lo servicio inasperada.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotación {{type}}]
-password_label=Introduzca a clau ta ubrir iste fichero PDF.
-password_invalid=Clau invalida. Torna a intentar-lo.
-password_ok=Acceptar
-password_cancel=Cancelar
-
-printing_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions.
-printing_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.
-web_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF.
-document_colors_disabled=Os documentos PDF no pueden fer servir as suyas propias colors: 'Permitir que as pachinas triguen as suyas propias colors' ye desactivau en o navegador.
diff --git a/public/pfd/build/generic/web/locale/ar/viewer.properties b/public/pfd/build/generic/web/locale/ar/viewer.properties
deleted file mode 100644
index d114bbb..0000000
--- a/public/pfd/build/generic/web/locale/ar/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=الصفحة السابقة
-previous_label=السابقة
-next.title=الصفحة التالية
-next_label=التالية
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=صفحة:
-page_of=من {{pageCount}}
-
-zoom_out.title=بعّد
-zoom_out_label=بعّد
-zoom_in.title=قرّب
-zoom_in_label=قرّب
-zoom.title=التقريب
-presentation_mode.title=انتقل لوضع العرض التقديمي
-presentation_mode_label=وضع العرض التقديمي
-open_file.title=افتح ملفًا
-open_file_label=افتح
-print.title=اطبع
-print_label=اطبع
-download.title=نزّل
-download_label=نزّل
-bookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة)
-bookmark_label=المنظور الحالي
-
-# Secondary toolbar and context menu
-tools.title=الأدوات
-tools_label=الأدوات
-first_page.title=اذهب إلى الصفحة الأولى
-first_page.label=اذهب إلى الصفحة الأولى
-first_page_label=اذهب إلى الصفحة الأولى
-last_page.title=اذهب إلى الصفحة الأخيرة
-last_page.label=اذهب إلى الصفحة الأخيرة
-last_page_label=اذهب إلى الصفحة الأخيرة
-page_rotate_cw.title=أدر باتجاه عقارب الساعة
-page_rotate_cw.label=أدر باتجاه عقارب الساعة
-page_rotate_cw_label=أدر باتجاه عقارب الساعة
-page_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة
-page_rotate_ccw.label=أدر بعكس اتجاه عقارب الساعة
-page_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة
-
-hand_tool_enable.title=فعّل أداة اليد
-hand_tool_enable_label=فعّل أداة اليد
-hand_tool_disable.title=عطّل أداة اليد
-hand_tool_disable_label=عطّل أداة اليد
-
-# Document properties dialog box
-document_properties.title=خصائص المستند…
-document_properties_label=خصائص المستند…
-document_properties_file_name=اسم الملف:
-document_properties_file_size=حجم الملف:
-document_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت)
-document_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت)
-document_properties_title=العنوان:
-document_properties_author=المؤلف:
-document_properties_subject=الموضوع:
-document_properties_keywords=الكلمات الأساسية:
-document_properties_creation_date=تاريخ الإنشاء:
-document_properties_modification_date=تاريخ التعديل:
-document_properties_date_string={{date}}، {{time}}
-document_properties_creator=المنشئ:
-document_properties_producer=منتج PDF:
-document_properties_version=إصدارة PDF:
-document_properties_page_count=عدد الصفحات:
-document_properties_close=أغلق
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=بدّل الشريط الجانبي
-toggle_sidebar_label=بدّل الشريط الجانبي
-outline.title=اعرض مخطط المستند
-outline_label=مخطط المستند
-attachments.title=اعرض المرفقات
-attachments_label=المُرفقات
-thumbs.title=اعرض مُصغرات
-thumbs_label=مُصغّرات
-findbar.title=ابحث في المستند
-findbar_label=ابحث
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=صفحة {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=مصغّرة صفحة {{page}}
-
-# Find panel button title and messages
-find_label=ابحث:
-find_previous.title=ابحث عن التّواجد السّابق للعبارة
-find_previous_label=السابق
-find_next.title=ابحث عن التّواجد التّالي للعبارة
-find_next_label=التالي
-find_highlight=أبرِز الكل
-find_match_case_label=طابق حالة الأحرف
-find_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند
-find_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند
-find_not_found=لا وجود للعبارة
-
-# Error panel labels
-error_more_info=معلومات أكثر
-error_less_info=معلومات أقل
-error_close=أغلق
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=‏PDF.js ن{{version}} ‏(بناء: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=الرسالة: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=الرصّة: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=الملف: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=السطر: {{line}}
-rendering_error=حدث خطأ أثناء عرض الصفحة.
-
-# Predefined zoom values
-page_scale_width=عرض الصفحة
-page_scale_fit=ملائمة الصفحة
-page_scale_auto=تقريب تلقائي
-page_scale_actual=الحجم الحقيقي
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}٪
-
-# Loading indicator messages
-loading_error_indicator=عطل
-loading_error=حدث عطل أثناء تحميل ملف PDF.
-invalid_file_error=ملف PDF تالف أو غير صحيح.
-missing_file_error=ملف PDF غير موجود.
-unexpected_response_error=استجابة خادوم غير متوقعة.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[تعليق {{type}}]
-password_label=أدخل لكلمة السر لفتح هذا الملف.
-password_invalid=كلمة سر خطأ. من فضلك أعد المحاولة.
-password_ok=حسنا
-password_cancel=ألغِ
-
-printing_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل.
-printing_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة.
-web_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة.
-document_colors_disabled=ليس مسموحًا لملفات PDF باستخدام ألوانها الخاصة: خيار 'اسمح للصفحات باختيار ألوانها الخاصة' ليس مُفعّلًا في المتصفح.
diff --git a/public/pfd/build/generic/web/locale/as/viewer.properties b/public/pfd/build/generic/web/locale/as/viewer.properties
deleted file mode 100644
index a0d637f..0000000
--- a/public/pfd/build/generic/web/locale/as/viewer.properties
+++ /dev/null
@@ -1,164 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=পূৰ্বৱৰ্তী পৃষ্ঠা
-previous_label=পূৰ্বৱৰ্তী
-next.title=পৰৱৰ্তী পৃষ্ঠা
-next_label=পৰৱৰ্তী
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=পৃষ্ঠা:
-page_of=ৰ {{pageCount}}
-
-zoom_out.title=জুম আউট
-zoom_out_label=জুম আউট
-zoom_in.title=জুম ইন
-zoom_in_label=জুম ইন
-zoom.title=জুম কৰক
-presentation_mode.title=উপস্থাপন অৱস্থালে যাওক
-presentation_mode_label=উপস্থাপন অৱস্থা
-open_file.title=ফাইল খোলক
-open_file_label=খোলক
-print.title=প্ৰিন্ট কৰক
-print_label=প্ৰিন্ট কৰক
-download.title=ডাউনল'ড কৰক
-download_label=ডাউনল'ড কৰক
-bookmark.title=বৰ্তমান দৃশ্য (কপি কৰক অথবা নতুন উইন্ডোত খোলক)
-bookmark_label=বৰ্তমান দৃশ্য
-
-# Secondary toolbar and context menu
-tools.title=সঁজুলিসমূহ
-tools_label=সঁজুলিসমূহ
-first_page.title=প্ৰথম পৃষ্ঠাত যাওক
-first_page.label=প্ৰথম পৃষ্ঠাত যাওক
-first_page_label=প্ৰথম পৃষ্ঠাত যাওক
-last_page.title=সৰ্বশেষ পৃষ্ঠাত যাওক
-last_page.label=সৰ্বশেষ পৃষ্ঠাত যাওক
-last_page_label=সৰ্বশেষ পৃষ্ঠাত যাওক
-page_rotate_cw.title=ঘড়ীৰ দিশত ঘুৰাওক
-page_rotate_cw.label=ঘড়ীৰ দিশত ঘুৰাওক
-page_rotate_cw_label=ঘড়ীৰ দিশত ঘুৰাওক
-page_rotate_ccw.title=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক
-page_rotate_ccw.label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক
-page_rotate_ccw_label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক
-
-hand_tool_enable.title=হাঁত সঁজুলি সামৰ্থবান কৰক
-hand_tool_enable_label=হাঁত সঁজুলি সামৰ্থবান কৰক
-hand_tool_disable.title=হাঁত সঁজুলি অসামৰ্থবান কৰক
-hand_tool_disable_label=হাঁত সঁজুলি অসামৰ্থবান কৰক
-
-# Document properties dialog box
-document_properties.title=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…
-document_properties_label=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…
-document_properties_file_name=ফাইল নাম:
-document_properties_file_size=ফাইলৰ আকাৰ:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=শীৰ্ষক:
-document_properties_author=লেখক:
-document_properties_subject=বিষয়:
-document_properties_keywords=কিৱাৰ্ডসমূহ:
-document_properties_creation_date=সৃষ্টিৰ তাৰিখ:
-document_properties_modification_date=পৰিবৰ্তনৰ তাৰিখ:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=সৃষ্টিকৰ্তা:
-document_properties_producer=PDF উৎপাদক:
-document_properties_version=PDF সংস্কৰণ:
-document_properties_page_count=পৃষ্ঠাৰ গণনা:
-document_properties_close=বন্ধ কৰক
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=কাষবাৰ টগল কৰক
-toggle_sidebar_label=কাষবাৰ টগল কৰক
-outline.title=দস্তাবেজ আউটলাইন দেখুৱাওক
-outline_label=দস্তাবেজ আউটলাইন
-attachments.title=এটাচমেন্টসমূহ দেখুৱাওক
-attachments_label=এটাচমেন্টসমূহ
-thumbs.title=থাম্বনেইলসমূহ দেখুৱাওক
-thumbs_label=থাম্বনেইলসমূহ
-findbar.title=দস্তাবেজত সন্ধান কৰক
-findbar_label=সন্ধান কৰক
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=পৃষ্ঠা {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=পৃষ্ঠাৰ থাম্বনেইল {{page}}
-
-# Find panel button title and messages
-find_label=সন্ধান কৰক:
-find_previous.title=বাক্যাংশৰ পূৰ্বৱৰ্তী উপস্থিতি সন্ধান কৰক
-find_previous_label=পূৰ্বৱৰ্তী
-find_next.title=বাক্যাংশৰ পৰৱৰ্তী উপস্থিতি সন্ধান কৰক
-find_next_label=পৰৱৰ্তী
-find_highlight=সকলো উজ্জ্বল কৰক
-find_match_case_label=ফলা মিলাওক
-find_reached_top=তলৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ ওপৰলৈ অহা হৈছে
-find_reached_bottom=ওপৰৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ তললৈ অহা হৈছে
-find_not_found=বাক্যাংশ পোৱা নগল
-
-# Error panel labels
-error_more_info=অধিক তথ্য
-error_less_info=কম তথ্য
-error_close=বন্ধ কৰক
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=বাৰ্তা: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=স্টেক: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ফাইল: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=শাৰী: {{line}}
-rendering_error=এই পৃষ্ঠা ৰেণ্ডাৰ কৰোতে এটা ত্ৰুটি দেখা দিলে।
-
-# Predefined zoom values
-page_scale_width=পৃষ্ঠাৰ প্ৰস্থ
-page_scale_fit=পৃষ্ঠা খাপ
-page_scale_auto=স্বচালিত জুম
-page_scale_actual=প্ৰকৃত আকাৰ
-
-# Loading indicator messages
-loading_error_indicator=ত্ৰুটি
-loading_error=PDF ল'ড কৰোতে এটা ত্ৰুটি দেখা দিলে।
-invalid_file_error=অবৈধ অথবা ক্ষতিগ্ৰস্থ PDF file।
-missing_file_error=সন্ধানহিন PDF ফাইল।
-unexpected_response_error=অপ্ৰত্যাশিত চাৰ্ভাৰ প্ৰতিক্ৰিয়া।
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} টোকা]
-password_label=এই PDF ফাইল খোলিবলৈ পাছৱৰ্ড সুমুৱাওক।
-password_invalid=অবৈধ পাছৱৰ্ড। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।
-password_ok=ঠিক আছে
-password_cancel=বাতিল কৰক
-
-printing_not_supported=সতৰ্কবাৰ্তা: প্ৰিন্টিং এই ব্ৰাউছাৰ দ্বাৰা সম্পূৰ্ণভাৱে সমৰ্থিত নহয়।
-printing_not_ready=সতৰ্কবাৰ্তা: PDF প্ৰিন্টিংৰ বাবে সম্পূৰ্ণভাৱে ল'ডেড নহয়।
-web_fonts_disabled=ৱেব ফন্টসমূহ অসামৰ্থবান কৰা আছে: অন্তৰ্ভুক্ত PDF ফন্টসমূহ ব্যৱহাৰ কৰিবলে অক্ষম।
-document_colors_disabled=PDF দস্তাবেজসমূহৰ সিহতৰ নিজস্ব ৰঙ ব্যৱহাৰ কৰাৰ অনুমতি নাই: ব্ৰাউছাৰত 'পৃষ্ঠাসমূহক সিহতৰ নিজস্ব ৰঙ নিৰ্বাচন কৰাৰ অনুমতি দিয়ক' অসামৰ্থবান কৰা আছে।
diff --git a/public/pfd/build/generic/web/locale/ast/viewer.properties b/public/pfd/build/generic/web/locale/ast/viewer.properties
deleted file mode 100644
index 2346c54..0000000
--- a/public/pfd/build/generic/web/locale/ast/viewer.properties
+++ /dev/null
@@ -1,111 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-previous.title = Páxina anterior
-previous_label = Anterior
-next.title = Páxina siguiente
-next_label = Siguiente
-page_label = Páxina:
-page_of = de {{pageCount}}
-zoom_out.title = Reducir
-zoom_out_label = Reducir
-zoom_in.title = Aumentar
-zoom_in_label = Aumentar
-zoom.title = Tamañu
-print.title = Imprentar
-print_label = Imprentar
-open_file.title = Abrir ficheru
-open_file_label = Abrir
-download.title = Descargar
-download_label = Descargar
-bookmark.title = Vista actual (copiar o abrir nuna nueva ventana)
-bookmark_label = Vista actual
-outline.title = Amosar l'esquema del documentu
-outline_label = Esquema del documentu
-thumbs.title = Amosar miniatures
-thumbs_label = Miniatures
-thumb_page_title = Páxina {{page}}
-thumb_page_canvas = Miniatura de la páxina {{page}}
-error_more_info = Más información
-error_less_info = Menos información
-error_close = Zarrar
-error_message = Mensaxe: {{message}}
-error_stack = Pila: {{stack}}
-error_file = Ficheru: {{file}}
-error_line = Llinia: {{line}}
-rendering_error = Hebo un fallu al renderizar la páxina.
-page_scale_width = Anchor de la páxina
-page_scale_fit = Axuste de la páxina
-page_scale_auto = Tamañu automáticu
-page_scale_actual = Tamañu actual
-loading_error_indicator = Fallu
-loading_error = Hebo un fallu al cargar el PDF.
-printing_not_supported = Avisu: Imprentar nun tien sofitu téunicu completu nesti navegador.
-presentation_mode_label = 
-presentation_mode.title = 
-page_rotate_cw.label = 
-page_rotate_ccw.label = 
-last_page.label = Dir a la cabera páxina
-invalid_file_error = Ficheru PDF inválidu o corruptu.
-first_page.label = Dir a la primer páxina
-findbar_label = Guetar
-findbar.title = Guetar nel documentu
-find_previous_label = Anterior
-find_previous.title = Alcontrar l'anterior apaición de la fras
-find_not_found = Frase non atopada
-find_next_label = Siguiente
-find_next.title = Alcontrar la siguiente apaición d'esta fras
-find_match_case_label = Coincidencia de mayús./minús.
-find_label = Guetar:
-find_highlight = Remarcar toos
-find_reached_top=Algamóse'l principiu del documentu, siguir dende'l final
-find_reached_bottom=Algamóse'l final del documentu, siguir dende'l principiu
-web_fonts_disabled = Les fontes web tán desactivaes: ye imposible usar les fontes PDF embebíes.
-toggle_sidebar_label = Camudar barra llateral
-toggle_sidebar.title = Camudar barra llateral
-missing_file_error = Nun hai ficheru PDF.
-error_version_info = PDF.js v{{version}} (build: {{build}})
-printing_not_ready = Avisu: Esti PDF nun se cargó completamente pa poder imprentase.
-text_annotation_type.alt = [Anotación {{type}}]
-document_colors_disabled = Los documentos PDF nun tienen permitío usar los sos propios colores: 'Permitir a les páxines elexir los sos propios colores' ta desactivao nel navegador.
-tools_label = Ferramientes
-tools.title = Ferramientes
-password_ok = Aceutar
-password_label = Introduz la contraseña p'abrir esti ficheru PDF
-password_invalid = Contraseña non válida. Vuelvi a intentalo.
-password_cancel = Encaboxar
-page_rotate_cw_label = Xirar en sen horariu
-page_rotate_cw.title = Xirar en sen horariu
-page_rotate_ccw_label = Xirar en sen antihorariu
-page_rotate_ccw.title = Xirar en sen antihorariu
-last_page_label = Dir a la postrer páxina
-last_page.title = Dir a la postrer páxina
-hand_tool_enable_label = Activar ferramienta mano
-hand_tool_enable.title = Activar ferramienta mano
-hand_tool_disable_label = Desactivar ferramienta mano
-hand_tool_disable.title = Desactivar ferramienta mano
-first_page_label = Dir a la primer páxina
-first_page.title = Dir a la primer páxina
-document_properties_version = Versión PDF:
-document_properties_title = Títulu:
-document_properties_subject = Asuntu:
-document_properties_producer = Productor PDF:
-document_properties_page_count = Númberu de páxines:
-document_properties_modification_date = Data de modificación:
-document_properties_mb = {{size_mb}} MB ({{size_b}} bytes)
-document_properties_label = Propiedaes del documentu…
-document_properties_keywords = Pallabres clave:
-document_properties_kb = {{size_kb}} KB ({{size_b}} bytes)
-document_properties_file_size = Tamañu de ficheru:
-document_properties_file_name = Nome de ficheru:
-document_properties_date_string = {{date}}, {{time}}
-document_properties_creator = Creador:
-document_properties_creation_date = Data de creación:
-document_properties_close = Zarrar
-document_properties_author = Autor:
-document_properties.title = Propiedaes del documentu…
-attachments_label = Axuntos
-attachments.title = Amosar axuntos
-unexpected_response_error = Rempuesta inesperada del sirvidor.
-page_scale_percent = {{scale}}%
diff --git a/public/pfd/build/generic/web/locale/az/viewer.properties b/public/pfd/build/generic/web/locale/az/viewer.properties
deleted file mode 100644
index ef77c64..0000000
--- a/public/pfd/build/generic/web/locale/az/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Əvvəlki səhifə
-previous_label=Əvvəlkini tap
-next.title=Növbəti səhifə
-next_label=İrəli
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Səhifə:
-page_of=/ {{pageCount}}
-
-zoom_out.title=Uzaqlaş
-zoom_out_label=Uzaqlaş
-zoom_in.title=Yaxınlaş
-zoom_in_label=Yaxınlaş
-zoom.title=Yaxınlaşdırma
-presentation_mode.title=Təqdimat Rejiminə Keç
-presentation_mode_label=Təqdimat Rejimi
-open_file.title=Fayl Aç
-open_file_label=Aç
-print.title=Yazdır
-print_label=Yazdır
-download.title=Yüklə
-download_label=Yüklə
-bookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç)
-bookmark_label=Hazırki görünüş
-
-# Secondary toolbar and context menu
-tools.title=Alətlər
-tools_label=Alətlər
-first_page.title=İlk Səhifəyə get
-first_page.label=İlk Səhifəyə get
-first_page_label=İlk Səhifəyə get
-last_page.title=Son Səhifəyə get
-last_page.label=Son Səhifəyə get
-last_page_label=Son Səhifəyə get
-page_rotate_cw.title=Saat İstiqamətində Fırlat
-page_rotate_cw.label=Saat İstiqamətində Fırlat
-page_rotate_cw_label=Saat İstiqamətində Fırlat
-page_rotate_ccw.title=Saat İstiqamətinin Əksinə Fırlat
-page_rotate_ccw.label=Saat İstiqamətinin Əksinə Fırlat
-page_rotate_ccw_label=Saat İstiqamətinin Əksinə Fırlat
-
-hand_tool_enable.title=Əl alətini aktiv et
-hand_tool_enable_label=Əl alətini aktiv et
-hand_tool_disable.title=Əl alətini deaktiv et
-hand_tool_disable_label=Əl alətini deaktiv et
-
-# Document properties dialog box
-document_properties.title=Sənəd xüsusiyyətləri…
-document_properties_label=Sənəd xüsusiyyətləri…
-document_properties_file_name=Fayl adı:
-document_properties_file_size=Fayl ölçüsü:
-document_properties_kb={{size_kb}} KB ({{size_b}} bayt)
-document_properties_mb={{size_mb}} MB ({{size_b}} bayt)
-document_properties_title=Başlık:
-document_properties_author=Müəllif:
-document_properties_subject=Mövzu:
-document_properties_keywords=Açar sözlər:
-document_properties_creation_date=Yaradılış Tarixi :
-document_properties_modification_date=Dəyişdirilmə Tarixi :
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Yaradan:
-document_properties_producer=PDF yaradıcısı:
-document_properties_version=PDF versiyası:
-document_properties_page_count=Səhifə sayı:
-document_properties_close=Qapat
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Yan Paneli Aç/Bağla
-toggle_sidebar_label=Yan Paneli Aç/Bağla
-outline.title=Sənəd struktunu göstər
-outline_label=Sənəd strukturu
-attachments.title=Bağlamaları göstər
-attachments_label=Bağlamalar
-thumbs.title=Kiçik şəkilləri göstər
-thumbs_label=Kiçik şəkillər
-findbar.title=Sənəddə Tap
-findbar_label=Axtar
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Səhifə{{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}} səhifəsinin kiçik vəziyyəti
-
-# Find panel button title and messages
-find_label=Tap:
-find_previous.title=Bir öncəki uyğun gələn sözü tapır
-find_previous_label=Geri
-find_next.title=Bir sonrakı uyğun gələn sözü tapır
-find_next_label=İrəli
-find_highlight=İşarələ
-find_match_case_label=Böyük/kiçik hərfə həssaslıq
-find_reached_top=Sənədin yuxarısına çatdı, aşağıdan davam edir
-find_reached_bottom=Sənədin sonuna çatdı, yuxarıdan davam edir
-find_not_found=Uyğunlaşma tapılmadı
-
-# Error panel labels
-error_more_info=Daha çox məlumati
-error_less_info=Daha az məlumat
-error_close=Qapat
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (yığma: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=İsmarıc: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stek: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fayl: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Sətir: {{line}}
-rendering_error=Səhifə göstərilərkən səhv yarandı.
-
-# Predefined zoom values
-page_scale_width=Səhifə genişliyi
-page_scale_fit=Səhifəni sığdır
-page_scale_auto=Avtomatik yaxınlaşdır
-page_scale_actual=Hazırki Həcm
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Səhv
-loading_error=PDF yüklenərkən bir səhv yarandı.
-invalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl.
-missing_file_error=PDF fayl yoxdur.
-unexpected_response_error=Gözlənilməz server cavabı.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotasiyası]
-password_label=Bu PDF faylı açmaq üçün şifrəni daxil edin.
-password_invalid=Şifrə yanlışdır. Bir daha sınayın.
-password_ok=OK
-password_cancel=Ləğv et
-
-printing_not_supported=Xəbərdarlıq: Çap bu səyyah tərəfindən tam olaraq dəstəklənmir.
-printing_not_ready=Xəbərdarlıq: PDF çap üçün tam yüklənməyib.
-web_fonts_disabled=Web Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil.
-document_colors_disabled=PDF sənədlərə öz rənglərini işlətməyə icazə verilmir: 'Səhifələrə öz rənglərini istifadə etməyə icazə vermə' səyyahda söndürülüb.
diff --git a/public/pfd/build/generic/web/locale/be/viewer.properties b/public/pfd/build/generic/web/locale/be/viewer.properties
deleted file mode 100644
index 031b1df..0000000
--- a/public/pfd/build/generic/web/locale/be/viewer.properties
+++ /dev/null
@@ -1,105 +0,0 @@
-previous.title = Папярэдняя старонка
-previous_label = Папярэдняя
-next.title = Наступная старонка
-next_label = Наступная
-page_label = Старонка:
-page_of = з {{pageCount}}
-zoom_out.title = Паменшыць
-zoom_out_label = Паменшыць
-zoom_in.title = Павялічыць
-zoom_in_label = Павялічыць
-zoom.title = Павялічэнне тэксту
-presentation_mode.title = Пераключыцца ў рэжым паказу
-presentation_mode_label = Рэжым паказу
-open_file.title = Адчыніць файл
-open_file_label = Адчыніць
-print.title = Друкаваць
-print_label = Друкаваць
-download.title = Загрузка
-download_label = Загрузка
-bookmark.title = Цяперашняя праява (скапіяваць або адчыніць у новым акне)
-bookmark_label = Цяперашняя праява
-tools.title = Прылады
-tools_label = Прылады
-first_page.title = Перайсці на першую старонку
-first_page.label = Перайсці на першую старонку
-first_page_label = Перайсці на першую старонку
-last_page.title = Перайсці на апошнюю старонку
-last_page.label = Перайсці на апошнюю старонку
-last_page_label = Перайсці на апошнюю старонку
-page_rotate_cw.title = Павярнуць па гадзіннікавай стрэлцы
-page_rotate_cw.label = Павярнуць па гадзіннікавай стрэлцы
-page_rotate_cw_label = Павярнуць па гадзіннікавай стрэлцы
-page_rotate_ccw.title = Павярнуць супраць гадзіннікавай стрэлкі
-page_rotate_ccw.label = Павярнуць супраць гадзіннікавай стрэлкі
-page_rotate_ccw_label = Павярнуць супраць гадзіннікавай стрэлкі
-hand_tool_enable.title = Дазволіць ручную прыладу
-hand_tool_enable_label = Дазволіць ручную прыладу
-hand_tool_disable.title = Забараніць ручную прыладу
-hand_tool_disable_label = Забараніць ручную прыладу
-document_properties.title = Уласцівасці дакумента…
-document_properties_label = Уласцівасці дакумента…
-document_properties_file_name = Назва файла:
-document_properties_file_size = Памер файла:
-document_properties_kb = {{size_kb}} КБ ({{size_b}} байт)
-document_properties_mb = {{size_mb}} МБ ({{size_b}} байт)
-document_properties_title = Загаловак:
-document_properties_author = Аўтар:
-document_properties_subject = Тэма:
-document_properties_keywords = Ключавыя словы:
-document_properties_creation_date = Дата стварэння:
-document_properties_modification_date = Дата змянення:
-document_properties_date_string = {{date}}, {{time}}
-document_properties_creator = Стваральнік:
-document_properties_producer = Вырабнік PDF:
-document_properties_version = Версія PDF:
-document_properties_page_count = Колькасць старонак:
-document_properties_close = Зачыніць
-toggle_sidebar.title = Пераключэнне палічкі
-toggle_sidebar_label = Пераключыць палічку
-outline.title = Паказ будовы дакумента
-outline_label = Будова дакумента
-attachments.title = Паказаць далучэнні
-attachments_label = Далучэнні
-thumbs.title = Паказ накідаў
-thumbs_label = Накіды
-findbar.title = Пошук у дакуменце
-findbar_label = Знайсці
-thumb_page_title = Старонка {{page}}
-thumb_page_canvas = Накід старонкі {{page}}
-find_label = Пошук:
-find_previous.title = Знайсці папярэдні выпадак выразу
-find_previous_label = Папярэдні
-find_next.title = Знайсці наступны выпадак выразу
-find_next_label = Наступны
-find_highlight = Падфарбаваць усе
-find_match_case_label = Адрозніваць вялікія/малыя літары
-find_reached_top = Дасягнуты пачатак дакумента, працяг з канца
-find_reached_bottom = Дасягнуты канец дакумента, працяг з пачатку
-find_not_found = Выраз не знойдзены
-error_more_info = Падрабязней
-error_less_info = Сцісла
-error_close = Закрыць
-error_version_info = PDF.js в{{version}} (пабудова: {{build}})
-error_message = Паведамленне: {{message}}
-error_stack = Стос: {{stack}}
-error_file = Файл: {{file}}
-error_line = Радок: {{line}}
-rendering_error = Здарылася памылка падчас адлюстравання старонкі.
-page_scale_width = Шырыня старонкі
-page_scale_fit = Уцісненне старонкі
-page_scale_auto = Самастойнае павялічэнне
-page_scale_actual = Сапраўдны памер
-loading_error_indicator = Памылка
-loading_error = Здарылася памылка падчас загрузкі PDF.
-invalid_file_error = Няспраўны або пашкоджаны файл PDF.
-missing_file_error = Адсутны файл PDF.
-text_annotation_type.alt = [{{type}} Annotation]
-password_label = Увядзіце пароль, каб адчыніць гэты файл PDF.
-password_invalid = Крывы пароль. Паспрабуйце зноў.
-password_ok = Добра
-password_cancel = Скасаваць
-printing_not_supported = Папярэджанне: друк не падтрымлівацца цалкам гэтым азіральнікам.
-printing_not_ready = Увага: PDF не сцягнуты цалкам для друкавання.
-web_fonts_disabled = Шрыфты Сеціва забаронены: немгчыма ўжываць укладзеныя шрыфты PDF.
-document_colors_disabled = Дакументам PDF не дазволена карыстацца сваімі ўласнымі колерамі: 'Дазволіць старонкам выбіраць свае ўласныя колеры' абяздзейнена ў азіральніку.
diff --git a/public/pfd/build/generic/web/locale/bg/viewer.properties b/public/pfd/build/generic/web/locale/bg/viewer.properties
deleted file mode 100644
index 80059f5..0000000
--- a/public/pfd/build/generic/web/locale/bg/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Предишна страница
-previous_label=Предишна
-next.title=Следваща страница
-next_label=Следваща
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Страница:
-page_of=от {{pageCount}}
-
-zoom_out.title=Отдалечаване
-zoom_out_label=Отдалечаване
-zoom_in.title=Приближаване
-zoom_in_label=Приближаване
-zoom.title=Мащабиране
-presentation_mode.title=Превключване към режим на представяне
-presentation_mode_label=Режим на представяне
-open_file.title=Отваряне на файл
-open_file_label=Отваряне
-print.title=Отпечатване
-print_label=Отпечатване
-download.title=Изтегляне
-download_label=Изтегляне
-bookmark.title=Текущ изглед (копиране или отваряне в нов прозорец)
-bookmark_label=Текущ изглед
-
-# Secondary toolbar and context menu
-tools.title=Инструменти
-tools_label=Инструменти
-first_page.title=Към първата страница
-first_page.label=Към първата страница
-first_page_label=Към първата страница
-last_page.title=Към последната страница
-last_page.label=Към последната страница
-last_page_label=Към последната страница
-page_rotate_cw.title=Превъртане по часовниковата стрелка
-page_rotate_cw.label=Превъртане по часовниковата стрелка
-page_rotate_cw_label=Превъртане по часовниковата стрелка
-page_rotate_ccw.title=Превъртане обратно на часовниковата стрелка
-page_rotate_ccw.label=Превъртане обратно на часовниковата стрелка
-page_rotate_ccw_label=Превъртане обратно на часовниковата стрелка
-
-hand_tool_enable.title=Включване на инструмента ръка
-hand_tool_enable_label=Включване на инструмента ръка
-hand_tool_disable.title=Изключване на инструмента ръка
-hand_tool_disable_label=Изключване на инструмента ръка
-
-# Document properties dialog box
-document_properties.title=Свойства на документа…
-document_properties_label=Свойства на документа…
-document_properties_file_name=Име на файл:
-document_properties_file_size=Големина на файл:
-document_properties_kb={{size_kb}} КБ ({{size_b}} байта)
-document_properties_mb={{size_mb}} МБ ({{size_b}} байта)
-document_properties_title=Заглавие:
-document_properties_author=Автор:
-document_properties_subject=Тема:
-document_properties_keywords=Ключови думи:
-document_properties_creation_date=Дата на създаване:
-document_properties_modification_date=Дата на промяна:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Създател:
-document_properties_producer=PDF произведен от:
-document_properties_version=PDF версия:
-document_properties_page_count=Брой страници:
-document_properties_close=Затваряне
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Превключване на страничната лента
-toggle_sidebar_label=Превключване на страничната лента
-outline.title=Показване на очертанията на документа
-outline_label=Очертание на документа
-attachments.title=Показване на притурките
-attachments_label=Притурки
-thumbs.title=Показване на миниатюрите
-thumbs_label=Миниатюри
-findbar.title=Намиране в документа
-findbar_label=Търсене
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Страница {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Миниатюра на страница {{page}}
-
-# Find panel button title and messages
-find_label=Търсене:
-find_previous.title=Намиране на предното споменаване на тази фраза
-find_previous_label=Предишна
-find_next.title=Намиране на следващото споменаване на тази фраза
-find_next_label=Следваща
-find_highlight=Маркирай всички
-find_match_case_label=Точно съвпадения
-find_reached_top=Достигнато е началото на документа, продължаване от края
-find_reached_bottom=Достигнат е краят на документа, продължаване от началото
-find_not_found=Фразата не е намерена
-
-# Error panel labels
-error_more_info=Повече информация
-error_less_info=По-малко информация
-error_close=Затваряне
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js версия {{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Съобщение: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Стек: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Файл: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Ред: {{line}}
-rendering_error=Грешка при изчертаване на страницата.
-
-# Predefined zoom values
-page_scale_width=Ширина на страницата
-page_scale_fit=Вместване в страницата
-page_scale_auto=Автоматично мащабиране
-page_scale_actual=Действителен размер
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Грешка
-loading_error=Получи се грешка при зареждане на PDF-а.
-invalid_file_error=Невалиден или повреден PDF файл
-missing_file_error=Липсващ PDF файл.
-unexpected_response_error=Неочакван отговор от сървъра.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Анотация {{type}}]
-password_label=Въведете парола за отваряне на този PDF файл.
-password_invalid=Невалидна парола. Моля, опитайте отново.
-password_ok=Добре
-password_cancel=Отказ
-
-printing_not_supported=Внимание: Този браузър няма пълна поддръжка на отпечатване.
-printing_not_ready=Внимание: Този PDF файл не е напълно зареден за печат.
-web_fonts_disabled=Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове.
-document_colors_disabled=На PDF-документите не е разрешено да използват собствени цветове: „Разрешаване на страниците да избират собствени цветове“ е изключено в браузъра.
diff --git a/public/pfd/build/generic/web/locale/bn-BD/viewer.properties b/public/pfd/build/generic/web/locale/bn-BD/viewer.properties
deleted file mode 100644
index 6577a36..0000000
--- a/public/pfd/build/generic/web/locale/bn-BD/viewer.properties
+++ /dev/null
@@ -1,139 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=পূর্ববর্তী পৃষ্ঠা
-previous_label=পূর্ববর্তী
-next.title=পরবর্তী পৃষ্ঠা
-next_label=পরবর্তী
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=পৃষ্ঠা:
-page_of={{pageCount}} এর
-
-zoom_out.title=ছোট আকারে প্রদর্শন
-zoom_out_label=ছোট আকারে প্রদর্শন
-zoom_in.title=বড় আকারে প্রদর্শন
-zoom_in_label=বড় আকারে প্রদর্শন
-zoom.title=বড় আকারে প্রদর্শন
-presentation_mode.title=উপস্থাপনা মোডে স্যুইচ করুন
-presentation_mode_label=উপস্থাপনা মোড
-open_file.title=ফাইল খুলুন
-open_file_label=খুলুন
-print.title=মুদ্রণ
-print_label=মুদ্রণ
-download.title=ডাউনলোড
-download_label=ডাউনলোড
-bookmark.title=বর্তমান অবস্থা (অনুলিপি অথবা নতুন উইন্ডো তে খুলুন)
-bookmark_label=বর্তমান অবস্থা
-
-# Secondary toolbar and context menu
-tools.title=টুল
-tools_label=টুল
-first_page.title=প্রথম পাতায় যাও
-first_page.label=প্রথম পাতায় যাও
-first_page_label=প্রথম পাতায় যাও
-last_page.title=শেষ পাতায় যাও
-last_page.label=শেষ পাতায় যাও
-last_page_label=শেষ পাতায় যাও
-page_rotate_cw.title=ঘড়ির কাঁটার দিকে ঘোরাও
-page_rotate_cw.label=ঘড়ির কাঁটার দিকে ঘোরাও
-page_rotate_cw_label=ঘড়ির কাঁটার দিকে ঘোরাও
-page_rotate_ccw.title=ঘড়ির কাঁটার বিপরীতে ঘোরাও
-page_rotate_ccw.label=ঘড়ির কাঁটার বিপরীতে ঘোরাও
-page_rotate_ccw_label=ঘড়ির কাঁটার বিপরীতে ঘোরাও
-
-
-# Document properties dialog box
-document_properties_title=শিরোনাম:
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=সাইডবার টগল করুন
-toggle_sidebar_label=সাইডবার টগল করুন
-outline.title=নথির রূপরেখা প্রদর্শন করুন
-outline_label=নথির রূপরেখা
-thumbs.title=থাম্বনেইল সমূহ  প্রদর্শন করুন
-thumbs_label=থাম্বনেইল সমূহ
-findbar.title=নথির মধ্যে খুঁজুন
-findbar_label=অনুসন্ধান
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=পৃষ্ঠা {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}} পৃষ্ঠার থাম্বনেইল
-
-# Find panel button title and messages
-find_label=অনুসন্ধান:
-find_previous.title=বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান
-find_previous_label=পূর্ববর্তী
-find_next.title=বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান
-find_next_label=পরবর্তী
-find_highlight=সব হাইলাইট করা হবে
-find_match_case_label=অক্ষরের ছাঁদ মেলানো
-find_reached_top=পৃষ্ঠার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে
-find_reached_bottom=পৃষ্ঠার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে
-find_not_found=বাক্যাংশ পাওয়া যায়নি
-
-# Error panel labels
-error_more_info=আরও তথ্য
-error_less_info=কম তথ্য
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=বার্তা: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=নথি: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=লাইন: {{line}}
-rendering_error=পৃষ্ঠা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে।
-
-# Predefined zoom values
-page_scale_width=পৃষ্ঠার প্রস্থ
-page_scale_fit=পৃষ্ঠা ফিট করুন
-page_scale_auto=স্বয়ংক্রিয় জুম
-page_scale_actual=প্রকৃত আকার
-
-# Loading indicator messages
-loading_error_indicator=ত্রুটি
-loading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে।
-invalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল।
-missing_file_error=পিডিএফ ফাইল পাওয়া যাচ্ছে না।
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} টীকা]
-password_label=পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন।
-password_invalid=ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন।
-password_ok=ঠিক আছে
-password_cancel=বাতিল
-
-printing_not_supported=সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়।
-printing_not_ready=সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি।
-web_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না।
-document_colors_disabled=পিডিএফ ডকুমেন্টকে তাদের নিজস্ব রঙ ব্যবহারে অনুমতি নেই: 'পাতা তাদের নিজেস্ব রঙ নির্বাচন করতে অনুমতি দিন' এই ব্রাউজারে নিষ্ক্রিয় রয়েছে।
diff --git a/public/pfd/build/generic/web/locale/bn-IN/viewer.properties b/public/pfd/build/generic/web/locale/bn-IN/viewer.properties
deleted file mode 100644
index 84391bf..0000000
--- a/public/pfd/build/generic/web/locale/bn-IN/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=পূর্ববর্তী পৃষ্ঠা
-previous_label=পূর্ববর্তী
-next.title=পরবর্তী পৃষ্ঠা
-next_label=পরবর্তী
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=পৃষ্ঠা:
-page_of=সর্বমোট {{pageCount}}
-
-zoom_out.title=ছোট মাপে প্রদর্শন
-zoom_out_label=ছোট মাপে প্রদর্শন
-zoom_in.title=বড় মাপে প্রদর্শন
-zoom_in_label=বড় মাপে প্রদর্শন
-zoom.title=প্রদর্শনের মাপ
-presentation_mode.title=উপস্থাপনা মোড স্যুইচ করুন
-presentation_mode_label=উপস্থাপনা মোড
-open_file.title=ফাইল খুলুন
-open_file_label=খুলুন
-print.title=প্রিন্ট করুন
-print_label=প্রিন্ট করুন
-download.title=ডাউনলোড করুন
-download_label=ডাউনলোড করুন
-bookmark.title=বর্তমান প্রদর্শন (কপি করুন অথবা নতুন উইন্ডোতে খুলুন)
-bookmark_label=বর্তমান প্রদর্শন
-
-# Secondary toolbar and context menu
-tools.title=সরঞ্জাম
-tools_label=সরঞ্জাম
-first_page.title=প্রথম পৃষ্ঠায় চলুন
-first_page.label=প্রথম পৃষ্ঠায় চলুন
-first_page_label=প্রথম পৃষ্ঠায় চলুন
-last_page.title=সর্বশেষ পৃষ্ঠায় চলুন
-last_page.label=সর্বশেষ পৃষ্ঠায় চলুন
-last_page_label=সর্বশেষ পৃষ্ঠায় চলুন
-page_rotate_cw.title=ডানদিকে ঘোরানো হবে
-page_rotate_cw.label=ডানদিকে ঘোরানো হবে
-page_rotate_cw_label=ডানদিকে ঘোরানো হবে
-page_rotate_ccw.title=বাঁদিকে ঘোরানো হবে
-page_rotate_ccw.label=বাঁদিকে ঘোরানো হবে
-page_rotate_ccw_label=বাঁদিকে ঘোরানো হবে
-
-hand_tool_enable.title=হ্যান্ড টুল সক্রিয় করুন
-hand_tool_enable_label=হ্যান্ড টুল সক্রিয় করুন
-hand_tool_disable.title=হ্যান্ড টুল নিস্ক্রিয় করুন
-hand_tool_disable_label=হ্যান্ড টুল নিস্ক্রিয় করুন
-
-# Document properties dialog box
-document_properties.title=নথির বৈশিষ্ট্য…
-document_properties_label=নথির বৈশিষ্ট্য…
-document_properties_file_name=ফাইলের নাম:
-document_properties_file_size=ফাইলের মাপ:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} মেগাবাইট ({{size_b}} bytes)
-document_properties_title=শিরোনাম:
-document_properties_author=লেখক:
-document_properties_subject=বিষয়:
-document_properties_keywords=নির্দেশক শব্দ:
-document_properties_creation_date=নির্মাণের তারিখ:
-document_properties_modification_date=পরিবর্তনের তারিখ:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=নির্মাতা:
-document_properties_producer=PDF নির্মাতা:
-document_properties_version=PDF সংস্করণ:
-document_properties_page_count=মোট পৃষ্ঠা:
-document_properties_close=বন্ধ করুন
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=সাইডবার টগল করুন
-toggle_sidebar_label=সাইডবার টগল করুন
-outline.title=নথির রূপরেখা প্রদর্শন
-outline_label=নথির রূপরেখা প্রদর্শন
-attachments.title=সংযুক্তিসমূহ দেখান
-attachments_label=সংযুক্ত বস্তু
-thumbs.title=থাম্ব-নেইল প্রদর্শন
-thumbs_label=থাম্ব-নেইল প্রদর্শন
-findbar.title=নথিতে খুঁজুন
-findbar_label=অনুসন্ধান করুন
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=পৃষ্ঠা {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=পৃষ্ঠা {{page}}-র থাম্ব-নেইল
-
-# Find panel button title and messages
-find_label=অনুসন্ধান:
-find_previous.title=চিহ্নিত পংক্তির পূর্ববর্তী উপস্থিতি অনুসন্ধান করুন
-find_previous_label=পূর্ববর্তী
-find_next.title=চিহ্নিত পংক্তির পরবর্তী উপস্থিতি অনুসন্ধান করুন
-find_next_label=পরবর্তী
-find_highlight=সমগ্র উজ্জ্বল করুন
-find_match_case_label=হরফের ছাঁদ মেলানো হবে
-find_reached_top=পৃষ্ঠার প্রারম্ভে পৌছে গেছে, নীচের অংশ থেকে আরম্ভ করা হবে
-find_reached_bottom=পৃষ্ঠার অন্তিম প্রান্তে পৌছে গেছে, প্রথম অংশ থেকে আরম্ভ করা হবে
-find_not_found=পংক্তি পাওয়া যায়নি
-
-# Error panel labels
-error_more_info=অতিরিক্ত তথ্য
-error_less_info=কম তথ্য
-error_close=বন্ধ করুন
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Message: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=File: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Line: {{line}}
-rendering_error=পৃষ্ঠা প্রদর্শনকালে একটি সমস্যা দেখা দিয়েছে।
-
-# Predefined zoom values
-page_scale_width=পৃষ্ঠার প্রস্থ অনুযায়ী
-page_scale_fit=পৃষ্ঠার মাপ অনুযায়ী
-page_scale_auto=স্বয়ংক্রিয় মাপ নির্ধারণ
-page_scale_actual=প্রকৃত মাপ
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=ত্রুটি
-loading_error=PDF লোড করার সময় সমস্যা দেখা দিয়েছে।
-invalid_file_error=অবৈধ বা ক্ষতিগ্রস্ত পিডিএফ ফাইল।
-missing_file_error=অনুপস্থিত PDF ফাইল
-unexpected_response_error=সার্ভার থেকে অপ্রত্যাশিত সাড়া পাওয়া গেছে।
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=এই PDF ফাইল খোলার জন্য পাসওয়ার্ড দিন।
-password_invalid=পাসওয়ার্ড সঠিক নয়। অনুগ্রহ করে পুনরায় প্রচেষ্টা করুন।
-password_ok=OK
-password_cancel=বাতিল করুন
-
-printing_not_supported=সতর্কবার্তা: এই ব্রাউজার দ্বারা প্রিন্ট ব্যবস্থা সম্পূর্ণরূপে সমর্থিত নয়।
-printing_not_ready=সতর্কবাণী: পিডিএফ সম্পূর্ণরূপে মুদ্রণের জন্য লোড করা হয় না.
-web_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয় করা হয়েছে: এমবেডেড পিডিএফ ফন্ট ব্যবহার করতে অক্ষম.
-document_colors_disabled=পিডিএফ নথি তাদের নিজস্ব রং ব্যবহার করার জন্য অনুমতিপ্রাপ্ত নয়: ব্রাউজারে নিষ্ক্রিয় করা হয়েছে য়েন  'পেজ তাদের নিজস্ব রং নির্বাচন করার অনুমতি প্রদান করা য়ায়।'
diff --git a/public/pfd/build/generic/web/locale/br/viewer.properties b/public/pfd/build/generic/web/locale/br/viewer.properties
deleted file mode 100644
index 7f7926c..0000000
--- a/public/pfd/build/generic/web/locale/br/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Pajenn a-raok
-previous_label=A-raok
-next.title=Pajenn war-lerc'h
-next_label=War-lerc'h
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Pajenn :
-page_of=eus {{pageCount}}
-
-zoom_out.title=Zoum bihanaat
-zoom_out_label=Zoum bihanaat
-zoom_in.title=Zoum brasaat
-zoom_in_label=Zoum brasaat
-zoom.title=Zoum
-presentation_mode.title=Trec'haoliñ etrezek ar mod kinnigadenn
-presentation_mode_label=Mod kinnigadenn
-open_file.title=Digeriñ ur restr
-open_file_label=Digeriñ ur restr
-print.title=Moullañ
-print_label=Moullañ
-download.title=Pellgargañ
-download_label=Pellgargañ
-bookmark.title=Gwel bremanel (eilañ pe zigeriñ e-barzh ur prenestr nevez)
-bookmark_label=Gwel bremanel
-
-# Secondary toolbar and context menu
-tools.title=Ostilhoù
-tools_label=Ostilhoù
-first_page.title=Mont d'ar bajenn gentañ
-first_page.label=Mont d'ar bajenn gentañ
-first_page_label=Mont d'ar bajenn gentañ
-last_page.title=Mont d'ar bajenn diwezhañ
-last_page.label=Mont d'ar bajenn diwezhañ
-last_page_label=Mont d'ar bajenn diwezhañ
-page_rotate_cw.title=C'hwelañ gant roud ar bizied
-page_rotate_cw.label=C'hwelañ gant roud ar bizied
-page_rotate_cw_label=C'hwelañ gant roud ar bizied
-page_rotate_ccw.title=C'hwelañ gant roud gin ar bizied
-page_rotate_ccw.label=C'hwelañ gant roud gin ar bizied
-page_rotate_ccw_label=C'hwelañ gant roud gin ar bizied
-
-hand_tool_enable.title=Gweredekaat an ostilh "dorn"
-hand_tool_enable_label=Gweredekaat an ostilh "dorn"
-hand_tool_disable.title=Diweredekaat an ostilh "dorn"
-hand_tool_disable_label=Diweredekaat an ostilh "dorn"
-
-# Document properties dialog box
-document_properties.title=Perzhioù an teul…
-document_properties_label=Perzhioù an teul…
-document_properties_file_name=Anv restr :
-document_properties_file_size=Ment ar restr :
-document_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit)
-document_properties_mb={{size_mb}} Me ({{size_b}} eizhbit)
-document_properties_title=Titl :
-document_properties_author=Aozer :
-document_properties_subject=Danvez :
-document_properties_keywords=Gerioù-alc'hwez :
-document_properties_creation_date=Deiziad krouiñ :
-document_properties_modification_date=Deiziad kemmañ :
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Krouer :
-document_properties_producer=Kenderc'her PDF :
-document_properties_version=Handelv PDF :
-document_properties_page_count=Niver a bajennoù :
-document_properties_close=Serriñ
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez
-toggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez
-outline.title=Diskouez ar sinedoù
-outline_label=Sinedoù an teuliad
-attachments.title=Diskouez ar c'henstagadurioù
-attachments_label=Kenstagadurioù
-thumbs.title=Diskouez ar melvennoù
-thumbs_label=Melvennoù
-findbar.title=Klask e-barzh an teuliad
-findbar_label=Klask
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Pajenn {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Melvenn ar bajenn {{page}}
-
-# Find panel button title and messages
-find_label=Kavout :
-find_previous.title=Kavout an tamm frazenn kent o klotañ ganti
-find_previous_label=Kent
-find_next.title=Kavout an tamm frazenn war-lerc'h o klotañ ganti
-find_next_label=War-lerc'h
-find_highlight=Usskediñ pep tra
-find_match_case_label=Teurel evezh ouzh ar pennlizherennoù
-find_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz
-find_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h
-find_not_found=N'haller ket kavout ar frazenn
-
-# Error panel labels
-error_more_info=Muioc'h a ditouroù
-error_less_info=Nebeutoc'h a ditouroù
-error_close=Serriñ
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js handelv {{version}} (kempunadur : {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Kemennadenn : {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Torn : {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Restr : {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linenn : {{line}}
-rendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad.
-
-# Predefined zoom values
-page_scale_width=Led ar bajenn
-page_scale_fit=Pajenn a-bezh
-page_scale_auto=Zoum emgefreek
-page_scale_actual=Ment wir
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Fazi
-loading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF.
-invalid_file_error=Restr PDF didalvoudek pe kontronet.
-missing_file_error=Restr PDF o vankout.
-unexpected_response_error=Respont dic'hortoz a-berzh an dafariad
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Notennañ]
-password_label=Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ.
-password_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij.
-password_ok=Mat eo
-password_cancel=Nullañ
-
-printing_not_supported=Kemenn : N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ.
-printing_not_ready=Kemenn : N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn.
-web_fonts_disabled=Diweredekaet eo an nodrezhoù web : n'haller ket arverañ an nodrezhoù PDF enframmet.
-document_colors_disabled=N'eo ket aotreet an teuliadoù PDF da arverañ o livioù dezho : diweredekaet eo 'Aotren ar pajennoù da zibab o livioù dezho' e-barzh ar merdeer.
diff --git a/public/pfd/build/generic/web/locale/bs/viewer.properties b/public/pfd/build/generic/web/locale/bs/viewer.properties
deleted file mode 100644
index a89bf7a..0000000
--- a/public/pfd/build/generic/web/locale/bs/viewer.properties
+++ /dev/null
@@ -1,125 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Prethodna strana
-previous_label=Prethodna
-next.title=Sljedeća strna
-next_label=Sljedeća
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Strana:
-page_of=od {{pageCount}}
-
-zoom_out.title=Umanji
-zoom_out_label=Umanji
-zoom_in.title=Uvećaj
-zoom_in_label=Uvećaj
-zoom.title=Uvećanje
-print.title=Štampaj
-print_label=Štampaj
-presentation_mode.title=Prebaci se u prezentacijski režim
-presentation_mode_label=Prezentacijski režim
-open_file.title=Otvori fajl
-open_file_label=Otvori
-download.title=Preuzmi
-download_label=Preuzmi
-bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)
-bookmark_label=Trenutni prikaz
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Uključi/isključi bočnu traku
-toggle_sidebar_label=Uključi/isključi bočnu traku
-outline.title=Prikaži konture dokumenta
-outline_label=Konture dokumenta
-thumbs.title=Prikaži thumbnailove
-thumbs_label=Thumbnailovi
-findbar.title=Pronađi u dokumentu
-findbar_label=Pronađi
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Strana {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Thumbnail strane {{page}}
-
-# Context menu
-first_page.label=Idi na prvu stranu
-last_page.label=Idi na zadnju stranu
-page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu
-page_rotate_ccw.label=Rotiraj suprotno smjeru kazaljke na satu
-
-# Find panel button title and messages
-find_label=Pronađi:
-find_previous.title=Pronađi prethodno pojavljivanje fraze
-find_previous_label=Prethodno
-find_next.title=Pronađi sljedeće pojavljivanje fraze
-find_next_label=Sljedeće
-find_highlight=Označi sve
-find_match_case_label=Osjetljivost na karaktere
-find_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna
-find_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha
-find_not_found=Fraza nije pronađena
-
-# Error panel labels
-error_more_info=Više informacija
-error_less_info=Manje informacija
-error_close=Zatvori
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Poruka: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fajl: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linija: {{line}}
-rendering_error=Došlo je do greške prilikom renderiranja strane.
-
-# Predefined zoom values
-page_scale_width=Širina strane
-page_scale_fit=Uklopi stranu
-page_scale_auto=Automatsko uvećanje
-page_scale_actual=Stvarna veličina
-
-# Loading indicator messages
-# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
-loading_error_indicator=Greška
-loading_error=Došlo je do greške prilikom učitavanja PDF-a.
-invalid_file_error=Neispravan ili oštećen PDF fajl.
-missing_file_error=Nedostaje PDF fajl.
-
-# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
-# "{{[type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} pribilješka]
-request_password=PDF je zaštićen lozinkom:
-invalid_password=Pogrešna lozinka.
-
-printing_not_supported=Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru.
-printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za štampanje.
-web_fonts_disabled=Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove.
-document_colors_disabled=PDF dokumentima nije dozvoljeno da koriste vlastite boje: \'Dozvoli stranicama da izaberu vlastite boje\' je deaktivirano u browseru.
diff --git a/public/pfd/build/generic/web/locale/ca/viewer.properties b/public/pfd/build/generic/web/locale/ca/viewer.properties
deleted file mode 100644
index 93b3b76..0000000
--- a/public/pfd/build/generic/web/locale/ca/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Pàgina anterior
-previous_label=Anterior
-next.title=Pàgina següent
-next_label=Següent
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Pàgina:
-page_of=de {{pageCount}}
-
-zoom_out.title=Allunya
-zoom_out_label=Allunya
-zoom_in.title=Apropa
-zoom_in_label=Apropa
-zoom.title=Escala
-presentation_mode.title=Canvia al mode de presentació
-presentation_mode_label=Mode de presentació
-open_file.title=Obre el fitxer
-open_file_label=Obre
-print.title=Imprimeix
-print_label=Imprimeix
-download.title=Baixa
-download_label=Baixa
-bookmark.title=Vista actual (copia o obre en una finestra nova)
-bookmark_label=Vista actual
-
-# Secondary toolbar and context menu
-tools.title=Eines
-tools_label=Eines
-first_page.title=Vés a la primera pàgina
-first_page.label=Vés a la primera pàgina
-first_page_label=Vés a la primera pàgina
-last_page.title=Vés a l'última pàgina
-last_page.label=Vés a l'última pàgina
-last_page_label=Vés a l'última pàgina
-page_rotate_cw.title=Gira cap a la dreta
-page_rotate_cw.label=Gira cap a la dreta
-page_rotate_cw_label=Gira cap a la dreta
-page_rotate_ccw.title=Gira cap a l'esquerra
-page_rotate_ccw.label=Gira cap a l'esquerra
-page_rotate_ccw_label=Gira cap a l'esquerra
-
-hand_tool_enable.title=Habilita l'eina de mà
-hand_tool_enable_label=Habilita l'eina de mà
-hand_tool_disable.title=Inhabilita l'eina de mà
-hand_tool_disable_label=Inhabilita l'eina de mà
-
-# Document properties dialog box
-document_properties.title=Propietats del document…
-document_properties_label=Propietats del document…
-document_properties_file_name=Nom del fitxer:
-document_properties_file_size=Mida del fitxer:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Títol:
-document_properties_author=Autor:
-document_properties_subject=Assumpte:
-document_properties_keywords=Paraules clau:
-document_properties_creation_date=Data de creació:
-document_properties_modification_date=Data de modificació:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creador:
-document_properties_producer=Generador de PDF:
-document_properties_version=Versió de PDF:
-document_properties_page_count=Nombre de pàgines:
-document_properties_close=Tanca
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Mostra/amaga la barra lateral
-toggle_sidebar_label=Mostra/amaga la barra lateral
-outline.title=Mostra el contorn del document
-outline_label=Contorn del document
-attachments.title=Mostra les adjuncions
-attachments_label=Adjuncions
-thumbs.title=Mostra les miniatures
-thumbs_label=Miniatures
-findbar.title=Cerca al document
-findbar_label=Cerca
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Pàgina {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura de la pàgina {{page}}
-
-# Find panel button title and messages
-find_label=Cerca:
-find_previous.title=Cerca l'anterior coincidència de l'expressió
-find_previous_label=Anterior
-find_next.title=Cerca la següent coincidència de l'expressió
-find_next_label=Següent
-find_highlight=Ressalta-ho tot
-find_match_case_label=Distingeix entre majúscules i minúscules
-find_reached_top=S'ha arribat al principi del document, es continua pel final
-find_reached_bottom=S'ha arribat al final del document, es continua pel principi
-find_not_found=No s'ha trobat l'expressió
-
-# Error panel labels
-error_more_info=Més informació
-error_less_info=Menys informació
-error_close=Tanca
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (muntatge: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Missatge: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pila: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fitxer: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Línia: {{line}}
-rendering_error=S'ha produït un error mentre es renderitzava la pàgina.
-
-# Predefined zoom values
-page_scale_width=Amplària de la pàgina
-page_scale_fit=Ajusta la pàgina
-page_scale_auto=Zoom automàtic
-page_scale_actual=Mida real
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Error
-loading_error=S'ha produït un error en carregar el PDF.
-invalid_file_error=El fitxer PDF no és vàlid o està malmès.
-missing_file_error=Falta el fitxer PDF.
-unexpected_response_error=Resposta inesperada del servidor.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotació {{type}}]
-password_label=Introduïu la contrasenya per obrir aquest fitxer PDF.
-password_invalid=La contrasenya no és vàlida. Torneu-ho a provar.
-password_ok=D'acord
-password_cancel=Cancel·la
-
-printing_not_supported=Avís: la impressió no és plenament funcional en aquest navegador.
-printing_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo.
-web_fonts_disabled=Les fonts web estan inhabilitades: no es poden incrustar fitxers PDF.
-document_colors_disabled=Els documents PDF no poden usar els seus colors propis: «Permet a les pàgines triar els colors propis» es troba desactivat al navegador.
diff --git a/public/pfd/build/generic/web/locale/cs/viewer.properties b/public/pfd/build/generic/web/locale/cs/viewer.properties
deleted file mode 100644
index 2033c5a..0000000
--- a/public/pfd/build/generic/web/locale/cs/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Předchozí stránka
-previous_label=Předchozí
-next.title=Další stránka
-next_label=Další
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Stránka:
-page_of=z {{pageCount}}
-
-zoom_out.title=Zmenší velikost
-zoom_out_label=Zmenšit
-zoom_in.title=Zvětší velikost
-zoom_in_label=Zvětšit
-zoom.title=Nastaví velikost
-presentation_mode.title=Přepne režimu prezentace
-presentation_mode_label=Režim prezentace
-open_file.title=Otevře soubor
-open_file_label=Otevřít
-print.title=Vytiskne dokument
-print_label=Tisk
-download.title=Stáhne dokument
-download_label=Stáhnout
-bookmark.title=Aktuální pohled (kopírovat nebo otevřít v novém okně)
-bookmark_label=Aktuální pohled
-
-# Secondary toolbar and context menu
-tools.title=Nástroje
-tools_label=Nástroje
-first_page.title=Přejde na první stránku
-first_page.label=Přejít na první stránku
-first_page_label=Přejít na první stránku
-last_page.title=Přejde na poslední stránku
-last_page.label=Přejít na poslední stránku
-last_page_label=Přejít na poslední stránku
-page_rotate_cw.title=Otočí po směru hodin
-page_rotate_cw.label=Otočit po směru hodin
-page_rotate_cw_label=Otočit po směru hodin
-page_rotate_ccw.title=Otočí proti směru hodin
-page_rotate_ccw.label=Otočit proti směru hodin
-page_rotate_ccw_label=Otočit proti směru hodin
-
-hand_tool_enable.title=Povolit nástroj ručička
-hand_tool_enable_label=Povolit nástroj ručička
-hand_tool_disable.title=Zakázat nástroj ručička
-hand_tool_disable_label=Zakázat nástroj ručička
-
-# Document properties dialog box
-document_properties.title=Vlastnosti dokumentu…
-document_properties_label=Vlastnosti dokumentu…
-document_properties_file_name=Název souboru:
-document_properties_file_size=Velikost souboru:
-document_properties_kb={{size_kb}} kB ({{size_b}} bajtů)
-document_properties_mb={{size_mb}} MB ({{size_b}} bajtů)
-document_properties_title=Nadpis:
-document_properties_author=Autor:
-document_properties_subject=Subjekt:
-document_properties_keywords=Klíčová slova:
-document_properties_creation_date=Datum vytvoření:
-document_properties_modification_date=Datum úpravy:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Vytvořil:
-document_properties_producer=Tvůrce PDF:
-document_properties_version=Verze PDF:
-document_properties_page_count=Počet stránek:
-document_properties_close=Zavřít
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Postranní lišta
-toggle_sidebar_label=Postranní lišta
-outline.title=Zobrazí osnovu dokumentu
-outline_label=Osnova dokumentu
-attachments.title=Zobrazí přílohy
-attachments_label=Přílohy
-thumbs.title=Zobrazí náhledy
-thumbs_label=Náhledy
-findbar.title=Najde v dokumentu
-findbar_label=Najít
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Strana {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Náhled strany {{page}}
-
-# Find panel button title and messages
-find_label=Najít:
-find_previous.title=Najde předchozí výskyt hledaného spojení
-find_previous_label=Předchozí
-find_next.title=Najde další výskyt hledaného spojení
-find_next_label=Další
-find_highlight=Zvýraznit
-find_match_case_label=Rozlišovat velikost
-find_reached_top=Dosažen začátek dokumentu, pokračuje se od konce
-find_reached_bottom=Dosažen konec dokumentu, pokračuje se o začátku
-find_not_found=Hledané spojení nenalezeno
-
-# Error panel labels
-error_more_info=Více informací
-error_less_info=Méně informací
-error_close=Zavřít
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (sestavení: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Zpráva: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Zásobník: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Soubor: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Řádka: {{line}}
-rendering_error=Při vykreslování stránky nastala chyba.
-
-# Predefined zoom values
-page_scale_width=Podle šířky
-page_scale_fit=Podle výšky
-page_scale_auto=Automatická velikost
-page_scale_actual=Aktuální velikost
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Chyba
-loading_error=Při nahrávání PDF nastala chyba.
-invalid_file_error=Neplatný nebo chybný soubor PDF.
-missing_file_error=Chybí soubor PDF.
-unexpected_response_error=Neočekávaná odpověď serveru.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotace typu {{type}}]
-password_label=Pro otevření PDF souboru vložte heslo.
-password_invalid=Neplatné heslo. Zkuste to znovu.
-password_ok=OK
-password_cancel=Zrušit
-
-printing_not_supported=Upozornění: Tisk není v tomto prohlížeči plně podporován.
-printing_not_ready=Upozornění: Dokument PDF není kompletně načten.
-web_fonts_disabled=Webová písma jsou zakázána, proto není možné použít vložená písma PDF.
-document_colors_disabled=PDF dokumenty nemají povoleny používání vlastních barev: volba "Povolit stránkám používat vlastní barvy namísto výše zvolených" je v prohlížeči deaktivována.
diff --git a/public/pfd/build/generic/web/locale/csb/viewer.properties b/public/pfd/build/generic/web/locale/csb/viewer.properties
deleted file mode 100644
index 293a353..0000000
--- a/public/pfd/build/generic/web/locale/csb/viewer.properties
+++ /dev/null
@@ -1,134 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Pòprzédnô strona
-previous_label=Pòprzédnô
-next.title=Nôslédnô strona
-next_label=Nôslédnô
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Strona:
-page_of=z {{pageCount}}
-
-zoom_out.title=Zmniészë
-zoom_out_label=Zmniészë
-zoom_in.title=Zwikszë
-zoom_in_label=Wiôlgòsc
-zoom.title=Wiôlgòsc
-print.title=Drëkùjë
-print_label=Drëkùjë
-presentation_mode.title=Przéńdzë w trib prezentacje 
-presentation_mode_label=Trib prezentacje 
-open_file.title=Òtemkni lopk
-open_file_label=Òtemkni
-download.title=Zladënk
-download_label=Zladënk
-bookmark.title=Spamiãtôj wëzdrzatk (kòpérëje, abò òtemkni w nowim òknnie)
-bookmark_label=Aktualny wëzdrzatk
-
-find_label=Szëkôj:
-find_previous.title=Biéj do pòprzédnégò wënikù szëkbë
-find_previous_label=Pòprzédny
-find_next.title=Biéj do nôslédnégò wënikù szëkbë
-find_next_label=Nôslédny
-find_highlight=Pòdszkrzëni wszëtczé
-find_match_case_label=Rozeznôwôj miarã lëterów
-find_not_found=Nie nalôzł tekstu
-find_reached_bottom=Doszedł do kùńca dokùmentu, zaczinającë òd górë
-find_reached_top=Doszedł do pòczątkù dokùmentu, zaczinającë òd dołù
-
-toggle_sidebar.title=Pòsuwk wëbiérkù
-toggle_sidebar_label=Pòsuwk wëbiérkù
-
-outline.title=Wëskrzëni òbcéch dokùmentu
-outline_label=Òbcéch dokùmentu
-thumbs.title=Wëskrzëni miniaturë
-thumbs_label=Miniaturë
-findbar.title=Przeszëkôj dokùment
-findbar_label=Nalezë
-tools_label=Nôrzãdła
-first_page.title=Biéj do pierszi stronë
-first_page.label=Biéj do pierszi stronë
-last_page.label=Biéj do òstatny stronë
-invalid_file_error=Lëchi ôrt, abò pòpsëti lopk PDF.
-
-
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Strona {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura stronë {{page}}
-
-# Error panel labels
-error_more_info=Wicy infòrmacje
-error_less_info=Mni infòrmacje
-error_close=Close
-error_version_info=PDF.js v{{version}} (build: {{build}})
-
-
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Message: {{wiadło}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stóg}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=File: {{lopk}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Line: {{line}}
-rendering_error=Pòkôza sã fela przë renderowanim stronë.
-
-# Predefined zoom values
-page_scale_width=Szérzawa stronë
-page_scale_fit=Dopasëje stronã
-page_scale_auto=Aùtomatnô wiôlgòsc
-page_scale_actual=Naturalnô wiôlgòsc
-
-# Loading indicator messages
-# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
-loading_error_indicator=Fela
-loading_error=Pòkôza sã fela przë wczëtiwanim PDFù.
-
-# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
-# "{{[type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-
-request_password=PDF je zabezpieczony parolą:
-printing_not_supported = Òstrzéga: przezérnik nie je do kùńca wspieróny przez drëkôrze 
-
-# Context menu
-page_rotate_cw.label=Òbkrãcë w prawò
-page_rotate_ccw.label=Òbkrãcë w lewò
-
-
-last_page.title=Biéj do pòprzédny stronë
-last_page_label=Biéj do pòprzédny stronë
-page_rotate_cw.title=Òbkrãcë w prawò
-page_rotate_cw_label=Òbkrãcë w prawò
-page_rotate_ccw.title=Òbkrãcë w lewò
-page_rotate_ccw_label=Òbkrãcë w lewò
-
-
-web_fonts_disabled=Sécowé czconczi są wëłączoné: włączë je, bë móc ùżiwac òsadzonëch czconków w lopkach PDF.
-
-
-missing_file_error=Felëje lopka PDF.
-printing_not_ready = Òstrzéga: lopk mùszi sã do kùńca wczëtac zanim gò mòże drëkòwac
-
-document_colors_disabled=Dokùmentë PDF nie mògą ù swòjich farwów: \'Pòzwòlë stronóm wëbierac swòje farwë\' je wëłączoné w przezérnikù.
-invalid_password=Lëchô parola.
-text_annotation_type.alt=[Adnotacjô {{type}}]
-
-tools.title=Tools
-first_page_label=Go to First Page
-
-
diff --git a/public/pfd/build/generic/web/locale/cy/viewer.properties b/public/pfd/build/generic/web/locale/cy/viewer.properties
deleted file mode 100644
index 3ba7cef..0000000
--- a/public/pfd/build/generic/web/locale/cy/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Tudalen Flaenorol
-previous_label=Blaenorol
-next.title=Tudalen Nesaf
-next_label=Nesaf
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Tudalen:
-page_of=o {{pageCount}}
-
-zoom_out.title=Chwyddo Allan
-zoom_out_label=Chwyddo Allan
-zoom_in.title=Chwyddo Mewn
-zoom_in_label=Chwyddo Mewn
-zoom.title=Chwyddo
-presentation_mode.title=Newid i'r Modd Cyflwyno
-presentation_mode_label=Modd Cyflwyno
-open_file.title=Agor Ffeil
-open_file_label=Agor
-print.title=Argraffu
-print_label=Argraffu
-download.title=Llwyth
-download_label=Llwytho i Lawr
-bookmark.title=Golwg cyfredol (copïo neu agor ffenestr newydd)
-bookmark_label=Golwg Gyfredol
-
-# Secondary toolbar and context menu
-tools.title=Offer
-tools_label=Offer
-first_page.title=Mynd i'r Dudalen Gyntaf
-first_page.label=Mynd i'r Dudalen Gyntaf
-first_page_label=Mynd i'r Dudalen Gyntaf
-last_page.title=Mynd i'r Dudalen Olaf
-last_page.label=Mynd i'r Dudalen Olaf
-last_page_label=Mynd i'r Dudalen Olaf
-page_rotate_cw.title=Cylchdroi Clocwedd
-page_rotate_cw.label=Cylchdroi Clocwedd
-page_rotate_cw_label=Cylchdroi Clocwedd
-page_rotate_ccw.title=Cylchdroi Gwrthglocwedd
-page_rotate_ccw.label=Cylchdroi Gwrthglocwedd
-page_rotate_ccw_label=Cylchdroi Gwrthglocwedd
-
-hand_tool_enable.title=Galluogi offeryn llaw
-hand_tool_enable_label=Galluogi offeryn llaw
-hand_tool_disable.title=Analluogi offeryn llaw
-hand_tool_disable_label=Analluogi offeryn llaw
-
-# Document properties dialog box
-document_properties.title=Priodweddau Dogfen…
-document_properties_label=Priodweddau Dogfen…
-document_properties_file_name=Enw ffeil:
-document_properties_file_size=Maint ffeil:
-document_properties_kb={{size_kb}} KB ({{size_b}} beit)
-document_properties_mb={{size_mb}} MB ({{size_b}} beit)
-document_properties_title=Teitl:
-document_properties_author=Awdur:
-document_properties_subject=Pwnc:
-document_properties_keywords=Allweddair:
-document_properties_creation_date=Dyddiad Creu:
-document_properties_modification_date=Dyddiad Addasu:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Crewr:
-document_properties_producer=Cynhyrchydd PDF:
-document_properties_version=Fersiwn PDF:
-document_properties_page_count=Cyfrif Tudalen:
-document_properties_close=Cau
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Toglo'r Bar Ochr
-toggle_sidebar_label=Toglo'r Bar Ochr
-outline.title=Dangos Amlinell Dogfen
-outline_label=Amlinelliad Dogfen
-attachments.title=Dangos Atodiadau
-attachments_label=Atodiadau
-thumbs.title=Dangos Lluniau Bach
-thumbs_label=Lluniau Bach
-findbar.title=Canfod yn y Ddogfen
-findbar_label=Canfod
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Tudalen {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Llun Bach Tudalen {{page}}
-
-# Find panel button title and messages
-find_label=Canfod:
-find_previous.title=Canfod enghraifft flaenorol o'r ymadrodd
-find_previous_label=Blaenorol
-find_next.title=Canfod enghraifft nesaf yr ymadrodd
-find_next_label=Nesaf
-find_highlight=Amlygu popeth
-find_match_case_label=Cydweddu maint
-find_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod
-find_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig
-find_not_found=Heb ganfod ymadrodd
-
-# Error panel labels
-error_more_info=Rhagor o Wybodaeth
-error_less_info=Llai o wybodaeth
-error_close=Cau
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Neges: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stac: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Ffeil: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Llinell: {{line}}
-rendering_error=Digwyddodd gwall wrth adeiladu'r dudalen.
-
-# Predefined zoom values
-page_scale_width=Lled Tudalen
-page_scale_fit=Ffit Tudalen
-page_scale_auto=Chwyddo Awtomatig
-page_scale_actual=Maint Gwirioneddol
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Gwall
-loading_error=Digwyddodd gwall wrth lwytho'r PDF.
-invalid_file_error=Ffeil PDF annilys neu llwgr.
-missing_file_error=Ffeil PDF coll.
-unexpected_response_error=Ymateb annisgwyl gan y gweinydd.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anodiad {{type}} ]
-password_label=Rhowch gyfrinair i agor y PDF.
-password_invalid=Cyfrinair annilys. Ceisiwch eto.
-password_ok=Iawn
-password_cancel=Diddymu
-
-printing_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr.
-printing_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu.
-web_fonts_disabled=Ffontiau gwe wedi eu hanablu: methu defnyddio ffontiau PDF mewnblanedig.
-document_colors_disabled=Nid oes caniatâd i ddogfennau PDF i ddefnyddio eu lliwiau eu hunain: Mae 'Caniatáu i dudalennau ddefnyddio eu lliwiau eu hunain' wedi ei atal yn y porwr.
diff --git a/public/pfd/build/generic/web/locale/da/viewer.properties b/public/pfd/build/generic/web/locale/da/viewer.properties
deleted file mode 100644
index ddd428b..0000000
--- a/public/pfd/build/generic/web/locale/da/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Forrige side
-previous_label=Forrige
-next.title=Næste side
-next_label=Næste
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Side:
-page_of=af {{pageCount}}
-
-zoom_out.title=Zoom ud
-zoom_out_label=Zoom ud
-zoom_in.title=Zoom ind
-zoom_in_label=Zoom ind
-zoom.title=Zoom
-print.title=Udskriv
-print_label=Udskriv
-presentation_mode.title=Skift til fuldskærmsvisning
-presentation_mode_label=Fuldskærmsvisning
-open_file.title=Åbn fil
-open_file_label=Åbn
-download.title=Hent
-download_label=Hent
-bookmark.title=Aktuel visning (kopier eller åbn i et nyt vindue)
-bookmark_label=Aktuel visning
-
-# Secondary toolbar and context menu
-tools.title=Funktioner
-tools_label=Funktioner
-first_page.title=Gå til første side
-first_page.label=Gå til første side
-first_page_label=Gå til første side
-last_page.title=Gå til sidste side
-last_page.label=Gå til sidste side
-last_page_label=Gå til sidste side
-page_rotate_cw.title=Roter med uret
-page_rotate_cw.label=Roter med uret
-page_rotate_cw_label=Roter med uret
-page_rotate_ccw.title=Roter mod uret
-page_rotate_ccw.label=Roter mod uret
-page_rotate_ccw_label=Roter mod uret
-
-hand_tool_enable.title=Aktiver håndværktøj
-hand_tool_enable_label=Aktiver håndværktøj
-hand_tool_disable.title=Deaktiver håndværktøj
-hand_tool_disable_label=Deaktiver håndværktøj
-
-# Document properties dialog box
-document_properties.title=Dokumentegenskaber…
-document_properties_label=Dokumentegenskaber…
-document_properties_file_name=Filnavn:
-document_properties_file_size=Filstørrelse:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Titel:
-document_properties_author=Forfatter:
-document_properties_subject=Emne:
-document_properties_keywords=Nøgleord:
-document_properties_creation_date=Oprettet:
-document_properties_modification_date=Redigeret:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Program:
-document_properties_producer=PDF-producent:
-document_properties_version=PDF-version:
-document_properties_page_count=Antal sider:
-document_properties_close=Luk
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Slå sidepanel til eller fra
-toggle_sidebar_label=Slå sidepanel til eller fra
-outline.title=Vis dokumentets disposition
-outline_label=Dokument-disposition
-attachments.title=Vis vedhæftede filer
-attachments_label=Vedhæftede filer
-thumbs.title=Vis miniaturer
-thumbs_label=Miniaturer
-findbar.title=Find i dokument
-findbar_label=Find
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Side {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniature af side {{page}}
-
-# Find panel button title and messages
-find_label=Find:
-find_previous.title=Find den forrige forekomst
-find_previous_label=Forrige
-find_next.title=Find den næste forekomst
-find_next_label=Næste
-find_highlight=Fremhæv alle
-find_match_case_label=Forskel på store og små bogstaver
-find_reached_top=Toppen af siden blev nået, fortsatte fra bunden
-find_reached_bottom=Bunden af siden blev nået, fortsatte fra toppen
-find_not_found=Der blev ikke fundet noget
-
-# Error panel labels
-error_more_info=Mere information
-error_less_info=Mindre information
-error_close=Luk
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Fejlmeddelelse: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fil: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linje: {{line}}
-rendering_error=Der opstod en fejl ved generering af siden.
-
-# Predefined zoom values
-page_scale_width=Sidebredde
-page_scale_fit=Tilpas til side
-page_scale_auto=Automatisk zoom
-page_scale_actual=Faktisk størrelse
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Fejl
-loading_error=Der opstod en fejl ved indlæsning af PDF-filen.
-invalid_file_error=PDF-filen er ugyldig eller ødelagt.
-missing_file_error=Manglende PDF-fil.
-unexpected_response_error=Uventet svar fra serveren.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}}kommentar]
-password_label=Angiv adgangskode til at åbne denne PDF-fil.
-password_invalid=Ugyldig adgangskode. Prøv igen.
-password_ok=OK
-password_cancel=Fortryd
-
-printing_not_supported=Advarsel: Udskrivning er ikke fuldt understøttet af browseren.
-printing_not_ready=Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning.
-web_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes.
-document_colors_disabled=PDF-dokumenter må ikke bruge deres egne farver: \u0022'Tillad sider at vælge deres egne farver\u0022' er deaktiveret i browseren.
diff --git a/public/pfd/build/generic/web/locale/de/viewer.properties b/public/pfd/build/generic/web/locale/de/viewer.properties
deleted file mode 100644
index 685154c..0000000
--- a/public/pfd/build/generic/web/locale/de/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Eine Seite zurück
-previous_label=Zurück
-next.title=Eine Seite vor
-next_label=Vor
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Seite:
-page_of=von {{pageCount}}
-
-zoom_out.title=Verkleinern
-zoom_out_label=Verkleinern
-zoom_in.title=Vergrößern
-zoom_in_label=Vergrößern
-zoom.title=Zoom
-print.title=Drucken
-print_label=Drucken
-presentation_mode.title=In Präsentationsmodus wechseln
-presentation_mode_label=Präsentationsmodus
-open_file.title=Datei öffnen
-open_file_label=Öffnen
-download.title=Dokument speichern
-download_label=Speichern
-bookmark.title=Aktuelle Ansicht (zum Kopieren oder Öffnen in einem neuen Fenster)
-bookmark_label=Aktuelle Ansicht
-
-# Secondary toolbar and context menu
-tools.title=Werkzeuge
-tools_label=Werkzeuge
-first_page.title=Erste Seite anzeigen
-first_page.label=Erste Seite anzeigen
-first_page_label=Erste Seite anzeigen
-last_page.title=Letzte Seite anzeigen
-last_page.label=Letzte Seite anzeigen
-last_page_label=Letzte Seite anzeigen
-page_rotate_cw.title=Im Uhrzeigersinn drehen
-page_rotate_cw.label=Im Uhrzeigersinn drehen
-page_rotate_cw_label=Im Uhrzeigersinn drehen
-page_rotate_ccw.title=Gegen Uhrzeigersinn drehen
-page_rotate_ccw.label=Gegen Uhrzeigersinn drehen
-page_rotate_ccw_label=Gegen Uhrzeigersinn drehen
-
-hand_tool_enable.title=Hand-Werkzeug aktivieren
-hand_tool_enable_label=Hand-Werkzeug aktivieren
-hand_tool_disable.title=Hand-Werkzeug deaktivieren
-hand_tool_disable_label=Hand-Werkzeug deaktivieren
-
-# Document properties dialog box
-document_properties.title=Dokumenteigenschaften
-document_properties_label=Dokumenteigenschaften…
-document_properties_file_name=Dateiname:
-document_properties_file_size=Dateigröße:
-document_properties_kb={{size_kb}} KB ({{size_b}} Bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} Bytes)
-document_properties_title=Titel:
-document_properties_author=Autor:
-document_properties_subject=Thema:
-document_properties_keywords=Stichwörter:
-document_properties_creation_date=Erstelldatum:
-document_properties_modification_date=Bearbeitungsdatum:
-document_properties_date_string={{date}} {{time}}
-document_properties_creator=Anwendung:
-document_properties_producer=PDF erstellt mit:
-document_properties_version=PDF-Version:
-document_properties_page_count=Seitenzahl:
-document_properties_close=Schließen
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Sidebar umschalten
-toggle_sidebar_label=Sidebar umschalten
-outline.title=Dokumentstruktur anzeigen
-outline_label=Dokumentstruktur
-attachments.title=Anhänge anzeigen
-attachments_label=Anhänge
-thumbs.title=Miniaturansichten anzeigen
-thumbs_label=Miniaturansichten
-findbar.title=Dokument durchsuchen
-findbar_label=Suchen
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Seite {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniaturansicht von Seite {{page}}
-
-# Find panel button title and messages
-find_label=Suchen:
-find_previous.title=Vorheriges Auftreten des Suchbegriffs finden
-find_previous_label=Zurück
-find_next.title=Nächstes Auftreten des Suchbegriffs finden
-find_next_label=Weiter
-find_highlight=Alle hervorheben
-find_match_case_label=Groß-/Kleinschreibung beachten
-find_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort
-find_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort
-find_not_found=Suchbegriff nicht gefunden
-
-# Error panel labels
-error_more_info=Mehr Informationen
-error_less_info=Weniger Informationen
-error_close=Schließen
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js Version {{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Nachricht: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Aufrufliste: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Datei: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Zeile: {{line}}
-rendering_error=Beim Darstellen der Seite trat ein Fehler auf.
-
-# Predefined zoom values
-page_scale_width=Seitenbreite
-page_scale_fit=Seitengröße
-page_scale_auto=Automatischer Zoom
-page_scale_actual=Originalgröße
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Fehler
-loading_error=Beim Laden der PDF-Datei trat ein Fehler auf.
-invalid_file_error=Ungültige oder beschädigte PDF-Datei
-missing_file_error=Fehlende PDF-Datei
-unexpected_response_error=Unerwartete Antwort des Servers
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anlage: {{type}}]
-password_label=Geben Sie zum Öffnen der PDF-Datei deren Passwort ein.
-password_invalid=Falsches Passwort. Bitte versuchen Sie es erneut.
-password_ok=OK
-password_cancel=Abbrechen
-
-printing_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt.
-printing_not_ready=Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen.
-web_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden.
-document_colors_disabled=PDF-Dokumenten ist es nicht erlaubt, ihre eigenen Farben zu verwenden: \'Seiten das Verwenden von eigenen Farben erlauben\' ist im Browser deaktiviert.
diff --git a/public/pfd/build/generic/web/locale/el/viewer.properties b/public/pfd/build/generic/web/locale/el/viewer.properties
deleted file mode 100644
index 36723c2..0000000
--- a/public/pfd/build/generic/web/locale/el/viewer.properties
+++ /dev/null
@@ -1,131 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Προηγούμενη σελίδα
-previous_label=Προηγούμενη
-next.title=Επόμενη σελίδα
-next_label=Επόμενη
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Σελίδα:
-page_of= {{pageCount}}
-
-zoom_out.title=Σμίκρυνση
-zoom_out_label=Σμίκρυνση
-zoom_in.title=Μεγέθυνση
-zoom_in_label=Μεγέθυνση
-zoom.title=Μεγέθυνση
-print.title=Εκτύπωση
-print_label=Εκτύπωση
-open_file.title=Άνοιγμα αρχείου
-open_file_label=Άνοιγμα
-download.title=Λήψη
-download_label=Λήψη
-bookmark.title=Τρέχουσα προβολή (αντίγραφο ή άνοιγμα σε νέο παράθυρο)
-bookmark_label=Τρέχουσα προβολή
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-outline.title=Προβολή διάρθρωσης κειμένου
-outline_label=Διάρθρωση κειμένου
-thumbs.title=Προβολή μικρογραφιών
-thumbs_label=Μικρογραφίες
-
-
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Σελίδα {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Μικρογραφία της σελίδας {{page}}
-
-first_page.label=Μετάβαση στην πρώτη σελίδα
-
-# Error panel labels
-error_more_info=Περισσότερες πληροφορίες
-error_less_info=Λιγότερες πληροφορίες
-error_close=Κλείσιμο
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Μήνυμα: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Αρχείο: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Line: {{line}}
-rendering_error=Προέκυψε σφάλμα κατά την ανάλυση της σελίδας.
-
-# Predefined zoom values
-page_scale_width=Πλάτος σελίδας
-page_scale_fit=Μέγεθος σελίδας
-page_scale_auto=Αυτόματη μεγέθυνση
-page_scale_actual=Πραγματικό μέγεθος
-
-
-# Context menu
-page_rotate_cw.label=Δεξιόστροφη περιστροφή
-page_rotate_ccw.label=Αριστερόστροφη περιστροφή
-
-presentation_mode.title=Μετάβαση σε λειτουργία παρουσίασης
-presentation_mode_label=Λειτουργία παρουσίασης
-
-# Loading indicator messages
-# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
-
-loading_error_indicator=Σφάλμα
-loading_error=Προέκυψε ένα σφάλμα κατά τη φόρτωση του PDF.
-
-request_password=Το PDF προστατεύεται από κωδικό:
-
-printing_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από αυτόν τον περιηγητή.
-
-
-
-findbar.title=Εύρεση στο έγγραφο
-findbar_label=Εύρεση
-
-
-# Find panel button title and messages
-find_label=Εύρεση:
-find_previous.title=Εύρεση της προηγούμενης εμφάνισης της φράσης
-find_previous_label=Προηγούμενο
-find_next.title=Εύρεση της επόμενης εμφάνισης της φράσης
-find_next_label=Επόμενο
-find_highlight=Επισήμανση όλων
-find_match_case_label=Ταίριασμα χαρακτήρα
-find_reached_top=Έλευση στην αρχή του εγγράφου, συνέχεια από το τέλος
-find_reached_bottom=Έλευση στο τέλος του εγγράφου, συνέχεια από την αρχή
-find_not_found=Η φράση δεν βρέθηκε
-
-invalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF.
-last_page.label=Μετάβαση στη τελευταία σελίδα
-
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-
-missing_file_error=Λείπει αρχείο PDF.
-
-
-toggle_sidebar.title=Εναλλαγή προβολής πλευρικής στήλης
-toggle_sidebar_label=Εναλλαγή προβολής πλευρικής στήλης
-
-web_fonts_disabled=Οι γραμματοσειρές Web απενεργοποιημένες: αδυναμία χρήσης των ενσωματωμένων γραμματοσειρών PDF.
-
-printing_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση.
-
-document_colors_disabled=Δεν επιτρέπεται στα έγγραφα PDF να χρησιμοποιούν τα δικά τους χρώματα: Η επιλογή \'Να επιτρέπεται η χρήση χρωμάτων της σελίδας\' δεν είναι ενεργή στην εφαρμογή.
-
-invalid_password=Μη έγκυρος κωδικός.
-text_annotation_type.alt=[{{type}} Annotation]
-
diff --git a/public/pfd/build/generic/web/locale/en-GB/viewer.properties b/public/pfd/build/generic/web/locale/en-GB/viewer.properties
deleted file mode 100644
index f9e1dfb..0000000
--- a/public/pfd/build/generic/web/locale/en-GB/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Previous Page
-previous_label=Previous
-next.title=Next Page
-next_label=Next
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Page:
-page_of=of {{pageCount}}
-
-zoom_out.title=Zoom Out
-zoom_out_label=Zoom Out
-zoom_in.title=Zoom In
-zoom_in_label=Zoom In
-zoom.title=Zoom
-presentation_mode.title=Switch to Presentation Mode
-presentation_mode_label=Presentation Mode
-open_file.title=Open File
-open_file_label=Open
-print.title=Print
-print_label=Print
-download.title=Download
-download_label=Download
-bookmark.title=Current view (copy or open in new window)
-bookmark_label=Current View
-
-# Secondary toolbar and context menu
-tools.title=Tools
-tools_label=Tools
-first_page.title=Go to First Page
-first_page.label=Go to First Page
-first_page_label=Go to First Page
-last_page.title=Go to Last Page
-last_page.label=Go to Last Page
-last_page_label=Go to Last Page
-page_rotate_cw.title=Rotate Clockwise
-page_rotate_cw.label=Rotate Clockwise
-page_rotate_cw_label=Rotate Clockwise
-page_rotate_ccw.title=Rotate Anti-Clockwise
-page_rotate_ccw.label=Rotate Anti-Clockwise
-page_rotate_ccw_label=Rotate Anti-Clockwise
-
-hand_tool_enable.title=Enable hand tool
-hand_tool_enable_label=Enable hand tool
-hand_tool_disable.title=Disable hand tool
-hand_tool_disable_label=Disable hand tool
-
-# Document properties dialog box
-document_properties.title=Document Properties…
-document_properties_label=Document Properties…
-document_properties_file_name=File name:
-document_properties_file_size=File size:
-document_properties_kb={{size_kb}} kB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Title:
-document_properties_author=Author:
-document_properties_subject=Subject:
-document_properties_keywords=Keywords:
-document_properties_creation_date=Creation Date:
-document_properties_modification_date=Modification Date:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creator:
-document_properties_producer=PDF Producer:
-document_properties_version=PDF Version:
-document_properties_page_count=Page Count:
-document_properties_close=Close
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Toggle Sidebar
-toggle_sidebar_label=Toggle Sidebar
-outline.title=Show Document Outline
-outline_label=Document Outline
-attachments.title=Show Attachments
-attachments_label=Attachments
-thumbs.title=Show Thumbnails
-thumbs_label=Thumbnails
-findbar.title=Find in Document
-findbar_label=Find
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Page {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Thumbnail of Page {{page}}
-
-# Find panel button title and messages
-find_label=Find:
-find_previous.title=Find the previous occurrence of the phrase
-find_previous_label=Previous
-find_next.title=Find the next occurrence of the phrase
-find_next_label=Next
-find_highlight=Highlight all
-find_match_case_label=Match case
-find_reached_top=Reached top of document, continued from bottom
-find_reached_bottom=Reached end of document, continued from top
-find_not_found=Phrase not found
-
-# Error panel labels
-error_more_info=More Information
-error_less_info=Less Information
-error_close=Close
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Message: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=File: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Line: {{line}}
-rendering_error=An error occurred while rendering the page.
-
-# Predefined zoom values
-page_scale_width=Page Width
-page_scale_fit=Page Fit
-page_scale_auto=Automatic Zoom
-page_scale_actual=Actual Size
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Error
-loading_error=An error occurred while loading the PDF.
-invalid_file_error=Invalid or corrupted PDF file.
-missing_file_error=Missing PDF file.
-unexpected_response_error=Unexpected server response.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=Enter the password to open this PDF file.
-password_invalid=Invalid password. Please try again.
-password_ok=OK
-password_cancel=Cancel
-
-printing_not_supported=Warning: Printing is not fully supported by this browser.
-printing_not_ready=Warning: The PDF is not fully loaded for printing.
-web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
-document_colors_disabled=PDF documents are not allowed to use their own colours: 'Allow pages to choose their own colours' is deactivated in the browser.
diff --git a/public/pfd/build/generic/web/locale/en-US/viewer.properties b/public/pfd/build/generic/web/locale/en-US/viewer.properties
deleted file mode 100644
index 4a3a6aa..0000000
--- a/public/pfd/build/generic/web/locale/en-US/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Previous Page
-previous_label=Previous
-next.title=Next Page
-next_label=Next
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Page:
-page_of=of {{pageCount}}
-
-zoom_out.title=Zoom Out
-zoom_out_label=Zoom Out
-zoom_in.title=Zoom In
-zoom_in_label=Zoom In
-zoom.title=Zoom
-presentation_mode.title=Switch to Presentation Mode
-presentation_mode_label=Presentation Mode
-open_file.title=Open File
-open_file_label=Open
-print.title=Print
-print_label=Print
-download.title=Download
-download_label=Download
-bookmark.title=Current view (copy or open in new window)
-bookmark_label=Current View
-
-# Secondary toolbar and context menu
-tools.title=Tools
-tools_label=Tools
-first_page.title=Go to First Page
-first_page.label=Go to First Page
-first_page_label=Go to First Page
-last_page.title=Go to Last Page
-last_page.label=Go to Last Page
-last_page_label=Go to Last Page
-page_rotate_cw.title=Rotate Clockwise
-page_rotate_cw.label=Rotate Clockwise
-page_rotate_cw_label=Rotate Clockwise
-page_rotate_ccw.title=Rotate Counterclockwise
-page_rotate_ccw.label=Rotate Counterclockwise
-page_rotate_ccw_label=Rotate Counterclockwise
-
-hand_tool_enable.title=Enable hand tool
-hand_tool_enable_label=Enable hand tool
-hand_tool_disable.title=Disable hand tool
-hand_tool_disable_label=Disable hand tool
-
-# Document properties dialog box
-document_properties.title=Document Properties…
-document_properties_label=Document Properties…
-document_properties_file_name=File name:
-document_properties_file_size=File size:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Title:
-document_properties_author=Author:
-document_properties_subject=Subject:
-document_properties_keywords=Keywords:
-document_properties_creation_date=Creation Date:
-document_properties_modification_date=Modification Date:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creator:
-document_properties_producer=PDF Producer:
-document_properties_version=PDF Version:
-document_properties_page_count=Page Count:
-document_properties_close=Close
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Toggle Sidebar
-toggle_sidebar_label=Toggle Sidebar
-outline.title=Show Document Outline
-outline_label=Document Outline
-attachments.title=Show Attachments
-attachments_label=Attachments
-thumbs.title=Show Thumbnails
-thumbs_label=Thumbnails
-findbar.title=Find in Document
-findbar_label=Find
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Page {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Thumbnail of Page {{page}}
-
-# Find panel button title and messages
-find_label=Find:
-find_previous.title=Find the previous occurrence of the phrase
-find_previous_label=Previous
-find_next.title=Find the next occurrence of the phrase
-find_next_label=Next
-find_highlight=Highlight all
-find_match_case_label=Match case
-find_reached_top=Reached top of document, continued from bottom
-find_reached_bottom=Reached end of document, continued from top
-find_not_found=Phrase not found
-
-# Error panel labels
-error_more_info=More Information
-error_less_info=Less Information
-error_close=Close
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Message: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=File: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Line: {{line}}
-rendering_error=An error occurred while rendering the page.
-
-# Predefined zoom values
-page_scale_width=Page Width
-page_scale_fit=Page Fit
-page_scale_auto=Automatic Zoom
-page_scale_actual=Actual Size
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Error
-loading_error=An error occurred while loading the PDF.
-invalid_file_error=Invalid or corrupted PDF file.
-missing_file_error=Missing PDF file.
-unexpected_response_error=Unexpected server response.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=Enter the password to open this PDF file.
-password_invalid=Invalid password. Please try again.
-password_ok=OK
-password_cancel=Cancel
-
-printing_not_supported=Warning: Printing is not fully supported by this browser.
-printing_not_ready=Warning: The PDF is not fully loaded for printing.
-web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
-document_colors_disabled=PDF documents are not allowed to use their own colors: \'Allow pages to choose their own colors\' is deactivated in the browser.
diff --git a/public/pfd/build/generic/web/locale/en-ZA/viewer.properties b/public/pfd/build/generic/web/locale/en-ZA/viewer.properties
deleted file mode 100644
index 6c063a4..0000000
--- a/public/pfd/build/generic/web/locale/en-ZA/viewer.properties
+++ /dev/null
@@ -1,163 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Previous Page
-previous_label=Previous
-next.title=Next Page
-next_label=Next
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Page:
-page_of=of {{pageCount}}
-
-zoom_out.title=Zoom Out
-zoom_out_label=Zoom Out
-zoom_in.title=Zoom In
-zoom_in_label=Zoom In
-zoom.title=Zoom
-presentation_mode.title=Switch to Presentation Mode
-presentation_mode_label=Presentation Mode
-open_file.title=Open File
-open_file_label=Open
-print.title=Print
-print_label=Print
-download.title=Download
-download_label=Download
-bookmark.title=Current view (copy or open in new window)
-bookmark_label=Current View
-
-# Secondary toolbar and context menu
-tools.title=Tools
-tools_label=Tools
-first_page.title=Go to First Page
-first_page.label=Go to First Page
-first_page_label=Go to First Page
-last_page.title=Go to Last Page
-last_page.label=Go to Last Page
-last_page_label=Go to Last Page
-page_rotate_cw.title=Rotate Clockwise
-page_rotate_cw.label=Rotate Clockwise
-page_rotate_cw_label=Rotate Clockwise
-page_rotate_ccw.title=Rotate Counterclockwise
-page_rotate_ccw.label=Rotate Counterclockwise
-page_rotate_ccw_label=Rotate Counterclockwise
-
-hand_tool_enable.title=Enable hand tool
-hand_tool_enable_label=Enable hand tool
-hand_tool_disable.title=Disable hand tool
-hand_tool_disable_label=Disable hand tool
-
-# Document properties dialog box
-document_properties.title=Document Properties…
-document_properties_label=Document Properties…
-document_properties_file_name=File name:
-document_properties_file_size=File size:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Title:
-document_properties_author=Author:
-document_properties_subject=Subject:
-document_properties_keywords=Keywords:
-document_properties_creation_date=Creation Date:
-document_properties_modification_date=Modification Date:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creator:
-document_properties_producer=PDF Producer:
-document_properties_version=PDF Version:
-document_properties_page_count=Page Count:
-document_properties_close=Close
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Toggle Sidebar
-toggle_sidebar_label=Toggle Sidebar
-outline.title=Show Document Outline
-outline_label=Document Outline
-attachments.title=Show Attachments
-attachments_label=Attachments
-thumbs.title=Show Thumbnails
-thumbs_label=Thumbnails
-findbar.title=Find in Document
-findbar_label=Find
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Page {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Thumbnail of Page {{page}}
-
-# Find panel button title and messages
-find_label=Find:
-find_previous.title=Find the previous occurrence of the phrase
-find_previous_label=Previous
-find_next.title=Find the next occurrence of the phrase
-find_next_label=Next
-find_highlight=Highlight all
-find_match_case_label=Match case
-find_reached_top=Reached top of document, continued from bottom
-find_reached_bottom=Reached end of document, continued from top
-find_not_found=Phrase not found
-
-# Error panel labels
-error_more_info=More Information
-error_less_info=Less Information
-error_close=Close
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Message: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=File: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Line: {{line}}
-rendering_error=An error occurred while rendering the page.
-
-# Predefined zoom values
-page_scale_width=Page Width
-page_scale_fit=Page Fit
-page_scale_auto=Automatic Zoom
-page_scale_actual=Actual Size
-
-# Loading indicator messages
-loading_error_indicator=Error
-loading_error=An error occurred while loading the PDF.
-invalid_file_error=Invalid or corrupted PDF file.
-missing_file_error=Missing PDF file.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=Enter the password to open this PDF file.
-password_invalid=Invalid password. Please try again.
-password_ok=OK
-password_cancel=Cancel
-
-printing_not_supported=Warning: Printing is not fully supported by this browser.
-printing_not_ready=Warning: The PDF is not fully loaded for printing.
-web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
-document_colors_disabled=PDF documents are not allowed to use their own colours: 'Allow pages to choose their own colours' is deactivated in the browser.
diff --git a/public/pfd/build/generic/web/locale/eo/viewer.properties b/public/pfd/build/generic/web/locale/eo/viewer.properties
deleted file mode 100644
index 65bb15f..0000000
--- a/public/pfd/build/generic/web/locale/eo/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Antaŭa paĝo
-previous_label=Malantaŭen
-next.title=Venonta paĝo
-next_label=Antaŭen
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Paĝo:
-page_of=el {{pageCount}}
-
-zoom_out.title=Malpligrandigi
-zoom_out_label=Malpligrandigi
-zoom_in.title=Pligrandigi
-zoom_in_label=Pligrandigi
-zoom.title=Pligrandigilo
-presentation_mode.title=Iri al prezenta reĝimo
-presentation_mode_label=Prezenta reĝimo
-open_file.title=Malfermi dosieron
-open_file_label=Malfermi
-print.title=Presi
-print_label=Presi
-download.title=Elŝuti
-download_label=Elŝuti
-bookmark.title=Nuna vido (kopii aŭ malfermi en nova fenestro)
-bookmark_label=Nuna vido
-
-# Secondary toolbar and context menu
-tools.title=Iloj
-tools_label=Iloj
-first_page.title=Iri al la unua paĝo
-first_page.label=Iri al la unua paĝo
-first_page_label=Iri al la unua paĝo
-last_page.title=Iri al la lasta paĝo
-last_page.label=Iri al la lasta paĝo
-last_page_label=Iri al la lasta paĝo
-page_rotate_cw.title=Rotaciigi dekstrume
-page_rotate_cw.label=Rotaciigi dekstrume
-page_rotate_cw_label=Rotaciigi dekstrume
-page_rotate_ccw.title=Rotaciigi maldekstrume
-page_rotate_ccw.label=Rotaciigi maldekstrume
-page_rotate_ccw_label=Rotaciigi maldekstrume
-
-hand_tool_enable.title=Aktivigi manan ilon
-hand_tool_enable_label=Aktivigi manan ilon
-hand_tool_disable.title=Malaktivigi manan ilon
-hand_tool_disable_label=Malaktivigi manan ilon
-
-# Document properties dialog box
-document_properties.title=Atributoj de dokumento…
-document_properties_label=Atributoj de dokumento…
-document_properties_file_name=Nomo de dosiero:
-document_properties_file_size=Grado de dosiero:
-document_properties_kb={{size_kb}} KO ({{size_b}} oktetoj)
-document_properties_mb={{size_mb}} MO ({{size_b}} oktetoj)
-document_properties_title=Titolo:
-document_properties_author=Aŭtoro:
-document_properties_subject=Temo:
-document_properties_keywords=Ŝlosilvorto:
-document_properties_creation_date=Dato de kreado:
-document_properties_modification_date=Dato de modifo:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Kreinto:
-document_properties_producer=Produktinto de PDF:
-document_properties_version=Versio de PDF:
-document_properties_page_count=Nombro de paĝoj:
-document_properties_close=Fermi
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Montri/kaŝi flankan strion
-toggle_sidebar_label=Montri/kaŝi flankan strion
-outline.title=Montri skemon de dokumento
-outline_label=Skemo de dokumento
-attachments.title=Montri kunsendaĵojn
-attachments_label=Kunsendaĵojn
-thumbs.title=Montri miniaturojn
-thumbs_label=Miniaturoj
-findbar.title=Serĉi en dokumento
-findbar_label=Serĉi
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Paĝo {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniaturo de paĝo {{page}}
-
-# Find panel button title and messages
-find_label=Serĉi:
-find_previous.title=Serĉi la antaŭan aperon de la frazo
-find_previous_label=Malantaŭen
-find_next.title=Serĉi la venontan aperon de la frazo
-find_next_label=Antaŭen
-find_highlight=Elstarigi ĉiujn
-find_match_case_label=Distingi inter majuskloj kaj minuskloj
-find_reached_top=Komenco de la dokumento atingita, daŭrigado ekde la fino
-find_reached_bottom=Fino de la dokumento atingita, daŭrigado ekde la komenco
-find_not_found=Frazo ne trovita
-
-# Error panel labels
-error_more_info=Pli da informo
-error_less_info=Mapli da informo
-error_close=Fermi
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mesaĝo: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stako: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Dosiero: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linio: {{line}}
-rendering_error=Okazis eraro dum la montrado de la paĝo.
-
-# Predefined zoom values
-page_scale_width=Larĝo de paĝo
-page_scale_fit=Adapti paĝon
-page_scale_auto=Aŭtomata skalo
-page_scale_actual=Reala gandeco
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Eraro
-loading_error=Okazis eraro dum la ŝargado de la PDF dosiero.
-invalid_file_error=Nevalida aŭ difektita PDF dosiero.
-missing_file_error=Mankas dosiero PDF.
-unexpected_response_error=Neatendita respondo de servilo.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Prinoto: {{type}}]
-password_label=Tajpu pasvorton por malfermi tiun ĉi dosieron PDF.
-password_invalid=Nevalida pasvorto. Bonvolu provi denove.
-password_ok=Akcepti
-password_cancel=Nuligi
-
-printing_not_supported=Averto: tiu ĉi retesplorilo ne plene subtenas presadon.
-printing_not_ready=Warning: La PDF dosiero ne estas plene ŝargita por presado.
-web_fonts_disabled=Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF.
-document_colors_disabled=Dokumentoj PDF ne rajtas havi siajn proprajn kolorojn: \'Permesi al paĝoj elekti siajn proprajn kolorojn\' estas malaktiva en la retesplorilo.
diff --git a/public/pfd/build/generic/web/locale/es-AR/viewer.properties b/public/pfd/build/generic/web/locale/es-AR/viewer.properties
deleted file mode 100644
index 733be7b..0000000
--- a/public/pfd/build/generic/web/locale/es-AR/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Página anterior
-previous_label=Anterior
-next.title=Página siguiente
-next_label=Siguiente
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Página:
-page_of=de {{pageCount}}
-
-zoom_out.title=Alejar
-zoom_out_label=Alejar
-zoom_in.title=Acercar
-zoom_in_label=Acercar
-zoom.title=Zoom
-print.title=Imprimir
-print_label=Imprimir
-presentation_mode.title=Cambiar a modo presentación
-presentation_mode_label=Modo presentación
-open_file.title=Abrir archivo
-open_file_label=Abrir
-download.title=Descargar
-download_label=Descargar
-bookmark.title=Vista actual (copiar o abrir en nueva ventana)
-bookmark_label=Vista actual
-
-# Secondary toolbar and context menu
-tools.title=Herramientas
-tools_label=Herramientas
-first_page.title=Ir a primera página
-first_page.label=Ir a primera página
-first_page_label=Ir a primera página
-last_page.title=Ir a última página
-last_page.label=Ir a última página
-last_page_label=Ir a última página
-page_rotate_cw.title=Rotar horario
-page_rotate_cw.label=Rotar horario
-page_rotate_cw_label=Rotar horario
-page_rotate_ccw.title=Rotar antihorario
-page_rotate_ccw.label=Rotar antihorario
-page_rotate_ccw_label=Rotar antihorario
-
-hand_tool_enable.title=Habilitar herramienta mano
-hand_tool_enable_label=Habilitar herramienta mano
-hand_tool_disable.title=Deshabilitar herramienta mano
-hand_tool_disable_label=Deshabilitar herramienta mano
-
-# Document properties dialog box
-document_properties.title=Propiedades del documento…
-document_properties_label=Propiedades del documento…
-document_properties_file_name=Nombre de archivo:
-document_properties_file_size=Tamaño de archovo:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Título:
-document_properties_author=Autor:
-document_properties_subject=Asunto:
-document_properties_keywords=Palabras clave:
-document_properties_creation_date=Fecha de creación:
-document_properties_modification_date=Fecha de modificación:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creador:
-document_properties_producer=PDF Productor:
-document_properties_version=Versión de PDF:
-document_properties_page_count=Cantidad de páginas:
-document_properties_close=Cerrar
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Alternar barra lateral
-toggle_sidebar_label=Alternar barra lateral
-outline.title=Mostrar esquema del documento
-outline_label=Esquema del documento
-attachments.title=Mostrar adjuntos
-attachments_label=Adjuntos
-thumbs.title=Mostrar miniaturas
-thumbs_label=Miniaturas
-findbar.title=Buscar en documento
-findbar_label=Buscar
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Página {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura de página {{page}}
-
-# Find panel button title and messages
-find_label=Buscar:
-find_previous.title=Buscar la aparición anterior de la frase
-find_previous_label=Anterior
-find_next.title=Buscar la siguiente aparición de la frase
-find_next_label=Siguiente
-find_highlight=Resaltar todo
-find_match_case_label=Coincidir mayúsculas
-find_reached_top=Inicio de documento alcanzado, continuando desde abajo
-find_reached_bottom=Fin de documento alcanzando, continuando desde arriba
-find_not_found=Frase no encontrada
-
-# Error panel labels
-error_more_info=Más información
-error_less_info=Menos información
-error_close=Cerrar
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mensaje: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pila: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Archivo: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Línea: {{line}}
-rendering_error=Ocurrió un error al dibujar la página.
-
-# Predefined zoom values
-page_scale_width=Ancho de página
-page_scale_fit=Ajustar página
-page_scale_auto=Zoom automático
-page_scale_actual=Tamaño real
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Error
-loading_error=Ocurrió un error al cargar el PDF.
-invalid_file_error=Archivo PDF no válido o cocrrupto.
-missing_file_error=Archivo PDF faltante.
-unexpected_response_error=Respuesta del servidor inesperada.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Anotación]
-password_label=Ingrese la contraseña para abrir este archivo PDF
-password_invalid=Contraseña inválida. Intente nuevamente.
-password_ok=Aceptar
-password_cancel=Cancelar
-
-printing_not_supported=Advertencia: La impresión no está totalmente soportada por este navegador.
-printing_not_ready=Advertencia: El PDF no está completamente cargado para impresión.
-web_fonts_disabled=Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF.
-document_colors_disabled=Los documentos PDF no tienen permitido usar sus propios colores: \'Permitir a las páginas elegir sus propios colores\' está desactivado en el navegador.
diff --git a/public/pfd/build/generic/web/locale/es-CL/viewer.properties b/public/pfd/build/generic/web/locale/es-CL/viewer.properties
deleted file mode 100644
index f5660c3..0000000
--- a/public/pfd/build/generic/web/locale/es-CL/viewer.properties
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-previous.title = Página anterior
-previous_label = Anterior
-next.title = Página siguiente
-next_label = Siguiente
-page_label = Página:
-page_of = de {{pageCount}}
-zoom_out.title = Alejar
-zoom_out_label = Alejar
-zoom_in.title = Acercar
-zoom_in_label = Acercar
-zoom.title = Ampliación
-print.title = Imprimir
-print_label = Imprimir
-presentation_mode.title = Cambiar al modo de presentación
-presentation_mode_label = Modo de presentación
-open_file.title = Abrir archivo
-open_file_label = Abrir
-download.title = Descargar
-download_label = Descargar
-bookmark.title = Vista actual (copiar o abrir en nueva ventana)
-bookmark_label = Vista actual
-tools.title=Herramientas
-tools_label=Herramientas
-first_page.title=Ir a la primera página
-first_page.label=Ir a la primera página
-first_page_label=Ir a la primera página
-last_page.title=Ir a la última página
-last_page.label=Ir a la última página
-last_page_label=Ir a la última página
-page_rotate_cw.title=Girar a la derecha
-page_rotate_cw.label=Girar a la derecha
-page_rotate_cw_label=Girar a la derecha
-page_rotate_ccw.title=Girar a la izquierda
-page_rotate_ccw.label=Girar a la izquierda
-page_rotate_ccw_label=Girar a la izquierda
-
-hand_tool_enable.title=Activar herramienta de mano
-hand_tool_enable_label=Activar herramienta de mano
-hand_tool_disable.title=Desactivar herramienta de mano
-hand_tool_disable_label=Desactivar herramienta de mano
-
-document_properties.title=Propiedades del documento…
-document_properties_label=Propiedades del documento…
-document_properties_file_name=Nombre del archivo:
-document_properties_file_size=Tamaño del archivo:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Título:
-document_properties_author=Autor:
-document_properties_subject=Asunto:
-document_properties_keywords=Palabras clave:
-document_properties_creation_date=Fecha de creación:
-document_properties_modification_date=Fecha de modificación:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creador:
-document_properties_producer=Productor del PDF:
-document_properties_version=Versión de PDF:
-document_properties_page_count=Cantidad de páginas:
-document_properties_close=Cerrar
-
-toggle_sidebar.title=Barra lateral
-toggle_sidebar_label=Mostrar u ocultar la barra lateral
-outline.title = Mostrar esquema del documento
-outline_label = Esquema del documento
-attachments.title=Mostrar adjuntos
-attachments_label=Adjuntos
-thumbs.title = Mostrar miniaturas
-thumbs_label = Miniaturas
-findbar.title = Buscar en el documento
-findbar_label = Buscar
-thumb_page_title = Página {{page}}
-thumb_page_canvas = Miniatura de la página {{page}}
-first_page.label = Ir a la primera página
-last_page.label = Ir a la última página
-page_rotate_cw.label = Rotar en sentido de los punteros del reloj
-page_rotate_ccw.label = Rotar en sentido contrario a los punteros del reloj
-find_label = Buscar:
-find_previous.title = Encontrar la aparición anterior de la frase
-find_previous_label = Previo
-find_next.title = Encontrar la siguiente aparición de la frase
-find_next_label = Siguiente
-find_highlight = Destacar todos
-find_match_case_label = Coincidir mayús./minús.
-find_reached_top=Se alcanzó el inicio del documento, continuando desde el final
-find_reached_bottom=Se alcanzó el final del documento, continuando desde el inicio
-find_not_found = Frase no encontrada
-error_more_info = Más información
-error_less_info = Menos información
-error_close = Cerrar
-error_version_info=PDF.js v{{version}} (compilación: {{build}})
-error_message = Mensaje: {{message}}
-error_stack = Pila: {{stack}}
-error_file = Archivo: {{file}}
-error_line = Línea: {{line}}
-rendering_error = Ha ocurrido un error al renderizar la página.
-page_scale_width = Ancho de página
-page_scale_fit = Ajuste de página
-page_scale_auto = Aumento automático
-page_scale_actual = Tamaño actual
-page_scale_percent={{scale}}%
-loading_error_indicator = Error
-loading_error = Ha ocurrido un error al cargar el PDF.
-invalid_file_error = Archivo PDF inválido o corrupto.
-missing_file_error=Falta el archivo PDF.
-unexpected_response_error=Respuesta del servidor inesperada.
-
-text_annotation_type.alt=[{{type}} Anotación]
-password_label=Ingrese la contraseña para abrir este archivo PDF.
-password_invalid=Contraseña inválida. Por favor, vuelva a intentarlo.
-password_ok=Aceptar
-password_cancel=Cancelar
-
-printing_not_supported = Advertencia: Imprimir no está soportado completamente por este navegador.
-printing_not_ready=Advertencia: El PDF no está completamente cargado para ser impreso.
-web_fonts_disabled=Las fuentes web están desactivadas: imposible usar las fuentes PDF embebidas.
-document_colors_disabled=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.
diff --git a/public/pfd/build/generic/web/locale/es-ES/viewer.properties b/public/pfd/build/generic/web/locale/es-ES/viewer.properties
deleted file mode 100644
index d147c7a..0000000
--- a/public/pfd/build/generic/web/locale/es-ES/viewer.properties
+++ /dev/null
@@ -1,111 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-previous.title = Página anterior
-previous_label = Anterior
-next.title = Página siguiente
-next_label = Siguiente
-page_label = Página:
-page_of = de {{pageCount}}
-zoom_out.title = Reducir
-zoom_out_label = Reducir
-zoom_in.title = Aumentar
-zoom_in_label = Aumentar
-zoom.title = Tamaño
-presentation_mode.title = Cambiar al modo presentación
-presentation_mode_label = Modo presentación
-open_file.title = Abrir archivo
-open_file_label = Abrir
-print.title = Imprimir
-print_label = Imprimir
-download.title = Descargar
-download_label = Descargar
-bookmark.title = Vista actual (copiar o abrir en una nueva ventana)
-bookmark_label = Vista actual
-tools.title = Herramientas
-tools_label = Herramientas
-first_page.title = Ir a la primera página
-first_page.label = Ir a la primera página
-first_page_label = Ir a la primera página
-last_page.title = Ir a la última página
-last_page.label = Ir a la última página
-last_page_label = Ir a la última página
-page_rotate_cw.title = Rotar en sentido horario
-page_rotate_cw.label = Rotar en sentido horario
-page_rotate_cw_label = Rotar en sentido horario
-page_rotate_ccw.title = Rotar en sentido antihorario
-page_rotate_ccw.label = Rotar en sentido antihorario
-page_rotate_ccw_label = Rotar en sentido antihorario
-hand_tool_enable.title = Activar herramienta mano
-hand_tool_enable_label = Activar herramienta mano
-hand_tool_disable.title = Desactivar herramienta mano
-hand_tool_disable_label = Desactivar herramienta mano
-document_properties.title = Propiedades del documento…
-document_properties_label = Propiedades del documento…
-document_properties_file_name = Nombre de archivo:
-document_properties_file_size = Tamaño de archivo:
-document_properties_kb = {{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb = {{size_mb}} MB ({{size_b}} bytes)
-document_properties_title = Título:
-document_properties_author = Autor:
-document_properties_subject = Asunto:
-document_properties_keywords = Palabras clave:
-document_properties_creation_date = Fecha de creación:
-document_properties_modification_date = Fecha de modificación:
-document_properties_date_string = {{date}}, {{time}}
-document_properties_creator = Creador:
-document_properties_producer = Productor PDF:
-document_properties_version = Versión PDF:
-document_properties_page_count = Número de páginas:
-document_properties_close = Cerrar
-toggle_sidebar.title = Cambiar barra lateral
-toggle_sidebar_label = Cambiar barra lateral
-outline.title = Mostrar el esquema del documento
-outline_label = Esquema del documento
-attachments.title = Mostrar adjuntos
-attachments_label = Adjuntos
-thumbs.title = Mostrar miniaturas
-thumbs_label = Miniaturas
-findbar.title = Buscar en el documento
-findbar_label = Buscar
-thumb_page_title = Página {{page}}
-thumb_page_canvas = Miniatura de la página {{page}}
-find_label = Buscar:
-find_previous.title = Encontrar la anterior aparición de la frase
-find_previous_label = Anterior
-find_next.title = Encontrar la siguiente aparición de esta frase
-find_next_label = Siguiente
-find_highlight = Resaltar todos
-find_match_case_label = Concordar mayús./minús.
-find_reached_top = Se alcanzó el inicio del documento, se continúa desde el final
-find_reached_bottom = Fin del documento alcanzado, se continúa desde arriba
-find_not_found = Frase no encontrada
-error_more_info = Más información
-error_less_info = Menos información
-error_close = Cerrar
-error_version_info = PDF.js v{{version}} (build: {{build}})
-error_message = Mensaje: {{message}}
-error_stack = Pila: {{stack}}
-error_file = Archivo: {{file}}
-error_line = Línea: {{line}}
-rendering_error = Ocurrió un error al renderizar la página.
-page_scale_width = Anchura de la página
-page_scale_fit = Ajuste de la página
-page_scale_auto = Tamaño automático
-page_scale_actual = Tamaño real
-page_scale_percent = {{scale}}%
-loading_error_indicator = Error
-loading_error = Ocurrió un error al cargar el PDF.
-invalid_file_error = Fichero PDF no válido o corrupto.
-missing_file_error = No hay fichero PDF.
-unexpected_response_error = Respuesta inesperada del servidor.
-text_annotation_type.alt = [Anotación {{type}}]
-password_label = Introduzca la contraseña para abrir este archivo PDF.
-password_invalid = Contraseña no válida. Vuelva a intentarlo.
-password_ok = Aceptar
-password_cancel = Cancelar
-printing_not_supported = Advertencia: Imprimir no está totalmente soportado por este navegador.
-printing_not_ready = Advertencia: Este PDF no se ha cargado completamente para poder imprimirse.
-web_fonts_disabled = Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas.
-document_colors_disabled = Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.
diff --git a/public/pfd/build/generic/web/locale/es-MX/viewer.properties b/public/pfd/build/generic/web/locale/es-MX/viewer.properties
deleted file mode 100644
index f0b3e7a..0000000
--- a/public/pfd/build/generic/web/locale/es-MX/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Página anterior
-previous_label=Anterior
-next.title=Página siguiente
-next_label=Siguiente
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Página:
-page_of=de {{pageCount}}
-
-zoom_out.title=Reducir
-zoom_out_label=Reducir
-zoom_in.title=Aumentar
-zoom_in_label=Aumentar
-zoom.title=Zoom
-presentation_mode.title=Cambiar al modo presentación
-presentation_mode_label=Modo presentación
-open_file.title=Abrir archivo
-open_file_label=Abrir
-print.title=Imprimir
-print_label=Imprimir
-download.title=Descargar
-download_label=Descargar
-bookmark.title=Vista actual (copiar o abrir en una nueva ventana)
-bookmark_label=Vista actual
-
-# Secondary toolbar and context menu
-tools.title=Herramientas
-tools_label=Herramientas
-first_page.title=Ir a la primera página
-first_page.label=Ir a la primera página
-first_page_label=Ir a la primera página
-last_page.title=Ir a la última página
-last_page.label=Ir a la última página
-last_page_label=Ir a la última página
-page_rotate_cw.title=Girar a la derecha
-page_rotate_cw.label=Girar a la derecha
-page_rotate_cw_label=Girar a la derecha
-page_rotate_ccw.title=Girar a la izquierda
-page_rotate_ccw.label=Girar a la izquierda
-page_rotate_ccw_label=Girar a la izquierda
-
-hand_tool_enable.title=Activar herramienta mano
-hand_tool_enable_label=Activar herramienta mano
-hand_tool_disable.title=Desactivar herramienta mano
-hand_tool_disable_label=Desactivar herramienta mano
-
-# Document properties dialog box
-document_properties.title=Propiedades del documento…
-document_properties_label=Propiedades del documento…
-document_properties_file_name=Nombre del archivo:
-document_properties_file_size=Tamaño del archivo:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Título:
-document_properties_author=Autor:
-document_properties_subject=Asunto:
-document_properties_keywords=Palabras claves:
-document_properties_creation_date=Fecha de creación:
-document_properties_modification_date=Fecha de modificación:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creador:
-document_properties_producer=Productor PDF:
-document_properties_version=Versión PDF:
-document_properties_page_count=Número de páginas:
-document_properties_close=Cerrar
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Cambiar barra lateral
-toggle_sidebar_label=Cambiar barra lateral
-outline.title=Mostrar esquema del documento
-outline_label=Esquema del documento
-attachments.title=Mostrar adjuntos
-attachments_label=Adjuntos
-thumbs.title=Mostrar miniaturas
-thumbs_label=Miniaturas
-findbar.title=Buscar en el documento
-findbar_label=Buscar
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Página {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura de la página {{page}}
-
-# Find panel button title and messages
-find_label=Encontrar:
-find_previous.title=Ir a la anterior frase encontrada
-find_previous_label=Anterior
-find_next.title=Ir a la siguiente frase encontrada
-find_next_label=Siguiente
-find_highlight=Resaltar todo
-find_match_case_label=Coincidir con mayúsculas y minúsculas
-find_reached_top=Se alcanzó el inicio del documento, se buscará al final
-find_reached_bottom=Se alcanzó el final del documento, se buscará al inicio
-find_not_found=No se encontró la frase
-
-# Error panel labels
-error_more_info=Más información
-error_less_info=Menos información
-error_close=Cerrar
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mensaje: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pila: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Archivo: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Línea: {{line}}
-rendering_error=Un error ocurrió al renderizar la página.
-
-# Predefined zoom values
-page_scale_width=Ancho de página
-page_scale_fit=Ajustar página
-page_scale_auto=Zoom automático
-page_scale_actual=Tamaño real
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Error
-loading_error=Un error ocurrió al cargar el PDF.
-invalid_file_error=Archivo PDF invalido o dañado.
-missing_file_error=Archivo PDF no encontrado.
-unexpected_response_error=Respuesta inesperada del servidor.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} anotación]
-password_label=Ingresa la contraseña para abrir este archivo PDF.
-password_invalid=Contraseña inválida. Por favor intenta de nuevo.
-password_ok=Aceptar
-password_cancel=Cancelar
-
-printing_not_supported=Advertencia: La impresión no esta completamente soportada por este navegador.
-printing_not_ready=Advertencia: El PDF no cargo completamente para impresión.
-web_fonts_disabled=Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas.
-document_colors_disabled=Los documentos PDF no tienen permiso de usar sus propios colores: 'Permitir que las páginas elijan sus propios colores' esta desactivada en el navegador.
diff --git a/public/pfd/build/generic/web/locale/et/viewer.properties b/public/pfd/build/generic/web/locale/et/viewer.properties
deleted file mode 100644
index 83da357..0000000
--- a/public/pfd/build/generic/web/locale/et/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Eelmine lehekülg
-previous_label=Eelmine
-next.title=Järgmine lehekülg
-next_label=Järgmine
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Lehekülg:
-page_of=(kokku {{pageCount}})
-
-zoom_out.title=Vähenda
-zoom_out_label=Vähenda
-zoom_in.title=Suurenda
-zoom_in_label=Suurenda
-zoom.title=Suurendamine
-presentation_mode.title=Lülitu esitlusrežiimi
-presentation_mode_label=Esitlusrežiim
-open_file.title=Ava fail
-open_file_label=Ava
-print.title=Prindi
-print_label=Prindi
-download.title=Laadi alla
-download_label=Laadi alla
-bookmark.title=Praegune vaade (kopeeri või ava uues aknas)
-bookmark_label=Praegune vaade
-
-# Secondary toolbar and context menu
-tools.title=Tööriistad
-tools_label=Tööriistad
-first_page.title=Mine esimesele leheküljele
-first_page.label=Mine esimesele leheküljele
-first_page_label=Mine esimesele leheküljele
-last_page.title=Mine viimasele leheküljele
-last_page.label=Mine viimasele leheküljele
-last_page_label=Mine viimasele leheküljele
-page_rotate_cw.title=Pööra päripäeva
-page_rotate_cw.label=Pööra päripäeva
-page_rotate_cw_label=Pööra päripäeva
-page_rotate_ccw.title=Pööra vastupäeva
-page_rotate_ccw.label=Pööra vastupäeva
-page_rotate_ccw_label=Pööra vastupäeva
-
-hand_tool_enable.title=Luba sirvimine
-hand_tool_enable_label=Luba sirvimine
-hand_tool_disable.title=Keela sirvimine
-hand_tool_disable_label=Keela sirvimine
-
-# Document properties dialog box
-document_properties.title=Dokumendi omadused…
-document_properties_label=Dokumendi omadused…
-document_properties_file_name=Faili nimi:
-document_properties_file_size=Faili suurus:
-document_properties_kb={{size_kb}} KiB ({{size_b}} baiti)
-document_properties_mb={{size_mb}} MiB ({{size_b}} baiti)
-document_properties_title=Pealkiri:
-document_properties_author=Autor:
-document_properties_subject=Teema:
-document_properties_keywords=Märksõnad:
-document_properties_creation_date=Loodud:
-document_properties_modification_date=Muudetud:
-document_properties_date_string={{date}} {{time}}
-document_properties_creator=Looja:
-document_properties_producer=Generaator:
-document_properties_version=Generaatori versioon:
-document_properties_page_count=Lehekülgi:
-document_properties_close=Sulge
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Näita külgriba
-toggle_sidebar_label=Näita külgriba
-outline.title=Näita sisukorda
-outline_label=Näita sisukorda
-attachments.title=Näita manuseid
-attachments_label=Manused
-thumbs.title=Näita pisipilte
-thumbs_label=Pisipildid
-findbar.title=Otsi dokumendist
-findbar_label=Otsi
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title={{page}}. lehekülg
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}}. lehekülje pisipilt
-
-# Find panel button title and messages
-find_label=Otsi:
-find_previous.title=Otsi fraasi eelmine esinemiskoht
-find_previous_label=Eelmine
-find_next.title=Otsi fraasi järgmine esinemiskoht
-find_next_label=Järgmine
-find_highlight=Too kõik esile
-find_match_case_label=Tõstutundlik
-find_reached_top=Jõuti dokumendi algusesse, jätkati lõpust
-find_reached_bottom=Jõuti dokumendi lõppu, jätkati algusest
-find_not_found=Fraasi ei leitud
-
-# Error panel labels
-error_more_info=Rohkem teavet
-error_less_info=Vähem teavet
-error_close=Sulge
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Teade: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fail: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Rida: {{line}}
-rendering_error=Lehe renderdamisel esines viga.
-
-# Predefined zoom values
-page_scale_width=Mahuta laiusele
-page_scale_fit=Mahuta leheküljele
-page_scale_auto=Automaatne suurendamine
-page_scale_actual=Tegelik suurus
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Viga
-loading_error=PDFi laadimisel esines viga.
-invalid_file_error=Vigane või rikutud PDF-fail.
-missing_file_error=PDF-fail puudub.
-unexpected_response_error=Ootamatu vastus serverilt.
-
-# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=PDF-faili avamiseks sisesta parool.
-password_invalid=Vigane parool. Palun proovi uuesti.
-password_ok=Sobib
-password_cancel=Loobu
-
-printing_not_supported=Hoiatus: printimine pole selle brauseri poolt täielikult toetatud.
-printing_not_ready=Hoiatus: PDF pole printimiseks täielikult laaditud.
-web_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada.
-document_colors_disabled=PDF-dokumentidel pole oma värvide kasutamine lubatud: \'Veebilehtedel on lubatud kasutada oma värve\' on brauseris deaktiveeritud.
diff --git a/public/pfd/build/generic/web/locale/eu/viewer.properties b/public/pfd/build/generic/web/locale/eu/viewer.properties
deleted file mode 100644
index 52d50ba..0000000
--- a/public/pfd/build/generic/web/locale/eu/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Aurreko orria
-previous_label=Aurrekoa
-next.title=Hurrengo orria
-next_label=Hurrengoa
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Orria:
-page_of=/ {{pageCount}}
-
-zoom_out.title=Urrundu zooma
-zoom_out_label=Urrundu zooma
-zoom_in.title=Gerturatu zooma
-zoom_in_label=Gerturatu zooma
-zoom.title=Zooma
-presentation_mode.title=Aldatu aurkezpen modura
-presentation_mode_label=Arkezpen modua
-open_file.title=Ireki fitxategia
-open_file_label=Ireki
-print.title=Inprimatu
-print_label=Inprimatu
-download.title=Deskargatu
-download_label=Deskargatu
-bookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian)
-bookmark_label=Uneko ikuspegia
-
-# Secondary toolbar and context menu
-tools.title=Tresnak
-tools_label=Tresnak
-first_page.title=Joan lehen orrira
-first_page.label=Joan lehen orrira
-first_page_label=Joan lehen orrira
-last_page.title=Joan azken orrira
-last_page.label=Joan azken orrira
-last_page_label=Joan azken orrira
-page_rotate_cw.title=Biratu erlojuaren norantzan
-page_rotate_cw.label=Biratu erlojuaren norantzan
-page_rotate_cw_label=Biratu erlojuaren norantzan
-page_rotate_ccw.title=Biratu erlojuaren aurkako norantzan
-page_rotate_ccw.label=Biratu erlojuaren aurkako norantzan
-page_rotate_ccw_label=Biratu erlojuaren aurkako norantzan
-
-hand_tool_enable.title=Gaitu eskuaren tresna
-hand_tool_enable_label=Gaitu eskuaren tresna
-hand_tool_disable.title=Desgaitu eskuaren tresna
-hand_tool_disable_label=Desgaitu eskuaren tresna
-
-# Document properties dialog box
-document_properties.title=Dokumentuaren propietateak…
-document_properties_label=Dokumentuaren propietateak…
-document_properties_file_name=Fitxategi-izena:
-document_properties_file_size=Fitxategiaren tamaina:
-document_properties_kb={{size_kb}} KB ({{size_b}} byte)
-document_properties_mb={{size_mb}} MB ({{size_b}} byte)
-document_properties_title=Izenburua:
-document_properties_author=Egilea:
-document_properties_subject=Gaia:
-document_properties_keywords=Gako-hitzak:
-document_properties_creation_date=Sortze-data:
-document_properties_modification_date=Aldatze-data:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Sortzailea:
-document_properties_producer=PDFaren ekoizlea:
-document_properties_version=PDF bertsioa:
-document_properties_page_count=Orrialde kopurua:
-document_properties_close=Itxi
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Txandakatu alboko barra
-toggle_sidebar_label=Txandakatu alboko barra
-outline.title=Erakutsi dokumentuaren eskema
-outline_label=Dokumentuaren eskema
-attachments.title=Erakutsi eranskinak
-attachments_label=Eranskinak
-thumbs.title=Erakutsi koadro txikiak
-thumbs_label=Koadro txikiak
-findbar.title=Bilatu dokumentuan
-findbar_label=Bilatu
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title={{page}}. orria
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}}. orriaren koadro txikia
-
-# Find panel button title and messages
-find_label=Bilatu:
-find_previous.title=Bilatu esaldiaren aurreko parekatzea
-find_previous_label=Aurrekoa
-find_next.title=Bilatu esaldiaren hurrengo parekatzea
-find_next_label=Hurrengoa
-find_highlight=Nabarmendu guztia
-find_match_case_label=Bat etorri maiuskulekin/minuskulekin
-find_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen
-find_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen
-find_not_found=Esaldia ez da aurkitu
-
-# Error panel labels
-error_more_info=Informazio gehiago
-error_less_info=Informazio gutxiago
-error_close=Itxi
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (eraikuntza: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mezua: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pila: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fitxategia: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Lerroa: {{line}}
-rendering_error=Errorea gertatu da orria errendatzean.
-
-# Predefined zoom values
-page_scale_width=Orriaren zabalera
-page_scale_fit=Doitu orrira
-page_scale_auto=Zoom automatikoa
-page_scale_actual=Benetako tamaina
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent=%{{scale}}
-
-# Loading indicator messages
-loading_error_indicator=Errorea
-loading_error=Errorea gertatu da PDFa kargatzean.
-invalid_file_error=PDF fitxategi baliogabe edo hondatua.
-missing_file_error=PDF fitxategia falta da.
-unexpected_response_error=Espero gabeko zerbitzariaren erantzuna.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} ohartarazpena]
-password_label=Idatzi PDF fitxategi hau irekitzeko pasahitza.
-password_invalid=Pasahitz baliogabea. Saiatu berriro mesedez.
-password_ok=Ados
-password_cancel=Utzi
-
-printing_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan.
-printing_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko.
-web_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili.
-document_colors_disabled=PDF dokumentuek ez dute beraien koloreak erabiltzeko baimenik: 'Baimendu orriak beraien letra-tipoak aukeratzea' desaktibatuta dago nabigatzailean.
diff --git a/public/pfd/build/generic/web/locale/fa/viewer.properties b/public/pfd/build/generic/web/locale/fa/viewer.properties
deleted file mode 100644
index 1988978..0000000
--- a/public/pfd/build/generic/web/locale/fa/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=صفحهٔ قبلی
-previous_label=قبلی
-next.title=صفحهٔ بعدی
-next_label=بعدی
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=صفحه:
-page_of=از {{pageCount}}
-
-zoom_out.title=کوچک‌نمایی
-zoom_out_label=کوچک‌نمایی
-zoom_in.title=بزرگ‌نمایی
-zoom_in_label=بزرگ‌نمایی
-zoom.title=زوم
-presentation_mode.title=تغییر به حالت ارائه
-presentation_mode_label=حالت ارائه
-open_file.title=باز کردن پرونده
-open_file_label=باز کردن
-print.title=چاپ
-print_label=چاپ
-download.title=بارگیری
-download_label=بارگیری
-bookmark.title=نمای فعلی (کپی کن، یا در پنجرۀ دیگری نشان بده)
-bookmark_label=نمای فعلی
-
-# Secondary toolbar and context menu
-tools.title=ابزارها
-tools_label=ابزارها
-first_page.title=برو به اولین صفحه
-first_page.label=برو یه اولین صفحه
-first_page_label=برو به اولین صفحه
-last_page.title=برو به آخرین صفحه
-last_page.label=برو به آخرین صفحه
-last_page_label=برو به آخرین صفحه
-page_rotate_cw.title=چرخش ساعتگرد
-page_rotate_cw.label=چرخش ساعتگرد
-page_rotate_cw_label=چرخش ساعتگرد
-page_rotate_ccw.title=چرخش پاد ساعتگرد
-page_rotate_ccw.label=چرخش پاد ساعتگرد
-page_rotate_ccw_label=چرخش پاد ساعتگرد
-
-hand_tool_enable.title=فعال سازی ابزار دست
-hand_tool_enable_label=فعال سازی ابزار دست
-hand_tool_disable.title=غیر‌فعال سازی ابزار دست
-hand_tool_disable_label=غیر‌فعال سازی ابزار دست
-
-# Document properties dialog box
-document_properties.title=خصوصیات سند...
-document_properties_label=خصوصیات سند...
-document_properties_file_name=نام فایل:
-document_properties_file_size=حجم پرونده:
-document_properties_kb={{size_kb}} کیلوبایت ({{size_b}} بایت)
-document_properties_mb={{size_mb}} مگابایت ({{size_b}} بایت)
-document_properties_title=عنوان:
-document_properties_author=نویسنده:
-document_properties_subject=موضوع:
-document_properties_keywords=کلیدواژه‌ها:
-document_properties_creation_date=تاریخ ایجاد:
-document_properties_modification_date=تاریخ ویرایش:
-document_properties_date_string={{date}}، {{time}}
-document_properties_creator=ایجاد کننده:
-document_properties_producer=ایجاد کننده PDF:
-document_properties_version=نسخه PDF:
-document_properties_page_count=تعداد صفحات:
-document_properties_close=بستن
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=باز و بسته کردن نوار کناری
-toggle_sidebar_label=تغییرحالت نوارکناری
-outline.title=نمایش طرح نوشتار
-outline_label=طرح نوشتار
-attachments.title=نمایش پیوست‌ها
-attachments_label=پیوست‌ها
-thumbs.title=نمایش تصاویر بندانگشتی
-thumbs_label=تصاویر بندانگشتی
-findbar.title=جستجو در سند
-findbar_label=پیدا کردن
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=صفحه {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=تصویر بند‌ انگشتی صفحه {{page}}
-
-# Find panel button title and messages
-find_label=جستجو:
-find_previous.title=پیدا کردن رخداد قبلی عبارت
-find_previous_label=قبلی
-find_next.title=پیدا کردن رخداد بعدی عبارت
-find_next_label=بعدی
-find_highlight=برجسته و هایلایت کردن همه موارد
-find_match_case_label=تطبیق کوچکی و بزرگی حروف
-find_reached_top=به بالای صفحه رسیدیم، از پایین ادامه می‌دهیم
-find_reached_bottom=به آخر صفحه رسیدیم، از بالا ادامه می‌دهیم
-find_not_found=عبارت پیدا نشد
-
-# Error panel labels
-error_more_info=اطلاعات بیشتر
-error_less_info=اطلاعات کمتر
-error_close=بستن
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=‏PDF.js ورژن{{version}} ‏(ساخت: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=پیام: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=توده: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=پرونده: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=سطر: {{line}}
-rendering_error=هنگام بارگیری صفحه خطایی رخ داد.
-
-# Predefined zoom values
-page_scale_width=عرض صفحه
-page_scale_fit=اندازه کردن صفحه
-page_scale_auto=بزرگنمایی خودکار
-page_scale_actual=اندازه واقعی‌
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=خطا
-loading_error=هنگام بارگیری پرونده (PDF) خطایی رخ داد.
-invalid_file_error=پرونده PDF نامعتبر یامعیوب می‌باشد.
-missing_file_error=پرونده PDF یافت نشد.
-unexpected_response_error=پاسخ پیش بینی نشده سرور
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=جهت باز کردن پرونده PDF گذرواژه را وارد نمائید.
-password_invalid=گذرواژه نامعتبر. لطفا مجددا تلاش کنید.
-password_ok=تأیید
-password_cancel=انصراف
-
-printing_not_supported=هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود.
-printing_not_ready=اخطار: پرونده PDF بطور کامل بارگیری نشده و امکان چاپ وجود ندارد.
-web_fonts_disabled=فونت های تحت وب غیر فعال شده اند: امکان استفاده از نمایش دهنده داخلی PDF وجود ندارد.
-document_colors_disabled=فایلهای PDF نمیتوانند که رنگ های خود را داشته باشند. لذا گزینه 'اجازه تغییر رنگ" در مرورگر غیر فعال شده است.
diff --git a/public/pfd/build/generic/web/locale/ff/viewer.properties b/public/pfd/build/generic/web/locale/ff/viewer.properties
deleted file mode 100644
index 8a64098..0000000
--- a/public/pfd/build/generic/web/locale/ff/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Hello Ɓennungo
-previous_label=Ɓennuɗo
-next.title=Hello faango
-next_label=Yeeso
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Hello:
-page_of=e nder {{pageCount}}
-
-zoom_out.title=Lonngo Woɗɗa
-zoom_out_label=Lonngo Woɗɗa
-zoom_in.title=Lonngo Ara
-zoom_in_label=Lonngo Ara
-zoom.title=Lonngo
-presentation_mode.title=Faytu to  Presentation Mode
-presentation_mode_label=Presentation Mode
-open_file.title=Uddit Fiilde
-open_file_label=Uddit
-print.title=Winndito
-print_label=Winndito
-download.title=Aawto
-download_label=Aawto
-bookmark.title=Jiytol gonangol (natto walla uddit e henorde)
-bookmark_label=Jiytol Gonangol
-
-# Secondary toolbar and context menu
-tools.title=Kuutorɗe
-tools_label=Kuutorɗe
-first_page.title=Yah to hello adanngo
-first_page.label=Yah to hello adanngo
-first_page_label=Yah to hello adanngo
-last_page.title=Yah to hello wattindiingo
-last_page.label=Yah to hello wattindiingo
-last_page_label=Yah to hello wattindiingo
-page_rotate_cw.title=Yiiltu Faya Ñaamo
-page_rotate_cw.label=Yiiltu Faya Ñaamo
-page_rotate_cw_label=Yiiltu Faya Ñaamo
-page_rotate_ccw.title=Yiiltu Faya Nano
-page_rotate_ccw.label=Yiiltu Faya Nano
-page_rotate_ccw_label=Yiiltu Faya Nano
-
-hand_tool_enable.title=Hurmin kuutorgal junngo
-hand_tool_enable_label=Hurmin kuutorgal junngo
-hand_tool_disable.title=Daaƴ kuutorgal junngo
-hand_tool_disable_label=Daaƴ kuutorgal junngo
-
-# Document properties dialog box
-document_properties.title=Keeroraaɗi Winndannde…
-document_properties_label=Keeroraaɗi Winndannde…
-document_properties_file_name=Innde fiilde:
-document_properties_file_size=Ɓetol fiilde:
-document_properties_kb={{size_kb}} KB ({{size_b}} bite)
-document_properties_mb={{size_mb}} MB ({{size_b}} bite)
-document_properties_title=Tiitoonde:
-document_properties_author=Binnduɗo:
-document_properties_subject=Toɓɓere:
-document_properties_keywords=Kelmekele jiytirɗe:
-document_properties_creation_date=Ñalnde Sosaa:
-document_properties_modification_date=Ñalnde Waylaa:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Cosɗo:
-document_properties_producer=Paggiiɗo PDF:
-document_properties_version=Yamre PDF:
-document_properties_page_count=Limoore Kelle:
-document_properties_close=Uddu
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Toggilo Palal Sawndo
-toggle_sidebar_label=Toggilo Palal Sawndo
-outline.title=Hollu Toɓɓe Fiilannde
-outline_label=Toɓɓe Fiilannde
-attachments.title=Hollu Ɗisanɗe
-attachments_label=Ɗisanɗe
-thumbs.title=Hollu Dooɓe
-thumbs_label=Dooɓe
-findbar.title=Yiylo e fiilannde
-findbar_label=Yiytu
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Hello {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Dooɓre Hello {{page}}
-
-# Find panel button title and messages
-find_label=Yiytu:
-find_previous.title=Yiylo cilol ɓennugol konngol ngol
-find_previous_label=Ɓennuɗo
-find_next.title=Yiylo cilol garowol konngol ngol
-find_next_label=Yeeso
-find_highlight=Jalbin fof
-find_match_case_label=Jaaɓnu darnde
-find_reached_top=Heɓii fuɗɗorde fiilannde, jokku faya les
-find_reached_bottom=Heɓii hoore fiilannde, jokku faya les
-find_not_found=Konngi njiyataa
-
-# Error panel labels
-error_more_info=Ɓeydu Humpito
-error_less_info=Ustu Humpito
-error_close=Uddu
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Ɓatakuure: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fiilde: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Gorol: {{line}}
-rendering_error=Juumre waɗii tuma nde yoŋkittoo hello.
-
-# Predefined zoom values
-page_scale_width=Njaajeendi Hello
-page_scale_fit=Keƴeendi Hello
-page_scale_auto=Loongorde Jaajol
-page_scale_actual=Ɓetol Jaati
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Juumre
-loading_error=Juumre waɗii tuma nde loowata PDF oo.
-invalid_file_error=Fiilde PDF moƴƴaani walla jiibii.
-missing_file_error=Fiilde PDF ena ŋakki.
-unexpected_response_error=Jaabtol sarworde tijjinooka.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Siiftannde]
-password_label=Naatu finnde ngam uddite ndee fiilde PDF.
-password_invalid=Finnde moƴƴaani. Tiiɗno eto kadi.
-password_ok=OK
-password_cancel=Haaytu
-
-printing_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde.
-printing_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol.
-web_fonts_disabled=Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe.
-document_colors_disabled=Piilanɗe PDF njamiraaka yoo kuutoro goobuuji mum'en keeriiɗi: 'Yamir kello yoo kuutoro goobuuki keeriiɗi' koko daaƴaa e wanngorde ndee.
diff --git a/public/pfd/build/generic/web/locale/fi/viewer.properties b/public/pfd/build/generic/web/locale/fi/viewer.properties
deleted file mode 100644
index d64a0a8..0000000
--- a/public/pfd/build/generic/web/locale/fi/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Edellinen sivu
-previous_label=Edellinen
-next.title=Seuraava sivu
-next_label=Seuraava
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Sivu:
-page_of=/ {{pageCount}}
-
-zoom_out.title=Loitonna
-zoom_out_label=Loitonna
-zoom_in.title=Lähennä
-zoom_in_label=Lähennä
-zoom.title=Suurennus
-presentation_mode.title=Siirry esitystilaan
-presentation_mode_label=Esitystila
-open_file.title=Avaa tiedosto
-open_file_label=Avaa
-print.title=Tulosta
-print_label=Tulosta
-download.title=Lataa
-download_label=Lataa
-bookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan)
-bookmark_label=Avoin ikkuna
-
-# Secondary toolbar and context menu
-tools.title=Tools
-tools_label=Tools
-first_page.title=Siirry ensimmäiselle sivulle
-first_page.label=Siirry ensimmäiselle sivulle
-first_page_label=Siirry ensimmäiselle sivulle
-last_page.title=Siirry viimeiselle sivulle
-last_page.label=Siirry viimeiselle sivulle
-last_page_label=Siirry viimeiselle sivulle
-page_rotate_cw.title=Kierrä oikealle
-page_rotate_cw.label=Kierrä oikealle
-page_rotate_cw_label=Kierrä oikealle
-page_rotate_ccw.title=Kierrä vasemmalle
-page_rotate_ccw.label=Kierrä vasemmalle
-page_rotate_ccw_label=Kierrä vasemmalle
-
-hand_tool_enable.title=Käytä käsityökalua
-hand_tool_enable_label=Käytä käsityökalua
-hand_tool_disable.title=Poista käsityökalu käytöstä
-hand_tool_disable_label=Poista käsityökalu käytöstä
-
-# Document properties dialog box
-document_properties.title=Dokumentin ominaisuudet…
-document_properties_label=Dokumentin ominaisuudet…
-document_properties_file_name=Tiedostonimi:
-document_properties_file_size=Tiedoston koko:
-document_properties_kb={{size_kb}} kt ({{size_b}} tavua)
-document_properties_mb={{size_mb}} Mt ({{size_b}} tavua)
-document_properties_title=Otsikko:
-document_properties_author=Tekijä:
-document_properties_subject=Aihe:
-document_properties_keywords=Avainsanat:
-document_properties_creation_date=Luomispäivämäärä:
-document_properties_modification_date=Muokkauspäivämäärä:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Luoja:
-document_properties_producer=PDF-tuottaja:
-document_properties_version=PDF-versio:
-document_properties_page_count=Sivujen määrä:
-document_properties_close=Sulje
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Näytä/piilota sivupaneeli
-toggle_sidebar_label=Näytä/piilota sivupaneeli
-outline.title=Näytä dokumentin rakenne
-outline_label=Dokumentin rakenne
-attachments.title=Näytä liitteet
-attachments_label=Liitteet
-thumbs.title=Näytä pienoiskuvat
-thumbs_label=Pienoiskuvat
-findbar.title=Etsi dokumentista
-findbar_label=Etsi
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Sivu {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Pienoiskuva sivusta {{page}}
-
-# Find panel button title and messages
-find_label=Etsi:
-find_previous.title=Etsi hakusanan edellinen osuma
-find_previous_label=Edellinen
-find_next.title=Etsi hakusanan seuraava osuma
-find_next_label=Seuraava
-find_highlight=Korosta kaikki
-find_match_case_label=Huomioi kirjainkoko
-find_reached_top=Päästiin dokumentin alkuun, jatketaan lopusta
-find_reached_bottom=Päästiin dokumentin loppuun, continued from top
-find_not_found=Hakusanaa ei löytynyt
-
-# Error panel labels
-error_more_info=Lisätietoja
-error_less_info=Lisätietoja
-error_close=Sulje
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (kooste: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Virheilmoitus: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pino: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Tiedosto: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Rivi: {{line}}
-rendering_error=Tapahtui virhe piirrettäessä sivua.
-
-# Predefined zoom values
-page_scale_width=Sivun leveys
-page_scale_fit=Koko sivu
-page_scale_auto=Automaattinen suurennus
-page_scale_actual=Todellinen koko
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}} %
-
-# Loading indicator messages
-loading_error_indicator=Virhe
-loading_error=Tapahtui virhe ladattaessa PDF-tiedostoa.
-invalid_file_error=Virheellinen tai vioittunut PDF-tiedosto.
-missing_file_error=Puuttuva PDF-tiedosto.
-unexpected_response_error=Odottamaton vastaus palvelimelta.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=Kirjoita PDF-tiedoston salasana.
-password_invalid=Virheellinen salasana. Yritä uudestaan.
-password_ok=OK
-password_cancel=Peruuta
-
-printing_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja.
-printing_not_ready=Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa.
-web_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja.
-document_colors_disabled=PDF-dokumenttien ei ole sallittua käyttää omia värejään: Asetusta "Sivut saavat käyttää omia värejään oletusten sijaan" ei ole valittu selaimen asetuksissa.
diff --git a/public/pfd/build/generic/web/locale/fr/viewer.properties b/public/pfd/build/generic/web/locale/fr/viewer.properties
deleted file mode 100644
index a65e06d..0000000
--- a/public/pfd/build/generic/web/locale/fr/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Page précédente
-previous_label=Précédent
-next.title=Page suivante
-next_label=Suivant
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Page :
-page_of=sur {{pageCount}}
-
-zoom_out.title=Zoom arrière
-zoom_out_label=Zoom arrière
-zoom_in.title=Zoom avant
-zoom_in_label=Zoom avant
-zoom.title=Zoom
-presentation_mode.title=Basculer en mode présentation
-presentation_mode_label=Mode présentation
-open_file.title=Ouvrir le fichier
-open_file_label=Ouvrir le fichier
-print.title=Imprimer
-print_label=Imprimer
-download.title=Télécharger
-download_label=Télécharger
-bookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fenêtre)
-bookmark_label=Affichage actuel
-
-# Secondary toolbar and context menu
-tools.title=Outils
-tools_label=Outils
-first_page.title=Aller à la première page
-first_page.label=Aller à la première page
-first_page_label=Aller à la première page
-last_page.title=Aller à la dernière page
-last_page.label=Aller à la dernière page
-last_page_label=Aller à la dernière page
-page_rotate_cw.title=Rotation horaire
-page_rotate_cw.label=Rotation horaire
-page_rotate_cw_label=Rotation horaire
-page_rotate_ccw.title=Rotation anti-horaire
-page_rotate_ccw.label=Rotation anti-horaire
-page_rotate_ccw_label=Rotation anti-horaire
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Afficher/Masquer le panneau latéral
-toggle_sidebar_label=Afficher/Masquer le panneau latéral
-outline.title=Afficher les signets
-outline_label=Signets du document
-attachments.title=Afficher les pièces jointes
-attachments_label=Pièces jointes
-thumbs.title=Afficher les vignettes
-thumbs_label=Vignettes
-findbar.title=Rechercher dans le document
-findbar_label=Rechercher
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Page {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Vignette de la page {{page}}
-
-hand_tool_enable.title=Activer l'outil main
-hand_tool_enable_label=Activer l'outil main
-hand_tool_disable.title=Désactiver l'outil main
-hand_tool_disable_label=Désactiver l'outil main
-
-# Document properties dialog box
-document_properties.title=Propriétés du document…
-document_properties_label=Propriétés du document…
-document_properties_file_name=Nom du fichier :
-document_properties_file_size=Taille du fichier :
-document_properties_kb={{size_kb}} Ko ({{size_b}} octets)
-document_properties_mb={{size_mb}} Mo ({{size_b}} octets)
-document_properties_title=Titre :
-document_properties_author=Auteur :
-document_properties_subject=Sujet :
-document_properties_keywords=Mots-clés :
-document_properties_creation_date=Date de création :
-document_properties_modification_date=Modifié le :
-document_properties_date_string={{date}} à {{time}}
-document_properties_creator=Créé par :
-document_properties_producer=Outil de conversion PDF :
-document_properties_version=Version PDF :
-document_properties_page_count=Nombre de pages :
-document_properties_close=Fermer
-
-# Find panel button title and messages
-find_label=Rechercher :
-find_previous.title=Trouver l'occurrence précédente de la phrase
-find_previous_label=Précédent
-find_next.title=Trouver la prochaine occurrence de la phrase
-find_next_label=Suivant
-find_highlight=Tout surligner
-find_match_case_label=Respecter la casse
-find_reached_top=Haut de la page atteint, poursuite depuis la fin
-find_reached_bottom=Bas de la page atteint, poursuite au début
-find_not_found=Phrase introuvable
-
-# Error panel labels
-error_more_info=Plus d'informations
-error_less_info=Moins d'informations
-error_close=Fermer
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (identifiant de compilation : {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Message : {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pile : {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fichier : {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Ligne : {{line}}
-rendering_error=Une erreur s'est produite lors de l'affichage de la page.
-
-# Predefined zoom values
-page_scale_width=Pleine largeur
-page_scale_fit=Page entière
-page_scale_auto=Zoom automatique
-page_scale_actual=Taille réelle
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}} %
-
-# Loading indicator messages
-loading_error_indicator=Erreur
-loading_error=Une erreur s'est produite lors du chargement du fichier PDF.
-invalid_file_error=Fichier PDF invalide ou corrompu.
-missing_file_error=Fichier PDF manquant.
-unexpected_response_error=Réponse inattendue du serveur.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Annotation {{type}}]
-password_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF.
-password_invalid=Mot de passe incorrect. Veuillez réessayer.
-password_ok=OK
-password_cancel=Annuler
-
-printing_not_supported=Attention : l'impression n'est pas totalement prise en charge par ce navigateur.
-printing_not_ready=Attention : le PDF n'est pas entièrement chargé pour pouvoir l'imprimer.
-web_fonts_disabled=Les polices web sont désactivées : impossible d'utiliser les polices intégrées au PDF.
-document_colors_disabled=Les documents PDF ne peuvent pas utiliser leurs propres couleurs : « Autoriser les pages web à utiliser leurs propres couleurs » est désactivé dans le navigateur.
diff --git a/public/pfd/build/generic/web/locale/fy-NL/viewer.properties b/public/pfd/build/generic/web/locale/fy-NL/viewer.properties
deleted file mode 100644
index d81561c..0000000
--- a/public/pfd/build/generic/web/locale/fy-NL/viewer.properties
+++ /dev/null
@@ -1,173 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Foarige side
-previous_label=Foarige
-next.title=Folgjende side
-next_label=Folgjende
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=side:
-page_of=fan {{pageCount}}
-
-zoom_out.title=Utzoome
-zoom_out_label=Utzoome
-zoom_in.title=Ynzoome
-zoom_in_label=Ynzoome
-zoom.title=Zoome
-print.title=Ofdrukke
-print_label=Ofdrukke
-presentation_mode.title=Wikselje nei presintaasjemoadus
-presentation_mode_label=Presintaasjemoadus
-open_file.title=Bestân iepenje
-open_file_label=Iepenje
-download.title=Ynlade
-download_label=Ynlade
-bookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster)
-bookmark_label=Aktuele finster
-
-# Secondary toolbar and context menu
-tools.title=Ark
-tools_label=Ark
-first_page.title=Gean nei earste side
-first_page.label=Gean nei earste side
-first_page_label=Gean nei earste side
-last_page.title=Gean nei lêste side
-last_page.label=Gean nei lêste side
-last_page_label=Gean nei lêste side
-page_rotate_cw.title=Rjochtsom draaie
-page_rotate_cw.label=Rjochtsom draaie
-page_rotate_cw_label=Rjochtsom draaie
-page_rotate_ccw.title=Linksom draaie
-page_rotate_ccw.label=Linksom draaie
-page_rotate_ccw_label=Linksom draaie
-
-hand_tool_enable.title=Hânark ynskeakelje
-hand_tool_enable_label=Hânark ynskeakelje
-hand_tool_disable.title=Hânark úyskeakelje
-hand_tool_disable_label=Hânark úyskeakelje
-
-# Document properties dialog box
-document_properties.title=Dokuminteigenskippen…
-document_properties_label=Dokuminteigenskippen…
-document_properties_file_name=Bestânsnamme:
-document_properties_file_size=Bestânsgrutte:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Titel:
-document_properties_author=Auteur:
-document_properties_subject=Underwerp:
-document_properties_keywords=Kaaiwurden:
-document_properties_creation_date=Oanmaakdatum:
-document_properties_modification_date=Bewurkingsdatum:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Makker:
-document_properties_producer=PDF-makker:
-document_properties_version=PDF-ferzje:
-document_properties_page_count=Siden:
-document_properties_close=Slute
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Sidebalke yn-/útskeakelje
-toggle_sidebar_label=Sidebalke yn-/útskeakelje
-outline.title=Dokumint ynhâldsopjefte toane
-outline_label=Dokumint ynhâldsopjefte
-attachments.title=Bylagen toane
-attachments_label=Bylagen
-thumbs.title=Foarbylden toane
-thumbs_label=Foarbylden
-findbar.title=Sykje yn dokumint
-findbar_label=Sykje
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Side {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Foarbyld fan side {{page}}
-
-# Context menu
-first_page.label=Nei earste side gean
-last_page.label=Nei lêste side gean
-page_rotate_cw.label=Rjochtsom draaie
-page_rotate_ccw.label=Linksom draaie
-
-# Find panel button title and messages
-find_label=Sykje:
-find_previous.title=It foarige foarkommen fan de tekst sykje
-find_previous_label=Foarige
-find_next.title=It folgjende foarkommen fan de tekst sykje
-find_next_label=Folgjende
-find_highlight=Alles markearje
-find_match_case_label=Haadlettergefoelich
-find_reached_top=Boppekant fan dokumint berikt, trochgien fanôf ûnder
-find_reached_bottom=Ein fan dokumint berikt, trochgien fanôf boppe
-find_not_found=Tekst net fûn
-
-# Error panel labels
-error_more_info=Mear ynformaasje
-error_less_info=Minder ynformaasje
-error_close=Slute
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js f{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Berjocht: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Bestân: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Rigel: {{line}}
-rendering_error=Der is in flater bard by it renderjen fan de side.
-
-# Predefined zoom values
-page_scale_width=Sidebreedte
-page_scale_fit=Hiele side
-page_scale_auto=Automatysk zoome
-page_scale_actual=Wurklike grutte
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Flater
-loading_error=Der is in flater bard by it laden fan de PDF.
-invalid_file_error=Ynfalide of korruptearre PDF-bestân.
-missing_file_error=PDF-bestân ûntbrekt.
-unexpected_response_error=Unferwacht tsjinnerantwurd.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}}-annotaasje]
-password_label=Jou it wachtwurd om dit PDF-bestân te iepenjen.
-password_invalid=Ferkeard wachtwurd. Probearje opnij.
-password_ok=OK
-password_cancel=Annulearje
-
-printing_not_supported=Warning: Printen is net folslein stipe troch dizze browser.
-printing_not_ready=Warning: PDF is net folslein laden om ôf te drukken.
-web_fonts_disabled=Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik.
-document_colors_disabled=PDF-dokuminten binne net tastien om har eigen kleuren te brûken: ‘Siden tastean har eigen kleuren te kiezen’ is útskeakele yn de browser.
diff --git a/public/pfd/build/generic/web/locale/ga-IE/viewer.properties b/public/pfd/build/generic/web/locale/ga-IE/viewer.properties
deleted file mode 100644
index 0381959..0000000
--- a/public/pfd/build/generic/web/locale/ga-IE/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=An Leathanach Roimhe Seo
-previous_label=Roimhe Seo
-next.title=An Chéad Leathanach Eile
-next_label=Ar Aghaidh
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Leathanach:
-page_of=as {{pageCount}}
-
-zoom_out.title=Súmáil Amach
-zoom_out_label=Súmáil Amach
-zoom_in.title=Súmáil Isteach
-zoom_in_label=Súmáil Isteach
-zoom.title=Súmáil
-presentation_mode.title=Úsáid an Mód Láithreoireachta
-presentation_mode_label=Mód Láithreoireachta
-open_file.title=Oscail Comhad
-open_file_label=Oscail
-print.title=Priontáil
-print_label=Priontáil
-download.title=Íosluchtaigh
-download_label=Íosluchtaigh
-bookmark.title=An t-amharc reatha (cóipeáil nó oscail i bhfuinneog nua)
-bookmark_label=An tAmharc Reatha
-
-# Secondary toolbar and context menu
-tools.title=Uirlisí
-tools_label=Uirlisí
-first_page.title=Go dtí an chéad leathanach
-first_page.label=Go dtí an chéad leathanach
-first_page_label=Go dtí an chéad leathanach
-last_page.title=Go dtí an leathanach deiridh
-last_page.label=Go dtí an leathanach deiridh
-last_page_label=Go dtí an leathanach deiridh
-page_rotate_cw.title=Rothlaigh ar deiseal
-page_rotate_cw.label=Rothlaigh ar deiseal
-page_rotate_cw_label=Rothlaigh ar deiseal
-page_rotate_ccw.title=Rothlaigh ar tuathal
-page_rotate_ccw.label=Rothlaigh ar tuathal
-page_rotate_ccw_label=Rothlaigh ar tuathal
-
-hand_tool_enable.title=Cumasaigh uirlis láimhe
-hand_tool_enable_label=Cumasaigh uirlis láimhe
-hand_tool_disable.title=Díchumasaigh uirlis láimhe
-hand_tool_disable_label=Díchumasaigh uirlis láimhe
-
-# Document properties dialog box
-document_properties.title=Airíonna na Cáipéise…
-document_properties_label=Airíonna na Cáipéise…
-document_properties_file_name=Ainm an chomhaid:
-document_properties_file_size=Méid an chomhaid:
-document_properties_kb={{size_kb}} kB ({{size_b}} beart)
-document_properties_mb={{size_mb}} MB ({{size_b}} beart)
-document_properties_title=Teideal:
-document_properties_author=Údar:
-document_properties_subject=Ábhar:
-document_properties_keywords=Eochairfhocail:
-document_properties_creation_date=Dáta Cruthaithe:
-document_properties_modification_date=Dáta Athraithe:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Cruthaitheoir:
-document_properties_producer=Cruthaitheoir an PDF:
-document_properties_version=Leagan PDF:
-document_properties_page_count=Líon Leathanach:
-document_properties_close=Dún
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Scoránaigh an Barra Taoibh
-toggle_sidebar_label=Scoránaigh an Barra Taoibh
-outline.title=Taispeáin Creatlach na Cáipéise
-outline_label=Creatlach na Cáipéise
-attachments.title=Taispeáin Iatáin
-attachments_label=Iatáin
-thumbs.title=Taispeáin Mionsamhlacha
-thumbs_label=Mionsamhlacha
-findbar.title=Aimsigh sa Cháipéis
-findbar_label=Aimsigh
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Leathanach {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Mionsamhail Leathanaigh {{page}}
-
-# Find panel button title and messages
-find_label=Aimsigh:
-find_previous.title=Aimsigh an sampla roimhe seo den nath seo
-find_previous_label=Roimhe seo
-find_next.title=Aimsigh an chéad sampla eile den nath sin
-find_next_label=Ar aghaidh
-find_highlight=Aibhsigh uile
-find_match_case_label=Cásíogair
-find_reached_top=Ag barr na cáipéise, ag leanúint ón mbun
-find_reached_bottom=Ag bun na cáipéise, ag leanúint ón mbarr
-find_not_found=Abairtín gan aimsiú
-
-# Error panel labels
-error_more_info=Tuilleadh Eolais
-error_less_info=Níos Lú Eolais
-error_close=Dún
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Teachtaireacht: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Cruach: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Comhad: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Líne: {{line}}
-rendering_error=Tharla earráid agus an leathanach á leagan amach.
-
-# Predefined zoom values
-page_scale_width=Leithead Leathanaigh
-page_scale_fit=Laghdaigh go dtí an Leathanach
-page_scale_auto=Súmáil Uathoibríoch
-page_scale_actual=Fíormhéid
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Earráid
-loading_error=Tharla earráid agus an cháipéis PDF á luchtú.
-invalid_file_error=Comhad neamhbhailí nó truaillithe PDF.
-missing_file_error=Comhad PDF ar iarraidh.
-unexpected_response_error=Freagra ón bhfreastalaí gan súil leis.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anótáil {{type}}]
-password_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt.
-password_invalid=Focal faire mícheart. Déan iarracht eile.
-password_ok=OK
-password_cancel=Cealaigh
-
-printing_not_supported=Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán.
-printing_not_ready=Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán luchtaithe.
-web_fonts_disabled=Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid.
-document_colors_disabled=Níl cead ag cáipéisí PDF a ndathanna féin a roghnú; tá 'Tabhair cead do leathanaigh a ndathanna féin a roghnú' díchumasaithe sa mbrabhsálaí.
diff --git a/public/pfd/build/generic/web/locale/gd/viewer.properties b/public/pfd/build/generic/web/locale/gd/viewer.properties
deleted file mode 100644
index c2edf02..0000000
--- a/public/pfd/build/generic/web/locale/gd/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=An duilleag roimhe
-previous_label=Air ais
-next.title=An ath-dhuilleag
-next_label=Air adhart
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Duilleag:
-page_of=à {{pageCount}}
-
-zoom_out.title=Sùm a-mach
-zoom_out_label=Sùm a-mach
-zoom_in.title=Sùm a-steach
-zoom_in_label=Sùm a-steach
-zoom.title=Sùm
-presentation_mode.title=Gearr leum dhan mhodh taisbeanaidh
-presentation_mode_label=Am modh taisbeanaidh
-open_file.title=Fosgail faidhle
-open_file_label=Fosgail
-print.title=Clò-bhuail
-print_label=Clò-bhuail
-download.title=Luchdaich a-nuas
-download_label=Luchdaich a-nuas
-bookmark.title=An sealladh làithreach (dèan lethbhreac no fosgail e ann an uinneag ùr)
-bookmark_label=An sealladh làithreach
-
-# Secondary toolbar and context menu
-tools.title=Innealan
-tools_label=Innealan
-first_page.title=Rach gun chiad duilleag
-first_page.label=Rach gun chiad duilleag
-first_page_label=Rach gun chiad duilleag
-last_page.title=Rach gun duilleag mu dheireadh
-last_page.label=Rach gun duilleag mu dheireadh
-last_page_label=Rach gun duilleag mu dheireadh
-page_rotate_cw.title=Cuairtich gu deiseil
-page_rotate_cw.label=Cuairtich gu deiseil
-page_rotate_cw_label=Cuairtich gu deiseil
-page_rotate_ccw.title=Cuairtich gu tuathail
-page_rotate_ccw.label=Cuairtich gu tuathail
-page_rotate_ccw_label=Cuairtich gu tuathail
-
-hand_tool_enable.title=Cuir inneal na làimhe an comas
-hand_tool_enable_label=Cuir inneal na làimhe an comas
-hand_tool_disable.title=Cuir inneal na làimhe à comas
-hand_tool_disable_label=Cuir à comas inneal na làimhe
-
-# Document properties dialog box
-document_properties.title=Roghainnean na sgrìobhainne…
-document_properties_label=Roghainnean na sgrìobhainne…
-document_properties_file_name=Ainm an fhaidhle:
-document_properties_file_size=Meud an fhaidhle:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Tiotal:
-document_properties_author=Ùghdar:
-document_properties_subject=Cuspair:
-document_properties_keywords=Faclan-luirg:
-document_properties_creation_date=Latha a chruthachaidh:
-document_properties_modification_date=Latha atharrachaidh:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Cruthadair:
-document_properties_producer=Saothraiche a' PDF:
-document_properties_version=Tionndadh a' PDF:
-document_properties_page_count=Àireamh de dhuilleagan:
-document_properties_close=Dùin
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Toglaich am bàr-taoibh
-toggle_sidebar_label=Toglaich am bàr-taoibh
-outline.title=Seall an sgrìobhainn far loidhne
-outline_label=Oir-loidhne na sgrìobhainne
-attachments.title=Seall na ceanglachain
-attachments_label=Ceanglachain
-thumbs.title=Seall na dealbhagan
-thumbs_label=Dealbhagan
-findbar.title=Lorg san sgrìobhainn
-findbar_label=Lorg
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Duilleag a {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Dealbhag duilleag a {{page}}
-
-# Find panel button title and messages
-find_label=Lorg:
-find_previous.title=Lorg làthair roimhe na h-abairt seo
-find_previous_label=Air ais
-find_next.title=Lorg ath-làthair na h-abairt seo
-find_next_label=Air adhart
-find_highlight=Soillsich a h-uile
-find_match_case_label=Aire do litrichean mòra is beaga
-find_reached_top=Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige
-find_reached_bottom=Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige
-find_not_found=Cha deach an abairt a lorg
-
-# Error panel labels
-error_more_info=Barrachd fiosrachaidh
-error_less_info=Nas lugha de dh'fhiosrachadh
-error_close=Dùin
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Teachdaireachd: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stac: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Faidhle: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Loidhne: {{line}}
-rendering_error=Thachair mearachd rè reandaradh na duilleige.
-
-# Predefined zoom values
-page_scale_width=Leud na duilleige
-page_scale_fit=Freagair ri meud na duilleige
-page_scale_auto=Sùm fèin-obrachail
-page_scale_actual=Am fìor-mheud
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Mearachd
-loading_error=Thachair mearachd rè luchdadh a' PDF.
-invalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte.
-missing_file_error=Faidhle PDF a tha a dhìth.
-unexpected_response_error=Freagairt on fhrithealaiche ris nach robh dùil.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Nòtachadh {{type}}]
-password_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh.
-password_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist?
-password_ok=Ceart ma-tha
-password_cancel=Sguir dheth
-
-printing_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh.
-printing_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh.
-web_fonts_disabled=Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh.
-document_colors_disabled=Chan fhaod sgrìobhainnean PDF na dathan aca fhèin a chleachdadh: Tha "Leig le duilleagan na dathan aca fhèin a chleachdadh" à comas sa bhrabhsair.
diff --git a/public/pfd/build/generic/web/locale/gl/viewer.properties b/public/pfd/build/generic/web/locale/gl/viewer.properties
deleted file mode 100644
index 0a1f17b..0000000
--- a/public/pfd/build/generic/web/locale/gl/viewer.properties
+++ /dev/null
@@ -1,164 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Páxina anterior
-previous_label=Anterior
-next.title=Seguinte páxina
-next_label=Seguinte
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Páxina:
-page_of=de {{pageCount}}
-
-zoom_out.title=Reducir
-zoom_out_label=Reducir
-zoom_in.title=Ampliar
-zoom_in_label=Ampliar
-zoom.title=Zoom
-presentation_mode.title=Cambiar ao modo presentación
-presentation_mode_label=Modo presentación
-open_file.title=Abrir ficheiro
-open_file_label=Abrir
-print.title=Imprimir
-print_label=Imprimir
-download.title=Descargar
-download_label=Descargar
-bookmark.title=Vista actual (copiar ou abrir nunha nova xanela)
-bookmark_label=Vista actual
-
-# Secondary toolbar and context menu
-tools.title=Ferramentas
-tools_label=Ferramentas
-first_page.title=Ir á primeira páxina
-first_page.label=Ir á primeira páxina
-first_page_label=Ir á primeira páxina
-last_page.title=Ir á última páxina
-last_page.label=Ir á última páxina
-last_page_label=Ir á última páxina
-page_rotate_cw.title=Rotar no sentido das agullas do reloxo
-page_rotate_cw.label=Rotar no sentido das agullas do reloxo
-page_rotate_cw_label=Rotar no sentido das agullas do reloxo
-page_rotate_ccw.title=Rotar no sentido contrario ás agullas do reloxo
-page_rotate_ccw.label=Rotar no sentido contrario ás agullas do reloxo
-page_rotate_ccw_label=Rotar no sentido contrario ás agullas do reloxo
-
-hand_tool_enable.title=Activar ferramenta man
-hand_tool_enable_label=Activar ferramenta man
-hand_tool_disable.title=Desactivar ferramenta man
-hand_tool_disable_label=Desactivar ferramenta man
-
-# Document properties dialog box
-document_properties.title=Propiedades do documento…
-document_properties_label=Propiedades do documento…
-document_properties_file_name=Nome do ficheiro:
-document_properties_file_size=Tamaño do ficheiro:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Título:
-document_properties_author=Autor:
-document_properties_subject=Asunto: 
-document_properties_keywords=Palabras clave:
-document_properties_creation_date=Data de creación:
-document_properties_modification_date=Data de modificación:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creado por:
-document_properties_producer=Xenerador do PDF:
-document_properties_version=Versión de PDF:
-document_properties_page_count=Número de páxinas:
-document_properties_close=Pechar
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Amosar/agochar a barra lateral
-toggle_sidebar_label=Amosar/agochar a barra lateral
-outline.title=Amosar esquema do documento
-outline_label=Esquema do documento
-attachments.title=Amosar anexos
-attachments_label=Anexos
-thumbs.title=Amosar miniaturas
-thumbs_label=Miniaturas
-findbar.title=Atopar no documento
-findbar_label=Atopar
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Páxina {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura da páxina {{page}}
-
-# Find panel button title and messages
-find_label=Atopar:
-find_previous.title=Atopar a anterior aparición da frase
-find_previous_label=Anterior
-find_next.title=Atopar a seguinte aparición da frase
-find_next_label=Seguinte
-find_highlight=Realzar todo
-find_match_case_label=Diferenciar maiúsculas de minúsculas
-find_reached_top=Chegouse ao inicio do documento, continuar desde o final
-find_reached_bottom=Chegouse ao final do documento, continuar desde o inicio
-find_not_found=Non se atopou a frase
-
-# Error panel labels
-error_more_info=Máis información
-error_less_info=Menos información
-error_close=Pechar
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (Identificador da compilación: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mensaxe: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pila: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Ficheiro: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Liña: {{line}}
-rendering_error=Produciuse un erro ao representar a páxina.
-
-# Predefined zoom values
-page_scale_width=Largura da páxina
-page_scale_fit=Axuste de páxina
-page_scale_auto=Zoom automático
-page_scale_actual=Tamaño actual
-
-# Loading indicator messages
-loading_error_indicator=Erro
-loading_error=Produciuse un erro ao cargar o PDF.
-invalid_file_error=Ficheiro PDF danado ou incorrecto.
-missing_file_error=Falta o ficheiro PDF.
-unexpected_response_error=Resposta inesperada do servidor.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotación {{type}}]
-password_label=Escriba o contrasinal para abrir este ficheiro PDF.
-password_invalid=Contrasinal incorrecto. Tente de novo.
-password_ok=Aceptar
-password_cancel=Cancelar
-
-printing_not_supported=Aviso: A impresión non é compatíbel de todo con este navegador.
-printing_not_ready=Aviso: O PDF non se cargou completamente para imprimirse.
-web_fonts_disabled=Desactiváronse as fontes web:  foi imposíbel usar as fontes incrustadas no PDF.
-document_colors_disabled=Non se permite que os documentos PDF usen as súas propias cores: «Permitir que as páxinas escollan as súas propias cores» está desactivado no navegador.
diff --git a/public/pfd/build/generic/web/locale/gu-IN/viewer.properties b/public/pfd/build/generic/web/locale/gu-IN/viewer.properties
deleted file mode 100644
index 1e58d3f..0000000
--- a/public/pfd/build/generic/web/locale/gu-IN/viewer.properties
+++ /dev/null
@@ -1,149 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=પહેલાનુ પાનું
-previous_label=પહેલાનુ
-next.title=આગળનુ પાનું
- next_label=આગળનું
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=પાનું:
-page_of={{pageCount}} નું
-zoom_out.title=મોટુ કરો
-zoom_out_label=મોટુ કરો
-zoom_in.title=નાનું કરો
-zoom_in_label=નાનું કરો
-zoom.title=નાનું મોટુ કરો
-print.title=છાપો
-print_label=છારો
-open_file.title=ફાઇલ ખોલો
-open_file_label=ખોલો
-download.title=ડાઉનલોડ
-download_label=ડાઉનલોડ
-bookmark.title=વર્તમાન દૃશ્ય (નવી વિન્ડોમાં નકલ કરો અથવા ખોલો)
-bookmark_label=વર્તમાન દૃશ્ય
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-outline.title=દસ્તાવેજ રૂપરેખા બતાવો
-outline_label=દસ્તાવેજ રૂપરેખા
-thumbs.title=થંબનેલ્સ બતાવો
-thumbs_label=થંબનેલ્સ
-
-# Document outline messages
-
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=પાનું {{page}}
-
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=પાનાં {{page}} નું થંબનેલ્સ
-# Error panel labels
-error_more_info=વધારે જાણકારી
-error_less_info=ઓછી જાણકારી
-error_close=બંધ કરો
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=સંદેશો: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=સ્ટેક: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ફાઇલ: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=વાક્ય: {{line}}
-rendering_error=ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય.
-# Predefined zoom values
-page_scale_width=પાનાની પહોળાઇ
-page_scale_fit=પાનું બંધબેસતુ
-page_scale_auto=આપમેળે નાનુંમોટુ કરો
-page_scale_actual=ચોક્કસ માપ
-# Loading indicator messages
-# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
-
-loading_error_indicator=ભૂલ
-loading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય.
-# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
-# "{{[type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-
-printing_not_supported=ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી.
-
-error_version_info=PDF.js v{{version}} (build: {{build}})
-find_highlight=બધુ પ્રકાશિત કરો
-find_label=શોધો:
-find_match_case_label=કેસ બંધબેસાડો
-find_next.title=શબ્દસમૂહની આગળની ઘટનાને શોધો
-find_next_label=આગળનું
-find_not_found=શબ્દસમૂહ મળ્યુ નથી
-find_previous.title=શબ્દસમૂહની પાછલી ઘટનાને શોધો
-find_previous_label=પહેલાંનુ
-find_reached_bottom=દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ
-find_reached_top=દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ
-findbar.title=દસ્તાવેજમાં શોધો
-findbar_label=શોધો
-first_page.label=પહેલાં પાનામાં જાવ
-invalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ.
-last_page.label=છેલ્લા પાનામાં જાવ
-missing_file_error=ગુમ થયેલ PDF ફાઇલ.
-page_rotate_ccw.label=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો
-page_rotate_cw.label=ઘડિયાળનાં કાંટાની જેમ ફેરવો
-presentation_mode.title=રજૂઆત સ્થિતિમાં જાવ
-presentation_mode_label=રજૂઆત સ્થિતિ
-printing_not_ready=Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે.
-toggle_sidebar.title=ટૉગલ બાજુપટ્ટી
-toggle_sidebar_label=ટૉગલ બાજુપટ્ટી
-web_fonts_disabled=વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ.
-document_colors_disabled=PDF દસ્તાવેજો તેનાં પોતાના રંગોને વાપરવા પરવાનગી આપતા નથી: 'તેનાં પોતાનાં રંગોને પસંદ કરવા માટે પાનાંને પરવાનગી આપો' બ્રાઉઝરમાં નિષ્ક્રિય થયેલ છે.
-text_annotation_type.alt=[{{type}} Annotation]
-
-attachments.title=જોડાણોને બતાવો
-attachments_label=જોડાણો
-document_properties_author=લેખક:
-document_properties_close=બંધ કરો
-document_properties_creation_date=નિર્માણ તારીખ:
-document_properties_creator=નિર્માતા:
-document_properties_date_string={{date}}, {{time}}
-document_properties_file_name=ફાઇલ નામ:
-document_properties_file_size=ફાઇલ માપ:
-document_properties_kb={{size_kb}} KB ({{size_b}} બાઇટ)
-document_properties_keywords=કિવર્ડ:
-document_properties_label=દસ્તાવેજ ગુણધર્મો…
-document_properties_mb={{size_mb}} MB ({{size_b}} બાઇટ)
-document_properties_modification_date=ફેરફાર તારીખ:
-document_properties_page_count=પાનાં ગણતરી:
-document_properties_producer=PDF નિર્માતા:
-document_properties_subject=વિષય:
-document_properties_title=શીર્ષક:
-first_page.title=પ્રથમ પાનાં પર જાવ
-first_page_label=પ્રથમ પાનાં પર જાવ
-hand_tool_disable.title=હાથનાં સાધનને નિષ્ક્રિય કરો
-hand_tool_disable_label=હાથનાં સાધનને નિષ્ક્રિય કરો
-hand_tool_enable.title=હાથનાં સાધનને સક્રિય કરો
-hand_tool_enable_label=હાથનાં સાધનને સક્રિય કરો
-last_page.title=છેલ્લા પાનાં પર જાવ
-last_page_label=છેલ્લા પાનાં પર જાવ
-page_rotate_ccw.title=ઘડિયાળનાં કાંટાની વિરુદ્દ ફેરવો
-page_rotate_ccw_label=ઘડિયાળનાં કાંટાની વિરુદ્દ ફેરવો
-page_rotate_cw.title=ઘડિયાળનાં કાંટા તરફ ફેરવો
-page_rotate_cw_label=ઘડિયાળનાં કાંટા તરફ ફેરવો
-password_cancel=રદ કરો
-password_invalid=અયોગ્ય પાસવર્ડ. મહેરબાની કરીને ફરી પ્રયત્ન કરો.
-password_label=આ PDF ફાઇલને ખોલવા પાસવર્ડને દાખલ કરો.
-password_ok=બરાબર
-tools.title=સાધનો
-tools_label=સાધનો
-
-document_properties_version=PDF આવૃત્તિ:
-document_properties.title=દસ્તાવેજ ગુણધર્મો…
-
diff --git a/public/pfd/build/generic/web/locale/he/viewer.properties b/public/pfd/build/generic/web/locale/he/viewer.properties
deleted file mode 100644
index 6a1116f..0000000
--- a/public/pfd/build/generic/web/locale/he/viewer.properties
+++ /dev/null
@@ -1,152 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=דף קודם
-previous_label=קודם
-next.title=דף הבא
-next_label=הבא
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=עמוד:
-page_of=מתוך {{pageCount}}
-
-zoom_out.title=התרחקות
-zoom_out_label=התרחקות
-zoom_in.title=התקרבות
-zoom_in_label=התקרבות
-zoom.title=מרחק מתצוגה
-presentation_mode.title=מעבר למצב מצגת
-presentation_mode_label=מצב מצגת
-open_file.title=פתיחת קובץ
-open_file_label=פתיחה
-print.title=הדפסה
-print_label=הדפסה
-download.title=הורדה
-download_label=הורדה
-bookmark.title=תצוגה נוכחית (העתקה או פתיחה בחלון חדש)
-bookmark_label=תצוגה נוכחית
-
-# Secondary toolbar and context menu
-tools.title=כלים
-tools_label=כלים
-first_page.title=מעבר לעמוד הראשון
-first_page.label=מעבר לעמוד הראשון
-first_page_label=מעבר לעמוד הראשון
-last_page.title=מעבר לעמוד האחרון
-last_page.label=מעבר לעמוד האחרון
-last_page_label=מעבר לעמוד האחרון
-page_rotate_cw.title=הטיה עם כיוון השעון
-page_rotate_cw.label=הטיה עם כיוון השעון
-page_rotate_cw_label=הטיה עם כיוון השעון
-page_rotate_ccw.title=הטיה כנגד כיוון השעון
-page_rotate_ccw.label=הטיה כנגד כיוון השעון
-page_rotate_ccw_label=הטיה כנגד כיוון השעון
-
-hand_tool_enable.title=הפעלת כלי היד
-hand_tool_enable_label=הפעלת כלי היד
-hand_tool_disable.title=נטרול כלי היד
-hand_tool_disable_label=נטרול כלי היד
-
-# Document properties dialog box
-document_properties.title=מאפייני מסמך…
-document_properties_label=מאפייני מסמך…
-document_properties_file_name=שם קובץ:
-document_properties_file_size=גודל הקובץ:
-document_properties_kb={{size_kb}} ק״ב ({{size_b}} בתים)
-document_properties_mb={{size_mb}} מ״ב ({{size_b}} בתים)
-document_properties_title=כותרת:
-document_properties_author=מחבר:
-document_properties_subject=נושא:
-document_properties_keywords=מילות מפתח:
-document_properties_creation_date=תאריך יצירה:
-document_properties_modification_date=תאריך שינוי:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=יוצר:
-document_properties_producer=יצרן PDF:
-document_properties_version=גרסת PDF:
-document_properties_page_count=מספר דפים:
-document_properties_close=סגירה
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=הצגה/הסתרה של סרגל הצד
-toggle_sidebar_label=הצגה/הסתרה של סרגל הצד
-outline.title=הצגת מתאר מסמך
-outline_label=מתאר מסמך
-attachments.title=הצגת צרופות
-attachments_label=צרופות
-thumbs.title=הצגת תצוגה מקדימה
-thumbs_label=תצוגה מקדימה
-findbar.title=חיפוש במסמך
-findbar_label=חיפוש
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=עמוד {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=תצוגה מקדימה של עמוד {{page}}
-
-# Find panel button title and messages
-find_label=חיפוש:
-find_previous.title=חיפוש מופע קודם של הביטוי
-find_previous_label=קודם
-find_next.title=חיפוש המופע הבא של הביטוי
-find_next_label=הבא
-find_highlight=הדגשת הכול
-find_match_case_label=התאמת אותיות
-find_reached_top=הגיע לראש הדף, ממשיך מלמטה
-find_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה
-find_not_found=ביטוי לא נמצא
-
-# Error panel labels
-error_more_info=מידע נוסף
-error_less_info=פחות מידע
-error_close=סגירה
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js גרסה {{version}} (בנייה: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=הודעה: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=תוכן מחסנית: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=קובץ: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=שורה: {{line}}
-rendering_error=אירעה שגיאה בעת עיבוד הדף.
-
-# Predefined zoom values
-page_scale_width=רוחב העמוד
-page_scale_fit=התאמה לעמוד
-page_scale_auto=מרחק מתצוגה אוטומטי
-page_scale_actual=גודל אמתי
-
-# Loading indicator messages
-loading_error_indicator=שגיאה
-loading_error=אירעה שגיאה בעת טעינת ה־PDF.
-invalid_file_error=קובץ PDF פגום או לא תקין.
-missing_file_error=קובץ PDF חסר.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[הערת {{type}}]
-password_label=נא להכניס את הססמה לפתיחת קובץ PDF זה.
-password_invalid=ססמה שגויה. נא לנסות שנית.
-password_ok=אישור
-password_cancel=ביטול
-
-printing_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה.
-printing_not_ready=אזהרה: ה־PDF לא ניתן לחלוטין עד מצב שמאפשר הדפסה.
-web_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים.
-document_colors_disabled=מסמכי PDF לא יכולים להשתמש בצבעים משלהם: האפשרות \\'לאפשר לעמודים לבחור צבעים משלהם\\' אינה פעילה בדפדפן.
\ No newline at end of file
diff --git a/public/pfd/build/generic/web/locale/hi-IN/viewer.properties b/public/pfd/build/generic/web/locale/hi-IN/viewer.properties
deleted file mode 100644
index 7b8db3e..0000000
--- a/public/pfd/build/generic/web/locale/hi-IN/viewer.properties
+++ /dev/null
@@ -1,166 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=पिछला पृष्ठ
-previous_label=पिछला
-next.title=अगला पृष्ठ
-next_label=आगे
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=पृष्ठ:
-page_of={{pageCount}} का
-
-zoom_out.title=छोटा करें
-zoom_out_label=छोटा करें
-zoom_in.title=बड़ा करें
-zoom_in_label=बड़ा करें
-zoom.title=बड़ा-छोटा करें
-presentation_mode.title=प्रस्तुति अवस्था में जाएँ
-presentation_mode_label=प्रस्तुति अवस्था
-open_file.title=फ़ाइल खोलें
-open_file_label=खोलें
-print.title=छापें
-print_label=छापें
-download.title=डाउनलोड
-download_label=डाउनलोड
-bookmark.title=मौजूदा दृश्य (नए विंडो में नक़ल लें या खोलें)
-bookmark_label=मौजूदा दृश्य
-
-# Secondary toolbar and context menu
-tools.title=औज़ार
-tools_label=औज़ार
-first_page.title=प्रथम पृष्ठ पर जाएँ
-first_page.label=प्रथम पृष्ठ पर जाएँ
-first_page_label=प्रथम पृष्ठ पर जाएँ
-last_page.title=अंतिम पृष्ठ पर जाएँ
-last_page.label=अंतिम पृष्ठ पर जाएँ
-last_page_label=अंतिम पृष्ठ पर जाएँ
-page_rotate_cw.title=घड़ी की दिशा में घुमाएँ
-page_rotate_cw.label=घड़ी की दिशा में घुमाएँ
-page_rotate_cw_label=घड़ी की दिशा में घुमाएँ
-page_rotate_ccw.title=घड़ी की दिशा से उल्टा घुमाएँ
-page_rotate_ccw.label=घड़ी की दिशा से उल्टा घुमाएँ
-page_rotate_ccw_label=घड़ी की दिशा से उल्टा घुमाएँ
-
-hand_tool_enable.title=हाथ औजार सक्रिय करें
-hand_tool_enable_label=हाथ औजार सक्रिय करें
-hand_tool_disable.title=हाथ औजार निष्क्रिय करना
-hand_tool_disable_label=हाथ औजार निष्क्रिय करना
-
-# Document properties dialog box
-document_properties.title=दस्तावेज़ विशेषता...
-document_properties_label=दस्तावेज़ विशेषता...
-document_properties_file_name=फ़ाइल नाम:
-document_properties_file_size=फाइल आकारः
-document_properties_kb={{size_kb}} KB ({{size_b}} बाइट)
-document_properties_mb={{size_mb}} MB ({{size_b}} बाइट)
-document_properties_title=शीर्षक:
-document_properties_author=लेखकः
-document_properties_subject=विषय:
-document_properties_keywords=कुंजी-शब्द:
-document_properties_creation_date=निर्माण दिनांक:
-document_properties_modification_date=संशोधन दिनांक:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=निर्माता:
-document_properties_producer=PDF उत्पादक:
-document_properties_version=PDF संस्करण:
-document_properties_page_count=पृष्ठ गिनती:
-document_properties_close=बंद करें
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=स्लाइडर टॉगल करें
-toggle_sidebar_label=स्लाइडर टॉगल करें
-outline.title=दस्तावेज़ आउटलाइन दिखाएँ
-outline_label=दस्तावेज़ आउटलाइन
-attachments.title=संलग्नक दिखायें
-attachments_label=संलग्नक
-thumbs.title=लघुछवियाँ दिखाएँ
-thumbs_label=लघु छवि
-findbar.title=दस्तावेज़ में ढूँढ़ें
-findbar_label=ढूँढ़ें
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=पृष्ठ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=पृष्ठ {{page}} की लघु-छवि
-
-# Find panel button title and messages
-find_label=ढूंढें:
-find_previous.title=वाक्यांश की पिछली उपस्थिति ढूँढ़ें
-find_previous_label=पिछला
-find_next.title=वाक्यांश की अगली उपस्थिति ढूँढ़ें
-find_next_label=आगे
-find_highlight=सभी आलोकित करें
-find_match_case_label=मिलान स्थिति
-find_reached_top=पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें
-find_reached_bottom=पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी
-find_not_found=वाक्यांश नहीं मिला
-
-# Error panel labels
-error_more_info=अधिक सूचना
-error_less_info=कम सूचना
-error_close=बंद करें
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=संदेश: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=स्टैक: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=फ़ाइल: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=पंक्ति: {{line}}
-rendering_error=पृष्ठ रेंडरिंग के दौरान त्रुटि आई.
-
-# Predefined zoom values
-page_scale_width=पृष्ठ चौड़ाई
-page_scale_fit=पृष्ठ फिट
-page_scale_auto=स्वचालित जूम
-page_scale_actual=वास्तविक आकार
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=त्रुटि
-loading_error=पीडीएफ लोड करते समय एक त्रुटि हुई.
-invalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल.
-missing_file_error=अनुपस्थित PDF फ़ाइल.
-unexpected_response_error=अप्रत्याशित सर्वर प्रतिक्रिया.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=इस पीडीएफ फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें.
-password_invalid=अवैध कूटशब्द, कृपया फिर कोशिश करें.
-password_ok=ठीक
-password_cancel=रद्द करें
-
-printing_not_supported=चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है.
-printing_not_ready=चेतावनी: पीडीएफ छपाई के लिए पूरी तरह से लोड नहीं है.
-web_fonts_disabled=वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ.
-document_colors_disabled=PDF दस्तावेज़ उनके अपने रंग को उपयोग करने के लिए अनुमति प्राप्त नहीं है: 'पृष्ठों को उनके अपने रंग को चुनने के लिए स्वीकृति दें कि वह उस ब्राउज़र में निष्क्रिय है.
diff --git a/public/pfd/build/generic/web/locale/hr/viewer.properties b/public/pfd/build/generic/web/locale/hr/viewer.properties
deleted file mode 100644
index 50a43a7..0000000
--- a/public/pfd/build/generic/web/locale/hr/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Prethodna stranica
-previous_label=Prethodna
-next.title=Iduća stranica
-next_label=Iduća
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Stranica:
-page_of=od {{pageCount}}
-
-zoom_out.title=Uvećaj
-zoom_out_label=Smanji
-zoom_in.title=Uvaćaj
-zoom_in_label=Smanji
-zoom.title=Uvećanje
-presentation_mode.title=Prebaci u prezentacijski način rada
-presentation_mode_label=Prezentacijski način rada
-open_file.title=Otvori datoteku
-open_file_label=Otvori
-print.title=Ispis
-print_label=Ispis
-download.title=Preuzmi
-download_label=Preuzmi
-bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)
-bookmark_label=Trenutni prikaz
-
-# Secondary toolbar and context menu
-tools.title=Alati
-tools_label=Alati
-first_page.title=Idi na prvu stranicu
-first_page.label=Idi na prvu stranicu
-first_page_label=Idi na prvu stranicu
-last_page.title=Idi na posljednju stranicu
-last_page.label=Idi na posljednju stranicu
-last_page_label=Idi na posljednju stranicu
-page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu
-page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu
-page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu
-page_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu
-page_rotate_ccw.label=Rotiraj obrnutno od smjera kazaljke na satu
-page_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu
-
-hand_tool_enable.title=Omogući ručni alat
-hand_tool_enable_label=Omogući ručni alat
-hand_tool_disable.title=Onemogući ručni alat
-hand_tool_disable_label=Onemogući ručni alat
-
-# Document properties dialog box
-document_properties.title=Svojstva dokumenta...
-document_properties_label=Svojstva dokumenta...
-document_properties_file_name=Naziv datoteke:
-document_properties_file_size=Veličina datoteke:
-document_properties_kb={{size_kb}} KB ({{size_b}} bajtova)
-document_properties_mb={{size_mb}} MB ({{size_b}} bajtova)
-document_properties_title=Naslov:
-document_properties_author=Autor:
-document_properties_subject=Predmet:
-document_properties_keywords=Ključne riječi:
-document_properties_creation_date=Datum stvaranja:
-document_properties_modification_date=Datum promjene:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Stvaralac:
-document_properties_producer=PDF stvaratelj:
-document_properties_version=PDF inačica:
-document_properties_page_count=Broj stranica:
-document_properties_close=Zatvori
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Prikaži/sakrij bočnu traku
-toggle_sidebar_label=Prikaži/sakrij bočnu traku
-outline.title=Prikaži obris dokumenta
-outline_label=Obris dokumenta
-attachments.title=Prikaži privitke
-attachments_label=Privitci
-thumbs.title=Prikaži sličice
-thumbs_label=Sličice
-findbar.title=Traži u dokumentu
-findbar_label=Traži
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Stranica {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Sličica stranice {{page}}
-
-# Find panel button title and messages
-find_label=Traži:
-find_previous.title=Pronađi prethodno javljanje ovog izraza
-find_previous_label=Prethodno
-find_next.title=Pronađi iduće javljanje ovog izraza
-find_next_label=Iduće
-find_highlight=Istankni sve
-find_match_case_label=Slučaj podudaranja
-find_reached_top=Dosegnut vrh dokumenta, nastavak od dna
-find_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha
-find_not_found=Izraz nije pronađen
-
-# Error panel labels
-error_more_info=Više informacija
-error_less_info=Manje informacija
-error_close=Zatvori
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Poruka: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stog: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Datoteka: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Redak: {{line}}
-rendering_error=Došlo je do greške prilikom iscrtavanja stranice.
-
-# Predefined zoom values
-page_scale_width=Širina stranice
-page_scale_fit=Pristajanje stranici
-page_scale_auto=Automatsko uvećanje
-page_scale_actual=Prava veličina
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Greška
-loading_error=Došlo je do greške pri učitavanju PDF-a.
-invalid_file_error=Kriva ili oštećena PDF datoteka.
-missing_file_error=Nedostaje PDF datoteka.
-unexpected_response_error=Neočekivani odgovor poslužitelja.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Bilješka]
-password_label=Upišite lozinku da biste otvorili ovu PDF datoteku.
-password_invalid=Neispravna lozinka. Pokušajte ponovo.
-password_ok=U redu
-password_cancel=Odustani
-
-printing_not_supported=Upozorenje: Ispisivanje nije potpuno podržano u ovom pregledniku.
-printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za ispis.
-web_fonts_disabled=Web fontovi su onemogućeni: nije moguće koristiti umetnute PDF fontove.
-document_colors_disabled=PDF dokumenti nemaju dopuštene koristiti vlastite boje: opcija 'Dopusti stranicama da koriste vlastite boje' je deaktivirana.
diff --git a/public/pfd/build/generic/web/locale/hu/viewer.properties b/public/pfd/build/generic/web/locale/hu/viewer.properties
deleted file mode 100644
index eda1c88..0000000
--- a/public/pfd/build/generic/web/locale/hu/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Előző oldal
-previous_label=Előző
-next.title=Következő oldal
-next_label=Tovább
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Oldal:
-page_of=összesen: {{pageCount}}
-
-zoom_out.title=Kicsinyítés
-zoom_out_label=Kicsinyítés
-zoom_in.title=Nagyítás
-zoom_in_label=Nagyítás
-zoom.title=Nagyítás
-presentation_mode.title=Váltás bemutató módba
-presentation_mode_label=Bemutató mód
-open_file.title=Fájl megnyitása
-open_file_label=Megnyitás
-print.title=Nyomtatás
-print_label=Nyomtatás
-download.title=Letöltés
-download_label=Letöltés
-bookmark.title=Jelenlegi nézet (másolás vagy megnyitás új ablakban)
-bookmark_label=Aktuális nézet
-
-# Secondary toolbar and context menu
-tools.title=Eszközök
-tools_label=Eszközök
-first_page.title=Ugrás az első oldalra
-first_page.label=Ugrás az első oldalra
-first_page_label=Ugrás az első oldalra
-last_page.title=Ugrás az utolsó oldalra
-last_page.label=Ugrás az utolsó oldalra
-last_page_label=Ugrás az utolsó oldalra
-page_rotate_cw.title=Forgatás az óramutató járásával egyezően
-page_rotate_cw.label=Forgatás az óramutató járásával egyezően
-page_rotate_cw_label=Forgatás az óramutató járásával egyezően
-page_rotate_ccw.title=Forgatás az óramutató járásával ellentétesen
-page_rotate_ccw.label=Forgatás az óramutató járásával ellentétesen
-page_rotate_ccw_label=Forgatás az óramutató járásával ellentétesen
-
-hand_tool_enable.title=Kéz eszköz bekapcsolása
-hand_tool_enable_label=Kéz eszköz bekapcsolása
-hand_tool_disable.title=Kéz eszköz kikapcsolása
-hand_tool_disable_label=Kéz eszköz kikapcsolása
-
-# Document properties dialog box
-document_properties.title=Dokumentum tulajdonságai…
-document_properties_label=Dokumentum tulajdonságai…
-document_properties_file_name=Fájlnév:
-document_properties_file_size=Fájlméret:
-document_properties_kb={{size_kb}} KB ({{size_b}} bájt)
-document_properties_mb={{size_mb}} MB ({{size_b}} bájt)
-document_properties_title=Cím:
-document_properties_author=Szerző:
-document_properties_subject=Tárgy:
-document_properties_keywords=Kulcsszavak:
-document_properties_creation_date=Létrehozás dátuma:
-document_properties_modification_date=Módosítás dátuma:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Létrehozta:
-document_properties_producer=PDF előállító:
-document_properties_version=PDF verzió:
-document_properties_page_count=Oldalszám:
-document_properties_close=Bezárás
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Oldalsáv be/ki
-toggle_sidebar_label=Oldalsáv be/ki
-outline.title=Dokumentumvázlat megjelenítése
-outline_label=Dokumentumvázlat
-attachments.title=Mellékletek megjelenítése
-attachments_label=Van melléklet
-thumbs.title=Bélyegképek megjelenítése
-thumbs_label=Bélyegképek
-findbar.title=Keresés a dokumentumban
-findbar_label=Keresés
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title={{page}}. oldal
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}}. oldal bélyegképe
-
-# Find panel button title and messages
-find_label=Keresés:
-find_previous.title=A kifejezés előző előfordulásának keresése
-find_previous_label=Előző
-find_next.title=A kifejezés következő előfordulásának keresése
-find_next_label=Tovább
-find_highlight=Összes kiemelése
-find_match_case_label=Kis- és nagybetűk megkülönböztetése
-find_reached_top=A dokumentum eleje elérve, folytatás a végétől
-find_reached_bottom=A dokumentum vége elérve, folytatás az elejétől
-find_not_found=A kifejezés nem található
-
-# Error panel labels
-error_more_info=További tudnivalók
-error_less_info=Kevesebb információ
-error_close=Bezárás
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Üzenet: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Nyomkövetés: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fájl: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Sor: {{line}}
-rendering_error=Hiba történt az oldal feldolgozása közben.
-
-# Predefined zoom values
-page_scale_width=Oldalszélesség
-page_scale_fit=Teljes oldal
-page_scale_auto=Automatikus nagyítás
-page_scale_actual=Valódi méret
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Hiba
-loading_error=Hiba történt a PDF betöltésekor.
-invalid_file_error=Érvénytelen vagy sérült PDF fájl.
-missing_file_error=Hiányzó PDF fájl.
-unexpected_response_error=Váratlan kiszolgálóválasz.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} megjegyzés]
-password_label=Adja meg a jelszót a PDF fájl megnyitásához.
-password_invalid=Helytelen jelszó. Próbálja újra.
-password_ok=OK
-password_cancel=Mégse
-
-printing_not_supported=Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást.
-printing_not_ready=Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz.
-web_fonts_disabled=Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek.
-document_colors_disabled=A PDF dokumentumok nem használhatják saját színeiket: „Az oldalak a saját maguk által kiválasztott színeket használhatják” beállítás ki van kapcsolva a böngészőben.
diff --git a/public/pfd/build/generic/web/locale/hy-AM/viewer.properties b/public/pfd/build/generic/web/locale/hy-AM/viewer.properties
deleted file mode 100644
index b26af7d..0000000
--- a/public/pfd/build/generic/web/locale/hy-AM/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Նախորդ էջը
-previous_label=Նախորդը
-next.title=Հաջորդ էջը
-next_label=Հաջորդը
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Էջ.
-page_of={{pageCount}}-ից
-
-zoom_out.title=Փոքրացնել
-zoom_out_label=Փոքրացնել
-zoom_in.title=Խոշորացնել
-zoom_in_label=Խոշորացնել
-zoom.title=Մասշտաբը\u0020
-presentation_mode.title=Անցնել Ներկայացման եղանակին
-presentation_mode_label=Ներկայացման եղանակ
-open_file.title=Բացել Ֆայլ
-open_file_label=Բացել
-print.title=Տպել
-print_label=Տպել
-download.title=Բեռնել
-download_label=Բեռնել
-bookmark.title=Ընթացիկ տեսքով (պատճենել կամ բացել նոր պատուհանում)
-bookmark_label=Ընթացիկ տեսքը
-
-# Secondary toolbar and context menu
-tools.title=Գործիքներ
-tools_label=Գործիքներ
-first_page.title=Անցնել առաջին էջին
-first_page.label=Անցնել առաջին էջին
-first_page_label=Անցնել առաջին էջին
-last_page.title=Անցնել վերջին էջին
-last_page.label=Անցնել վերջին էջին
-last_page_label=Անցնել վերջին էջին
-page_rotate_cw.title=Պտտել ըստ ժամացույցի սլաքի
-page_rotate_cw.label=Պտտել ըստ ժամացույցի սլաքի
-page_rotate_cw_label=Պտտել ըստ ժամացույցի սլաքի
-page_rotate_ccw.title=Պտտել հակառակ ժամացույցի սլաքի
-page_rotate_ccw.label=Պտտել հակառակ ժամացույցի սլաքի
-page_rotate_ccw_label=Պտտել հակառակ ժամացույցի սլաքի
-
-hand_tool_enable.title=Միացնել ձեռքի գործիքը
-hand_tool_enable_label=Միացնել ձեռքի գործիքը
-hand_tool_disable.title=Անջատել ձեռքի գործիքը
-hand_tool_disable_label=ԱՆջատել ձեռքի գործիքը
-
-# Document properties dialog box
-document_properties.title=Փաստաթղթի հատկությունները...
-document_properties_label=Փաստաթղթի հատկությունները...
-document_properties_file_name=Ֆայլի անունը.
-document_properties_file_size=Ֆայլի չափը.
-document_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ)
-document_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ)
-document_properties_title=Վերնագիր.
-document_properties_author=Հեղինակ․
-document_properties_subject=Վերնագիր.
-document_properties_keywords=Հիմնաբառ.
-document_properties_creation_date=Ստեղծելու ամսաթիվը.
-document_properties_modification_date=Փոփոխելու ամսաթիվը.
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Ստեղծող.
-document_properties_producer=PDF-ի հեղինակը.
-document_properties_version=PDF-ի տարբերակը.
-document_properties_page_count=Էջերի քանակը.
-document_properties_close=Փակել
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Բացել/Փակել Կողային վահանակը
-toggle_sidebar_label=Բացել/Փակել Կողային վահանակը
-outline.title=Ցուցադրել փաստաթղթի բովանդակությունը
-outline_label=Փաստաթղթի բովանդակությունը
-attachments.title=Ցուցադրել կցորդները
-attachments_label=Կցորդներ
-thumbs.title=Ցուցադրել Մանրապատկերը
-thumbs_label=Մանրապատկերը
-findbar.title=Գտնել փաստաթղթում
-findbar_label=Որոնում
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Էջը {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Էջի մանրապատկերը {{page}}
-
-# Find panel button title and messages
-find_label=Գտնել`
-find_previous.title=Գտնել անրահայտության նախորդ հանդիպումը
-find_previous_label=Նախորդը
-find_next.title=Գտիր արտահայտության հաջորդ հանդիպումը
-find_next_label=Հաջորդը
-find_highlight=Նշագծել Բոլորը
-find_match_case_label=Մեծ(փոքր)ատառ հաշվի առնել
-find_reached_top=Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից
-find_reached_bottom=Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից
-find_not_found=Արտահայտությունը չգտնվեց
-
-# Error panel labels
-error_more_info=Ավելի շատ տեղեկություն
-error_less_info=Քիչ տեղեկություն
-error_close=Փակել
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (կառուցումը. {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Գրությունը. {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Շեղջ. {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Ֆայլ. {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Տողը. {{line}}
-rendering_error=Սխալ՝ էջը ստեղծելիս:
-
-# Predefined zoom values
-page_scale_width=Էջի լայնքը
-page_scale_fit=Ձգել էջը
-page_scale_auto=Ինքնաշխատ
-page_scale_actual=Իրական չափը
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Սխալ
-loading_error=Սխալ՝ PDF ֆայլը բացելիս։
-invalid_file_error=Սխալ կամ բնասված PDF ֆայլ:
-missing_file_error=PDF ֆայլը բացակայում է:
-unexpected_response_error=Սպասարկիչի անսպասելի պատասխան:
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Ծանոթություն]
-password_label=Մուտքագրեք PDF-ի գաղտնաբառը:
-password_invalid=Գաղտնաբառը սխալ է: Կրկին փորձեք:
-password_ok=ԼԱՎ
-password_cancel=Չեղարկել
-
-printing_not_supported=Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։
-printing_not_ready=Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար:
-web_fonts_disabled=Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները:
-document_colors_disabled=PDF փաստաթղթերին թույլատրված չէ օգտագործել իրենց սեփական գույները: 'Թույլատրել էջերին ընտրել իրենց սեփական գույները' ընտրանքը անջատված է դիտարկիչում:
diff --git a/public/pfd/build/generic/web/locale/id/viewer.properties b/public/pfd/build/generic/web/locale/id/viewer.properties
deleted file mode 100644
index 5984083..0000000
--- a/public/pfd/build/generic/web/locale/id/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Laman Sebelumnya
-previous_label=Sebelumnya
-next.title=Laman Selanjutnya
-next_label=Selanjutnya
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Laman:
-page_of=dari {{pageCount}}
-
-zoom_out.title=Perkecil
-zoom_out_label=Perkecil
-zoom_in.title=Perbesar
-zoom_in_label=Perbesar
-zoom.title=Perbesaran
-presentation_mode.title=Ganti ke Mode Presentasi
-presentation_mode_label=Mode Presentasi
-open_file.title=Buka Berkas
-open_file_label=Buka
-print.title=Cetak
-print_label=Cetak
-download.title=Unduh
-download_label=Unduh
-bookmark.title=Tampilan Sekarang (salin atau buka di jendela baru)
-bookmark_label=Tampilan Sekarang
-
-# Secondary toolbar and context menu
-tools.title=Alat
-tools_label=Alat
-first_page.title=Buka Halaman Pertama
-first_page.label=Ke Halaman Pertama
-first_page_label=Buka Halaman Pertama
-last_page.title=Buka Halaman Terakhir
-last_page.label=Ke Halaman Terakhir
-last_page_label=Buka Halaman Terakhir
-page_rotate_cw.title=Putar Searah Jarum Jam
-page_rotate_cw.label=Putar Searah Jarum Jam
-page_rotate_cw_label=Putar Searah Jarum Jam
-page_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam
-page_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam
-page_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam
-
-hand_tool_enable.title=Aktifkan alat tangan
-hand_tool_enable_label=Aktifkan alat tangan
-hand_tool_disable.title=Nonaktifkan alat tangan
-hand_tool_disable_label=Nonaktifkan alat tangan
-
-# Document properties dialog box
-document_properties.title=Properti Dokumen…
-document_properties_label=Properti Dokumen…
-document_properties_file_name=Nama berkas:
-document_properties_file_size=Ukuran berkas:
-document_properties_kb={{size_kb}} KB ({{size_b}} byte)
-document_properties_mb={{size_mb}} MB ({{size_b}} byte)
-document_properties_title=Judul:
-document_properties_author=Penyusun:
-document_properties_subject=Subjek:
-document_properties_keywords=Kata Kunci:
-document_properties_creation_date=Tanggal Dibuat:
-document_properties_modification_date=Tanggal Dimodifikasi:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Pembuat:
-document_properties_producer=Pemroduksi PDF:
-document_properties_version=Versi PDF:
-document_properties_page_count=Jumlah Halaman:
-document_properties_close=Tutup
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping
-toggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping
-outline.title=Buka Kerangka Dokumen
-outline_label=Kerangka Dokumen
-attachments.title=Tampilkan Lampiran
-attachments_label=Lampiran
-thumbs.title=Tampilkan Miniatur
-thumbs_label=Miniatur
-findbar.title=Temukan di Dokumen
-findbar_label=Temukan
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Laman {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatur Laman {{page}}
-
-# Find panel button title and messages
-find_label=Temukan:
-find_previous.title=Temukan kata sebelumnya
-find_previous_label=Sebelumnya
-find_next.title=Temukan lebih lanjut
-find_next_label=Selanjutnya
-find_highlight=Sorot semuanya
-find_match_case_label=Cocokkan BESAR/kecil
-find_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah
-find_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas
-find_not_found=Frasa tidak ditemukan
-
-# Error panel labels
-error_more_info=Lebih Banyak Informasi
-error_less_info=Lebih Sedikit Informasi
-error_close=Tutup
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Pesan: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Berkas: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Baris: {{line}}
-rendering_error=Galat terjadi saat merender laman.
-
-# Predefined zoom values
-page_scale_width=Lebar Laman
-page_scale_fit=Muat Laman
-page_scale_auto=Perbesaran Otomatis
-page_scale_actual=Ukuran Asli
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Galat
-loading_error=Galat terjadi saat memuat PDF.
-invalid_file_error=Berkas PDF tidak valid atau rusak.
-missing_file_error=Berkas PDF tidak ada.
-unexpected_response_error=Balasan server yang tidak diharapkan.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotasi {{type}}]
-password_label=Masukkan sandi untuk membuka berkas PDF ini.
-password_invalid=Sandi tidak valid. Silakan coba lagi.
-password_ok=Oke
-password_cancel=Batal
-
-printing_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini.
-printing_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak.
-web_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat.
-document_colors_disabled=Dokumen PDF tidak diizinkan untuk menggunakan warnanya sendiri karena setelan 'Izinkan laman memilih warna sendiri' dinonaktifkan pada pengaturan.
diff --git a/public/pfd/build/generic/web/locale/is/viewer.properties b/public/pfd/build/generic/web/locale/is/viewer.properties
deleted file mode 100644
index ffc055a..0000000
--- a/public/pfd/build/generic/web/locale/is/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Fyrri síða
-previous_label=Fyrri
-next.title=Næsta síða
-next_label=Næsti
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Síða:
-page_of=af {{pageCount}}
-
-zoom_out.title=Minnka
-zoom_out_label=Minnka
-zoom_in.title=Stækka
-zoom_in_label=Stækka
-zoom.title=Aðdráttur
-presentation_mode.title=Skipta yfir á kynningarham
-presentation_mode_label=Kynningarhamur
-open_file.title=Opna skrá
-open_file_label=Opna
-print.title=Prenta
-print_label=Prenta
-download.title=Hala niður
-download_label=Hala niður
-bookmark.title=Núverandi sýn (afritaðu eða opnaðu í nýjum glugga)
-bookmark_label=Núverandi sýn
-
-# Secondary toolbar and context menu
-tools.title=Verkfæri
-tools_label=Verkfæri
-first_page.title=Fara á fyrstu síðu
-first_page.label=Fara á fyrstu síðu
-first_page_label=Fara á fyrstu síðu
-last_page.title=Fara á síðustu síðu
-last_page.label=Fara á síðustu síðu
-last_page_label=Fara á síðustu síðu
-page_rotate_cw.title=Snúa réttsælis
-page_rotate_cw.label=Snúa réttsælis
-page_rotate_cw_label=Snúa réttsælis
-page_rotate_ccw.title=Snúa rangsælis
-page_rotate_ccw.label=Snúa rangsælis
-page_rotate_ccw_label=Snúa rangsælis
-
-hand_tool_enable.title=Virkja handarverkfæri
-hand_tool_enable_label=Virkja handarverkfæri
-hand_tool_disable.title=Gera handarverkfæri óvirkt
-hand_tool_disable_label=Gera handarverkfæri óvirkt
-
-# Document properties dialog box
-document_properties.title=Eiginleikar skjals…
-document_properties_label=Eiginleikar skjals…
-document_properties_file_name=Skráarnafn:
-document_properties_file_size=Skrárstærð:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Titill:
-document_properties_author=Hönnuður:
-document_properties_subject=Efni:
-document_properties_keywords=Stikkorð:
-document_properties_creation_date=Búið til:
-document_properties_modification_date=Dags breytingar:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Höfundur:
-document_properties_producer=PDF framleiðandi:
-document_properties_version=PDF útgáfa:
-document_properties_page_count=Blaðsíðufjöldi:
-document_properties_close=Loka
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Víxla hliðslá
-toggle_sidebar_label=Víxla hliðslá
-outline.title=Sýna efniskipan skjals
-outline_label=Efnisskipan skjals
-attachments.title=Sýna viðhengi
-attachments_label=Viðhengi
-thumbs.title=Sýna smámyndir
-thumbs_label=Smámyndir
-findbar.title=Leita í skjali
-findbar_label=Leita
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Síða {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Smámynd af síðu {{page}}
-
-# Find panel button title and messages
-find_label=Leita:
-find_previous.title=Leita að fyrra tilfelli þessara orða
-find_previous_label=Fyrri
-find_next.title=Leita að næsta tilfelli þessara orða
-find_next_label=Næsti
-find_highlight=Lita allt
-find_match_case_label=Passa við stafstöðu
-find_reached_top=Náði efst í skjal, held áfram neðst
-find_reached_bottom=Náði enda skjals, held áfram efst
-find_not_found=Fann ekki orðið
-
-# Error panel labels
-error_more_info=Meiri upplýsingar
-error_less_info=Minni upplýsingar
-error_close=Loka
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Skilaboð: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stafli: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Skrá: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Lína: {{line}}
-rendering_error=Upp kom villa við að birta síðuna.
-
-# Predefined zoom values
-page_scale_width=Síðubreidd
-page_scale_fit=Passa á síðu
-page_scale_auto=Sjálfvirkur aðdráttur
-page_scale_actual=Raunstærð
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Villa
-loading_error=Villa kom upp við að hlaða inn PDF.
-invalid_file_error=Ógild eða skemmd PDF skrá.
-missing_file_error=Vantar PDF skrá.
-unexpected_response_error=Óvænt svar frá netþjóni.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Skýring]
-password_label=Sláðu inn lykilorð til að opna þessa PDF skrá.
-password_invalid=Ógilt lykilorð. Reyndu aftur.
-password_ok=Í lagi
-password_cancel=Hætta við
-
-printing_not_supported=Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra.
-printing_not_ready=Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun.
-web_fonts_disabled=Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir.
-document_colors_disabled=PDF skjöl hafa ekki leyfi til að nota sína eigin liti: 'Leyfa síðum að velja eigin liti' er óvirkt í vafranum.
diff --git a/public/pfd/build/generic/web/locale/it/viewer.properties b/public/pfd/build/generic/web/locale/it/viewer.properties
deleted file mode 100644
index 91918e6..0000000
--- a/public/pfd/build/generic/web/locale/it/viewer.properties
+++ /dev/null
@@ -1,111 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-previous.title = Pagina precedente
-previous_label = Precedente
-next.title = Pagina successiva
-next_label = Successiva
-page_label = Pagina:
-page_of = di {{pageCount}}
-zoom_out.title = Riduci zoom
-zoom_out_label = Riduci zoom
-zoom_in.title = Aumenta zoom
-zoom_in_label = Aumenta zoom
-zoom.title = Zoom
-presentation_mode.title = Passa alla modalità presentazione
-presentation_mode_label = Modalità presentazione
-open_file.title = Apri file
-open_file_label = Apri file
-print.title = Stampa
-print_label = Stampa
-download.title = Scarica questo documento
-download_label = Download
-bookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra)
-bookmark_label = Visualizzazione corrente
-tools.title = Strumenti
-tools_label = Strumenti
-first_page.title = Vai alla prima pagina
-first_page.label = Vai alla prima pagina
-first_page_label = Vai alla prima pagina
-last_page.title = Vai all’ultima pagina
-last_page.label = Vai all’ultima pagina
-last_page_label = Vai all’ultima pagina
-page_rotate_cw.title = Ruota in senso orario
-page_rotate_cw.label = Ruota in senso orario
-page_rotate_cw_label = Ruota in senso orario
-page_rotate_ccw.title = Ruota in senso antiorario
-page_rotate_ccw.label = Ruota in senso antiorario
-page_rotate_ccw_label = Ruota in senso antiorario
-hand_tool_enable.title = Attiva strumento mano
-hand_tool_enable_label = Attiva strumento mano
-hand_tool_disable.title = Disattiva strumento mano
-hand_tool_disable_label = Disattiva strumento mano
-document_properties.title = Proprietà del documento…
-document_properties_label = Proprietà del documento…
-document_properties_file_name = Nome file:
-document_properties_file_size = Dimensione file:
-document_properties_kb = {{size_kb}} kB ({{size_b}} byte)
-document_properties_mb = {{size_mb}} MB ({{size_b}} byte)
-document_properties_title = Titolo:
-document_properties_author = Autore:
-document_properties_subject = Oggetto:
-document_properties_keywords = Parole chiave:
-document_properties_creation_date = Data creazione:
-document_properties_modification_date = Data modifica:
-document_properties_date_string = {{date}}, {{time}}
-document_properties_creator = Autore originale:
-document_properties_producer = Produttore PDF:
-document_properties_version = Versione PDF:
-document_properties_page_count = Conteggio pagine:
-document_properties_close = Chiudi
-toggle_sidebar.title = Attiva/disattiva barra laterale
-toggle_sidebar_label = Attiva/disattiva barra laterale
-outline.title = Visualizza la struttura del documento
-outline_label = Struttura documento
-attachments.title = Visualizza allegati
-attachments_label = Allegati
-thumbs.title = Mostra le miniature
-thumbs_label = Miniature
-findbar.title = Trova nel documento
-findbar_label = Trova
-thumb_page_title = Pagina {{page}}
-thumb_page_canvas = Miniatura della pagina {{page}}
-find_label = Trova:
-find_previous.title = Trova l’occorrenza precedente del testo da cercare
-find_previous_label = Precedente
-find_next.title = Trova l’occorrenza successiva del testo da cercare
-find_next_label = Successivo
-find_highlight = Evidenzia
-find_match_case_label = Maiuscole/minuscole
-find_reached_top = Raggiunto l’inizio della pagina, continua dalla fine
-find_reached_bottom = Raggiunta la fine della pagina, continua dall’inizio
-find_not_found = Testo non trovato
-error_more_info = Più informazioni
-error_less_info = Meno informazioni
-error_close = Chiudi
-error_version_info = PDF.js v{{version}} (build: {{build}})
-error_message = Messaggio: {{message}}
-error_stack = Stack: {{stack}}
-error_file = File: {{file}}
-error_line = Riga: {{line}}
-rendering_error = Si è verificato un errore durante il rendering della pagina.
-page_scale_width = Larghezza pagina
-page_scale_fit = Adatta a una pagina
-page_scale_auto = Zoom automatico
-page_scale_actual = Dimensioni effettive
-page_scale_percent = {{scale}}%
-loading_error_indicator = Errore
-loading_error = Si è verificato un errore durante il caricamento del PDF.
-invalid_file_error = File PDF non valido o danneggiato.
-missing_file_error = File PDF non disponibile.
-unexpected_response_error = Risposta imprevista del server
-text_annotation_type.alt = [Annotazione: {{type}}]
-password_label = Inserire la password per aprire questo file PDF.
-password_invalid = Password non corretta. Riprovare.
-password_ok = OK
-password_cancel = Annulla
-printing_not_supported = Attenzione: la stampa non è completamente supportata da questo browser.
-printing_not_ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa.
-web_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri inclusi nel PDF.
-document_colors_disabled = Non è possibile per i documenti PDF utilizzare i propri colori: l’opzione del browser “Permetti alle pagine di scegliere i propri colori invece di quelli impostati” è disattivata.
diff --git a/public/pfd/build/generic/web/locale/ja/viewer.properties b/public/pfd/build/generic/web/locale/ja/viewer.properties
deleted file mode 100644
index 10a21d9..0000000
--- a/public/pfd/build/generic/web/locale/ja/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=前のページへ戻ります
-previous_label=前へ
-next.title=次のページへ進みます
-next_label=次へ
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=ページ:
-page_of=/ {{pageCount}}
-
-zoom_out.title=表示を縮小します
-zoom_out_label=縮小
-zoom_in.title=表示を拡大します
-zoom_in_label=拡大
-zoom.title=拡大/縮小
-presentation_mode.title=プレゼンテーションモードに切り替えます
-presentation_mode_label=プレゼンテーションモード
-open_file.title=ファイルを指定して開きます
-open_file_label=開く
-print.title=印刷します
-print_label=印刷
-download.title=ダウンロードします
-download_label=ダウンロード
-bookmark.title=現在のビューの URL です (コピーまたは新しいウィンドウに開く)
-bookmark_label=現在のビュー
-
-# Secondary toolbar and context menu
-tools.title=ツール
-tools_label=ツール
-first_page.title=最初のページへ移動します
-first_page.label=最初のページへ移動
-first_page_label=最初のページへ移動
-last_page.title=最後のページへ移動します
-last_page.label=最後のページへ移動
-last_page_label=最後のページへ移動
-page_rotate_cw.title=ページを右へ回転します
-page_rotate_cw.label=右回転
-page_rotate_cw_label=右回転
-page_rotate_ccw.title=ページを左へ回転します
-page_rotate_ccw.label=左回転
-page_rotate_ccw_label=左回転
-
-hand_tool_enable.title=手のひらツールを有効にします
-hand_tool_enable_label=手のひらツールを有効にする
-hand_tool_disable.title=手のひらツールを無効にします
-hand_tool_disable_label=手のひらツールを無効にする
-
-# Document properties dialog box
-document_properties.title=文書のプロパティ...
-document_properties_label=文書のプロパティ...
-document_properties_file_name=ファイル名:
-document_properties_file_size=ファイルサイズ:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=タイトル:
-document_properties_author=作成者:
-document_properties_subject=件名:
-document_properties_keywords=キーワード:
-document_properties_creation_date=作成日:
-document_properties_modification_date=更新日:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=アプリケーション:
-document_properties_producer=PDF 作成:
-document_properties_version=PDF のバージョン:
-document_properties_page_count=ページ数:
-document_properties_close=閉じる
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=サイドバー表示を切り替えます
-toggle_sidebar_label=サイドバーの切り替え
-outline.title=文書の目次を表示します
-outline_label=文書の目次
-attachments.title=添付ファイルを表示します
-attachments_label=添付ファイル
-thumbs.title=縮小版を表示します
-thumbs_label=縮小版
-findbar.title=文書内を検索します
-findbar_label=検索
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title={{page}} ページ
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=ページの縮小版 {{page}}
-
-# Find panel button title and messages
-find_label=検索:
-find_previous.title=指定文字列に一致する 1 つ前の部分を検索します
-find_previous_label=前へ
-find_next.title=指定文字列に一致する次の部分を検索します
-find_next_label=次へ
-find_highlight=すべて強調表示
-find_match_case_label=大文字/小文字を区別
-find_reached_top=文書先頭に到達したので末尾に戻って検索しました。
-find_reached_bottom=文書末尾に到達したので先頭に戻って検索しました。
-find_not_found=見つかりませんでした。
-
-# Error panel labels
-error_more_info=詳細情報
-error_less_info=詳細情報の非表示
-error_close=閉じる
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (ビルド: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=メッセージ: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=スタック: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ファイル: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=行: {{line}}
-rendering_error=ページのレンダリング中にエラーが発生しました
-
-# Predefined zoom values
-page_scale_width=幅に合わせる
-page_scale_fit=ページのサイズに合わせる
-page_scale_auto=自動ズーム
-page_scale_actual=実際のサイズ
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=エラー
-loading_error=PDF の読み込み中にエラーが発生しました
-invalid_file_error=無効または破損した PDF ファイル
-missing_file_error=PDF ファイルが見つかりません。
-unexpected_response_error=サーバから予期せぬ応答がありました。
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} 注釈]
-password_label=この PDF ファイルを開くためのパスワードを入力してください。
-password_invalid=無効なパスワードです。もう一度やり直してください。
-password_ok=OK
-password_cancel=キャンセル
-
-printing_not_supported=警告: このブラウザでは印刷が完全にサポートされていません
-printing_not_ready=警告: PDF を印刷するための読み込みが終了していません
-web_fonts_disabled=Web フォントが無効になっています: 埋め込まれた PDF のフォントを使用できません
-document_colors_disabled=PDF 文書は、Web ページが指定した配色を使用することができません: \u0027Web ページが指定した配色\u0027 はブラウザで無効になっています。
diff --git a/public/pfd/build/generic/web/locale/ka/viewer.properties b/public/pfd/build/generic/web/locale/ka/viewer.properties
deleted file mode 100644
index f6c68f5..0000000
--- a/public/pfd/build/generic/web/locale/ka/viewer.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=წინა გვერდი
-previous_label=წინა
-next.title=შემდეგი გვერდი
-next_label=შემდეგი
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=გვერდი:
-page_of=of {{pageCount}}
-
-zoom_out.title=შემცირება
-zoom_out_label=გაზრდა
-zoom_in.title=შემცირება
-zoom_in_label=შემცირება
-zoom.title=მასშტაბი
-print.title=ამობეჭდვა
-print_label=ამობეჭდვა
-presentation_mode.title=გადართვა პრეზენტაციის რეჟიმზე
-presentation_mode_label=პრეზენტაციის რეჟიმი
-open_file.title=ფაილის გახსნა
-open_file_label=გახსნა
-download.title=ჩამოტვირთვა
-download_label=ჩამოტვირთვა
-bookmark.title=მიმდინარე ხედი (ასლი ან გახსნა ახალ სარკმელში)
-bookmark_label=მიმდინარე ხედი
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=სტენდის ჩვენება/დამალვა
-toggle_sidebar_label=სტენდის ჩვენება/დამალვა
-outline.title=დოკუმენტის სქემის ჩვენება
-outline_label=დოკუმენტის სქემა
-thumbs.title=მინიატურების ჩვენება
-thumbs_label=მინიატურები
-findbar.title=პოვნა დოკუმენტში
-findbar_label=პოვნა
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=გვერდი {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=მინიატურა გვერდისთვის {{page}}
-
-# Context menu
-first_page.label=გადასვლა პირველ გვერდზე
-last_page.label=გადასვლა ბოლო გვერდზე
-page_rotate_cw.label=დატრიალება
-page_rotate_ccw.label=უკუდატრიალება
-
-# Find panel button title and messages
-find_label=პოვნა:
-find_previous.title=კონტექსტის წინა თანხვედრის პოვნა
-find_previous_label=წინა
-find_next.title=კონტექსტის შემდეგი თანხვედრის პოვნა
-find_next_label=შემდეგი
-find_highlight=ყველას გამოყოფა
-find_match_case_label=მთავრულის გათვალისწინებით
-find_reached_top=დოკუმენტის თავი, გრძელდება დოკუმენტის ბოლოდან
-find_reached_bottom=დოკუმენტის ბოლო, გრძელდება დოკუმენტის თავიდან
-find_not_found=კონტექსტი ვერ მოიძებნა
-
-# Error panel labels
-error_more_info=დეტალების ჩვენება
-error_less_info=დეტალების დამალვა
-error_close=დახურვა
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (აგება: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=გზავნილი: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=მჭიდი: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ფაილი: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=სტრიქონი: {{line}}
-rendering_error=შეცდომა გვერდის ასახვისას.
-
-# Predefined zoom values
-page_scale_width=გვერდის სიგანეზე
-page_scale_fit=გვერდის შევსება
-page_scale_auto=თვითმასშტაბი
-page_scale_actual=რეალური ზომა
-
-# Loading indicator messages
-loading_error_indicator=შეცდომა
-loading_error=შეცდომა PDF ფაილის ჩატვირთვისას.
-invalid_file_error=უმართებლო ან დაზიანებული PDF ფაილი.
-missing_file_error=მცდარი PDF ფაილი.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} ანოტაცია]
-request_password=PDF დაცულია პაროლით:
-invalid_password=პაროლი მცდარია.
-
-printing_not_supported=გაფრთხილება: ამ ბრაუზერში ამობეჭდვის მხარდაჭერა არასრულია .
-printing_not_ready=გაფრთხილება: PDF ფაილი ამოსაბეჭდად სრულად არ ჩატვირთულა.
-web_fonts_disabled=ვებ შრიფტები ამორთულია: ჩადგმული PDF შრიფტებით სარგებლობა ვერ ხერხდება.
-document_colors_disabled=PDF დოკუმენტებს ეკრძალებათ საკუთარი ფერების გამოყენება: ბრაუზერში ამორთულია პარამეტრი - «გვერდებისთვის საკუთარი ფერებით სარგებლობის უფლება».
diff --git a/public/pfd/build/generic/web/locale/kk/viewer.properties b/public/pfd/build/generic/web/locale/kk/viewer.properties
deleted file mode 100644
index c6fbb8d..0000000
--- a/public/pfd/build/generic/web/locale/kk/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Алдыңғы парақ
-previous_label=Алдыңғысы
-next.title=Келесі парақ
-next_label=Келесі
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Парақ:
-page_of={{pageCount}} ішінен
-
-zoom_out.title=Кішірейту
-zoom_out_label=Кішірейту
-zoom_in.title=Үлкейту
-zoom_in_label=Үлкейту
-zoom.title=Масштаб
-presentation_mode.title=Презентация режиміне ауысу
-presentation_mode_label=Презентация режимі
-open_file.title=Файлды ашу
-open_file_label=Ашу
-print.title=Баспаға шығару
-print_label=Баспаға шығару
-download.title=Жүктеп алу
-download_label=Жүктеп алу
-bookmark.title=Ағымдағы көрініс (көшіру не жаңа терезеде ашу)
-bookmark_label=Ағымдағы көрініс
-
-# Secondary toolbar and context menu
-tools.title=Саймандар
-tools_label=Саймандар
-first_page.title=Алғашқы параққа өту
-first_page.label=Алғашқы параққа өту
-first_page_label=Алғашқы параққа өту
-last_page.title=Соңғы параққа өту
-last_page.label=Соңғы параққа өту
-last_page_label=Соңғы параққа өту
-page_rotate_cw.title=Сағат тілі бағытымен айналдыру
-page_rotate_cw.label=Сағат тілі бағытымен бұру
-page_rotate_cw_label=Сағат тілі бағытымен бұру
-page_rotate_ccw.title=Сағат тілі бағытына қарсы бұру
-page_rotate_ccw.label=Сағат тілі бағытына қарсы бұру
-page_rotate_ccw_label=Сағат тілі бағытына қарсы бұру
-
-hand_tool_enable.title=Қол сайманын іске қосу
-hand_tool_enable_label=Қол сайманын іске қосу
-hand_tool_disable.title=Қол сайманын сөндіру
-hand_tool_disable_label=Қол сайманын сөндіру
-
-# Document properties dialog box
-document_properties.title=Құжат қасиеттері…
-document_properties_label=Құжат қасиеттері…
-document_properties_file_name=Файл аты:
-document_properties_file_size=Файл өлшемі:
-document_properties_kb={{size_kb}} КБ ({{size_b}} байт)
-document_properties_mb={{size_mb}} МБ ({{size_b}} байт)
-document_properties_title=Тақырыбы...
-document_properties_author=Авторы:
-document_properties_subject=Тақырыбы:
-document_properties_keywords=Кілт сөздер:
-document_properties_creation_date=Жасалған күні:
-document_properties_modification_date=Түзету күні:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Жасаған:
-document_properties_producer=PDF өндірген:
-document_properties_version=PDF нұсқасы:
-document_properties_page_count=Беттер саны:
-document_properties_close=Жабу
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Бүйір панелін көрсету/жасыру
-toggle_sidebar_label=Бүйір панелін көрсету/жасыру
-outline.title=Құжат құрамасын көрсету
-outline_label=Құжат құрамасы
-attachments.title=Салынымдарды көрсету
-attachments_label=Салынымдар
-thumbs.title=Кіші көріністерді көрсету
-thumbs_label=Кіші көріністер
-findbar.title=Құжаттан табу
-findbar_label=Табу
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title={{page}} парағы
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}} парағы үшін кіші көрінісі
-
-# Find panel button title and messages
-find_label=Табу:
-find_previous.title=Осы сөздердің мәтіннен алдыңғы кездесуін табу
-find_previous_label=Алдыңғысы
-find_next.title=Осы сөздердің мәтіннен келесі кездесуін табу
-find_next_label=Келесі
-find_highlight=Барлығын түспен ерекшелеу
-find_match_case_label=Регистрді ескеру
-find_reached_top=Құжаттың басына жеттік, соңынан бастап жалғастырамыз
-find_reached_bottom=Құжаттың соңына жеттік, басынан бастап жалғастырамыз
-find_not_found=Сөз(дер) табылмады
-
-# Error panel labels
-error_more_info=Көбірек ақпарат
-error_less_info=Азырақ ақпарат
-error_close=Жабу
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (жинақ: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Хабарлама: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Стек: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Файл: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Жол: {{line}}
-rendering_error=Парақты өңдеу кезінде қате кетті.
-
-# Predefined zoom values
-page_scale_width=Парақ ені
-page_scale_fit=Парақты сыйдыру
-page_scale_auto=Автомасштабтау
-page_scale_actual=Нақты өлшемі
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Қате
-loading_error=PDF жүктеу кезінде қате кетті.
-invalid_file_error=Зақымдалған немесе қате PDF файл.
-missing_file_error=PDF файлы жоқ.
-unexpected_response_error=Сервердің күтпеген жауабы.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} аңдатпасы]
-password_label=Бұл PDF файлын ашу үшін парольді енгізіңіз.
-password_invalid=Пароль дұрыс емес. Қайталап көріңіз.
-password_ok=ОК
-password_cancel=Бас тарту
-
-printing_not_supported=Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды.
-printing_not_ready=Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады.
-web_fonts_disabled=Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес.
-document_colors_disabled=PDF құжаттарына өздік түстерді қолдану рұқсат етілмеген: бұл браузерде 'Веб-сайттарға өздерінің түстерін қолдануға рұқсат беру' мүмкіндігі сөндірулі тұр.
diff --git a/public/pfd/build/generic/web/locale/km/viewer.properties b/public/pfd/build/generic/web/locale/km/viewer.properties
deleted file mode 100644
index 6ea4005..0000000
--- a/public/pfd/build/generic/web/locale/km/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=ទំព័រ​មុន
-previous_label=មុន
-next.title=ទំព័រ​បន្ទាប់
-next_label=បន្ទាប់
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=ទំព័រ ៖
-page_of=នៃ {{pageCount}}
-
-zoom_out.title=​បង្រួម
-zoom_out_label=​បង្រួម
-zoom_in.title=​ពង្រីក
-zoom_in_label=​ពង្រីក
-zoom.title=ពង្រីក
-presentation_mode.title=ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ
-presentation_mode_label=របៀប​បទ​បង្ហាញ
-open_file.title=បើក​ឯកសារ
-open_file_label=បើក
-print.title=បោះពុម្ព
-print_label=បោះពុម្ព
-download.title=ទាញ​យក
-download_label=ទាញ​យក
-bookmark.title=ទិដ្ឋភាព​បច្ចុប្បន្ន (ចម្លង ឬ​បើក​នៅ​ក្នុង​បង្អួច​ថ្មី)
-bookmark_label=ទិដ្ឋភាព​បច្ចុប្បន្ន
-
-# Secondary toolbar and context menu
-tools.title=ឧបករណ៍
-tools_label=ឧបករណ៍
-first_page.title=ទៅកាន់​ទំព័រ​ដំបូង​
-first_page.label=ទៅកាន់​ទំព័រ​ដំបូង​
-first_page_label=ទៅកាន់​ទំព័រ​ដំបូង​
-last_page.title=ទៅកាន់​ទំព័រ​ចុងក្រោយ​
-last_page.label=ទៅកាន់​ទំព័រ​ចុងក្រោយ​
-last_page_label=ទៅកាន់​ទំព័រ​ចុងក្រោយ
-page_rotate_cw.title=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា
-page_rotate_cw.label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា
-page_rotate_cw_label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា
-page_rotate_ccw.title=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​
-page_rotate_ccw.label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​
-page_rotate_ccw_label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​
-
-hand_tool_enable.title=បើក​ឧបករណ៍​ដោយ​ដៃ
-hand_tool_enable_label=បើក​ឧបករណ៍​ដោយ​ដៃ
-hand_tool_disable.title=បិទ​ឧបករណ៍​ប្រើ​ដៃ
-hand_tool_disable_label=បិទ​ឧបករណ៍​ប្រើ​ដៃ
-
-# Document properties dialog box
-document_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ…
-document_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ…
-document_properties_file_name=ឈ្មោះ​ឯកសារ៖
-document_properties_file_size=ទំហំ​ឯកសារ៖
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=ចំណងជើង ៖
-document_properties_author=អ្នក​និពន្ធ៖
-document_properties_subject=ប្រធានបទ៖
-document_properties_keywords=ពាក្យ​គន្លឹះ៖
-document_properties_creation_date=កាលបរិច្ឆេទ​បង្កើត៖
-document_properties_modification_date=កាលបរិច្ឆេទ​កែប្រែ៖
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=អ្នក​បង្កើត៖
-document_properties_producer=កម្មវិធី​បង្កើត PDF ៖
-document_properties_version=កំណែ PDF ៖
-document_properties_page_count=ចំនួន​ទំព័រ៖
-document_properties_close=បិទ
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=បិទ/បើក​គ្រាប់​រំកិល
-toggle_sidebar_label=បិទ/បើក​គ្រាប់​រំកិល
-outline.title=បង្ហាញ​គ្រោង​ឯកសារ
-outline_label=គ្រោង​ឯកសារ
-attachments.title=បង្ហាញ​ឯកសារ​ភ្ជាប់
-attachments_label=ឯកសារ​ភ្ជាប់
-thumbs.title=បង្ហាញ​រូបភាព​តូចៗ
-thumbs_label=រួបភាព​តូចៗ
-findbar.title=រក​នៅ​ក្នុង​ឯកសារ
-findbar_label=រក
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=ទំព័រ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=រូបភាព​តូច​របស់​ទំព័រ {{page}}
-
-# Find panel button title and messages
-find_label=រក ៖
-find_previous.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន
-find_previous_label=មុន
-find_next.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់
-find_next_label=បន្ទាប់
-find_highlight=បន្លិច​ទាំងអស់
-find_match_case_label=ករណី​ដំណូច
-find_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ
-find_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ
-find_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា
-
-# Error panel labels
-error_more_info=ព័ត៌មាន​បន្ថែម
-error_less_info=ព័ត៌មាន​តិចតួច
-error_close=បិទ
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=សារ ៖ {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=ជង់ ៖ {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ឯកសារ ៖ {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=ជួរ ៖ {{line}}
-rendering_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។
-
-# Predefined zoom values
-page_scale_width=ទទឹង​ទំព័រ
-page_scale_fit=សម​ទំព័រ
-page_scale_auto=ពង្រីក​ស្វ័យប្រវត្តិ
-page_scale_actual=ទំហំ​ជាក់ស្ដែង
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=កំហុស
-loading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។
-invalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។
-missing_file_error=បាត់​ឯកសារ PDF
-unexpected_response_error=ការ​ឆ្លើយ​តម​ម៉ាស៊ីន​មេ​ដែល​មិន​បាន​រំពឹង។
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} ចំណារ​ពន្យល់]
-password_label=បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។
-password_invalid=ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។
-password_ok=យល់​ព្រម
-password_cancel=បោះបង់
-
-printing_not_supported=ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។
-printing_not_ready=ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។
-web_fonts_disabled=បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។
-document_colors_disabled=ឯកសារ PDF មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​ប្រើ​ពណ៌​ផ្ទាល់​របស់​វា​ទេ៖ 'អនុញ្ញាត​​ឲ្យ​ទំព័រ​ជ្រើស​ពណ៌​ផ្ទាល់​ខ្លួន' ត្រូវ​បាន​ធ្វើ​ឲ្យ​អសកម្ម​ក្នុង​​កម្មវិធី​រុករក។
diff --git a/public/pfd/build/generic/web/locale/kn/viewer.properties b/public/pfd/build/generic/web/locale/kn/viewer.properties
deleted file mode 100644
index c50cd20..0000000
--- a/public/pfd/build/generic/web/locale/kn/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=ಹಿಂದಿನ ಪುಟ
-previous_label=ಹಿಂದಿನ
-next.title=ಮುಂದಿನ ಪುಟ
-next_label=ಮುಂದಿನ
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=ಪುಟ:
-page_of={{pageCount}} ರಲ್ಲಿ
-
-zoom_out.title=ಕಿರಿದಾಗಿಸು
-zoom_out_label=ಕಿರಿದಾಗಿಸಿ
-zoom_in.title=ಹಿರಿದಾಗಿಸು
-zoom_in_label=ಹಿರಿದಾಗಿಸಿ
-zoom.title=ಗಾತ್ರಬದಲಿಸು
-presentation_mode.title=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು
-presentation_mode_label=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ
-open_file.title=ಕಡತವನ್ನು ತೆರೆ
-open_file_label=ತೆರೆಯಿರಿ
-print.title=ಮುದ್ರಿಸು
-print_label=ಮುದ್ರಿಸಿ
-download.title=ಇಳಿಸು
-download_label=ಇಳಿಸಿಕೊಳ್ಳಿ
-bookmark.title=ಪ್ರಸಕ್ತ ನೋಟ (ಪ್ರತಿ ಮಾಡು ಅಥವ ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆ)
-bookmark_label=ಪ್ರಸಕ್ತ ನೋಟ
-
-# Secondary toolbar and context menu
-tools.title=ಉಪಕರಣಗಳು
-tools_label=ಉಪಕರಣಗಳು
-first_page.title=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು
-first_page.label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು
-first_page_label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು
-last_page.title=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು
-last_page.label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು
-last_page_label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು
-page_rotate_cw.title=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು
-page_rotate_cw.label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು
-page_rotate_cw_label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು
-page_rotate_ccw.title=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು
-page_rotate_ccw.label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು
-page_rotate_ccw_label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು
-
-hand_tool_enable.title=ಕೈ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು
-hand_tool_enable_label=ಕೈ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು
-hand_tool_disable.title=ಕೈ ಉಪಕರಣವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು
-hand_tool_disable_label=ಕೈ ಉಪಕರಣವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು
-
-# Document properties dialog box
-document_properties.title=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು...
-document_properties_label=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು...
-document_properties_file_name=ಕಡತದ ಹೆಸರು:
-document_properties_file_size=ಕಡತದ ಗಾತ್ರ:
-document_properties_kb={{size_kb}} KB ({{size_b}} ಬೈಟ್‍ಗಳು)
-document_properties_mb={{size_mb}} MB ({{size_b}} ಬೈಟ್‍ಗಳು)
-document_properties_title=ಶೀರ್ಷಿಕೆ:
-document_properties_author=ಕರ್ತೃ:
-document_properties_subject=ವಿಷಯ:
-document_properties_keywords=ಮುಖ್ಯಪದಗಳು:
-document_properties_creation_date=ರಚಿಸಿದ ದಿನಾಂಕ:
-document_properties_modification_date=ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=ರಚಿಸಿದವರು:
-document_properties_producer=PDF ಉತ್ಪಾದಕ:
-document_properties_version=PDF ಆವೃತ್ತಿ:
-document_properties_page_count=ಪುಟದ ಎಣಿಕೆ:
-document_properties_close=ಮುಚ್ಚು
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು
-toggle_sidebar_label=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು
-outline.title=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆಯನ್ನು ತೋರಿಸು
-outline_label=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ
-attachments.title=ಲಗತ್ತುಗಳನ್ನು ತೋರಿಸು
-attachments_label=ಲಗತ್ತುಗಳು
-thumbs.title=ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು
-thumbs_label=ಚಿಕ್ಕಚಿತ್ರಗಳು
-findbar.title=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು
-findbar_label=ಹುಡುಕು
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=ಪುಟ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು {{page}}
-
-# Find panel button title and messages
-find_label=ಹುಡುಕು:
-find_previous.title=ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು
-find_previous_label=ಹಿಂದಿನ
-find_next.title=ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು
-find_next_label=ಮುಂದಿನ
-find_highlight=ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು
-find_match_case_label=ಕೇಸನ್ನು ಹೊಂದಿಸು
-find_reached_top=ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು
-find_reached_bottom=ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು
-find_not_found=ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ
-
-# Error panel labels
-error_more_info=ಹೆಚ್ಚಿನ ಮಾಹಿತಿ
-error_less_info=ಕಡಿಮೆ ಮಾಹಿತಿ
-error_close=ಮುಚ್ಚು
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=ಸಂದೇಶ: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=ರಾಶಿ: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ಕಡತ: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=ಸಾಲು: {{line}}
-rendering_error=ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.
-
-# Predefined zoom values
-page_scale_width=ಪುಟದ ಅಗಲ
-page_scale_fit=ಪುಟದ ಸರಿಹೊಂದಿಕೆ
-page_scale_auto=ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ
-page_scale_actual=ನಿಜವಾದ ಗಾತ್ರ
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=ದೋಷ
-loading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.
-invalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ.
-missing_file_error=PDF ಕಡತ ಇಲ್ಲ.
-unexpected_response_error=ಅನಿರೀಕ್ಷಿತವಾದ ಪೂರೈಕೆಗಣಕದ ಪ್ರತಿಕ್ರಿಯೆ.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} ಟಿಪ್ಪಣಿ]
-password_label=PDF ಅನ್ನು ತೆರೆಯಲು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ.
-password_invalid=ಅಮಾನ್ಯವಾದ ಗುಪ್ತಪದ, ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.
-password_ok=OK
-password_cancel=ರದ್ದು ಮಾಡು
-
-printing_not_supported=ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ.
-printing_not_ready=ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ.
-web_fonts_disabled=ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.
-document_colors_disabled=PDF ದಸ್ತಾವೇಜುಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣಗಳನ್ನು ಬಳಸಲು ಅನುಮತಿ ಇರುವುದಿಲ್ಲ: 'ಪುಟಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಅನುಮತಿಸು' ಅನ್ನು ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುತ್ತದೆ.
diff --git a/public/pfd/build/generic/web/locale/ko/viewer.properties b/public/pfd/build/generic/web/locale/ko/viewer.properties
deleted file mode 100644
index eca6ffa..0000000
--- a/public/pfd/build/generic/web/locale/ko/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=이전 페이지
-previous_label=이전
-next.title=다음 페이지
-next_label=다음
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=페이지:
-page_of=/{{pageCount}}
-
-zoom_out.title=축소
-zoom_out_label=축소
-zoom_in.title=확대
-zoom_in_label=확대
-zoom.title=크기
-print.title=인쇄
-print_label=인쇄
-presentation_mode.title=발표 모드로 전환
-presentation_mode_label=발표 모드
-open_file.title=파일 열기
-open_file_label=열기
-download.title=다운로드
-download_label=다운로드
-bookmark.title=지금 보이는 그대로 (복사하거나 새 창에 열기)
-bookmark_label=지금 보이는 그대로
-
-# Secondary toolbar and context menu
-tools.title=도구
-tools_label=도구
-first_page.title=첫 페이지로 이동
-first_page.label=첫 페이지로 이동
-first_page_label=첫 페이지로 이동
-last_page.title=마지막 페이지로 이동
-last_page.label=마지막 페이지로 이동
-last_page_label=마지막 페이지로 이동
-page_rotate_cw.title=시계방향으로 회전
-page_rotate_cw.label=시계방향으로 회전
-page_rotate_cw_label=시계방향으로 회전
-page_rotate_ccw.title=시계 반대방향으로 회전
-page_rotate_ccw.label=시계 반대방향으로 회전
-page_rotate_ccw_label=시계 반대방향으로 회전
-
-hand_tool_enable.title=손 도구 켜기
-hand_tool_enable_label=손 도구 켜기
-hand_tool_disable.title=손 도구 끄기
-hand_tool_disable_label=손 도구 끄기
-
-# Document properties dialog box
-document_properties.title=문서 속성…
-document_properties_label=문서 속성…
-document_properties_file_name=파일 이름:
-document_properties_file_size=파일 사이즈:
-document_properties_kb={{size_kb}} KB ({{size_b}}바이트)
-document_properties_mb={{size_mb}} MB ({{size_b}}바이트)
-document_properties_title=제목:
-document_properties_author=저자:
-document_properties_subject=주제:
-document_properties_keywords=키워드:
-document_properties_creation_date=생성일:
-document_properties_modification_date=수정일:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=생성자:
-document_properties_producer=PDF 생성기:
-document_properties_version=PDF 버전:
-document_properties_page_count=총 페이지:
-document_properties_close=닫기
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=탐색창 열고 닫기
-toggle_sidebar_label=탐색창 열고 닫기
-outline.title=문서 개요 보기
-outline_label=문서 개요
-attachments.title=첨부파일 보기
-attachments_label=첨부파일
-thumbs.title=미리보기
-thumbs_label=미리보기
-findbar.title=검색
-findbar_label=검색
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title={{page}}쪽
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}}쪽 미리보기
-
-# Find panel button title and messages
-find_label=검색:
-find_previous.title=지정 문자열에 일치하는 1개 부분을 검색
-find_previous_label=이전
-find_next.title=지정 문자열에 일치하는 다음 부분을 검색
-find_next_label=다음
-find_highlight=모두 강조 표시
-find_match_case_label=대문자/소문자 구별
-find_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다.
-find_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다.
-find_not_found=검색 결과 없음
-
-# Error panel labels
-error_more_info=정보 더 보기
-error_less_info=정보 간단히 보기
-error_close=닫기
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (빌드: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=메시지: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=스택: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=파일: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=줄 번호: {{line}}
-rendering_error=페이지를 렌더링하다 오류가 났습니다.
-
-# Predefined zoom values
-page_scale_width=페이지 너비에 맞춤
-page_scale_fit=페이지에 맞춤
-page_scale_auto=알아서 맞춤
-page_scale_actual=실제 크기에 맞춤
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=오류
-loading_error=PDF를 읽는 중 오류가 생겼습니다.
-invalid_file_error=유효하지 않거나 파손된 PDF 파일
-missing_file_error=PDF 파일이 없습니다.
-unexpected_response_error=알 수 없는 서버 응답입니다.
-
-# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
-# "{{[type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} 주석]
-password_label=이 PDF 파일을 열 수 있는 암호를 입력하십시오.
-password_invalid=잘못된 암호입니다. 다시 시도해 주십시오.
-password_ok=확인
-password_cancel=취소
-
-printing_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다.
-printing_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다.
-web_fonts_disabled=웹 폰트가 꺼져있음: 내장된 PDF 글꼴을 쓸 수 없습니다.
-document_colors_disabled=PDF 문서의 색상을 쓰지 못하게 되어 있음: \'웹 페이지 자체 색상 사용 허용\'이 브라우저에서 꺼져 있습니다.
diff --git a/public/pfd/build/generic/web/locale/ku/viewer.properties b/public/pfd/build/generic/web/locale/ku/viewer.properties
deleted file mode 100644
index c614fa1..0000000
--- a/public/pfd/build/generic/web/locale/ku/viewer.properties
+++ /dev/null
@@ -1,139 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Rûpela berê
-previous_label=Paşve
-next.title=Rûpela pêş
-next_label=Pêş
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Rûpel:
-page_of=/ {{pageCount}}
-
-zoom_out.title=Dûr bike
-zoom_out_label=Dûr bike
-zoom_in.title=Nêzîk bike
-zoom_in_label=Nêzîk bike
-zoom.title=Nêzîk Bike
-presentation_mode.title=Derbasî mûda pêşkêşkariyê bibe
-presentation_mode_label=Moda Pêşkêşkariyê
-open_file.title=Pelî veke
-open_file_label=Veke
-print.title=Çap bike
-print_label=Çap bike
-download.title=Jêbar bike
-download_label=Jêbar bike
-bookmark.title=Xuyakirina niha (kopî yan jî di pencereyeke nû de veke)
-bookmark_label=Xuyakirina niha
-
-# Secondary toolbar and context menu
-tools.title=Amûr
-tools_label=Amûr
-first_page.title=Here rûpela yekemîn
-first_page.label=Here rûpela yekemîn
-first_page_label=Here rûpela yekemîn
-last_page.title=Here rûpela dawîn
-last_page.label=Here rûpela dawîn
-last_page_label=Here rûpela dawîn
-page_rotate_cw.title=Bi aliyê saetê ve bizivirîne
-page_rotate_cw.label=Bi aliyê saetê ve bizivirîne
-page_rotate_cw_label=Bi aliyê saetê ve bizivirîne
-page_rotate_ccw.title=Berevajî aliyê saetê ve bizivirîne
-page_rotate_ccw.label=Berevajî aliyê saetê ve bizivirîne
-page_rotate_ccw_label=Berevajî aliyê saetê ve bizivirîne
-
-
-# Document properties dialog box
-document_properties_title=Sernav:
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Darikê kêlekê veke/bigire
-toggle_sidebar_label=Darikê kêlekê veke/bigire
-outline.title=Şemaya belgeyê nîşan bide
-outline_label=Şemaya belgeyê
-thumbs.title=Wênekokan nîşan bide
-thumbs_label=Wênekok
-findbar.title=Di belgeyê de bibîne
-findbar_label=Bibîne
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Rûpel {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Wênekoka rûpelê {{page}}
-
-# Find panel button title and messages
-find_label=Bibîne:
-find_previous.title=Peyva berê bibîne
-find_previous_label=Paşve
-find_next.title=Peyya pêş bibîne
-find_next_label=Pêşve
-find_highlight=Tevî beloq bike
-find_match_case_label=Ji bo tîpên hûrdek-girdek bihîstyar
-find_reached_top=Gihîşt serê rûpelê, ji dawiya rûpelê bidomîne
-find_reached_bottom=Gihîşt dawiya rûpelê, ji serê rûpelê bidomîne
-find_not_found=Peyv nehat dîtin
-
-# Error panel labels
-error_more_info=Zêdetir agahî
-error_less_info=Zêdetir agahî
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js versiyon {{version}} (avanî: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Peyam: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Komik: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Pel: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Rêzik: {{line}}
-rendering_error=Di vehûrandina rûpelê de çewtî çêbû.
-
-# Predefined zoom values
-page_scale_width=Firehiya rûpelê
-page_scale_fit=Di rûpelê de bicî bike
-page_scale_auto=Xweber nêzîk bike
-page_scale_actual=Mezinahiya rastîn
-
-# Loading indicator messages
-loading_error_indicator=Xeletî
-loading_error=Dema ku PDF dihat barkirin çewtiyek çêbû.
-invalid_file_error=Pelê PDFê nederbasdar yan jî xirabe ye.
-missing_file_error=Pelê PDFê kêm e.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Nîşaneya {{type}}ê]
-password_label=Ji bo PDFê vekî şîfreyê binivîse.
-password_invalid=Şîfre çewt e. Tika ye dîsa biceribîne.
-password_ok=Temam
-password_cancel=Betal
-
-printing_not_supported=Hişyarî: Çapkirin ji hêla vê gerokê ve bi temamî nayê destekirin.
-printing_not_ready=Hişyarî: PDF bi temamî nehat barkirin û ji bo çapê ne amade ye.
-web_fonts_disabled=Fontên Webê neçalak in: Fontên PDFê yên veşartî nayên bikaranîn.
-document_colors_disabled=Destûr tune ye ku belgeyên PDFê rengên xwe bi kar bînin: Di gerokê de 'destûrê bide rûpelan ku rengên xwe bi kar bînin' nehatiye çalakirin.
diff --git a/public/pfd/build/generic/web/locale/lg/viewer.properties b/public/pfd/build/generic/web/locale/lg/viewer.properties
deleted file mode 100644
index 5c88487..0000000
--- a/public/pfd/build/generic/web/locale/lg/viewer.properties
+++ /dev/null
@@ -1,103 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Omuko  Ogubadewo
-next.title=Omuko Oguddako
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Omuko:
-page_of=ku {{pageCount}}
-
-zoom_out.title=Zimbulukusa
-zoom_out_label=Zimbulukusa
-zoom_in.title=Funza Munda
-zoom_in_label=Funza Munda
-zoom.title=Gezzamu
-open_file.title=Bikula Fayiro
-open_file_label=Ggulawo
-print.title=Fulumya
-print_label=Fulumya
-download.title=Tikula
-download_label=Tikula
-bookmark.title=Endabika eriwo (koppa oba gulawo mu diriisa epya)
-bookmark_label=Endabika Eriwo
-
-# Secondary toolbar and context menu
-
-
-# Document properties dialog box
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-outline.title=Laga Ensalo ze Kiwandiko
-outline_label=Ensalo ze Ekiwandiko
-thumbs.title=Laga Ekifanyi Mubufunze
-thumbs_label=Ekifanyi Mubufunze
-findbar_label=Zuula
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Omuko {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Ekifananyi kyo Omuko Mubufunze {{page}}
-
-# Find panel button title and messages
-find_previous.title=Zuula awayise mukweddamu mumiteddera
-find_next.title=Zuula ekidako mukweddamu mumiteddera
-find_highlight=Londa byonna
-find_not_found=Emiteddera tezuuliddwa
-
-# Error panel labels
-error_more_info=Ebisingawo
-error_less_info=Mubumpimpi
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Obubaaka: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Ebipangiddwa: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fayiro {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Layini: {{line}}
-rendering_error=Wabadewo ensobi muku tekawo omuko.
-
-# Predefined zoom values
-page_scale_width=Obugazi bwo Omuko
-page_scale_fit=Okutuka kwo Omuko
-page_scale_auto=Okwefunza no Kwegeza
-page_scale_actual=Obunene Obutufu
-
-# Loading indicator messages
-loading_error_indicator=Ensobi
-loading_error=Wabadewo ensobi mukutika PDF.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Enyonyola]
-password_ok=OK
-password_cancel=Sazaamu
-
-printing_not_supported=Okulaabula: Okulumya empapula tekuwagirwa enonyeso enno.
diff --git a/public/pfd/build/generic/web/locale/lij/viewer.properties b/public/pfd/build/generic/web/locale/lij/viewer.properties
deleted file mode 100644
index dbab0a7..0000000
--- a/public/pfd/build/generic/web/locale/lij/viewer.properties
+++ /dev/null
@@ -1,116 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-previous.title = Pàgina precedénte
-previous_label = Precedénte
-next.title = Pàgina dòppo
-next_label = Pròscima
-page_label = Pàgina:
-page_of = de {{pageCount}}
-zoom_out.title = Diminoìsci zoom
-zoom_out_label = Diminoìsci zoom
-zoom_in.title = Aoménta zoom
-zoom_in_label = Aoménta zoom
-zoom.title = Zoom
-print.title = Stànpa
-print_label = Stànpa
-open_file.title = Àrvi file
-open_file_label = Àrvi
-download.title = Descaregaménto
-download_label = Descaregaménto
-bookmark.title = Vixón corénte (còpia ò àrvi inte 'n nêuvo barcón)
-bookmark_label = Vixón corénte
-outline.title = Véddi strutûa documénto
-outline_label = Strutûa documénto
-thumbs.title = Móstra miniatûe
-thumbs_label = Miniatûe
-thumb_page_title = Pàgina {{page}}
-thumb_page_canvas = Miniatûa da pàgina {{page}}
-error_more_info = Ciù informaçioìn
-error_less_info = Mêno informaçioìn
-error_version_info = PDF.js v{{version}} (build: {{build}})
-error_close = Særa
-missing_file_error = O file PDF o no gh'é.
-toggle_sidebar.title = Atîva/dizatîva bâra de sciànco
-toggle_sidebar_label = Atîva/dizatîva bâra de sciànco
-error_message = Mesàggio: {{message}}
-error_stack = Stack: {{stack}}
-error_file = File: {{file}}
-error_line = Lìnia: {{line}}
-rendering_error = Gh'é stæto 'n'erô itno rendering da pàgina.
-page_scale_width = Larghéssa pàgina
-page_scale_fit = Adàtta a una pàgina
-page_scale_auto = Zoom aotomàtico
-page_scale_actual = Dimenscioìn efetîve
-loading_error_indicator = Erô
-loading_error = S'é verificòu 'n'erô itno caregaménto do PDF.
-printing_not_supported = Atençión: a stànpa a no l'é conpletaménte soportâ da sto navegatô.
-
-# Context menu
-page_rotate_cw.label=Gîa in sénso do reléuio
-page_rotate_ccw.label=Gîa in sénso do reléuio a-a revèrsa
-
-presentation_mode.title=Vànni into mòddo de prezentaçión
-presentation_mode_label=Mòddo de prezentaçión
-
-find_label = Trêuva:
-find_previous.title = Trêuva a ripetiçión precedénte do tèsto da çercâ
-find_previous_label = Precedénte
-find_next.title = Trêuva a ripetiçión dòppo do tèsto da çercâ
-find_next_label = Segoénte
-find_highlight = Evidénçia
-find_match_case_label = Maióscole/minóscole
-find_reached_bottom = Razónto l'inìçio da pàgina, contìnoa da-a fìn
-find_reached_top = Razónto a fìn da pàgina, contìnoa da l'inìçio
-find_not_found = Tèsto no trovòu
-findbar.title = Trêuva into documénto
-findbar_label = Trêuva
-first_page.label = Vànni a-a prìmma pàgina
-last_page.label = Vànni a l'ùrtima pàgina
-invalid_file_error = O file PDF o l'é no vàlido ò aroinòu.
-
-web_fonts_disabled = I font do web én dizativæ: inposcìbile adêuviâ i caràteri do PDF.
-printing_not_ready = Atençión: o PDF o no l'é ancón caregòu conpletaménte pe-a stànpa.
-
-document_colors_disabled = No l'é poscìbile adêuviâ i pròpi coî pe-i documénti PDF: l'opçión do navegatô 'Permètti a-e pàgine de çèrne i pròpi coî in càngio de quélli inpostæ' a l'é dizativâ.
-text_annotation_type.alt = [Anotaçión: {{type}}]
-
-first_page.title = Vànni a-a prìmma pàgina
-first_page_label = Vànni a-a prìmma pàgina
-last_page.title = Vànni a l'ùrtima pàgina
-last_page_label = Vànni a l'ùrtima pàgina
-page_rotate_ccw.title = Gîa into vèrso antiorâio
-page_rotate_ccw_label = Gîa into vèrso antiorâio
-page_rotate_cw.title = Gîa into vèrso orâio
-page_rotate_cw_label = Gîa into vèrso orâio
-tools.title = Struménti
-tools_label = Struménti
-password_label = Dìmme a paròlla segrêta pe arvî sto file PDF.
-password_invalid = Paròlla segrêta sbaliâ. Prêuva tórna.
-password_ok = Va bén
-password_cancel = Anùlla
-
-document_properties.title = Propietæ do documénto…
-document_properties_label = Propietæ do documénto…
-document_properties_file_name = Nómme file:
-document_properties_file_size = Dimensción file:
-document_properties_kb = {{size_kb}} kB ({{size_b}} byte)
-document_properties_mb = {{size_kb}} MB ({{size_b}} byte)
-document_properties_title = Tìtolo:
-document_properties_author = Aotô:
-document_properties_subject = Ogétto:
-document_properties_keywords = Paròlle ciâve:
-document_properties_creation_date = Dæta creaçión:
-document_properties_modification_date = Dæta cangiaménto:
-document_properties_date_string = {{date}}, {{time}}
-document_properties_creator = Aotô originâle:
-document_properties_producer = Produtô PDF:
-document_properties_version = Versción PDF:
-document_properties_page_count = Contézzo pàgine:
-document_properties_close = Særa
-
-hand_tool_enable.title = Atîva struménto màn
-hand_tool_enable_label = Atîva struménto màn
-hand_tool_disable.title = Dizatîva struménto màn
-hand_tool_disable_label = Dizatîva struménto màn
diff --git a/public/pfd/build/generic/web/locale/locale.properties b/public/pfd/build/generic/web/locale/locale.properties
deleted file mode 100644
index 9aded1b..0000000
--- a/public/pfd/build/generic/web/locale/locale.properties
+++ /dev/null
@@ -1,312 +0,0 @@
-[ach]
-@import url(ach/viewer.properties)
-
-[af]
-@import url(af/viewer.properties)
-
-[ak]
-@import url(ak/viewer.properties)
-
-[an]
-@import url(an/viewer.properties)
-
-[ar]
-@import url(ar/viewer.properties)
-
-[as]
-@import url(as/viewer.properties)
-
-[ast]
-@import url(ast/viewer.properties)
-
-[az]
-@import url(az/viewer.properties)
-
-[be]
-@import url(be/viewer.properties)
-
-[bg]
-@import url(bg/viewer.properties)
-
-[bn-BD]
-@import url(bn-BD/viewer.properties)
-
-[bn-IN]
-@import url(bn-IN/viewer.properties)
-
-[br]
-@import url(br/viewer.properties)
-
-[bs]
-@import url(bs/viewer.properties)
-
-[ca]
-@import url(ca/viewer.properties)
-
-[cs]
-@import url(cs/viewer.properties)
-
-[csb]
-@import url(csb/viewer.properties)
-
-[cy]
-@import url(cy/viewer.properties)
-
-[da]
-@import url(da/viewer.properties)
-
-[de]
-@import url(de/viewer.properties)
-
-[el]
-@import url(el/viewer.properties)
-
-[en-GB]
-@import url(en-GB/viewer.properties)
-
-[en-US]
-@import url(en-US/viewer.properties)
-
-[en-ZA]
-@import url(en-ZA/viewer.properties)
-
-[eo]
-@import url(eo/viewer.properties)
-
-[es-AR]
-@import url(es-AR/viewer.properties)
-
-[es-CL]
-@import url(es-CL/viewer.properties)
-
-[es-ES]
-@import url(es-ES/viewer.properties)
-
-[es-MX]
-@import url(es-MX/viewer.properties)
-
-[et]
-@import url(et/viewer.properties)
-
-[eu]
-@import url(eu/viewer.properties)
-
-[fa]
-@import url(fa/viewer.properties)
-
-[ff]
-@import url(ff/viewer.properties)
-
-[fi]
-@import url(fi/viewer.properties)
-
-[fr]
-@import url(fr/viewer.properties)
-
-[fy-NL]
-@import url(fy-NL/viewer.properties)
-
-[ga-IE]
-@import url(ga-IE/viewer.properties)
-
-[gd]
-@import url(gd/viewer.properties)
-
-[gl]
-@import url(gl/viewer.properties)
-
-[gu-IN]
-@import url(gu-IN/viewer.properties)
-
-[he]
-@import url(he/viewer.properties)
-
-[hi-IN]
-@import url(hi-IN/viewer.properties)
-
-[hr]
-@import url(hr/viewer.properties)
-
-[hu]
-@import url(hu/viewer.properties)
-
-[hy-AM]
-@import url(hy-AM/viewer.properties)
-
-[id]
-@import url(id/viewer.properties)
-
-[is]
-@import url(is/viewer.properties)
-
-[it]
-@import url(it/viewer.properties)
-
-[ja]
-@import url(ja/viewer.properties)
-
-[ka]
-@import url(ka/viewer.properties)
-
-[kk]
-@import url(kk/viewer.properties)
-
-[km]
-@import url(km/viewer.properties)
-
-[kn]
-@import url(kn/viewer.properties)
-
-[ko]
-@import url(ko/viewer.properties)
-
-[ku]
-@import url(ku/viewer.properties)
-
-[lg]
-@import url(lg/viewer.properties)
-
-[lij]
-@import url(lij/viewer.properties)
-
-[lt]
-@import url(lt/viewer.properties)
-
-[lv]
-@import url(lv/viewer.properties)
-
-[mai]
-@import url(mai/viewer.properties)
-
-[mk]
-@import url(mk/viewer.properties)
-
-[ml]
-@import url(ml/viewer.properties)
-
-[mn]
-@import url(mn/viewer.properties)
-
-[mr]
-@import url(mr/viewer.properties)
-
-[ms]
-@import url(ms/viewer.properties)
-
-[my]
-@import url(my/viewer.properties)
-
-[nb-NO]
-@import url(nb-NO/viewer.properties)
-
-[nl]
-@import url(nl/viewer.properties)
-
-[nn-NO]
-@import url(nn-NO/viewer.properties)
-
-[nso]
-@import url(nso/viewer.properties)
-
-[oc]
-@import url(oc/viewer.properties)
-
-[or]
-@import url(or/viewer.properties)
-
-[pa-IN]
-@import url(pa-IN/viewer.properties)
-
-[pl]
-@import url(pl/viewer.properties)
-
-[pt-BR]
-@import url(pt-BR/viewer.properties)
-
-[pt-PT]
-@import url(pt-PT/viewer.properties)
-
-[rm]
-@import url(rm/viewer.properties)
-
-[ro]
-@import url(ro/viewer.properties)
-
-[ru]
-@import url(ru/viewer.properties)
-
-[rw]
-@import url(rw/viewer.properties)
-
-[sah]
-@import url(sah/viewer.properties)
-
-[si]
-@import url(si/viewer.properties)
-
-[sk]
-@import url(sk/viewer.properties)
-
-[sl]
-@import url(sl/viewer.properties)
-
-[son]
-@import url(son/viewer.properties)
-
-[sq]
-@import url(sq/viewer.properties)
-
-[sr]
-@import url(sr/viewer.properties)
-
-[sv-SE]
-@import url(sv-SE/viewer.properties)
-
-[sw]
-@import url(sw/viewer.properties)
-
-[ta]
-@import url(ta/viewer.properties)
-
-[ta-LK]
-@import url(ta-LK/viewer.properties)
-
-[te]
-@import url(te/viewer.properties)
-
-[th]
-@import url(th/viewer.properties)
-
-[tl]
-@import url(tl/viewer.properties)
-
-[tn]
-@import url(tn/viewer.properties)
-
-[tr]
-@import url(tr/viewer.properties)
-
-[uk]
-@import url(uk/viewer.properties)
-
-[ur]
-@import url(ur/viewer.properties)
-
-[vi]
-@import url(vi/viewer.properties)
-
-[wo]
-@import url(wo/viewer.properties)
-
-[xh]
-@import url(xh/viewer.properties)
-
-[zh-CN]
-@import url(zh-CN/viewer.properties)
-
-[zh-TW]
-@import url(zh-TW/viewer.properties)
-
-[zu]
-@import url(zu/viewer.properties)
-
diff --git a/public/pfd/build/generic/web/locale/lt/viewer.properties b/public/pfd/build/generic/web/locale/lt/viewer.properties
deleted file mode 100644
index c78f443..0000000
--- a/public/pfd/build/generic/web/locale/lt/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Ankstesnis puslapis
-previous_label=Ankstesnis
-next.title=Kitas puslapis
-next_label=Kitas
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Puslapis:
-page_of=iš {{pageCount}}
-
-zoom_out.title=Sumažinti
-zoom_out_label=Sumažinti
-zoom_in.title=Padidinti
-zoom_in_label=Padidinti
-zoom.title=Mastelis
-presentation_mode.title=Pereiti į pateikties veikseną
-presentation_mode_label=Pateikties veiksena
-open_file.title=Atverti failą
-open_file_label=Atverti
-print.title=Spausdinti
-print_label=Spausdinti
-download.title=Parsiųsti
-download_label=Parsiųsti
-bookmark.title=Esamojo rodinio saitas (kopijavimui ar atvėrimui kitame lange)
-bookmark_label=Esamasis rodinys
-
-# Secondary toolbar and context menu
-tools.title=Priemonės
-tools_label=Priemonės
-first_page.title=Eiti į pirmą puslapį
-first_page.label=Eiti į pirmą puslapį
-first_page_label=Eiti į pirmą puslapį
-last_page.title=Eiti į paskutinį puslapį
-last_page.label=Eiti į paskutinį puslapį
-last_page_label=Eiti į paskutinį puslapį
-page_rotate_cw.title=Pasukti pagal laikrodžio rodyklę
-page_rotate_cw.label=Pasukti pagal laikrodžio rodyklę
-page_rotate_cw_label=Pasukti pagal laikrodžio rodyklę
-page_rotate_ccw.title=Pasukti prieš laikrodžio rodyklę
-page_rotate_ccw.label=Pasukti prieš laikrodžio rodyklę
-page_rotate_ccw_label=Pasukti prieš laikrodžio rodyklę
-
-hand_tool_enable.title=Įgalinti vilkimo veikseną
-hand_tool_enable_label=Įgalinti vilkimo veikseną
-hand_tool_disable.title=Išjungti vilkimo veikseną
-hand_tool_disable_label=Išjungti vilkimo veikseną
-
-# Document properties dialog box
-document_properties.title=Dokumento savybės…
-document_properties_label=Dokumento savybės…
-document_properties_file_name=Failo vardas:
-document_properties_file_size=Failo dydis:
-document_properties_kb={{size_kb}} KB ({{size_b}} B)
-document_properties_mb={{size_mb}} MB ({{size_b}} B)
-document_properties_title=Antraštė:
-document_properties_author=Autorius:
-document_properties_subject=Tema:
-document_properties_keywords=Reikšminiai žodžiai:
-document_properties_creation_date=Sukūrimo data:
-document_properties_modification_date=Modifikavimo data:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Kūrėjas:
-document_properties_producer=PDF generatorius:
-document_properties_version=PDF versija:
-document_properties_page_count=Puslapių skaičius:
-document_properties_close=Užverti
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Rodyti / slėpti šoninį polangį
-toggle_sidebar_label=Šoninis polangis
-outline.title=Rodyti dokumento metmenis
-outline_label=Dokumento metmenys
-attachments.title=Rodyti priedus
-attachments_label=Priedai
-thumbs.title=Rodyti puslapių miniatiūras
-thumbs_label=Miniatiūros
-findbar.title=Ieškoti dokumente
-findbar_label=Ieškoti
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title={{page}} puslapis
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}} puslapio miniatiūra
-
-# Find panel button title and messages
-find_label=Ieškoti:
-find_previous.title=Ieškoti ankstesnio frazės egzemplioriaus
-find_previous_label=Ankstesnis
-find_next.title=Ieškoti tolesnio frazės egzemplioriaus
-find_next_label=Tolesnis
-find_highlight=Viską paryškinti
-find_match_case_label=Skirti didžiąsias ir mažąsias raides
-find_reached_top=Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos
-find_reached_bottom=Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios
-find_not_found=Ieškoma frazė nerasta
-
-# Error panel labels
-error_more_info=Išsamiau
-error_less_info=Glausčiau
-error_close=Užverti
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v. {{version}} (darinys: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Pranešimas: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Dėklas: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Failas: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Eilutė: {{line}}
-rendering_error=Atvaizduojant puslapį, įvyko klaida.
-
-# Predefined zoom values
-page_scale_width=Priderinti prie lapo pločio
-page_scale_fit=Pritaikyti prie lapo dydžio
-page_scale_auto=Automatinis mastelis
-page_scale_actual=Tikras dydis
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Klaida
-loading_error=Įkeliant PDF failą, įvyko klaida.
-invalid_file_error=Tai nėra PDF failas arba jis yra sugadintas.
-missing_file_error=PDF failas nerastas.
-unexpected_response_error=Netikėtas serverio atsakas.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[„{{type}}“ tipo anotacija]
-password_label=Įveskite slaptažodį šiam PDF failui atverti.
-password_invalid=Slaptažodis neteisingas. Bandykite dar kartą.
-password_ok=Gerai
-password_cancel=Atsisakyti
-
-printing_not_supported=Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas.
-printing_not_ready=Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui.
-web_fonts_disabled=Neįgalinti saityno šriftai – šiame PDF faile esančių šriftų naudoti negalima.
-document_colors_disabled=PDF dokumentams neleidžiama nurodyti savo spalvų, nes išjungta naršyklės nuostata „Leisti tinklalapiams nurodyti spalvas“.
diff --git a/public/pfd/build/generic/web/locale/lv/viewer.properties b/public/pfd/build/generic/web/locale/lv/viewer.properties
deleted file mode 100644
index ba57762..0000000
--- a/public/pfd/build/generic/web/locale/lv/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Iepriekšējā lapa
-previous_label=Iepriekšējā
-next.title=Nākamā lapa
-next_label=Nākamā
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Lapa:
-page_of=no {{pageCount}}
-
-zoom_out.title=Attālināt\u0020
-zoom_out_label=Attālināt
-zoom_in.title=Pietuvināt
-zoom_in_label=Pietuvināt
-zoom.title=Palielinājums
-presentation_mode.title=Pārslēgties uz Prezentācijas režīmu
-presentation_mode_label=Prezentācijas režīms
-open_file.title=Atvērt failu
-open_file_label=Atvērt
-print.title=Drukāšana
-print_label=Drukāt
-download.title=Lejupielāde
-download_label=Lejupielādēt
-bookmark.title=Pašreizējais skats (kopēt vai atvērt jaunā logā)
-bookmark_label=Pašreizējais skats
-
-# Secondary toolbar and context menu
-tools.title=Rīki
-tools_label=Rīki
-first_page.title=Iet uz pirmo lapu
-first_page.label=Iet uz pirmo lapu
-first_page_label=Iet uz pirmo lapu
-last_page.title=Iet uz pēdējo lapu
-last_page.label=Iet uz pēdējo lapu
-last_page_label=Iet uz pēdējo lapu
-page_rotate_cw.title=Pagriezt pa pulksteni
-page_rotate_cw.label=Pagriezt pa pulksteni
-page_rotate_cw_label=Pagriezt pa pulksteni
-page_rotate_ccw.title=Pagriezt pret pulksteni
-page_rotate_ccw.label=Pagriezt pret pulksteni
-page_rotate_ccw_label=Pagriezt pret pulksteni
-
-hand_tool_enable.title=Aktivēt rokas rīku
-hand_tool_enable_label=Aktivēt rokas rīku
-hand_tool_disable.title=Deaktivēt rokas rīku
-hand_tool_disable_label=Deaktivēt rokas rīku
-
-# Document properties dialog box
-document_properties.title=Dokumenta iestatījumi…
-document_properties_label=Dokumenta iestatījumi…
-document_properties_file_name=Faila nosaukums:
-document_properties_file_size=Faila izmērs:
-document_properties_kb={{size_kb}} KB ({{size_b}} biti)
-document_properties_mb={{size_mb}} MB ({{size_b}} biti)
-document_properties_title=Nosaukums:
-document_properties_author=Autors:
-document_properties_subject=Tēma:
-document_properties_keywords=Atslēgas vārdi:
-document_properties_creation_date=Izveides datums:
-document_properties_modification_date=LAbošanas datums:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Radītājs:
-document_properties_producer=PDF producents:
-document_properties_version=PDF versija:
-document_properties_page_count=Lapu skaits:
-document_properties_close=Aizvērt
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Pārslēgt sānu joslu
-toggle_sidebar_label=Pārslēgt sānu joslu
-outline.title=Parādīt dokumenta saturu
-outline_label=Dokumenta saturs
-attachments.title=Rādīt pielikumus
-attachments_label=Pielikumi
-thumbs.title=Parādīt sīktēlus
-thumbs_label=Sīktēli
-findbar.title=Meklēt dokumentā
-findbar_label=Meklēt
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Lapa {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Lapas {{page}} sīktēls
-
-# Find panel button title and messages
-find_label=Meklēt:
-find_previous.title=Atrast iepriekšējo
-find_previous_label=Iepriekšējā
-find_next.title=Atrast nākamo
-find_next_label=Nākamā
-find_highlight=Iekrāsot visas
-find_match_case_label=Lielo, mazo burtu jutīgs
-find_reached_top=Sasniegts dokumenta sākums, turpinām no beigām
-find_reached_bottom=Sasniegtas dokumenta beigas, turpinām no sākuma
-find_not_found=Frāze nav atrasta
-
-# Error panel labels
-error_more_info=Vairāk informācijas
-error_less_info=MAzāk informācijas
-error_close=Close
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Ziņojums: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Steks: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=File: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Rindiņa: {{line}}
-rendering_error=Attēlojot lapu radās kļūda
-
-# Predefined zoom values
-page_scale_width=Lapas platumā
-page_scale_fit=Ietilpinot lapu
-page_scale_auto=Automātiskais izmērs
-page_scale_actual=Patiesais izmērs
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Kļūda
-loading_error=Ielādējot PDF notika kļūda.
-invalid_file_error=Nederīgs vai bojāts PDF fails.
-missing_file_error=PDF fails nav atrasts.
-unexpected_response_error=Negaidīa servera atbilde.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} anotācija]
-password_label=Ievadiet paroli, lai atvērtu PDF failu.
-password_invalid=Nepareiza parole, mēģiniet vēlreiz.
-password_ok=Labi
-password_cancel=Atcelt
-
-printing_not_supported=Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji.
-printing_not_ready=Uzmanību: PDF nav pilnībā ielādēts drukāšanai.
-web_fonts_disabled=Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus.
-document_colors_disabled=PDF dokumentiem nav atļauts izmantot pašiem savas krāsas: „Atļaut lapām izvēlēties pašām savas krāsas“ ir deaktivēts pārlūkā.
diff --git a/public/pfd/build/generic/web/locale/mai/viewer.properties b/public/pfd/build/generic/web/locale/mai/viewer.properties
deleted file mode 100644
index cebcd75..0000000
--- a/public/pfd/build/generic/web/locale/mai/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=पछिला पृष्ठ
-previous_label=पछिला
-next.title=अगिला पृष्ठ
-next_label=आगाँ
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=पृष्ठ:
-page_of={{pageCount}} क
-
-zoom_out.title=छोट करू
-zoom_out_label=छोट करू
-zoom_in.title=पैघ करू
-zoom_in_label=जूम इन
-zoom.title=छोट-पैघ करू\u0020
-presentation_mode.title=प्रस्तुति अवस्थामे जाउ
-presentation_mode_label=प्रस्तुति अवस्था
-open_file.title=फाइल खोलू
-open_file_label=खोलू
-print.title=छापू
-print_label=छापू
-download.title=डाउनलोड
-download_label=डाउनलोड
-bookmark.title=मोजुदा दृश्य (नव विंडोमे नकल लिअ अथवा खोलू)
-bookmark_label=वर्तमान दृश्य
-
-# Secondary toolbar and context menu
-tools.title=अओजार
-tools_label=अओजार
-first_page.title=प्रथम पृष्ठ पर जाउ
-first_page.label=प्रथम पृष्ठ पर जाउ
-first_page_label=प्रथम पृष्ठ पर जाउ
-last_page.title=अंतिम पृष्ठ पर जाउ
-last_page.label=अंतिम पृष्ठ पर जाउ
-last_page_label=अंतिम पृष्ठ पर जाउ
-page_rotate_cw.title=घड़ीक दिशा मे घुमाउ
-page_rotate_cw.label=घड़ीक दिशा मे घुमाउ
-page_rotate_cw_label=घड़ीक दिशा मे घुमाउ
-page_rotate_ccw.title=घड़ीक दिशा सँ उनटा घुमाउ
-page_rotate_ccw.label=घड़ीक दिशा सँ उनटा घुमाउ
-page_rotate_ccw_label=घड़ीक दिशा सँ उनटा घुमाउ
-
-hand_tool_enable.title=हाथ अओजार सक्रिय करू
-hand_tool_enable_label=हाथ अओजार सक्रिय करू
-hand_tool_disable.title=हाथ अओजार निष्क्रिय कएनाइ
-hand_tool_disable_label=हाथ अओजार निष्क्रिय कएनाइ
-
-# Document properties dialog box
-document_properties.title=दस्तावेज़ विशेषता...
-document_properties_label=दस्तावेज़ विशेषता...
-document_properties_file_name=फाइल नाम:
-document_properties_file_size=फ़ाइल आकार:
-document_properties_kb={{size_kb}} KB ({{size_b}} बाइट)
-document_properties_mb={{size_mb}} MB ({{size_b}} बाइट)
-document_properties_title=शीर्षक:
-document_properties_author=लेखकः
-document_properties_subject=विषय
-document_properties_keywords=बीजशब्द
-document_properties_creation_date=निर्माण तिथि:
-document_properties_modification_date=संशोधन दिनांक:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=सृजक:
-document_properties_producer=PDF उत्पादक:
-document_properties_version=PDF संस्करण:
-document_properties_page_count=पृष्ठ गिनती:
-document_properties_close=बन्न करू
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=स्लाइडर टागल
-toggle_sidebar_label=स्लाइडर टागल
-outline.title=दस्तावेज आउटलाइन देखाउ
-outline_label=दस्तावेज खाका
-attachments.title=संलग्नक देखाबू
-attachments_label=संलग्नक
-thumbs.title=लघु-छवि देखाउ
-thumbs_label=लघु छवि
-findbar.title=दस्तावेजमे ढूँढू
-findbar_label=ताकू
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=पृष्ठ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=पृष्ठ {{page}} का लघु-चित्र
-
-# Find panel button title and messages
-find_label=ताकू:
-find_previous.title=खोजक पछिला उपस्थिति ताकू
-find_previous_label=पछिला
-find_next.title=खोजक अगिला उपस्थिति ताकू
-find_next_label=आगाँ
-find_highlight=सभटा आलोकित करू
-find_match_case_label=मिलान स्थिति
-find_reached_top=पृष्ठक शीर्ष जाए पहुँचल, तल सँ जारी
-find_reached_bottom=पृष्ठक तल मे जाए पहुँचल, शीर्ष सँ जारी
-find_not_found=वाकींश नहि भेटल
-
-# Error panel labels
-error_more_info=बेसी  सूचना
-error_less_info=कम सूचना
-error_close=बन्न करू
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=संदेश: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=स्टैक: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=फ़ाइल: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=पंक्ति: {{line}}
-rendering_error=पृष्ठ रेंडरिंगक समय त्रुटि आएल.
-
-# Predefined zoom values
-page_scale_width=पृष्ठ चओड़ाइ
-page_scale_fit=पृष्ठ फिट
-page_scale_auto=स्वचालित जूम
-page_scale_actual=सही आकार
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=त्रुटि
-loading_error=पीडीएफ लोड करैत समय एकटा त्रुटि भेल.
-invalid_file_error=अमान्य अथवा भ्रष्ट PDF फाइल.
-missing_file_error=अनुपस्थित PDF फाइल.
-unexpected_response_error=अप्रत्याशित सर्वर अनुक्रिया.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=एहि पीडीएफ फ़ाइल केँ खोलबाक लेल कृपया कूटशब्द भरू.
-password_invalid=अवैध कूटशब्द, कृपया फिनु कोशिश करू.
-password_ok=बेस
-password_cancel=रद्द  करू\u0020
-
-printing_not_supported=चेतावनी: ई ब्राउजर पर छपाइ पूर्ण तरह सँ समर्थित नहि अछि.
-printing_not_ready=चेतावनी: पीडीएफ छपाइक लेल पूर्ण तरह सँ लोड नहि अछि.
-web_fonts_disabled=वेब फॉन्ट्स निष्क्रिय अछि: अंतःस्थापित PDF फान्टसक उपयोगमे असमर्थ.
-document_colors_disabled=PDF दस्तावेज़ हुकर अपन रंग केँ उपयोग करबाक लेल अनुमति प्राप्त नहि अछि: 'पृष्ठ केँ हुकर अपन रंग केँ चुनबाक लेल स्वीकृति दिअ जे ओ ओहि ब्राउज़र मे निष्क्रिय अछि.
diff --git a/public/pfd/build/generic/web/locale/mk/viewer.properties b/public/pfd/build/generic/web/locale/mk/viewer.properties
deleted file mode 100644
index 18ded89..0000000
--- a/public/pfd/build/generic/web/locale/mk/viewer.properties
+++ /dev/null
@@ -1,126 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Претходна страница
-previous_label=Претходна
-next.title=Следна страница
-next_label=Следна
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Страница:
-page_of=од {{pageCount}}
-
-zoom_out.title=Намалување
-zoom_out_label=Намали
-zoom_in.title=Зголемување
-zoom_in_label=Зголеми
-zoom.title=Променување на големина
-print.title=Печатење
-print_label=Печати
-open_file.title=Отварање  датотека
-open_file_label=Отвори
-download.title=Преземање
-download_label=Преземи
-bookmark.title=Овој преглед (копирај или отвори во нов прозорец)
-bookmark_label=Овој преглед
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_slider.title=Вклучување на лизгач
-toggle_slider_label=Вклучи лизгач
-outline.title=Прикажување на содржина на документот
-outline_label=Содржина на документот
-thumbs.title=Прикажување на икони
-thumbs_label=Икони
-
-# Document outline messages
-no_outline=Нема содржина
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Страница {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Икона од страница {{page}}
-
-# Error panel labels
-error_more_info=Повеќе информации
-error_less_info=Помалку информации
-error_close=Затвори
-# LOCALIZATION NOTE (error_build): "{{build}}" will be replaced by the PDF.JS
-# build ID.
-error_build=PDF.JS Build: {{build}}
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Порака: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Датотека: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Линија: {{line}}
-rendering_error=Настана грешка при прикажувањето на страницата.
-
-# Predefined zoom values
-page_scale_width=Ширина на страница
-page_scale_fit=Цела страница
-page_scale_auto=Автоматска големина
-page_scale_actual=Вистинска големина
-
-loading_error_indicator=Грешка
-loading_error=Настана грешка при вчитувањето на PDF-от.
-
-# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
-# "{{[type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type=[{{type}} Забелешка]
-request_password=PDF-от е заштитен со лозинка:
-
-
-printing_not_supported=Предупредување: Печатењето не е целосно поддржано во овој прелистувач.
-
-find_highlight=Означи сѐ
-
-# Find panel button title and messages
-find_label=Најди:
-find_match_case_label=Токму така
-find_next.title=Најди ја следната појава на фразата
-find_next_label=Следно
-find_not_found=Фразата не е пронајдена
-find_previous.title=Најди ја предходната појава на фразата
-find_previous_label=Претходно
-find_reached_bottom=Барањето стигна до крајот на документот и почнува од почеток
-find_reached_top=Барањето стигна до почетокот на документот и почнува од крајот
-findbar.title=Најди во документот
-findbar_label=Најди
-
-# Context menu
-first_page.label=Оди до првата страница
-invalid_file_error=Невалидна или корумпирана PDF датотека.
-last_page.label=Оди до последната страница
-page_rotate_ccw.label=Ротирај спротивно од стрелките на часовникот
-page_rotate_cw.label=Ротирај по стрелките на часовникот
-presentation_mode.title=Премини во презентациски режим
-presentation_mode_label=Презентациски режим
-
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-missing_file_error=Недостасува PDF документ.
-printing_not_ready=Предупредување: PDF документот не е целосно вчитан за печатење.
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Вклучи странична лента
-toggle_sidebar_label=Вклучи странична лента
-web_fonts_disabled=Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови.
diff --git a/public/pfd/build/generic/web/locale/ml/viewer.properties b/public/pfd/build/generic/web/locale/ml/viewer.properties
deleted file mode 100644
index 1e17a8a..0000000
--- a/public/pfd/build/generic/web/locale/ml/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=മുമ്പുള്ള താള്‍
-previous_label=മുമ്പു്
-next.title=അടുത്ത താള്‍
-next_label=അടുത്തതു്
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=താള്‍:
-page_of={{pageCount}}
-
-zoom_out.title=ചെറുതാക്കുക
-zoom_out_label=ചെറുതാക്കുക
-zoom_in.title=വലുതാക്കുക
-zoom_in_label=വലുതാക്കുക
-zoom.title=വ്യാപ്തി മാറ്റുക
-presentation_mode.title=പ്രസന്റേഷന്‍ രീതിയിലേക്കു് മാറ്റുക
-presentation_mode_label=പ്രസന്റേഷന്‍ രീതി
-open_file.title=ഫയല്‍ തുറക്കുക
-open_file_label=തുറക്കുക
-print.title=പ്രിന്റ് ചെയ്യുക
-print_label=പ്രിന്റ് ചെയ്യുക
-download.title=ഡൌണ്‍ലോഡ് ചെയ്യുക
-download_label=ഡൌണ്‍ലോഡ് ചെയ്യുക
-bookmark.title=നിലവിലുള്ള കാഴ്ച (പുതിയ ജാലകത്തില്‍ പകര്‍ത്തുക അല്ലെങ്കില്‍ തുറക്കുക)
-bookmark_label=നിലവിലുള്ള കാഴ്ച
-
-# Secondary toolbar and context menu
-tools.title=ഉപകരണങ്ങള്‍
-tools_label=ഉപകരണങ്ങള്‍
-first_page.title=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക
-first_page.label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക
-first_page_label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക
-last_page.title=അവസാന താളിലേയ്ക്കു് പോകുക
-last_page.label=അവസാന താളിലേയ്ക്കു് പോകുക
-last_page_label=അവസാന താളിലേയ്ക്കു് പോകുക
-page_rotate_cw.title=ഘടികാരദിശയില്‍ കറക്കുക
-page_rotate_cw.label=ഘടികാരദിശയില്‍ കറക്കുക
-page_rotate_cw_label=ഘടികാരദിശയില്‍ കറക്കുക
-page_rotate_ccw.title=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക
-page_rotate_ccw.label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക
-page_rotate_ccw_label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക
-
-hand_tool_enable.title=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന സജ്ജമാക്കുക
-hand_tool_enable_label=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന സജ്ജമാക്കുക
-hand_tool_disable.title=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുക
-hand_tool_disable_label=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുക
-
-# Document properties dialog box
-document_properties.title=രേഖയുടെ വിശേഷതകള്‍...
-document_properties_label=രേഖയുടെ വിശേഷതകള്‍...
-document_properties_file_name=ഫയലിന്റെ പേര്‌:
-document_properties_file_size=ഫയലിന്റെ വലിപ്പം:‌‌
-document_properties_kb={{size_kb}} കെബി ({{size_b}} ബൈറ്റുകള്‍)
-document_properties_mb={{size_mb}} എംബി ({{size_b}} ബൈറ്റുകള്‍)
-document_properties_title=തലക്കെട്ട്‌\u0020
-document_properties_author=രചയിതാവ്:
-document_properties_subject=വിഷയം:
-document_properties_keywords=കീവേര്‍ഡുകള്‍:
-document_properties_creation_date=പൂര്‍ത്തിയാകുന്ന തീയതി:
-document_properties_modification_date=മാറ്റം വരുത്തിയ തീയതി:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=സൃഷ്ടികര്‍ത്താവ്:
-document_properties_producer=പിഡിഎഫ് പ്രൊഡ്യൂസര്‍:
-document_properties_version=പിഡിഎഫ് പതിപ്പ്:
-document_properties_page_count=താളിന്റെ എണ്ണം:
-document_properties_close=അടയ്ക്കുക
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=സൈഡ് ബാറിലേക്കു് മാറ്റുക
-toggle_sidebar_label=സൈഡ് ബാറിലേക്കു് മാറ്റുക
-outline.title=രേഖയുടെ ഔട്ട്ലൈന്‍ കാണിയ്ക്കുക
-outline_label=രേഖയുടെ ഔട്ട്ലൈന്‍
-attachments.title=അറ്റാച്മെന്റുകള്‍ കാണിയ്ക്കുക
-attachments_label=അറ്റാച്മെന്റുകള്‍
-thumbs.title=തംബ്നെയിലുകള്‍ കാണിയ്ക്കുക
-thumbs_label=തംബ്നെയിലുകള്‍
-findbar.title=രേഖയില്‍ കണ്ടുപിടിയ്ക്കുക
-findbar_label=കണ്ടെത്തുക\u0020
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=താള്‍ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}} താളിനുള്ള തംബ്നെയില്‍
-
-# Find panel button title and messages
-find_label=കണ്ടെത്തുക
-find_previous.title=വാചകം ഇതിനു മുന്‍പ്‌ ആവര്‍ത്തിച്ചത്‌ കണ്ടെത്തുക\u0020
-find_previous_label=മുമ്പു്
-find_next.title=വാചകം വീണ്ടും ആവര്‍ത്തിക്കുന്നത്‌ കണ്ടെത്തുക\u0020
-find_next_label=അടുത്തതു്
-find_highlight=എല്ലാം എടുത്തുകാണിയ്ക്കുക
-find_match_case_label=അക്ഷരങ്ങള്‍ ഒത്തുനോക്കുക
-find_reached_top=രേഖയുടെ മുകളില്‍ എത്തിയിരിക്കുന്നു, താഴെ നിന്നും തുടരുന്നു
-find_reached_bottom=രേഖയുടെ അവസാനം വരെ എത്തിയിരിക്കുന്നു, മുകളില്‍ നിന്നും തുടരുന്നു\u0020
-find_not_found=വാചകം കണ്ടെത്താനായില്ല\u0020
-
-# Error panel labels
-error_more_info=കൂടുതല്‍ വിവരം
-error_less_info=കുറച്ച് വിവരം
-error_close=അടയ്ക്കുക
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=സന്ദേശം: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=സ്റ്റാക്ക്: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ഫയല്‍: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=വരി: {{line}}
-rendering_error=താള്‍ റെണ്ടര്‍ ചെയ്യുമ്പോള്‍‌ പിശകുണ്ടായിരിയ്ക്കുന്നു.
-
-# Predefined zoom values
-page_scale_width=താളിന്റെ വീതി
-page_scale_fit=താള്‍ പാകത്തിനാക്കുക
-page_scale_auto=സ്വയമായി വലുതാക്കുക
-page_scale_actual=യഥാര്‍ത്ഥ വ്യാപ്തി
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=പിശക്
-loading_error=പിഡിഎഫ് ലഭ്യമാക്കുമ്പോള്‍ പിശക് ഉണ്ടായിരിയ്ക്കുന്നു.
-invalid_file_error=തെറ്റായ അല്ലെങ്കില്‍ തകരാറുള്ള പിഡിഎഫ് ഫയല്‍.
-missing_file_error=പിഡിഎഫ് ഫയല്‍ ലഭ്യമല്ല.
-unexpected_response_error=പ്രതീക്ഷിക്കാത്ത സെര്‍വര്‍ മറുപടി.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=ഈ പിഡിഎഫ് ഫയല്‍ തുറക്കുന്നതിനു് രഹസ്യവാക്ക് നല്‍കുക.
-password_invalid=തെറ്റായ രഹസ്യവാക്ക്, ദയവായി വീണ്ടും ശ്രമിയ്ക്കുക.
-password_ok=ശരി
-password_cancel=റദ്ദാക്കുക
-
-printing_not_supported=മുന്നറിയിപ്പു്: ഈ ബ്രൌസര്‍ പൂര്‍ണ്ണമായി പ്രിന്റിങ് പിന്തുണയ്ക്കുന്നില്ല.
-printing_not_ready=മുന്നറിയിപ്പു്: പ്രിന്റ് ചെയ്യുന്നതിനു് പിഡിഎഫ് പൂര്‍ണ്ണമായി ലഭ്യമല്ല.
-web_fonts_disabled=വെബിനുള്ള അക്ഷരസഞ്ചയങ്ങള്‍ പ്രവര്‍ത്തന രഹിതം: എംബഡ്ഡ് ചെയ്ത പിഡിഎഫ് അക്ഷരസഞ്ചയങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ സാധ്യമല്ല.
-document_colors_disabled=സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ പിഡിഎഫ് രേഖകള്‍ക്കു് അനുവാദമില്ല:  'സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ താളുകളെ അനുവദിയ്ക്കുക' എന്നതു് ബ്രൌസറില്‍ നിര്‍ജീവമാണു്.
diff --git a/public/pfd/build/generic/web/locale/mn/viewer.properties b/public/pfd/build/generic/web/locale/mn/viewer.properties
deleted file mode 100644
index f036644..0000000
--- a/public/pfd/build/generic/web/locale/mn/viewer.properties
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-
-zoom.title=Тэлэлт
-open_file.title=Файл нээ
-open_file_label=Нээ
-
-# Secondary toolbar and context menu
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-findbar_label=Ол
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-
-# Find panel button title and messages
-find_previous.title=Хайлтын өмнөх олдцыг харуулна
-find_next.title=Хайлтын дараагийн олдцыг харуулна
-find_not_found=Олдсонгүй
-
-# Error panel labels
-error_more_info=Нэмэлт мэдээлэл
-error_close=Хаа
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-
-# Predefined zoom values
-
-# Loading indicator messages
-loading_error_indicator=Алдаа
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-
diff --git a/public/pfd/build/generic/web/locale/mr/viewer.properties b/public/pfd/build/generic/web/locale/mr/viewer.properties
deleted file mode 100644
index 0e6f72f..0000000
--- a/public/pfd/build/generic/web/locale/mr/viewer.properties
+++ /dev/null
@@ -1,165 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=मागील पृष्ठ
-previous_label=मागील
-next.title=पुढील पृष्ठ
-next_label=पुढील
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=पृष्ठ:
-page_of=पैकी {{pageCount}}
-
-zoom_out.title=छोटे करा
-zoom_out_label=छोटे करा
-zoom_in.title=मोठे करा
-zoom_in_label=मोठे करा
-zoom.title=लहान किंवा मोठे करा
-presentation_mode.title=प्रस्तुतिकरण मोडचा वापर करा
-presentation_mode_label=प्रस्तुतिकरण मोड
-open_file.title=फाइल उघडा
-open_file_label=उघडा
-print.title=छपाई करा
-print_label=छपाई करा
-download.title=डाउनलोड करा
-download_label=डाउनलोड करा
-bookmark.title=सध्याचे अवलोकन (नविन पटलात प्रत बनवा किंवा उघडा)
-bookmark_label=सध्याचे अवलोकन
-
-# Secondary toolbar and context menu
-tools.title=साधने
-tools_label=साधने
-first_page.title=पहिल्या पानावर जा
-first_page.label=पहिल्या पानावर जा
-first_page_label=पहिल्या पानावर जा
-last_page.title=शेवटच्या पानावर जा
-last_page.label=शेवटच्या पानावर जा
-last_page_label=शेवटच्या पानावर जा
-page_rotate_cw.title=घड्याळाच्या काट्याच्या दिशेने फिरवा
-page_rotate_cw.label=घड्याळाच्या काट्याच्या दिशेने फिरवा
-page_rotate_cw_label=घड्याळाच्या काट्याच्या दिशेने फिरवा
-page_rotate_ccw.title=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा
-page_rotate_ccw.label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा
-page_rotate_ccw_label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा
-
-hand_tool_enable.title=हात साधन सुरू करा
-hand_tool_enable_label=हात साधन सुरू करा
-hand_tool_disable.title=हात साधन बंद करा
-hand_tool_disable_label=हात साधन बंद करा
-
-# Document properties dialog box
-document_properties.title=दस्तऐवज गुणधर्म…
-document_properties_label=दस्तऐवज गुणधर्म…
-document_properties_file_name=फाइलचे नाव:
-document_properties_file_size=फाइल आकार:
-document_properties_kb={{size_kb}} KB ({{size_b}} बाइट्स)
-document_properties_mb={{size_mb}} MB ({{size_b}} बाइट्स)
-document_properties_title=शिर्षक:
-document_properties_author=लेखक:
-document_properties_subject=विषय:
-document_properties_keywords=मुख्यशब्द:
-document_properties_creation_date=निर्माण दिनांक:
-document_properties_modification_date=दुरूस्ती दिनांक:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=निर्माता:
-document_properties_producer=PDF निर्माता:
-document_properties_version=PDF आवृत्ती:
-document_properties_page_count=पृष्ठ संख्या:
-document_properties_close=बंद करा
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=बाजूचीपट्टी टॉगल करा
-toggle_sidebar_label=बाजूचीपट्टी टॉगल करा
-outline.title=दस्तऐवज रूपरेषा दाखवा
-outline_label=दस्तऐवज रूपरेषा
-attachments.title=जोडपत्र दाखवा
-attachments_label=जोडपत्र
-thumbs.title=थंबनेल्स् दाखवा
-thumbs_label=थंबनेल्स्
-findbar.title=दस्तऐवजात शोधा
-findbar_label=शोधा
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=पृष्ठ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=पृष्ठाचे थंबनेल {{page}}
-
-# Find panel button title and messages
-find_label=शोधा:
-find_previous.title=वाकप्रयोगची मागील घटना शोधा
-find_previous_label=मागील
-find_next.title=वाकप्रयोगची पुढील घटना शोधा
-find_next_label=पुढील
-find_highlight=सर्व ठळक करा
-find_match_case_label=आकार जुळवा
-find_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे
-find_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे
-find_not_found=वाकप्रयोग आढळले नाही
-
-# Error panel labels
-error_more_info=आणखी माहिती
-error_less_info=कमी माहिती
-error_close=बंद करा
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=संदेश: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=स्टॅक: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=फाइल: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=रेष: {{line}}
-rendering_error=पृष्ठ दाखवतेवेळी त्रुटी आढळली.
-
-# Predefined zoom values
-page_scale_width=पृष्ठाची रूंदी
-page_scale_fit=पृष्ठ बसवा
-page_scale_auto=स्वयं लाहन किंवा मोठे करणे
-page_scale_actual=प्रत्यक्ष आकार
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=त्रुटी
-loading_error=PDF लोड करतेवेळी त्रुटी आढळली.
-invalid_file_error=अवैध किंवा दोषीत PDF फाइल.
-missing_file_error=न आढळणारी PDF फाइल.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} टिपण्णी]
-password_label=ही PDF फाइल उघडण्याकरिता पासवर्ड द्या.
-password_invalid=अवैध पासवर्ड. कृपया पुन्हा प्रयत्न करा.
-password_ok=ठीक आहे
-password_cancel=रद्द करा
-
-printing_not_supported=सावधानता: या ब्राउजरतर्फे छपाइ पूर्णपणे समर्थीत नाही.
-printing_not_ready=सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही.
-web_fonts_disabled=वेब फाँट्स असमर्थीत आहेत: एम्बेडेड PDF फाँट्स्चा वापर अशक्य.
-document_colors_disabled=PDF दस्ताएवजांना त्यांचे रंग वापरण्यास अनुमती नाही: ब्राउजरमध्ये ' पानांना त्यांचे रंग निवडण्यास अनुमती द्या' बंद केले आहे.
diff --git a/public/pfd/build/generic/web/locale/ms/viewer.properties b/public/pfd/build/generic/web/locale/ms/viewer.properties
deleted file mode 100644
index fd15e5d..0000000
--- a/public/pfd/build/generic/web/locale/ms/viewer.properties
+++ /dev/null
@@ -1,165 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Laman Sebelumnya
-previous_label=Terdahulu
-next.title=Laman seterusnya
-next_label=Berikut
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Laman:
-page_of=daripada {{pageCount}}
-
-zoom_out.title=Zum Keluar
-zoom_out_label=Zum Keluar
-zoom_in.title=Zum Masuk
-zoom_in_label=Zum Masuk
-zoom.title=Zum
-presentation_mode.title=Bertukar ke Mod Persembahan
-presentation_mode_label=Mod Persembahan
-open_file.title=Buka Fail
-open_file_label=Buka
-print.title=Cetak
-print_label=Cetak
-download.title=Muat turun
-download_label=Muat turun
-bookmark.title=Pandangan semasa (salinan atau dibuka dalam tetingkap baru)
-bookmark_label=Lihat semasa
-
-# Secondary toolbar and context menu
-tools.title=Alatan
-tools_label=Alatan
-first_page.title=Pergi ke Halaman Pertama
-first_page.label=Pergi ke Halaman Pertama
-first_page_label=Pergi ke Halaman Pertama
-last_page.title=Pergi ke Halaman Terakhir
-last_page.label=Pergi ke Halaman Terakhir
-last_page_label=Pergi ke Halaman Terakhir
-page_rotate_cw.title=Berputar ikut arah Jam
-page_rotate_cw.label=Berputar ikut arah Jam
-page_rotate_cw_label=Berputar ikut arah Jam
-page_rotate_ccw.title=Pusing berlawan arah jam
-page_rotate_ccw.label=Pusing berlawan arah jam
-page_rotate_ccw_label=Pusing berlawan arah jam
-
-hand_tool_enable.title=Bolehkan alatan tangan
-hand_tool_enable_label=Bolehkan alatan tangan
-hand_tool_disable.title=Lumpuhkan alatan tangan
-hand_tool_disable_label=Lumpuhkan alatan tangan
-
-# Document properties dialog box
-document_properties.title=Ciri Dokumen…
-document_properties_label=Ciri Dokumen…
-document_properties_file_name=Nama fail:
-document_properties_file_size=Saiz fail:
-document_properties_kb={{size_kb}} KB ({{size_b}} bait)
-document_properties_mb={{size_mb}} MB ({{size_b}} bait)
-document_properties_title=Tajuk:
-document_properties_author=Pengarang:
-document_properties_subject=Subjek:
-document_properties_keywords=Kata kunci:
-document_properties_creation_date=Masa Dicipta:
-document_properties_modification_date=Tarikh Ubahsuai:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Pencipta:
-document_properties_producer=Pengeluar PDF:
-document_properties_version=Versi PDF:
-document_properties_page_count=Kiraan Laman:
-document_properties_close=Tutup
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Togol Bar Sisi
-toggle_sidebar_label=Togol Bar Sisi
-outline.title=Tunjuk Rangka Dokumen
-outline_label=Rangka Dokument
-attachments.title=Tunjuk Lampiran
-attachments_label=Lampiran
-thumbs.title=Tunjuk Imej kecil
-thumbs_label=Imej kecil
-findbar.title=Cari didalam Dokumen
-findbar_label=Cari
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Halaman {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Halaman Imej kecil {{page}}
-
-# Find panel button title and messages
-find_label=Cari:
-find_previous.title=Cari teks frasa berkenaan yang terdahulu
-find_previous_label=Sebelumnya
-find_next.title=Cari teks frasa berkenaan yang berikut
-find_next_label=Berikut
-find_highlight=Serlahkan semua
-find_match_case_label=Kes Sepadan
-find_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah
-find_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas
-find_not_found=Frasa tidak ditemui
-
-# Error panel labels
-error_more_info=Maklumat lanjut
-error_less_info=Kurang Informasi
-error_close=Tutup
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mesej: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Timbun: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fail: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Garis: {{line}}
-rendering_error=Ralat berlaku ketika memberikan halaman.
-
-# Predefined zoom values
-page_scale_width=Lebar Halaman
-page_scale_fit=Muat Halaman
-page_scale_auto=Zoom Automatik
-page_scale_actual=Saiz Sebenar
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=Ralat
-loading_error=Masalah berlaku semasa menuatkan sebuah PDF.
-invalid_file_error=Tidak sah atau fail PDF rosak.
-missing_file_error=Fail PDF Hilang.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Anotasi]
-password_label=Masukan kata kunci untuk membuka fail PDF ini.
-password_invalid=Kata laluan salah. Cuba lagi.
-password_ok=OK
-password_cancel=Batal
-
-printing_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini.
-printing_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak.
-web_fonts_disabled=Fon web dilumpuhkan: tidak dapat fon PDF terbenam.
-document_colors_disabled=Dokumen PDF tidak dibenarkan untuk menggunakan warna sendiri: 'Benarkan muka surat untuk memilih warna sendiri' telah dinyahaktif dalam pelayar.
diff --git a/public/pfd/build/generic/web/locale/my/viewer.properties b/public/pfd/build/generic/web/locale/my/viewer.properties
deleted file mode 100644
index 18c69e9..0000000
--- a/public/pfd/build/generic/web/locale/my/viewer.properties
+++ /dev/null
@@ -1,166 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=အရင် စာမျက်နှာ
-previous_label=အရင်နေရာ
-next.title=ရှေ့ စာမျက်နှာ
-next_label=နောက်တခု
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=စာမျက်နှာ -
-page_of=၏ {{pageCount}}
-
-zoom_out.title=ချုံ့ပါ
-zoom_out_label=ချုံ့ပါ
-zoom_in.title=ချဲ့ပါ
-zoom_in_label=ချဲ့ပါ
-zoom.title=ချုံ့/ချဲ့ပါ
-presentation_mode.title=Switch to Presentation Mode
-presentation_mode_label=Presentation Mode
-open_file.title=ဖိုင်အားဖွင့်ပါ။
-open_file_label=ဖွင့်ပါ
-print.title=ပုံနှိုပ်ပါ
-print_label=ပုံနှိုပ်ပါ
-download.title=ကူးဆွဲ
-download_label=ကူးဆွဲ
-bookmark.title=လက်ရှိ မြင်ကွင်း (ဝင်းဒိုးအသစ်မှာ ကူးပါ သို့မဟုတ် ဖွင့်ပါ)
-bookmark_label=လက်ရှိ မြင်ကွင်း
-
-# Secondary toolbar and context menu
-tools.title=ကိရိယာများ
-tools_label=ကိရိယာများ
-first_page.title=ပထမ စာမျက်နှာသို့
-first_page.label=ပထမ စာမျက်နှာသို့
-first_page_label=ပထမ စာမျက်နှာသို့
-last_page.title=နောက်ဆုံး စာမျက်နှာသို့
-last_page.label=နောက်ဆုံး စာမျက်နှာသို့
-last_page_label=နောက်ဆုံး စာမျက်နှာသို့
-page_rotate_cw.title=နာရီလက်တံ အတိုင်း
-page_rotate_cw.label=နာရီလက်တံ အတိုင်း
-page_rotate_cw_label=နာရီလက်တံ အတိုင်း
-page_rotate_ccw.title=နာရီလက်တံ ပြောင်းပြန်
-page_rotate_ccw.label=နာရီလက်တံ ပြောင်းပြန်
-page_rotate_ccw_label=နာရီလက်တံ ပြောင်းပြန်
-
-hand_tool_enable.title=လက်ကိုင် ကိရိယာအားသုံး
-hand_tool_enable_label=လက်ကိုင် ကိရိယာဖွင့်
-hand_tool_disable.title=လက်ကိုင် ကိရိယာအားပိတ်
-hand_tool_disable_label=လက်ကိုင်ကိရိယာ အားပိတ်
-
-# Document properties dialog box
-document_properties.title=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ
-document_properties_label=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ
-document_properties_file_name=ဖိုင် :
-document_properties_file_size=ဖိုင်ဆိုဒ် :
-document_properties_kb={{size_kb}} ကီလိုဘိုတ် ({size_kb}}ဘိုတ်)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=ခေါင်းစဉ်‌ -
-document_properties_author=ရေးသားသူ:
-document_properties_subject=အကြောင်းအရာ:\u0020
-document_properties_keywords=သော့ချက် စာလုံး:
-document_properties_creation_date=ထုတ်လုပ်ရက်စွဲ:
-document_properties_modification_date=ပြင်ဆင်ရက်စွဲ:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=ဖန်တီးသူ:
-document_properties_producer=PDF ထုတ်လုပ်သူ:
-document_properties_version=PDF ဗားရှင်း:
-document_properties_page_count=စာမျက်နှာအရေအတွက်:
-document_properties_close=ပိတ်
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=ဘေးတန်းဖွင့်ပိတ်
-toggle_sidebar_label=ဖွင့်ပိတ် ဆလိုက်ဒါ
-outline.title=စာတမ်း မူကြမ်း ကိုပြပါ
-outline_label=စာတမ်း မူကြမ်း
-attachments.title=တွဲချက်များ ပြပါ
-attachments_label=တွဲထားချက်များ
-thumbs.title=ပုံရိပ်ငယ်များကို ပြပါ
-thumbs_label=ပုံရိပ်ငယ်များ
-findbar.title=Find in Document
-findbar_label=ရှာဖွေပါ
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=စာမျက်နှာ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=စာမျက်နှာရဲ့ ပုံရိပ်ငယ် {{page}}
-
-# Find panel button title and messages
-find_label=ရှာဖွေပါ -
-find_previous.title=စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ
-find_previous_label=နောက်သို့
-find_next.title=စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ
-find_next_label=ရှေ့သို့
-find_highlight=အားလုံးကို မျဉ်းသားပါ
-find_match_case_label=စာလုံး တိုက်ဆိုင်ပါ
-find_reached_top=စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ
-find_reached_bottom=စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ
-find_not_found=စကားစု မတွေ့ရဘူး
-
-# Error panel labels
-error_more_info=နောက်ထပ်အချက်အလက်များ
-error_less_info=အနည်းငယ်မျှသော သတင်းအချက်အလက်
-error_close=ပိတ်
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=မက်ဆေ့ - {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=အထပ် - {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ဖိုင် {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=လိုင်း - {{line}}
-rendering_error=စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။
-
-# Predefined zoom values
-page_scale_width=စာမျက်နှာ အကျယ်
-page_scale_fit=စာမျက်နှာ ကွက်တိ
-page_scale_auto=အလိုအလျောက် ချုံ့ချဲ့
-page_scale_actual=အမှန်တကယ်ရှိတဲ့ အရွယ်
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=အမှား
-loading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။
-invalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင်
-missing_file_error=PDF ပျောက်ဆုံး
-unexpected_response_error=မမျှော်လင့်ထားသော ဆာဗာမှ ပြန်ကြားချက်
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} အဓိပ္ပာယ်ဖွင့်ဆိုချက်]
-password_label=PDF အားဖွင့်ရန် ပတ်စ်ဝတ်အားထည့်ပါ
-password_invalid=စာဝှက် မှားသည်။ ထပ်ကြိုးစားကြည့်ပါ။
-password_ok=OK
-password_cancel=ပယ်​ဖျက်ပါ
-
-printing_not_supported=သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။
-printing_not_ready=သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ
-web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
-document_colors_disabled=PDF ဖိုင်အား ၎င်းဤ ကိုယ်ပိုင်အရောင်များကို အသုံးပြုခွင့်မပေးထားပါ ။ 'စာမျက်နှာအားလုံးအားအရောင်ရွေးချယ်ခွင့်' အား ယခု ဘယောက်ဆာတွင် ပိတ်ထားခြင်းကြောင့်ဖြစ် သှ်
diff --git a/public/pfd/build/generic/web/locale/nb-NO/viewer.properties b/public/pfd/build/generic/web/locale/nb-NO/viewer.properties
deleted file mode 100644
index 9b3839f..0000000
--- a/public/pfd/build/generic/web/locale/nb-NO/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Forrige side
-previous_label=Forrige
-next.title=Neste side
-next_label=Neste
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Side:
-page_of=av {{pageCount}}
-
-zoom_out.title=Zoom ut
-zoom_out_label=Zoom ut
-zoom_in.title=Zoom inn
-zoom_in_label=Zoom inn
-zoom.title=Zoom
-presentation_mode.title=Bytt til presentasjonsmodus
-presentation_mode_label=Presentasjonsmodus
-open_file.title=Åpne fil
-open_file_label=Åpne
-print.title=Skriv ut
-print_label=Skriv ut
-download.title=Last ned
-download_label=Last ned
-bookmark.title=Nåværende visning (kopier eller åpne i et nytt vindu)
-bookmark_label=Nåværende visning
-
-# Secondary toolbar and context menu
-tools.title=Verktøy
-tools_label=Verktøy
-first_page.title=Gå til første side
-first_page.label=Gå til første side
-first_page_label=Gå til første side
-last_page.title=Gå til siste side
-last_page.label=Gå til siste side
-last_page_label=Gå til siste side
-page_rotate_cw.title=Roter med klokken
-page_rotate_cw.label=Roter med klokken
-page_rotate_cw_label=Roter med klokken
-page_rotate_ccw.title=Roter mot klokken
-page_rotate_ccw.label=Roter mot klokken
-page_rotate_ccw_label=Roter mot klokken
-
-hand_tool_enable.title=Slå på hånd-verktøy
-hand_tool_enable_label=Slå på hånd-verktøy
-hand_tool_disable.title=Slå av hånd-verktøy
-hand_tool_disable_label=Slå av hånd-verktøy
-
-# Document properties dialog box
-document_properties.title=Dokumentegenskaper …
-document_properties_label=Dokumentegenskaper …
-document_properties_file_name=Filnavn:
-document_properties_file_size=Filstørrelse:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Tittel:
-document_properties_author=Forfatter:
-document_properties_subject=Emne:
-document_properties_keywords=Nøkkelord:
-document_properties_creation_date=Opprettet dato:
-document_properties_modification_date=Endret dato:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Opprettet av:
-document_properties_producer=PDF-verktøy:
-document_properties_version=PDF-versjon:
-document_properties_page_count=Sideantall:
-document_properties_close=Lukk
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Slå av/på sidestolpe
-toggle_sidebar_label=Slå av/på sidestolpe
-outline.title=Vis dokumentdisposisjon
-outline_label=Dokumentdisposisjon
-attachments.title=Vis vedlegg
-attachments_label=Vedlegg
-thumbs.title=Vis miniatyrbilde
-thumbs_label=Miniatyrbilde
-findbar.title=Finn i dokumentet
-findbar_label=Finn
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Side {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatyrbilde av side {{page}}
-
-# Find panel button title and messages
-find_label=Finn:
-find_previous.title=Finn forrige forekomst av frasen
-find_previous_label=Forrige
-find_next.title=Finn neste forekomst av frasen
-find_next_label=Neste
-find_highlight=Uthev alle
-find_match_case_label=Skill store/små bokstaver
-find_reached_top=Nådde toppen av dokumentet, fortsetter fra bunnen
-find_reached_bottom=Nådde bunnen av dokumentet, fortsetter fra toppen
-find_not_found=Fant ikke teksten
-
-# Error panel labels
-error_more_info=Mer info
-error_less_info=Mindre info
-error_close=Lukk
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (bygg: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Melding: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stakk: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fil: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linje: {{line}}
-rendering_error=En feil oppstod ved opptegning av siden.
-
-# Predefined zoom values
-page_scale_width=Sidebredde
-page_scale_fit=Tilpass til siden
-page_scale_auto=Automatisk zoom
-page_scale_actual=Virkelig størrelse
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}} %
-
-# Loading indicator messages
-loading_error_indicator=Feil
-loading_error=En feil oppstod ved lasting av PDF.
-invalid_file_error=Ugyldig eller skadet PDF-fil.
-missing_file_error=Manglende PDF-fil.
-unexpected_response_error=Uventet serverrespons.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} annotasjon]
-password_label=Skriv inn passordet for å åpne denne PDF-filen.
-password_invalid=Ugyldig passord. Prøv igjen.
-password_ok=OK
-password_cancel=Avbryt
-
-printing_not_supported=Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren.
-printing_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift.
-web_fonts_disabled=Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter.
-document_colors_disabled=PDF-dokumenter tillates ikke å bruke deres egne farger: 'Tillat sider å velge egne farger' er deaktivert i nettleseren.
diff --git a/public/pfd/build/generic/web/locale/nl/viewer.properties b/public/pfd/build/generic/web/locale/nl/viewer.properties
deleted file mode 100644
index 50e4d13..0000000
--- a/public/pfd/build/generic/web/locale/nl/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Vorige pagina
-previous_label=Vorige
-next.title=Volgende pagina
-next_label=Volgende
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Pagina:
-page_of=van {{pageCount}}
-
-zoom_out.title=Uitzoomen
-zoom_out_label=Uitzoomen
-zoom_in.title=Inzoomen
-zoom_in_label=Inzoomen
-zoom.title=Zoomen
-presentation_mode.title=Wisselen naar presentatiemodus
-presentation_mode_label=Presentatiemodus
-open_file.title=Bestand openen
-open_file_label=Openen
-print.title=Afdrukken
-print_label=Afdrukken
-download.title=Downloaden
-download_label=Downloaden
-bookmark.title=Huidige weergave (kopiëren of openen in nieuw venster)
-bookmark_label=Huidige weergave
-
-# Secondary toolbar and context menu
-tools.title=Hulpmiddelen
-tools_label=Hulpmiddelen
-first_page.title=Naar eerste pagina gaan
-first_page.label=Naar eerste pagina gaan
-first_page_label=Naar eerste pagina gaan
-last_page.title=Naar laatste pagina gaan
-last_page.label=Naar laatste pagina gaan
-last_page_label=Naar laatste pagina gaan
-page_rotate_cw.title=Rechtsom draaien
-page_rotate_cw.label=Rechtsom draaien
-page_rotate_cw_label=Rechtsom draaien
-page_rotate_ccw.title=Linksom draaien
-page_rotate_ccw.label=Linksom draaien
-page_rotate_ccw_label=Linksom draaien
-
-hand_tool_enable.title=Handhulpmiddel inschakelen
-hand_tool_enable_label=Handhulpmiddel inschakelen
-hand_tool_disable.title=Handhulpmiddel uitschakelen
-hand_tool_disable_label=Handhulpmiddel uitschakelen
-
-# Document properties dialog box
-document_properties.title=Documenteigenschappen…
-document_properties_label=Documenteigenschappen…
-document_properties_file_name=Bestandsnaam:
-document_properties_file_size=Bestandsgrootte:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Titel:
-document_properties_author=Auteur:
-document_properties_subject=Onderwerp:
-document_properties_keywords=Trefwoorden:
-document_properties_creation_date=Aanmaakdatum:
-document_properties_modification_date=Wijzigingsdatum:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Auteur:
-document_properties_producer=PDF-producent:
-document_properties_version=PDF-versie:
-document_properties_page_count=Aantal pagina’s:
-document_properties_close=Sluiten
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Zijbalk in-/uitschakelen
-toggle_sidebar_label=Zijbalk in-/uitschakelen
-outline.title=Documentoverzicht tonen
-outline_label=Documentoverzicht
-attachments.title=Bijlagen tonen
-attachments_label=Bijlagen
-thumbs.title=Miniaturen tonen
-thumbs_label=Miniaturen
-findbar.title=Zoeken in document
-findbar_label=Zoeken
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Pagina {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatuur van pagina {{page}}
-
-# Find panel button title and messages
-find_label=Zoeken:
-find_previous.title=Het vorige voorkomen van de tekst zoeken
-find_previous_label=Vorige
-find_next.title=Het volgende voorkomen van de tekst zoeken
-find_next_label=Volgende
-find_highlight=Alles markeren
-find_match_case_label=Hoofdlettergevoelig
-find_reached_top=Bovenkant van het document bereikt, doorgegaan vanaf de onderkant
-find_reached_bottom=Onderkant van het document bereikt, doorgegaan vanaf de bovenkant
-find_not_found=Tekst niet gevonden
-
-# Error panel labels
-error_more_info=Meer informatie
-error_less_info=Minder informatie
-error_close=Sluiten
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Bericht: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Bestand: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Regel: {{line}}
-rendering_error=Er is een fout opgetreden bij het weergeven van de pagina.
-
-# Predefined zoom values
-page_scale_width=Paginabreedte
-page_scale_fit=Hele pagina
-page_scale_auto=Automatisch zoomen
-page_scale_actual=Werkelijke grootte
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Fout
-loading_error=Er is een fout opgetreden bij het laden van de PDF.
-invalid_file_error=Ongeldig of beschadigd PDF-bestand.
-missing_file_error=PDF-bestand ontbreekt. 
-unexpected_response_error=Onverwacht serverantwoord.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}}-aantekening]
-password_label=Voer het wachtwoord in om dit PDF-bestand te openen.
-password_invalid=Ongeldig wachtwoord. Probeer het opnieuw.
-password_ok=OK
-password_cancel=Annuleren
-
-printing_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser.
-printing_not_ready=Waarschuwing: de PDF is niet volledig geladen voor afdrukken.
-web_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk.
-document_colors_disabled=PDF-documenten mogen hun eigen kleuren niet gebruiken: ‘Pagina’s toestaan om hun eigen kleuren te kiezen’ is uitgeschakeld in de browser.
diff --git a/public/pfd/build/generic/web/locale/nn-NO/viewer.properties b/public/pfd/build/generic/web/locale/nn-NO/viewer.properties
deleted file mode 100644
index 098e822..0000000
--- a/public/pfd/build/generic/web/locale/nn-NO/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Førre side
-previous_label=Førre
-next.title=Neste side
-next_label=Neste
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Side:
-page_of=av {{pageCount}}
-
-zoom_out.title=Mindre
-zoom_out_label=Mindre
-zoom_in.title=Større
-zoom_in_label=Større
-zoom.title=Skalering
-presentation_mode.title=Byt til presentasjonsmodus
-presentation_mode_label=Presentasjonsmodus
-open_file.title=Opna fil
-open_file_label=Opna
-print.title=Skriv ut
-print_label=Skriv ut
-download.title=Last ned
-download_label=Last ned
-bookmark.title=Gjeldande vising (kopier eller opna i nytt vindauge)
-bookmark_label=Gjeldande vising
-
-# Secondary toolbar and context menu
-tools.title=Verktøy
-tools_label=Verktøy
-first_page.title=Gå til fyrstesida
-first_page.label=Gå til fyrstesida
-first_page_label=Gå til fyrstesida
-last_page.title=Gå til siste side
-last_page.label=Gå til siste side
-last_page_label=Gå til siste side
-page_rotate_cw.title=Roter med klokka
-page_rotate_cw.label=Roter med klokka
-page_rotate_cw_label=Roter med klokka
-page_rotate_ccw.title=Roter mot klokka
-page_rotate_ccw.label=Roter mot klokka
-page_rotate_ccw_label=Roter mot klokka
-
-hand_tool_enable.title=Slå på handverktøy
-hand_tool_enable_label=Slå på handverktøy
-hand_tool_disable.title=Så av handverktøy
-hand_tool_disable_label=Slå av handverktøy
-
-# Document properties dialog box
-document_properties.title=Dokumenteigenskapar …
-document_properties_label=Dokumenteigenskapar …
-document_properties_file_name=Filnamn:
-document_properties_file_size=Filstorleik:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Dokumenteigenskapar …
-document_properties_author=Forfattar:
-document_properties_subject=Emne:
-document_properties_keywords=Nykelord:
-document_properties_creation_date=Dato oppretta:
-document_properties_modification_date=Dato endra:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Oppretta av:
-document_properties_producer=PDF-verktøy:
-document_properties_version=PDF-versjon:
-document_properties_page_count=Sidetal:
-document_properties_close=Lukk
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Slå av/på sidestolpe
-toggle_sidebar_label=Slå av/på sidestolpe
-outline.title=Vis dokumentdisposisjon
-outline_label=Dokumentdisposisjon
-attachments.title=Vis vedlegg
-attachments_label=Vedlegg
-thumbs.title=Vis miniatyrbilde
-thumbs_label=Miniatyrbilde
-findbar.title=Finn i dokumentet
-findbar_label=Finn
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Side {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatyrbilde av side {{page}}
-
-# Find panel button title and messages
-find_label=Finn:
-find_previous.title=Finn tidlegare førekomst av frasen
-find_previous_label=Førre
-find_next.title=Finn neste førekomst av frasen
-find_next_label=Neste
-find_highlight=Uthev alle
-find_match_case_label=Skil store/små bokstavar
-find_reached_top=Nådde toppen av dokumentet, held fram frå botnen
-find_reached_bottom=Nådde botnen av dokumentet, held fram frå toppen
-find_not_found=Fann ikkje teksten
-
-# Error panel labels
-error_more_info=Meir info
-error_less_info=Mindre info
-error_close=Lukk
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (bygg: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Melding: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stakk: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fil: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linje: {{line}}
-rendering_error=Ein feil oppstod ved oppteikning av sida.
-
-# Predefined zoom values
-page_scale_width=Sidebreidde
-page_scale_fit=Tilpass til sida
-page_scale_auto=Automatisk skalering
-page_scale_actual=Verkeleg storleik
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Feil
-loading_error=Ein feil oppstod ved lasting av PDF.
-invalid_file_error=Ugyldig eller korrupt PDF-fil.
-missing_file_error=Manglande PDF-fil.
-unexpected_response_error=Uventa tenarrespons.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} annotasjon]
-password_label=Skriv inn passordet for å opna denne PDF-fila.
-password_invalid=Ugyldig passord. Prøv igjen.
-password_ok=OK
-password_cancel=Avbryt
-
-printing_not_supported=Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren.
-printing_not_ready=Åtvaring: PDF ikkje fullstendig innlasta for utskrift.
-web_fonts_disabled=Vev-skrifter er slått av: Kan ikkje bruka innbundne PDF-skrifter.
-document_colors_disabled=PDF-dokument har ikkje løyve til å bruka eigne fargar: 'Tillat sider å velja eigne fargar' er slått av i nettlesaren.
diff --git a/public/pfd/build/generic/web/locale/nso/viewer.properties b/public/pfd/build/generic/web/locale/nso/viewer.properties
deleted file mode 100644
index 09923f5..0000000
--- a/public/pfd/build/generic/web/locale/nso/viewer.properties
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Letlakala le fetilego
-previous_label=Fetilego
-next.title=Letlakala le latelago
-next_label=Latelago
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Letlakala:
-page_of=la {{pageCount}}
-
-zoom_out.title=Bušetša ka gare
-zoom_out_label=Bušetša ka gare
-zoom_in.title=Godišetša ka ntle
-zoom_in_label=Godišetša ka ntle
-zoom.title=Godiša
-print.title=Gatiša
-print_label=Gatiša
-presentation_mode.title=Fetogela go mokgwa wa tlhagišo
-presentation_mode_label=Mokgwa wa tlhagišo
-open_file.title=Bula faele
-open_file_label=Bula
-download.title=Laolla
-download_label=Laolla
-bookmark.title=Pono ya bjale (kopiša le go bula lefasetereng le leswa)
-bookmark_label=Tebelelo ya gona bjale
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Šielanya para ya ka thoko
-toggle_sidebar_label=Šielanya para ya ka thoko
-outline.title=Laetša kakaretšo ya tokumente
-outline_label=Kakaretšo ya tokumente
-thumbs.title=Laetša dikhutšofatšo
-thumbs_label=Dikhutšofatšo
-findbar.title=Hwetša go tokumente
-findbar_label=Hwetša
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Letlakala {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Khutšofatšo ya letlakala {{page}}
-
-# Context menu
-first_page.label=Eya letlakaleng la mathomo
-last_page.label=Eya letlakaleng la mafelelo
-page_rotate_cw.label=Dikološa go ya ka go la go ja
-page_rotate_ccw.label=Dikološa go ya go la ntsogošo
-
-# Find panel button title and messages
-find_label=Hwetša:
-find_previous.title=Hwetša tiragalo e fetilego ya sekafoko
-find_previous_label=Fetilego
-find_next.title=Hwetša tiragalo e latelago ya sekafoko
-find_next_label=Latelago
-find_highlight=Bonagatša tšohle
-find_match_case_label=Swantšha kheisi
-find_reached_top=Fihlile godimo ga tokumente, go tšwetšwe pele go tloga tlase
-find_reached_bottom=Fihlile mafelelong a tokumente, go tšwetšwe pele go tloga godimo
-find_not_found=Sekafoko ga sa hwetšwa
-
-# Error panel labels
-error_more_info=Tshedimošo e oketšegilego
-error_less_info=Tshedimošo ya tlasana
-error_close=Tswalela
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Molaetša: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Mokgobo: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Faele: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Mothaladi: {{line}}
-rendering_error=Go diregile phošo ge go be go gafelwa letlakala.
-
-# Predefined zoom values
-page_scale_width=Bophara bja letlakala
-page_scale_fit=Go lekana ga letlakala
-page_scale_auto=Kgodišo ya maitirišo
-page_scale_actual=Bogolo bja kgonthe
-
-# Loading indicator messages
-loading_error_indicator=Phošo
-loading_error=Go diregile phošo ge go hlahlelwa PDF.
-invalid_file_error=Faele ye e sa šomego goba e senyegilego ya PDF.
-missing_file_error=Faele yeo e sego gona ya PDF.
-
-# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type=[{{type}} Tlhaloso]
-request_password=PDF e šireleditšwe ka lentšuphetišo:
-
-printing_not_supported=Temošo: Go gatiša ga go thekgwe ke praosara ye ka botlalo.
-printing_not_ready=Temošo: PDF ga ya hlahlelwa ka botlalo bakeng sa go gatišwa.
-web_fonts_disabled=Difonte tša wepe di šitišitšwe: ga e kgone go diriša difonte tša PDF tše khutišitšwego.
-web_colors_disabled=Mebala ya wepe e šitišitšwe.
diff --git a/public/pfd/build/generic/web/locale/oc/viewer.properties b/public/pfd/build/generic/web/locale/oc/viewer.properties
deleted file mode 100644
index a686373..0000000
--- a/public/pfd/build/generic/web/locale/oc/viewer.properties
+++ /dev/null
@@ -1,165 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Pagina precedenta
-previous_label=Precedent
-next.title=Pagina seguenta
-next_label=Seguent
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Pagina :
-page_of=sus {{pageCount}}
-
-zoom_out.title=Zoom arrièr
-zoom_out_label=Zoom arrièr
-zoom_in.title=Zoom avant
-zoom_in_label=Zoom avant
-zoom.title=Zoom
-presentation_mode.title=Bascuolar en mòde presentacion
-presentation_mode_label=Mòde Presentacion
-open_file.title=Dobrir lo fichièr
-open_file_label=Dobrir
-print.title=Imprimir
-print_label=Imprimir
-download.title=Telecargar
-download_label=Telecargar
-bookmark.title=Afichatge corrent (copiar o dobrir dins una fenèstra novèla)
-bookmark_label=Afichatge actual
-
-# Secondary toolbar and context menu
-tools.title=Aisinas
-tools_label=Aisinas
-first_page.title=Anar a la primièra pagina
-first_page.label=Anar a la primièra pagina
-first_page_label=Anar a la primièra pagina
-last_page.title=Anar a la darrièra pagina
-last_page.label=Anar a la darrièra pagina
-last_page_label=Anar a la darrièra pagina
-page_rotate_cw.title=Rotacion orària
-page_rotate_cw.label=Rotacion orària
-page_rotate_cw_label=Rotacion orària
-page_rotate_ccw.title=Rotacion antiorària
-page_rotate_ccw.label=Rotacion antiorària
-page_rotate_ccw_label=Rotacion antiorària
-
-hand_tool_enable.title=Activar l'aisina man
-hand_tool_enable_label=Activar l'aisina man
-hand_tool_disable.title=Desactivar l'aisina man
-hand_tool_disable_label=Desactivar l'aisina man
-
-# Document properties dialog box
-document_properties.title=Proprietats del document...
-document_properties_label=Proprietats del document...
-document_properties_file_name=Nom del fichièr :
-document_properties_file_size=Talha del fichièr :
-document_properties_kb={{size_kb}} Ko ({{size_b}} octets)
-document_properties_mb={{size_mb}} Mo ({{size_b}} octets)
-document_properties_title=Títol :
-document_properties_author=Autor :
-document_properties_subject=Subjècte :
-document_properties_keywords=Mots claus :
-document_properties_creation_date=Data de creacion :
-document_properties_modification_date=Data de modificacion :
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Creator :
-document_properties_producer=Aisina de conversion PDF :
-document_properties_version=Version PDF :
-document_properties_page_count=Nombre de paginas :
-document_properties_close=Tampar
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Afichar/amagar lo panèl lateral
-toggle_sidebar_label=Afichar/amagar lo panèl lateral
-outline.title=Afichar los marcapaginas
-outline_label=Marcapaginas del document
-attachments.title=Visualizar las pèças juntas
-attachments_label=Pèças juntas
-thumbs.title=Afichar las vinhetas
-thumbs_label=Vinhetas
-findbar.title=Trobar dins lo document
-findbar_label=Recercar
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Pagina {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Vinheta de la pagina {{page}}
-
-# Find panel button title and messages
-find_label=Recercar
-find_previous.title=Tròba l'ocurréncia precedenta de la frasa
-find_previous_label=Precedent
-find_next.title=Tròba l'ocurréncia venenta de la frasa
-find_next_label=Seguent
-find_highlight=Suslinhar tot
-find_match_case_label=Respectar la cassa
-find_reached_top=Naut de la pagina atench, perseguida dempuèi lo bas
-find_reached_bottom=Bas de la pagina atench, perseguida al començament
-find_not_found=Frasa pas trobada
-
-# Error panel labels
-error_more_info=Mai de detalhs
-error_less_info=Mens d'informacions
-error_close=Tampar
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (identificant de compilacion : {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Messatge : {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pila : {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fichièr : {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linha : {{line}}
-rendering_error=Una error s'es producha pendent l'afichatge de la pagina.
-
-# Predefined zoom values
-page_scale_width=Largor plena
-page_scale_fit=Pagina entièra
-page_scale_auto=Zoom automatic
-page_scale_actual=Talha vertadièra
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=Error
-loading_error=Una error s'es producha pendent lo cargament del fichièr PDF.
-invalid_file_error=Fichièr PDF invalid o corromput.
-missing_file_error=Fichièr PDF mancant.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotacion {{type}}]
-password_label=Picatz lo senhal per dobrir aqueste fichièr PDF.
-password_invalid=Senhal incorrècte. Tornatz ensajar.
-password_ok=D'acòrdi
-password_cancel=Anullar
-
-printing_not_supported=Atencion : l'estampatge es pas completament gerit per aqueste navigador.
-printing_not_ready=Atencion : lo PDF es pas entièrament cargat per lo poder imprimir.
-web_fonts_disabled=Las poliças web son desactivadas : impossible d'utilizar las poliças integradas al PDF.
-document_colors_disabled=Los documents PDF pòdon pas utilizar lors pròprias colors : « Autorizar las paginas web d'utilizar lors pròprias colors » es desactivat dins lo navigador.
diff --git a/public/pfd/build/generic/web/locale/or/viewer.properties b/public/pfd/build/generic/web/locale/or/viewer.properties
deleted file mode 100644
index 39d2962..0000000
--- a/public/pfd/build/generic/web/locale/or/viewer.properties
+++ /dev/null
@@ -1,164 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=ପୂର୍ବ ପୃଷ୍ଠା
-previous_label=ପୂର୍ବ
-next.title=ପର ପୃଷ୍ଠା
-next_label=ପର
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=ପୃଷ୍ଠା:
-page_of={{pageCount}} ର
-
-zoom_out.title=ଛୋଟ କରନ୍ତୁ
-zoom_out_label=ଛୋଟ କରନ୍ତୁ
-zoom_in.title=ବଡ଼ କରନ୍ତୁ
-zoom_in_label=ବଡ଼ କରନ୍ତୁ
-zoom.title=ଛୋଟ ବଡ଼ କରନ୍ତୁ
-presentation_mode.title=ଉପସ୍ଥାପନ ଧାରାକୁ ବଦଳାନ୍ତୁ
-presentation_mode_label=ଉପସ୍ଥାପନ ଧାରା
-open_file.title=ଫାଇଲ ଖୋଲନ୍ତୁ
-open_file_label=ଖୋଲନ୍ତୁ
-print.title=ମୁଦ୍ରଣ
-print_label=ମୁଦ୍ରଣ
-download.title=ଆହରଣ
-download_label=ଆହରଣ
-bookmark.title=ପ୍ରଚଳିତ ଦୃଶ୍ୟ (ନକଲ କରନ୍ତୁ କିମ୍ବା ଏକ ନୂତନ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ)
-bookmark_label=ପ୍ରଚଳିତ ଦୃଶ୍ୟ
-
-# Secondary toolbar and context menu
-tools.title=ସାଧନଗୁଡ଼ିକ
-tools_label=ସାଧନଗୁଡ଼ିକ
-first_page.title=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
-first_page.label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
-first_page_label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
-last_page.title=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
-last_page.label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
-last_page_label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
-page_rotate_cw.title=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
-page_rotate_cw.label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
-page_rotate_cw_label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
-page_rotate_ccw.title=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
-page_rotate_ccw.label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
-page_rotate_ccw_label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
-
-hand_tool_enable.title=ହସ୍ତକୃତ ସାଧନକୁ ସକ୍ରିୟ କରନ୍ତୁ
-hand_tool_enable_label=ହସ୍ତକୃତ ସାଧନକୁ ସକ୍ରିୟ କରନ୍ତୁ
-hand_tool_disable.title=ହସ୍ତକୃତ ସାଧନକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ
-hand_tool_disable_label=ହସ୍ତକୃତ ସାଧନକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ
-
-# Document properties dialog box
-document_properties.title=ଦଲିଲ ଗୁଣଧର୍ମ…
-document_properties_label=ଦଲିଲ ଗୁଣଧର୍ମ…
-document_properties_file_name=ଫାଇଲ ନାମ:
-document_properties_file_size=ଫାଇଲ ଆକାର:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=ଶୀର୍ଷକ:
-document_properties_author=ଲେଖକ:
-document_properties_subject=ବିଷୟ:
-document_properties_keywords=ସୂଚକ ଶବ୍ଦ:
-document_properties_creation_date=ନିର୍ମାଣ ତାରିଖ:
-document_properties_modification_date=ପରିବର୍ତ୍ତନ ତାରିଖ:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=ନିର୍ମାତା:
-document_properties_producer=PDF ପ୍ରଯୋଜକ:
-document_properties_version=PDF ସଂସ୍କରଣ:
-document_properties_page_count=ପୃଷ୍ଠା ଗଣନା:
-document_properties_close=ବନ୍ଦ କରନ୍ତୁ
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ
-toggle_sidebar_label=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ
-outline.title=ଦଲିଲ  ସାରାଂଶ ଦର୍ଶାନ୍ତୁ
-outline_label=ଦଲିଲ ସାରାଂଶ
-attachments.title=ସଂଲଗ୍ନକଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ
-attachments_label=ସଲଗ୍ନକଗୁଡିକ
-thumbs.title=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ ଦର୍ଶାନ୍ତୁ
-thumbs_label=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ
-findbar.title=ଦଲିଲରେ ଖୋଜନ୍ତୁ
-findbar_label=ଖୋଜନ୍ତୁ
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=ପୃଷ୍ଠା {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=ପୃଷ୍ଠାର ସଂକ୍ଷିପ୍ତ ବିବରଣୀ {{page}}
-
-# Find panel button title and messages
-find_label=ଖୋଜନ୍ତୁ:
-find_previous.title=ଏହି ବାକ୍ୟାଂଶର ପୂର୍ବ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ
-find_previous_label=ପୂର୍ବବର୍ତ୍ତୀ
-find_next.title=ଏହି ବାକ୍ୟାଂଶର ପରବର୍ତ୍ତୀ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ
-find_next_label=ପରବର୍ତ୍ତୀ\u0020
-find_highlight=ସମସ୍ତଙ୍କୁ ଆଲୋକିତ କରନ୍ତୁ
-find_match_case_label=ଅକ୍ଷର ମେଳାନ୍ତୁ
-find_reached_top=ତଳୁ ଉପରକୁ ଗତି କରି ଦଲିଲର ଉପର ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି
-find_reached_bottom=ଉପରୁ ତଳକୁ ଗତି କରି ଦଲିଲର ଶେଷ ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି
-find_not_found=ବାକ୍ୟାଂଶ ମିଳିଲା ନାହିଁ
-
-# Error panel labels
-error_more_info=ଅଧିକ ସୂଚନା
-error_less_info=ସ୍ୱଳ୍ପ ସୂଚନା
-error_close=ବନ୍ଦ କରନ୍ତୁ
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=ସନ୍ଦେଶ: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=ଷ୍ଟାକ: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ଫାଇଲ: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=ଧାଡ଼ି: {{line}}
-rendering_error=ପୃଷ୍ଠା ଚିତ୍ରଣ କରିବା ସମୟରେ ତ୍ରୁଟି ଘଟିଲା।
-
-# Predefined zoom values
-page_scale_width=ପୃଷ୍ଠା ଓସାର
-page_scale_fit=ପୃଷ୍ଠା ମେଳନ
-page_scale_auto=ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଛୋଟବଡ଼ କରିବା
-page_scale_actual=ପ୍ରକୃତ ଆକାର
-
-# Loading indicator messages
-loading_error_indicator=ତ୍ରୁଟି
-loading_error=PDF ଧାରଣ କରିବା ସମୟରେ ଏକ ତ୍ରୁଟି ଘଟିଲା।
-invalid_file_error=ଅବୈଧ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ PDF ଫାଇଲ।
-missing_file_error=ହଜିଯାଇଥିବା PDF ଫାଇଲ।
-unexpected_response_error=ଅପ୍ରତ୍ୟାଶିତ ସର୍ଭର ଉତ୍ତର।
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Annotation]
-password_label=ଏହି PDF ଫାଇଲକୁ ଖୋଲିବା ପାଇଁ ପ୍ରବେଶ ସଂକେତ ଭରଣ କରନ୍ତୁ।
-password_invalid=ଭୁଲ ପ୍ରବେଶ ସଂକେତ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।
-password_ok=ଠିକ ଅଛି
-password_cancel=ବାତିଲ କରନ୍ତୁ
-
-printing_not_supported=ଚେତାବନୀ: ଏହି ବ୍ରାଉଜର ଦ୍ୱାରା ମୁଦ୍ରଣ କ୍ରିୟା ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ।
-printing_not_ready=ଚେତାବନୀ: PDF ଟି ମୁଦ୍ରଣ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଧାରଣ ହୋଇ ନାହିଁ।
-web_fonts_disabled=ୱେବ ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି: ସନ୍ନିହିତ PDF ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାରେ ଅସମର୍ଥ।
-document_colors_disabled=PDF ଦଲିଲଗୁଡ଼ିକ ସେମାନଙ୍କର ନିଜର ରଙ୍ଗ ବ୍ୟବହାର କରିବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ: 'ସେମାନଙ୍କର ନିଜ ରଙ୍ଗ ବାଛିବା ପାଇଁ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ' କୁ ବ୍ରାଉଜରରେ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି।
diff --git a/public/pfd/build/generic/web/locale/pa-IN/viewer.properties b/public/pfd/build/generic/web/locale/pa-IN/viewer.properties
deleted file mode 100644
index fb26fc3..0000000
--- a/public/pfd/build/generic/web/locale/pa-IN/viewer.properties
+++ /dev/null
@@ -1,181 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=ਸਫ਼ਾ ਪਿੱਛੇ
-previous_label=ਪਿੱਛੇ
-next.title=ਸਫ਼ਾ ਅੱਗੇ
-next_label=ਅੱਗੇ
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=ਸਫ਼ਾ:
-page_of={{pageCount}} ਵਿੱਚੋਂ
-
-zoom_out.title=ਜ਼ੂਮ ਆਉਟ
-zoom_out_label=ਜ਼ੂਮ ਆਉਟ
-zoom_in.title=ਜ਼ੂਮ ਇਨ
-zoom_in_label=ਜ਼ੂਮ ਇਨ
-zoom.title=ਜ਼ੂਨ
-print.title=ਪਰਿੰਟ
-print_label=ਪਰਿੰਟ
-presentation_mode.title=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ
-presentation_mode_label=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ
-
-open_file.title=ਫਾਈਲ ਖੋਲ੍ਹੋ
-open_file_label=ਖੋਲ੍ਹੋ
-download.title=ਡਾਊਨਲੋਡ
-download_label=ਡਾਊਨਲੋਡ
-bookmark.title=ਮੌਜੂਦਾ ਝਲਕ (ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਕਾਪੀ ਕਰੋ ਜਾਂ ਖੋਲ੍ਹੋ)
-bookmark_label=ਮੌਜੂਦਾ ਝਲਕ
-
-# Secondary toolbar and context menu
-tools.title=ਟੂਲ
-tools_label=ਟੂਲ
-first_page.title=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
-first_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
-first_page_label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
-
-last_page.title=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
-last_page_label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
-page_rotate_cw.title=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ
-page_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ
-page_rotate_cw_label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ
-page_rotate_ccw.title=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ
-page_rotate_ccw_label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ
-
-hand_tool_enable.title=ਹੱਥ ਟੂਲ ਚਾਲੂ
-hand_tool_enable_label=ਹੱਥ ਟੂਲ ਚਾਲੂ
-hand_tool_disable.title=ਹੱਥ ਟੂਲ ਬੰਦ
-hand_tool_disable_label=ਹੱਥ ਟੂਲ ਬੰਦ
-
-# Document properties dialog box
-document_properties.title=…ਦਸਤਾਵੇਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ
-document_properties_label=…ਦਸਤਾਵੇਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ
-document_properties_file_name=ਫਾਈਲ ਨਾਂ:
-document_properties_file_size=ਫਾਈਲ ਆਕਾਰ:
-document_properties_kb={{size_kb}} KB ({{size_b}} ਬਾਈਟ)
-document_properties_mb={{size_mb}} MB ({{size_b}} ਬਾਈਟ)
-document_properties_title=ਟਾਈਟਲ:
-document_properties_author=ਲੇਖਕ:
-document_properties_subject=ਵਿਸ਼ਾ:
-document_properties_keywords=ਸ਼ਬਦ:
-document_properties_creation_date=ਬਣਾਉਣ ਮਿਤੀ:
-document_properties_modification_date=ਸੋਧ ਮਿਤੀ:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=ਨਿਰਮਾਤਾ:
-document_properties_producer=PDF ਪ੍ਰੋਡਿਊਸਰ:
-document_properties_version=PDF ਵਰਜਨ:
-document_properties_page_count=ਸਫ਼ਾ ਗਿਣਤੀ:
-document_properties_close=ਬੰਦ ਕਰੋ
-
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ
-toggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ
-
-outline.title=ਦਸਤਾਵੇਜ਼ ਆਉਟਲਾਈਨ ਵੇਖਾਓ
-outline_label=ਦਸਤਾਵੇਜ਼ ਆਉਟਲਾਈਨ
-attachments.title=ਅਟੈਚਮੈਂਟ ਵੇਖਾਓ
-attachments_label=ਅਟੈਚਮੈਂਟ
-thumbs.title=ਥੰਮਨੇਲ ਵੇਖਾਓ
-thumbs_label=ਥੰਮਨੇਲ
-findbar.title=ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ
-findbar_label=ਲੱਭੋ
-
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=ਸਫ਼ਾ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}} ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ
-
-
-# Context menu
-first_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
-last_page.label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
-page_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਉ
-page_rotate_ccw.label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਉ
-
-# Find panel button title and messages
-find_label=ਲੱਭੋ:
-find_previous.title=ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ
-find_previous_label=ਪਿੱਛੇ
-find_next.title=ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ
-find_next_label=ਅੱਗੇ
-find_highlight=ਸਭ ਉਭਾਰੋ
-find_match_case_label=ਅੱਖਰ ਆਕਾਰ ਮਿਲਾਉ
-find_reached_top=ਦਸਤਾਵੇਜ਼ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ
-find_reached_bottom=ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ
-find_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ
-
-
-# Error panel labels
-error_more_info=ਹੋਰ ਜਾਣਕਾਰੀ
-error_less_info=ਘੱਟ ਜਾਣਕਾਰੀ
-error_close=ਬੰਦ ਕਰੋ
-
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (ਬਿਲਡ: {{build}}
-
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=ਸੁਨੇਹਾ: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=ਸਟੈਕ: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ਫਾਈਲ: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=ਲਾਈਨ: {{line}}
-rendering_error=ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।
-
-# Predefined zoom values
-page_scale_width=ਸਫ਼ਾ ਚੌੜਾਈ
-page_scale_fit=ਸਫ਼ਾ ਫਿੱਟ
-page_scale_auto=ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ
-page_scale_actual=ਆਟੋਮੈਟਿਕ ਆਕਾਰ
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
-loading_error_indicator=ਗਲਤੀ
-loading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।
-invalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਈਲ ਹੈ।
-missing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਈਲ।
-unexpected_response_error=ਅਣਜਾਣ ਸਰਵਰ ਜਵਾਬ।
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}}  ਵਿਆਖਿਆ]
-password_label=ਇਹ PDF ਫਾਈਲ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ।
-password_invalid=ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।
-password_ok=ਠੀਕ ਹੈ
-password_cancel=ਰੱਦ ਕਰੋ
-
-printing_not_supported=ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।
-printing_not_ready=ਸਾਵਧਾਨ: PDF ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ।
-web_fonts_disabled=ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ PDF ਫੋਂਟ ਵਰਤਨ ਲਈ ਅਸਮਰੱਥ ਹੈ।
-document_colors_disabled=PDF ਡੌਕੂਮੈਂਟ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦੀ ਇਜ਼ਾਜ਼ਤ ਨਹੀਂ ਹੈ।: ਬਰਾਊਜ਼ਰ ਵਿੱਚ  \u0022ਸਫ਼ਿਆਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦਿਉ\u0022  ਨੂੰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।
\ No newline at end of file
diff --git a/public/pfd/build/generic/web/locale/pl/viewer.properties b/public/pfd/build/generic/web/locale/pl/viewer.properties
deleted file mode 100644
index 143c52a..0000000
--- a/public/pfd/build/generic/web/locale/pl/viewer.properties
+++ /dev/null
@@ -1,152 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Poprzednia strona
-previous_label=Poprzednia
-next.title=Następna strona
-next_label=Następna
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Strona:
-page_of=z {{pageCount}}
-
-zoom_out.title=Pomniejszenie
-zoom_out_label=Pomniejsz
-zoom_in.title=Powiększenie
-zoom_in_label=Powiększ
-zoom.title=Skala
-presentation_mode.title=Przełącz na tryb prezentacji
-presentation_mode_label=Tryb prezentacji
-open_file.title=Otwieranie pliku
-open_file_label=Otwórz
-print.title=Drukowanie
-print_label=Drukuj
-download.title=Pobieranie
-download_label=Pobierz
-bookmark.title=Bieżąca pozycja (skopiuj lub otwórz jako odnośnik w nowym oknie)
-bookmark_label=Bieżąca pozycja
-
-tools.title=Tools
-tools_label=Tools
-first_page.title=Przechodzenie do pierwszej strony
-first_page.label=Przejdź do pierwszej strony
-first_page_label=Przejdź do pierwszej strony
-last_page.title=Przechodzenie do ostatniej strony
-last_page.label=Przejdź do ostatniej strony
-last_page_label=Przejdź do ostatniej strony
-page_rotate_cw.title=Obracanie zgodnie z ruchem wskazówek zegara
-page_rotate_cw.label=Obróć zgodnie z ruchem wskazówek zegara
-page_rotate_cw_label=Obróć zgodnie z ruchem wskazówek zegara
-page_rotate_ccw.title=Obracanie przeciwnie do ruchu wskazówek zegara
-page_rotate_ccw.label=Obróć przeciwnie do ruchu wskazówek zegara
-page_rotate_ccw_label=Obróć przeciwnie do ruchu wskazówek zegara
-
-hand_tool_enable.title=Włączanie narzędzia rączka
-hand_tool_enable_label=Włącz narzędzie rączka
-hand_tool_disable.title=Wyłączanie narzędzia rączka
-hand_tool_disable_label=Wyłącz narzędzie rączka
-
-document_properties.title=Właściwości dokumentu…
-document_properties_label=Właściwości dokumentu…
-document_properties_file_name=Nazwa pliku:
-document_properties_file_size=Rozmiar pliku:
-document_properties_kb={{size_kb}} KB ({{size_b}} b)
-document_properties_mb={{size_mb}} MB ({{size_b}} b)
-document_properties_title=Tytuł:
-document_properties_author=Autor:
-document_properties_subject=Temat:
-document_properties_keywords=Słowa kluczowe:
-document_properties_creation_date=Data utworzenia:
-document_properties_modification_date=Data modyfikacji:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Utworzony przez:
-document_properties_producer=PDF wyprodukowany przez:
-document_properties_version=Wersja PDF:
-document_properties_page_count=Liczba stron:
-document_properties_close=Zamknij
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Przełączanie panelu bocznego
-toggle_sidebar_label=Przełącz panel boczny
-outline.title=Wyświetlanie zarysu dokumentu
-outline_label=Zarys dokumentu
-attachments.title=Wyświetlanie załączników
-attachments_label=Załączniki
-thumbs.title=Wyświetlanie miniaturek
-thumbs_label=Miniaturki
-findbar.title=Znajdź w dokumencie
-findbar_label=Znajdź
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Strona {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniaturka strony {{page}}
-
-# Find panel button title and messages
-find_label=Znajdź:
-find_previous.title=Znajdź poprzednie wystąpienie tekstu
-find_previous_label=Poprzednie
-find_next.title=Znajdź następne wystąpienie tekstu
-find_next_label=Następne
-find_highlight=Podświetl wszystkie
-find_match_case_label=Rozróżniaj wielkość znaków
-find_reached_top=Osiągnięto początek dokumentu, kontynuacja od końca
-find_reached_bottom=Osiągnięto koniec dokumentu, kontynuacja od początku
-find_not_found=Tekst nieznaleziony
-
-# Error panel labels
-error_more_info=Więcej informacji
-error_less_info=Mniej informacji
-error_close=Zamknij
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (kompilacja: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Wiadomość: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stos: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Plik: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Wiersz: {{line}}
-rendering_error=Podczas renderowania strony wystąpił błąd.
-
-# Predefined zoom values
-page_scale_width=Szerokość strony
-page_scale_fit=Dopasowanie strony
-page_scale_auto=Skala automatyczna
-page_scale_actual=Rozmiar rzeczywisty
-page_scale_percent={{scale}}%
-
-loading_error_indicator=Błąd
-loading_error=Podczas wczytywania dokumentu PDF wystąpił błąd.
-invalid_file_error=Nieprawidłowy lub uszkodzony plik PDF.
-missing_file_error=Brak pliku PDF.
-unexpected_response_error=Nieoczekiwana odpowiedź serwera.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Adnotacja: {{type}}]
-password_label=Wprowadź hasło, aby otworzyć ten dokument PDF.
-password_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie.
-password_ok=OK
-password_cancel=Anuluj
-
-printing_not_supported=Ostrzeżenie: Drukowanie nie jest w pełni wspierane przez przeglądarkę.
-printing_not_ready=Ostrzeżenie: Dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować.
-web_fonts_disabled=Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF.
-document_colors_disabled=Dokumenty PDF nie mogą używać własnych kolorów: Opcja „Pozwalaj stronom stosować inne kolory” w przeglądarce jest nieaktywna.
diff --git a/public/pfd/build/generic/web/locale/pt-BR/viewer.properties b/public/pfd/build/generic/web/locale/pt-BR/viewer.properties
deleted file mode 100644
index 0de5b03..0000000
--- a/public/pfd/build/generic/web/locale/pt-BR/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Página anterior
-previous_label=Anterior
-next.title=Próxima página
-next_label=Próxima
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Página:
-page_of=de {{pageCount}}
-
-zoom_out.title=Diminuir zoom
-zoom_out_label=Diminuir zoom
-zoom_in.title=Aumentar zoom
-zoom_in_label=Aumentar zoom
-zoom.title=Zoom
-presentation_mode.title=Alternar para modo de apresentação
-presentation_mode_label=Modo de apresentação
-open_file.title=Abrir arquivo
-open_file_label=Abrir
-print.title=Imprimir
-print_label=Imprimir
-download.title=Download
-download_label=Download
-bookmark.title=Visualização atual (copie ou abra em nova janela)
-bookmark_label=Visualização atual
-
-# Secondary toolbar and context menu
-tools.title=Ferramentas
-tools_label=Ferramentas
-first_page.title=Ir para a primeira página
-first_page.label=Ir para a primeira página
-first_page_label=Ir para a primeira página
-last_page.title=Ir para a última página
-last_page.label=Ir para a última página
-last_page_label=Ir para a última página
-page_rotate_cw.title=Girar no sentido horário
-page_rotate_cw.label=Girar no sentido horário
-page_rotate_cw_label=Girar no sentido horário
-page_rotate_ccw.title=Girar no sentido anti-horário
-page_rotate_ccw.label=Girar no sentido anti-horário
-page_rotate_ccw_label=Girar no sentido anti-horário
-
-hand_tool_enable.title=Ativar ferramenta da mão
-hand_tool_enable_label=Ativar ferramenta da mão
-hand_tool_disable.title=Desativar ferramenta da mão
-hand_tool_disable_label=Desativar ferramenta da mão
-
-# Document properties dialog box
-document_properties.title=Propriedades do documento…
-document_properties_label=Propriedades do documento…
-document_properties_file_name=Nome do arquivo:
-document_properties_file_size=Tamanho do arquivo:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Título:
-document_properties_author=Autor:
-document_properties_subject=Assunto:
-document_properties_keywords=Palavras-chave:
-document_properties_creation_date=Data da criação:
-document_properties_modification_date=Data da modificação:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Criação:
-document_properties_producer=Criador do PDF:
-document_properties_version=Versão do PDF:
-document_properties_page_count=Contagem de páginas:
-document_properties_close=Fechar
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Exibir/ocultar painel
-toggle_sidebar_label=Exibir/ocultar painel
-outline.title=Exibir estrutura de tópicos
-outline_label=Estrutura de tópicos do documento
-attachments.title=Exibir anexos
-attachments_label=Anexos
-thumbs.title=Exibir miniaturas das páginas
-thumbs_label=Miniaturas
-findbar.title=Localizar no documento
-findbar_label=Localizar
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Página {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura da página {{page}}
-
-# Find panel button title and messages
-find_label=Localizar:
-find_previous.title=Localizar a ocorrência anterior do texto
-find_previous_label=Anterior
-find_next.title=Localizar a próxima ocorrência do texto
-find_next_label=Próxima
-find_highlight=Realçar tudo
-find_match_case_label=Diferenciar maiúsculas/minúsculas
-find_reached_top=Atingido o início do documento, continuando do fim
-find_reached_bottom=Atingido o fim do documento, continuando do início
-find_not_found=Texto não encontrado
-
-# Error panel labels
-error_more_info=Mais informações
-error_less_info=Menos informações
-error_close=Fechar
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mensagem: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Arquivo: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linha: {{line}}
-rendering_error=Ocorreu um erro ao renderizar a página.
-
-# Predefined zoom values
-page_scale_width=Largura da página
-page_scale_fit=Ajustar à janela
-page_scale_auto=Zoom automático
-page_scale_actual=Tamanho real
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Erro
-loading_error=Ocorreu um erro ao carregar o PDF.
-invalid_file_error=Arquivo PDF corrompido ou inválido.
-missing_file_error=Arquivo PDF ausente.
-unexpected_response_error=Resposta inesperada do servidor.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotação {{type}}]
-password_label=Forneça a senha para abrir este arquivo PDF.
-password_invalid=Senha inválida. Por favor, tente de novo.
-password_ok=OK
-password_cancel=Cancelar
-
-printing_not_supported=Alerta: a impressão não é totalmente suportada neste navegador.
-printing_not_ready=Alerta: o PDF não está totalmente carregado para impressão.
-web_fonts_disabled=Fontes da web estão desativadas: não é possível usar fontes incorporadas do PDF.
-document_colors_disabled=Documentos PDF não estão permitidos a usar suas próprias cores: “Páginas podem usar outras cores” está desativado no navegador.
diff --git a/public/pfd/build/generic/web/locale/pt-PT/viewer.properties b/public/pfd/build/generic/web/locale/pt-PT/viewer.properties
deleted file mode 100644
index eb0f2d3..0000000
--- a/public/pfd/build/generic/web/locale/pt-PT/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Página anterior
-previous_label=Anterior
-next.title=Página seguinte
-next_label=Seguinte
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Página:
-page_of=de {{pageCount}}
-
-zoom_out.title=Reduzir
-zoom_out_label=Reduzir
-zoom_in.title=Ampliar
-zoom_in_label=Ampliar
-zoom.title=Ampliação
-presentation_mode.title=Mudar para modo de apresentação
-presentation_mode_label=Modo de apresentação
-open_file.title=Abrir ficheiro
-open_file_label=Abrir
-print.title=Imprimir
-print_label=Imprimir
-download.title=Transferir
-download_label=Transferir
-bookmark.title=Vista atual (copiar ou abrir em nova janela)
-bookmark_label=Vista atual
-
-# Secondary toolbar and context menu
-tools.title=Ferramentas
-tools_label=Ferramentas
-first_page.title=Ir para a primeira página
-first_page.label=Ir para a primeira página
-first_page_label=Ir para a primeira página
-last_page.title=Ir para a última página
-last_page.label=Ir para a última página
-last_page_label=Ir para a última página
-page_rotate_cw.title=Rodar à direita
-page_rotate_cw.label=Rodar à direita
-page_rotate_cw_label=Rodar à direita
-page_rotate_ccw.title=Rodar à esquerda
-page_rotate_ccw.label=Rodar à esquerda
-page_rotate_ccw_label=Rodar à esquerda
-
-hand_tool_enable.title=Ativar ferramenta de mão
-hand_tool_enable_label=Ativar ferramenta de mão
-hand_tool_disable.title=Desativar ferramenta de mão
-hand_tool_disable_label=Desativar ferramenta de mão
-
-# Document properties dialog box
-document_properties.title=Propriedades do documento...
-document_properties_label=Propriedades do documento...
-document_properties_file_name=Nome do ficheiro:
-document_properties_file_size=Tamanho do ficheiro:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Título:
-document_properties_author=Autor:
-document_properties_subject=Assunto:
-document_properties_keywords=Palavras-chave:
-document_properties_creation_date=Data de criação:
-document_properties_modification_date=Data de modificação:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Criador:
-document_properties_producer=Produtor de PDF:
-document_properties_version=versão do PDF:
-document_properties_page_count=N.º de páginas:
-document_properties_close=Fechar
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Comutar barra lateral
-toggle_sidebar_label=Comutar barra lateral
-outline.title=Mostrar estrutura do documento
-outline_label=Estrutura do documento
-attachments.title=Mostrar anexos
-attachments_label=Anexos
-thumbs.title=Mostrar miniaturas
-thumbs_label=Miniaturas
-findbar.title=Localizar no documento
-findbar_label=Localizar
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Página {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura da página {{page}}
-
-# Find panel button title and messages
-find_label=Localizar:
-find_previous.title=Localizar ocorrência anterior da frase
-find_previous_label=Anterior
-find_next.title=Localizar ocorrência seguinte da frase
-find_next_label=Seguinte
-find_highlight=Destacar tudo
-find_match_case_label=Correspondência
-find_reached_top=Início de documento atingido, a continuar do fim
-find_reached_bottom=Fim da página atingido, a continuar do início
-find_not_found=Frase não encontrada
-
-# Error panel labels
-error_more_info=Mais informação
-error_less_info=Menos informação
-error_close=Fechar
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (compilação: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mensagem: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Pilha: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Ficheiro: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linha: {{line}}
-rendering_error=Ocorreu um erro ao processar a página.
-
-# Predefined zoom values
-page_scale_width=Ajustar à largura
-page_scale_fit=Ajustar à página
-page_scale_auto=Tamanho automático
-page_scale_actual=Tamanho real
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Erro
-loading_error=Ocorreu um erro ao carregar o PDF.
-invalid_file_error=Ficheiro PDF inválido ou danificado.
-missing_file_error=Ficheiro PDF inexistente.
-unexpected_response_error=Resposta inesperada do servidor.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotação {{type}}]
-password_label=Introduza a palavra-passe para abrir este PDF.
-password_invalid=Palavra-passe inválida. Tente novamente.
-password_ok=OK
-password_cancel=Cancelar
-
-printing_not_supported=Aviso: a impressão não é totalmente suportada por este navegador.
-printing_not_ready=Aviso: o PDF ainda não está totalmente carregado.
-web_fonts_disabled=Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF incorporados.
-document_colors_disabled=Os documentos PDF não permitem a utilização das suas próprias cores: Autorizar as páginas a escolher as suas próprias cores está desativado no navegador.
diff --git a/public/pfd/build/generic/web/locale/rm/viewer.properties b/public/pfd/build/generic/web/locale/rm/viewer.properties
deleted file mode 100644
index 69a20d9..0000000
--- a/public/pfd/build/generic/web/locale/rm/viewer.properties
+++ /dev/null
@@ -1,157 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Pagina precedenta
-previous_label=Enavos
-next.title=Proxima pagina
-next_label=Enavant
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Pagina:
-page_of=da {{pageCount}}
-
-zoom_out.title=Empitschnir
-zoom_out_label=Empitschnir
-zoom_in.title=Engrondir
-zoom_in_label=Engrondir
-zoom.title=Zoom
-presentation_mode.title=Midar en il modus da preschentaziun
-presentation_mode_label=Modus da preschentaziun
-open_file.title=Avrir datoteca
-open_file_label=Avrir
-print.title=Stampar
-print_label=Stampar
-download.title=Telechargiar
-download_label=Telechargiar
-bookmark.title=Vista actuala (copiar u avrir en ina nova fanestra)
-bookmark_label=Vista actuala
-
-# Secondary toolbar and context menu
-tools.title=Utensils
-tools_label=Utensils
-first_page.title=Siglir a l'emprima pagina
-first_page.label=Siglir a l'emprima pagina
-first_page_label=Siglir a l'emprima pagina
-last_page.title=Siglir a la davosa pagina
-last_page.label=Siglir a la davosa pagina
-last_page_label=Siglir a la davosa pagina
-page_rotate_cw.title=Rotar en direcziun da l'ura
-page_rotate_cw.label=Rotar en direcziun da l'ura
-page_rotate_cw_label=Rotar en direcziun da l'ura
-page_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura
-page_rotate_ccw.label=Rotar en direcziun cuntraria a l'ura
-page_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura
-
-hand_tool_enable.title=Activar l'utensil da maun
-hand_tool_enable_label=Activar l'utensil da maun
-hand_tool_disable.title=Deactivar l'utensil da maun
-hand_tool_disable_label=Deactivar l'utensil da maun
-
-# Document properties dialog box
-document_properties.title=Caracteristicas dal document…
-document_properties_label=Caracteristicas dal document…
-document_properties_file_name=Num da la datoteca:
-document_properties_file_size=Grondezza da la datoteca:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=Titel:
-document_properties_author=Autur:
-document_properties_subject=Tema:
-document_properties_keywords=Chavazzins:
-document_properties_creation_date=Data da creaziun:
-document_properties_modification_date=Data da modificaziun:
-document_properties_date_string={{date}} {{time}}
-document_properties_creator=Creà da:
-document_properties_producer=Creà il PDF cun:
-document_properties_version=Versiun da PDF:
-document_properties_page_count=Dumber da paginas:
-document_properties_close=Serrar
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Activar/deactivar la trav laterala
-toggle_sidebar_label=Activar/deactivar la trav laterala
-outline.title=Mussar la structura da la pagina
-outline_label=Structura da la pagina
-attachments.title=Mussar agiuntas
-attachments_label=Agiuntas
-thumbs.title=Mussar las miniaturas
-thumbs_label=Miniaturas
-findbar.title=Tschertgar en il document
-findbar_label=Tschertgar
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Pagina {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura da la pagina {{page}}
-
-# Find panel button title and messages
-find_label=Tschertgar:
-find_previous.title=Tschertgar la posiziun precedenta da l'expressiun
-find_previous_label=Enavos
-find_next.title=Tschertgar la proxima posiziun da l'expressiun
-find_next_label=Enavant
-find_highlight=Relevar tuts
-find_match_case_label=Resguardar maiusclas/minusclas
-find_reached_top=Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document
-find_reached_bottom=La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document
-find_not_found=Impussibel da chattar l'expressiun
-
-# Error panel labels
-error_more_info=Dapli infurmaziuns
-error_less_info=Damain infurmaziuns
-error_close=Serrar
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Messadi: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Datoteca: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Lingia: {{line}}
-rendering_error=Ina errur è cumparida cun visualisar questa pagina.
-
-# Predefined zoom values
-page_scale_width=Ladezza da la pagina
-page_scale_fit=Entira pagina
-page_scale_auto=Zoom automatic
-page_scale_actual=Grondezza actuala
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Errur
-loading_error=Ina errur è cumparida cun chargiar il PDF.
-invalid_file_error=Datoteca PDF nunvalida u donnegiada.
-missing_file_error=Datoteca PDF manconta.
-unexpected_response_error=Resposta nunspetgada dal server.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Annotaziun da {{type}}]
-password_label=Endatescha il pled-clav per avrir questa datoteca da PDF.
-password_invalid=Pled-clav nunvalid. Emprova anc ina giada.
-password_ok=OK
-password_cancel=Interrumper
-
-printing_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur.
-printing_not_ready=Attenziun: Il PDF n'è betg chargià cumplettamain per stampar.
-web_fonts_disabled=Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF.
-document_colors_disabled=Documents da PDF na pon betg utilisar lur atgnas colurs: \'Permetter a las paginas d'utilisar lur atgnas colurs empè da las colurs tschernidas survart\' è deactivà en il navigatur.
diff --git a/public/pfd/build/generic/web/locale/ro/viewer.properties b/public/pfd/build/generic/web/locale/ro/viewer.properties
deleted file mode 100644
index ecd37eb..0000000
--- a/public/pfd/build/generic/web/locale/ro/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Pagina precedentă
-previous_label=Înapoi
-next.title=Pagina următoare
-next_label=Înainte
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Pagină:
-page_of=din {{pageCount}}
-
-zoom_out.title=Micșorează
-zoom_out_label=Micșorează
-zoom_in.title=Mărește
-zoom_in_label=Mărește
-zoom.title=Scalare
-presentation_mode.title=Schimbă la modul de prezentare
-presentation_mode_label=Mod de prezentare
-open_file.title=Deschide un fișier
-open_file_label=Deschide
-print.title=Tipărește
-print_label=Tipărește
-download.title=Descarcă
-download_label=Descarcă
-bookmark.title=Vizualizare curentă (copiați sau deschideți într-o fereastră nouă)
-bookmark_label=Vizualizare curentă
-
-# Secondary toolbar and context menu
-tools.title=Unelte
-tools_label=Unelte
-first_page.title=Mergi la prima pagină
-first_page.label=Mergeți la prima pagină
-first_page_label=Mergi la prima pagină
-last_page.title=Mergi la ultima pagină
-last_page.label=Mergi la ultima pagină
-last_page_label=Mergi la ultima pagină
-page_rotate_cw.title=Rotește în sensul acelor de ceasornic
-page_rotate_cw.label=Rotește în sensul acelor de ceasornic
-page_rotate_cw_label=Rotește în sensul acelor de ceasornic
-page_rotate_ccw.title=Rotește în sens invers al acelor de ceasornic
-page_rotate_ccw.label=Rotate Counter-Clockwise
-page_rotate_ccw_label=Rotește în sens invers acelor de ceasornic
-
-hand_tool_enable.title=Activează instrumentul mână
-hand_tool_enable_label=Activează instrumentul mână
-hand_tool_disable.title=Dezactivează instrumentul mână
-hand_tool_disable_label=Dezactivează instrumentul mână
-
-# Document properties dialog box
-document_properties.title=Proprietățile documentului…
-document_properties_label=Proprietățile documentului…
-document_properties_file_name=Nume fișier:
-document_properties_file_size=Dimensiune fișier:
-document_properties_kb={{size_kb}} KB ({{size_b}} biți)
-document_properties_mb={{size_mb}} MB ({{size_b}} biți)
-document_properties_title=Titlu:
-document_properties_author=Autor:
-document_properties_subject=Subiect:
-document_properties_keywords=Cuvinte cheie:
-document_properties_creation_date=Data creării:
-document_properties_modification_date=Data modificării:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Autor:
-document_properties_producer=Producător PDF:
-document_properties_version=Versiune PDF:
-document_properties_page_count=Număr de pagini:
-document_properties_close=Închide
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Comută bara laterală
-toggle_sidebar_label=Comută bara laterală
-outline.title=Arată schița documentului
-outline_label=Schiță document
-attachments.title=Afișează atașamentele
-attachments_label=Atașamente
-thumbs.title=Arată miniaturi
-thumbs_label=Miniaturi
-findbar.title=Caută în document
-findbar_label=Căutați
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Pagina {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatura paginii {{page}}
-
-# Find panel button title and messages
-find_label=Caută:
-find_previous.title=Găsește instanța anterioară în frază
-find_previous_label=Anterior
-find_next.title=Găstește următoarea instanță în frază
-find_next_label=Următor
-find_highlight=Evidențiază aparițiile
-find_match_case_label=Potrivire litere
-find_reached_top=Am ajuns la începutul documentului, continuă de la sfârșit
-find_reached_bottom=Am ajuns la sfârșitul documentului, continuă de la început
-find_not_found=Nu s-a găsit textul
-
-# Error panel labels
-error_more_info=Mai multe informații
-error_less_info=Mai puțină informație
-error_close=Închide
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (varianta: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mesaj: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stivă: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fișier: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linie: {{line}}
-rendering_error=A intervenit o eroare la afișarea paginii.
-
-# Predefined zoom values
-page_scale_width=Lățime pagină
-page_scale_fit=Potrivire la pagină
-page_scale_auto=Dimensiune automată
-page_scale_actual=Dimensiune reală
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Eroare
-loading_error=A intervenit o eroare la încărcarea fișierului PDF.
-invalid_file_error=Fișier PDF invalid sau deteriorat.
-missing_file_error=Fișier PDF lipsă.
-unexpected_response_error=Răspuns neașteptat de la server.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Adnotare]
-password_label=Introduceți parola pentru a deschide acest fişier PDF.
-password_invalid=Parolă greșită. Vă rugăm încercați din nou.
-password_ok=Ok
-password_cancel=Renunță
-
-printing_not_supported=Atenție: Tipărirea nu este suportată în totalitate de acest navigator.
-printing_not_ready=Atenție: Fișierul PDF nu este încărcat complet pentru tipărire.
-web_fonts_disabled=Fonturile web sunt dezactivate: nu pot utiliza fonturile PDF încorporate.
-document_colors_disabled=Documentele PDF nu sunt autorizate să folosească propriile culori: 'Permite paginilor să aleagă propriile culori' este dezactivată în navigator.
diff --git a/public/pfd/build/generic/web/locale/ru/viewer.properties b/public/pfd/build/generic/web/locale/ru/viewer.properties
deleted file mode 100644
index 349f2cb..0000000
--- a/public/pfd/build/generic/web/locale/ru/viewer.properties
+++ /dev/null
@@ -1,111 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-previous.title = Предыдущая страница
-previous_label = Предыдущая
-next.title = Следующая страница
-next_label = Следующая
-page_label = Страница:
-page_of = из {{pageCount}}
-zoom_out.title = Уменьшить
-zoom_out_label = Уменьшить
-zoom_in.title = Увеличить
-zoom_in_label = Увеличить
-zoom.title = Масштаб
-presentation_mode.title = Перейти в режим презентации
-presentation_mode_label = Режим презентации
-open_file.title = Открыть файл
-open_file_label = Открыть
-print.title = Печать
-print_label = Печать
-download.title = Загрузить
-download_label = Загрузить
-bookmark.title = Ссылка на текущий вид (скопировать или открыть в новом окне)
-bookmark_label = Текущий вид
-tools.title = Инструменты
-tools_label = Инструменты
-first_page.title = Перейти на первую страницу
-first_page.label = Перейти на первую страницу
-first_page_label = Перейти на первую страницу
-last_page.title = Перейти на последнюю страницу
-last_page.label = Перейти на последнюю страницу
-last_page_label = Перейти на последнюю страницу
-page_rotate_cw.title = Повернуть по часовой стрелке
-page_rotate_cw.label = Повернуть по часовой стрелке
-page_rotate_cw_label = Повернуть по часовой стрелке
-page_rotate_ccw.title = Повернуть против часовой стрелки
-page_rotate_ccw.label = Повернуть против часовой стрелки
-page_rotate_ccw_label = Повернуть против часовой стрелки
-hand_tool_enable.title = Включить Инструмент «Рука»
-hand_tool_enable_label = Включить Инструмент «Рука»
-hand_tool_disable.title = Отключить Инструмент «Рука»
-hand_tool_disable_label = Отключить Инструмент «Рука»
-document_properties.title = Свойства документа…
-document_properties_label = Свойства документа…
-document_properties_file_name = Имя файла:
-document_properties_file_size = Размер файла:
-document_properties_kb = {{size_kb}} КБ ({{size_b}} байт)
-document_properties_mb = {{size_mb}} МБ ({{size_b}} байт)
-document_properties_title = Заголовок:
-document_properties_author = Автор:
-document_properties_subject = Тема:
-document_properties_keywords = Ключевые слова:
-document_properties_creation_date = Дата создания:
-document_properties_modification_date = Дата изменения:
-document_properties_date_string = {{date}}, {{time}}
-document_properties_creator = Приложение:
-document_properties_producer = Производитель PDF:
-document_properties_version = Версия PDF:
-document_properties_page_count = Число страниц:
-document_properties_close = Закрыть
-toggle_sidebar.title = Открыть/закрыть боковую панель
-toggle_sidebar_label = Открыть/закрыть боковую панель
-outline.title = Показать содержание документа
-outline_label = Содержание документа
-attachments.title = Показать вложения
-attachments_label = Вложения
-thumbs.title = Показать миниатюры
-thumbs_label = Миниатюры
-findbar.title = Найти в документе
-findbar_label = Найти
-thumb_page_title = Страница {{page}}
-thumb_page_canvas = Миниатюра страницы {{page}}
-find_label = Найти:
-find_previous.title = Найти предыдущее вхождение фразы в текст
-find_previous_label = Назад
-find_next.title = Найти следующее вхождение фразы в текст
-find_next_label = Далее
-find_highlight = Подсветить все
-find_match_case_label = С учётом регистра
-find_reached_top = Достигнут верх документа, продолжено снизу
-find_reached_bottom = Достигнут конец документа, продолжено сверху
-find_not_found = Фраза не найдена
-error_more_info = Детали
-error_less_info = Скрыть детали
-error_close = Закрыть
-error_version_info = PDF.js v{{version}} (сборка: {{build}})
-error_message = Сообщение: {{message}}
-error_stack = Стeк: {{stack}}
-error_file = Файл: {{file}}
-error_line = Строка: {{line}}
-rendering_error = При создании страницы произошла ошибка.
-page_scale_width = По ширине страницы
-page_scale_fit = По размеру страницы
-page_scale_auto = Автоматически
-page_scale_actual = Реальный размер
-page_scale_percent = {{scale}}%
-loading_error_indicator = Ошибка
-loading_error = При загрузке PDF произошла ошибка.
-invalid_file_error = Некорректный или повреждённый PDF-файл.
-missing_file_error = PDF-файл отсутствует.
-unexpected_response_error = Неожиданный ответ сервера.
-text_annotation_type.alt = [Аннотация {{type}}]
-password_label = Введите пароль, чтобы открыть этот PDF-файл.
-password_invalid = Неверный пароль. Пожалуйста, попробуйте снова.
-password_ok = OK
-password_cancel = Отмена
-printing_not_supported = Предупреждение: В этом браузере не полностью поддерживается печать.
-printing_not_ready = Предупреждение: PDF не полностью загружен для печати.
-web_fonts_disabled = Веб-шрифты отключены: невозможно использовать встроенные PDF-шрифты.
-document_colors_disabled = PDF-документам не разрешено использовать свои цвета: в браузере отключён параметр «Разрешить веб-сайтам использовать свои цвета».
diff --git a/public/pfd/build/generic/web/locale/rw/viewer.properties b/public/pfd/build/generic/web/locale/rw/viewer.properties
deleted file mode 100644
index 9768101..0000000
--- a/public/pfd/build/generic/web/locale/rw/viewer.properties
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-
-zoom.title=Ihindurangano
-open_file.title=Gufungura Dosiye
-open_file_label=Gufungura
-
-# Secondary toolbar and context menu
-
-
-# Document properties dialog box
-document_properties_title=Umutwe:
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-findbar_label=Gushakisha
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-
-# Find panel button title and messages
-find_label="Gushaka:"
-find_previous.title=Gushaka aho uyu murongo ugaruka mbere y'aha
-find_next.title=Gushaka aho uyu murongo wongera kugaruka
-find_not_found=Umurongo ntubonetse
-
-# Error panel labels
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-
-# Predefined zoom values
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=Ikosa
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-password_invalid=Ijambo ry'ibanga ridahari. Wakongera ukagerageza
-password_ok=YEGO
-password_cancel=Kureka
-
diff --git a/public/pfd/build/generic/web/locale/sah/viewer.properties b/public/pfd/build/generic/web/locale/sah/viewer.properties
deleted file mode 100644
index 1b844d6..0000000
--- a/public/pfd/build/generic/web/locale/sah/viewer.properties
+++ /dev/null
@@ -1,163 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Инники сирэй
-previous_label=Иннинээҕи
-next.title=Аныгыскы сирэй
-next_label=Аныгыскы
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Сирэй:
-page_of=мантан {{pageCount}}
-
-zoom_out.title=Куччат
-zoom_out_label=Куччат
-zoom_in.title=Улаатыннар
-zoom_in_label=Улаатыннар
-zoom.title=Улаатыннар
-presentation_mode.title=Көрдөрөр эрэсиимҥэ
-presentation_mode_label=Көрдөрөр эрэсиим
-open_file.title=Билэни арый
-open_file_label=Ас
-print.title=Бэчээт
-print_label=Бэчээт
-download.title=Хачайдааһын
-download_label=Хачайдааһын
-bookmark.title=Билиҥҥи көстүүтэ (хатылаа эбэтэр саҥа түннүккэ арый)
-bookmark_label=Билиҥҥи көстүүтэ
-
-# Secondary toolbar and context menu
-tools.title=Тэриллэр
-tools_label=Тэриллэр
-first_page.title=Бастакы сирэйгэ көс
-first_page.label=Бастакы сирэйгэ көс
-first_page_label=Бастакы сирэйгэ көс
-last_page.title=Тиһэх сирэйгэ көс
-last_page.label=Тиһэх сирэйгэ көс
-last_page_label=Тиһэх сирэйгэ көс
-page_rotate_cw.title=Чаһы хоту эргит
-page_rotate_cw.label=Чаһы хоту эргит
-page_rotate_cw_label=Чаһы хоту эргит
-page_rotate_ccw.title=Чаһы утары эргит
-page_rotate_ccw.label=Чаһы утары эргит
-page_rotate_ccw_label=Чаһы утары эргит
-
-hand_tool_enable.title=«Илии» диэн тэрили холбоо
-hand_tool_enable_label=«Илии» диэн тэрили холбоо
-hand_tool_disable.title=«Илии» диэн тэрили араар
-hand_tool_disable_label=«Илии» диэн тэрили араар
-
-# Document properties dialog box
-document_properties.title=Докумуон туруоруулара...
-document_properties_label=Докумуон туруоруулара...\u0020
-document_properties_file_name=Билэ аата:
-document_properties_file_size=Билэ кээмэйэ:
-document_properties_kb={{size_kb}} КБ ({{size_b}} баайт)
-document_properties_mb={{size_mb}} МБ ({{size_b}} баайт)
-document_properties_title=Баһа:
-document_properties_author=Ааптар:
-document_properties_subject=Тиэмэ:
-document_properties_keywords=Күлүүс тыл:
-document_properties_creation_date=Оҥоһуллубут кэмэ:
-document_properties_modification_date=Уларытыллыбыт кэмэ:
-document_properties_date_string={{date}}, {{time}}
-document_properties_producer=PDF оҥорооччу:
-document_properties_version=PDF барыла:
-document_properties_page_count=Сирэй ахсаана:
-document_properties_close=Сап
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Ойоҕос хапталы арый/сап
-toggle_sidebar_label=Ойоҕос хапталы арый/сап
-outline.title=Дөкүмүөн иһинээҕитин көрдөр
-outline_label=Дөкүмүөн иһинээҕитэ
-attachments.title=Кыбытыктары көрдөр
-attachments_label=Кыбытык
-thumbs.title=Ойуучааннары көрдөр
-thumbs_label=Ойуучааннар
-findbar.title=Дөкүмүөнтэн бул
-findbar_label=Бул
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Сирэй {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Сирэй ойуучаана {{page}}
-
-# Find panel button title and messages
-find_label=Бул:
-find_previous.title=Этии тиэкискэ бу иннинээҕи киириитин бул
-find_previous_label=Иннинээҕи
-find_next.title=Этии тиэкискэ бу кэннинээҕи киириитин бул
-find_next_label=Аныгыскы
-find_highlight=Барытын сырдатан көрдөр
-find_match_case_label=Буукуба улаханын-кыратын араар
-find_reached_top=Сирэй үрдүгэр тиийдиҥ, салгыыта аллара
-find_reached_bottom=Сирэй бүттэ, үөһэ салҕанна
-find_not_found=Этии көстүбэтэ
-
-# Error panel labels
-error_more_info=Сиһилии
-error_less_info=Сиһилиитин кистээ
-error_close=Сап
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (хомуйуута: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Этии: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Стeк: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Билэ: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Устуруока: {{line}}
-rendering_error=Сирэйи айарга алҕас таҕыста.
-
-# Predefined zoom values
-page_scale_width=Сирэй кэтитинэн
-page_scale_fit=Сирэй кээмэйинэн
-page_scale_auto=Аптамаатынан
-page_scale_actual=Дьиҥнээх кээмэйэ
-
-# Loading indicator messages
-loading_error_indicator=Алҕас
-loading_error=PDF-билэни хачайдыырга алҕас таҕыста.
-invalid_file_error=Туох эрэ алҕастаах эбэтэр алдьаммыт PDF-билэ.
-missing_file_error=PDF-билэ суох.
-unexpected_response_error=Сиэрбэр хоруйдаабат.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} туһунан]
-password_label=Бу PDF-билэни арыйарга көмүскэл тылы киллэриэхтээхин.
-password_invalid=Киирии тыл алҕастаах. Бука диэн, хатылаан көр.
-password_ok=СӨП
-password_cancel=Салҕаама
-
-printing_not_supported=Сэрэтии: Бу браузер бэчээттиири толору өйөөбөт.
-printing_not_ready=Сэрэтии: PDF бэчээттииргэ толору хачайдана илик.
-web_fonts_disabled=Ситим-бичиктэр араарыллыахтара: PDF бичиктэрэ кыайан көстүбэттэр.
-document_colors_disabled=PDF-дөкүмүөүннэргэ бэйэлэрин өҥнөрүн туттар көҥүллэммэтэ: "Ситим-сирдэр бэйэлэрин өҥнөрүн тутталларын көҥүллүүргэ" диэн браузерга арахса сылдьар эбит.
diff --git a/public/pfd/build/generic/web/locale/si/viewer.properties b/public/pfd/build/generic/web/locale/si/viewer.properties
deleted file mode 100644
index 060c12d..0000000
--- a/public/pfd/build/generic/web/locale/si/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=මීට පෙර පිටුව
-previous_label=පෙර
-next.title=මීළඟ පිටුව
-next_label=මීළඟ
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=පිටුව:
-page_of={{pageCount}} කින්
-
-zoom_out.title=කුඩා කරන්න
-zoom_out_label=කුඩා කරන්න
-zoom_in.title=විශාල කරන්න
-zoom_in_label=විශාල කරන්න
-zoom.title=විශාලණය
-presentation_mode.title=ඉදිරිපත්කිරීම් ප්‍රකාරය වෙත මාරුවන්න
-presentation_mode_label=ඉදිරිපත්කිරීම් ප්‍රකාරය
-open_file.title=ගොනුව විවෘත කරන්න
-open_file_label=විවෘත කරන්න
-print.title=මුද්‍රණය
-print_label=මුද්‍රණය
-download.title=බාගන්න
-download_label=බාගන්න
-bookmark.title=දැනට ඇති දසුන (පිටපත් කරන්න හෝ නව කවුළුවක විවෘත කරන්න)
-bookmark_label=දැනට ඇති දසුන
-
-# Secondary toolbar and context menu
-tools.title=මෙවලම්
-tools_label=මෙවලම්
-first_page.title=මුල් පිටුවට යන්න
-first_page.label=මුල් පිටුවට යන්න
-first_page_label=මුල් පිටුවට යන්න
-last_page.title=අවසන් පිටුවට යන්න
-last_page.label=අවසන් පිටුවට යන්න
-last_page_label=අවසන් පිටුවට යන්න
-page_rotate_cw.title=දක්ශිණාවර්තව භ්‍රමණය
-page_rotate_cw.label=දක්ශිණාවර්තව භ්‍රමණය
-page_rotate_cw_label=දක්ශිණාවර්තව භ්‍රමණය
-page_rotate_ccw.title=වාමාවර්තව භ්‍රමණය
-page_rotate_ccw.label=වාමාවර්තව භ්‍රමණය
-page_rotate_ccw_label=වාමාවර්තව භ්‍රමණය
-
-hand_tool_enable.title=හස්ත මෙවලම සක්‍රීය
-hand_tool_enable_label=හස්ත මෙවලම සක්‍රීය
-hand_tool_disable.title=හස්ත මෙවලම අක්‍රීය
-hand_tool_disable_label=හස්ත මෙවලම අක්‍රීය
-
-# Document properties dialog box
-document_properties.title=ලේඛන වත්කම්...
-document_properties_label=ලේඛන වත්කම්...
-document_properties_file_name=ගොනු නම:
-document_properties_file_size=ගොනු ප්‍රමාණය:
-document_properties_kb={{size_kb}} KB ({{size_b}} බයිට)
-document_properties_mb={{size_mb}} MB ({{size_b}} බයිට)
-document_properties_title=සිරස්තලය:
-document_properties_author=කතෲ
-document_properties_subject=මාතෘකාව:
-document_properties_keywords=යතුරු වදන්:
-document_properties_creation_date=නිර්මිත දිනය:
-document_properties_modification_date=වෙනස්කල දිනය:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=නිර්මාපක:
-document_properties_producer=PDF නිශ්පාදක:
-document_properties_version=PDF නිකුතුව:
-document_properties_page_count=පිටු ගණන:
-document_properties_close=වසන්න
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=පැති තීරුවට මාරුවන්න
-toggle_sidebar_label=පැති තීරුවට මාරුවන්න
-outline.title=ලේඛනයේ පිට මායිම පෙන්වන්න
-outline_label=ලේඛනයේ පිට මායිම
-attachments.title=ඇමිණුම් පෙන්වන්න
-attachments_label=ඇමිණුම්
-thumbs.title=සිඟිති රූ පෙන්වන්න
-thumbs_label=සිඟිති රූ
-findbar.title=ලේඛනය තුළ සොයන්න
-findbar_label=සොයන්න
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=පිටුව {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=පිටුවෙ සිඟිත රූව {{page}}
-
-# Find panel button title and messages
-find_label=සොයන්න:
-find_previous.title=මේ වාක්‍ය ඛණ්ඩය මීට පෙර යෙදුණු ස්ථානය සොයන්න
-find_previous_label=පෙර:
-find_next.title=මේ වාක්‍ය ඛණ්ඩය මීළඟට යෙදෙන ස්ථානය සොයන්න
-find_next_label=මීළඟ
-find_highlight=සියල්ල උද්දීපනය
-find_match_case_label=අකුරු ගළපන්න
-find_reached_top=පිටුවේ ඉහළ කෙළවරට ලගාවිය, පහළ සිට ඉදිරියට යමින්
-find_reached_bottom=පිටුවේ පහළ කෙළවරට ලගාවිය, ඉහළ සිට ඉදිරියට යමින්
-find_not_found=ඔබ සෙව් වචන හමු නොවීය
-
-# Error panel labels
-error_more_info=බොහෝ තොරතුරු
-error_less_info=අවම තොරතුරු
-error_close=වසන්න
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (නිකුතුව: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=පණිවිඩය: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ගොනුව: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=පේළිය: {{line}}
-rendering_error=පිටුව රෙන්ඩර් විමේදි ගැටලුවක් හට ගැනුණි.
-
-# Predefined zoom values
-page_scale_width=පිටුවේ පළල
-page_scale_fit=පිටුවට සුදුසු ලෙස
-page_scale_auto=ස්වයංක්‍රීය විශාලණය
-page_scale_actual=නියමිත ප්‍රමාණය
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=දෝෂය
-loading_error=PDF පූරණය විමේදි දෝෂයක් හට ගැනුණි.
-invalid_file_error=දූශිත හෝ සාවද්‍ය PDF ගොනුව.
-missing_file_error=නැතිවූ PDF ගොනුව.
-unexpected_response_error=බලාපොරොත්තු නොවූ සේවාදායක ප්‍රතිචාරය.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} විස්තරය]
-password_label=මෙම PDF ගොනුව විවෘත කිරීමට මුරපදය ඇතුළත් කරන්න.
-password_invalid=වැරදි මුරපදයක්. කරුණාකර නැවත උත්සහ කරන්න.
-password_ok=හරි
-password_cancel=එපා
-
-printing_not_supported=අවවාදයයි: මෙම ගවේශකය මුද්‍රණය සඳහා සම්පූර්ණයෙන් සහය නොදක්වයි.
-printing_not_ready=අවවාදයයි: මුද්‍රණය සඳහා PDF සම්පූර්ණයෙන් පූර්ණය වී නොමැත.
-web_fonts_disabled=ජාල අකුරු අක්‍රීයයි: තිළැලි PDF අකුරු භාවිත කළ නොහැක.
-document_colors_disabled=PDF ලේඛනයට ඔවුන්ගේම වර්ණ භාවිතයට ඉඩ නොලැබේ: 'පිටු වෙත ඔවුන්ගේම වර්ණ භාවිතයට ඉඩදෙන්න' ගවේශකය මත අක්‍රීය කර ඇත.
diff --git a/public/pfd/build/generic/web/locale/sk/viewer.properties b/public/pfd/build/generic/web/locale/sk/viewer.properties
deleted file mode 100644
index 5a9d1a8..0000000
--- a/public/pfd/build/generic/web/locale/sk/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Predchádzajúca strana
-previous_label=Predchádzajúca
-next.title=Nasledujúca strana
-next_label=Nasledujúca
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Strana:
-page_of=z {{pageCount}}
-
-zoom_out.title=Vzdialiť
-zoom_out_label=Vzdialiť
-zoom_in.title=Priblížiť
-zoom_in_label=Priblížiť
-zoom.title=Lupa
-presentation_mode.title=Prepnúť na režim Prezentácia
-presentation_mode_label=Režim Prezentácia
-open_file.title=Otvoriť súbor
-open_file_label=Otvoriť
-print.title=Tlačiť
-print_label=Tlačiť
-download.title=Prevziať
-download_label=Prevziať
-bookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne)
-bookmark_label=Aktuálne zobrazenie
-
-# Secondary toolbar and context menu
-tools.title=Nástroje
-tools_label=Nástroje
-first_page.title=Prejsť na prvú stranu
-first_page.label=Prejsť na prvú stranu
-first_page_label=Prejsť na prvú stranu
-last_page.title=Prejsť na poslednú stranu
-last_page.label=Prejsť na poslednú stranu
-last_page_label=Prejsť na poslednú stranu
-page_rotate_cw.title=Otočiť v smere hodinových ručičiek
-page_rotate_cw.label=Otočiť v smere hodinových ručičiek
-page_rotate_cw_label=Otočiť v smere hodinových ručičiek
-page_rotate_ccw.title=Otočiť proti smeru hodinových ručičiek
-page_rotate_ccw.label=Otočiť proti smeru hodinových ručičiek
-page_rotate_ccw_label=Otočiť proti smeru hodinových ručičiek
-
-hand_tool_enable.title=Zapnúť nástroj Ruka
-hand_tool_enable_label=Zapnúť nástroj Ruka
-hand_tool_disable.title=Vypnúť nástroj Ruka
-hand_tool_disable_label=Vypnúť nástroj Ruka
-
-# Document properties dialog box
-document_properties.title=Vlastnosti dokumentu…
-document_properties_label=Vlastnosti dokumentu…
-document_properties_file_name=Názov súboru:
-document_properties_file_size=Veľkosť súboru:
-document_properties_kb={{size_kb}} kB ({{size_b}} bajtov)
-document_properties_mb={{size_mb}} MB ({{size_b}} bajtov)
-document_properties_title=Názov:
-document_properties_author=Autor:
-document_properties_subject=Predmet:
-document_properties_keywords=Kľúčové slová:
-document_properties_creation_date=Dátum vytvorenia:
-document_properties_modification_date=Dátum úpravy:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Vytvoril:
-document_properties_producer=Tvorca PDF:
-document_properties_version=Verzia PDF:
-document_properties_page_count=Počet strán:
-document_properties_close=Zavrieť
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Prepnúť bočný panel
-toggle_sidebar_label=Prepnúť bočný panel
-outline.title=Zobraziť prehľad dokumentu
-outline_label=Prehľad dokumentu
-attachments.title=Zobraziť prílohy
-attachments_label=Prílohy
-thumbs.title=Zobraziť miniatúry
-thumbs_label=Miniatúry
-findbar.title=Hľadať v dokumente
-findbar_label=Hľadať
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Strana {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatúra strany {{page}}
-
-# Find panel button title and messages
-find_label=Hľadať:
-find_previous.title=Vyhľadať predchádzajúci výskyt reťazca
-find_previous_label=Predchádzajúce
-find_next.title=Vyhľadať ďalší výskyt reťazca
-find_next_label=Ďalšie
-find_highlight=Zvýrazniť všetky
-find_match_case_label=Rozlišovať malé/veľké písmená
-find_reached_top=Bol dosiahnutý začiatok stránky, pokračuje sa od konca
-find_reached_bottom=Bol dosiahnutý koniec stránky, pokračuje sa od začiatku
-find_not_found=Výraz nebol nájdený
-
-# Error panel labels
-error_more_info=Viac informácií
-error_less_info=Menej informácií
-error_close=Zavrieť
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (zostavenie: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Správa: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Zásobník: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Súbor: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Riadok: {{line}}
-rendering_error=Pri vykresľovaní stránky sa vyskytla chyba.
-
-# Predefined zoom values
-page_scale_width=Na šírku strany
-page_scale_fit=Na veľkosť strany
-page_scale_auto=Automatická veľkosť
-page_scale_actual=Skutočná veľkosť
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Chyba
-loading_error=Počas načítavania dokumentu PDF sa vyskytla chyba.
-invalid_file_error=Neplatný alebo poškodený súbor PDF.
-missing_file_error=Chýbajúci súbor PDF.
-unexpected_response_error=Neočakávaná odpoveď zo servera.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Anotácia typu {{type}}]
-password_label=Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo.
-password_invalid=Heslo nie je platné. Skúste to znova.
-password_ok=OK
-password_cancel=Zrušiť
-
-printing_not_supported=Upozornenie: tlač nie je v tomto prehliadači plne podporovaná.
-printing_not_ready=Upozornenie: súbor PDF nie je plne načítaný pre tlač.
-web_fonts_disabled=Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF.
-document_colors_disabled=Dokumenty PDF nemajú povolené používať vlastné farby, pretože voľba "Povoliť stránkam používať vlastné farby" je v nastaveniach prehliadača vypnutá.
diff --git a/public/pfd/build/generic/web/locale/sl/viewer.properties b/public/pfd/build/generic/web/locale/sl/viewer.properties
deleted file mode 100644
index bdc7fff..0000000
--- a/public/pfd/build/generic/web/locale/sl/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Prejšnja stran
-previous_label=Nazaj
-next.title=Naslednja stran
-next_label=Naprej
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Stran:
-page_of=od {{pageCount}}
-
-zoom_out.title=Pomanjšaj
-zoom_out_label=Pomanjšaj
-zoom_in.title=Povečaj
-zoom_in_label=Povečaj
-zoom.title=Povečava
-presentation_mode.title=Preklopi v način predstavitve
-presentation_mode_label=Način predstavitve
-open_file.title=Odpri datoteko
-open_file_label=Odpri
-print.title=Natisni
-print_label=Natisni
-download.title=Prenesi
-download_label=Prenesi
-bookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu)
-bookmark_label=Trenutni pogled
-
-# Secondary toolbar and context menu
-tools.title=Orodja
-tools_label=Orodja
-first_page.title=Pojdi na prvo stran
-first_page.label=Pojdi na prvo stran
-first_page_label=Pojdi na prvo stran
-last_page.title=Pojdi na zadnjo stran
-last_page.label=Pojdi na zadnjo stran
-last_page_label=Pojdi na zadnjo stran
-page_rotate_cw.title=Zavrti v smeri urninega kazalca
-page_rotate_cw.label=Zavrti v smeri urninega kazalca
-page_rotate_cw_label=Zavrti v smeri urninega kazalca
-page_rotate_ccw.title=Zavrti v nasprotni smeri urninega kazalca
-page_rotate_ccw.label=Zavrti v nasprotni smeri urninega kazalca
-page_rotate_ccw_label=Zavrti v nasprotni smeri urninega kazalca
-
-hand_tool_enable.title=Omogoči roko
-hand_tool_enable_label=Omogoči roko
-hand_tool_disable.title=Onemogoči roko
-hand_tool_disable_label=Onemogoči roko
-
-# Document properties dialog box
-document_properties.title=Lastnosti dokumenta …
-document_properties_label=Lastnosti dokumenta …
-document_properties_file_name=Ime datoteke:
-document_properties_file_size=Velikost datoteke:
-document_properties_kb={{size_kb}} KB ({{size_b}} bajtov)
-document_properties_mb={{size_mb}} MB ({{size_b}} bajtov)
-document_properties_title=Ime:
-document_properties_author=Avtor:
-document_properties_subject=Tema:
-document_properties_keywords=Ključne besede:
-document_properties_creation_date=Datum nastanka:
-document_properties_modification_date=Datum spremembe:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Ustvaril:
-document_properties_producer=Izdelovalec PDF:
-document_properties_version=Različica PDF:
-document_properties_page_count=Število strani:
-document_properties_close=Zapri
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Preklopi stransko vrstico
-toggle_sidebar_label=Preklopi stransko vrstico
-outline.title=Prikaži oris dokumenta
-outline_label=Oris dokumenta
-attachments.title=Prikaži priponke
-attachments_label=Priponke
-thumbs.title=Prikaži sličice
-thumbs_label=Sličice
-findbar.title=Iskanje po dokumentu
-findbar_label=Iskanje
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Stran {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Sličica strani {{page}}
-
-# Find panel button title and messages
-find_label=Najdi:
-find_previous.title=Najdi prejšnjo ponovitev iskanega
-find_previous_label=Najdi nazaj
-find_next.title=Najdi naslednjo ponovitev iskanega
-find_next_label=Najdi naprej
-find_highlight=Označi vse
-find_match_case_label=Razlikuj velike/male črke
-find_reached_top=Dosežen začetek dokumenta iz smeri konca
-find_reached_bottom=Doseženo konec dokumenta iz smeri začetka
-find_not_found=Iskanega ni mogoče najti
-
-# Error panel labels
-error_more_info=Več informacij
-error_less_info=Manj informacij
-error_close=Zapri
-# LOCALIZATION NOTE (error_build): "{{build}}" will be replaced by the PDF.JS
-# build ID.
-error_version_info=PDF.js r{{version}} (graditev: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Sporočilo: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Sklad: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Datoteka: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Vrstica: {{line}}
-rendering_error=Med pripravljanjem strani je prišlo do napake!
-
-# Predefined zoom values
-page_scale_width=Širina strani
-page_scale_fit=Prilagodi stran
-page_scale_auto=Samodejno
-page_scale_actual=Dejanska velikost
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}} %
-
-# Loading indicator messages
-loading_error_indicator=Napaka
-loading_error=Med nalaganjem datoteke PDF je prišlo do napake.
-invalid_file_error=Neveljavna ali pokvarjena datoteka PDF.
-missing_file_error=Ni datoteke PDF.
-unexpected_response_error=Nepričakovan odgovor strežnika.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Opomba vrste {{type}}]
-password_label=Vnesite geslo za odpiranje te datoteke PDF.
-password_invalid=Neveljavno geslo. Poskusite znova.
-password_ok=V redu
-password_cancel=Prekliči
-
-printing_not_supported=Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja.
-printing_not_ready=Opozorilo: PDF ni v celoti naložen za tiskanje.
-web_fonts_disabled=Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti.
-document_colors_disabled=Dokumenti PDF ne smejo uporabljati svojih lastnih barv: možnost 'Dovoli stranem uporabo lastnih barv' je v brskalniku onemogočena.
diff --git a/public/pfd/build/generic/web/locale/son/viewer.properties b/public/pfd/build/generic/web/locale/son/viewer.properties
deleted file mode 100644
index 83e48dc..0000000
--- a/public/pfd/build/generic/web/locale/son/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Moo bisante
-previous_label=Bisante
-next.title=Jinehere moo
-next_label=Jine
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=&Moo:
-page_of={{pageCount}} ga
-
-zoom_out.title=Nakasandi
-zoom_out_label=Nakasandi
-zoom_in.title=Bebbeerandi
-zoom_in_label=Bebbeerandi
-zoom.title=Bebbeerandi
-presentation_mode.title=Bere cebeyan alhaali
-presentation_mode_label=Cebeyan alhaali
-open_file.title=Tuku feeri
-open_file_label=Feeri
-print.title=Kar
-print_label=Kar
-download.title=Zumandi
-download_label=Zumandi
-bookmark.title=Sohõ gunarro (bere wala feeri zanfun taaga ra)
-bookmark_label=Sohõ gunaroo
-
-# Secondary toolbar and context menu
-tools.title=Goyjinawey
-tools_label=Goyjinawey
-first_page.title=Koy moo jinaa ga
-first_page.label=Koy moo jinaa ga
-first_page_label=Koy moo jinaa ga
-last_page.title=Koy moo koraa ga
-last_page.label=Koy moo koraa ga
-last_page_label=Koy moo koraa ga
-page_rotate_cw.title=Kuubi kanbe guma here
-page_rotate_cw.label=Kuubi kanbe guma here
-page_rotate_cw_label=Kuubi kanbe guma here
-page_rotate_ccw.title=Kuubi kanbe wowa here
-page_rotate_ccw.label=Kuubi kanbe wowa here
-page_rotate_ccw_label=Kuubi kanbe wowa here
-
-hand_tool_enable.title=Kanbe goyjinay tunandi
-hand_tool_enable_label=Kanbe goyjinay tunandi
-hand_tool_disable.title=Kanbe joyjinay kaa
-hand_tool_disable_label=Kanbe goyjinay kaa
-
-# Document properties dialog box
-document_properties.title=Takadda mayrawey…
-document_properties_label=Takadda mayrawey…
-document_properties_file_name=Tuku maa:
-document_properties_file_size=Tuku adadu:
-document_properties_kb=KB {{size_kb}} (cebsu-ize {{size_b}})
-document_properties_mb=MB {{size_mb}} (cebsu-ize {{size_b}})
-document_properties_title=Tiiramaa:
-document_properties_author=Hantumkaw:
-document_properties_subject=Dalil:
-document_properties_keywords=Kufalkalimawey:
-document_properties_creation_date=Teeyan han:
-document_properties_modification_date=Barmayan han:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Teekaw:
-document_properties_producer=PDF berandikaw:
-document_properties_version=PDF dumi:
-document_properties_page_count=Moo hinna:
-document_properties_close=Daabu
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Kanjari ceraw zuu
-toggle_sidebar_label=Kanjari ceraw zuu
-outline.title=Takadda filla-boŋ cebe
-outline_label=Takadda filla-boŋ
-attachments.title=Hangarey cebe
-attachments_label=Hangarey
-thumbs.title=Kabeboy biyey cebe
-thumbs_label=Kabeboy biyey
-findbar.title=Ceeci takaddaa ra
-findbar_label=Ceeci
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title={{page}} moo
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Kabeboy bii {{page}} moo še
-
-# Find panel button title and messages
-find_label=Ceeci:
-find_previous.title=Kalimaɲaŋoo bangayri bisantaa ceeci
-find_previous_label=Bisante
-find_next.title=Kalimaɲaŋoo hiino bangayroo ceeci
-find_next_label=Jine
-find_highlight=Ikul šilbay
-find_match_case_label=Harfu-beeriyan hawgay
-find_reached_top=A too moŋoo boŋoo, koy jine ka šinitin nda cewoo
-find_reached_bottom=A too moɲoo cewoo, koy jine šintioo ga
-find_not_found=Kalimaɲaa mana duwandi
-
-# Error panel labels
-error_more_info=Alhabar tontoni
-error_less_info=Alhabar tontoni
-error_close=Daabu
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Alhabar:  {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Dekeri: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Tuku: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Žeeri: {{line}}
-rendering_error=Firka bangay kaŋ moɲoo goo ma willandi.
-
-# Predefined zoom values
-page_scale_width=Mooo hayyan
-page_scale_fit=Moo sawayan
-page_scale_auto=Boŋše azzaati barmayyan
-page_scale_actual=Adadu cimi
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Firka
-loading_error=Firka bangay kaŋ PDF goo ma zumandi.
-invalid_file_error=PDF tuku laala wala laybante.
-missing_file_error=PDF tuku kumante.
-unexpected_response_error=Manti feršikaw tuuruyan maatante.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt={{type}} maasa-caw]
-password_label=Šennikufal dam ka PDF tukoo woo feeri.
-password_invalid=Šennikufal laalo. Ceeci koyne taare.
-password_ok=Ayyo
-password_cancel=Naŋ
-
-printing_not_supported=Yaamar: Karyan ši tee ka timme nda ceecikaa woo.
-printing_not_ready=Yaamar: PDF ši zunbu ka timme karyan še.
-web_fonts_disabled=Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey.
-document_colors_disabled=PDF takaddawey ši duu fondo ka ngey boŋ noonawey zaa: 'Naŋ moɲey ma ngey boŋ noonawey suuba' ši dira ceecikaa ga.
diff --git a/public/pfd/build/generic/web/locale/sq/viewer.properties b/public/pfd/build/generic/web/locale/sq/viewer.properties
deleted file mode 100644
index 8d17d77..0000000
--- a/public/pfd/build/generic/web/locale/sq/viewer.properties
+++ /dev/null
@@ -1,165 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Faqja e Mëparshme
-previous_label=E mëparshmja
-next.title=Faqja Pasuese
-next_label=Pasuesja
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Faqja:
-page_of=nga {{pageCount}}
-
-zoom_out.title=Zoom Out
-zoom_out_label=Zoom Out
-zoom_in.title=Zoom In
-zoom_in_label=Zoom In
-zoom.title=Zoom
-print.title=Shtype
-print_label=Shtypeni
-presentation_mode.title=Kalo te Mënyra Paraqitje
-presentation_mode_label=Mënyra Paraqitje
-open_file.title=Hapni Kartelë
-open_file_label=Hapeni
-download.title=Shkarkim
-download_label=Shkarkojeni
-bookmark.title=Pamja e tanishme (kopjojeni ose hapeni në dritare të re)
-bookmark_label=Pamja e Tanishme
-
-# Secondary toolbar and context menu
-tools.title=Mjete
-tools_label=Mjete
-first_page.title=Shkoni te Faqja e Parë
-first_page.label=Shkoni te Faqja e Parë
-first_page_label=Shkoni te Faqja e Parë
-last_page.title=Shkoni te Faqja e Fundit
-last_page.label=Shkoni te Faqja e Fundit
-last_page_label=Shkoni te Faqja e Fundit
-page_rotate_cw.title=Rrotullojeni Në Kahun Orar
-page_rotate_cw.label=Rrotullojeni Në Kahun Orar
-page_rotate_cw_label=Rrotullojeni Në Kahun Orar
-page_rotate_ccw.title=Rrotullojeni Në Kahun Kundërorar
-page_rotate_ccw.label=Rrotullojeni Në Kahun Kundërorar
-page_rotate_ccw_label=Rrotullojeni Në Kahun Kundërorar
-
-hand_tool_enable.title=Aktivizoni mjet dore
-hand_tool_enable_label=Aktivizoni mjet dore
-hand_tool_disable.title=Çaktivizoni mjet dore
-hand_tool_disable_label=Çaktivizoni mjet dore
-
-# Document properties dialog box
-document_properties.title=Veti Dokumenti…
-document_properties_label=Veti Dokumenti…
-document_properties_file_name=Emër kartele:
-document_properties_file_size=Madhësi kartele:
-document_properties_kb={{size_kb}} KB ({{size_b}} bajte)
-document_properties_mb={{size_mb}} MB ({{size_b}} bajte)
-document_properties_title=Titull:
-document_properties_author=Autor:
-document_properties_subject=Subjekt:
-document_properties_keywords=Fjalëkyçe:
-document_properties_creation_date=Datë Krijimi:
-document_properties_modification_date=Datë Ndryshimi:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Krijues:
-document_properties_producer=Prodhues PDF-je:
-document_properties_version=Version PDF-je:
-document_properties_page_count=Numër Faqesh:
-document_properties_close=Mbylle
-
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Shfaqni/Fshihni Anështyllën
-toggle_sidebar_label=Shfaqni/Fshihni Anështyllën
-outline.title=Shfaq Përvijim Dokumenti
-outline_label=Shfaq Përvijim Dokumenti
-attachments.title=Shfaq Bashkëngjitje
-attachments_label=Bashkëngjitje
-thumbs.title=Shfaq Miniatura
-thumbs_label=Miniatura
-findbar.title=Gjej në Dokument
-findbar_label=Gjej
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Faqja {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniaturë e Faqes {{page}}
-
-# Context menu
-first_page.label=Kalo te Faqja e Parë
-last_page.label=Kalo te Faqja e Fundit
-page_rotate_cw.label=Rrotulloje Në Kahun Orar
-page_rotate_ccw.label=Rrotulloje Në Kahun Antiorar
-
-# Find panel button title and messages
-find_label=Gjej:
-find_previous.title=Gjeni hasjen e mëparshme të togfjalëshit
-find_previous_label=E mëparshmja
-find_next.title=Gjeni hasjen pasuese të togfjalëshit
-find_next_label=Pasuesja
-find_highlight=Theksoji të gjitha
-find_match_case_label=Siç është shkruar
-find_reached_top=U mbërrit në krye të dokumentit, vazhduar prej fundit
-find_reached_bottom=U mbërrit në fund të dokumentit, vazhduar prej kreut
-find_not_found=Nuk u gjet togfjalëshi
-
-# Error panel labels
-error_more_info=Më Tepër të Dhëna
-error_less_info=Më Pak të Dhëna
-error_close=Mbylle
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mesazh: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Kartelë: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Rresht: {{line}}
-rendering_error=Ndodhi një gabim gjatë riprodhimit të faqes.
-
-# Predefined zoom values
-page_scale_width=Gjerësi Faqeje
-page_scale_fit=Sa Nxë Faqja
-page_scale_auto=Zoom i Vetvetishëm
-page_scale_actual=Madhësia Faktike
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
-loading_error_indicator=Gabim
-loading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së.
-invalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar.
-missing_file_error=Kartelë PDF që mungon.
-unexpected_response_error=Përgjigje shërbyesi e papritur.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Nënvizim {{type}}]
-password_label=Jepni fjalëkalimin që të hapet kjo kartelë PDF.
-password_invalid=Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni.
-password_ok=OK
-password_cancel=Anuloje
-
-printing_not_supported=Kujdes: Shtypja nuk mbulohet plotësisht nga ky shfletues.
-printing_not_ready=Kujdes: PDF-ja nuk është ngarkuar plotësisht që ta shtypni.
-web_fonts_disabled=Shkronjat Web janë të çaktivizuara: i pazoti të përdorë shkronja të trupëzuara në PDF.
-document_colors_disabled=Dokumenteve PDF nuk u është lejuar të përdorin ngjyrat e veta: &apos;Lejoji faqet t&apos;i zgjedhin vetë ngjyrat&apos;, te shfletuesi, është e çaktivizuar.
diff --git a/public/pfd/build/generic/web/locale/sr/viewer.properties b/public/pfd/build/generic/web/locale/sr/viewer.properties
deleted file mode 100644
index 0603d88..0000000
--- a/public/pfd/build/generic/web/locale/sr/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Претходна страница
-previous_label=Претходна
-next.title=Следећа страница
-next_label=Следећа
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Страница:
-page_of=од {{pageCount}}
-
-zoom_out.title=Умањи
-zoom_out_label=Умањи
-zoom_in.title=Увеличај
-zoom_in_label=Увеличај
-zoom.title=Зумирање
-presentation_mode.title=Промени на приказ у режиму презентације
-presentation_mode_label=Режим презентације
-open_file.title=Отвори датотеку
-open_file_label=Отвори
-print.title=Штампај
-print_label=Штампај
-download.title=Преузми
-download_label=Преузми
-bookmark.title=Тренутни приказ (копирај или отвори нови прозор)
-bookmark_label=Тренутни приказ
-
-# Secondary toolbar and context menu
-tools.title=Алатке
-tools_label=Алатке
-first_page.title=Иди на прву страницу
-first_page.label=Иди на прву страницу
-first_page_label=Иди на прву страницу
-last_page.title=Иди на последњу страницу
-last_page.label=Иди на последњу страницу
-last_page_label=Иди на последњу страницу
-page_rotate_cw.title=Ротирај у смеру казаљке на сату
-page_rotate_cw.label=Ротирај у смеру казаљке на сату
-page_rotate_cw_label=Ротирај у смеру казаљке на сату
-page_rotate_ccw.title=Ротирај у смеру супротном од казаљке на сату
-page_rotate_ccw.label=Ротирај у смеру супротном од казаљке на сату
-page_rotate_ccw_label=Ротирај у смеру супротном од казаљке на сату
-
-hand_tool_enable.title=Омогући алатку за померање
-hand_tool_enable_label=Омогући алатку за померање
-hand_tool_disable.title=Онемогући алатку за померање
-hand_tool_disable_label=Онемогући алатку за померање
-
-# Document properties dialog box
-document_properties.title=Параметри документа…
-document_properties_label=Параметри документа…
-document_properties_file_name=Име датотеке:
-document_properties_file_size=Величина датотеке:
-document_properties_kb={{size_kb}} KB ({{size_b}} B)
-document_properties_mb={{size_mb}} MB ({{size_b}} B)
-document_properties_title=Наслов:
-document_properties_author=Аутор:
-document_properties_subject=Тема:
-document_properties_keywords=Кључне речи:
-document_properties_creation_date=Датум креирања:
-document_properties_modification_date=Датум модификације:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Стваралац:
-document_properties_producer=PDF произвођач:
-document_properties_version=PDF верзија:
-document_properties_page_count=Број страница:
-document_properties_close=Затвори
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Прикажи додатну палету
-toggle_sidebar_label=Прикажи додатну палету
-outline.title=Прикажи контуру документа
-outline_label=Контура документа
-attachments.title=Прикажи прилоге
-attachments_label=Прилози
-thumbs.title=Прикажи сличице
-thumbs_label=Сличице
-findbar.title=Пронађи у документу
-findbar_label=Пронађи
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Страница {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Сличица од странице {{page}}
-
-# Find panel button title and messages
-find_label=Пронађи:
-find_previous.title=Пронађи претходну појаву фразе
-find_previous_label=Претходна
-find_next.title=Пронађи следећу појаву фразе
-find_next_label=Следећа
-find_highlight=Истакнути све
-find_match_case_label=Подударања
-find_reached_top=Достигнут врх документа, наставио са дна
-find_reached_bottom=Достигнуто дно документа, наставио са врха
-find_not_found=Фраза није пронађена
-
-# Error panel labels
-error_more_info=Више информација
-error_less_info=Мање информација
-error_close=Затвори
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Порука: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Стек: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Датотека: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Линија: {{line}}
-rendering_error=Дошло је до грешке приликом рендеровања ове странице.
-
-# Predefined zoom values
-page_scale_width=Ширина странице
-page_scale_fit=Уклапање странице
-page_scale_auto=Аутоматско увеличавање
-page_scale_actual=Стварна величина
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Грешка
-loading_error=Дошло је до грешке приликом учитавања PDF-а.
-invalid_file_error=PDF датотека је оштећена или је неисправна.
-missing_file_error=PDF датотека није пронађена.
-unexpected_response_error=Неочекиван одговор од сервера.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} коментар]
-password_label=Унесите лозинку да бисте отворили овај PDF докуменат.
-password_invalid=Неисправна лозинка. Покушајте поново.
-password_ok=У реду
-password_cancel=Откажи
-
-printing_not_supported=Упозорење: Штампање није у потпуности подржано у овом прегледачу.
-printing_not_ready=Упозорење: PDF није у потпуности учитан за штампу.
-web_fonts_disabled=Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове.
-document_colors_disabled=PDF документи не могу да користе сопствене боје: “Дозволи страницама да изаберу своје боје” је деактивирано у прегледачу.
diff --git a/public/pfd/build/generic/web/locale/sv-SE/viewer.properties b/public/pfd/build/generic/web/locale/sv-SE/viewer.properties
deleted file mode 100644
index 4c9d040..0000000
--- a/public/pfd/build/generic/web/locale/sv-SE/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Föregående sida
-previous_label=Föregående
-next.title=Nästa sida
-next_label=Nästa
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Sida:
-page_of=av {{pageCount}}
-
-zoom_out.title=Zooma ut
-zoom_out_label=Zooma ut
-zoom_in.title=Zooma in
-zoom_in_label=Zooma in
-zoom.title=Zoom
-presentation_mode.title=Byt till presentationsläge
-presentation_mode_label=Presentationsläge
-open_file.title=Öppna fil
-open_file_label=Öppna
-print.title=Skriv ut
-print_label=Skriv ut
-download.title=Hämta
-download_label=Hämta
-bookmark.title=Aktuell vy (kopiera eller öppna i nytt fönster)
-bookmark_label=Aktuell vy
-
-# Secondary toolbar and context menu
-tools.title=Verktyg
-tools_label=Verktyg
-first_page.title=Gå till första sidan
-first_page.label=Gå till första sidan
-first_page_label=Gå till första sidan
-last_page.title=Gå till sista sidan
-last_page.label=Gå till sista sidan
-last_page_label=Gå till sista sidan
-page_rotate_cw.title=Rotera medurs
-page_rotate_cw.label=Rotera medurs
-page_rotate_cw_label=Rotera medurs
-page_rotate_ccw.title=Rotera moturs
-page_rotate_ccw.label=Rotera moturs
-page_rotate_ccw_label=Rotera moturs
-
-hand_tool_enable.title=Aktivera handverktyg
-hand_tool_enable_label=Aktivera handverktyg
-hand_tool_disable.title=Inaktivera handverktyg
-hand_tool_disable_label=Inaktivera handverktyg
-
-# Document properties dialog box
-document_properties.title=Dokumentegenskaper…
-document_properties_label=Dokumentegenskaper…
-document_properties_file_name=Filnamn:
-document_properties_file_size=Filstorlek:
-document_properties_kb={{size_kb}} kB ({{size_b}} byte)
-document_properties_mb={{size_mb}} MB ({{size_b}} byte)
-document_properties_title=Titel:
-document_properties_author=Författare:
-document_properties_subject=Ämne:
-document_properties_keywords=Nyckelord:
-document_properties_creation_date=Skapades:
-document_properties_modification_date=Ändrades:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Skapare:
-document_properties_producer=PDF-producent:
-document_properties_version=PDF-version:
-document_properties_page_count=Sidantal:
-document_properties_close=Stäng
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Visa/dölj sidofält
-toggle_sidebar_label=Visa/dölj sidofält
-outline.title=Visa dokumentöversikt
-outline_label=Dokumentöversikt
-attachments.title=Visa Bilagor
-attachments_label=Bilagor
-thumbs.title=Visa miniatyrer
-thumbs_label=Miniatyrer
-findbar.title=Sök i dokument
-findbar_label=Sök
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Sida {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Miniatyr av sida {{page}}
-
-# Find panel button title and messages
-find_label=Sök:
-find_previous.title=Hitta föregående förekomst av frasen
-find_previous_label=Föregående
-find_next.title=Hitta nästa förekomst av frasen
-find_next_label=Nästa
-find_highlight=Markera alla
-find_match_case_label=Matcha versal/gemen
-find_reached_top=Nådde början av dokumentet, började från slutet
-find_reached_bottom=Nådde slutet på dokumentet, började från början
-find_not_found=Frasen hittades inte
-
-# Error panel labels
-error_more_info=Mer information
-error_less_info=Mindre information
-error_close=Stäng
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Meddelande: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Fil: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Rad: {{line}}
-rendering_error=Ett fel uppstod vid visning av sidan.
-
-# Predefined zoom values
-page_scale_width=Sidbredd
-page_scale_fit=Anpassa sida
-page_scale_auto=Automatisk zoom
-page_scale_actual=Verklig storlek
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Fel
-loading_error=Ett fel uppstod vid laddning av PDF-filen.
-invalid_file_error=Ogiltig eller korrupt PDF-fil.
-missing_file_error=Saknad PDF-fil.
-unexpected_response_error=Oväntat svar från servern.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}}-annotering]
-password_label=Skriv in lösenordet för att öppna PDF-filen.
-password_invalid=Ogiltigt lösenord. Försök igen.
-password_ok=OK
-password_cancel=Avbryt
-
-printing_not_supported=Varning: Utskrifter stöds inte helt av den här webbläsaren.
-printing_not_ready=Varning: PDF:en är inte klar för utskrift.
-web_fonts_disabled=Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt.
-document_colors_disabled=PDF-dokument tillåts inte använda egna färger: 'Låt sidor använda egna färger' är inaktiverat i webbläsaren.
diff --git a/public/pfd/build/generic/web/locale/sw/viewer.properties b/public/pfd/build/generic/web/locale/sw/viewer.properties
deleted file mode 100644
index 88d0d35..0000000
--- a/public/pfd/build/generic/web/locale/sw/viewer.properties
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Ukurasa Uliotangulia
-previous_label=Iliyotangulia
-next.title=Ukurasa Ufuatao
-next_label=Ifuatayo
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Ukurasa:
-page_of=ya {{Hesabu ya ukurasa}}
-
-zoom_out.title=Kuza Nje
-zoom_out_label=Kuza Nje
-zoom_in.title=Kuza Ndani
-zoom_in_label=Kuza Ndani
-zoom.title=Kuza
-presentation_mode.title=Badili kwa Hali ya Uwasilishaji
-presentation_mode_label=Hali ya Uwasilishaji
-open_file.title=Fungua Faili
-open_file_label=Fungua
-print.title=Chapisha
-print_label=Chapisha
-download.title=Pakua
-download_label=Pakua
-bookmark.title=Mwonekano wa sasa (nakili au ufungue katika dirisha mpya)
-bookmark_label=Mwonekano wa Sasa
-
-# Secondary toolbar and context menu
-
-
-# Document properties dialog box
-document_properties_title=Kichwa:
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Kibiano cha Upau wa Kando
-toggle_sidebar_label=Kibiano cha Upau wa Kando
-outline.title=Onyesha Ufupisho wa Waraka
-outline_label=Ufupisho wa Waraka
-thumbs.title=Onyesha Kijipicha
-thumbs_label=Vijipicha
-findbar.title=Pata katika Waraka
-findbar_label=Tafuta
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Ukurasa {{ukurasa}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Kijipicha cha ukurasa {{ukurasa}}
-
-# Find panel button title and messages
-find_label=Tafuta:
-find_previous.title=Tafuta tukio kabla ya msemo huu
-find_previous_label=Iliyotangulia
-find_next.title=Tafuta tukio linalofuata la msemo
-find_next_label=Ifuatayo
-find_highlight=Angazia yote
-find_match_case_label=Linganisha herufi
-find_reached_top=Imefika juu ya waraka, imeendelea kutoka chini
-find_reached_bottom=Imefika mwisho wa waraka, imeendelea kutoka juu
-find_not_found=Msemo hukupatikana
-
-# Error panel labels
-error_more_info=Maelezo Zaidi
-error_less_info=Maelezo Kidogo
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (jenga: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Ujumbe: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Panganya: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Faili: {{faili}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Laini: {{laini}}
-rendering_error=Hitilafu lilitokea wajati wa kutoa ukurasa
-
-# Predefined zoom values
-page_scale_width=Upana wa Ukurasa
-page_scale_fit=Usawa wa Ukurasa
-page_scale_auto=Ukuzaji wa Kiotomatiki
-page_scale_actual=Ukubwa Halisi
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=Hitilafu
-loading_error=Hitilafu lilitokea wakati wa kupakia PDF.
-invalid_file_error=Faili ya PDF isiyohalali au potofu.
-missing_file_error=Faili ya PDF isiyopo.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Ufafanuzi]
-password_ok=SAWA
-password_cancel=Ghairi
-
-printing_not_supported=Onyo: Uchapishaji hauauniwi kabisa kwa kivinjari hiki.
-web_fonts_disabled=Fonti za tovuti zimelemazwa: haziwezi kutumia fonti za PDF zilizopachikwa.
diff --git a/public/pfd/build/generic/web/locale/ta-LK/viewer.properties b/public/pfd/build/generic/web/locale/ta-LK/viewer.properties
deleted file mode 100644
index 77c9f4f..0000000
--- a/public/pfd/build/generic/web/locale/ta-LK/viewer.properties
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-
-zoom.title=அளவு
-open_file.title=கோப்பினைத் திறக்க
-open_file_label=திறக்க
-
-# Secondary toolbar and context menu
-
-
-# Document properties dialog box
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-
-# Find panel button title and messages
-find_previous.title=இந்த சொற்றொடரின் முன்னைய நிகழ்வை தேடு
-find_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வைத் தேடு
-
-# Error panel labels
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-
-# Predefined zoom values
-
-# Loading indicator messages
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-password_ok=ஆம்
-
diff --git a/public/pfd/build/generic/web/locale/ta/viewer.properties b/public/pfd/build/generic/web/locale/ta/viewer.properties
deleted file mode 100644
index 787e278..0000000
--- a/public/pfd/build/generic/web/locale/ta/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=முந்தைய பக்கம்
-previous_label=முந்தையது
-next.title=அடுத்த பக்கம்
-next_label=அடுத்து
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=பக்கம்:
-page_of=இல் {{pageCount}}
-
-zoom_out.title=சிறிதாக்கு
-zoom_out_label=சிறிதாக்கு
-zoom_in.title=பெரிதாக்கு
-zoom_in_label=பெரிதாக்கு
-zoom.title=பெரிதாக்கு
-presentation_mode.title=விளக்ககாட்சி பயன்முறைக்கு மாறு
-presentation_mode_label=விளக்ககாட்சி பயன்முறை
-open_file.title=கோப்பினை திற
-open_file_label=திற
-print.title=அச்சிடு
-print_label=அச்சிடு
-download.title=பதிவிறக்கு
-download_label=பதிவிறக்கு
-bookmark.title=தற்போதைய காட்சி (புதிய சாளரத்திற்கு நகலெடு அல்லது புதிய சாளரத்தில் திற)
-bookmark_label=தற்போதைய காட்சி
-
-# Secondary toolbar and context menu
-tools.title=கருவிகள்
-tools_label=கருவிகள்
-first_page.title=முதல் பக்கத்திற்கு செல்லவும்
-first_page.label=முதல் பக்கத்திற்கு செல்லவும்
-first_page_label=முதல் பக்கத்திற்கு செல்லவும்
-last_page.title=கடைசி பக்கத்திற்கு செல்லவும்
-last_page.label=கடைசி பக்கத்திற்கு செல்லவும்
-last_page_label=கடைசி பக்கத்திற்கு செல்லவும்
-page_rotate_cw.title=வலஞ்சுழியாக சுழற்று
-page_rotate_cw.label=வலஞ்சுழியாக சுழற்று
-page_rotate_cw_label=வலஞ்சுழியாக சுழற்று
-page_rotate_ccw.title=இடஞ்சுழியாக சுழற்று
-page_rotate_ccw.label=இடஞ்சுழியாக சுழற்று
-page_rotate_ccw_label=இடஞ்சுழியாக சுழற்று
-
-hand_tool_enable.title=கை கருவியை செயலாக்கு
-hand_tool_enable_label=கை கருவியை செயலாக்கு
-hand_tool_disable.title=கை கருவியை முடக்கு
-hand_tool_disable_label=கை கருவியை முடக்கு
-
-# Document properties dialog box
-document_properties.title=ஆவண பண்புகள்...
-document_properties_label=ஆவண பண்புகள்...
-document_properties_file_name=கோப்பு பெயர்:
-document_properties_file_size=கோப்பின் அளவு:
-document_properties_kb={{size_kb}} கிபை ({{size_b}} பைட்டுகள்)
-document_properties_mb={{size_mb}} மெபை ({{size_b}} பைட்டுகள்)
-document_properties_title=தலைப்பு:
-document_properties_author=எழுதியவர்
-document_properties_subject=பொருள்:
-document_properties_keywords=முக்கிய வார்த்தைகள்:
-document_properties_creation_date=படைத்த தேதி :
-document_properties_modification_date=திருத்திய தேதி:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=உருவாக்குபவர்:
-document_properties_producer=பிடிஎஃப் தயாரிப்பாளர்:
-document_properties_version=PDF பதிப்பு:
-document_properties_page_count=பக்க எண்ணிக்கை:
-document_properties_close=மூடுக
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=பக்கப் பட்டியை நிலைமாற்று
-toggle_sidebar_label=பக்கப் பட்டியை நிலைமாற்று
-outline.title=ஆவண வெளிவரையைக் காண்பி
-outline_label=ஆவண வெளிவரை
-attachments.title=இணைப்புகளை காண்பி
-attachments_label=இணைப்புகள்
-thumbs.title=சிறுபடங்களைக் காண்பி
-thumbs_label=சிறுபடங்கள்
-findbar.title=ஆவணத்தில் கண்டறி
-findbar_label=கண்டுபிடி
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=பக்கம் {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=பக்கத்தின் சிறுபடம் {{page}}
-
-# Find panel button title and messages
-find_label=கண்டறி:
-find_previous.title=இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு
-find_previous_label=முந்தையது
-find_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு
-find_next_label=அடுத்து
-find_highlight=அனைத்தையும் தனிப்படுத்து
-find_match_case_label=பேரெழுத்தாக்கத்தை உணர்
-find_reached_top=ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது
-find_reached_bottom=ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது
-find_not_found=சொற்றொடர் காணவில்லை
-
-# Error panel labels
-error_more_info=கூடுதல் தகவல்
-error_less_info=குறைந்த தகவல்
-error_close=மூடுக
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=செய்தி: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=ஸ்டேக்: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=கோப்பு: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=வரி: {{line}}
-rendering_error=இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது.
-
-# Predefined zoom values
-page_scale_width=பக்க அகலம்
-page_scale_fit=பக்கப் பொருத்தம்
-page_scale_auto=தானியக்க பெரிதாக்கல்
-page_scale_actual=உண்மையான அளவு
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=பிழை
-loading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது.
-invalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு.
-missing_file_error=PDF கோப்பு காணவில்லை.
-unexpected_response_error=சேவகன் பதில் எதிர்பாரதது.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} விளக்கம்]
-password_label=இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும்.
-password_invalid=செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க.
-password_ok=சரி
-password_cancel=இரத்து
-
-printing_not_supported=எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை.
-printing_not_ready=எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை.
-web_fonts_disabled=வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை.
-document_colors_disabled=PDF ஆவணங்களுக்கு அவற்றின் சொந்த நிறங்களைப் பயன்படுத்த அனுமதியில்லை: உலாவியில் 'பக்கங்கள் தங்கள் சொந்த நிறங்களைத் தேர்வு செய்துகொள்ள அனுமதி' என்னும் விருப்பம் முடக்கப்பட்டுள்ளது.
diff --git a/public/pfd/build/generic/web/locale/te/viewer.properties b/public/pfd/build/generic/web/locale/te/viewer.properties
deleted file mode 100644
index bd1ecac..0000000
--- a/public/pfd/build/generic/web/locale/te/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=క్రితం పేజీ
-previous_label=క్రితం
-next.title=తరువాత పేజీ
-next_label=తరువాత
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=పేజీ:
-page_of=మొత్తం {{pageCount}} లో
-
-zoom_out.title=జూమ్ తగ్గించు
-zoom_out_label=జూమ్ తగ్గించు
-zoom_in.title=జూమ్ చేయి
-zoom_in_label=జూమ్ చేయి
-zoom.title=జూమ్
-presentation_mode.title=ప్రదర్శనా రీతికి మారు
-presentation_mode_label=ప్రదర్శనా రీతి
-open_file.title=ఫైల్ తెరువు
-open_file_label=తెరువు
-print.title=ముద్రించు
-print_label=ముద్రించు
-download.title=డౌనులోడు
-download_label=డౌనులోడు
-bookmark.title=ప్రస్తుత దర్శనం (నకలుతీయి లేదా కొత్త విండోనందు తెరువుము)
-bookmark_label=ప్రస్తుత దర్శనం
-
-# Secondary toolbar and context menu
-tools.title=పనిముట్లు
-tools_label=పనిముట్లు
-first_page.title=మొదటి పేజీకి వెళ్ళు
-first_page.label=మొదటి పేజీకి వెళ్ళు
-first_page_label=మొదటి పేజీకి వెళ్ళు
-last_page.title=చివరి పేజీకి వెళ్ళు
-last_page.label=చివరి పేజీకి వెళ్ళు
-last_page_label=చివరి పేజీకి వెళ్ళు
-page_rotate_cw.title=సవ్యదిశలో తిప్పుము
-page_rotate_cw.label=సవ్యదిశలో తిప్పుము
-page_rotate_cw_label=సవ్యదిశలో తిప్పుము
-page_rotate_ccw.title=అపసవ్యదిశలో తిప్పుము
-page_rotate_ccw.label=అపసవ్యదిశలో తిప్పుము
-page_rotate_ccw_label=అపసవ్యదిశలో తిప్పుము
-
-hand_tool_enable.title=చేతి సాధనం చేతనించు
-hand_tool_enable_label=చేతి సాధనం చేతనించు
-hand_tool_disable.title=చేతి సాధనం అచేతనించు
-hand_tool_disable_label=చేతి సాధనం అచేతనించు
-
-# Document properties dialog box
-document_properties.title=పత్రము లక్షణాలు...
-document_properties_label=పత్రము లక్షణాలు...
-document_properties_file_name=దస్త్రం పేరు:
-document_properties_file_size=దస్త్రం పరిమాణం:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=శీర్షిక:
-document_properties_author=మూలకర్త:
-document_properties_subject=విషయం:
-document_properties_keywords=కీపదాలు:
-document_properties_creation_date=సృష్టించిన తేదీ:
-document_properties_modification_date=సవరించిన తేదీ:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=సృష్టికర్త:
-document_properties_producer=PDF ఉత్పాదకి:
-document_properties_version=PDF వర్షన్:
-document_properties_page_count=పేజీల సంఖ్య:
-document_properties_close=మూసివేయి
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=పక్కపట్టీ మార్చు
-toggle_sidebar_label=పక్కపట్టీ మార్చు
-outline.title=పత్రము అవుట్‌లైన్ చూపు
-outline_label=పత్రము అవుట్‌లైన్
-attachments.title=అనుబంధాలు చూపు
-attachments_label=అనుబంధాలు
-thumbs.title=థంబ్‌నైల్స్ చూపు
-thumbs_label=థంబ్‌నైల్స్
-findbar.title=ఈ పత్రమునందు కనుగొనుము
-findbar_label=కనుగొను
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=పేజీ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=పేజీ {{page}} యొక్క థంబ్‌నైల్
-
-# Find panel button title and messages
-find_label=కనుగొను:
-find_previous.title=పదంయొక్క ముందలి  సంభవాన్ని  కనుగొను
-find_previous_label=మునుపటి
-find_next.title=పదం యొక్క తర్వాతి  సంభవాన్ని  కనుగొను
-find_next_label=తరువాత
-find_highlight=అన్నిటిని  ఉద్దీపనం చేయుము
-find_match_case_label=అక్షరములతేడాతో పోల్చుము
-find_reached_top=పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి
-find_reached_bottom=పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి
-find_not_found=పదం కనబడలేదు
-
-# Error panel labels
-error_more_info=మరింత సమాచారం
-error_less_info=తక్కువ సమాచారం
-error_close=మూసివేయి
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=సందేశం: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=స్టాక్: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=ఫైలు: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=వరుస: {{line}}
-rendering_error=పేజీను రెండర్ చేయుటలో వొక దోషం యెదురైంది.
-
-# Predefined zoom values
-page_scale_width=పేజీ వెడల్పు
-page_scale_fit=పేజీ అమర్పు
-page_scale_auto=స్వయంచాలక జూమ్
-page_scale_actual=యథార్ధ పరిమాణం
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=దోషం
-loading_error=PDF లోడవుచున్నప్పుడు వొక దోషం యెదురైంది.
-invalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు.
-missing_file_error=దొరకని PDF ఫైలు.
-unexpected_response_error=అనుకోని సేవిక స్పందన.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} టీకా]
-password_label=ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము
-password_invalid=సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి.
-password_ok=సరే
-password_cancel=రద్దుచేయి
-
-printing_not_supported=హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటునీయబడుట లేదు
-printing_not_ready=హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు.
-web_fonts_disabled=వెబ్ ఫాంట్లు అచేతనపరచ బడెను: ఎంబెడెడ్ PDF ఫాంట్లు వుపయోగించలేక పోయింది.
-document_colors_disabled=PDF పత్రాలు వాటి స్వంత రంగులను వుపయోగించుకొనుటకు అనుమతించబడవు: విహరణి నందు 'పేజీలను వాటి స్వంత రంగులను యెంచుకొనుటకు అనుమతించు' అనునది అచేతనం చేయబడివుంది.
diff --git a/public/pfd/build/generic/web/locale/th/viewer.properties b/public/pfd/build/generic/web/locale/th/viewer.properties
deleted file mode 100644
index 9ccaa38..0000000
--- a/public/pfd/build/generic/web/locale/th/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=หน้าก่อนหน้า
-previous_label=ก่อนหน้า
-next.title=หน้าถัดไป
-next_label=ถัดไป
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=หน้า:
-page_of=จาก {{pageCount}}
-
-zoom_out.title=ย่อ
-zoom_out_label=ย่อ Out
-zoom_in.title=ขยาย
-zoom_in_label=ขยาย
-zoom.title=ย่อ-ขยาย
-presentation_mode.title=สลับเข้าสู่รูปแบบการนำเสนอ
-presentation_mode_label=รูปแบบการนำเสนอ
-open_file.title=เปิดแฟ้ม
-open_file_label=เปิด
-print.title=พิมพ์
-print_label=พิมพ์
-download.title=ดาวน์โหลด
-download_label=ดาวน์โหลด
-bookmark.title=มุมมองปัจจุบัน (คัดลอกหรือเปิดในหน้าต่างใหม่)
-bookmark_label=มุมมองปัจจุบัน
-
-# Secondary toolbar and context menu
-tools.title=เครื่องมือ
-tools_label=เครื่องมือ
-first_page.title=ไปยังหน้าแรก
-first_page.label=ไปยังหน้าแรก
-first_page_label=ไปยังหน้าแรก
-last_page.title=ไปยังหน้าสุดท้าย
-last_page.label=ไปยังหน้าสุดท้าย
-last_page_label=ไปยังหน้าสุดท้าย
-page_rotate_cw.title=หมุนตามเข็มนาฬิกา
-page_rotate_cw.label=หมุนตามเข็มนาฬิกา
-page_rotate_cw_label=หมุนตามเข็มนาฬิกา
-page_rotate_ccw.title=หมุนทวนเข็มนาฬิกา
-page_rotate_ccw.label=หมุนทวนเข็มนาฬิกา
-page_rotate_ccw_label=หมุนทวนเข็มนาฬิกา
-
-hand_tool_enable.title=เปิดใช้งานเครื่องมือรูปมือ
-hand_tool_enable_label=เปิดใช้งานเครื่องมือรูปมือ
-hand_tool_disable.title=ปิดใช้งานเครื่องมือรูปมือ
-hand_tool_disable_label=ปิดใช้งานเครื่องมือรูปมือ
-
-# Document properties dialog box
-document_properties.title=คุณสมบัติเอกสาร…
-document_properties_label=คุณสมบัติเอกสาร…
-document_properties_file_name=ชื่อแฟ้ม :
-document_properties_file_size=ขนาดแฟ้ม :
-document_properties_kb={{size_kb}} กิโลไบต์ ({{size_b}} ไบต์)
-document_properties_mb={{size_mb}} เมกะไบต์ ({{size_b}} ไบต์)
-document_properties_title=หัวเรื่อง :
-document_properties_author=ผู้แต่ง :
-document_properties_subject=หัวข้อ :
-document_properties_keywords=คำสำคัญ :
-document_properties_creation_date=วันที่สร้าง :
-document_properties_modification_date=วันที่แก้ไข :
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=สร้างโดย :
-document_properties_producer=ผู้ผลิต PDF :
-document_properties_version=รุ่น PDF :
-document_properties_page_count=จำนวนหน้า :
-document_properties_close=ปิด
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=สลับแถบข้าง
-toggle_sidebar_label=สลับแถบข้าง
-outline.title=แสดงโครงเอกสาร
-outline_label=โครงเอกสาร
-attachments.title=แสดงสิ่งที่แนบมา
-attachments_label=สิ่งที่แนบมา
-thumbs.title=แสดงภาพขนาดย่อ
-thumbs_label=ภาพขนาดย่อ
-findbar.title=ค้นหาในเอกสาร
-findbar_label=ค้นหา
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=หน้า {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=ภาพขนาดย่อของหน้า {{page}}
-
-# Find panel button title and messages
-find_label=ค้นหา:
-find_previous.title=หาตำแหน่งก่อนหน้าของคำค้น
-find_previous_label=ก่อนหน้า
-find_next.title=หาตำแหน่งถัดไปของคำค้น
-find_next_label=ถัดไป
-find_highlight=เน้นสีทั้งหมด
-find_match_case_label=ตัวพิมพ์ตรงกัน
-find_reached_top=ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง
-find_reached_bottom=ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน
-find_not_found=ไม่พบวลีที่ต้องการ
-
-# Error panel labels
-error_more_info=ข้อมูลเพิ่มเติม
-error_less_info=ข้อมูลน้อย
-error_close=ปิด
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=ข้อความ: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=สแต็ก: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=แฟ้ม: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=บรรทัด: {{line}}
-rendering_error=เกิดข้อผิดพลาดขณะกำลังคำนวณการแสดงผลของหน้า
-
-# Predefined zoom values
-page_scale_width=ความกว้างหน้า
-page_scale_fit=พอดีหน้า
-page_scale_auto=ย่อ-ขยายอัตโนมัติ
-page_scale_actual=ขนาดเท่าจริง
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=ข้อผิดพลาด
-loading_error=เกิดข้อผิดพลาดขณะกำลังโหลด PDF
-invalid_file_error=แฟ้ม PDF ไม่ถูกต้องหรือไม่สมบูรณ์
-missing_file_error=แฟ้ม PDF หาย
-unexpected_response_error=การตอบสนองเซิร์ฟเวอร์ที่ไม่คาดหวัง
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[คำอธิบายประกอบ {{type}}]
-password_label=ใส่รหัสผ่านเพื่อเปิดไฟล์ PDF นี้
-password_invalid=รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง
-password_ok=ตกลง
-password_cancel=ยกเลิก
-
-printing_not_supported=คำเตือน: เบราเซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่
-printing_not_ready=คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์
-web_fonts_disabled=แบบอักษรเว็บถูกปิดการใช้งาน: ไม่สามารถใช้แบบอักษรฝังตัวใน PDF
-document_colors_disabled=เอกสาร PDF ไม่ได้รับอนุญาตให้ใช้สีของตัวเอง: 'อนุญาตให้หน้าเอกสารสามารถเลือกสีของตัวเอง' ถูกปิดใช้งานในเบราเซอร์
diff --git a/public/pfd/build/generic/web/locale/tl/viewer.properties b/public/pfd/build/generic/web/locale/tl/viewer.properties
deleted file mode 100644
index 07d86eb..0000000
--- a/public/pfd/build/generic/web/locale/tl/viewer.properties
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Naunang Pahina
-next.title=Sunod na Pahina
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Pahina:
-page_of=ng {{bilangngPahina}}
-
-open_file.title=Magbukas ng file
-open_file_label=Buksan
-bookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window)
-bookmark_label=Kasalukuyang tingin
-
-# Secondary toolbar and context menu
-
-
-# Document properties dialog box
-document_properties_title=Pamagat:
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-outline.title=Ipakita ang banghay ng dokumento
-outline_label=Banghay ng dokumento
-thumbs.title=Ipakita ang mga Thumbnails
-findbar_label=Hanapin
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Pahina {{pahina}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Thumbnail ng Pahina {{pahina}}
-
-# Find panel button title and messages
-
-# Error panel labels
-error_more_info=Maraming Inpormasyon
-error_less_info=Maikling Inpormasyon
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Mensahe: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Linya: { { linya } }
-rendering_error=May naganap na pagkakamali habang pagsasalin sa pahina.
-
-# Predefined zoom values
-page_scale_width=Haba ng Pahina
-page_scale_fit=ang pahina ay angkop
-page_scale_auto=awtomatikong pag-imbulog
-
-# Loading indicator messages
-loading_error=May maling nangyari habang kinakarga ang PDF.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-password_ok=OK
-
diff --git a/public/pfd/build/generic/web/locale/tn/viewer.properties b/public/pfd/build/generic/web/locale/tn/viewer.properties
deleted file mode 100644
index 57f06a8..0000000
--- a/public/pfd/build/generic/web/locale/tn/viewer.properties
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Tsebe:
-
-zoom.title=Zuma/gogela
-open_file.title=Bula Faele
-open_file_label=Bula
-
-# Secondary toolbar and context menu
-
-
-# Document properties dialog box
-document_properties_file_name=Leina la faele:
-document_properties_title=Leina:
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-findbar_label=Batla
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-
-# Find panel button title and messages
-find_previous.title=Batla tiragalo e e fetileng ya setlhopha sa mafoko
-find_next.title=Batla tiragalo e e latelang ya setlhopha sa mafoko
-find_not_found=Setlhopha sa mafoko ga se a bonwa
-
-# Error panel labels
-error_more_info=Tshedimosetso e Nngwe
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-
-# Predefined zoom values
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=Phoso
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-password_ok=Siame
-password_cancel=Khansela
-
diff --git a/public/pfd/build/generic/web/locale/tr/viewer.properties b/public/pfd/build/generic/web/locale/tr/viewer.properties
deleted file mode 100644
index 750501b..0000000
--- a/public/pfd/build/generic/web/locale/tr/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Önceki sayfa
-previous_label=Önceki
-next.title=Sonraki sayfa
-next_label=Sonraki
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Sayfa:
-page_of=/ {{pageCount}}
-
-zoom_out.title=Uzaklaș
-zoom_out_label=Uzaklaș
-zoom_in.title=Yaklaş
-zoom_in_label=Yaklaş
-zoom.title=Yakınlaştırma
-presentation_mode.title=Sunum moduna geç
-presentation_mode_label=Sunum Modu
-open_file.title=Dosya aç
-open_file_label=Aç
-print.title=Yazdır
-print_label=Yazdır
-download.title=İndir
-download_label=İndir
-bookmark.title=Geçerli görünüm (kopyala veya yeni pencerede aç)
-bookmark_label=Geçerli görünüm
-
-# Secondary toolbar and context menu
-tools.title=Araçlar
-tools_label=Araçlar
-first_page.title=İlk sayfaya git
-first_page.label=İlk sayfaya git
-first_page_label=İlk sayfaya git
-last_page.title=Son sayfaya git
-last_page.label=Son sayfaya git
-last_page_label=Son sayfaya git
-page_rotate_cw.title=Saat yönünde döndür
-page_rotate_cw.label=Saat yönünde döndür
-page_rotate_cw_label=Saat yönünde döndür
-page_rotate_ccw.title=Saat yönünün tersine döndür
-page_rotate_ccw.label=Saat yönünün tersine döndür
-page_rotate_ccw_label=Saat yönünün tersine döndür
-
-hand_tool_enable.title=El aracını etkinleştir
-hand_tool_enable_label=El aracını etkinleştir
-hand_tool_disable.title=El aracını kapat
-hand_tool_disable_label=El aracını kapat
-
-# Document properties dialog box
-document_properties.title=Belge özellikleri…
-document_properties_label=Belge özellikleri…
-document_properties_file_name=Dosya adı:
-document_properties_file_size=Dosya boyutu:
-document_properties_kb={{size_kb}} KB ({{size_b}} bayt)
-document_properties_mb={{size_mb}} MB ({{size_b}} bayt)
-document_properties_title=Başlık:
-document_properties_author=Yazar:
-document_properties_subject=Konu:
-document_properties_keywords=Anahtar kelimeler:
-document_properties_creation_date=Oluturma tarihi:
-document_properties_modification_date=Değiştirme tarihi:
-document_properties_date_string={{date}} {{time}}
-document_properties_creator=Oluşturan:
-document_properties_producer=PDF üreticisi:
-document_properties_version=PDF sürümü:
-document_properties_page_count=Sayfa sayısı:
-document_properties_close=Kapat
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Kenar çubuğunu aç/kapat
-toggle_sidebar_label=Kenar çubuğunu aç/kapat
-outline.title=Belge şemasını göster
-outline_label=Belge şeması
-attachments.title=Ekleri göster
-attachments_label=Ekler
-thumbs.title=Küçük resimleri göster
-thumbs_label=Küçük resimler
-findbar.title=Belgede bul
-findbar_label=Bul
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Sayfa {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas={{page}}. sayfanın küçük hâli
-
-# Find panel button title and messages
-find_label=Bul:
-find_previous.title=Önceki eşleşmeyi bul
-find_previous_label=Önceki
-find_next.title=Sonraki eşleşmeyi bul
-find_next_label=Sonraki
-find_highlight=Tümünü vurgula
-find_match_case_label=Büyük-küçük harf eşleştir
-find_reached_top=Belgenin başına ulaşıldı, sonundan devam edildi
-find_reached_bottom=Belgenin sonuna ulaşıldı, başından devam edildi
-find_not_found=Eşleşme bulunamadı
-
-# Error panel labels
-error_more_info=Daha fazla bilgi
-error_less_info=Daha az bilgi
-error_close=Kapat
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js sürüm {{version}} (yapı: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=İleti: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Yığın: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Dosya: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Satır: {{line}}
-rendering_error=Sayfa yorumlanırken bir hata oluştu.
-
-# Predefined zoom values
-page_scale_width=Sayfa genişliği
-page_scale_fit=Sayfayı sığdır
-page_scale_auto=Otomatik yakınlaştır
-page_scale_actual=Gerçek boyut
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent=%{{scale}}
-
-# Loading indicator messages
-loading_error_indicator=Hata
-loading_error=PDF yüklenirken bir hata oluştu.
-invalid_file_error=Geçersiz veya bozulmuş PDF dosyası.
-missing_file_error=PDF dosyası eksik.
-unexpected_response_error=Beklenmeyen sunucu yanıtı.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} işareti]
-password_label=Bu PDF dosyasını açmak için parolasını girin.
-password_invalid=Geçersiz parola. Lütfen tekrar deneyin.
-password_ok=Tamam
-password_cancel=İptal
-
-printing_not_supported=Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir.
-printing_not_ready=Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil.
-web_fonts_disabled=Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor.
-document_colors_disabled=PDF belgelerinin kendi renklerini kullanması için izin verilmiyor: 'Sayfalara kendi renklerini seçmesi için izin ver' tarayıcıda etkinleştirilmemiş.
diff --git a/public/pfd/build/generic/web/locale/uk/viewer.properties b/public/pfd/build/generic/web/locale/uk/viewer.properties
deleted file mode 100644
index 57e9867..0000000
--- a/public/pfd/build/generic/web/locale/uk/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Попередня сторінка
-previous_label=Попередня
-next.title=Наступна сторінка
-next_label=Наступна
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Сторінка:
-page_of=з {{pageCount}}
-
-zoom_out.title=Зменшити
-zoom_out_label=Зменшити
-zoom_in.title=Збільшити
-zoom_in_label=Збільшити
-zoom.title=Масштаб
-presentation_mode.title=Перейти в режим презентації
-presentation_mode_label=Режим презентації
-open_file.title=Відкрити файл
-open_file_label=Відкрити
-print.title=Друк
-print_label=Друк
-download.title=Завантажити
-download_label=Завантажити
-bookmark.title=Поточний вигляд (копіювати чи відкрити у новому вікні)
-bookmark_label=Поточний вигляд
-
-# Secondary toolbar and context menu
-tools.title=Інструменти
-tools_label=Інструменти
-first_page.title=На першу сторінку
-first_page.label=На першу сторінку
-first_page_label=На першу сторінку
-last_page.title=На останню сторінку
-last_page.label=На останню сторінку
-last_page_label=На останню сторінку
-page_rotate_cw.title=Повернути за годинниковою стрілкою
-page_rotate_cw.label=Повернути за годинниковою стрілкою
-page_rotate_cw_label=Повернути за годинниковою стрілкою
-page_rotate_ccw.title=Повернути проти годинникової стрілки
-page_rotate_ccw.label=Повернути проти годинникової стрілки
-page_rotate_ccw_label=Повернути проти годинникової стрілки
-
-hand_tool_enable.title=Увімкнути інструмент «Рука»
-hand_tool_enable_label=Увімкнути інструмент «Рука»
-hand_tool_disable.title=Вимкнути інструмент «Рука»
-hand_tool_disable_label=Вимкнути інструмент «Рука»
-
-# Document properties dialog box
-document_properties.title=Властивості документа…
-document_properties_label=Властивості документа…
-document_properties_file_name=Назва файла:
-document_properties_file_size=Розмір файла:
-document_properties_kb={{size_kb}} КБ ({{size_b}} bytes)
-document_properties_mb={{size_mb}} МБ ({{size_b}} bytes)
-document_properties_title=Заголовок:
-document_properties_author=Автор:
-document_properties_subject=Тема:
-document_properties_keywords=Ключові слова:
-document_properties_creation_date=Дата створення:
-document_properties_modification_date=Дата зміни:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Створено:
-document_properties_producer=Виробник PDF:
-document_properties_version=Версія PDF:
-document_properties_page_count=Кількість сторінок:
-document_properties_close=Закрити
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Бічна панель
-toggle_sidebar_label=Перемкнути бічну панель
-outline.title=Показувати схему документа
-outline_label=Схема документа
-attachments.title=Показати прикріплення
-attachments_label=Прикріплення
-thumbs.title=Показувати ескізи
-thumbs_label=Ескізи
-findbar.title=Шукати в документі
-findbar_label=Пошук
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Сторінка {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Ескіз сторінки {{page}}
-
-# Find panel button title and messages
-find_label=Знайти:
-find_previous.title=Знайти попереднє входження фрази
-find_previous_label=Попереднє
-find_next.title=Знайти наступне входження фрази
-find_next_label=Наступне
-find_highlight=Підсвітити все
-find_match_case_label=З урахуванням регістру
-find_reached_top=Досягнуто початку документу, продовжено з кінця
-find_reached_bottom=Досягнуто кінця документу, продовжено з початку
-find_not_found=Фразу не знайдено
-
-# Error panel labels
-error_more_info=Більше інформації
-error_less_info=Менше інформації
-error_close=Закрити
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Повідомлення: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Стек: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Файл: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Рядок: {{line}}
-rendering_error=Під час виведення сторінки сталася помилка.
-
-# Predefined zoom values
-page_scale_width=За шириною
-page_scale_fit=Умістити
-page_scale_auto=Авто-масштаб
-page_scale_actual=Дійсний розмір
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=Помилка
-loading_error=Під час завантаження PDF сталася помилка.
-invalid_file_error=Недійсний або пошкоджений PDF-файл.
-missing_file_error=Відсутній PDF-файл.
-unexpected_response_error=Неочікувана відповідь сервера.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}}-аннотація]
-password_label=Введіть пароль для відкриття цього PDF-файла.
-password_invalid=Невірний пароль. Спробуйте ще.
-password_ok=Гаразд
-password_cancel=Скасувати
-
-printing_not_supported=Попередження: Цей браузер не повністю підтримує друк.
-printing_not_ready=Попередження: PDF не повністю завантажений для друку.
-web_fonts_disabled=Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти.
-document_colors_disabled=PDF-документам не дозволено використовувати свої власні кольори: в браузері вимкнено «Дозволити сторінкам використовувати свої власні кольори».
diff --git a/public/pfd/build/generic/web/locale/ur/viewer.properties b/public/pfd/build/generic/web/locale/ur/viewer.properties
deleted file mode 100644
index c52220f..0000000
--- a/public/pfd/build/generic/web/locale/ur/viewer.properties
+++ /dev/null
@@ -1,161 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=پچھلا صفحہ
-previous_label=پچھلا
-next.title=اگلا صفحہ
-next_label=آگے
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=صفحہ:
-page_of={{pageCount}} کا
-
-zoom_out.title=باہر زوم کریں
-zoom_out_label=باہر زوم کریں
-zoom_in.title=اندر زوم کریں
-zoom_in_label=اندر زوم کریں
-zoom.title=زوم
-presentation_mode.title=پیشکش موڈ میں چلے جائیں
-presentation_mode_label=پیشکش موڈ
-open_file.title=مسل کھولیں
-open_file_label=کھولیں
-print.title=چھاپیں
-print_label=چھاپیں
-download.title=ڈاؤن لوڈ
-download_label=ڈاؤن لوڈ
-bookmark.title=حالیہ نظارہ (نۓ دریچہ میں نقل کریں یا کھولیں)
-bookmark_label=حالیہ نظارہ
-
-# Secondary toolbar and context menu
-tools.title=آلات
-tools_label=آلات
-first_page.title=پہلے صفحہ پر جائیں
-first_page.label=پہلے صفحہ پر جائیں
-first_page_label=پہلے صفحہ پر جائیں
-last_page.title=آخری صفحہ پر جائیں
-last_page.label=آخری صفحہ پر جائیں
-last_page_label=آخری صفحہ پر جائیں
-page_rotate_cw.title=گھڑی وار گھمائیں
-page_rotate_cw.label=گھڑی وار گھمائیں
-page_rotate_cw_label=گھڑی وار گھمائیں
-page_rotate_ccw.title=ضد گھڑی وار گھمائیں
-page_rotate_ccw.label=ضد گھڑی وار گھمائیں
-page_rotate_ccw_label=ضد گھڑی وار گھمائیں
-
-hand_tool_enable.title=ہاتھ ٹول اہل بنائیں
-hand_tool_enable_label=ہاتھ ٹول اہل بنائیں
-hand_tool_disable.title=ہاتھ ٹول nنااہل بنائیں 
-hand_tool_disable_label=ہاتھ ٹول نااہل بنائیں
-
-# Document properties dialog box
-document_properties.title=دستاویز خواص…
-document_properties_label=دستاویز خواص… 
-document_properties_file_name=نام مسل:
-document_properties_file_size=مسل سائز:
-document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
-document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
-document_properties_title=عنوان:
-document_properties_author=تخلیق کار:
-document_properties_subject=موضوع:
-document_properties_keywords=کلیدی الفاظ:
-document_properties_creation_date=تخلیق کی تاریخ:
-document_properties_modification_date=ترمیم کی تاریخ:
-document_properties_date_string={{date}}، {{time}}
-document_properties_creator=تخلیق کار:
-document_properties_producer=PDF پیدا کار:
-document_properties_version=PDF ورژن:
-document_properties_page_count=صفحہ شمار:
-document_properties_close=بند کریں
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=سلائیڈ ٹوگل کریں
-toggle_sidebar_label=سلائیڈ ٹوگل کریں
-outline.title=دستاویز آؤٹ لائن دکھائیں
-outline_label=دستاویز آؤٹ لائن
-thumbs.title=تھمبنیل دکھائیں
-thumbs_label=مجمل
-findbar.title=دستاویز میں ڈھونڈیں
-findbar_label=ڈھونڈیں
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=صفحہ {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=صفحے کا مجمل {{page}}
-
-# Find panel button title and messages
-find_label=ڈھونڈیں:
-find_previous.title=فقرے کا پچھلا وقوع ڈھونڈیں
-find_previous_label=پچھلا
-find_next.title=فقرے کا اگلہ وقوع ڈھونڈیں
-find_next_label=آگے
-find_highlight=تمام نمایاں کریں
-find_match_case_label=حروف مشابہ کریں
-find_reached_top=صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا
-find_reached_bottom=صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا
-find_not_found=فقرا نہیں ملا
-
-# Error panel labels
-error_more_info=مزید معلومات
-error_less_info=کم معلومات
-error_close=بند کریں
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=پیغام: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=سٹیک: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=مسل: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=لائن: {{line}}
-rendering_error=صفحہ بناتے ہوئے نقص آ گیا۔
-
-# Predefined zoom values
-page_scale_width=صفحہ چوڑائی
-page_scale_fit=صفحہ فٹنگ
-page_scale_auto=خودکار زوم
-page_scale_actual=اصل سائز
-
-# Loading indicator messages
-loading_error_indicator=نقص
-loading_error=PDF لوڈ کرتے وقت نقص آ گیا۔
-invalid_file_error=ناجائز یا خراب PDF مسل
-missing_file_error=PDF مسل غائب ہے۔
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} نوٹ]
-password_label=PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں.
-password_invalid=ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں.
-password_ok=سہی
-password_cancel=منسوخ کریں
-
-printing_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔
-printing_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔
-web_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔
-document_colors_disabled=PDF دستاویزات کو اپنے رنگ استعمال کرنے کی اجازت نہیں: 'صفحات کو اپنے رنگ چنیں' کی اِجازت براؤزر میں بے عمل ہے۔
diff --git a/public/pfd/build/generic/web/locale/vi/viewer.properties b/public/pfd/build/generic/web/locale/vi/viewer.properties
deleted file mode 100644
index 0c2a58d..0000000
--- a/public/pfd/build/generic/web/locale/vi/viewer.properties
+++ /dev/null
@@ -1,145 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Trang Trước
-previous_label=Trước
-next.title=Trang Sau
-next_label=Tiếp
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Trang:
-page_of=thuộc về {{pageCount}}
-
-zoom_out.title=Thu nhỏ
-zoom_out_label=Thu nhỏ
-zoom_in.title=Phóng to
-zoom_in_label=Phóng to
-zoom.title=Thu phóng
-presentation_mode.title=Chuyển sang chế độ trình chiếu
-presentation_mode_label=Chế độ trình chiếu
-open_file.title=Mở Tập Tin
-open_file_label=Mở tập tin
-print.title=In
-print_label=In
-download.title=Tải xuống
-download_label=Tải xuống
-bookmark.title=Góc nhìn hiện tại (copy hoặc mở trong cửa sổ mới)
-bookmark_label=Chế độ xem hiện tại
-
-# Secondary toolbar and context menu
-tools.title=Công cụ
-page_rotate_cw.title=Xoay theo chiều kim đồng hồ
-page_rotate_cw.label=Xoay theo chiều kim đồng hồ
-page_rotate_cw_label=Xoay theo chiều kim đồng hồ
-page_rotate_ccw.title=Xoay ngược chiều kim đồng hồ
-page_rotate_ccw.label=Xoay ngược chiều kim đồng hồ
-page_rotate_ccw_label=Xoay ngược chiều kim đồng hồ
-
-
-# Document properties dialog box
-document_properties_file_size=Kích thước tập tin:
-document_properties_title=Tiêu đề:
-document_properties_author=Tác giả:
-document_properties_subject=Chủ đề:
-document_properties_keywords=Từ khóa:
-document_properties_creation_date=Ngày tạo:
-document_properties_modification_date=Ngày sửa đổi:
-document_properties_producer=Nhà sản xuất PDF:
-document_properties_version=Phiên bản PDF:
-document_properties_page_count=Tổng số trang:
-document_properties_close=Ðóng
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Bật/Tắt Thanh Lề
-toggle_sidebar_label=Bật/Tắt Thanh Lề
-outline.title=Hiển thị bản phác tài liệu
-outline_label=Bản phác họa Tài liệu
-thumbs.title=Hiển thị Thumbnails
-thumbs_label=Thumbnails (hình biểu diễn nhỏ)
-findbar.title=Tìm trong tài liệu
-findbar_label=Tìm
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Trang {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Hình ảnh thu nhỏ của trang {{page}}
-
-# Find panel button title and messages
-find_label=Tìm kiếm:
-find_previous.title=Tìm cụm từ ở phần trước
-find_previous_label=Trước
-find_next.title=Tìm cụm từ ở phần sau
-find_next_label=Tiếp
-find_highlight=Tô sáng tất cả
-find_match_case_label=Phân biệt chữ hoa, chữ thường
-find_reached_top=Đã đến phần đầu tài liệu, quay trở lại từ cuối
-find_reached_bottom=Đã đến phần cuối của tài liệu, quay trở lại từ đầu
-find_not_found=Không tìm thấy cụm từ
-
-# Error panel labels
-error_more_info=Thông tin thêm
-error_less_info=Hiển thị ít thông tin hơn
-error_close=Đóng
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Thông điệp: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Stack: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Tệp: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Dòng: {{line}}
-rendering_error=Lỗi khi hiển thị trang.
-
-# Predefined zoom values
-page_scale_width=Chiều rộng trang
-page_scale_fit=Độ vừa của trang
-page_scale_auto=Tự động thu/phóng
-page_scale_actual=Kích thước thực
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=Lỗi
-loading_error=Lỗi khi tải tài liệu PDF.
-invalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ.
-missing_file_error=Thiếu tập tin PDF.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Chú thích]
-password_label=Nhập mật khẩu để mở tập tin PDF này.
-password_invalid=Mật khẩu không đúng. Vui lòng thử lại.
-password_ok=OK
-password_cancel=Hủy bỏ
-
-printing_not_supported=Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này.
-printing_not_ready=Cảnh báo: PDF chưa được tải hết để in.
-web_fonts_disabled=Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng.
-document_colors_disabled=Tài liệu PDF không được cho phép dùng màu riêng: 'Cho phép trang chọn màu riêng' đã bị tắt trên trình duyệt.
diff --git a/public/pfd/build/generic/web/locale/wo/viewer.properties b/public/pfd/build/generic/web/locale/wo/viewer.properties
deleted file mode 100644
index 3a9a4f9..0000000
--- a/public/pfd/build/generic/web/locale/wo/viewer.properties
+++ /dev/null
@@ -1,118 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Xët wi jiitu
-previous_label=Bi jiitu
-next.title=Xët wi ci topp
-next_label=Bi ci topp
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Xët:
-page_of=ci {{pageCount}}
-
-zoom_out.title=Wàññi
-zoom_out_label=Wàññi
-zoom_in.title=Yaatal
-zoom_in_label=Yaatal
-zoom.title=Yambalaŋ
-presentation_mode.title=Wañarñil ci anamu wone
-presentation_mode_label=Anamu Wone
-open_file.title=Ubbi benn dencukaay
-open_file_label=Ubbi
-print.title=Móol
-print_label=Móol
-download.title=Yeb yi
-download_label=Yeb yi
-bookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees)
-bookmark_label=Wone bi feeñ
-
-# Secondary toolbar and context menu
-
-
-# Document properties dialog box
-document_properties_title=Bopp:
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-outline.title=Wone takku yi
-outline_label=Takku jukki yi
-thumbs.title=Wone nataal yu ndaw yi
-thumbs_label=Nataal yu ndaw yi
-findbar.title=Gis ci biir jukki bi
-findbar_label=Wut
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Xët {{xët}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Wiñet bu xët{{xët}}
-
-# Find panel button title and messages
-find_label=Wut:
-find_previous.title=Seet beneen kaddu bu ni mel te jiitu
-find_previous_label=Bi jiitu
-find_next.title=Seet beneen kaddu bu ni mel
-find_next_label=Bi ci topp
-find_highlight=Melaxal lépp
-find_match_case_label=Sàmm jëmmalin wi
-find_reached_top=Jot nañu ndorteel xët wi, kontine dale ko ci suuf
-find_reached_bottom=Jot nañu jeexitalu xët wi, kontine ci ndorte
-find_not_found=Gisiñu kaddu gi
-
-# Error panel labels
-error_more_info=Xibaar yu gën bari
-error_less_info=Xibaar yu gën bari
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Bataaxal: {{bataaxal}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Juug: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Dencukaay: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Rëdd : {{line}}
-rendering_error=Am njumte bu am bi xët bi di wonewu.
-
-# Predefined zoom values
-page_scale_width=Yaatuwaay bu mët
-page_scale_fit=Xët lëmm
-page_scale_auto=Yambalaŋ ci saa si
-page_scale_actual=Dayo bi am
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-
-# Loading indicator messages
-loading_error_indicator=Njumte
-loading_error=Am na njumte ci yebum dencukaay PDF bi.
-invalid_file_error=Dencukaay PDF bi baaxul walla mu sankar.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Karmat {{type}}]
-password_ok=OK
-password_cancel=Neenal
-
-printing_not_supported=Artu: Joowkat bii nanguwul lool mool.
diff --git a/public/pfd/build/generic/web/locale/xh/viewer.properties b/public/pfd/build/generic/web/locale/xh/viewer.properties
deleted file mode 100644
index 36cd2cf..0000000
--- a/public/pfd/build/generic/web/locale/xh/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Iphepha langaphambili
-previous_label=Okwangaphambili
-next.title=Iphepha elilandelayo
-next_label=Okulandelayo
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Iphepha:
-page_of=kwali- {{pageCount}}
-
-zoom_out.title=Bhekelisela Kudana
-zoom_out_label=Bhekelisela Kudana
-zoom_in.title=Sondeza Kufuphi
-zoom_in_label=Sondeza Kufuphi
-zoom.title=Yandisa / Nciphisa
-presentation_mode.title=Tshintshela kwimo yonikezelo
-presentation_mode_label=Imo yonikezelo
-open_file.title=Vula Ifayile
-open_file_label=Vula
-print.title=Printa
-print_label=Printa
-download.title=Khuphela
-download_label=Khuphela
-bookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha)
-bookmark_label=Imbonakalo ekhoyo
-
-# Secondary toolbar and context menu
-tools.title=Izixhobo zemiyalelo
-tools_label=Izixhobo zemiyalelo
-first_page.title=Yiya kwiphepha lokuqala
-first_page.label=Yiya kwiphepha lokuqala
-first_page_label=Yiya kwiphepha lokuqala
-last_page.title=Yiya kwiphepha lokugqibela
-last_page.label=Yiya kwiphepha lokugqibela
-last_page_label=Yiya kwiphepha lokugqibela
-page_rotate_cw.title=Jikelisa ngasekunene
-page_rotate_cw.label=Jikelisa ngasekunene
-page_rotate_cw_label=Jikelisa ngasekunene
-page_rotate_ccw.title=Jikelisa ngasekhohlo
-page_rotate_ccw.label=Jikelisa ngasekhohlo
-page_rotate_ccw_label=Jikelisa ngasekhohlo
-
-hand_tool_enable.title=Yenza isixhobo sesandla sisebenze
-hand_tool_enable_label=Yenza isixhobo sesandla sisebenze
-hand_tool_disable.title=Yenza isixhobo sesandla singasebenzi
-hand_tool_disable_label=Yenza isixhobo sesandla singasebenzi
-
-# Document properties dialog box
-document_properties.title=Iipropati zoxwebhu…
-document_properties_label=Iipropati zoxwebhu…
-document_properties_file_name=Igama lefayile:
-document_properties_file_size=Isayizi yefayile:
-document_properties_kb={{size_kb}} KB (iibhayiti{{size_b}})
-document_properties_mb={{size_mb}} MB (iibhayithi{{size_b}})
-document_properties_title=Umxholo:
-document_properties_author=Umbhali:
-document_properties_subject=Umbandela:
-document_properties_keywords=Amagama aphambili:
-document_properties_creation_date=Umhla wokwenziwa kwayo:
-document_properties_modification_date=Umhla wokulungiswa kwayo:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=Umntu oyenzileyo:
-document_properties_producer=Umvelisi we-PDF:
-document_properties_version=Uhlelo lwe-PDF:
-document_properties_page_count=Inani lamaphepha:
-document_properties_close=Vala
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=Togola ngebha eseCaleni
-toggle_sidebar_label=Togola ngebha eseCaleni
-outline.title=Bonisa isishwankathelo soxwebhu
-outline_label=Isishwankathelo soxwebhu
-attachments.title=Bonisa iziqhotyoshelwa
-attachments_label=Iziqhoboshelo
-thumbs.title=Bonisa ukrobiso kumfanekiso
-thumbs_label=Ukrobiso kumfanekiso
-findbar.title=Fumana kuXwebhu
-findbar_label=Fumana
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Iphepha {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}}
-
-# Find panel button title and messages
-find_label=Fumanisa:
-find_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama
-find_previous_label=Okwangaphambili
-find_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama
-find_next_label=Okulandelayo
-find_highlight=Qaqambisa konke
-find_match_case_label=Tshatisa ngobukhulu bukanobumba
-find_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi
-find_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu
-find_not_found=Ibinzana alifunyenwanga
-
-# Error panel labels
-error_more_info=Inkcazelo Engakumbi
-error_less_info=Inkcazelo Encinane
-error_close=Vala
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=I-PDF.js v{{version}} (yakha: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Umyalezo: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Imfumba: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Ifayile: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Umgca: {{line}}
-rendering_error=Imposiso yenzekile xa bekunikezelwa iphepha.
-
-# Predefined zoom values
-page_scale_width=Ububanzi bephepha
-page_scale_fit=Ukulinganiswa kwephepha
-page_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo
-page_scale_actual=Ubungakanani bokwenene
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{umlinganiselo}}%
-
-# Loading indicator messages
-loading_error_indicator=Imposiso
-loading_error=Imposiso yenzekile xa kulayishwa i-PDF.
-invalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo.
-missing_file_error=Ifayile ye-PDF edukileyo.
-unexpected_response_error=Impendulo yeseva engalindelekanga.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} Ubhalo-nqaku]
-password_label=Faka ipasiwedi ukuze uvule le fayile yePDF.
-password_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona.
-password_ok=KULUNGILE
-password_cancel=Rhoxisa
-
-printing_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza.
-printing_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta.
-web_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo.
-document_colors_disabled=Amaxwebhu ePDF akavumelekanga ukuba asebenzise imibala yawo: 'Ukuvumela amaphepha ukuba asebenzise eyawo imibala' kuvaliwe ukuba kungasebenzi kwibhrawuza.
diff --git a/public/pfd/build/generic/web/locale/zh-CN/viewer.properties b/public/pfd/build/generic/web/locale/zh-CN/viewer.properties
deleted file mode 100644
index 6ec25f7..0000000
--- a/public/pfd/build/generic/web/locale/zh-CN/viewer.properties
+++ /dev/null
@@ -1,167 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=上一页
-previous_label=上一页
-next.title=下一页
-next_label=下一页
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=页面:
-page_of=/ {{pageCount}}
-
-zoom_out.title=缩小
-zoom_out_label=缩小
-zoom_in.title=放大
-zoom_in_label=放大
-zoom.title=缩放
-presentation_mode.title=切换到演示模式
-presentation_mode_label=演示模式
-open_file.title=打开文件
-open_file_label=打开
-print.title=打印
-print_label=打印
-download.title=下载
-download_label=下载
-bookmark.title=当前视图(复制或在新窗口中打开)
-bookmark_label=当前视图
-
-# Secondary toolbar and context menu
-tools.title=工具
-tools_label=工具
-first_page.title=转到第一页
-first_page.label=转到第一页
-first_page_label=转到第一页
-last_page.title=转到最后一页
-last_page.label=转到最后一页
-last_page_label=转到最后一页
-page_rotate_cw.title=顺时针旋转
-page_rotate_cw.label=顺时针旋转
-page_rotate_cw_label=顺时针旋转
-page_rotate_ccw.title=逆时针旋转
-page_rotate_ccw.label=逆时针旋转
-page_rotate_ccw_label=逆时针旋转
-
-hand_tool_enable.title=启用手形工具
-hand_tool_enable_label=启用手形工具
-hand_tool_disable.title=禁用手形工具
-hand_tool_disable_label=禁用手形工具
-
-# Document properties dialog box
-document_properties.title=文档属性…
-document_properties_label=文档属性…
-document_properties_file_name=文件名:
-document_properties_file_size=文件大小:
-document_properties_kb={{size_kb}} KB ({{size_b}} 字节)
-document_properties_mb={{size_mb}} MB ({{size_b}} 字节)
-document_properties_title=标题:
-document_properties_author=作者:
-document_properties_subject=主题:
-document_properties_keywords=关键词:
-document_properties_creation_date=创建日期:
-document_properties_modification_date=修改日期:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=创建者:
-document_properties_producer=PDF 制作者:
-document_properties_version=PDF 版本:
-document_properties_page_count=页数:
-document_properties_close=关闭
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=切换侧栏
-toggle_sidebar_label=切换侧栏
-outline.title=显示文档大纲
-outline_label=文档大纲
-attachments.title=显示附件
-attachments_label=附件
-thumbs.title=显示缩略图
-thumbs_label=缩略图
-findbar.title=在文档中查找
-findbar_label=查找
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=页码 {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=页面 {{page}} 的缩略图
-
-# Find panel button title and messages
-find_label=查找:
-find_previous.title=查找词语上一次出现的位置
-find_previous_label=上一页
-find_next.title=查找词语后一次出现的位置
-find_next_label=下一页
-find_highlight=全部高亮显示
-find_match_case_label=区分大小写
-find_reached_top=到达文档开头,从末尾继续
-find_reached_bottom=到达文档末尾,从开头继续
-find_not_found=词语未找到
-
-# Error panel labels
-error_more_info=更多信息
-error_less_info=更少信息
-error_close=关闭
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=信息:{{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=堆栈:{{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=文件:{{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=行号:{{line}}
-rendering_error=渲染页面时发生错误。
-
-# Predefined zoom values
-page_scale_width=适合页宽
-page_scale_fit=适合页面
-page_scale_auto=自动缩放
-page_scale_actual=实际大小
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=错误
-loading_error=载入PDF时发生错误。
-invalid_file_error=无效或损坏的PDF文件。
-missing_file_error=缺少PDF文件。
-unexpected_response_error=意外的服务器响应。
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} 注解]
-password_label=输入密码以打开此 PDF 文件。
-password_invalid=密码无效。请重试。
-password_ok=确定
-password_cancel=取消
-
-printing_not_supported=警告:打印功能不完全支持此浏览器。
-printing_not_ready=警告:该 PDF 未完全加载以供打印。
-web_fonts_disabled=Web 字体已被禁用:无法使用嵌入的PDF字体。
-document_colors_disabled=不允许 PDF 文档使用自己的颜色:浏览器中“允许页面选择自己的颜色”的选项已停用。
diff --git a/public/pfd/build/generic/web/locale/zh-TW/viewer.properties b/public/pfd/build/generic/web/locale/zh-TW/viewer.properties
deleted file mode 100644
index 11f20d7..0000000
--- a/public/pfd/build/generic/web/locale/zh-TW/viewer.properties
+++ /dev/null
@@ -1,168 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=上一頁
-previous_label=上一頁
-next.title=下一頁
-next_label=下一頁
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=頁:
-page_of=/ {{pageCount}}
-
-zoom_out.title=縮小
-zoom_out_label=縮小
-zoom_in.title=放大
-zoom_in_label=放大
-zoom.title=縮放
-presentation_mode.title=切換至簡報模式
-presentation_mode_label=簡報模式
-open_file.title=開啟檔案
-open_file_label=開啟
-print.title=列印
-print_label=列印
-download.title=下載
-download_label=下載
-bookmark.title=目前檢視的內容(複製或開啟於新視窗)
-bookmark_label=目前檢視
-
-# Secondary toolbar and context menu
-tools.title=工具
-tools_label=工具
-first_page.title=跳到第一頁
-first_page.label=跳到第一頁
-first_page_label=跳到第一頁
-last_page.title=跳到最後一頁
-last_page.label=跳到最後一頁
-last_page_label=跳到最後一頁
-page_rotate_cw.title=順時針旋轉
-page_rotate_cw.label=順時針旋轉
-page_rotate_cw_label=順時針旋轉
-page_rotate_ccw.title=逆時針旋轉
-page_rotate_ccw.label=逆時針旋轉
-page_rotate_ccw_label=逆時針旋轉
-
-hand_tool_enable.title=啟用掌型工具
-hand_tool_enable_label=啟用掌型工具
-hand_tool_disable.title=停用掌型工具
-hand_tool_disable_label=停用掌型工具
-
-# Document properties dialog box
-document_properties.title=文件內容…
-document_properties_label=文件內容…
-document_properties_file_name=檔案名稱:
-document_properties_file_size=檔案大小:
-document_properties_kb={{size_kb}} KB({{size_b}} 位元組)
-document_properties_mb={{size_mb}} MB({{size_b}} 位元組)
-document_properties_title=標題:
-document_properties_author=作者:
-document_properties_subject=主旨:
-document_properties_keywords=關鍵字:
-document_properties_creation_date=建立日期:
-document_properties_modification_date=修改日期:
-document_properties_date_string={{date}}, {{time}}
-document_properties_creator=建立者:
-document_properties_producer=PDF 產生器:
-document_properties_version=PDF 版本:
-document_properties_page_count=頁數:
-document_properties_close=關閉
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=切換側邊欄
-toggle_sidebar_label=切換側邊欄
-outline.title=顯示文件大綱
-outline_label=文件大綱
-attachments.title=顯示附件
-attachments_label=附件
-thumbs.title=顯示縮圖
-thumbs_label=縮圖
-findbar.title=在文件中尋找
-findbar_label=尋找
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=頁 {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=頁 {{page}} 的縮圖
-
-# Find panel button title and messages
-find_label=尋找:
-find_previous.title=尋找文字前次出現的位置
-find_previous_label=上一個
-find_next.title=尋找文字下次出現的位置
-find_next_label=下一個
-find_highlight=全部強調標示
-find_match_case_label=區分大小寫
-find_reached_top=已搜尋至文件頂端,自底端繼續搜尋
-find_reached_bottom=已搜尋至文件底端,自頂端繼續搜尋
-find_not_found=找不到指定文字
-
-# Error panel labels
-error_more_info=更多資訊
-error_less_info=更少資訊
-error_close=關閉
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=訊息: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=堆疊: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=檔案: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=行: {{line}}
-rendering_error=描繪頁面時發生錯誤。
-
-# Predefined zoom values
-page_scale_width=頁面寬度
-page_scale_fit=縮放至頁面大小
-page_scale_auto=自動縮放
-page_scale_actual=實際大小
-# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
-# numerical scale value.
-page_scale_percent={{scale}}%
-
-# Loading indicator messages
-loading_error_indicator=錯誤
-loading_error=載入 PDF 時發生錯誤。
-invalid_file_error=無效或毀損的 PDF 檔案。
-missing_file_error=找不到 PDF 檔案。
-unexpected_response_error=伺服器回應未預期的內容。
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[{{type}} 註解]
-password_label=請輸入用來開啟此 PDF 檔案的密碼。
-password_invalid=密碼不正確,請再試一次。
-password_ok=確定
-password_cancel=取消
-
-printing_not_supported=警告: 此瀏覽器未完整支援列印功能。
-printing_not_ready=警告: 此 PDF 未完成下載以供列印。
-web_fonts_disabled=已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。
-document_colors_disabled=瀏覽器的「優先使用網頁指定的色彩」未被勾選,PDF 文件無法使用自己的色彩。
-
diff --git a/public/pfd/build/generic/web/locale/zu/viewer.properties b/public/pfd/build/generic/web/locale/zu/viewer.properties
deleted file mode 100644
index bd7a08f..0000000
--- a/public/pfd/build/generic/web/locale/zu/viewer.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-# Copyright 2012 Mozilla Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Main toolbar buttons (tooltips and alt text for images)
-previous.title=Ikhasi eledlule
-previous_label=Okudlule
-next.title=Ikhasi elilandelayo
-next_label=Okulandelayo
-
-# LOCALIZATION NOTE (page_label, page_of):
-# These strings are concatenated to form the "Page: X of Y" string.
-# Do not translate "{{pageCount}}", it will be substituted with a number
-# representing the total number of pages.
-page_label=Ikhasi:
-page_of=kwe-{{pageCount}}
-
-zoom_out.title=Hlehlisela emuva
-zoom_out_label=Hlehlisela emuva
-zoom_in.title=Sondeza eduze
-zoom_in_label=Sondeza eduze
-zoom.title=Lwiza
-print.title=Phrinta
-print_label=Phrinta
-presentation_mode.title=Guqulela kwindlela yesethulo
-presentation_mode_label=Indlelo yesethulo
-open_file.title=Vula ifayela
-open_file_label=Vula
-download.title=Landa
-download_label=Landa
-bookmark.title=Ukubuka kwamanje (kopisha noma vula kwifasitela elisha)
-bookmark_label=Ukubuka kwamanje
-
-# Tooltips and alt text for side panel toolbar buttons
-# (the _label strings are alt text for the buttons, the .title strings are
-# tooltips)
-toggle_sidebar.title=I-toggle yebha yaseceleni
-toggle_sidebar_label=i-toggle yebha yaseceleni
-outline.title=Bonisa umugqa waseceleni wedokhumenti
-outline_label=Umugqa waseceleni wedokhumenti
-thumbs.title=Bonisa izithombe ezincane
-thumbs_label=Izithonjana
-findbar.title=Thola kwidokhumenti
-findbar_label=Thola
-
-# Thumbnails panel item (tooltip and alt text for images)
-# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
-# number.
-thumb_page_title=Ikhasi {{page}}
-# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
-# number.
-thumb_page_canvas=Isithonjana sekhasi {{page}}
-
-# Context menu
-first_page.label=Yiya kwikhasi lokuqala
-last_page.label=Yiya kwikhasi lokugcina
-page_rotate_cw.label=Jikisela ngendlela yewashi
-page_rotate_ccw.label=Jikisela kwelokudla
-
-# Find panel button title and messages
-find_label=Thola
-find_previous.title=Thola indawo eyandulelayo okuvela kuyo lomshwana
-find_previous_label=Okudlulile
-find_next.title=Thola enye indawo okuvela kuyo lomshwana
-find_next_label=Okulandelayo
-find_highlight=Gqamisa konke
-find_match_case_label=Fanisa ikheyisi
-find_reached_top=Finyelele phezulu kwidokhumenti, qhubeka kusukaphansi
-find_reached_bottom=Ifinyelele ekupheleni kwedokhumenti, qhubeka kusukaphezulu
-find_not_found=Umshwana awutholakali
-
-# Error panel labels
-error_more_info=Ukwaziswa Okwengeziwe
-error_less_info=Ukwazi okuncane
-error_close=Vala
-# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
-# replaced by the PDF.JS version and build ID.
-error_version_info=PDF.js v{{version}} (build: {{build}})
-# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
-# english string describing the error.
-error_message=Umlayezo: {{message}}
-# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
-# trace.
-error_stack=Isitaki: {{stack}}
-# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
-error_file=Ifayela: {{file}}
-# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
-error_line=Umugqa: {{line}}
-rendering_error=Iphutha lenzekile uma kunikwa ikhasi.
-
-# Predefined zoom values
-page_scale_width=Ububanzi bekhasi
-page_scale_fit=Ukulingana kwekhasi
-page_scale_auto=Ukulwiza okuzenzekalelayo
-page_scale_actual=Usayizi Wangempela
-
-# Loading indicator messages
-loading_error_indicator=Iphutha
-loading_error=Kwenzeke iphutha uma kulayishwa i-PDF.
-invalid_file_error=Ifayela le-PDF elingavumelekile noma elonakele.
-missing_file_error=Ifayela le-PDF elilahlekile.
-
-# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
-# "{{type}}" will be replaced with an annotation type from a list defined in
-# the PDF spec (32000-1:2008 Table 169 – Annotation types).
-# Some common types are e.g.: "Check", "Text", "Comment", "Note"
-text_annotation_type.alt=[Amazwibela e-{{type}}]
-request_password=I-PDF ivikeleke ngephasiwedi
-invalid_password=Iphasiwedi Engavumelekile.
-
-printing_not_supported=Isixwayiso: Ukuphrinta akuxhasiwe yilesisiphequluli ngokugcwele.
-printing_not_ready=Isixwayiso: I-PDF ayikalayishwa ngokuphelele yiPhrinta.
-web_fonts_disabled=Amafonti e-webhu akutshaziwe: ayikwazi ukusebenzisa amafonti abekiwe e-PDF. 
-document_colors_disabled=Amadokhumenti we-PDF awavumelekile ukusebenzisa imibalo yayo: 'Vumela amakhasi ukukhetha imibala yayo' ayisebenzi kusiphequluli.
diff --git a/public/pfd/build/generic/web/viewer.css b/public/pfd/build/generic/web/viewer.css
deleted file mode 100644
index a82150c..0000000
--- a/public/pfd/build/generic/web/viewer.css
+++ /dev/null
@@ -1,1999 +0,0 @@
-/* Copyright 2014 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-.textLayer {
-  position: absolute;
-  left: 0;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  overflow: hidden;
-  opacity: 0.2;
-}
-
-.textLayer > div {
-  color: transparent;
-  position: absolute;
-  white-space: pre;
-  cursor: text;
-  -webkit-transform-origin: 0% 0%;
-  -moz-transform-origin: 0% 0%;
-  -o-transform-origin: 0% 0%;
-  -ms-transform-origin: 0% 0%;
-  transform-origin: 0% 0%;
-}
-
-.textLayer .highlight {
-  margin: -1px;
-  padding: 1px;
-
-  background-color: rgb(180, 0, 170);
-  border-radius: 4px;
-}
-
-.textLayer .highlight.begin {
-  border-radius: 4px 0px 0px 4px;
-}
-
-.textLayer .highlight.end {
-  border-radius: 0px 4px 4px 0px;
-}
-
-.textLayer .highlight.middle {
-  border-radius: 0px;
-}
-
-.textLayer .highlight.selected {
-  background-color: rgb(0, 100, 0);
-}
-
-.textLayer ::selection { background: rgb(0,0,255); }
-.textLayer ::-moz-selection { background: rgb(0,0,255); }
-
-.pdfViewer .canvasWrapper {
-  overflow: hidden;
-}
-
-.pdfViewer .page {
-  direction: ltr;
-  width: 816px;
-  height: 1056px;
-  margin: 1px auto -8px auto;
-  position: relative;
-  overflow: visible;
-  border: 9px solid transparent;
-  background-clip: content-box;
-  border-image: url(images/shadow.png) 9 9 repeat;
-  background-color: white;
-}
-
-.pdfViewer.removePageBorders .page {
-  margin: 0px auto 10px auto;
-  border: none;
-}
-
-.pdfViewer .page canvas {
-  margin: 0;
-  display: block;
-}
-
-.pdfViewer .page .loadingIcon {
-  position: absolute;
-  display: block;
-  left: 0;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  background: url('images/loading-icon.gif') center no-repeat;
-}
-
-.pdfViewer .page .annotLink > a:hover {
-  opacity: 0.2;
-  background: #ff0;
-  box-shadow: 0px 2px 10px #ff0;
-}
-
-.pdfPresentationMode:-webkit-full-screen .pdfViewer .page {
-  margin-bottom: 100%;
-  border: 0;
-}
-
-.pdfPresentationMode:-moz-full-screen .pdfViewer .page {
-  margin-bottom: 100%;
-  border: 0;
-}
-
-.pdfPresentationMode:-ms-fullscreen .pdfViewer .page {
-  margin-bottom: 100% !important;
-  border: 0;
-}
-
-.pdfPresentationMode:fullscreen .pdfViewer .page {
-  margin-bottom: 100%;
-  border: 0;
-}
-
-.pdfViewer .page .annotText > img {
-  position: absolute;
-  cursor: pointer;
-}
-
-.pdfViewer .page .annotTextContentWrapper {
-  position: absolute;
-  width: 20em;
-}
-
-.pdfViewer .page .annotTextContent {
-  z-index: 200;
-  float: left;
-  max-width: 20em;
-  background-color: #FFFF99;
-  box-shadow: 0px 2px 5px #333;
-  border-radius: 2px;
-  padding: 0.6em;
-  cursor: pointer;
-}
-
-.pdfViewer .page .annotTextContent > h1 {
-  font-size: 1em;
-  border-bottom: 1px solid #000000;
-  padding-bottom: 0.2em;
-}
-
-.pdfViewer .page .annotTextContent > p {
-  padding-top: 0.2em;
-}
-
-.pdfViewer .page .annotLink > a {
-  position: absolute;
-  font-size: 1em;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-}
-
-.pdfViewer .page .annotLink > a /* -ms-a */  {
-  background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAA\
-                   LAAAAAABAAEAAAIBRAA7") 0 0 repeat;
-}
-
-* {
-  padding: 0;
-  margin: 0;
-}
-
-html {
-  height: 100%;
-  /* Font size is needed to make the activity bar the correct size. */
-  font-size: 10px;
-}
-
-body {
-  height: 100%;
-  background-color: #404040;
-  background-image: url(images/texture.png);
-}
-
-body,
-input,
-button,
-select {
-  font: message-box;
-  outline: none;
-}
-
-.hidden {
-  display: none !important;
-}
-[hidden] {
-  display: none !important;
-}
-
-#viewerContainer.pdfPresentationMode:-webkit-full-screen {
-  top: 0px;
-  border-top: 2px solid transparent;
-  background-color: #000;
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  cursor: none;
-  -webkit-user-select: none;
-}
-
-#viewerContainer.pdfPresentationMode:-moz-full-screen {
-  top: 0px;
-  border-top: 2px solid transparent;
-  background-color: #000;
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  cursor: none;
-  -moz-user-select: none;
-}
-
-#viewerContainer.pdfPresentationMode:-ms-fullscreen {
-  top: 0px !important;
-  border-top: 2px solid transparent;
-  width: 100%;
-  height: 100%;
-  overflow: hidden !important;
-  cursor: none;
-  -ms-user-select: none;
-}
-
-#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop {
-  background-color: #000;
-}
-
-#viewerContainer.pdfPresentationMode:fullscreen {
-  top: 0px;
-  border-top: 2px solid transparent;
-  background-color: #000;
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  cursor: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-}
-
-.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) {
-  display: none;
-}
-
-.pdfPresentationMode:-moz-full-screen a:not(.internalLink) {
-  display: none;
-}
-
-.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) {
-  display: none !important;
-}
-
-.pdfPresentationMode:fullscreen a:not(.internalLink) {
-  display: none;
-}
-
-.pdfPresentationMode:-webkit-full-screen .textLayer > div {
-  cursor: none;
-}
-
-.pdfPresentationMode:-moz-full-screen .textLayer > div {
-  cursor: none;
-}
-
-.pdfPresentationMode:-ms-fullscreen .textLayer > div {
-  cursor: none;
-}
-
-.pdfPresentationMode:fullscreen .textLayer > div {
-  cursor: none;
-}
-
-.pdfPresentationMode.pdfPresentationModeControls > *,
-.pdfPresentationMode.pdfPresentationModeControls .textLayer > div {
-  cursor: default;
-}
-
-/* outer/inner center provides horizontal center */
-.outerCenter {
-  pointer-events: none;
-  position: relative;
-}
-html[dir='ltr'] .outerCenter {
-  float: right;
-  right: 50%;
-}
-html[dir='rtl'] .outerCenter {
-  float: left;
-  left: 50%;
-}
-.innerCenter {
-  pointer-events: auto;
-  position: relative;
-}
-html[dir='ltr'] .innerCenter {
-  float: right;
-  right: -50%;
-}
-html[dir='rtl'] .innerCenter {
-  float: left;
-  left: -50%;
-}
-
-#outerContainer {
-  width: 100%;
-  height: 100%;
-  position: relative;
-}
-
-#sidebarContainer {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  width: 200px;
-  visibility: hidden;
-  -webkit-transition-duration: 200ms;
-  -webkit-transition-timing-function: ease;
-  transition-duration: 200ms;
-  transition-timing-function: ease;
-
-}
-html[dir='ltr'] #sidebarContainer {
-  -webkit-transition-property: left;
-  transition-property: left;
-  left: -200px;
-}
-html[dir='rtl'] #sidebarContainer {
-  -webkit-transition-property: right;
-  transition-property: right;
-  right: -200px;
-}
-
-#outerContainer.sidebarMoving > #sidebarContainer,
-#outerContainer.sidebarOpen > #sidebarContainer {
-  visibility: visible;
-}
-html[dir='ltr'] #outerContainer.sidebarOpen > #sidebarContainer {
-  left: 0px;
-}
-html[dir='rtl'] #outerContainer.sidebarOpen > #sidebarContainer {
-  right: 0px;
-}
-
-#mainContainer {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  min-width: 320px;
-  -webkit-transition-duration: 200ms;
-  -webkit-transition-timing-function: ease;
-  transition-duration: 200ms;
-  transition-timing-function: ease;
-}
-html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {
-  -webkit-transition-property: left;
-  transition-property: left;
-  left: 200px;
-}
-html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {
-  -webkit-transition-property: right;
-  transition-property: right;
-  right: 200px;
-}
-
-#sidebarContent {
-  top: 32px;
-  bottom: 0;
-  overflow: auto;
-  -webkit-overflow-scrolling: touch;
-  position: absolute;
-  width: 200px;
-  background-color: hsla(0,0%,0%,.1);
-}
-html[dir='ltr'] #sidebarContent {
-  left: 0;
-  box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25);
-}
-html[dir='rtl'] #sidebarContent {
-  right: 0;
-  box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25);
-}
-
-#viewerContainer {
-  overflow: auto;
-  -webkit-overflow-scrolling: touch;
-  position: absolute;
-  top: 32px;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  outline: none;
-}
-html[dir='ltr'] #viewerContainer {
-  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05);
-}
-html[dir='rtl'] #viewerContainer {
-  box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05);
-}
-
-.toolbar {
-  position: relative;
-  left: 0;
-  right: 0;
-  z-index: 9999;
-  cursor: default;
-}
-
-#toolbarContainer {
-  width: 100%;
-}
-
-#toolbarSidebar {
-  width: 200px;
-  height: 32px;
-  background-color: #424242; /* fallback */
-  background-image: url(images/texture.png),
-                    linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95));
-}
-html[dir='ltr'] #toolbarSidebar {
-  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25),
-              inset 0 -1px 0 hsla(0,0%,100%,.05),
-              0 1px 0 hsla(0,0%,0%,.15),
-              0 0 1px hsla(0,0%,0%,.1);
-}
-html[dir='rtl'] #toolbarSidebar {
-  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25),
-              inset 0 1px 0 hsla(0,0%,100%,.05),
-              0 1px 0 hsla(0,0%,0%,.15),
-              0 0 1px hsla(0,0%,0%,.1);
-}
-
-#toolbarContainer, .findbar, .secondaryToolbar {
-  position: relative;
-  height: 32px;
-  background-color: #474747; /* fallback */
-  background-image: url(images/texture.png),
-                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));
-}
-html[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar {
-  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),
-              inset 0 1px 1px hsla(0,0%,0%,.15),
-              inset 0 -1px 0 hsla(0,0%,100%,.05),
-              0 1px 0 hsla(0,0%,0%,.15),
-              0 1px 1px hsla(0,0%,0%,.1);
-}
-html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar {
-  box-shadow: inset -1px 0 0 hsla(0,0%,100%,.08),
-              inset 0 1px 1px hsla(0,0%,0%,.15),
-              inset 0 -1px 0 hsla(0,0%,100%,.05),
-              0 1px 0 hsla(0,0%,0%,.15),
-              0 1px 1px hsla(0,0%,0%,.1);
-}
-
-#toolbarViewer {
-  height: 32px;
-}
-
-#loadingBar {
-  position: relative;
-  width: 100%;
-  height: 4px;
-  background-color: #333;
-  border-bottom: 1px solid #333;
-}
-
-#loadingBar .progress {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 0%;
-  height: 100%;
-  background-color: #ddd;
-  overflow: hidden;
-  -webkit-transition: width 200ms;
-  transition: width 200ms;
-}
-
-@-webkit-keyframes progressIndeterminate {
-  0% { left: 0%; }
-  50% { left: 100%; }
-  100% { left: 100%; }
-}
-
-@keyframes progressIndeterminate {
-  0% { left: 0%; }
-  50% { left: 100%; }
-  100% { left: 100%; }
-}
-
-#loadingBar .progress.indeterminate {
-  background-color: #999;
-  -webkit-transition: none;
-  transition: none;
-}
-
-#loadingBar .indeterminate .glimmer {
-  position: absolute;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 50px;
-
-  background-image: linear-gradient(to right, #999 0%, #fff 50%, #999 100%);
-  background-size: 100% 100%;
-  background-repeat: no-repeat;
-
-  -webkit-animation: progressIndeterminate 2s linear infinite;
-  animation: progressIndeterminate 2s linear infinite;
-}
-
-.findbar, .secondaryToolbar {
-  top: 32px;
-  position: absolute;
-  z-index: 10000;
-  height: 32px;
-
-  min-width: 16px;
-  padding: 0px 6px 0px 6px;
-  margin: 4px 2px 4px 2px;
-  color: hsl(0,0%,85%);
-  font-size: 12px;
-  line-height: 14px;
-  text-align: left;
-  cursor: default;
-}
-
-html[dir='ltr'] .findbar {
-  left: 68px;
-}
-
-html[dir='rtl'] .findbar {
-  right: 68px;
-}
-
-.findbar label {
-  -webkit-user-select: none;
-  -moz-user-select: none;
-}
-
-#findInput[data-status="pending"] {
-  background-image: url(images/loading-small.png);
-  background-repeat: no-repeat;
-  background-position: right;
-}
-html[dir='rtl'] #findInput[data-status="pending"] {
-  background-position: left;
-}
-
-.secondaryToolbar {
-  padding: 6px;
-  height: auto;
-  z-index: 30000;
-}
-html[dir='ltr'] .secondaryToolbar {
-  right: 4px;
-}
-html[dir='rtl'] .secondaryToolbar {
-  left: 4px;
-}
-
-#secondaryToolbarButtonContainer {
-  max-width: 200px;
-  max-height: 400px;
-  overflow-y: auto;
-  -webkit-overflow-scrolling: touch;
-  margin-bottom: -4px;
-}
-
-.doorHanger,
-.doorHangerRight {
-  border: 1px solid hsla(0,0%,0%,.5);
-  border-radius: 2px;
-  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
-}
-.doorHanger:after, .doorHanger:before,
-.doorHangerRight:after, .doorHangerRight:before {
-  bottom: 100%;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-}
-.doorHanger:after,
-.doorHangerRight:after {
-  border-bottom-color: hsla(0,0%,32%,.99);
-  border-width: 8px;
-}
-.doorHanger:before,
-.doorHangerRight:before {
-  border-bottom-color: hsla(0,0%,0%,.5);
-  border-width: 9px;
-}
-
-html[dir='ltr'] .doorHanger:after,
-html[dir='rtl'] .doorHangerRight:after {
-  left: 13px;
-  margin-left: -8px;
-}
-
-html[dir='ltr'] .doorHanger:before,
-html[dir='rtl'] .doorHangerRight:before {
-  left: 13px;
-  margin-left: -9px;
-}
-
-html[dir='rtl'] .doorHanger:after,
-html[dir='ltr'] .doorHangerRight:after {
-  right: 13px;
-  margin-right: -8px;
-}
-
-html[dir='rtl'] .doorHanger:before,
-html[dir='ltr'] .doorHangerRight:before {
-  right: 13px;
-  margin-right: -9px;
-}
-
-#findMsg {
-  font-style: italic;
-  color: #A6B7D0;
-}
-
-#findInput.notFound {
-  background-color: rgb(255, 102, 102);
-}
-
-html[dir='ltr'] #toolbarViewerLeft {
-  margin-left: -1px;
-}
-html[dir='rtl'] #toolbarViewerRight {
-  margin-right: -1px;
-}
-
-html[dir='ltr'] #toolbarViewerLeft,
-html[dir='rtl'] #toolbarViewerRight {
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-html[dir='ltr'] #toolbarViewerRight,
-html[dir='rtl'] #toolbarViewerLeft {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-html[dir='ltr'] #toolbarViewerLeft > *,
-html[dir='ltr'] #toolbarViewerMiddle > *,
-html[dir='ltr'] #toolbarViewerRight > *,
-html[dir='ltr'] .findbar > * {
-  position: relative;
-  float: left;
-}
-html[dir='rtl'] #toolbarViewerLeft > *,
-html[dir='rtl'] #toolbarViewerMiddle > *,
-html[dir='rtl'] #toolbarViewerRight > *,
-html[dir='rtl'] .findbar > * {
-  position: relative;
-  float: right;
-}
-
-html[dir='ltr'] .splitToolbarButton {
-  margin: 3px 2px 4px 0;
-  display: inline-block;
-}
-html[dir='rtl'] .splitToolbarButton {
-  margin: 3px 0 4px 2px;
-  display: inline-block;
-}
-html[dir='ltr'] .splitToolbarButton > .toolbarButton {
-  border-radius: 0;
-  float: left;
-}
-html[dir='rtl'] .splitToolbarButton > .toolbarButton {
-  border-radius: 0;
-  float: right;
-}
-
-.toolbarButton,
-.secondaryToolbarButton,
-.overlayButton {
-  border: 0 none;
-  background: none;
-  width: 32px;
-  height: 25px;
-}
-
-.toolbarButton > span {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-
-.toolbarButton[disabled],
-.secondaryToolbarButton[disabled],
-.overlayButton[disabled] {
-  opacity: .5;
-}
-
-.toolbarButton.group {
-  margin-right: 0;
-}
-
-.splitToolbarButton.toggled .toolbarButton {
-  margin: 0;
-}
-
-.splitToolbarButton:hover > .toolbarButton,
-.splitToolbarButton:focus > .toolbarButton,
-.splitToolbarButton.toggled > .toolbarButton,
-.toolbarButton.textButton {
-  background-color: hsla(0,0%,0%,.12);
-  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
-  background-clip: padding-box;
-  border: 1px solid hsla(0,0%,0%,.35);
-  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
-  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
-              0 0 1px hsla(0,0%,100%,.15) inset,
-              0 1px 0 hsla(0,0%,100%,.05);
-  -webkit-transition-property: background-color, border-color, box-shadow;
-  -webkit-transition-duration: 150ms;
-  -webkit-transition-timing-function: ease;
-  transition-property: background-color, border-color, box-shadow;
-  transition-duration: 150ms;
-  transition-timing-function: ease;
-
-}
-.splitToolbarButton > .toolbarButton:hover,
-.splitToolbarButton > .toolbarButton:focus,
-.dropdownToolbarButton:hover,
-.overlayButton:hover,
-.toolbarButton.textButton:hover,
-.toolbarButton.textButton:focus {
-  background-color: hsla(0,0%,0%,.2);
-  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
-              0 0 1px hsla(0,0%,100%,.15) inset,
-              0 0 1px hsla(0,0%,0%,.05);
-  z-index: 199;
-}
-.splitToolbarButton > .toolbarButton {
-  position: relative;
-}
-html[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child,
-html[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child {
-  position: relative;
-  margin: 0;
-  margin-right: -1px;
-  border-top-left-radius: 2px;
-  border-bottom-left-radius: 2px;
-  border-right-color: transparent;
-}
-html[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child,
-html[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child {
-  position: relative;
-  margin: 0;
-  margin-left: -1px;
-  border-top-right-radius: 2px;
-  border-bottom-right-radius: 2px;
-  border-left-color: transparent;
-}
-.splitToolbarButtonSeparator {
-  padding: 8px 0;
-  width: 1px;
-  background-color: hsla(0,0%,0%,.5);
-  z-index: 99;
-  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
-  display: inline-block;
-  margin: 5px 0;
-}
-html[dir='ltr'] .splitToolbarButtonSeparator {
-  float: left;
-}
-html[dir='rtl'] .splitToolbarButtonSeparator {
-  float: right;
-}
-.splitToolbarButton:hover > .splitToolbarButtonSeparator,
-.splitToolbarButton.toggled > .splitToolbarButtonSeparator {
-  padding: 12px 0;
-  margin: 1px 0;
-  box-shadow: 0 0 0 1px hsla(0,0%,100%,.03);
-  -webkit-transition-property: padding;
-  -webkit-transition-duration: 10ms;
-  -webkit-transition-timing-function: ease;
-  transition-property: padding;
-  transition-duration: 10ms;
-  transition-timing-function: ease;
-}
-
-.toolbarButton,
-.dropdownToolbarButton,
-.secondaryToolbarButton,
-.overlayButton {
-  min-width: 16px;
-  padding: 2px 6px 0;
-  border: 1px solid transparent;
-  border-radius: 2px;
-  color: hsla(0,0%,100%,.8);
-  font-size: 12px;
-  line-height: 14px;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  /* Opera does not support user-select, use <... unselectable="on"> instead */
-  cursor: default;
-  -webkit-transition-property: background-color, border-color, box-shadow;
-  -webkit-transition-duration: 150ms;
-  -webkit-transition-timing-function: ease;
-  transition-property: background-color, border-color, box-shadow;
-  transition-duration: 150ms;
-  transition-timing-function: ease;
-}
-
-html[dir='ltr'] .toolbarButton,
-html[dir='ltr'] .overlayButton,
-html[dir='ltr'] .dropdownToolbarButton {
-  margin: 3px 2px 4px 0;
-}
-html[dir='rtl'] .toolbarButton,
-html[dir='rtl'] .overlayButton,
-html[dir='rtl'] .dropdownToolbarButton {
-  margin: 3px 0 4px 2px;
-}
-
-.toolbarButton:hover,
-.toolbarButton:focus,
-.dropdownToolbarButton,
-.overlayButton,
-.secondaryToolbarButton:hover,
-.secondaryToolbarButton:focus {
-  background-color: hsla(0,0%,0%,.12);
-  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
-  background-clip: padding-box;
-  border: 1px solid hsla(0,0%,0%,.35);
-  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
-  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
-              0 0 1px hsla(0,0%,100%,.15) inset,
-              0 1px 0 hsla(0,0%,100%,.05);
-}
-
-.toolbarButton:hover:active,
-.overlayButton:hover:active,
-.dropdownToolbarButton:hover:active,
-.secondaryToolbarButton:hover:active {
-  background-color: hsla(0,0%,0%,.2);
-  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
-  border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45);
-  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,
-              0 0 1px hsla(0,0%,0%,.2) inset,
-              0 1px 0 hsla(0,0%,100%,.05);
-  -webkit-transition-property: background-color, border-color, box-shadow;
-  -webkit-transition-duration: 10ms;
-  -webkit-transition-timing-function: linear;
-  transition-property: background-color, border-color, box-shadow;
-  transition-duration: 10ms;
-  transition-timing-function: linear;
-}
-
-.toolbarButton.toggled,
-.splitToolbarButton.toggled > .toolbarButton.toggled,
-.secondaryToolbarButton.toggled {
-  background-color: hsla(0,0%,0%,.3);
-  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
-  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5);
-  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,
-              0 0 1px hsla(0,0%,0%,.2) inset,
-              0 1px 0 hsla(0,0%,100%,.05);
-  -webkit-transition-property: background-color, border-color, box-shadow;
-  -webkit-transition-duration: 10ms;
-  -webkit-transition-timing-function: linear;
-  transition-property: background-color, border-color, box-shadow;
-  transition-duration: 10ms;
-  transition-timing-function: linear;
-}
-
-.toolbarButton.toggled:hover:active,
-.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,
-.secondaryToolbarButton.toggled:hover:active {
-  background-color: hsla(0,0%,0%,.4);
-  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55);
-  box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset,
-              0 0 1px hsla(0,0%,0%,.3) inset,
-              0 1px 0 hsla(0,0%,100%,.05);
-}
-
-.dropdownToolbarButton {
-  width: 120px;
-  max-width: 120px;
-  padding: 3px 2px 2px;
-  overflow: hidden;
-  background: url(images/toolbarButton-menuArrows.png) no-repeat;
-}
-html[dir='ltr'] .dropdownToolbarButton {
-  background-position: 95%;
-}
-html[dir='rtl'] .dropdownToolbarButton {
-  background-position: 5%;
-}
-
-.dropdownToolbarButton > select {
-  min-width: 140px;
-  font-size: 12px;
-  color: hsl(0,0%,95%);
-  margin: 0;
-  padding: 0;
-  border: none;
-  background: rgba(0,0,0,0); /* Opera does not support 'transparent' <select> background */
-}
-
-.dropdownToolbarButton > select > option {
-  background: hsl(0,0%,24%);
-}
-
-#customScaleOption {
-  display: none;
-}
-
-#pageWidthOption {
-  border-bottom: 1px rgba(255, 255, 255, .5) solid;
-}
-
-html[dir='ltr'] .splitToolbarButton:first-child,
-html[dir='ltr'] .toolbarButton:first-child,
-html[dir='rtl'] .splitToolbarButton:last-child,
-html[dir='rtl'] .toolbarButton:last-child {
-  margin-left: 4px;
-}
-html[dir='ltr'] .splitToolbarButton:last-child,
-html[dir='ltr'] .toolbarButton:last-child,
-html[dir='rtl'] .splitToolbarButton:first-child,
-html[dir='rtl'] .toolbarButton:first-child {
-  margin-right: 4px;
-}
-
-.toolbarButtonSpacer {
-  width: 30px;
-  display: inline-block;
-  height: 1px;
-}
-
-.toolbarButtonFlexibleSpacer {
-  -webkit-box-flex: 1;
-  -moz-box-flex: 1;
-  min-width: 30px;
-}
-
-html[dir='ltr'] #findPrevious {
-  margin-left: 3px;
-}
-html[dir='ltr'] #findNext {
-  margin-right: 3px;
-}
-
-html[dir='rtl'] #findPrevious {
-  margin-right: 3px;
-}
-html[dir='rtl'] #findNext {
-  margin-left: 3px;
-}
-
-.toolbarButton::before,
-.secondaryToolbarButton::before {
-  /* All matching images have a size of 16x16
-   * All relevant containers have a size of 32x25 */
-  position: absolute;
-  display: inline-block;
-  top: 4px;
-  left: 7px;
-}
-
-html[dir="ltr"] .secondaryToolbarButton::before {
-  left: 4px;
-}
-html[dir="rtl"] .secondaryToolbarButton::before {
-  right: 4px;
-}
-
-html[dir='ltr'] .toolbarButton#sidebarToggle::before {
-  content: url(images/toolbarButton-sidebarToggle.png);
-}
-html[dir='rtl'] .toolbarButton#sidebarToggle::before {
-  content: url(images/toolbarButton-sidebarToggle-rtl.png);
-}
-
-html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
-  content: url(images/toolbarButton-secondaryToolbarToggle.png);
-}
-html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
-  content: url(images/toolbarButton-secondaryToolbarToggle-rtl.png);
-}
-
-html[dir='ltr'] .toolbarButton.findPrevious::before {
-  content: url(images/findbarButton-previous.png);
-}
-html[dir='rtl'] .toolbarButton.findPrevious::before {
-  content: url(images/findbarButton-previous-rtl.png);
-}
-
-html[dir='ltr'] .toolbarButton.findNext::before {
-  content: url(images/findbarButton-next.png);
-}
-html[dir='rtl'] .toolbarButton.findNext::before {
-  content: url(images/findbarButton-next-rtl.png);
-}
-
-html[dir='ltr'] .toolbarButton.pageUp::before {
-  content: url(images/toolbarButton-pageUp.png);
-}
-html[dir='rtl'] .toolbarButton.pageUp::before {
-  content: url(images/toolbarButton-pageUp-rtl.png);
-}
-
-html[dir='ltr'] .toolbarButton.pageDown::before {
-  content: url(images/toolbarButton-pageDown.png);
-}
-html[dir='rtl'] .toolbarButton.pageDown::before {
-  content: url(images/toolbarButton-pageDown-rtl.png);
-}
-
-.toolbarButton.zoomOut::before {
-  content: url(images/toolbarButton-zoomOut.png);
-}
-
-.toolbarButton.zoomIn::before {
-  content: url(images/toolbarButton-zoomIn.png);
-}
-
-.toolbarButton.presentationMode::before,
-.secondaryToolbarButton.presentationMode::before {
-  content: url(images/toolbarButton-presentationMode.png);
-}
-
-.toolbarButton.print::before,
-.secondaryToolbarButton.print::before {
-  content: url(images/toolbarButton-print.png);
-}
-
-.toolbarButton.openFile::before,
-.secondaryToolbarButton.openFile::before {
-  content: url(images/toolbarButton-openFile.png);
-}
-
-.toolbarButton.download::before,
-.secondaryToolbarButton.download::before {
-  content: url(images/toolbarButton-download.png);
-}
-
-.toolbarButton.bookmark,
-.secondaryToolbarButton.bookmark {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  outline: none;
-  padding-top: 4px;
-  text-decoration: none;
-}
-.secondaryToolbarButton.bookmark {
-  padding-top: 5px;
-}
-
-.bookmark[href='#'] {
-  opacity: .5;
-  pointer-events: none;
-}
-
-.toolbarButton.bookmark::before,
-.secondaryToolbarButton.bookmark::before {
-  content: url(images/toolbarButton-bookmark.png);
-}
-
-#viewThumbnail.toolbarButton::before {
-  content: url(images/toolbarButton-viewThumbnail.png);
-}
-
-html[dir="ltr"] #viewOutline.toolbarButton::before {
-  content: url(images/toolbarButton-viewOutline.png);
-}
-html[dir="rtl"] #viewOutline.toolbarButton::before {
-  content: url(images/toolbarButton-viewOutline-rtl.png);
-}
-
-#viewAttachments.toolbarButton::before {
-  content: url(images/toolbarButton-viewAttachments.png);
-}
-
-#viewFind.toolbarButton::before {
-  content: url(images/toolbarButton-search.png);
-}
-
-.secondaryToolbarButton {
-  position: relative;
-  margin: 0 0 4px 0;
-  padding: 3px 0 1px 0;
-  height: auto;
-  min-height: 25px;
-  width: auto;
-  min-width: 100%;
-  white-space: normal;
-}
-html[dir="ltr"] .secondaryToolbarButton {
-  padding-left: 24px;
-  text-align: left;
-}
-html[dir="rtl"] .secondaryToolbarButton {
-  padding-right: 24px;
-  text-align: right;
-}
-html[dir="ltr"] .secondaryToolbarButton.bookmark {
-  padding-left: 27px;
-}
-html[dir="rtl"] .secondaryToolbarButton.bookmark {
-  padding-right: 27px;
-}
-
-html[dir="ltr"] .secondaryToolbarButton > span {
-  padding-right: 4px;
-}
-html[dir="rtl"] .secondaryToolbarButton > span {
-  padding-left: 4px;
-}
-
-.secondaryToolbarButton.firstPage::before {
-  content: url(images/secondaryToolbarButton-firstPage.png);
-}
-
-.secondaryToolbarButton.lastPage::before {
-  content: url(images/secondaryToolbarButton-lastPage.png);
-}
-
-.secondaryToolbarButton.rotateCcw::before {
-  content: url(images/secondaryToolbarButton-rotateCcw.png);
-}
-
-.secondaryToolbarButton.rotateCw::before {
-  content: url(images/secondaryToolbarButton-rotateCw.png);
-}
-
-.secondaryToolbarButton.handTool::before {
-  content: url(images/secondaryToolbarButton-handTool.png);
-}
-
-.secondaryToolbarButton.documentProperties::before {
-  content: url(images/secondaryToolbarButton-documentProperties.png);
-}
-
-.verticalToolbarSeparator {
-  display: block;
-  padding: 8px 0;
-  margin: 8px 4px;
-  width: 1px;
-  background-color: hsla(0,0%,0%,.5);
-  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
-}
-html[dir='ltr'] .verticalToolbarSeparator {
-  margin-left: 2px;
-}
-html[dir='rtl'] .verticalToolbarSeparator {
-  margin-right: 2px;
-}
-
-.horizontalToolbarSeparator {
-  display: block;
-  margin: 0 0 4px 0;
-  height: 1px;
-  width: 100%;
-  background-color: hsla(0,0%,0%,.5);
-  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
-}
-
-.toolbarField {
-  padding: 3px 6px;
-  margin: 4px 0 4px 0;
-  border: 1px solid transparent;
-  border-radius: 2px;
-  background-color: hsla(0,0%,100%,.09);
-  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
-  background-clip: padding-box;
-  border: 1px solid hsla(0,0%,0%,.35);
-  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
-  box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset,
-              0 1px 0 hsla(0,0%,100%,.05);
-  color: hsl(0,0%,95%);
-  font-size: 12px;
-  line-height: 14px;
-  outline-style: none;
-  transition-property: background-color, border-color, box-shadow;
-  transition-duration: 150ms;
-  transition-timing-function: ease;
-}
-
-.toolbarField[type=checkbox] {
-  display: inline-block;
-  margin: 8px 0px;
-}
-
-.toolbarField.pageNumber {
-  -moz-appearance: textfield; /* hides the spinner in moz */
-  min-width: 16px;
-  text-align: right;
-  width: 40px;
-}
-
-.toolbarField.pageNumber.visiblePageIsLoading {
-  background-image: url(images/loading-small.png);
-  background-repeat: no-repeat;
-  background-position: 1px;
-}
-
-.toolbarField.pageNumber::-webkit-inner-spin-button,
-.toolbarField.pageNumber::-webkit-outer-spin-button {
-    -webkit-appearance: none;
-    margin: 0;
-}
-
-.toolbarField:hover {
-  background-color: hsla(0,0%,100%,.11);
-  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.43) hsla(0,0%,0%,.45);
-}
-
-.toolbarField:focus {
-  background-color: hsla(0,0%,100%,.15);
-  border-color: hsla(204,100%,65%,.8) hsla(204,100%,65%,.85) hsla(204,100%,65%,.9);
-}
-
-.toolbarLabel {
-  min-width: 16px;
-  padding: 3px 6px 3px 2px;
-  margin: 4px 2px 4px 0;
-  border: 1px solid transparent;
-  border-radius: 2px;
-  color: hsl(0,0%,85%);
-  font-size: 12px;
-  line-height: 14px;
-  text-align: left;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  cursor: default;
-}
-
-#thumbnailView {
-  position: absolute;
-  width: 120px;
-  top: 0;
-  bottom: 0;
-  padding: 10px 40px 0;
-  overflow: auto;
-  -webkit-overflow-scrolling: touch;
-}
-
-.thumbnail {
-  float: left;
-  margin-bottom: 5px;
-}
-
-#thumbnailView > a:last-of-type > .thumbnail {
-  margin-bottom: 10px;
-}
-
-#thumbnailView > a:last-of-type > .thumbnail:not([data-loaded]) {
-  margin-bottom: 9px;
-}
-
-.thumbnail:not([data-loaded]) {
-  border: 1px dashed rgba(255, 255, 255, 0.5);
-  margin: -1px -1px 4px -1px;
-}
-
-.thumbnailImage {
-  border: 1px solid transparent;
-  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);
-  opacity: 0.8;
-  z-index: 99;
-  background-color: white;
-  background-clip: content-box;
-}
-
-.thumbnailSelectionRing {
-  border-radius: 2px;
-  padding: 7px;
-}
-
-a:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,
-.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {
-  opacity: .9;
-}
-
-a:focus > .thumbnail > .thumbnailSelectionRing,
-.thumbnail:hover > .thumbnailSelectionRing {
-  background-color: hsla(0,0%,100%,.15);
-  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
-  background-clip: padding-box;
-  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
-              0 0 1px hsla(0,0%,100%,.2) inset,
-              0 0 1px hsla(0,0%,0%,.2);
-  color: hsla(0,0%,100%,.9);
-}
-
-.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {
-  box-shadow: 0 0 0 1px hsla(0,0%,0%,.5);
-  opacity: 1;
-}
-
-.thumbnail.selected > .thumbnailSelectionRing {
-  background-color: hsla(0,0%,100%,.3);
-  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
-  background-clip: padding-box;
-  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
-              0 0 1px hsla(0,0%,100%,.1) inset,
-              0 0 1px hsla(0,0%,0%,.2);
-  color: hsla(0,0%,100%,1);
-}
-
-#outlineView,
-#attachmentsView {
-  position: absolute;
-  width: 192px;
-  top: 0;
-  bottom: 0;
-  overflow: auto;
-  -webkit-overflow-scrolling: touch;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-}
-
-#outlineView {
-  padding: 4px 4px 0;
-}
-#attachmentsView {
-  padding: 3px 4px 0;
-}
-
-html[dir='ltr'] .outlineItem > .outlineItems {
-  margin-left: 20px;
-}
-
-html[dir='rtl'] .outlineItem > .outlineItems {
-  margin-right: 20px;
-}
-
-.outlineItem > a,
-.attachmentsItem > button {
-  text-decoration: none;
-  display: inline-block;
-  min-width: 95%;
-  height: auto;
-  margin-bottom: 1px;
-  border-radius: 2px;
-  color: hsla(0,0%,100%,.8);
-  font-size: 13px;
-  line-height: 15px;
-  -moz-user-select: none;
-  white-space: normal;
-}
-
-.attachmentsItem > button {
-  border: 0 none;
-  background: none;
-  cursor: pointer;
-  width: 100%;
-}
-
-html[dir='ltr'] .outlineItem > a {
-  padding: 2px 0 5px 10px;
-}
-html[dir='ltr'] .attachmentsItem > button {
-  padding: 2px 0 3px 7px;
-  text-align: left;
-}
-
-html[dir='rtl'] .outlineItem > a {
-  padding: 2px 10px 5px 0;
-}
-html[dir='rtl'] .attachmentsItem > button {
-  padding: 2px 7px 3px 0;
-  text-align: right;
-}
-
-.outlineItem > a:hover,
-.attachmentsItem > button:hover {
-  background-color: hsla(0,0%,100%,.02);
-  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
-  background-clip: padding-box;
-  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
-              0 0 1px hsla(0,0%,100%,.2) inset,
-              0 0 1px hsla(0,0%,0%,.2);
-  color: hsla(0,0%,100%,.9);
-}
-
-.outlineItem.selected {
-  background-color: hsla(0,0%,100%,.08);
-  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
-  background-clip: padding-box;
-  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
-              0 0 1px hsla(0,0%,100%,.1) inset,
-              0 0 1px hsla(0,0%,0%,.2);
-  color: hsla(0,0%,100%,1);
-}
-
-.noResults {
-  font-size: 12px;
-  color: hsla(0,0%,100%,.8);
-  font-style: italic;
-  cursor: default;
-}
-
-/* TODO: file FF bug to support ::-moz-selection:window-inactive
-   so we can override the opaque grey background when the window is inactive;
-   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */
-::selection { background: rgba(0,0,255,0.3); }
-::-moz-selection { background: rgba(0,0,255,0.3); }
-
-#errorWrapper {
-  background: none repeat scroll 0 0 #FF5555;
-  color: white;
-  left: 0;
-  position: absolute;
-  right: 0;
-  z-index: 1000;
-  padding: 3px;
-  font-size: 0.8em;
-}
-.loadingInProgress #errorWrapper {
-  top: 37px;
-}
-
-#errorMessageLeft {
-  float: left;
-}
-
-#errorMessageRight {
-  float: right;
-}
-
-#errorMoreInfo {
-  background-color: #FFFFFF;
-  color: black;
-  padding: 3px;
-  margin: 3px;
-  width: 98%;
-}
-
-.overlayButton {
-  width: auto;
-  margin: 3px 4px 2px 4px !important;
-  padding: 2px 6px 3px 6px;
-}
-
-#overlayContainer {
-  display: table;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  background-color: hsla(0,0%,0%,.2);
-  z-index: 40000;
-}
-#overlayContainer > * {
-  overflow: auto;
-  -webkit-overflow-scrolling: touch;
-}
-
-#overlayContainer > .container {
-  display: table-cell;
-  vertical-align: middle;
-  text-align: center;
-}
-
-#overlayContainer > .container > .dialog {
-  display: inline-block;
-  padding: 15px;
-  border-spacing: 4px;
-  color: hsl(0,0%,85%);
-  font-size: 12px;
-  line-height: 14px;
-  background-color: #474747; /* fallback */
-  background-image: url(images/texture.png),
-                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));
-  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),
-              inset 0 1px 1px hsla(0,0%,0%,.15),
-              inset 0 -1px 0 hsla(0,0%,100%,.05),
-              0 1px 0 hsla(0,0%,0%,.15),
-              0 1px 1px hsla(0,0%,0%,.1);
-  border: 1px solid hsla(0,0%,0%,.5);
-  border-radius: 4px;
-  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
-}
-
-.dialog > .row {
-  display: table-row;
-}
-
-.dialog > .row > * {
-  display: table-cell;
-}
-
-.dialog .toolbarField {
-  margin: 5px 0;
-}
-
-.dialog .separator {
-  display: block;
-  margin: 4px 0 4px 0;
-  height: 1px;
-  width: 100%;
-  background-color: hsla(0,0%,0%,.5);
-  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
-}
-
-.dialog .buttonRow {
-  text-align: center;
-  vertical-align: middle;
-}
-
-#passwordOverlay > .dialog {
-  text-align: center;
-}
-#passwordOverlay .toolbarField {
-  width: 200px;
-}
-
-#documentPropertiesOverlay > .dialog {
-  text-align: left;
-}
-#documentPropertiesOverlay .row > * {
-  min-width: 100px;
-}
-html[dir='ltr'] #documentPropertiesOverlay .row > * {
-  text-align: left;
-}
-html[dir='rtl'] #documentPropertiesOverlay .row > * {
-  text-align: right;
-}
-#documentPropertiesOverlay .row > span {
-  width: 125px;
-  word-wrap: break-word;
-}
-#documentPropertiesOverlay .row > p {
-  max-width: 225px;
-  word-wrap: break-word;
-}
-#documentPropertiesOverlay .buttonRow {
-  margin-top: 10px;
-}
-
-.clearBoth {
-  clear: both;
-}
-
-.fileInput {
-  background: white;
-  color: black;
-  margin-top: 5px;
-  visibility: hidden;
-  position: fixed;
-  right: 0;
-  top: 0;
-}
-
-#PDFBug {
-  background: none repeat scroll 0 0 white;
-  border: 1px solid #666666;
-  position: fixed;
-  top: 32px;
-  right: 0;
-  bottom: 0;
-  font-size: 10px;
-  padding: 0;
-  width: 300px;
-}
-#PDFBug .controls {
-    background:#EEEEEE;
-    border-bottom: 1px solid #666666;
-    padding: 3px;
-}
-#PDFBug .panels {
-  bottom: 0;
-  left: 0;
-  overflow: auto;
-  -webkit-overflow-scrolling: touch;
-  position: absolute;
-  right: 0;
-  top: 27px;
-}
-#PDFBug button.active {
-  font-weight: bold;
-}
-.debuggerShowText {
-  background: none repeat scroll 0 0 yellow;
-  color: blue;
-}
-.debuggerHideText:hover {
-  background: none repeat scroll 0 0 yellow;
-}
-#PDFBug .stats {
-  font-family: courier;
-  font-size: 10px;
-  white-space: pre;
-}
-#PDFBug .stats .title {
-    font-weight: bold;
-}
-#PDFBug table {
-  font-size: 10px;
-}
-
-#viewer.textLayer-visible .textLayer > div,
-#viewer.textLayer-hover .textLayer > div:hover {
-  background-color: white;
-  color: black;
-}
-
-#viewer.textLayer-shadow .textLayer > div {
-  background-color: rgba(255,255,255, .6);
-  color: black;
-}
-
-.grab-to-pan-grab {
-  cursor: url("images/grab.cur"), move !important;
-  cursor: -webkit-grab !important;
-  cursor: -moz-grab !important;
-  cursor: grab !important;
-}
-.grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link) {
-  cursor: inherit !important;
-}
-.grab-to-pan-grab:active,
-.grab-to-pan-grabbing {
-  cursor: url("images/grabbing.cur"), move !important;
-  cursor: -webkit-grabbing !important;
-  cursor: -moz-grabbing !important;
-  cursor: grabbing !important;
-
-  position: fixed;
-  background: transparent;
-  display: block;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  overflow: hidden;
-  z-index: 50000; /* should be higher than anything else in PDF.js! */
-}
-
-@page {
-  margin: 0;
-}
-
-#printContainer {
-  display: none;
-}
-
-@media screen and (min-resolution: 2dppx) {
-  /* Rules for Retina screens */
-  .toolbarButton::before {
-    -webkit-transform: scale(0.5);
-    transform: scale(0.5);
-    top: -5px;
-  }
-
-  .secondaryToolbarButton::before {
-    -webkit-transform: scale(0.5);
-    transform: scale(0.5);
-    top: -4px;
-  }
-
-  html[dir='ltr'] .toolbarButton::before,
-  html[dir='rtl'] .toolbarButton::before {
-    left: -1px;
-  }
-
-  html[dir='ltr'] .secondaryToolbarButton::before {
-    left: -2px;
-  }
-  html[dir='rtl'] .secondaryToolbarButton::before {
-    left: 186px;
-  }
-
-  .toolbarField.pageNumber.visiblePageIsLoading,
-  #findInput[data-status="pending"] {
-    background-image: url(images/loading-small@2x.png);
-    background-size: 16px 17px;
-  }
-
-  .dropdownToolbarButton {
-    background: url(images/toolbarButton-menuArrows@2x.png) no-repeat;
-    background-size: 7px 16px;
-  }
-
-  html[dir='ltr'] .toolbarButton#sidebarToggle::before {
-    content: url(images/toolbarButton-sidebarToggle@2x.png);
-  }
-  html[dir='rtl'] .toolbarButton#sidebarToggle::before {
-    content: url(images/toolbarButton-sidebarToggle-rtl@2x.png);
-  }
-
-  html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
-    content: url(images/toolbarButton-secondaryToolbarToggle@2x.png);
-  }
-  html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
-    content: url(images/toolbarButton-secondaryToolbarToggle-rtl@2x.png);
-  }
-
-  html[dir='ltr'] .toolbarButton.findPrevious::before {
-    content: url(images/findbarButton-previous@2x.png);
-  }
-  html[dir='rtl'] .toolbarButton.findPrevious::before {
-    content: url(images/findbarButton-previous-rtl@2x.png);
-  }
-
-  html[dir='ltr'] .toolbarButton.findNext::before {
-    content: url(images/findbarButton-next@2x.png);
-  }
-  html[dir='rtl'] .toolbarButton.findNext::before {
-    content: url(images/findbarButton-next-rtl@2x.png);
-  }
-
-  html[dir='ltr'] .toolbarButton.pageUp::before {
-    content: url(images/toolbarButton-pageUp@2x.png);
-  }
-  html[dir='rtl'] .toolbarButton.pageUp::before {
-    content: url(images/toolbarButton-pageUp-rtl@2x.png);
-  }
-
-  html[dir='ltr'] .toolbarButton.pageDown::before {
-    content: url(images/toolbarButton-pageDown@2x.png);
-  }
-  html[dir='rtl'] .toolbarButton.pageDown::before {
-    content: url(images/toolbarButton-pageDown-rtl@2x.png);
-  }
-
-  .toolbarButton.zoomIn::before {
-    content: url(images/toolbarButton-zoomIn@2x.png);
-  }
-
-  .toolbarButton.zoomOut::before {
-    content: url(images/toolbarButton-zoomOut@2x.png);
-  }
-
-  .toolbarButton.presentationMode::before,
-  .secondaryToolbarButton.presentationMode::before {
-    content: url(images/toolbarButton-presentationMode@2x.png);
-  }
-
-  .toolbarButton.print::before,
-  .secondaryToolbarButton.print::before {
-    content: url(images/toolbarButton-print@2x.png);
-  }
-
-  .toolbarButton.openFile::before,
-  .secondaryToolbarButton.openFile::before {
-    content: url(images/toolbarButton-openFile@2x.png);
-  }
-
-  .toolbarButton.download::before,
-  .secondaryToolbarButton.download::before {
-    content: url(images/toolbarButton-download@2x.png);
-  }
-
-  .toolbarButton.bookmark::before,
-  .secondaryToolbarButton.bookmark::before {
-    content: url(images/toolbarButton-bookmark@2x.png);
-  }
-
-  #viewThumbnail.toolbarButton::before {
-    content: url(images/toolbarButton-viewThumbnail@2x.png);
-  }
-
-  html[dir="ltr"] #viewOutline.toolbarButton::before {
-    content: url(images/toolbarButton-viewOutline@2x.png);
-  }
-  html[dir="rtl"] #viewOutline.toolbarButton::before {
-    content: url(images/toolbarButton-viewOutline-rtl@2x.png);
-  }
-
-  #viewAttachments.toolbarButton::before {
-    content: url(images/toolbarButton-viewAttachments@2x.png);
-  }
-
-  #viewFind.toolbarButton::before {
-    content: url(images/toolbarButton-search@2x.png);
-  }
-
-  .secondaryToolbarButton.firstPage::before {
-    content: url(images/secondaryToolbarButton-firstPage@2x.png);
-  }
-
-  .secondaryToolbarButton.lastPage::before {
-    content: url(images/secondaryToolbarButton-lastPage@2x.png);
-  }
-
-  .secondaryToolbarButton.rotateCcw::before {
-    content: url(images/secondaryToolbarButton-rotateCcw@2x.png);
-  }
-
-  .secondaryToolbarButton.rotateCw::before {
-    content: url(images/secondaryToolbarButton-rotateCw@2x.png);
-  }
-
-  .secondaryToolbarButton.handTool::before {
-    content: url(images/secondaryToolbarButton-handTool@2x.png);
-  }
-
-  .secondaryToolbarButton.documentProperties::before {
-    content: url(images/secondaryToolbarButton-documentProperties@2x.png);
-  }
-}
-
-@media print {
-  /* General rules for printing. */
-  body {
-    background: transparent none;
-  }
-
-  /* Rules for browsers that don't support mozPrintCallback. */
-  #sidebarContainer, #secondaryToolbar, .toolbar, #loadingBox, #errorWrapper, .textLayer {
-    display: none;
-  }
-  #viewerContainer {
-    overflow: visible;
-  }
-
-  #mainContainer, #viewerContainer, .page, .page canvas {
-    position: static;
-    padding: 0;
-    margin: 0;
-  }
-
-  .page {
-    float: left;
-    display: none;
-    border: none;
-    box-shadow: none;
-    background-clip: content-box;
-    background-color: white;
-  }
-
-  .page[data-loaded] {
-    display: block;
-  }
-
-  .fileInput {
-    display: none;
-  }
-
-  /* Rules for browsers that support mozPrintCallback */
-  body[data-mozPrintCallback] #outerContainer {
-    display: none;
-  }
-  body[data-mozPrintCallback] #printContainer {
-    display: block;
-  }
-  /* wrapper around (scaled) print canvas elements */
-  #printContainer > div {
-    position: relative;
-    top: 0;
-    left: 0;
-    overflow: hidden;
-  }
-  #printContainer canvas {
-    display: block;
-  }
-}
-
-.visibleLargeView,
-.visibleMediumView,
-.visibleSmallView {
-  display: none;
-}
-
-@media all and (max-width: 960px) {
-  html[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,
-  html[dir='ltr'] #outerContainer.sidebarOpen .outerCenter {
-    float: left;
-    left: 205px;
-  }
-  html[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,
-  html[dir='rtl'] #outerContainer.sidebarOpen .outerCenter {
-    float: right;
-    right: 205px;
-  }
-}
-
-@media all and (max-width: 900px) {
-  .sidebarOpen .hiddenLargeView {
-    display: none;
-  }
-  .sidebarOpen .visibleLargeView {
-    display: inherit;
-  }
-}
-
-@media all and (max-width: 860px) {
-  .sidebarOpen .hiddenMediumView {
-    display: none;
-  }
-  .sidebarOpen .visibleMediumView {
-    display: inherit;
-  }
-}
-
-@media all and (max-width: 770px) {
-  #sidebarContainer {
-    top: 32px;
-    z-index: 100;
-  }
-  .loadingInProgress #sidebarContainer {
-    top: 37px;
-  }
-  #sidebarContent {
-    top: 32px;
-    background-color: hsla(0,0%,0%,.7);
-  }
-
-  html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {
-    left: 0px;
-  }
-  html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {
-    right: 0px;
-  }
-
-  html[dir='ltr'] .outerCenter {
-    float: left;
-    left: 205px;
-  }
-  html[dir='rtl'] .outerCenter {
-    float: right;
-    right: 205px;
-  }
-
-  #outerContainer .hiddenLargeView,
-  #outerContainer .hiddenMediumView {
-    display: inherit;
-  }
-  #outerContainer .visibleLargeView,
-  #outerContainer .visibleMediumView {
-    display: none;
-  }
-}
-
-@media all and (max-width: 700px) {
-  #outerContainer .hiddenLargeView {
-    display: none;
-  }
-  #outerContainer .visibleLargeView {
-    display: inherit;
-  }
-}
-
-@media all and (max-width: 660px) {
-  #outerContainer .hiddenMediumView {
-    display: none;
-  }
-  #outerContainer .visibleMediumView {
-    display: inherit;
-  }
-}
-
-@media all and (max-width: 600px) {
-  .hiddenSmallView {
-    display: none;
-  }
-  .visibleSmallView {
-    display: inherit;
-  }
-  html[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,
-  html[dir='ltr'] #outerContainer.sidebarOpen .outerCenter,
-  html[dir='ltr'] .outerCenter {
-    left: 156px;
-  }
-  html[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,
-  html[dir='rtl'] #outerContainer.sidebarOpen .outerCenter,
-  html[dir='rtl'] .outerCenter {
-    right: 156px;
-  }
-  .toolbarButtonSpacer {
-    width: 0;
-  }
-}
-
-@media all and (max-width: 510px) {
-  #scaleSelectContainer, #pageNumberLabel {
-    display: none;
-  }
-}
diff --git a/public/pfd/build/generic/web/viewer.html b/public/pfd/build/generic/web/viewer.html
deleted file mode 100644
index 85f707d..0000000
--- a/public/pfd/build/generic/web/viewer.html
+++ /dev/null
@@ -1,478 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright 2012 Mozilla Foundation
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-Adobe CMap resources are covered by their own copyright and license:
-http://sourceforge.net/adobe/cmap/wiki/License/
--->
-<html dir="ltr" mozdisallowselectionprint moznomarginboxes>
-
-<head>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
-  <meta name="google" content="notranslate">
-  <title>PDF.js viewer</title>
-
-
-  <link rel="stylesheet" href="viewer.css" />
-
-  <script src="compatibility.js"></script>
-
-
-
-  <!-- This snippet is used in production (included from viewer.html) -->
-  <link rel="resource" type="application/l10n" href="locale/locale.properties" />
-  <script src="l10n.js"></script>
-  <script src="../build/pdf.js"></script>
-
-
-
-  <script src="debugger.js"></script>
-  <script src="viewer.js"></script>
-
-</head>
-
-<body tabindex="1" class="loadingInProgress">
-  <div id="outerContainer">
-
-    <div id="sidebarContainer">
-      <div id="toolbarSidebar">
-        <div class="splitToolbarButton toggled">
-          <button id="viewThumbnail" class="toolbarButton group toggled" title="Show Thumbnails" tabindex="2"
-            data-l10n-id="thumbs">
-            <span data-l10n-id="thumbs_label">Thumbnails</span>
-          </button>
-          <button id="viewOutline" class="toolbarButton group" title="Show Document Outline" tabindex="3"
-            style="display: none;" data-l10n-id="outline">
-            <span data-l10n-id="outline_label">Document Outline</span>
-          </button>
-          <button id="viewAttachments" class="toolbarButton group" title="Show Attachments" tabindex="4"
-            style="display: none;" data-l10n-id="attachments">
-            <span data-l10n-id="attachments_label">Attachments</span>
-          </button>
-        </div>
-      </div>
-      <div id="sidebarContent">
-        <div id="thumbnailView">
-        </div>
-        <div id="outlineView" class="hidden">
-        </div>
-        <div id="attachmentsView" class="hidden">
-        </div>
-      </div>
-    </div> <!-- sidebarContainer -->
-
-    <div id="mainContainer">
-      <div class="findbar hidden doorHanger hiddenSmallView" id="findbar">
-        <label for="findInput" class="toolbarLabel" data-l10n-id="find_label">Find:</label>
-        <input id="findInput" class="toolbarField" tabindex="91">
-        <div class="splitToolbarButton">
-          <button class="toolbarButton findPrevious" title="" id="findPrevious" tabindex="92"
-            data-l10n-id="find_previous">
-            <span data-l10n-id="find_previous_label">Previous</span>
-          </button>
-          <div class="splitToolbarButtonSeparator"></div>
-          <button class="toolbarButton findNext" title="" id="findNext" tabindex="93" data-l10n-id="find_next">
-            <span data-l10n-id="find_next_label">Next</span>
-          </button>
-        </div>
-        <input type="checkbox" id="findHighlightAll" class="toolbarField">
-        <label for="findHighlightAll" class="toolbarLabel" tabindex="94" data-l10n-id="find_highlight">Highlight
-          all</label>
-        <input type="checkbox" id="findMatchCase" class="toolbarField">
-        <label for="findMatchCase" class="toolbarLabel" tabindex="95" data-l10n-id="find_match_case_label">Match
-          case</label>
-        <span id="findMsg" class="toolbarLabel"></span>
-      </div> <!-- findbar -->
-
-      <div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">
-        <div id="secondaryToolbarButtonContainer">
-          <button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView"
-            title="Switch to Presentation Mode" tabindex="51" data-l10n-id="presentation_mode">
-            <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
-          </button>
-
-          <button id="secondaryOpenFile" class="secondaryToolbarButton openFile visibleLargeView" title="Open File"
-            tabindex="52" data-l10n-id="open_file">
-            <span data-l10n-id="open_file_label">Open</span>
-          </button>
-
-          <button id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="53"
-            data-l10n-id="print">
-            <span data-l10n-id="print_label">Print</span>
-          </button>
-
-          <button id="secondaryDownload" class="secondaryToolbarButton download visibleMediumView" title="Download"
-            tabindex="54" data-l10n-id="download">
-            <span data-l10n-id="download_label">Download</span>
-          </button>
-
-          <a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark visibleSmallView"
-            title="Current view (copy or open in new window)" tabindex="55" data-l10n-id="bookmark">
-            <span data-l10n-id="bookmark_label">Current View</span>
-          </a>
-
-          <div class="horizontalToolbarSeparator visibleLargeView"></div>
-
-          <button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="56"
-            data-l10n-id="first_page">
-            <span data-l10n-id="first_page_label">Go to First Page</span>
-          </button>
-          <button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="57"
-            data-l10n-id="last_page">
-            <span data-l10n-id="last_page_label">Go to Last Page</span>
-          </button>
-
-          <div class="horizontalToolbarSeparator"></div>
-
-          <button id="pageRotateCw" class="secondaryToolbarButton rotateCw" title="Rotate Clockwise" tabindex="58"
-            data-l10n-id="page_rotate_cw">
-            <span data-l10n-id="page_rotate_cw_label">Rotate Clockwise</span>
-          </button>
-          <button id="pageRotateCcw" class="secondaryToolbarButton rotateCcw" title="Rotate Counterclockwise"
-            tabindex="59" data-l10n-id="page_rotate_ccw">
-            <span data-l10n-id="page_rotate_ccw_label">Rotate Counterclockwise</span>
-          </button>
-
-          <div class="horizontalToolbarSeparator"></div>
-
-          <button id="toggleHandTool" class="secondaryToolbarButton handTool" title="Enable hand tool" tabindex="60"
-            data-l10n-id="hand_tool_enable">
-            <span data-l10n-id="hand_tool_enable_label">Enable hand tool</span>
-          </button>
-
-          <div class="horizontalToolbarSeparator"></div>
-
-          <button id="documentProperties" class="secondaryToolbarButton documentProperties" title="Document Properties…"
-            tabindex="61" data-l10n-id="document_properties">
-            <span data-l10n-id="document_properties_label">Document Properties…</span>
-          </button>
-        </div>
-      </div> <!-- secondaryToolbar -->
-
-      <div class="toolbar">
-        <div id="toolbarContainer">
-          <div id="toolbarViewer">
-            <div id="toolbarViewerLeft">
-              <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11"
-                data-l10n-id="toggle_sidebar">
-                <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span>
-              </button>
-              <div class="toolbarButtonSpacer"></div>
-              <button id="viewFind" class="toolbarButton group hiddenSmallView" title="Find in Document" tabindex="12"
-                data-l10n-id="findbar" style="display: none;">
-                <span data-l10n-id="findbar_label">Find</span>
-              </button>
-              <div class="splitToolbarButton">
-                <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="13"
-                  data-l10n-id="previous">
-                  <span data-l10n-id="previous_label">Previous</span>
-                </button>
-                <div class="splitToolbarButtonSeparator"></div>
-                <button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="14" data-l10n-id="next">
-                  <span data-l10n-id="next_label">Next</span>
-                </button>
-              </div>
-              <label id="pageNumberLabel" class="toolbarLabel" for="pageNumber" data-l10n-id="page_label">Page: </label>
-              <input type="number" id="pageNumber" class="toolbarField pageNumber" value="1" size="4" min="1"
-                tabindex="15">
-              <span id="numPages" class="toolbarLabel"></span>
-            </div>
-            <div id="toolbarViewerRight">
-              <button id="presentationMode" class="toolbarButton presentationMode hiddenLargeView"
-                title="Switch to Presentation Mode" tabindex="31" data-l10n-id="presentation_mode">
-                <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
-              </button>
-
-              <button id="openFile" class="toolbarButton openFile hiddenLargeView" title="Open File" tabindex="32"
-                data-l10n-id="open_file" style="display: none;">
-                <span data-l10n-id="open_file_label">Open</span>
-              </button>
-
-              <button id="print" class="toolbarButton print hiddenMediumView" title="Print" tabindex="33"
-                style="display: none;" data-l10n-id="print">
-                <span data-l10n-id="print_label">Print</span>
-              </button>
-
-              <button id="download" class="toolbarButton download hiddenMediumView" title="Download" tabindex="34"
-                data-l10n-id="download">
-                <span data-l10n-id="download_label">Download</span>
-              </button>
-              <a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" style="display: none;"
-                title="Current view (copy or open in new window)" tabindex="35" data-l10n-id="bookmark">
-                <span data-l10n-id="bookmark_label">Current View</span>
-              </a>
-
-              <div class="verticalToolbarSeparator hiddenSmallView"></div>
-
-              <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36"
-                data-l10n-id="tools">
-                <span data-l10n-id="tools_label">Tools</span>
-              </button>
-            </div>
-            <div class="outerCenter">
-              <div class="innerCenter" id="toolbarViewerMiddle">
-                <div class="splitToolbarButton">
-                  <button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out" tabindex="21"
-                    data-l10n-id="zoom_out">
-                    <span data-l10n-id="zoom_out_label">Zoom Out</span>
-                  </button>
-                  <div class="splitToolbarButtonSeparator"></div>
-                  <button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In" tabindex="22" data-l10n-id="zoom_in">
-                    <span data-l10n-id="zoom_in_label">Zoom In</span>
-                  </button>
-                </div>
-                <span id="scaleSelectContainer" class="dropdownToolbarButton">
-                  <select id="scaleSelect" title="Zoom" tabindex="23" data-l10n-id="zoom">
-                    <option id="pageAutoOption" title="" value="auto" selected="selected"
-                      data-l10n-id="page_scale_auto">Automatic Zoom</option>
-                    <option id="pageActualOption" title="" value="page-actual" data-l10n-id="page_scale_actual">Actual
-                      Size</option>
-                    <option id="pageFitOption" title="" value="page-fit" data-l10n-id="page_scale_fit">Fit Page</option>
-                    <option id="pageWidthOption" title="" value="page-width" data-l10n-id="page_scale_width">Full Width
-                    </option>
-                    <option id="customScaleOption" title="" value="custom"></option>
-                    <option title="" value="0.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 50 }'>50%
-                    </option>
-                    <option title="" value="0.75" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 75 }'>75%
-                    </option>
-                    <option title="" value="1" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 100 }'>100%
-                    </option>
-                    <option title="" value="1.25" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 125 }'>
-                      125%</option>
-                    <option title="" value="1.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 150 }'>
-                      150%</option>
-                    <option title="" value="2" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 200 }'>200%
-                    </option>
-                    <option title="" value="3" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 300 }'>300%
-                    </option>
-                    <option title="" value="4" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 400 }'>400%
-                    </option>
-                  </select>
-                </span>
-              </div>
-            </div>
-          </div>
-          <div id="loadingBar">
-            <div class="progress">
-              <div class="glimmer">
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <menu type="context" id="viewerContextMenu">
-        <menuitem id="contextFirstPage" label="First Page" data-l10n-id="first_page">
-        </menuitem>
-        <menuitem id="contextLastPage" label="Last Page" data-l10n-id="last_page">
-        </menuitem>
-        <menuitem id="contextPageRotateCw" label="Rotate Clockwise" data-l10n-id="page_rotate_cw">
-        </menuitem>
-        <menuitem id="contextPageRotateCcw" label="Rotate Counter-Clockwise" data-l10n-id="page_rotate_ccw">
-        </menuitem>
-      </menu>
-
-      <div id="viewerContainer" tabindex="0">
-        <div id="viewer" class="pdfViewer"></div>
-      </div>
-
-      <div id="errorWrapper" hidden='true'>
-        <div id="errorMessageLeft">
-          <span id="errorMessage"></span>
-          <button id="errorShowMore" data-l10n-id="error_more_info">
-            More Information
-          </button>
-          <button id="errorShowLess" data-l10n-id="error_less_info" hidden='true'>
-            Less Information
-          </button>
-        </div>
-        <div id="errorMessageRight">
-          <button id="errorClose" data-l10n-id="error_close">
-            Close
-          </button>
-        </div>
-        <div class="clearBoth"></div>
-        <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea>
-      </div>
-    </div> <!-- mainContainer -->
-
-    <div id="overlayContainer" class="hidden">
-      <div id="passwordOverlay" class="container hidden">
-        <div class="dialog">
-          <div class="row">
-            <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>
-          </div>
-          <div class="row">
-            <input type="password" id="password" class="toolbarField" />
-          </div>
-          <div class="buttonRow">
-            <button id="passwordCancel" class="overlayButton"><span
-                data-l10n-id="password_cancel">Cancel</span></button>
-            <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button>
-          </div>
-        </div>
-      </div>
-      <div id="documentPropertiesOverlay" class="container hidden">
-        <div class="dialog">
-          <div class="row">
-            <span data-l10n-id="document_properties_file_name">File name:</span>
-            <p id="fileNameField">-</p>
-          </div>
-          <div class="row">
-            <span data-l10n-id="document_properties_file_size">File size:</span>
-            <p id="fileSizeField">-</p>
-          </div>
-          <div class="separator"></div>
-          <div class="row">
-            <span data-l10n-id="document_properties_title">Title:</span>
-            <p id="titleField">-</p>
-          </div>
-          <div class="row">
-            <span data-l10n-id="document_properties_author">Author:</span>
-            <p id="authorField">-</p>
-          </div>
-          <div class="row">
-            <span data-l10n-id="document_properties_subject">Subject:</span>
-            <p id="subjectField">-</p>
-          </div>
-          <div class="row">
-            <span data-l10n-id="document_properties_keywords">Keywords:</span>
-            <p id="keywordsField">-</p>
-          </div>
-          <div class="row">
-            <span data-l10n-id="document_properties_creation_date">Creation Date:</span>
-            <p id="creationDateField">-</p>
-          </div>
-          <div class="row">
-            <span data-l10n-id="document_properties_modification_date">Modification Date:</span>
-            <p id="modificationDateField">-</p>
-          </div>
-          <div class="row">
-            <span data-l10n-id="document_properties_creator">Creator:</span>
-            <p id="creatorField">-</p>
-          </div>
-          <div class="separator"></div>
-          <div class="row">
-            <span data-l10n-id="document_properties_producer">PDF Producer:</span>
-            <p id="producerField">-</p>
-          </div>
-          <div class="row">
-            <span data-l10n-id="document_properties_version">PDF Version:</span>
-            <p id="versionField">-</p>
-          </div>
-          <div class="row">
-            <span data-l10n-id="document_properties_page_count">Page Count:</span>
-            <p id="pageCountField">-</p>
-          </div>
-          <div class="buttonRow">
-            <button id="documentPropertiesClose" class="overlayButton"><span
-                data-l10n-id="document_properties_close">Close</span></button>
-          </div>
-        </div>
-      </div>
-    </div> <!-- overlayContainer -->
-
-  </div> <!-- outerContainer -->
-  <div id="printContainer"></div>
-  <div id="mozPrintCallback-shim" hidden>
-    <style>
-      @media print {
-        #printContainer div {
-          page-break-after: always;
-          page-break-inside: avoid;
-        }
-      }
-    </style>
-    <style scoped>
-      #mozPrintCallback-shim {
-        position: fixed;
-        top: 0;
-        left: 0;
-        height: 100%;
-        width: 100%;
-        z-index: 9999999;
-
-        display: block;
-        text-align: center;
-        background-color: rgba(0, 0, 0, 0.5);
-      }
-
-      #mozPrintCallback-shim[hidden] {
-        display: none;
-      }
-
-      @media print {
-        #mozPrintCallback-shim {
-          display: none;
-        }
-      }
-
-      #mozPrintCallback-shim .mozPrintCallback-dialog-box {
-        display: inline-block;
-        margin: -50px auto 0;
-        position: relative;
-        top: 45%;
-        left: 0;
-        min-width: 220px;
-        max-width: 400px;
-
-        padding: 9px;
-
-        border: 1px solid hsla(0, 0%, 0%, .5);
-        border-radius: 2px;
-        box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
-
-        background-color: #474747;
-
-        color: hsl(0, 0%, 85%);
-        font-size: 16px;
-        line-height: 20px;
-      }
-
-      #mozPrintCallback-shim .progress-row {
-        clear: both;
-        padding: 1em 0;
-      }
-
-      #mozPrintCallback-shim progress {
-        width: 100%;
-      }
-
-      #mozPrintCallback-shim .relative-progress {
-        clear: both;
-        float: right;
-      }
-
-      #mozPrintCallback-shim .progress-actions {
-        clear: both;
-      }
-    </style>
-    <div class="mozPrintCallback-dialog-box">
-      <!-- TODO: Localise the following strings -->
-      Preparing document for printing...
-      <div class="progress-row">
-        <progress value="0" max="100"></progress>
-        <span class="relative-progress">0%</span>
-      </div>
-      <div class="progress-actions">
-        <input type="button" value="Cancel" class="mozPrintCallback-cancel">
-      </div>
-    </div>
-  </div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/public/pfd/build/generic/web/viewer.js b/public/pfd/build/generic/web/viewer.js
deleted file mode 100644
index 093ab3c..0000000
--- a/public/pfd/build/generic/web/viewer.js
+++ /dev/null
@@ -1,7640 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, ProgressBar,
-           DownloadManager, getFileName, getPDFFileNameFromURL,
-           PDFHistory, Preferences, SidebarView, ViewHistory, Stats,
-           PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar,
-           PasswordPrompt, PDFPresentationMode, HandTool, Promise,
-           PDFDocumentProperties, PDFOutlineView, PDFAttachmentView,
-           OverlayManager, PDFFindController, PDFFindBar, getVisibleElements,
-           watchScroll, PDFViewer, PDFRenderingQueue, PresentationModeState,
-           RenderingStates, DEFAULT_SCALE, UNKNOWN_SCALE,
-           IGNORE_CURRENT_POSITION_ON_ZOOM: true */
-
-'use strict';
-
-var DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf';
-var DEFAULT_SCALE_DELTA = 1.1;
-var MIN_SCALE = 0.25;
-var MAX_SCALE = 10.0;
-var VIEW_HISTORY_MEMORY = 20;
-var SCALE_SELECT_CONTAINER_PADDING = 8;
-var SCALE_SELECT_PADDING = 22;
-var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';
-var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;
-
-PDFJS.imageResourcesPath = './images/';
-PDFJS.workerSrc = '../build/pdf.worker.js';
-PDFJS.cMapUrl = '../web/cmaps/';
-PDFJS.cMapPacked = true;
-
-var mozL10n = document.mozL10n || document.webL10n;
-
-
-var CSS_UNITS = 96.0 / 72.0;
-var DEFAULT_SCALE = 'auto';
-var UNKNOWN_SCALE = 0;
-var MAX_AUTO_SCALE = 1.25;
-var SCROLLBAR_PADDING = 40;
-var VERTICAL_PADDING = 5;
-
-// optimised CSS custom property getter/setter
-var CustomStyle = (function CustomStyleClosure() {
-
-  // As noted on: http://www.zachstronaut.com/posts/2009/02/17/
-  //              animate-css-transforms-firefox-webkit.html
-  // in some versions of IE9 it is critical that ms appear in this list
-  // before Moz
-  var prefixes = ['ms', 'Moz', 'Webkit', 'O'];
-  var _cache = {};
-
-  function CustomStyle() { }
-
-  CustomStyle.getProp = function get(propName, element) {
-    // check cache only when no element is given
-    if (arguments.length === 1 && typeof _cache[propName] === 'string') {
-      return _cache[propName];
-    }
-
-    element = element || document.documentElement;
-    var style = element.style, prefixed, uPropName;
-
-    // test standard property first
-    if (typeof style[propName] === 'string') {
-      return (_cache[propName] = propName);
-    }
-
-    // capitalize
-    uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);
-
-    // test vendor specific properties
-    for (var i = 0, l = prefixes.length; i < l; i++) {
-      prefixed = prefixes[i] + uPropName;
-      if (typeof style[prefixed] === 'string') {
-        return (_cache[propName] = prefixed);
-      }
-    }
-
-    //if all fails then set to undefined
-    return (_cache[propName] = 'undefined');
-  };
-
-  CustomStyle.setProp = function set(propName, element, str) {
-    var prop = this.getProp(propName);
-    if (prop !== 'undefined') {
-      element.style[prop] = str;
-    }
-  };
-
-  return CustomStyle;
-})();
-
-function getFileName(url) {
-  var anchor = url.indexOf('#');
-  var query = url.indexOf('?');
-  var end = Math.min(
-    anchor > 0 ? anchor : url.length,
-    query > 0 ? query : url.length);
-  return url.substring(url.lastIndexOf('/', end) + 1, end);
-}
-
-/**
- * Returns scale factor for the canvas. It makes sense for the HiDPI displays.
- * @return {Object} The object with horizontal (sx) and vertical (sy)
-                    scales. The scaled property is set to false if scaling is
-                    not required, true otherwise.
- */
-function getOutputScale(ctx) {
-  var devicePixelRatio = window.devicePixelRatio || 1;
-  var backingStoreRatio = ctx.webkitBackingStorePixelRatio ||
-    ctx.mozBackingStorePixelRatio ||
-    ctx.msBackingStorePixelRatio ||
-    ctx.oBackingStorePixelRatio ||
-    ctx.backingStorePixelRatio || 1;
-  var pixelRatio = devicePixelRatio / backingStoreRatio;
-  return {
-    sx: pixelRatio,
-    sy: pixelRatio,
-    scaled: pixelRatio !== 1
-  };
-}
-
-/**
- * Scrolls specified element into view of its parent.
- * element {Object} The element to be visible.
- * spot {Object} An object with optional top and left properties,
- *               specifying the offset from the top left edge.
- */
-function scrollIntoView(element, spot) {
-  // Assuming offsetParent is available (it's not available when viewer is in
-  // hidden iframe or object). We have to scroll: if the offsetParent is not set
-  // producing the error. See also animationStartedClosure.
-  var parent = element.offsetParent;
-  var offsetY = element.offsetTop + element.clientTop;
-  var offsetX = element.offsetLeft + element.clientLeft;
-  if (!parent) {
-    console.error('offsetParent is not set -- cannot scroll');
-    return;
-  }
-  while (parent.clientHeight === parent.scrollHeight) {
-    if (parent.dataset._scaleY) {
-      offsetY /= parent.dataset._scaleY;
-      offsetX /= parent.dataset._scaleX;
-    }
-    offsetY += parent.offsetTop;
-    offsetX += parent.offsetLeft;
-    parent = parent.offsetParent;
-    if (!parent) {
-      return; // no need to scroll
-    }
-  }
-  if (spot) {
-    if (spot.top !== undefined) {
-      offsetY += spot.top;
-    }
-    if (spot.left !== undefined) {
-      offsetX += spot.left;
-      parent.scrollLeft = offsetX;
-    }
-  }
-  parent.scrollTop = offsetY;
-}
-
-/**
- * Helper function to start monitoring the scroll event and converting them into
- * PDF.js friendly one: with scroll debounce and scroll direction.
- */
-function watchScroll(viewAreaElement, callback) {
-  var debounceScroll = function debounceScroll(evt) {
-    if (rAF) {
-      return;
-    }
-    // schedule an invocation of scroll for next animation frame.
-    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {
-      rAF = null;
-
-      var currentY = viewAreaElement.scrollTop;
-      var lastY = state.lastY;
-      if (currentY !== lastY) {
-        state.down = currentY > lastY;
-      }
-      state.lastY = currentY;
-      callback(state);
-    });
-  };
-
-  var state = {
-    down: true,
-    lastY: viewAreaElement.scrollTop,
-    _eventHandler: debounceScroll
-  };
-
-  var rAF = null;
-  viewAreaElement.addEventListener('scroll', debounceScroll, true);
-  return state;
-}
-
-/**
- * Use binary search to find the index of the first item in a given array which
- * passes a given condition. The items are expected to be sorted in the sense
- * that if the condition is true for one item in the array, then it is also true
- * for all following items.
- *
- * @returns {Number} Index of the first array element to pass the test,
- *                   or |items.length| if no such element exists.
- */
-function binarySearchFirstItem(items, condition) {
-  var minIndex = 0;
-  var maxIndex = items.length - 1;
-
-  if (items.length === 0 || !condition(items[maxIndex])) {
-    return items.length;
-  }
-  if (condition(items[minIndex])) {
-    return minIndex;
-  }
-
-  while (minIndex < maxIndex) {
-    var currentIndex = (minIndex + maxIndex) >> 1;
-    var currentItem = items[currentIndex];
-    if (condition(currentItem)) {
-      maxIndex = currentIndex;
-    } else {
-      minIndex = currentIndex + 1;
-    }
-  }
-  return minIndex; /* === maxIndex */
-}
-
-/**
- * Generic helper to find out what elements are visible within a scroll pane.
- */
-function getVisibleElements(scrollEl, views, sortByVisibility) {
-  var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight;
-  var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth;
-
-  function isElementBottomBelowViewTop(view) {
-    var element = view.div;
-    var elementBottom =
-      element.offsetTop + element.clientTop + element.clientHeight;
-    return elementBottom > top;
-  }
-
-  var visible = [], view, element;
-  var currentHeight, viewHeight, hiddenHeight, percentHeight;
-  var currentWidth, viewWidth;
-  var firstVisibleElementInd = (views.length === 0) ? 0 :
-    binarySearchFirstItem(views, isElementBottomBelowViewTop);
-
-  for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) {
-    view = views[i];
-    element = view.div;
-    currentHeight = element.offsetTop + element.clientTop;
-    viewHeight = element.clientHeight;
-
-    if (currentHeight > bottom) {
-      break;
-    }
-
-    currentWidth = element.offsetLeft + element.clientLeft;
-    viewWidth = element.clientWidth;
-    if (currentWidth + viewWidth < left || currentWidth > right) {
-      continue;
-    }
-    hiddenHeight = Math.max(0, top - currentHeight) +
-      Math.max(0, currentHeight + viewHeight - bottom);
-    percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0;
-
-    visible.push({
-      id: view.id,
-      x: currentWidth,
-      y: currentHeight,
-      view: view,
-      percent: percentHeight
-    });
-  }
-
-  var first = visible[0];
-  var last = visible[visible.length - 1];
-
-  if (sortByVisibility) {
-    visible.sort(function (a, b) {
-      var pc = a.percent - b.percent;
-      if (Math.abs(pc) > 0.001) {
-        return -pc;
-      }
-      return a.id - b.id; // ensure stability
-    });
-  }
-  return { first: first, last: last, views: visible };
-}
-
-/**
- * Event handler to suppress context menu.
- */
-function noContextMenuHandler(e) {
-  e.preventDefault();
-}
-
-/**
- * Returns the filename or guessed filename from the url (see issue 3455).
- * url {String} The original PDF location.
- * @return {String} Guessed PDF file name.
- */
-function getPDFFileNameFromURL(url) {
-  var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/;
-  //            SCHEME      HOST         1.PATH  2.QUERY   3.REF
-  // Pattern to get last matching NAME.pdf
-  var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i;
-  var splitURI = reURI.exec(url);
-  var suggestedFilename = reFilename.exec(splitURI[1]) ||
-    reFilename.exec(splitURI[2]) ||
-    reFilename.exec(splitURI[3]);
-  if (suggestedFilename) {
-    suggestedFilename = suggestedFilename[0];
-    if (suggestedFilename.indexOf('%') !== -1) {
-      // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf
-      try {
-        suggestedFilename =
-          reFilename.exec(decodeURIComponent(suggestedFilename))[0];
-      } catch (e) { // Possible (extremely rare) errors:
-        // URIError "Malformed URI", e.g. for "%AA.pdf"
-        // TypeError "null has no properties", e.g. for "%2F.pdf"
-      }
-    }
-  }
-  return suggestedFilename || 'document.pdf';
-}
-
-var ProgressBar = (function ProgressBarClosure() {
-
-  function clamp(v, min, max) {
-    return Math.min(Math.max(v, min), max);
-  }
-
-  function ProgressBar(id, opts) {
-    this.visible = true;
-
-    // Fetch the sub-elements for later.
-    this.div = document.querySelector(id + ' .progress');
-
-    // Get the loading bar element, so it can be resized to fit the viewer.
-    this.bar = this.div.parentNode;
-
-    // Get options, with sensible defaults.
-    this.height = opts.height || 100;
-    this.width = opts.width || 100;
-    this.units = opts.units || '%';
-
-    // Initialize heights.
-    this.div.style.height = this.height + this.units;
-    this.percent = 0;
-  }
-
-  ProgressBar.prototype = {
-
-    updateBar: function ProgressBar_updateBar() {
-      if (this._indeterminate) {
-        this.div.classList.add('indeterminate');
-        this.div.style.width = this.width + this.units;
-        return;
-      }
-
-      this.div.classList.remove('indeterminate');
-      var progressSize = this.width * this._percent / 100;
-      this.div.style.width = progressSize + this.units;
-    },
-
-    get percent() {
-      return this._percent;
-    },
-
-    set percent(val) {
-      this._indeterminate = isNaN(val);
-      this._percent = clamp(val, 0, 100);
-      this.updateBar();
-    },
-
-    setWidth: function ProgressBar_setWidth(viewer) {
-      if (viewer) {
-        var container = viewer.parentNode;
-        var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;
-        if (scrollbarWidth > 0) {
-          this.bar.setAttribute('style', 'width: calc(100% - ' +
-            scrollbarWidth + 'px);');
-        }
-      }
-    },
-
-    hide: function ProgressBar_hide() {
-      if (!this.visible) {
-        return;
-      }
-      this.visible = false;
-      this.bar.classList.add('hidden');
-      document.body.classList.remove('loadingInProgress');
-    },
-
-    show: function ProgressBar_show() {
-      if (this.visible) {
-        return;
-      }
-      this.visible = true;
-      document.body.classList.add('loadingInProgress');
-      this.bar.classList.remove('hidden');
-    }
-  };
-
-  return ProgressBar;
-})();
-
-
-
-var DEFAULT_PREFERENCES = {
-  showPreviousViewOnLoad: true,
-  defaultZoomValue: '',
-  sidebarViewOnLoad: 0,
-  enableHandToolOnLoad: false,
-  enableWebGL: false,
-  pdfBugEnabled: false,
-  disableRange: false,
-  disableStream: false,
-  disableAutoFetch: false,
-  disableFontFace: false,
-  disableTextLayer: false,
-  useOnlyCssZoom: false
-};
-
-
-var SidebarView = {
-  NONE: 0,
-  THUMBS: 1,
-  OUTLINE: 2,
-  ATTACHMENTS: 3
-};
-
-/**
- * Preferences - Utility for storing persistent settings.
- *   Used for settings that should be applied to all opened documents,
- *   or every time the viewer is loaded.
- */
-var Preferences = {
-  prefs: Object.create(DEFAULT_PREFERENCES),
-  isInitializedPromiseResolved: false,
-  initializedPromise: null,
-
-  /**
-   * Initialize and fetch the current preference values from storage.
-   * @return {Promise} A promise that is resolved when the preferences
-   *                   have been initialized.
-   */
-  initialize: function preferencesInitialize() {
-    return this.initializedPromise =
-      this._readFromStorage(DEFAULT_PREFERENCES).then(function (prefObj) {
-        this.isInitializedPromiseResolved = true;
-        if (prefObj) {
-          this.prefs = prefObj;
-        }
-      }.bind(this));
-  },
-
-  /**
-   * Stub function for writing preferences to storage.
-   * NOTE: This should be overridden by a build-specific function defined below.
-   * @param {Object} prefObj The preferences that should be written to storage.
-   * @return {Promise} A promise that is resolved when the preference values
-   *                   have been written.
-   */
-  _writeToStorage: function preferences_writeToStorage(prefObj) {
-    return Promise.resolve();
-  },
-
-  /**
-   * Stub function for reading preferences from storage.
-   * NOTE: This should be overridden by a build-specific function defined below.
-   * @param {Object} prefObj The preferences that should be read from storage.
-   * @return {Promise} A promise that is resolved with an {Object} containing
-   *                   the preferences that have been read.
-   */
-  _readFromStorage: function preferences_readFromStorage(prefObj) {
-    return Promise.resolve();
-  },
-
-  /**
-   * Reset the preferences to their default values and update storage.
-   * @return {Promise} A promise that is resolved when the preference values
-   *                   have been reset.
-   */
-  reset: function preferencesReset() {
-    return this.initializedPromise.then(function () {
-      this.prefs = Object.create(DEFAULT_PREFERENCES);
-      return this._writeToStorage(DEFAULT_PREFERENCES);
-    }.bind(this));
-  },
-
-  /**
-   * Replace the current preference values with the ones from storage.
-   * @return {Promise} A promise that is resolved when the preference values
-   *                   have been updated.
-   */
-  reload: function preferencesReload() {
-    return this.initializedPromise.then(function () {
-      this._readFromStorage(DEFAULT_PREFERENCES).then(function (prefObj) {
-        if (prefObj) {
-          this.prefs = prefObj;
-        }
-      }.bind(this));
-    }.bind(this));
-  },
-
-  /**
-   * Set the value of a preference.
-   * @param {string} name The name of the preference that should be changed.
-   * @param {boolean|number|string} value The new value of the preference.
-   * @return {Promise} A promise that is resolved when the value has been set,
-   *                   provided that the preference exists and the types match.
-   */
-  set: function preferencesSet(name, value) {
-    return this.initializedPromise.then(function () {
-      if (DEFAULT_PREFERENCES[name] === undefined) {
-        throw new Error('preferencesSet: \'' + name + '\' is undefined.');
-      } else if (value === undefined) {
-        throw new Error('preferencesSet: no value is specified.');
-      }
-      var valueType = typeof value;
-      var defaultType = typeof DEFAULT_PREFERENCES[name];
-
-      if (valueType !== defaultType) {
-        if (valueType === 'number' && defaultType === 'string') {
-          value = value.toString();
-        } else {
-          throw new Error('Preferences_set: \'' + value + '\' is a \"' +
-            valueType + '\", expected \"' + defaultType + '\".');
-        }
-      } else {
-        if (valueType === 'number' && (value | 0) !== value) {
-          throw new Error('Preferences_set: \'' + value +
-            '\' must be an \"integer\".');
-        }
-      }
-      this.prefs[name] = value;
-      return this._writeToStorage(this.prefs);
-    }.bind(this));
-  },
-
-  /**
-   * Get the value of a preference.
-   * @param {string} name The name of the preference whose value is requested.
-   * @return {Promise} A promise that is resolved with a {boolean|number|string}
-   *                   containing the value of the preference.
-   */
-  get: function preferencesGet(name) {
-    return this.initializedPromise.then(function () {
-      var defaultValue = DEFAULT_PREFERENCES[name];
-
-      if (defaultValue === undefined) {
-        throw new Error('preferencesGet: \'' + name + '\' is undefined.');
-      } else {
-        var prefValue = this.prefs[name];
-
-        if (prefValue !== undefined) {
-          return prefValue;
-        }
-      }
-      return defaultValue;
-    }.bind(this));
-  }
-};
-
-
-
-Preferences._writeToStorage = function (prefObj) {
-  return new Promise(function (resolve) {
-    localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
-    resolve();
-  });
-};
-
-Preferences._readFromStorage = function (prefObj) {
-  return new Promise(function (resolve) {
-    var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));
-    resolve(readPrefs);
-  });
-};
-
-
-(function mozPrintCallbackPolyfillClosure() {
-  if ('mozPrintCallback' in document.createElement('canvas')) {
-    return;
-  }
-  // Cause positive result on feature-detection:
-  HTMLCanvasElement.prototype.mozPrintCallback = undefined;
-
-  var canvases;   // During print task: non-live NodeList of <canvas> elements
-  var index;      // Index of <canvas> element that is being processed
-
-  var print = window.print;
-  window.print = function print() {
-    if (canvases) {
-      console.warn('Ignored window.print() because of a pending print job.');
-      return;
-    }
-    try {
-      dispatchEvent('beforeprint');
-    } finally {
-      canvases = document.querySelectorAll('canvas');
-      index = -1;
-      next();
-    }
-  };
-
-  function dispatchEvent(eventType) {
-    var event = document.createEvent('CustomEvent');
-    event.initCustomEvent(eventType, false, false, 'custom');
-    window.dispatchEvent(event);
-  }
-
-  function next() {
-    if (!canvases) {
-      return; // Print task cancelled by user (state reset in abort())
-    }
-
-    renderProgress();
-    if (++index < canvases.length) {
-      var canvas = canvases[index];
-      if (typeof canvas.mozPrintCallback === 'function') {
-        canvas.mozPrintCallback({
-          context: canvas.getContext('2d'),
-          abort: abort,
-          done: next
-        });
-      } else {
-        next();
-      }
-    } else {
-      renderProgress();
-      print.call(window);
-      setTimeout(abort, 20); // Tidy-up
-    }
-  }
-
-  function abort() {
-    if (canvases) {
-      canvases = null;
-      renderProgress();
-      dispatchEvent('afterprint');
-    }
-  }
-
-  function renderProgress() {
-    var progressContainer = document.getElementById('mozPrintCallback-shim');
-    if (canvases) {
-      var progress = Math.round(100 * index / canvases.length);
-      var progressBar = progressContainer.querySelector('progress');
-      var progressPerc = progressContainer.querySelector('.relative-progress');
-      progressBar.value = progress;
-      progressPerc.textContent = progress + '%';
-      progressContainer.removeAttribute('hidden');
-      progressContainer.onclick = abort;
-    } else {
-      progressContainer.setAttribute('hidden', '');
-    }
-  }
-
-  var hasAttachEvent = !!document.attachEvent;
-
-  window.addEventListener('keydown', function (event) {
-    // Intercept Cmd/Ctrl + P in all browsers.
-    // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera
-    if (event.keyCode === 80/*P*/ && (event.ctrlKey || event.metaKey) &&
-      !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {
-      window.print();
-      if (hasAttachEvent) {
-        // Only attachEvent can cancel Ctrl + P dialog in IE <=10
-        // attachEvent is gone in IE11, so the dialog will re-appear in IE11.
-        return;
-      }
-      event.preventDefault();
-      if (event.stopImmediatePropagation) {
-        event.stopImmediatePropagation();
-      } else {
-        event.stopPropagation();
-      }
-      return;
-    }
-    if (event.keyCode === 27 && canvases) { // Esc
-      abort();
-    }
-  }, true);
-  if (hasAttachEvent) {
-    document.attachEvent('onkeydown', function (event) {
-      event = event || window.event;
-      if (event.keyCode === 80/*P*/ && event.ctrlKey) {
-        event.keyCode = 0;
-        return false;
-      }
-    });
-  }
-
-  if ('onbeforeprint' in window) {
-    // Do not propagate before/afterprint events when they are not triggered
-    // from within this polyfill. (FF/IE).
-    var stopPropagationIfNeeded = function (event) {
-      if (event.detail !== 'custom' && event.stopImmediatePropagation) {
-        event.stopImmediatePropagation();
-      }
-    };
-    window.addEventListener('beforeprint', stopPropagationIfNeeded, false);
-    window.addEventListener('afterprint', stopPropagationIfNeeded, false);
-  }
-})();
-
-
-
-var DownloadManager = (function DownloadManagerClosure() {
-
-  function download(blobUrl, filename) {
-    var a = document.createElement('a');
-    if (a.click) {
-      // Use a.click() if available. Otherwise, Chrome might show
-      // "Unsafe JavaScript attempt to initiate a navigation change
-      //  for frame with URL" and not open the PDF at all.
-      // Supported by (not mentioned = untested):
-      // - Firefox 6 - 19 (4- does not support a.click, 5 ignores a.click)
-      // - Chrome 19 - 26 (18- does not support a.click)
-      // - Opera 9 - 12.15
-      // - Internet Explorer 6 - 10
-      // - Safari 6 (5.1- does not support a.click)
-      a.href = blobUrl;
-      a.target = '_parent';
-      // Use a.download if available. This increases the likelihood that
-      // the file is downloaded instead of opened by another PDF plugin.
-      if ('download' in a) {
-        a.download = filename;
-      }
-      // <a> must be in the document for IE and recent Firefox versions.
-      // (otherwise .click() is ignored)
-      (document.body || document.documentElement).appendChild(a);
-      a.click();
-      a.parentNode.removeChild(a);
-    } else {
-      if (window.top === window &&
-        blobUrl.split('#')[0] === window.location.href.split('#')[0]) {
-        // If _parent == self, then opening an identical URL with different
-        // location hash will only cause a navigation, not a download.
-        var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&';
-        blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&');
-      }
-      window.open(blobUrl, '_parent');
-    }
-  }
-
-  function DownloadManager() { }
-
-  DownloadManager.prototype = {
-    downloadUrl: function DownloadManager_downloadUrl(url, filename) {
-      if (!PDFJS.isValidUrl(url, true)) {
-        return; // restricted/invalid URL
-      }
-
-      download(url + '#pdfjs.action=download', filename);
-    },
-
-    downloadData: function DownloadManager_downloadData(data, filename,
-      contentType) {
-      if (navigator.msSaveBlob) { // IE10 and above
-        return navigator.msSaveBlob(new Blob([data], { type: contentType }),
-          filename);
-      }
-
-      var blobUrl = PDFJS.createObjectURL(data, contentType);
-      download(blobUrl, filename);
-    },
-
-    download: function DownloadManager_download(blob, url, filename) {
-      if (!URL) {
-        // URL.createObjectURL is not supported
-        this.downloadUrl(url, filename);
-        return;
-      }
-
-      if (navigator.msSaveBlob) {
-        // IE10 / IE11
-        if (!navigator.msSaveBlob(blob, filename)) {
-          this.downloadUrl(url, filename);
-        }
-        return;
-      }
-
-      var blobUrl = URL.createObjectURL(blob);
-      download(blobUrl, filename);
-    }
-  };
-
-  return DownloadManager;
-})();
-
-
-
-
-
-/**
- * View History - This is a utility for saving various view parameters for
- *                recently opened files.
- *
- * The way that the view parameters are stored depends on how PDF.js is built,
- * for 'node make <flag>' the following cases exist:
- *  - FIREFOX or MOZCENTRAL - uses sessionStorage.
- *  - B2G                   - uses asyncStorage.
- *  - GENERIC or CHROME     - uses localStorage, if it is available.
- */
-var ViewHistory = (function ViewHistoryClosure() {
-  function ViewHistory(fingerprint) {
-    this.fingerprint = fingerprint;
-    this.isInitializedPromiseResolved = false;
-    this.initializedPromise =
-      this._readFromStorage().then(function (databaseStr) {
-        this.isInitializedPromiseResolved = true;
-
-        var database = JSON.parse(databaseStr || '{}');
-        if (!('files' in database)) {
-          database.files = [];
-        }
-        if (database.files.length >= VIEW_HISTORY_MEMORY) {
-          database.files.shift();
-        }
-        var index;
-        for (var i = 0, length = database.files.length; i < length; i++) {
-          var branch = database.files[i];
-          if (branch.fingerprint === this.fingerprint) {
-            index = i;
-            break;
-          }
-        }
-        if (typeof index !== 'number') {
-          index = database.files.push({ fingerprint: this.fingerprint }) - 1;
-        }
-        this.file = database.files[index];
-        this.database = database;
-      }.bind(this));
-  }
-
-  ViewHistory.prototype = {
-    _writeToStorage: function ViewHistory_writeToStorage() {
-      return new Promise(function (resolve) {
-        var databaseStr = JSON.stringify(this.database);
-
-
-
-        localStorage.setItem('database', databaseStr);
-        resolve();
-      }.bind(this));
-    },
-
-    _readFromStorage: function ViewHistory_readFromStorage() {
-      return new Promise(function (resolve) {
-
-
-        resolve(localStorage.getItem('database'));
-      });
-    },
-
-    set: function ViewHistory_set(name, val) {
-      if (!this.isInitializedPromiseResolved) {
-        return;
-      }
-      this.file[name] = val;
-      return this._writeToStorage();
-    },
-
-    setMultiple: function ViewHistory_setMultiple(properties) {
-      if (!this.isInitializedPromiseResolved) {
-        return;
-      }
-      for (var name in properties) {
-        this.file[name] = properties[name];
-      }
-      return this._writeToStorage();
-    },
-
-    get: function ViewHistory_get(name, defaultValue) {
-      if (!this.isInitializedPromiseResolved) {
-        return defaultValue;
-      }
-      return this.file[name] || defaultValue;
-    }
-  };
-
-  return ViewHistory;
-})();
-
-
-/**
- * Creates a "search bar" given a set of DOM elements that act as controls
- * for searching or for setting search preferences in the UI. This object
- * also sets up the appropriate events for the controls. Actual searching
- * is done by PDFFindController.
- */
-var PDFFindBar = (function PDFFindBarClosure() {
-  function PDFFindBar(options) {
-    this.opened = false;
-    this.bar = options.bar || null;
-    this.toggleButton = options.toggleButton || null;
-    this.findField = options.findField || null;
-    this.highlightAll = options.highlightAllCheckbox || null;
-    this.caseSensitive = options.caseSensitiveCheckbox || null;
-    this.findMsg = options.findMsg || null;
-    this.findStatusIcon = options.findStatusIcon || null;
-    this.findPreviousButton = options.findPreviousButton || null;
-    this.findNextButton = options.findNextButton || null;
-    this.findController = options.findController || null;
-
-    if (this.findController === null) {
-      throw new Error('PDFFindBar cannot be used without a ' +
-        'PDFFindController instance.');
-    }
-
-    // Add event listeners to the DOM elements.
-    var self = this;
-    this.toggleButton.addEventListener('click', function () {
-      self.toggle();
-    });
-
-    this.findField.addEventListener('input', function () {
-      self.dispatchEvent('');
-    });
-
-    this.bar.addEventListener('keydown', function (evt) {
-      switch (evt.keyCode) {
-        case 13: // Enter
-          if (evt.target === self.findField) {
-            self.dispatchEvent('again', evt.shiftKey);
-          }
-          break;
-        case 27: // Escape
-          self.close();
-          break;
-      }
-    });
-
-    this.findPreviousButton.addEventListener('click', function () {
-      self.dispatchEvent('again', true);
-    });
-
-    this.findNextButton.addEventListener('click', function () {
-      self.dispatchEvent('again', false);
-    });
-
-    this.highlightAll.addEventListener('click', function () {
-      self.dispatchEvent('highlightallchange');
-    });
-
-    this.caseSensitive.addEventListener('click', function () {
-      self.dispatchEvent('casesensitivitychange');
-    });
-  }
-
-  PDFFindBar.prototype = {
-    dispatchEvent: function PDFFindBar_dispatchEvent(type, findPrev) {
-      var event = document.createEvent('CustomEvent');
-      event.initCustomEvent('find' + type, true, true, {
-        query: this.findField.value,
-        caseSensitive: this.caseSensitive.checked,
-        highlightAll: this.highlightAll.checked,
-        findPrevious: findPrev
-      });
-      return window.dispatchEvent(event);
-    },
-
-    updateUIState: function PDFFindBar_updateUIState(state, previous) {
-      var notFound = false;
-      var findMsg = '';
-      var status = '';
-
-      switch (state) {
-        case FindStates.FIND_FOUND:
-          break;
-
-        case FindStates.FIND_PENDING:
-          status = 'pending';
-          break;
-
-        case FindStates.FIND_NOTFOUND:
-          findMsg = mozL10n.get('find_not_found', null, 'Phrase not found');
-          notFound = true;
-          break;
-
-        case FindStates.FIND_WRAPPED:
-          if (previous) {
-            findMsg = mozL10n.get('find_reached_top', null,
-              'Reached top of document, continued from bottom');
-          } else {
-            findMsg = mozL10n.get('find_reached_bottom', null,
-              'Reached end of document, continued from top');
-          }
-          break;
-      }
-
-      if (notFound) {
-        this.findField.classList.add('notFound');
-      } else {
-        this.findField.classList.remove('notFound');
-      }
-
-      this.findField.setAttribute('data-status', status);
-      this.findMsg.textContent = findMsg;
-    },
-
-    open: function PDFFindBar_open() {
-      if (!this.opened) {
-        this.opened = true;
-        this.toggleButton.classList.add('toggled');
-        this.bar.classList.remove('hidden');
-      }
-      this.findField.select();
-      this.findField.focus();
-    },
-
-    close: function PDFFindBar_close() {
-      if (!this.opened) {
-        return;
-      }
-      this.opened = false;
-      this.toggleButton.classList.remove('toggled');
-      this.bar.classList.add('hidden');
-      this.findController.active = false;
-    },
-
-    toggle: function PDFFindBar_toggle() {
-      if (this.opened) {
-        this.close();
-      } else {
-        this.open();
-      }
-    }
-  };
-  return PDFFindBar;
-})();
-
-
-var FindStates = {
-  FIND_FOUND: 0,
-  FIND_NOTFOUND: 1,
-  FIND_WRAPPED: 2,
-  FIND_PENDING: 3
-};
-
-var FIND_SCROLL_OFFSET_TOP = -50;
-var FIND_SCROLL_OFFSET_LEFT = -400;
-
-/**
- * Provides "search" or "find" functionality for the PDF.
- * This object actually performs the search for a given string.
- */
-var PDFFindController = (function PDFFindControllerClosure() {
-  function PDFFindController(options) {
-    this.startedTextExtraction = false;
-    this.extractTextPromises = [];
-    this.pendingFindMatches = {};
-    this.active = false; // If active, find results will be highlighted.
-    this.pageContents = []; // Stores the text for each page.
-    this.pageMatches = [];
-    this.selected = { // Currently selected match.
-      pageIdx: -1,
-      matchIdx: -1
-    };
-    this.offset = { // Where the find algorithm currently is in the document.
-      pageIdx: null,
-      matchIdx: null
-    };
-    this.pagesToSearch = null;
-    this.resumePageIdx = null;
-    this.state = null;
-    this.dirtyMatch = false;
-    this.findTimeout = null;
-    this.pdfViewer = options.pdfViewer || null;
-    this.integratedFind = options.integratedFind || false;
-    this.charactersToNormalize = {
-      '\u2018': '\'', // Left single quotation mark
-      '\u2019': '\'', // Right single quotation mark
-      '\u201A': '\'', // Single low-9 quotation mark
-      '\u201B': '\'', // Single high-reversed-9 quotation mark
-      '\u201C': '"', // Left double quotation mark
-      '\u201D': '"', // Right double quotation mark
-      '\u201E': '"', // Double low-9 quotation mark
-      '\u201F': '"', // Double high-reversed-9 quotation mark
-      '\u00BC': '1/4', // Vulgar fraction one quarter
-      '\u00BD': '1/2', // Vulgar fraction one half
-      '\u00BE': '3/4', // Vulgar fraction three quarters
-      '\u00A0': ' ' // No-break space
-    };
-    this.findBar = options.findBar || null;
-
-    // Compile the regular expression for text normalization once
-    var replace = Object.keys(this.charactersToNormalize).join('');
-    this.normalizationRegex = new RegExp('[' + replace + ']', 'g');
-
-    var events = [
-      'find',
-      'findagain',
-      'findhighlightallchange',
-      'findcasesensitivitychange'
-    ];
-
-    this.firstPagePromise = new Promise(function (resolve) {
-      this.resolveFirstPage = resolve;
-    }.bind(this));
-    this.handleEvent = this.handleEvent.bind(this);
-
-    for (var i = 0, len = events.length; i < len; i++) {
-      window.addEventListener(events[i], this.handleEvent);
-    }
-  }
-
-  PDFFindController.prototype = {
-    setFindBar: function PDFFindController_setFindBar(findBar) {
-      this.findBar = findBar;
-    },
-
-    reset: function PDFFindController_reset() {
-      this.startedTextExtraction = false;
-      this.extractTextPromises = [];
-      this.active = false;
-    },
-
-    normalize: function PDFFindController_normalize(text) {
-      var self = this;
-      return text.replace(this.normalizationRegex, function (ch) {
-        return self.charactersToNormalize[ch];
-      });
-    },
-
-    calcFindMatch: function PDFFindController_calcFindMatch(pageIndex) {
-      var pageContent = this.normalize(this.pageContents[pageIndex]);
-      var query = this.normalize(this.state.query);
-      var caseSensitive = this.state.caseSensitive;
-      var queryLen = query.length;
-
-      if (queryLen === 0) {
-        return; // Do nothing: the matches should be wiped out already.
-      }
-
-      if (!caseSensitive) {
-        pageContent = pageContent.toLowerCase();
-        query = query.toLowerCase();
-      }
-
-      var matches = [];
-      var matchIdx = -queryLen;
-      while (true) {
-        matchIdx = pageContent.indexOf(query, matchIdx + queryLen);
-        if (matchIdx === -1) {
-          break;
-        }
-        matches.push(matchIdx);
-      }
-      this.pageMatches[pageIndex] = matches;
-      this.updatePage(pageIndex);
-      if (this.resumePageIdx === pageIndex) {
-        this.resumePageIdx = null;
-        this.nextPageMatch();
-      }
-    },
-
-    extractText: function PDFFindController_extractText() {
-      if (this.startedTextExtraction) {
-        return;
-      }
-      this.startedTextExtraction = true;
-
-      this.pageContents = [];
-      var extractTextPromisesResolves = [];
-      var numPages = this.pdfViewer.pagesCount;
-      for (var i = 0; i < numPages; i++) {
-        this.extractTextPromises.push(new Promise(function (resolve) {
-          extractTextPromisesResolves.push(resolve);
-        }));
-      }
-
-      var self = this;
-      function extractPageText(pageIndex) {
-        self.pdfViewer.getPageTextContent(pageIndex).then(
-          function textContentResolved(textContent) {
-            var textItems = textContent.items;
-            var str = [];
-
-            for (var i = 0, len = textItems.length; i < len; i++) {
-              str.push(textItems[i].str);
-            }
-
-            // Store the pageContent as a string.
-            self.pageContents.push(str.join(''));
-
-            extractTextPromisesResolves[pageIndex](pageIndex);
-            if ((pageIndex + 1) < self.pdfViewer.pagesCount) {
-              extractPageText(pageIndex + 1);
-            }
-          }
-        );
-      }
-      extractPageText(0);
-    },
-
-    handleEvent: function PDFFindController_handleEvent(e) {
-      if (this.state === null || e.type !== 'findagain') {
-        this.dirtyMatch = true;
-      }
-      this.state = e.detail;
-      this.updateUIState(FindStates.FIND_PENDING);
-
-      this.firstPagePromise.then(function () {
-        this.extractText();
-
-        clearTimeout(this.findTimeout);
-        if (e.type === 'find') {
-          // Only trigger the find action after 250ms of silence.
-          this.findTimeout = setTimeout(this.nextMatch.bind(this), 250);
-        } else {
-          this.nextMatch();
-        }
-      }.bind(this));
-    },
-
-    updatePage: function PDFFindController_updatePage(index) {
-      if (this.selected.pageIdx === index) {
-        // If the page is selected, scroll the page into view, which triggers
-        // rendering the page, which adds the textLayer. Once the textLayer is
-        // build, it will scroll onto the selected match.
-        this.pdfViewer.scrollPageIntoView(index + 1);
-      }
-
-      var page = this.pdfViewer.getPageView(index);
-      if (page.textLayer) {
-        page.textLayer.updateMatches();
-      }
-    },
-
-    nextMatch: function PDFFindController_nextMatch() {
-      var previous = this.state.findPrevious;
-      var currentPageIndex = this.pdfViewer.currentPageNumber - 1;
-      var numPages = this.pdfViewer.pagesCount;
-
-      this.active = true;
-
-      if (this.dirtyMatch) {
-        // Need to recalculate the matches, reset everything.
-        this.dirtyMatch = false;
-        this.selected.pageIdx = this.selected.matchIdx = -1;
-        this.offset.pageIdx = currentPageIndex;
-        this.offset.matchIdx = null;
-        this.hadMatch = false;
-        this.resumePageIdx = null;
-        this.pageMatches = [];
-        var self = this;
-
-        for (var i = 0; i < numPages; i++) {
-          // Wipe out any previous highlighted matches.
-          this.updatePage(i);
-
-          // As soon as the text is extracted start finding the matches.
-          if (!(i in this.pendingFindMatches)) {
-            this.pendingFindMatches[i] = true;
-            this.extractTextPromises[i].then(function (pageIdx) {
-              delete self.pendingFindMatches[pageIdx];
-              self.calcFindMatch(pageIdx);
-            });
-          }
-        }
-      }
-
-      // If there's no query there's no point in searching.
-      if (this.state.query === '') {
-        this.updateUIState(FindStates.FIND_FOUND);
-        return;
-      }
-
-      // If we're waiting on a page, we return since we can't do anything else.
-      if (this.resumePageIdx) {
-        return;
-      }
-
-      var offset = this.offset;
-      // Keep track of how many pages we should maximally iterate through.
-      this.pagesToSearch = numPages;
-      // If there's already a matchIdx that means we are iterating through a
-      // page's matches.
-      if (offset.matchIdx !== null) {
-        var numPageMatches = this.pageMatches[offset.pageIdx].length;
-        if ((!previous && offset.matchIdx + 1 < numPageMatches) ||
-          (previous && offset.matchIdx > 0)) {
-          // The simple case; we just have advance the matchIdx to select
-          // the next match on the page.
-          this.hadMatch = true;
-          offset.matchIdx = (previous ? offset.matchIdx - 1 :
-            offset.matchIdx + 1);
-          this.updateMatch(true);
-          return;
-        }
-        // We went beyond the current page's matches, so we advance to
-        // the next page.
-        this.advanceOffsetPage(previous);
-      }
-      // Start searching through the page.
-      this.nextPageMatch();
-    },
-
-    matchesReady: function PDFFindController_matchesReady(matches) {
-      var offset = this.offset;
-      var numMatches = matches.length;
-      var previous = this.state.findPrevious;
-
-      if (numMatches) {
-        // There were matches for the page, so initialize the matchIdx.
-        this.hadMatch = true;
-        offset.matchIdx = (previous ? numMatches - 1 : 0);
-        this.updateMatch(true);
-        return true;
-      } else {
-        // No matches, so attempt to search the next page.
-        this.advanceOffsetPage(previous);
-        if (offset.wrapped) {
-          offset.matchIdx = null;
-          if (this.pagesToSearch < 0) {
-            // No point in wrapping again, there were no matches.
-            this.updateMatch(false);
-            // while matches were not found, searching for a page
-            // with matches should nevertheless halt.
-            return true;
-          }
-        }
-        // Matches were not found (and searching is not done).
-        return false;
-      }
-    },
-
-    /**
-     * The method is called back from the text layer when match presentation
-     * is updated.
-     * @param {number} pageIndex - page index.
-     * @param {number} index - match index.
-     * @param {Array} elements - text layer div elements array.
-     * @param {number} beginIdx - start index of the div array for the match.
-     * @param {number} endIdx - end index of the div array for the match.
-     */
-    updateMatchPosition: function PDFFindController_updateMatchPosition(
-      pageIndex, index, elements, beginIdx, endIdx) {
-      if (this.selected.matchIdx === index &&
-        this.selected.pageIdx === pageIndex) {
-        scrollIntoView(elements[beginIdx], {
-          top: FIND_SCROLL_OFFSET_TOP,
-          left: FIND_SCROLL_OFFSET_LEFT
-        });
-      }
-    },
-
-    nextPageMatch: function PDFFindController_nextPageMatch() {
-      if (this.resumePageIdx !== null) {
-        console.error('There can only be one pending page.');
-      }
-      do {
-        var pageIdx = this.offset.pageIdx;
-        var matches = this.pageMatches[pageIdx];
-        if (!matches) {
-          // The matches don't exist yet for processing by "matchesReady",
-          // so set a resume point for when they do exist.
-          this.resumePageIdx = pageIdx;
-          break;
-        }
-      } while (!this.matchesReady(matches));
-    },
-
-    advanceOffsetPage: function PDFFindController_advanceOffsetPage(previous) {
-      var offset = this.offset;
-      var numPages = this.extractTextPromises.length;
-      offset.pageIdx = (previous ? offset.pageIdx - 1 : offset.pageIdx + 1);
-      offset.matchIdx = null;
-
-      this.pagesToSearch--;
-
-      if (offset.pageIdx >= numPages || offset.pageIdx < 0) {
-        offset.pageIdx = (previous ? numPages - 1 : 0);
-        offset.wrapped = true;
-      }
-    },
-
-    updateMatch: function PDFFindController_updateMatch(found) {
-      var state = FindStates.FIND_NOTFOUND;
-      var wrapped = this.offset.wrapped;
-      this.offset.wrapped = false;
-
-      if (found) {
-        var previousPage = this.selected.pageIdx;
-        this.selected.pageIdx = this.offset.pageIdx;
-        this.selected.matchIdx = this.offset.matchIdx;
-        state = (wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND);
-        // Update the currently selected page to wipe out any selected matches.
-        if (previousPage !== -1 && previousPage !== this.selected.pageIdx) {
-          this.updatePage(previousPage);
-        }
-      }
-
-      this.updateUIState(state, this.state.findPrevious);
-      if (this.selected.pageIdx !== -1) {
-        this.updatePage(this.selected.pageIdx);
-      }
-    },
-
-    updateUIState: function PDFFindController_updateUIState(state, previous) {
-      if (this.integratedFind) {
-        FirefoxCom.request('updateFindControlState',
-          { result: state, findPrevious: previous });
-        return;
-      }
-      if (this.findBar === null) {
-        throw new Error('PDFFindController is not initialized with a ' +
-          'PDFFindBar instance.');
-      }
-      this.findBar.updateUIState(state, previous);
-    }
-  };
-  return PDFFindController;
-})();
-
-
-var PDFHistory = {
-  initialized: false,
-  initialDestination: null,
-
-  /**
-   * @param {string} fingerprint
-   * @param {IPDFLinkService} linkService
-   */
-  initialize: function pdfHistoryInitialize(fingerprint, linkService) {
-    this.initialized = true;
-    this.reInitialized = false;
-    this.allowHashChange = true;
-    this.historyUnlocked = true;
-    this.isViewerInPresentationMode = false;
-
-    this.previousHash = window.location.hash.substring(1);
-    this.currentBookmark = '';
-    this.currentPage = 0;
-    this.updatePreviousBookmark = false;
-    this.previousBookmark = '';
-    this.previousPage = 0;
-    this.nextHashParam = '';
-
-    this.fingerprint = fingerprint;
-    this.linkService = linkService;
-    this.currentUid = this.uid = 0;
-    this.current = {};
-
-    var state = window.history.state;
-    if (this._isStateObjectDefined(state)) {
-      // This corresponds to navigating back to the document
-      // from another page in the browser history.
-      if (state.target.dest) {
-        this.initialDestination = state.target.dest;
-      } else {
-        linkService.setHash(state.target.hash);
-      }
-      this.currentUid = state.uid;
-      this.uid = state.uid + 1;
-      this.current = state.target;
-    } else {
-      // This corresponds to the loading of a new document.
-      if (state && state.fingerprint &&
-        this.fingerprint !== state.fingerprint) {
-        // Reinitialize the browsing history when a new document
-        // is opened in the web viewer.
-        this.reInitialized = true;
-      }
-      this._pushOrReplaceState({ fingerprint: this.fingerprint }, true);
-    }
-
-    var self = this;
-    window.addEventListener('popstate', function pdfHistoryPopstate(evt) {
-      evt.preventDefault();
-      evt.stopPropagation();
-
-      if (!self.historyUnlocked) {
-        return;
-      }
-      if (evt.state) {
-        // Move back/forward in the history.
-        self._goTo(evt.state);
-      } else {
-        // Handle the user modifying the hash of a loaded document.
-        self.previousHash = window.location.hash.substring(1);
-
-        // If the history is empty when the hash changes,
-        // update the previous entry in the browser history.
-        if (self.uid === 0) {
-          var previousParams = (self.previousHash && self.currentBookmark &&
-            self.previousHash !== self.currentBookmark) ?
-            { hash: self.currentBookmark, page: self.currentPage } :
-            { page: 1 };
-          self.historyUnlocked = false;
-          self.allowHashChange = false;
-          window.history.back();
-          self._pushToHistory(previousParams, false, true);
-          window.history.forward();
-          self.historyUnlocked = true;
-        }
-        self._pushToHistory({ hash: self.previousHash }, false, true);
-        self._updatePreviousBookmark();
-      }
-    }, false);
-
-    function pdfHistoryBeforeUnload() {
-      var previousParams = self._getPreviousParams(null, true);
-      if (previousParams) {
-        var replacePrevious = (!self.current.dest &&
-          self.current.hash !== self.previousHash);
-        self._pushToHistory(previousParams, false, replacePrevious);
-        self._updatePreviousBookmark();
-      }
-      // Remove the event listener when navigating away from the document,
-      // since 'beforeunload' prevents Firefox from caching the document.
-      window.removeEventListener('beforeunload', pdfHistoryBeforeUnload, false);
-    }
-    window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);
-
-    window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {
-      // If the entire viewer (including the PDF file) is cached in the browser,
-      // we need to reattach the 'beforeunload' event listener since
-      // the 'DOMContentLoaded' event is not fired on 'pageshow'.
-      window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);
-    }, false);
-
-    window.addEventListener('presentationmodechanged', function (e) {
-      self.isViewerInPresentationMode = !!e.detail.active;
-    });
-  },
-
-  _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) {
-    return (state && state.uid >= 0 &&
-      state.fingerprint && this.fingerprint === state.fingerprint &&
-      state.target && state.target.hash) ? true : false;
-  },
-
-  _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj,
-    replace) {
-    if (replace) {
-      window.history.replaceState(stateObj, '', document.URL);
-    } else {
-      window.history.pushState(stateObj, '', document.URL);
-    }
-  },
-
-  get isHashChangeUnlocked() {
-    if (!this.initialized) {
-      return true;
-    }
-    // If the current hash changes when moving back/forward in the history,
-    // this will trigger a 'popstate' event *as well* as a 'hashchange' event.
-    // Since the hash generally won't correspond to the exact the position
-    // stored in the history's state object, triggering the 'hashchange' event
-    // can thus corrupt the browser history.
-    //
-    // When the hash changes during a 'popstate' event, we *only* prevent the
-    // first 'hashchange' event and immediately reset allowHashChange.
-    // If it is not reset, the user would not be able to change the hash.
-
-    var temp = this.allowHashChange;
-    this.allowHashChange = true;
-    return temp;
-  },
-
-  _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {
-    if (this.updatePreviousBookmark &&
-      this.currentBookmark && this.currentPage) {
-      this.previousBookmark = this.currentBookmark;
-      this.previousPage = this.currentPage;
-      this.updatePreviousBookmark = false;
-    }
-  },
-
-  updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark,
-    pageNum) {
-    if (this.initialized) {
-      this.currentBookmark = bookmark.substring(1);
-      this.currentPage = pageNum | 0;
-      this._updatePreviousBookmark();
-    }
-  },
-
-  updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {
-    if (this.initialized) {
-      this.nextHashParam = param;
-    }
-  },
-
-  push: function pdfHistoryPush(params, isInitialBookmark) {
-    if (!(this.initialized && this.historyUnlocked)) {
-      return;
-    }
-    if (params.dest && !params.hash) {
-      params.hash = (this.current.hash && this.current.dest &&
-        this.current.dest === params.dest) ?
-        this.current.hash :
-        this.linkService.getDestinationHash(params.dest).split('#')[1];
-    }
-    if (params.page) {
-      params.page |= 0;
-    }
-    if (isInitialBookmark) {
-      var target = window.history.state.target;
-      if (!target) {
-        // Invoked when the user specifies an initial bookmark,
-        // thus setting initialBookmark, when the document is loaded.
-        this._pushToHistory(params, false);
-        this.previousHash = window.location.hash.substring(1);
-      }
-      this.updatePreviousBookmark = this.nextHashParam ? false : true;
-      if (target) {
-        // If the current document is reloaded,
-        // avoid creating duplicate entries in the history.
-        this._updatePreviousBookmark();
-      }
-      return;
-    }
-    if (this.nextHashParam) {
-      if (this.nextHashParam === params.hash) {
-        this.nextHashParam = null;
-        this.updatePreviousBookmark = true;
-        return;
-      } else {
-        this.nextHashParam = null;
-      }
-    }
-
-    if (params.hash) {
-      if (this.current.hash) {
-        if (this.current.hash !== params.hash) {
-          this._pushToHistory(params, true);
-        } else {
-          if (!this.current.page && params.page) {
-            this._pushToHistory(params, false, true);
-          }
-          this.updatePreviousBookmark = true;
-        }
-      } else {
-        this._pushToHistory(params, true);
-      }
-    } else if (this.current.page && params.page &&
-      this.current.page !== params.page) {
-      this._pushToHistory(params, true);
-    }
-  },
-
-  _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage,
-    beforeUnload) {
-    if (!(this.currentBookmark && this.currentPage)) {
-      return null;
-    } else if (this.updatePreviousBookmark) {
-      this.updatePreviousBookmark = false;
-    }
-    if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) {
-      // Prevent the history from getting stuck in the current state,
-      // effectively preventing the user from going back/forward in the history.
-      //
-      // This happens if the current position in the document didn't change when
-      // the history was previously updated. The reasons for this are either:
-      // 1. The current zoom value is such that the document does not need to,
-      //    or cannot, be scrolled to display the destination.
-      // 2. The previous destination is broken, and doesn't actally point to a
-      //    position within the document.
-      //    (This is either due to a bad PDF generator, or the user making a
-      //     mistake when entering a destination in the hash parameters.)
-      return null;
-    }
-    if ((!this.current.dest && !onlyCheckPage) || beforeUnload) {
-      if (this.previousBookmark === this.currentBookmark) {
-        return null;
-      }
-    } else if (this.current.page || onlyCheckPage) {
-      if (this.previousPage === this.currentPage) {
-        return null;
-      }
-    } else {
-      return null;
-    }
-    var params = { hash: this.currentBookmark, page: this.currentPage };
-    if (this.isViewerInPresentationMode) {
-      params.hash = null;
-    }
-    return params;
-  },
-
-  _stateObj: function pdfHistory_stateObj(params) {
-    return { fingerprint: this.fingerprint, uid: this.uid, target: params };
-  },
-
-  _pushToHistory: function pdfHistory_pushToHistory(params,
-    addPrevious, overwrite) {
-    if (!this.initialized) {
-      return;
-    }
-    if (!params.hash && params.page) {
-      params.hash = ('page=' + params.page);
-    }
-    if (addPrevious && !overwrite) {
-      var previousParams = this._getPreviousParams();
-      if (previousParams) {
-        var replacePrevious = (!this.current.dest &&
-          this.current.hash !== this.previousHash);
-        this._pushToHistory(previousParams, false, replacePrevious);
-      }
-    }
-    this._pushOrReplaceState(this._stateObj(params),
-      (overwrite || this.uid === 0));
-    this.currentUid = this.uid++;
-    this.current = params;
-    this.updatePreviousBookmark = true;
-  },
-
-  _goTo: function pdfHistory_goTo(state) {
-    if (!(this.initialized && this.historyUnlocked &&
-      this._isStateObjectDefined(state))) {
-      return;
-    }
-    if (!this.reInitialized && state.uid < this.currentUid) {
-      var previousParams = this._getPreviousParams(true);
-      if (previousParams) {
-        this._pushToHistory(this.current, false);
-        this._pushToHistory(previousParams, false);
-        this.currentUid = state.uid;
-        window.history.back();
-        return;
-      }
-    }
-    this.historyUnlocked = false;
-
-    if (state.target.dest) {
-      this.linkService.navigateTo(state.target.dest);
-    } else {
-      this.linkService.setHash(state.target.hash);
-    }
-    this.currentUid = state.uid;
-    if (state.uid > this.uid) {
-      this.uid = state.uid;
-    }
-    this.current = state.target;
-    this.updatePreviousBookmark = true;
-
-    var currentHash = window.location.hash.substring(1);
-    if (this.previousHash !== currentHash) {
-      this.allowHashChange = false;
-    }
-    this.previousHash = currentHash;
-
-    this.historyUnlocked = true;
-  },
-
-  back: function pdfHistoryBack() {
-    this.go(-1);
-  },
-
-  forward: function pdfHistoryForward() {
-    this.go(1);
-  },
-
-  go: function pdfHistoryGo(direction) {
-    if (this.initialized && this.historyUnlocked) {
-      var state = window.history.state;
-      if (direction === -1 && state && state.uid > 0) {
-        window.history.back();
-      } else if (direction === 1 && state && state.uid < (this.uid - 1)) {
-        window.history.forward();
-      }
-    }
-  }
-};
-
-
-var SecondaryToolbar = {
-  opened: false,
-  previousContainerHeight: null,
-  newContainerHeight: null,
-
-  initialize: function secondaryToolbarInitialize(options) {
-    this.toolbar = options.toolbar;
-    this.buttonContainer = this.toolbar.firstElementChild;
-
-    // Define the toolbar buttons.
-    this.toggleButton = options.toggleButton;
-    this.presentationModeButton = options.presentationModeButton;
-    this.openFile = options.openFile;
-    this.print = options.print;
-    this.download = options.download;
-    this.viewBookmark = options.viewBookmark;
-    this.firstPage = options.firstPage;
-    this.lastPage = options.lastPage;
-    this.pageRotateCw = options.pageRotateCw;
-    this.pageRotateCcw = options.pageRotateCcw;
-    this.documentPropertiesButton = options.documentPropertiesButton;
-
-    // Attach the event listeners.
-    var elements = [
-      // Button to toggle the visibility of the secondary toolbar:
-      { element: this.toggleButton, handler: this.toggle },
-      // All items within the secondary toolbar
-      // (except for toggleHandTool, hand_tool.js is responsible for it):
-      {
-        element: this.presentationModeButton,
-        handler: this.presentationModeClick
-      },
-      { element: this.openFile, handler: this.openFileClick },
-      { element: this.print, handler: this.printClick },
-      { element: this.download, handler: this.downloadClick },
-      { element: this.viewBookmark, handler: this.viewBookmarkClick },
-      { element: this.firstPage, handler: this.firstPageClick },
-      { element: this.lastPage, handler: this.lastPageClick },
-      { element: this.pageRotateCw, handler: this.pageRotateCwClick },
-      { element: this.pageRotateCcw, handler: this.pageRotateCcwClick },
-      {
-        element: this.documentPropertiesButton,
-        handler: this.documentPropertiesClick
-      }
-    ];
-
-    for (var item in elements) {
-      var element = elements[item].element;
-      if (element) {
-        element.addEventListener('click', elements[item].handler.bind(this));
-      }
-    }
-  },
-
-  // Event handling functions.
-  presentationModeClick: function secondaryToolbarPresentationModeClick(evt) {
-    PDFViewerApplication.requestPresentationMode();
-    this.close();
-  },
-
-  openFileClick: function secondaryToolbarOpenFileClick(evt) {
-    document.getElementById('fileInput').click();
-    this.close();
-  },
-
-  printClick: function secondaryToolbarPrintClick(evt) {
-    window.print();
-    this.close();
-  },
-
-  downloadClick: function secondaryToolbarDownloadClick(evt) {
-    PDFViewerApplication.download();
-    this.close();
-  },
-
-  viewBookmarkClick: function secondaryToolbarViewBookmarkClick(evt) {
-    this.close();
-  },
-
-  firstPageClick: function secondaryToolbarFirstPageClick(evt) {
-    PDFViewerApplication.page = 1;
-    this.close();
-  },
-
-  lastPageClick: function secondaryToolbarLastPageClick(evt) {
-    if (PDFViewerApplication.pdfDocument) {
-      PDFViewerApplication.page = PDFViewerApplication.pagesCount;
-    }
-    this.close();
-  },
-
-  pageRotateCwClick: function secondaryToolbarPageRotateCwClick(evt) {
-    PDFViewerApplication.rotatePages(90);
-  },
-
-  pageRotateCcwClick: function secondaryToolbarPageRotateCcwClick(evt) {
-    PDFViewerApplication.rotatePages(-90);
-  },
-
-  documentPropertiesClick: function secondaryToolbarDocumentPropsClick(evt) {
-    PDFViewerApplication.pdfDocumentProperties.open();
-    this.close();
-  },
-
-  // Misc. functions for interacting with the toolbar.
-  setMaxHeight: function secondaryToolbarSetMaxHeight(container) {
-    if (!container || !this.buttonContainer) {
-      return;
-    }
-    this.newContainerHeight = container.clientHeight;
-    if (this.previousContainerHeight === this.newContainerHeight) {
-      return;
-    }
-    this.buttonContainer.setAttribute('style',
-      'max-height: ' + (this.newContainerHeight - SCROLLBAR_PADDING) + 'px;');
-    this.previousContainerHeight = this.newContainerHeight;
-  },
-
-  open: function secondaryToolbarOpen() {
-    if (this.opened) {
-      return;
-    }
-    this.opened = true;
-    this.toggleButton.classList.add('toggled');
-    this.toolbar.classList.remove('hidden');
-  },
-
-  close: function secondaryToolbarClose(target) {
-    if (!this.opened) {
-      return;
-    } else if (target && !this.toolbar.contains(target)) {
-      return;
-    }
-    this.opened = false;
-    this.toolbar.classList.add('hidden');
-    this.toggleButton.classList.remove('toggled');
-  },
-
-  toggle: function secondaryToolbarToggle() {
-    if (this.opened) {
-      this.close();
-    } else {
-      this.open();
-    }
-  }
-};
-
-
-var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500; // in ms
-var DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms
-var ACTIVE_SELECTOR = 'pdfPresentationMode';
-var CONTROLS_SELECTOR = 'pdfPresentationModeControls';
-
-/**
- * @typedef {Object} PDFPresentationModeOptions
- * @property {HTMLDivElement} container - The container for the viewer element.
- * @property {HTMLDivElement} viewer - (optional) The viewer element.
- * @property {PDFThumbnailViewer} pdfThumbnailViewer - (optional) The thumbnail
- *   viewer.
- * @property {Array} contextMenuItems - (optional) The menuitems that are added
- *   to the context menu in Presentation Mode.
- */
-
-/**
- * @class
- */
-var PDFPresentationMode = (function PDFPresentationModeClosure() {
-  /**
-   * @constructs PDFPresentationMode
-   * @param {PDFPresentationModeOptions} options
-   */
-  function PDFPresentationMode(options) {
-    this.container = options.container;
-    this.viewer = options.viewer || options.container.firstElementChild;
-    this.pdfThumbnailViewer = options.pdfThumbnailViewer || null;
-    var contextMenuItems = options.contextMenuItems || null;
-
-    this.active = false;
-    this.args = null;
-    this.contextMenuOpen = false;
-    this.mouseScrollTimeStamp = 0;
-    this.mouseScrollDelta = 0;
-
-    if (contextMenuItems) {
-      for (var i = 0, ii = contextMenuItems.length; i < ii; i++) {
-        var item = contextMenuItems[i];
-        item.element.addEventListener('click', function (handler) {
-          this.contextMenuOpen = false;
-          handler();
-        }.bind(this, item.handler));
-      }
-    }
-  }
-
-  PDFPresentationMode.prototype = {
-    /**
-     * Request the browser to enter fullscreen mode.
-     * @returns {boolean} Indicating if the request was successful.
-     */
-    request: function PDFPresentationMode_request() {
-      if (this.switchInProgress || this.active ||
-        !this.viewer.hasChildNodes()) {
-        return false;
-      }
-      this._addFullscreenChangeListeners();
-      this._setSwitchInProgress();
-      this._notifyStateChange();
-
-      if (this.container.requestFullscreen) {
-        this.container.requestFullscreen();
-      } else if (this.container.mozRequestFullScreen) {
-        this.container.mozRequestFullScreen();
-      } else if (this.container.webkitRequestFullscreen) {
-        this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
-      } else if (this.container.msRequestFullscreen) {
-        this.container.msRequestFullscreen();
-      } else {
-        return false;
-      }
-
-      this.args = {
-        page: PDFViewerApplication.page,
-        previousScale: PDFViewerApplication.currentScaleValue
-      };
-
-      return true;
-    },
-
-    /**
-     * Switches page when the user scrolls (using a scroll wheel or a touchpad)
-     * with large enough motion, to prevent accidental page switches.
-     * @param {number} delta - The delta value from the mouse event.
-     */
-    mouseScroll: function PDFPresentationMode_mouseScroll(delta) {
-      if (!this.active) {
-        return;
-      }
-      var MOUSE_SCROLL_COOLDOWN_TIME = 50;
-      var PAGE_SWITCH_THRESHOLD = 120;
-      var PageSwitchDirection = {
-        UP: -1,
-        DOWN: 1
-      };
-
-      var currentTime = (new Date()).getTime();
-      var storedTime = this.mouseScrollTimeStamp;
-
-      // If we've already switched page, avoid accidentally switching again.
-      if (currentTime > storedTime &&
-        currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {
-        return;
-      }
-      // If the scroll direction changed, reset the accumulated scroll delta.
-      if ((this.mouseScrollDelta > 0 && delta < 0) ||
-        (this.mouseScrollDelta < 0 && delta > 0)) {
-        this._resetMouseScrollState();
-      }
-      this.mouseScrollDelta += delta;
-
-      if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {
-        var pageSwitchDirection = (this.mouseScrollDelta > 0) ?
-          PageSwitchDirection.UP : PageSwitchDirection.DOWN;
-        var page = PDFViewerApplication.page;
-        this._resetMouseScrollState();
-
-        // If we're at the first/last page, we don't need to do anything.
-        if ((page === 1 && pageSwitchDirection === PageSwitchDirection.UP) ||
-          (page === PDFViewerApplication.pagesCount &&
-            pageSwitchDirection === PageSwitchDirection.DOWN)) {
-          return;
-        }
-        PDFViewerApplication.page = (page + pageSwitchDirection);
-        this.mouseScrollTimeStamp = currentTime;
-      }
-    },
-
-    get isFullscreen() {
-      return !!(document.fullscreenElement ||
-        document.mozFullScreen ||
-        document.webkitIsFullScreen ||
-        document.msFullscreenElement);
-    },
-
-    /**
-     * @private
-     */
-    _notifyStateChange: function PDFPresentationMode_notifyStateChange() {
-      var event = document.createEvent('CustomEvent');
-      event.initCustomEvent('presentationmodechanged', true, true, {
-        active: this.active,
-        switchInProgress: !!this.switchInProgress
-      });
-      window.dispatchEvent(event);
-    },
-
-    /**
-     * Used to initialize a timeout when requesting Presentation Mode,
-     * i.e. when the browser is requested to enter fullscreen mode.
-     * This timeout is used to prevent the current page from being scrolled
-     * partially, or completely, out of view when entering Presentation Mode.
-     * NOTE: This issue seems limited to certain zoom levels (e.g. page-width).
-     * @private
-     */
-    _setSwitchInProgress: function PDFPresentationMode_setSwitchInProgress() {
-      if (this.switchInProgress) {
-        clearTimeout(this.switchInProgress);
-      }
-      this.switchInProgress = setTimeout(function switchInProgressTimeout() {
-        this._removeFullscreenChangeListeners();
-        delete this.switchInProgress;
-        this._notifyStateChange();
-      }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
-    },
-
-    /**
-     * @private
-     */
-    _resetSwitchInProgress:
-      function PDFPresentationMode_resetSwitchInProgress() {
-        if (this.switchInProgress) {
-          clearTimeout(this.switchInProgress);
-          delete this.switchInProgress;
-        }
-      },
-
-    /**
-     * @private
-     */
-    _enter: function PDFPresentationMode_enter() {
-      this.active = true;
-      this._resetSwitchInProgress();
-      this._notifyStateChange();
-      this.container.classList.add(ACTIVE_SELECTOR);
-
-      // Ensure that the correct page is scrolled into view when entering
-      // Presentation Mode, by waiting until fullscreen mode in enabled.
-      setTimeout(function enterPresentationModeTimeout() {
-        PDFViewerApplication.page = this.args.page;
-        PDFViewerApplication.setScale('page-fit', true);
-      }.bind(this), 0);
-
-      this._addWindowListeners();
-      this._showControls();
-      this.contextMenuOpen = false;
-      this.container.setAttribute('contextmenu', 'viewerContextMenu');
-
-      // Text selection is disabled in Presentation Mode, thus it's not possible
-      // for the user to deselect text that is selected (e.g. with "Select all")
-      // when entering Presentation Mode, hence we remove any active selection.
-      window.getSelection().removeAllRanges();
-    },
-
-    /**
-     * @private
-     */
-    _exit: function PDFPresentationMode_exit() {
-      var page = PDFViewerApplication.page;
-      this.container.classList.remove(ACTIVE_SELECTOR);
-
-      // Ensure that the correct page is scrolled into view when exiting
-      // Presentation Mode, by waiting until fullscreen mode is disabled.
-      setTimeout(function exitPresentationModeTimeout() {
-        this.active = false;
-        this._removeFullscreenChangeListeners();
-        this._notifyStateChange();
-
-        PDFViewerApplication.setScale(this.args.previousScale, true);
-        PDFViewerApplication.page = page;
-        this.args = null;
-      }.bind(this), 0);
-
-      this._removeWindowListeners();
-      this._hideControls();
-      this._resetMouseScrollState();
-      this.container.removeAttribute('contextmenu');
-      this.contextMenuOpen = false;
-
-      if (this.pdfThumbnailViewer) {
-        this.pdfThumbnailViewer.ensureThumbnailVisible(page);
-      }
-    },
-
-    /**
-     * @private
-     */
-    _mouseDown: function PDFPresentationMode_mouseDown(evt) {
-      if (this.contextMenuOpen) {
-        this.contextMenuOpen = false;
-        evt.preventDefault();
-        return;
-      }
-      if (evt.button === 0) {
-        // Enable clicking of links in presentation mode. Please note:
-        // Only links pointing to destinations in the current PDF document work.
-        var isInternalLink = (evt.target.href &&
-          evt.target.classList.contains('internalLink'));
-        if (!isInternalLink) {
-          // Unless an internal link was clicked, advance one page.
-          evt.preventDefault();
-          PDFViewerApplication.page += (evt.shiftKey ? -1 : 1);
-        }
-      }
-    },
-
-    /**
-     * @private
-     */
-    _contextMenu: function PDFPresentationMode_contextMenu() {
-      this.contextMenuOpen = true;
-    },
-
-    /**
-     * @private
-     */
-    _showControls: function PDFPresentationMode_showControls() {
-      if (this.controlsTimeout) {
-        clearTimeout(this.controlsTimeout);
-      } else {
-        this.container.classList.add(CONTROLS_SELECTOR);
-      }
-      this.controlsTimeout = setTimeout(function showControlsTimeout() {
-        this.container.classList.remove(CONTROLS_SELECTOR);
-        delete this.controlsTimeout;
-      }.bind(this), DELAY_BEFORE_HIDING_CONTROLS);
-    },
-
-    /**
-     * @private
-     */
-    _hideControls: function PDFPresentationMode_hideControls() {
-      if (!this.controlsTimeout) {
-        return;
-      }
-      clearTimeout(this.controlsTimeout);
-      this.container.classList.remove(CONTROLS_SELECTOR);
-      delete this.controlsTimeout;
-    },
-
-    /**
-     * Resets the properties used for tracking mouse scrolling events.
-     * @private
-     */
-    _resetMouseScrollState:
-      function PDFPresentationMode_resetMouseScrollState() {
-        this.mouseScrollTimeStamp = 0;
-        this.mouseScrollDelta = 0;
-      },
-
-    /**
-     * @private
-     */
-    _addWindowListeners: function PDFPresentationMode_addWindowListeners() {
-      this.showControlsBind = this._showControls.bind(this);
-      this.mouseDownBind = this._mouseDown.bind(this);
-      this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);
-      this.contextMenuBind = this._contextMenu.bind(this);
-
-      window.addEventListener('mousemove', this.showControlsBind);
-      window.addEventListener('mousedown', this.mouseDownBind);
-      window.addEventListener('keydown', this.resetMouseScrollStateBind);
-      window.addEventListener('contextmenu', this.contextMenuBind);
-    },
-
-    /**
-     * @private
-     */
-    _removeWindowListeners:
-      function PDFPresentationMode_removeWindowListeners() {
-        window.removeEventListener('mousemove', this.showControlsBind);
-        window.removeEventListener('mousedown', this.mouseDownBind);
-        window.removeEventListener('keydown', this.resetMouseScrollStateBind);
-        window.removeEventListener('contextmenu', this.contextMenuBind);
-
-        delete this.showControlsBind;
-        delete this.mouseDownBind;
-        delete this.resetMouseScrollStateBind;
-        delete this.contextMenuBind;
-      },
-
-    /**
-     * @private
-     */
-    _fullscreenChange: function PDFPresentationMode_fullscreenChange() {
-      if (this.isFullscreen) {
-        this._enter();
-      } else {
-        this._exit();
-      }
-    },
-
-    /**
-     * @private
-     */
-    _addFullscreenChangeListeners:
-      function PDFPresentationMode_addFullscreenChangeListeners() {
-        this.fullscreenChangeBind = this._fullscreenChange.bind(this);
-
-        window.addEventListener('fullscreenchange', this.fullscreenChangeBind);
-        window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind);
-        window.addEventListener('webkitfullscreenchange',
-          this.fullscreenChangeBind);
-        window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind);
-      },
-
-    /**
-     * @private
-     */
-    _removeFullscreenChangeListeners:
-      function PDFPresentationMode_removeFullscreenChangeListeners() {
-        window.removeEventListener('fullscreenchange', this.fullscreenChangeBind);
-        window.removeEventListener('mozfullscreenchange',
-          this.fullscreenChangeBind);
-        window.removeEventListener('webkitfullscreenchange',
-          this.fullscreenChangeBind);
-        window.removeEventListener('MSFullscreenChange',
-          this.fullscreenChangeBind);
-
-        delete this.fullscreenChangeBind;
-      }
-  };
-
-  return PDFPresentationMode;
-})();
-
-
-/* Copyright 2013 Rob Wu <gwnRob@gmail.com>
- * https://github.com/Rob--W/grab-to-pan.js
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-'use strict';
-
-var GrabToPan = (function GrabToPanClosure() {
-  /**
-   * Construct a GrabToPan instance for a given HTML element.
-   * @param options.element {Element}
-   * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)`
-   * @param options.onActiveChanged {function(boolean)} optional. Called
-   *  when grab-to-pan is (de)activated. The first argument is a boolean that
-   *  shows whether grab-to-pan is activated.
-   */
-  function GrabToPan(options) {
-    this.element = options.element;
-    this.document = options.element.ownerDocument;
-    if (typeof options.ignoreTarget === 'function') {
-      this.ignoreTarget = options.ignoreTarget;
-    }
-    this.onActiveChanged = options.onActiveChanged;
-
-    // Bind the contexts to ensure that `this` always points to
-    // the GrabToPan instance.
-    this.activate = this.activate.bind(this);
-    this.deactivate = this.deactivate.bind(this);
-    this.toggle = this.toggle.bind(this);
-    this._onmousedown = this._onmousedown.bind(this);
-    this._onmousemove = this._onmousemove.bind(this);
-    this._endPan = this._endPan.bind(this);
-
-    // This overlay will be inserted in the document when the mouse moves during
-    // a grab operation, to ensure that the cursor has the desired appearance.
-    var overlay = this.overlay = document.createElement('div');
-    overlay.className = 'grab-to-pan-grabbing';
-  }
-  GrabToPan.prototype = {
-    /**
-     * Class name of element which can be grabbed
-     */
-    CSS_CLASS_GRAB: 'grab-to-pan-grab',
-
-    /**
-     * Bind a mousedown event to the element to enable grab-detection.
-     */
-    activate: function GrabToPan_activate() {
-      if (!this.active) {
-        this.active = true;
-        this.element.addEventListener('mousedown', this._onmousedown, true);
-        this.element.classList.add(this.CSS_CLASS_GRAB);
-        if (this.onActiveChanged) {
-          this.onActiveChanged(true);
-        }
-      }
-    },
-
-    /**
-     * Removes all events. Any pending pan session is immediately stopped.
-     */
-    deactivate: function GrabToPan_deactivate() {
-      if (this.active) {
-        this.active = false;
-        this.element.removeEventListener('mousedown', this._onmousedown, true);
-        this._endPan();
-        this.element.classList.remove(this.CSS_CLASS_GRAB);
-        if (this.onActiveChanged) {
-          this.onActiveChanged(false);
-        }
-      }
-    },
-
-    toggle: function GrabToPan_toggle() {
-      if (this.active) {
-        this.deactivate();
-      } else {
-        this.activate();
-      }
-    },
-
-    /**
-     * Whether to not pan if the target element is clicked.
-     * Override this method to change the default behaviour.
-     *
-     * @param node {Element} The target of the event
-     * @return {boolean} Whether to not react to the click event.
-     */
-    ignoreTarget: function GrabToPan_ignoreTarget(node) {
-      // Use matchesSelector to check whether the clicked element
-      // is (a child of) an input element / link
-      return node[matchesSelector](
-        'a[href], a[href] *, input, textarea, button, button *, select, option'
-      );
-    },
-
-    /**
-     * @private
-     */
-    _onmousedown: function GrabToPan__onmousedown(event) {
-      if (event.button !== 0 || this.ignoreTarget(event.target)) {
-        return;
-      }
-      if (event.originalTarget) {
-        try {
-          /* jshint expr:true */
-          event.originalTarget.tagName;
-        } catch (e) {
-          // Mozilla-specific: element is a scrollbar (XUL element)
-          return;
-        }
-      }
-
-      this.scrollLeftStart = this.element.scrollLeft;
-      this.scrollTopStart = this.element.scrollTop;
-      this.clientXStart = event.clientX;
-      this.clientYStart = event.clientY;
-      this.document.addEventListener('mousemove', this._onmousemove, true);
-      this.document.addEventListener('mouseup', this._endPan, true);
-      // When a scroll event occurs before a mousemove, assume that the user
-      // dragged a scrollbar (necessary for Opera Presto, Safari and IE)
-      // (not needed for Chrome/Firefox)
-      this.element.addEventListener('scroll', this._endPan, true);
-      event.preventDefault();
-      event.stopPropagation();
-      this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING);
-
-      var focusedElement = document.activeElement;
-      if (focusedElement && !focusedElement.contains(event.target)) {
-        focusedElement.blur();
-      }
-    },
-
-    /**
-     * @private
-     */
-    _onmousemove: function GrabToPan__onmousemove(event) {
-      this.element.removeEventListener('scroll', this._endPan, true);
-      if (isLeftMouseReleased(event)) {
-        this._endPan();
-        return;
-      }
-      var xDiff = event.clientX - this.clientXStart;
-      var yDiff = event.clientY - this.clientYStart;
-      this.element.scrollTop = this.scrollTopStart - yDiff;
-      this.element.scrollLeft = this.scrollLeftStart - xDiff;
-      if (!this.overlay.parentNode) {
-        document.body.appendChild(this.overlay);
-      }
-    },
-
-    /**
-     * @private
-     */
-    _endPan: function GrabToPan__endPan() {
-      this.element.removeEventListener('scroll', this._endPan, true);
-      this.document.removeEventListener('mousemove', this._onmousemove, true);
-      this.document.removeEventListener('mouseup', this._endPan, true);
-      if (this.overlay.parentNode) {
-        this.overlay.parentNode.removeChild(this.overlay);
-      }
-    }
-  };
-
-  // Get the correct (vendor-prefixed) name of the matches method.
-  var matchesSelector;
-  ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function (prefix) {
-    var name = prefix + 'atches';
-    if (name in document.documentElement) {
-      matchesSelector = name;
-    }
-    name += 'Selector';
-    if (name in document.documentElement) {
-      matchesSelector = name;
-    }
-    return matchesSelector; // If found, then truthy, and [].some() ends.
-  });
-
-  // Browser sniffing because it's impossible to feature-detect
-  // whether event.which for onmousemove is reliable
-  var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;
-  var chrome = window.chrome;
-  var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);
-  //                                       ^ Chrome 15+       ^ Opera 15+
-  var isSafari6plus = /Apple/.test(navigator.vendor) &&
-    /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);
-
-  /**
-   * Whether the left mouse is not pressed.
-   * @param event {MouseEvent}
-   * @return {boolean} True if the left mouse button is not pressed.
-   *                   False if unsure or if the left mouse button is pressed.
-   */
-  function isLeftMouseReleased(event) {
-    if ('buttons' in event && isNotIEorIsIE10plus) {
-      // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons
-      // Firefox 15+
-      // Internet Explorer 10+
-      return !(event.buttons | 1);
-    }
-    if (isChrome15OrOpera15plus || isSafari6plus) {
-      // Chrome 14+
-      // Opera 15+
-      // Safari 6.0+
-      return event.which === 0;
-    }
-  }
-
-  return GrabToPan;
-})();
-
-var HandTool = {
-  initialize: function handToolInitialize(options) {
-    var toggleHandTool = options.toggleHandTool;
-    this.handTool = new GrabToPan({
-      element: options.container,
-      onActiveChanged: function (isActive) {
-        if (!toggleHandTool) {
-          return;
-        }
-        if (isActive) {
-          toggleHandTool.title =
-            mozL10n.get('hand_tool_disable.title', null, 'Disable hand tool');
-          toggleHandTool.firstElementChild.textContent =
-            mozL10n.get('hand_tool_disable_label', null, 'Disable hand tool');
-        } else {
-          toggleHandTool.title =
-            mozL10n.get('hand_tool_enable.title', null, 'Enable hand tool');
-          toggleHandTool.firstElementChild.textContent =
-            mozL10n.get('hand_tool_enable_label', null, 'Enable hand tool');
-        }
-      }
-    });
-    if (toggleHandTool) {
-      toggleHandTool.addEventListener('click', this.toggle.bind(this), false);
-
-      window.addEventListener('localized', function (evt) {
-        Preferences.get('enableHandToolOnLoad').then(function resolved(value) {
-          if (value) {
-            this.handTool.activate();
-          }
-        }.bind(this), function rejected(reason) { });
-      }.bind(this));
-
-      window.addEventListener('presentationmodechanged', function (evt) {
-        if (evt.detail.switchInProgress) {
-          return;
-        }
-        if (evt.detail.active) {
-          this.enterPresentationMode();
-        } else {
-          this.exitPresentationMode();
-        }
-      }.bind(this));
-    }
-  },
-
-  toggle: function handToolToggle() {
-    this.handTool.toggle();
-    SecondaryToolbar.close();
-  },
-
-  enterPresentationMode: function handToolEnterPresentationMode() {
-    if (this.handTool.active) {
-      this.wasActive = true;
-      this.handTool.deactivate();
-    }
-  },
-
-  exitPresentationMode: function handToolExitPresentationMode() {
-    if (this.wasActive) {
-      this.wasActive = null;
-      this.handTool.activate();
-    }
-  }
-};
-
-
-var OverlayManager = {
-  overlays: {},
-  active: null,
-
-  /**
-   * @param {string} name The name of the overlay that is registered. This must
-   *                 be equal to the ID of the overlay's DOM element.
-   * @param {function} callerCloseMethod (optional) The method that, if present,
-   *                   will call OverlayManager.close from the Object
-   *                   registering the overlay. Access to this method is
-   *                   necessary in order to run cleanup code when e.g.
-   *                   the overlay is force closed. The default is null.
-   * @param {boolean} canForceClose (optional) Indicates if opening the overlay
-   *                  will close an active overlay. The default is false.
-   * @returns {Promise} A promise that is resolved when the overlay has been
-   *                    registered.
-   */
-  register: function overlayManagerRegister(name,
-    callerCloseMethod, canForceClose) {
-    return new Promise(function (resolve) {
-      var element, container;
-      if (!name || !(element = document.getElementById(name)) ||
-        !(container = element.parentNode)) {
-        throw new Error('Not enough parameters.');
-      } else if (this.overlays[name]) {
-        throw new Error('The overlay is already registered.');
-      }
-      this.overlays[name] = {
-        element: element,
-        container: container,
-        callerCloseMethod: (callerCloseMethod || null),
-        canForceClose: (canForceClose || false)
-      };
-      resolve();
-    }.bind(this));
-  },
-
-  /**
-   * @param {string} name The name of the overlay that is unregistered.
-   * @returns {Promise} A promise that is resolved when the overlay has been
-   *                    unregistered.
-   */
-  unregister: function overlayManagerUnregister(name) {
-    return new Promise(function (resolve) {
-      if (!this.overlays[name]) {
-        throw new Error('The overlay does not exist.');
-      } else if (this.active === name) {
-        throw new Error('The overlay cannot be removed while it is active.');
-      }
-      delete this.overlays[name];
-
-      resolve();
-    }.bind(this));
-  },
-
-  /**
-   * @param {string} name The name of the overlay that should be opened.
-   * @returns {Promise} A promise that is resolved when the overlay has been
-   *                    opened.
-   */
-  open: function overlayManagerOpen(name) {
-    return new Promise(function (resolve) {
-      if (!this.overlays[name]) {
-        throw new Error('The overlay does not exist.');
-      } else if (this.active) {
-        if (this.overlays[name].canForceClose) {
-          this._closeThroughCaller();
-        } else if (this.active === name) {
-          throw new Error('The overlay is already active.');
-        } else {
-          throw new Error('Another overlay is currently active.');
-        }
-      }
-      this.active = name;
-      this.overlays[this.active].element.classList.remove('hidden');
-      this.overlays[this.active].container.classList.remove('hidden');
-
-      window.addEventListener('keydown', this._keyDown);
-      resolve();
-    }.bind(this));
-  },
-
-  /**
-   * @param {string} name The name of the overlay that should be closed.
-   * @returns {Promise} A promise that is resolved when the overlay has been
-   *                    closed.
-   */
-  close: function overlayManagerClose(name) {
-    return new Promise(function (resolve) {
-      if (!this.overlays[name]) {
-        throw new Error('The overlay does not exist.');
-      } else if (!this.active) {
-        throw new Error('The overlay is currently not active.');
-      } else if (this.active !== name) {
-        throw new Error('Another overlay is currently active.');
-      }
-      this.overlays[this.active].container.classList.add('hidden');
-      this.overlays[this.active].element.classList.add('hidden');
-      this.active = null;
-
-      window.removeEventListener('keydown', this._keyDown);
-      resolve();
-    }.bind(this));
-  },
-
-  /**
-   * @private
-   */
-  _keyDown: function overlayManager_keyDown(evt) {
-    var self = OverlayManager;
-    if (self.active && evt.keyCode === 27) { // Esc key.
-      self._closeThroughCaller();
-      evt.preventDefault();
-    }
-  },
-
-  /**
-   * @private
-   */
-  _closeThroughCaller: function overlayManager_closeThroughCaller() {
-    if (this.overlays[this.active].callerCloseMethod) {
-      this.overlays[this.active].callerCloseMethod();
-    }
-    if (this.active) {
-      this.close(this.active);
-    }
-  }
-};
-
-
-var PasswordPrompt = {
-  overlayName: null,
-  updatePassword: null,
-  reason: null,
-  passwordField: null,
-  passwordText: null,
-  passwordSubmit: null,
-  passwordCancel: null,
-
-  initialize: function secondaryToolbarInitialize(options) {
-    this.overlayName = options.overlayName;
-    this.passwordField = options.passwordField;
-    this.passwordText = options.passwordText;
-    this.passwordSubmit = options.passwordSubmit;
-    this.passwordCancel = options.passwordCancel;
-
-    // Attach the event listeners.
-    this.passwordSubmit.addEventListener('click',
-      this.verifyPassword.bind(this));
-
-    this.passwordCancel.addEventListener('click', this.close.bind(this));
-
-    this.passwordField.addEventListener('keydown', function (e) {
-      if (e.keyCode === 13) { // Enter key
-        this.verifyPassword();
-      }
-    }.bind(this));
-
-    OverlayManager.register(this.overlayName, this.close.bind(this), true);
-  },
-
-  open: function passwordPromptOpen() {
-    OverlayManager.open(this.overlayName).then(function () {
-      this.passwordField.focus();
-
-      var promptString = mozL10n.get('password_label', null,
-        'Enter the password to open this PDF file.');
-
-      if (this.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD) {
-        promptString = mozL10n.get('password_invalid', null,
-          'Invalid password. Please try again.');
-      }
-
-      this.passwordText.textContent = promptString;
-    }.bind(this));
-  },
-
-  close: function passwordPromptClose() {
-    OverlayManager.close(this.overlayName).then(function () {
-      this.passwordField.value = '';
-    }.bind(this));
-  },
-
-  verifyPassword: function passwordPromptVerifyPassword() {
-    var password = this.passwordField.value;
-    if (password && password.length > 0) {
-      this.close();
-      return this.updatePassword(password);
-    }
-  }
-};
-
-
-/**
- * @typedef {Object} PDFDocumentPropertiesOptions
- * @property {string} overlayName - Name/identifier for the overlay.
- * @property {Object} fields - Names and elements of the overlay's fields.
- * @property {HTMLButtonElement} closeButton - Button for closing the overlay.
- */
-
-/**
- * @class
- */
-var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() {
-  /**
-   * @constructs PDFDocumentProperties
-   * @param {PDFDocumentPropertiesOptions} options
-   */
-  function PDFDocumentProperties(options) {
-    this.fields = options.fields;
-    this.overlayName = options.overlayName;
-
-    this.rawFileSize = 0;
-    this.url = null;
-    this.pdfDocument = null;
-
-    // Bind the event listener for the Close button.
-    if (options.closeButton) {
-      options.closeButton.addEventListener('click', this.close.bind(this));
-    }
-
-    this.dataAvailablePromise = new Promise(function (resolve) {
-      this.resolveDataAvailable = resolve;
-    }.bind(this));
-
-    OverlayManager.register(this.overlayName, this.close.bind(this));
-  }
-
-  PDFDocumentProperties.prototype = {
-    /**
-     * Open the document properties overlay.
-     */
-    open: function PDFDocumentProperties_open() {
-      Promise.all([OverlayManager.open(this.overlayName),
-      this.dataAvailablePromise]).then(function () {
-        this._getProperties();
-      }.bind(this));
-    },
-
-    /**
-     * Close the document properties overlay.
-     */
-    close: function PDFDocumentProperties_close() {
-      OverlayManager.close(this.overlayName);
-    },
-
-    /**
-     * Set the file size of the PDF document. This method is used to
-     * update the file size in the document properties overlay once it
-     * is known so we do not have to wait until the entire file is loaded.
-     *
-     * @param {number} fileSize - The file size of the PDF document.
-     */
-    setFileSize: function PDFDocumentProperties_setFileSize(fileSize) {
-      if (fileSize > 0) {
-        this.rawFileSize = fileSize;
-      }
-    },
-
-    /**
-     * Set a reference to the PDF document and the URL in order
-     * to populate the overlay fields with the document properties.
-     * Note that the overlay will contain no information if this method
-     * is not called.
-     *
-     * @param {Object} pdfDocument - A reference to the PDF document.
-     * @param {string} url - The URL of the document.
-     */
-    setDocumentAndUrl:
-      function PDFDocumentProperties_setDocumentAndUrl(pdfDocument, url) {
-        this.pdfDocument = pdfDocument;
-        this.url = url;
-        this.resolveDataAvailable();
-      },
-
-    /**
-     * @private
-     */
-    _getProperties: function PDFDocumentProperties_getProperties() {
-      if (!OverlayManager.active) {
-        // If the dialog was closed before dataAvailablePromise was resolved,
-        // don't bother updating the properties.
-        return;
-      }
-      // Get the file size (if it hasn't already been set).
-      this.pdfDocument.getDownloadInfo().then(function (data) {
-        if (data.length === this.rawFileSize) {
-          return;
-        }
-        this.setFileSize(data.length);
-        this._updateUI(this.fields['fileSize'], this._parseFileSize());
-      }.bind(this));
-
-      // Get the document properties.
-      this.pdfDocument.getMetadata().then(function (data) {
-        var content = {
-          'fileName': getPDFFileNameFromURL(this.url),
-          'fileSize': this._parseFileSize(),
-          'title': data.info.Title,
-          'author': data.info.Author,
-          'subject': data.info.Subject,
-          'keywords': data.info.Keywords,
-          'creationDate': this._parseDate(data.info.CreationDate),
-          'modificationDate': this._parseDate(data.info.ModDate),
-          'creator': data.info.Creator,
-          'producer': data.info.Producer,
-          'version': data.info.PDFFormatVersion,
-          'pageCount': this.pdfDocument.numPages
-        };
-
-        // Show the properties in the dialog.
-        for (var identifier in content) {
-          this._updateUI(this.fields[identifier], content[identifier]);
-        }
-      }.bind(this));
-    },
-
-    /**
-     * @private
-     */
-    _updateUI: function PDFDocumentProperties_updateUI(field, content) {
-      if (field && content !== undefined && content !== '') {
-        field.textContent = content;
-      }
-    },
-
-    /**
-     * @private
-     */
-    _parseFileSize: function PDFDocumentProperties_parseFileSize() {
-      var fileSize = this.rawFileSize, kb = fileSize / 1024;
-      if (!kb) {
-        return;
-      } else if (kb < 1024) {
-        return mozL10n.get('document_properties_kb', {
-          size_kb: (+kb.toPrecision(3)).toLocaleString(),
-          size_b: fileSize.toLocaleString()
-        }, '{{size_kb}} KB ({{size_b}} bytes)');
-      } else {
-        return mozL10n.get('document_properties_mb', {
-          size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),
-          size_b: fileSize.toLocaleString()
-        }, '{{size_mb}} MB ({{size_b}} bytes)');
-      }
-    },
-
-    /**
-     * @private
-     */
-    _parseDate: function PDFDocumentProperties_parseDate(inputDate) {
-      // This is implemented according to the PDF specification, but note that
-      // Adobe Reader doesn't handle changing the date to universal time
-      // and doesn't use the user's time zone (they're effectively ignoring
-      // the HH' and mm' parts of the date string).
-      var dateToParse = inputDate;
-      if (dateToParse === undefined) {
-        return '';
-      }
-
-      // Remove the D: prefix if it is available.
-      if (dateToParse.substring(0, 2) === 'D:') {
-        dateToParse = dateToParse.substring(2);
-      }
-
-      // Get all elements from the PDF date string.
-      // JavaScript's Date object expects the month to be between
-      // 0 and 11 instead of 1 and 12, so we're correcting for this.
-      var year = parseInt(dateToParse.substring(0, 4), 10);
-      var month = parseInt(dateToParse.substring(4, 6), 10) - 1;
-      var day = parseInt(dateToParse.substring(6, 8), 10);
-      var hours = parseInt(dateToParse.substring(8, 10), 10);
-      var minutes = parseInt(dateToParse.substring(10, 12), 10);
-      var seconds = parseInt(dateToParse.substring(12, 14), 10);
-      var utRel = dateToParse.substring(14, 15);
-      var offsetHours = parseInt(dateToParse.substring(15, 17), 10);
-      var offsetMinutes = parseInt(dateToParse.substring(18, 20), 10);
-
-      // As per spec, utRel = 'Z' means equal to universal time.
-      // The other cases ('-' and '+') have to be handled here.
-      if (utRel === '-') {
-        hours += offsetHours;
-        minutes += offsetMinutes;
-      } else if (utRel === '+') {
-        hours -= offsetHours;
-        minutes -= offsetMinutes;
-      }
-
-      // Return the new date format from the user's locale.
-      var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));
-      var dateString = date.toLocaleDateString();
-      var timeString = date.toLocaleTimeString();
-      return mozL10n.get('document_properties_date_string',
-        { date: dateString, time: timeString },
-        '{{date}}, {{time}}');
-    }
-  };
-
-  return PDFDocumentProperties;
-})();
-
-
-var PresentationModeState = {
-  UNKNOWN: 0,
-  NORMAL: 1,
-  CHANGING: 2,
-  FULLSCREEN: 3,
-};
-
-var IGNORE_CURRENT_POSITION_ON_ZOOM = false;
-var DEFAULT_CACHE_SIZE = 10;
-
-
-var CLEANUP_TIMEOUT = 30000;
-
-var RenderingStates = {
-  INITIAL: 0,
-  RUNNING: 1,
-  PAUSED: 2,
-  FINISHED: 3
-};
-
-/**
- * Controls rendering of the views for pages and thumbnails.
- * @class
- */
-var PDFRenderingQueue = (function PDFRenderingQueueClosure() {
-  /**
-   * @constructs
-   */
-  function PDFRenderingQueue() {
-    this.pdfViewer = null;
-    this.pdfThumbnailViewer = null;
-    this.onIdle = null;
-
-    this.highestPriorityPage = null;
-    this.idleTimeout = null;
-    this.printing = false;
-    this.isThumbnailViewEnabled = false;
-  }
-
-  PDFRenderingQueue.prototype = /** @lends PDFRenderingQueue.prototype */ {
-    /**
-     * @param {PDFViewer} pdfViewer
-     */
-    setViewer: function PDFRenderingQueue_setViewer(pdfViewer) {
-      this.pdfViewer = pdfViewer;
-    },
-
-    /**
-     * @param {PDFThumbnailViewer} pdfThumbnailViewer
-     */
-    setThumbnailViewer:
-      function PDFRenderingQueue_setThumbnailViewer(pdfThumbnailViewer) {
-        this.pdfThumbnailViewer = pdfThumbnailViewer;
-      },
-
-    /**
-     * @param {IRenderableView} view
-     * @returns {boolean}
-     */
-    isHighestPriority: function PDFRenderingQueue_isHighestPriority(view) {
-      return this.highestPriorityPage === view.renderingId;
-    },
-
-    renderHighestPriority: function
-      PDFRenderingQueue_renderHighestPriority(currentlyVisiblePages) {
-      if (this.idleTimeout) {
-        clearTimeout(this.idleTimeout);
-        this.idleTimeout = null;
-      }
-
-      // Pages have a higher priority than thumbnails, so check them first.
-      if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {
-        return;
-      }
-      // No pages needed rendering so check thumbnails.
-      if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {
-        if (this.pdfThumbnailViewer.forceRendering()) {
-          return;
-        }
-      }
-
-      if (this.printing) {
-        // If printing is currently ongoing do not reschedule cleanup.
-        return;
-      }
-
-      if (this.onIdle) {
-        this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);
-      }
-    },
-
-    getHighestPriority: function
-      PDFRenderingQueue_getHighestPriority(visible, views, scrolledDown) {
-      // The state has changed figure out which page has the highest priority to
-      // render next (if any).
-      // Priority:
-      // 1 visible pages
-      // 2 if last scrolled down page after the visible pages
-      // 2 if last scrolled up page before the visible pages
-      var visibleViews = visible.views;
-
-      var numVisible = visibleViews.length;
-      if (numVisible === 0) {
-        return false;
-      }
-      for (var i = 0; i < numVisible; ++i) {
-        var view = visibleViews[i].view;
-        if (!this.isViewFinished(view)) {
-          return view;
-        }
-      }
-
-      // All the visible views have rendered, try to render next/previous pages.
-      if (scrolledDown) {
-        var nextPageIndex = visible.last.id;
-        // ID's start at 1 so no need to add 1.
-        if (views[nextPageIndex] &&
-          !this.isViewFinished(views[nextPageIndex])) {
-          return views[nextPageIndex];
-        }
-      } else {
-        var previousPageIndex = visible.first.id - 2;
-        if (views[previousPageIndex] &&
-          !this.isViewFinished(views[previousPageIndex])) {
-          return views[previousPageIndex];
-        }
-      }
-      // Everything that needs to be rendered has been.
-      return null;
-    },
-
-    /**
-     * @param {IRenderableView} view
-     * @returns {boolean}
-     */
-    isViewFinished: function PDFRenderingQueue_isViewFinished(view) {
-      return view.renderingState === RenderingStates.FINISHED;
-    },
-
-    /**
-     * Render a page or thumbnail view. This calls the appropriate function
-     * based on the views state. If the view is already rendered it will return
-     * false.
-     * @param {IRenderableView} view
-     */
-    renderView: function PDFRenderingQueue_renderView(view) {
-      var state = view.renderingState;
-      switch (state) {
-        case RenderingStates.FINISHED:
-          return false;
-        case RenderingStates.PAUSED:
-          this.highestPriorityPage = view.renderingId;
-          view.resume();
-          break;
-        case RenderingStates.RUNNING:
-          this.highestPriorityPage = view.renderingId;
-          break;
-        case RenderingStates.INITIAL:
-          this.highestPriorityPage = view.renderingId;
-          var continueRendering = function () {
-            this.renderHighestPriority();
-          }.bind(this);
-          view.draw().then(continueRendering, continueRendering);
-          break;
-      }
-      return true;
-    },
-  };
-
-  return PDFRenderingQueue;
-})();
-
-
-var TEXT_LAYER_RENDER_DELAY = 200; // ms
-
-/**
- * @typedef {Object} PDFPageViewOptions
- * @property {HTMLDivElement} container - The viewer element.
- * @property {number} id - The page unique ID (normally its number).
- * @property {number} scale - The page scale display.
- * @property {PageViewport} defaultViewport - The page viewport.
- * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.
- * @property {IPDFTextLayerFactory} textLayerFactory
- * @property {IPDFAnnotationsLayerFactory} annotationsLayerFactory
- */
-
-/**
- * @class
- * @implements {IRenderableView}
- */
-var PDFPageView = (function PDFPageViewClosure() {
-  /**
-   * @constructs PDFPageView
-   * @param {PDFPageViewOptions} options
-   */
-  function PDFPageView(options) {
-    var container = options.container;
-    var id = options.id;
-    var scale = options.scale;
-    var defaultViewport = options.defaultViewport;
-    var renderingQueue = options.renderingQueue;
-    var textLayerFactory = options.textLayerFactory;
-    var annotationsLayerFactory = options.annotationsLayerFactory;
-
-    this.id = id;
-    this.renderingId = 'page' + id;
-
-    this.rotation = 0;
-    this.scale = scale || 1.0;
-    this.viewport = defaultViewport;
-    this.pdfPageRotate = defaultViewport.rotation;
-    this.hasRestrictedScaling = false;
-
-    this.renderingQueue = renderingQueue;
-    this.textLayerFactory = textLayerFactory;
-    this.annotationsLayerFactory = annotationsLayerFactory;
-
-    this.renderingState = RenderingStates.INITIAL;
-    this.resume = null;
-
-    this.onBeforeDraw = null;
-    this.onAfterDraw = null;
-
-    this.textLayer = null;
-
-    this.zoomLayer = null;
-
-    this.annotationLayer = null;
-
-    var div = document.createElement('div');
-    div.id = 'pageContainer' + this.id;
-    div.className = 'page';
-    div.style.width = Math.floor(this.viewport.width) + 'px';
-    div.style.height = Math.floor(this.viewport.height) + 'px';
-    div.setAttribute('data-page-number', this.id);
-    this.div = div;
-
-    container.appendChild(div);
-  }
-
-  PDFPageView.prototype = {
-    setPdfPage: function PDFPageView_setPdfPage(pdfPage) {
-      this.pdfPage = pdfPage;
-      this.pdfPageRotate = pdfPage.rotate;
-      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
-      this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS,
-        totalRotation);
-      this.stats = pdfPage.stats;
-      this.reset();
-    },
-
-    destroy: function PDFPageView_destroy() {
-      this.zoomLayer = null;
-      this.reset();
-      if (this.pdfPage) {
-        this.pdfPage.destroy();
-      }
-    },
-
-    reset: function PDFPageView_reset(keepAnnotations) {
-      if (this.renderTask) {
-        this.renderTask.cancel();
-      }
-      this.resume = null;
-      this.renderingState = RenderingStates.INITIAL;
-
-      var div = this.div;
-      div.style.width = Math.floor(this.viewport.width) + 'px';
-      div.style.height = Math.floor(this.viewport.height) + 'px';
-
-      var childNodes = div.childNodes;
-      var currentZoomLayer = this.zoomLayer || null;
-      var currentAnnotationNode = (keepAnnotations && this.annotationLayer &&
-        this.annotationLayer.div) || null;
-      for (var i = childNodes.length - 1; i >= 0; i--) {
-        var node = childNodes[i];
-        if (currentZoomLayer === node || currentAnnotationNode === node) {
-          continue;
-        }
-        div.removeChild(node);
-      }
-      div.removeAttribute('data-loaded');
-
-      if (keepAnnotations) {
-        if (this.annotationLayer) {
-          // Hide annotationLayer until all elements are resized
-          // so they are not displayed on the already-resized page
-          this.annotationLayer.hide();
-        }
-      } else {
-        this.annotationLayer = null;
-      }
-
-      if (this.canvas) {
-        // Zeroing the width and height causes Firefox to release graphics
-        // resources immediately, which can greatly reduce memory consumption.
-        this.canvas.width = 0;
-        this.canvas.height = 0;
-        delete this.canvas;
-      }
-
-      this.loadingIconDiv = document.createElement('div');
-      this.loadingIconDiv.className = 'loadingIcon';
-      div.appendChild(this.loadingIconDiv);
-    },
-
-    update: function PDFPageView_update(scale, rotation) {
-      this.scale = scale || this.scale;
-
-      if (typeof rotation !== 'undefined') {
-        this.rotation = rotation;
-      }
-
-      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
-      this.viewport = this.viewport.clone({
-        scale: this.scale * CSS_UNITS,
-        rotation: totalRotation
-      });
-
-      var isScalingRestricted = false;
-      if (this.canvas && PDFJS.maxCanvasPixels > 0) {
-        var ctx = this.canvas.getContext('2d');
-        var outputScale = getOutputScale(ctx);
-        var pixelsInViewport = this.viewport.width * this.viewport.height;
-        var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);
-        if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) *
-          ((Math.floor(this.viewport.height) * outputScale.sy) | 0) >
-          PDFJS.maxCanvasPixels) {
-          isScalingRestricted = true;
-        }
-      }
-
-      if (this.canvas &&
-        (PDFJS.useOnlyCssZoom ||
-          (this.hasRestrictedScaling && isScalingRestricted))) {
-        this.cssTransform(this.canvas, true);
-        return;
-      } else if (this.canvas && !this.zoomLayer) {
-        this.zoomLayer = this.canvas.parentNode;
-        this.zoomLayer.style.position = 'absolute';
-      }
-      if (this.zoomLayer) {
-        this.cssTransform(this.zoomLayer.firstChild);
-      }
-      this.reset(true);
-    },
-
-    /**
-     * Called when moved in the parent's container.
-     */
-    updatePosition: function PDFPageView_updatePosition() {
-      if (this.textLayer) {
-        this.textLayer.render(TEXT_LAYER_RENDER_DELAY);
-      }
-    },
-
-    cssTransform: function PDFPageView_transform(canvas, redrawAnnotations) {
-      // Scale canvas, canvas wrapper, and page container.
-      var width = this.viewport.width;
-      var height = this.viewport.height;
-      var div = this.div;
-      canvas.style.width = canvas.parentNode.style.width = div.style.width =
-        Math.floor(width) + 'px';
-      canvas.style.height = canvas.parentNode.style.height = div.style.height =
-        Math.floor(height) + 'px';
-      // The canvas may have been originally rotated, rotate relative to that.
-      var relativeRotation = this.viewport.rotation - canvas._viewport.rotation;
-      var absRotation = Math.abs(relativeRotation);
-      var scaleX = 1, scaleY = 1;
-      if (absRotation === 90 || absRotation === 270) {
-        // Scale x and y because of the rotation.
-        scaleX = height / width;
-        scaleY = width / height;
-      }
-      var cssTransform = 'rotate(' + relativeRotation + 'deg) ' +
-        'scale(' + scaleX + ',' + scaleY + ')';
-      CustomStyle.setProp('transform', canvas, cssTransform);
-
-      if (this.textLayer) {
-        // Rotating the text layer is more complicated since the divs inside the
-        // the text layer are rotated.
-        // TODO: This could probably be simplified by drawing the text layer in
-        // one orientation then rotating overall.
-        var textLayerViewport = this.textLayer.viewport;
-        var textRelativeRotation = this.viewport.rotation -
-          textLayerViewport.rotation;
-        var textAbsRotation = Math.abs(textRelativeRotation);
-        var scale = width / textLayerViewport.width;
-        if (textAbsRotation === 90 || textAbsRotation === 270) {
-          scale = width / textLayerViewport.height;
-        }
-        var textLayerDiv = this.textLayer.textLayerDiv;
-        var transX, transY;
-        switch (textAbsRotation) {
-          case 0:
-            transX = transY = 0;
-            break;
-          case 90:
-            transX = 0;
-            transY = '-' + textLayerDiv.style.height;
-            break;
-          case 180:
-            transX = '-' + textLayerDiv.style.width;
-            transY = '-' + textLayerDiv.style.height;
-            break;
-          case 270:
-            transX = '-' + textLayerDiv.style.width;
-            transY = 0;
-            break;
-          default:
-            console.error('Bad rotation value.');
-            break;
-        }
-        CustomStyle.setProp('transform', textLayerDiv,
-          'rotate(' + textAbsRotation + 'deg) ' +
-          'scale(' + scale + ', ' + scale + ') ' +
-          'translate(' + transX + ', ' + transY + ')');
-        CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');
-      }
-
-      if (redrawAnnotations && this.annotationLayer) {
-        this.annotationLayer.setupAnnotations(this.viewport);
-      }
-    },
-
-    get width() {
-      return this.viewport.width;
-    },
-
-    get height() {
-      return this.viewport.height;
-    },
-
-    getPagePoint: function PDFPageView_getPagePoint(x, y) {
-      return this.viewport.convertToPdfPoint(x, y);
-    },
-
-    draw: function PDFPageView_draw() {
-      if (this.renderingState !== RenderingStates.INITIAL) {
-        console.error('Must be in new state before drawing');
-      }
-
-      this.renderingState = RenderingStates.RUNNING;
-
-      var pdfPage = this.pdfPage;
-      var viewport = this.viewport;
-      var div = this.div;
-      // Wrap the canvas so if it has a css transform for highdpi the overflow
-      // will be hidden in FF.
-      var canvasWrapper = document.createElement('div');
-      canvasWrapper.style.width = div.style.width;
-      canvasWrapper.style.height = div.style.height;
-      canvasWrapper.classList.add('canvasWrapper');
-
-      var canvas = document.createElement('canvas');
-      canvas.id = 'page' + this.id;
-      canvasWrapper.appendChild(canvas);
-      if (this.annotationLayer) {
-        // annotationLayer needs to stay on top
-        div.insertBefore(canvasWrapper, this.annotationLayer.div);
-      } else {
-        div.appendChild(canvasWrapper);
-      }
-      this.canvas = canvas;
-
-      var ctx = canvas.getContext('2d');
-      var outputScale = getOutputScale(ctx);
-
-      if (PDFJS.useOnlyCssZoom) {
-        var actualSizeViewport = viewport.clone({ scale: CSS_UNITS });
-        // Use a scale that will make the canvas be the original intended size
-        // of the page.
-        outputScale.sx *= actualSizeViewport.width / viewport.width;
-        outputScale.sy *= actualSizeViewport.height / viewport.height;
-        outputScale.scaled = true;
-      }
-
-      if (PDFJS.maxCanvasPixels > 0) {
-        var pixelsInViewport = viewport.width * viewport.height;
-        var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);
-        if (outputScale.sx > maxScale || outputScale.sy > maxScale) {
-          outputScale.sx = maxScale;
-          outputScale.sy = maxScale;
-          outputScale.scaled = true;
-          this.hasRestrictedScaling = true;
-        } else {
-          this.hasRestrictedScaling = false;
-        }
-      }
-
-      canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;
-      canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;
-      canvas.style.width = Math.floor(viewport.width) + 'px';
-      canvas.style.height = Math.floor(viewport.height) + 'px';
-      // Add the viewport so it's known what it was originally drawn with.
-      canvas._viewport = viewport;
-
-      var textLayerDiv = null;
-      var textLayer = null;
-      if (this.textLayerFactory) {
-        textLayerDiv = document.createElement('div');
-        textLayerDiv.className = 'textLayer';
-        textLayerDiv.style.width = canvas.style.width;
-        textLayerDiv.style.height = canvas.style.height;
-        if (this.annotationLayer) {
-          // annotationLayer needs to stay on top
-          div.insertBefore(textLayerDiv, this.annotationLayer.div);
-        } else {
-          div.appendChild(textLayerDiv);
-        }
-
-        textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv,
-          this.id - 1,
-          this.viewport);
-      }
-      this.textLayer = textLayer;
-
-      if (outputScale.scaled) {
-        // Used by the mozCurrentTransform polyfill in src/display/canvas.js.
-        ctx._transformMatrix = [outputScale.sx, 0, 0, outputScale.sy, 0, 0];
-        ctx.scale(outputScale.sx, outputScale.sy);
-      }
-
-      var resolveRenderPromise, rejectRenderPromise;
-      var promise = new Promise(function (resolve, reject) {
-        resolveRenderPromise = resolve;
-        rejectRenderPromise = reject;
-      });
-
-      // Rendering area
-
-      var self = this;
-      function pageViewDrawCallback(error) {
-        // The renderTask may have been replaced by a new one, so only remove
-        // the reference to the renderTask if it matches the one that is
-        // triggering this callback.
-        if (renderTask === self.renderTask) {
-          self.renderTask = null;
-        }
-
-        if (error === 'cancelled') {
-          rejectRenderPromise(error);
-          return;
-        }
-
-        self.renderingState = RenderingStates.FINISHED;
-
-        if (self.loadingIconDiv) {
-          div.removeChild(self.loadingIconDiv);
-          delete self.loadingIconDiv;
-        }
-
-        if (self.zoomLayer) {
-          div.removeChild(self.zoomLayer);
-          self.zoomLayer = null;
-        }
-
-        self.error = error;
-        self.stats = pdfPage.stats;
-        if (self.onAfterDraw) {
-          self.onAfterDraw();
-        }
-        var event = document.createEvent('CustomEvent');
-        event.initCustomEvent('pagerendered', true, true, {
-          pageNumber: self.id
-        });
-        div.dispatchEvent(event);
-        // This custom event is deprecated, and will be removed in the future,
-        // please use the |pagerendered| event instead.
-        var deprecatedEvent = document.createEvent('CustomEvent');
-        deprecatedEvent.initCustomEvent('pagerender', true, true, {
-          pageNumber: pdfPage.pageNumber
-        });
-        div.dispatchEvent(deprecatedEvent);
-
-        if (!error) {
-          resolveRenderPromise(undefined);
-        } else {
-          rejectRenderPromise(error);
-        }
-      }
-
-      var renderContinueCallback = null;
-      if (this.renderingQueue) {
-        renderContinueCallback = function renderContinueCallback(cont) {
-          if (!self.renderingQueue.isHighestPriority(self)) {
-            self.renderingState = RenderingStates.PAUSED;
-            self.resume = function resumeCallback() {
-              self.renderingState = RenderingStates.RUNNING;
-              cont();
-            };
-            return;
-          }
-          cont();
-        };
-      }
-
-      var renderContext = {
-        canvasContext: ctx,
-        viewport: this.viewport,
-        // intent: 'default', // === 'display'
-        continueCallback: renderContinueCallback
-      };
-      var renderTask = this.renderTask = this.pdfPage.render(renderContext);
-
-      this.renderTask.promise.then(
-        function pdfPageRenderCallback() {
-          pageViewDrawCallback(null);
-          if (textLayer) {
-            self.pdfPage.getTextContent().then(
-              function textContentResolved(textContent) {
-                textLayer.setTextContent(textContent);
-                textLayer.render(TEXT_LAYER_RENDER_DELAY);
-              }
-            );
-          }
-        },
-        function pdfPageRenderError(error) {
-          pageViewDrawCallback(error);
-        }
-      );
-
-      if (this.annotationsLayerFactory) {
-        if (!this.annotationLayer) {
-          this.annotationLayer = this.annotationsLayerFactory.
-            createAnnotationsLayerBuilder(div, this.pdfPage);
-        }
-        this.annotationLayer.setupAnnotations(this.viewport);
-      }
-      div.setAttribute('data-loaded', true);
-
-      if (self.onBeforeDraw) {
-        self.onBeforeDraw();
-      }
-      return promise;
-    },
-
-    beforePrint: function PDFPageView_beforePrint() {
-      var pdfPage = this.pdfPage;
-
-      var viewport = pdfPage.getViewport(1);
-      // Use the same hack we use for high dpi displays for printing to get
-      // better output until bug 811002 is fixed in FF.
-      var PRINT_OUTPUT_SCALE = 2;
-      var canvas = document.createElement('canvas');
-
-      // The logical size of the canvas.
-      canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE;
-      canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE;
-
-      // The rendered size of the canvas, relative to the size of canvasWrapper.
-      canvas.style.width = (PRINT_OUTPUT_SCALE * 100) + '%';
-      canvas.style.height = (PRINT_OUTPUT_SCALE * 100) + '%';
-
-      var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' +
-        (1 / PRINT_OUTPUT_SCALE) + ')';
-      CustomStyle.setProp('transform', canvas, cssScale);
-      CustomStyle.setProp('transformOrigin', canvas, '0% 0%');
-
-      var printContainer = document.getElementById('printContainer');
-      var canvasWrapper = document.createElement('div');
-      canvasWrapper.style.width = viewport.width + 'pt';
-      canvasWrapper.style.height = viewport.height + 'pt';
-      canvasWrapper.appendChild(canvas);
-      printContainer.appendChild(canvasWrapper);
-
-      canvas.mozPrintCallback = function (obj) {
-        var ctx = obj.context;
-
-        ctx.save();
-        ctx.fillStyle = 'rgb(255, 255, 255)';
-        ctx.fillRect(0, 0, canvas.width, canvas.height);
-        ctx.restore();
-        // Used by the mozCurrentTransform polyfill in src/display/canvas.js.
-        ctx._transformMatrix =
-          [PRINT_OUTPUT_SCALE, 0, 0, PRINT_OUTPUT_SCALE, 0, 0];
-        ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE);
-
-        var renderContext = {
-          canvasContext: ctx,
-          viewport: viewport,
-          intent: 'print'
-        };
-
-        pdfPage.render(renderContext).promise.then(function () {
-          // Tell the printEngine that rendering this canvas/page has finished.
-          obj.done();
-        }, function (error) {
-          console.error(error);
-          // Tell the printEngine that rendering this canvas/page has failed.
-          // This will make the print proces stop.
-          if ('abort' in obj) {
-            obj.abort();
-          } else {
-            obj.done();
-          }
-        });
-      };
-    },
-  };
-
-  return PDFPageView;
-})();
-
-
-var MAX_TEXT_DIVS_TO_RENDER = 100000;
-
-var NonWhitespaceRegexp = /\S/;
-
-function isAllWhitespace(str) {
-  return !NonWhitespaceRegexp.test(str);
-}
-
-/**
- * @typedef {Object} TextLayerBuilderOptions
- * @property {HTMLDivElement} textLayerDiv - The text layer container.
- * @property {number} pageIndex - The page index.
- * @property {PageViewport} viewport - The viewport of the text layer.
- * @property {PDFFindController} findController
- */
-
-/**
- * TextLayerBuilder provides text-selection functionality for the PDF.
- * It does this by creating overlay divs over the PDF text. These divs
- * contain text that matches the PDF text they are overlaying. This object
- * also provides a way to highlight text that is being searched for.
- * @class
- */
-var TextLayerBuilder = (function TextLayerBuilderClosure() {
-  function TextLayerBuilder(options) {
-    this.textLayerDiv = options.textLayerDiv;
-    this.renderingDone = false;
-    this.divContentDone = false;
-    this.pageIdx = options.pageIndex;
-    this.pageNumber = this.pageIdx + 1;
-    this.matches = [];
-    this.viewport = options.viewport;
-    this.textDivs = [];
-    this.findController = options.findController || null;
-  }
-
-  TextLayerBuilder.prototype = {
-    _finishRendering: function TextLayerBuilder_finishRendering() {
-      this.renderingDone = true;
-
-      var event = document.createEvent('CustomEvent');
-      event.initCustomEvent('textlayerrendered', true, true, {
-        pageNumber: this.pageNumber
-      });
-      this.textLayerDiv.dispatchEvent(event);
-    },
-
-    renderLayer: function TextLayerBuilder_renderLayer() {
-      var textLayerFrag = document.createDocumentFragment();
-      var textDivs = this.textDivs;
-      var textDivsLength = textDivs.length;
-      var canvas = document.createElement('canvas');
-      var ctx = canvas.getContext('2d');
-
-      // No point in rendering many divs as it would make the browser
-      // unusable even after the divs are rendered.
-      if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {
-        this._finishRendering();
-        return;
-      }
-
-      var lastFontSize;
-      var lastFontFamily;
-      for (var i = 0; i < textDivsLength; i++) {
-        var textDiv = textDivs[i];
-        if (textDiv.dataset.isWhitespace !== undefined) {
-          continue;
-        }
-
-        var fontSize = textDiv.style.fontSize;
-        var fontFamily = textDiv.style.fontFamily;
-
-        // Only build font string and set to context if different from last.
-        if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) {
-          ctx.font = fontSize + ' ' + fontFamily;
-          lastFontSize = fontSize;
-          lastFontFamily = fontFamily;
-        }
-
-        var width = ctx.measureText(textDiv.textContent).width;
-        if (width > 0) {
-          textLayerFrag.appendChild(textDiv);
-          var transform;
-          if (textDiv.dataset.canvasWidth !== undefined) {
-            // Dataset values come of type string.
-            var textScale = textDiv.dataset.canvasWidth / width;
-            transform = 'scaleX(' + textScale + ')';
-          } else {
-            transform = '';
-          }
-          var rotation = textDiv.dataset.angle;
-          if (rotation) {
-            transform = 'rotate(' + rotation + 'deg) ' + transform;
-          }
-          if (transform) {
-            CustomStyle.setProp('transform', textDiv, transform);
-          }
-        }
-      }
-
-      this.textLayerDiv.appendChild(textLayerFrag);
-      this._finishRendering();
-      this.updateMatches();
-    },
-
-    /**
-     * Renders the text layer.
-     * @param {number} timeout (optional) if specified, the rendering waits
-     *   for specified amount of ms.
-     */
-    render: function TextLayerBuilder_render(timeout) {
-      if (!this.divContentDone || this.renderingDone) {
-        return;
-      }
-
-      if (this.renderTimer) {
-        clearTimeout(this.renderTimer);
-        this.renderTimer = null;
-      }
-
-      if (!timeout) { // Render right away
-        this.renderLayer();
-      } else { // Schedule
-        var self = this;
-        this.renderTimer = setTimeout(function () {
-          self.renderLayer();
-          self.renderTimer = null;
-        }, timeout);
-      }
-    },
-
-    appendText: function TextLayerBuilder_appendText(geom, styles) {
-      var style = styles[geom.fontName];
-      var textDiv = document.createElement('div');
-      this.textDivs.push(textDiv);
-      if (isAllWhitespace(geom.str)) {
-        textDiv.dataset.isWhitespace = true;
-        return;
-      }
-      var tx = PDFJS.Util.transform(this.viewport.transform, geom.transform);
-      var angle = Math.atan2(tx[1], tx[0]);
-      if (style.vertical) {
-        angle += Math.PI / 2;
-      }
-      var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));
-      var fontAscent = fontHeight;
-      if (style.ascent) {
-        fontAscent = style.ascent * fontAscent;
-      } else if (style.descent) {
-        fontAscent = (1 + style.descent) * fontAscent;
-      }
-
-      var left;
-      var top;
-      if (angle === 0) {
-        left = tx[4];
-        top = tx[5] - fontAscent;
-      } else {
-        left = tx[4] + (fontAscent * Math.sin(angle));
-        top = tx[5] - (fontAscent * Math.cos(angle));
-      }
-      textDiv.style.left = left + 'px';
-      textDiv.style.top = top + 'px';
-      textDiv.style.fontSize = fontHeight + 'px';
-      textDiv.style.fontFamily = style.fontFamily;
-
-      textDiv.textContent = geom.str;
-      // |fontName| is only used by the Font Inspector. This test will succeed
-      // when e.g. the Font Inspector is off but the Stepper is on, but it's
-      // not worth the effort to do a more accurate test.
-      if (PDFJS.pdfBug) {
-        textDiv.dataset.fontName = geom.fontName;
-      }
-      // Storing into dataset will convert number into string.
-      if (angle !== 0) {
-        textDiv.dataset.angle = angle * (180 / Math.PI);
-      }
-      // We don't bother scaling single-char text divs, because it has very
-      // little effect on text highlighting. This makes scrolling on docs with
-      // lots of such divs a lot faster.
-      if (textDiv.textContent.length > 1) {
-        if (style.vertical) {
-          textDiv.dataset.canvasWidth = geom.height * this.viewport.scale;
-        } else {
-          textDiv.dataset.canvasWidth = geom.width * this.viewport.scale;
-        }
-      }
-    },
-
-    setTextContent: function TextLayerBuilder_setTextContent(textContent) {
-      this.textContent = textContent;
-
-      var textItems = textContent.items;
-      for (var i = 0, len = textItems.length; i < len; i++) {
-        this.appendText(textItems[i], textContent.styles);
-      }
-      this.divContentDone = true;
-    },
-
-    convertMatches: function TextLayerBuilder_convertMatches(matches) {
-      var i = 0;
-      var iIndex = 0;
-      var bidiTexts = this.textContent.items;
-      var end = bidiTexts.length - 1;
-      var queryLen = (this.findController === null ?
-        0 : this.findController.state.query.length);
-      var ret = [];
-
-      for (var m = 0, len = matches.length; m < len; m++) {
-        // Calculate the start position.
-        var matchIdx = matches[m];
-
-        // Loop over the divIdxs.
-        while (i !== end && matchIdx >= (iIndex + bidiTexts[i].str.length)) {
-          iIndex += bidiTexts[i].str.length;
-          i++;
-        }
-
-        if (i === bidiTexts.length) {
-          console.error('Could not find a matching mapping');
-        }
-
-        var match = {
-          begin: {
-            divIdx: i,
-            offset: matchIdx - iIndex
-          }
-        };
-
-        // Calculate the end position.
-        matchIdx += queryLen;
-
-        // Somewhat the same array as above, but use > instead of >= to get
-        // the end position right.
-        while (i !== end && matchIdx > (iIndex + bidiTexts[i].str.length)) {
-          iIndex += bidiTexts[i].str.length;
-          i++;
-        }
-
-        match.end = {
-          divIdx: i,
-          offset: matchIdx - iIndex
-        };
-        ret.push(match);
-      }
-
-      return ret;
-    },
-
-    renderMatches: function TextLayerBuilder_renderMatches(matches) {
-      // Early exit if there is nothing to render.
-      if (matches.length === 0) {
-        return;
-      }
-
-      var bidiTexts = this.textContent.items;
-      var textDivs = this.textDivs;
-      var prevEnd = null;
-      var pageIdx = this.pageIdx;
-      var isSelectedPage = (this.findController === null ?
-        false : (pageIdx === this.findController.selected.pageIdx));
-      var selectedMatchIdx = (this.findController === null ?
-        -1 : this.findController.selected.matchIdx);
-      var highlightAll = (this.findController === null ?
-        false : this.findController.state.highlightAll);
-      var infinity = {
-        divIdx: -1,
-        offset: undefined
-      };
-
-      function beginText(begin, className) {
-        var divIdx = begin.divIdx;
-        textDivs[divIdx].textContent = '';
-        appendTextToDiv(divIdx, 0, begin.offset, className);
-      }
-
-      function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
-        var div = textDivs[divIdx];
-        var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset);
-        var node = document.createTextNode(content);
-        if (className) {
-          var span = document.createElement('span');
-          span.className = className;
-          span.appendChild(node);
-          div.appendChild(span);
-          return;
-        }
-        div.appendChild(node);
-      }
-
-      var i0 = selectedMatchIdx, i1 = i0 + 1;
-      if (highlightAll) {
-        i0 = 0;
-        i1 = matches.length;
-      } else if (!isSelectedPage) {
-        // Not highlighting all and this isn't the selected page, so do nothing.
-        return;
-      }
-
-      for (var i = i0; i < i1; i++) {
-        var match = matches[i];
-        var begin = match.begin;
-        var end = match.end;
-        var isSelected = (isSelectedPage && i === selectedMatchIdx);
-        var highlightSuffix = (isSelected ? ' selected' : '');
-
-        if (this.findController) {
-          this.findController.updateMatchPosition(pageIdx, i, textDivs,
-            begin.divIdx, end.divIdx);
-        }
-
-        // Match inside new div.
-        if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {
-          // If there was a previous div, then add the text at the end.
-          if (prevEnd !== null) {
-            appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
-          }
-          // Clear the divs and set the content until the starting point.
-          beginText(begin);
-        } else {
-          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);
-        }
-
-        if (begin.divIdx === end.divIdx) {
-          appendTextToDiv(begin.divIdx, begin.offset, end.offset,
-            'highlight' + highlightSuffix);
-        } else {
-          appendTextToDiv(begin.divIdx, begin.offset, infinity.offset,
-            'highlight begin' + highlightSuffix);
-          for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {
-            textDivs[n0].className = 'highlight middle' + highlightSuffix;
-          }
-          beginText(end, 'highlight end' + highlightSuffix);
-        }
-        prevEnd = end;
-      }
-
-      if (prevEnd) {
-        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
-      }
-    },
-
-    updateMatches: function TextLayerBuilder_updateMatches() {
-      // Only show matches when all rendering is done.
-      if (!this.renderingDone) {
-        return;
-      }
-
-      // Clear all matches.
-      var matches = this.matches;
-      var textDivs = this.textDivs;
-      var bidiTexts = this.textContent.items;
-      var clearedUntilDivIdx = -1;
-
-      // Clear all current matches.
-      for (var i = 0, len = matches.length; i < len; i++) {
-        var match = matches[i];
-        var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);
-        for (var n = begin, end = match.end.divIdx; n <= end; n++) {
-          var div = textDivs[n];
-          div.textContent = bidiTexts[n].str;
-          div.className = '';
-        }
-        clearedUntilDivIdx = match.end.divIdx + 1;
-      }
-
-      if (this.findController === null || !this.findController.active) {
-        return;
-      }
-
-      // Convert the matches on the page controller into the match format
-      // used for the textLayer.
-      this.matches = this.convertMatches(this.findController === null ?
-        [] : (this.findController.pageMatches[this.pageIdx] || []));
-      this.renderMatches(this.matches);
-    }
-  };
-  return TextLayerBuilder;
-})();
-
-/**
- * @constructor
- * @implements IPDFTextLayerFactory
- */
-function DefaultTextLayerFactory() { }
-DefaultTextLayerFactory.prototype = {
-  /**
-   * @param {HTMLDivElement} textLayerDiv
-   * @param {number} pageIndex
-   * @param {PageViewport} viewport
-   * @returns {TextLayerBuilder}
-   */
-  createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) {
-    return new TextLayerBuilder({
-      textLayerDiv: textLayerDiv,
-      pageIndex: pageIndex,
-      viewport: viewport
-    });
-  }
-};
-
-
-/**
- * @typedef {Object} AnnotationsLayerBuilderOptions
- * @property {HTMLDivElement} pageDiv
- * @property {PDFPage} pdfPage
- * @property {IPDFLinkService} linkService
- */
-
-/**
- * @class
- */
-var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() {
-  /**
-   * @param {AnnotationsLayerBuilderOptions} options
-   * @constructs AnnotationsLayerBuilder
-   */
-  function AnnotationsLayerBuilder(options) {
-    this.pageDiv = options.pageDiv;
-    this.pdfPage = options.pdfPage;
-    this.linkService = options.linkService;
-
-    this.div = null;
-  }
-  AnnotationsLayerBuilder.prototype =
-      /** @lends AnnotationsLayerBuilder.prototype */ {
-
-    /**
-     * @param {PageViewport} viewport
-     */
-    setupAnnotations:
-      function AnnotationsLayerBuilder_setupAnnotations(viewport) {
-        function bindLink(link, dest) {
-          link.href = linkService.getDestinationHash(dest);
-          link.onclick = function annotationsLayerBuilderLinksOnclick() {
-            if (dest) {
-              linkService.navigateTo(dest);
-            }
-            return false;
-          };
-          if (dest) {
-            link.className = 'internalLink';
-          }
-        }
-
-        function bindNamedAction(link, action) {
-          link.href = linkService.getAnchorUrl('');
-          link.onclick = function annotationsLayerBuilderNamedActionOnClick() {
-            linkService.executeNamedAction(action);
-            return false;
-          };
-          link.className = 'internalLink';
-        }
-
-        var linkService = this.linkService;
-        var pdfPage = this.pdfPage;
-        var self = this;
-
-        pdfPage.getAnnotations().then(function (annotationsData) {
-          viewport = viewport.clone({ dontFlip: true });
-          var transform = viewport.transform;
-          var transformStr = 'matrix(' + transform.join(',') + ')';
-          var data, element, i, ii;
-
-          if (self.div) {
-            // If an annotationLayer already exists, refresh its children's
-            // transformation matrices
-            for (i = 0, ii = annotationsData.length; i < ii; i++) {
-              data = annotationsData[i];
-              element = self.div.querySelector(
-                '[data-annotation-id="' + data.id + '"]');
-              if (element) {
-                CustomStyle.setProp('transform', element, transformStr);
-              }
-            }
-            // See PDFPageView.reset()
-            self.div.removeAttribute('hidden');
-          } else {
-            for (i = 0, ii = annotationsData.length; i < ii; i++) {
-              data = annotationsData[i];
-              if (!data || !data.hasHtml) {
-                continue;
-              }
-
-              element = PDFJS.AnnotationUtils.getHtmlElement(data,
-                pdfPage.commonObjs);
-              element.setAttribute('data-annotation-id', data.id);
-              if (typeof mozL10n !== 'undefined') {
-                mozL10n.translate(element);
-              }
-
-              var rect = data.rect;
-              var view = pdfPage.view;
-              rect = PDFJS.Util.normalizeRect([
-                rect[0],
-                view[3] - rect[1] + view[1],
-                rect[2],
-                view[3] - rect[3] + view[1]
-              ]);
-              element.style.left = rect[0] + 'px';
-              element.style.top = rect[1] + 'px';
-              element.style.position = 'absolute';
-
-              CustomStyle.setProp('transform', element, transformStr);
-              var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px';
-              CustomStyle.setProp('transformOrigin', element, transformOriginStr);
-
-              if (data.subtype === 'Link' && !data.url) {
-                var link = element.getElementsByTagName('a')[0];
-                if (link) {
-                  if (data.action) {
-                    bindNamedAction(link, data.action);
-                  } else {
-                    bindLink(link, ('dest' in data) ? data.dest : null);
-                  }
-                }
-              }
-
-              if (!self.div) {
-                var annotationLayerDiv = document.createElement('div');
-                annotationLayerDiv.className = 'annotationLayer';
-                self.pageDiv.appendChild(annotationLayerDiv);
-                self.div = annotationLayerDiv;
-              }
-
-              self.div.appendChild(element);
-            }
-          }
-        });
-      },
-
-    hide: function () {
-      if (!this.div) {
-        return;
-      }
-      this.div.setAttribute('hidden', 'true');
-    }
-  };
-  return AnnotationsLayerBuilder;
-})();
-
-/**
- * @constructor
- * @implements IPDFAnnotationsLayerFactory
- */
-function DefaultAnnotationsLayerFactory() { }
-DefaultAnnotationsLayerFactory.prototype = {
-  /**
-   * @param {HTMLDivElement} pageDiv
-   * @param {PDFPage} pdfPage
-   * @returns {AnnotationsLayerBuilder}
-   */
-  createAnnotationsLayerBuilder: function (pageDiv, pdfPage) {
-    return new AnnotationsLayerBuilder({
-      pageDiv: pageDiv,
-      pdfPage: pdfPage
-    });
-  }
-};
-
-
-/**
- * @typedef {Object} PDFViewerOptions
- * @property {HTMLDivElement} container - The container for the viewer element.
- * @property {HTMLDivElement} viewer - (optional) The viewer element.
- * @property {IPDFLinkService} linkService - The navigation/linking service.
- * @property {PDFRenderingQueue} renderingQueue - (optional) The rendering
- *   queue object.
- * @property {boolean} removePageBorders - (optional) Removes the border shadow
- *   around the pages. The default is false.
- */
-
-/**
- * Simple viewer control to display PDF content/pages.
- * @class
- * @implements {IRenderableView}
- */
-var PDFViewer = (function pdfViewer() {
-  function PDFPageViewBuffer(size) {
-    var data = [];
-    this.push = function cachePush(view) {
-      var i = data.indexOf(view);
-      if (i >= 0) {
-        data.splice(i, 1);
-      }
-      data.push(view);
-      if (data.length > size) {
-        data.shift().destroy();
-      }
-    };
-    this.resize = function (newSize) {
-      size = newSize;
-      while (data.length > size) {
-        data.shift().destroy();
-      }
-    };
-  }
-
-  /**
-   * @constructs PDFViewer
-   * @param {PDFViewerOptions} options
-   */
-  function PDFViewer(options) {
-    this.container = options.container;
-    this.viewer = options.viewer || options.container.firstElementChild;
-    this.linkService = options.linkService || new SimpleLinkService(this);
-    this.removePageBorders = options.removePageBorders || false;
-
-    this.defaultRenderingQueue = !options.renderingQueue;
-    if (this.defaultRenderingQueue) {
-      // Custom rendering queue is not specified, using default one
-      this.renderingQueue = new PDFRenderingQueue();
-      this.renderingQueue.setViewer(this);
-    } else {
-      this.renderingQueue = options.renderingQueue;
-    }
-
-    this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this));
-    this.updateInProgress = false;
-    this.presentationModeState = PresentationModeState.UNKNOWN;
-    this._resetView();
-
-    if (this.removePageBorders) {
-      this.viewer.classList.add('removePageBorders');
-    }
-  }
-
-  PDFViewer.prototype = /** @lends PDFViewer.prototype */{
-    get pagesCount() {
-      return this._pages.length;
-    },
-
-    getPageView: function (index) {
-      return this._pages[index];
-    },
-
-    get currentPageNumber() {
-      return this._currentPageNumber;
-    },
-
-    set currentPageNumber(val) {
-      if (!this.pdfDocument) {
-        this._currentPageNumber = val;
-        return;
-      }
-
-      var event = document.createEvent('UIEvents');
-      event.initUIEvent('pagechange', true, true, window, 0);
-      event.updateInProgress = this.updateInProgress;
-
-      if (!(0 < val && val <= this.pagesCount)) {
-        event.pageNumber = this._currentPageNumber;
-        event.previousPageNumber = val;
-        this.container.dispatchEvent(event);
-        return;
-      }
-
-      event.previousPageNumber = this._currentPageNumber;
-      this._currentPageNumber = val;
-      event.pageNumber = val;
-      this.container.dispatchEvent(event);
-    },
-
-    /**
-     * @returns {number}
-     */
-    get currentScale() {
-      return this._currentScale;
-    },
-
-    /**
-     * @param {number} val - Scale of the pages in percents.
-     */
-    set currentScale(val) {
-      if (isNaN(val)) {
-        throw new Error('Invalid numeric scale');
-      }
-      if (!this.pdfDocument) {
-        this._currentScale = val;
-        this._currentScaleValue = val.toString();
-        return;
-      }
-      this._setScale(val, false);
-    },
-
-    /**
-     * @returns {string}
-     */
-    get currentScaleValue() {
-      return this._currentScaleValue;
-    },
-
-    /**
-     * @param val - The scale of the pages (in percent or predefined value).
-     */
-    set currentScaleValue(val) {
-      if (!this.pdfDocument) {
-        this._currentScale = isNaN(val) ? UNKNOWN_SCALE : val;
-        this._currentScaleValue = val;
-        return;
-      }
-      this._setScale(val, false);
-    },
-
-    /**
-     * @returns {number}
-     */
-    get pagesRotation() {
-      return this._pagesRotation;
-    },
-
-    /**
-     * @param {number} rotation - The rotation of the pages (0, 90, 180, 270).
-     */
-    set pagesRotation(rotation) {
-      this._pagesRotation = rotation;
-
-      for (var i = 0, l = this._pages.length; i < l; i++) {
-        var pageView = this._pages[i];
-        pageView.update(pageView.scale, rotation);
-      }
-
-      this._setScale(this._currentScaleValue, true);
-    },
-
-    /**
-     * @param pdfDocument {PDFDocument}
-     */
-    setDocument: function (pdfDocument) {
-      if (this.pdfDocument) {
-        this._resetView();
-      }
-
-      this.pdfDocument = pdfDocument;
-      if (!pdfDocument) {
-        return;
-      }
-
-      var pagesCount = pdfDocument.numPages;
-      var pagesRefMap = this.pagesRefMap = {};
-      var self = this;
-
-      var resolvePagesPromise;
-      var pagesPromise = new Promise(function (resolve) {
-        resolvePagesPromise = resolve;
-      });
-      this.pagesPromise = pagesPromise;
-      pagesPromise.then(function () {
-        var event = document.createEvent('CustomEvent');
-        event.initCustomEvent('pagesloaded', true, true, {
-          pagesCount: pagesCount
-        });
-        self.container.dispatchEvent(event);
-      });
-
-      var isOnePageRenderedResolved = false;
-      var resolveOnePageRendered = null;
-      var onePageRendered = new Promise(function (resolve) {
-        resolveOnePageRendered = resolve;
-      });
-      this.onePageRendered = onePageRendered;
-
-      var bindOnAfterAndBeforeDraw = function (pageView) {
-        pageView.onBeforeDraw = function pdfViewLoadOnBeforeDraw() {
-          // Add the page to the buffer at the start of drawing. That way it can
-          // be evicted from the buffer and destroyed even if we pause its
-          // rendering.
-          self._buffer.push(this);
-        };
-        // when page is painted, using the image as thumbnail base
-        pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() {
-          if (!isOnePageRenderedResolved) {
-            isOnePageRenderedResolved = true;
-            resolveOnePageRendered();
-          }
-        };
-      };
-
-      var firstPagePromise = pdfDocument.getPage(1);
-      this.firstPagePromise = firstPagePromise;
-
-      // Fetch a single page so we can get a viewport that will be the default
-      // viewport for all pages
-      return firstPagePromise.then(function (pdfPage) {
-        var scale = this._currentScale || 1.0;
-        var viewport = pdfPage.getViewport(scale * CSS_UNITS);
-        for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
-          var textLayerFactory = null;
-          if (!PDFJS.disableTextLayer) {
-            textLayerFactory = this;
-          }
-          var pageView = new PDFPageView({
-            container: this.viewer,
-            id: pageNum,
-            scale: scale,
-            defaultViewport: viewport.clone(),
-            renderingQueue: this.renderingQueue,
-            textLayerFactory: textLayerFactory,
-            annotationsLayerFactory: this
-          });
-          bindOnAfterAndBeforeDraw(pageView);
-          this._pages.push(pageView);
-        }
-
-        // Fetch all the pages since the viewport is needed before printing
-        // starts to create the correct size canvas. Wait until one page is
-        // rendered so we don't tie up too many resources early on.
-        onePageRendered.then(function () {
-          if (!PDFJS.disableAutoFetch) {
-            var getPagesLeft = pagesCount;
-            for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
-              pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) {
-                var pageView = self._pages[pageNum - 1];
-                if (!pageView.pdfPage) {
-                  pageView.setPdfPage(pdfPage);
-                }
-                var refStr = pdfPage.ref.num + ' ' + pdfPage.ref.gen + ' R';
-                pagesRefMap[refStr] = pageNum;
-                getPagesLeft--;
-                if (!getPagesLeft) {
-                  resolvePagesPromise();
-                }
-              }.bind(null, pageNum));
-            }
-          } else {
-            // XXX: Printing is semi-broken with auto fetch disabled.
-            resolvePagesPromise();
-          }
-        });
-
-        var event = document.createEvent('CustomEvent');
-        event.initCustomEvent('pagesinit', true, true, null);
-        self.container.dispatchEvent(event);
-
-        if (this.defaultRenderingQueue) {
-          this.update();
-        }
-
-        if (this.findController) {
-          this.findController.resolveFirstPage();
-        }
-      }.bind(this));
-    },
-
-    _resetView: function () {
-      this._pages = [];
-      this._currentPageNumber = 1;
-      this._currentScale = UNKNOWN_SCALE;
-      this._currentScaleValue = null;
-      this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);
-      this._location = null;
-      this._pagesRotation = 0;
-      this._pagesRequests = [];
-
-      var container = this.viewer;
-      while (container.hasChildNodes()) {
-        container.removeChild(container.lastChild);
-      }
-    },
-
-    _scrollUpdate: function () {
-      if (this.pagesCount === 0) {
-        return;
-      }
-      this.update();
-      for (var i = 0, ii = this._pages.length; i < ii; i++) {
-        this._pages[i].updatePosition();
-      }
-    },
-
-    _setScaleDispatchEvent: function pdfViewer_setScaleDispatchEvent(
-      newScale, newValue, preset) {
-      var event = document.createEvent('UIEvents');
-      event.initUIEvent('scalechange', true, true, window, 0);
-      event.scale = newScale;
-      if (preset) {
-        event.presetValue = newValue;
-      }
-      this.container.dispatchEvent(event);
-    },
-
-    _setScaleUpdatePages: function pdfViewer_setScaleUpdatePages(
-      newScale, newValue, noScroll, preset) {
-      this._currentScaleValue = newValue;
-      if (newScale === this._currentScale) {
-        if (preset) {
-          this._setScaleDispatchEvent(newScale, newValue, true);
-        }
-        return;
-      }
-
-      for (var i = 0, ii = this._pages.length; i < ii; i++) {
-        this._pages[i].update(newScale);
-      }
-      this._currentScale = newScale;
-
-      if (!noScroll) {
-        var page = this._currentPageNumber, dest;
-        if (this._location && !IGNORE_CURRENT_POSITION_ON_ZOOM &&
-          !(this.isInPresentationMode || this.isChangingPresentationMode)) {
-          page = this._location.pageNumber;
-          dest = [null, { name: 'XYZ' }, this._location.left,
-            this._location.top, null];
-        }
-        this.scrollPageIntoView(page, dest);
-      }
-
-      this._setScaleDispatchEvent(newScale, newValue, preset);
-    },
-
-    _setScale: function pdfViewer_setScale(value, noScroll) {
-      if (value === 'custom') {
-        return;
-      }
-      var scale = parseFloat(value);
-
-      if (scale > 0) {
-        this._setScaleUpdatePages(scale, value, noScroll, false);
-      } else {
-        var currentPage = this._pages[this._currentPageNumber - 1];
-        if (!currentPage) {
-          return;
-        }
-        var hPadding = (this.isInPresentationMode || this.removePageBorders) ?
-          0 : SCROLLBAR_PADDING;
-        var vPadding = (this.isInPresentationMode || this.removePageBorders) ?
-          0 : VERTICAL_PADDING;
-        var pageWidthScale = (this.container.clientWidth - hPadding) /
-          currentPage.width * currentPage.scale;
-        var pageHeightScale = (this.container.clientHeight - vPadding) /
-          currentPage.height * currentPage.scale;
-        switch (value) {
-          case 'page-actual':
-            scale = 1;
-            break;
-          case 'page-width':
-            scale = pageWidthScale;
-            break;
-          case 'page-height':
-            scale = pageHeightScale;
-            break;
-          case 'page-fit':
-            scale = Math.min(pageWidthScale, pageHeightScale);
-            break;
-          case 'auto':
-            var isLandscape = (currentPage.width > currentPage.height);
-            // For pages in landscape mode, fit the page height to the viewer
-            // *unless* the page would thus become too wide to fit horizontally.
-            var horizontalScale = isLandscape ?
-              Math.min(pageHeightScale, pageWidthScale) : pageWidthScale;
-            scale = Math.min(MAX_AUTO_SCALE, horizontalScale);
-            break;
-          default:
-            console.error('pdfViewSetScale: \'' + value +
-              '\' is an unknown zoom value.');
-            return;
-        }
-        this._setScaleUpdatePages(scale, value, noScroll, true);
-      }
-    },
-
-    /**
-     * Scrolls page into view.
-     * @param {number} pageNumber
-     * @param {Array} dest - (optional) original PDF destination array:
-     *   <page-ref> </XYZ|FitXXX> <args..>
-     */
-    scrollPageIntoView: function PDFViewer_scrollPageIntoView(pageNumber,
-      dest) {
-      var pageView = this._pages[pageNumber - 1];
-
-      if (this.isInPresentationMode) {
-        if (this.linkService.page !== pageView.id) {
-          // Avoid breaking getVisiblePages in presentation mode.
-          this.linkService.page = pageView.id;
-          return;
-        }
-        dest = null;
-        // Fixes the case when PDF has different page sizes.
-        this._setScale(this.currentScaleValue, true);
-      }
-      if (!dest) {
-        scrollIntoView(pageView.div);
-        return;
-      }
-
-      var x = 0, y = 0;
-      var width = 0, height = 0, widthScale, heightScale;
-      var changeOrientation = (pageView.rotation % 180 === 0 ? false : true);
-      var pageWidth = (changeOrientation ? pageView.height : pageView.width) /
-        pageView.scale / CSS_UNITS;
-      var pageHeight = (changeOrientation ? pageView.width : pageView.height) /
-        pageView.scale / CSS_UNITS;
-      var scale = 0;
-      switch (dest[1].name) {
-        case 'XYZ':
-          x = dest[2];
-          y = dest[3];
-          scale = dest[4];
-          // If x and/or y coordinates are not supplied, default to
-          // _top_ left of the page (not the obvious bottom left,
-          // since aligning the bottom of the intended page with the
-          // top of the window is rarely helpful).
-          x = x !== null ? x : 0;
-          y = y !== null ? y : pageHeight;
-          break;
-        case 'Fit':
-        case 'FitB':
-          scale = 'page-fit';
-          break;
-        case 'FitH':
-        case 'FitBH':
-          y = dest[2];
-          scale = 'page-width';
-          break;
-        case 'FitV':
-        case 'FitBV':
-          x = dest[2];
-          width = pageWidth;
-          height = pageHeight;
-          scale = 'page-height';
-          break;
-        case 'FitR':
-          x = dest[2];
-          y = dest[3];
-          width = dest[4] - x;
-          height = dest[5] - y;
-          var viewerContainer = this.container;
-          var hPadding = this.removePageBorders ? 0 : SCROLLBAR_PADDING;
-          var vPadding = this.removePageBorders ? 0 : VERTICAL_PADDING;
-
-          widthScale = (viewerContainer.clientWidth - hPadding) /
-            width / CSS_UNITS;
-          heightScale = (viewerContainer.clientHeight - vPadding) /
-            height / CSS_UNITS;
-          scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));
-          break;
-        default:
-          return;
-      }
-
-      if (scale && scale !== this.currentScale) {
-        this.currentScaleValue = scale;
-      } else if (this.currentScale === UNKNOWN_SCALE) {
-        this.currentScaleValue = DEFAULT_SCALE;
-      }
-
-      if (scale === 'page-fit' && !dest[4]) {
-        scrollIntoView(pageView.div);
-        return;
-      }
-
-      var boundingRect = [
-        pageView.viewport.convertToViewportPoint(x, y),
-        pageView.viewport.convertToViewportPoint(x + width, y + height)
-      ];
-      var left = Math.min(boundingRect[0][0], boundingRect[1][0]);
-      var top = Math.min(boundingRect[0][1], boundingRect[1][1]);
-
-      scrollIntoView(pageView.div, { left: left, top: top });
-    },
-
-    _updateLocation: function (firstPage) {
-      var currentScale = this._currentScale;
-      var currentScaleValue = this._currentScaleValue;
-      var normalizedScaleValue =
-        parseFloat(currentScaleValue) === currentScale ?
-          Math.round(currentScale * 10000) / 100 : currentScaleValue;
-
-      var pageNumber = firstPage.id;
-      var pdfOpenParams = '#page=' + pageNumber;
-      pdfOpenParams += '&zoom=' + normalizedScaleValue;
-      var currentPageView = this._pages[pageNumber - 1];
-      var container = this.container;
-      var topLeft = currentPageView.getPagePoint(
-        (container.scrollLeft - firstPage.x),
-        (container.scrollTop - firstPage.y));
-      var intLeft = Math.round(topLeft[0]);
-      var intTop = Math.round(topLeft[1]);
-      pdfOpenParams += ',' + intLeft + ',' + intTop;
-
-      this._location = {
-        pageNumber: pageNumber,
-        scale: normalizedScaleValue,
-        top: intTop,
-        left: intLeft,
-        pdfOpenParams: pdfOpenParams
-      };
-    },
-
-    update: function () {
-      var visible = this._getVisiblePages();
-      var visiblePages = visible.views;
-      if (visiblePages.length === 0) {
-        return;
-      }
-
-      this.updateInProgress = true;
-
-      var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE,
-        2 * visiblePages.length + 1);
-      this._buffer.resize(suggestedCacheSize);
-
-      this.renderingQueue.renderHighestPriority(visible);
-
-      var currentId = this.currentPageNumber;
-      var firstPage = visible.first;
-
-      for (var i = 0, ii = visiblePages.length, stillFullyVisible = false;
-        i < ii; ++i) {
-        var page = visiblePages[i];
-
-        if (page.percent < 100) {
-          break;
-        }
-        if (page.id === currentId) {
-          stillFullyVisible = true;
-          break;
-        }
-      }
-
-      if (!stillFullyVisible) {
-        currentId = visiblePages[0].id;
-      }
-
-      if (!this.isInPresentationMode) {
-        this.currentPageNumber = currentId;
-      }
-
-      this._updateLocation(firstPage);
-
-      this.updateInProgress = false;
-
-      var event = document.createEvent('UIEvents');
-      event.initUIEvent('updateviewarea', true, true, window, 0);
-      event.location = this._location;
-      this.container.dispatchEvent(event);
-    },
-
-    containsElement: function (element) {
-      return this.container.contains(element);
-    },
-
-    focus: function () {
-      this.container.focus();
-    },
-
-    get isInPresentationMode() {
-      return this.presentationModeState === PresentationModeState.FULLSCREEN;
-    },
-
-    get isChangingPresentationMode() {
-      return this.PresentationModeState === PresentationModeState.CHANGING;
-    },
-
-    get isHorizontalScrollbarEnabled() {
-      return (this.isInPresentationMode ?
-        false : (this.container.scrollWidth > this.container.clientWidth));
-    },
-
-    _getVisiblePages: function () {
-      if (!this.isInPresentationMode) {
-        return getVisibleElements(this.container, this._pages, true);
-      } else {
-        // The algorithm in getVisibleElements doesn't work in all browsers and
-        // configurations when presentation mode is active.
-        var visible = [];
-        var currentPage = this._pages[this._currentPageNumber - 1];
-        visible.push({ id: currentPage.id, view: currentPage });
-        return { first: currentPage, last: currentPage, views: visible };
-      }
-    },
-
-    cleanup: function () {
-      for (var i = 0, ii = this._pages.length; i < ii; i++) {
-        if (this._pages[i] &&
-          this._pages[i].renderingState !== RenderingStates.FINISHED) {
-          this._pages[i].reset();
-        }
-      }
-    },
-
-    /**
-     * @param {PDFPageView} pageView
-     * @returns {PDFPage}
-     * @private
-     */
-    _ensurePdfPageLoaded: function (pageView) {
-      if (pageView.pdfPage) {
-        return Promise.resolve(pageView.pdfPage);
-      }
-      var pageNumber = pageView.id;
-      if (this._pagesRequests[pageNumber]) {
-        return this._pagesRequests[pageNumber];
-      }
-      var promise = this.pdfDocument.getPage(pageNumber).then(
-        function (pdfPage) {
-          pageView.setPdfPage(pdfPage);
-          this._pagesRequests[pageNumber] = null;
-          return pdfPage;
-        }.bind(this));
-      this._pagesRequests[pageNumber] = promise;
-      return promise;
-    },
-
-    forceRendering: function (currentlyVisiblePages) {
-      var visiblePages = currentlyVisiblePages || this._getVisiblePages();
-      var pageView = this.renderingQueue.getHighestPriority(visiblePages,
-        this._pages,
-        this.scroll.down);
-      if (pageView) {
-        this._ensurePdfPageLoaded(pageView).then(function () {
-          this.renderingQueue.renderView(pageView);
-        }.bind(this));
-        return true;
-      }
-      return false;
-    },
-
-    getPageTextContent: function (pageIndex) {
-      return this.pdfDocument.getPage(pageIndex + 1).then(function (page) {
-        return page.getTextContent();
-      });
-    },
-
-    /**
-     * @param {HTMLDivElement} textLayerDiv
-     * @param {number} pageIndex
-     * @param {PageViewport} viewport
-     * @returns {TextLayerBuilder}
-     */
-    createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) {
-      return new TextLayerBuilder({
-        textLayerDiv: textLayerDiv,
-        pageIndex: pageIndex,
-        viewport: viewport,
-        findController: this.isInPresentationMode ? null : this.findController
-      });
-    },
-
-    /**
-     * @param {HTMLDivElement} pageDiv
-     * @param {PDFPage} pdfPage
-     * @returns {AnnotationsLayerBuilder}
-     */
-    createAnnotationsLayerBuilder: function (pageDiv, pdfPage) {
-      return new AnnotationsLayerBuilder({
-        pageDiv: pageDiv,
-        pdfPage: pdfPage,
-        linkService: this.linkService
-      });
-    },
-
-    setFindController: function (findController) {
-      this.findController = findController;
-    },
-  };
-
-  return PDFViewer;
-})();
-
-var SimpleLinkService = (function SimpleLinkServiceClosure() {
-  function SimpleLinkService(pdfViewer) {
-    this.pdfViewer = pdfViewer;
-  }
-  SimpleLinkService.prototype = {
-    /**
-     * @returns {number}
-     */
-    get page() {
-      return this.pdfViewer.currentPageNumber;
-    },
-    /**
-     * @param {number} value
-     */
-    set page(value) {
-      this.pdfViewer.currentPageNumber = value;
-    },
-    /**
-     * @param dest - The PDF destination object.
-     */
-    navigateTo: function (dest) { },
-    /**
-     * @param dest - The PDF destination object.
-     * @returns {string} The hyperlink to the PDF object.
-     */
-    getDestinationHash: function (dest) {
-      return '#';
-    },
-    /**
-     * @param hash - The PDF parameters/hash.
-     * @returns {string} The hyperlink to the PDF object.
-     */
-    getAnchorUrl: function (hash) {
-      return '#';
-    },
-    /**
-     * @param {string} hash
-     */
-    setHash: function (hash) { },
-    /**
-     * @param {string} action
-     */
-    executeNamedAction: function (action) { },
-  };
-  return SimpleLinkService;
-})();
-
-
-var THUMBNAIL_SCROLL_MARGIN = -19;
-
-
-var THUMBNAIL_WIDTH = 98; // px
-var THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // px
-
-/**
- * @typedef {Object} PDFThumbnailViewOptions
- * @property {HTMLDivElement} container - The viewer element.
- * @property {number} id - The thumbnail's unique ID (normally its number).
- * @property {PageViewport} defaultViewport - The page viewport.
- * @property {IPDFLinkService} linkService - The navigation/linking service.
- * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.
- */
-
-/**
- * @class
- * @implements {IRenderableView}
- */
-var PDFThumbnailView = (function PDFThumbnailViewClosure() {
-  function getTempCanvas(width, height) {
-    var tempCanvas = PDFThumbnailView.tempImageCache;
-    if (!tempCanvas) {
-      tempCanvas = document.createElement('canvas');
-      PDFThumbnailView.tempImageCache = tempCanvas;
-    }
-    tempCanvas.width = width;
-    tempCanvas.height = height;
-
-    // Since this is a temporary canvas, we need to fill the canvas with a white
-    // background ourselves. |_getPageDrawContext| uses CSS rules for this.
-    var ctx = tempCanvas.getContext('2d');
-    ctx.save();
-    ctx.fillStyle = 'rgb(255, 255, 255)';
-    ctx.fillRect(0, 0, width, height);
-    ctx.restore();
-    return tempCanvas;
-  }
-
-  /**
-   * @constructs PDFThumbnailView
-   * @param {PDFThumbnailViewOptions} options
-   */
-  function PDFThumbnailView(options) {
-    var container = options.container;
-    var id = options.id;
-    var defaultViewport = options.defaultViewport;
-    var linkService = options.linkService;
-    var renderingQueue = options.renderingQueue;
-
-    this.id = id;
-    this.renderingId = 'thumbnail' + id;
-
-    this.pdfPage = null;
-    this.rotation = 0;
-    this.viewport = defaultViewport;
-    this.pdfPageRotate = defaultViewport.rotation;
-
-    this.linkService = linkService;
-    this.renderingQueue = renderingQueue;
-
-    this.hasImage = false;
-    this.resume = null;
-    this.renderingState = RenderingStates.INITIAL;
-
-    this.pageWidth = this.viewport.width;
-    this.pageHeight = this.viewport.height;
-    this.pageRatio = this.pageWidth / this.pageHeight;
-
-    this.canvasWidth = THUMBNAIL_WIDTH;
-    this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0;
-    this.scale = this.canvasWidth / this.pageWidth;
-
-    var anchor = document.createElement('a');
-    anchor.href = linkService.getAnchorUrl('#page=' + id);
-    anchor.title = mozL10n.get('thumb_page_title', { page: id }, 'Page {{page}}');
-    anchor.onclick = function stopNavigation() {
-      linkService.page = id;
-      return false;
-    };
-
-    var div = document.createElement('div');
-    div.id = 'thumbnailContainer' + id;
-    div.className = 'thumbnail';
-    this.div = div;
-
-    if (id === 1) {
-      // Highlight the thumbnail of the first page when no page number is
-      // specified (or exists in cache) when the document is loaded.
-      div.classList.add('selected');
-    }
-
-    var ring = document.createElement('div');
-    ring.className = 'thumbnailSelectionRing';
-    var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
-    ring.style.width = this.canvasWidth + borderAdjustment + 'px';
-    ring.style.height = this.canvasHeight + borderAdjustment + 'px';
-    this.ring = ring;
-
-    div.appendChild(ring);
-    anchor.appendChild(div);
-    container.appendChild(anchor);
-  }
-
-  PDFThumbnailView.prototype = {
-    setPdfPage: function PDFThumbnailView_setPdfPage(pdfPage) {
-      this.pdfPage = pdfPage;
-      this.pdfPageRotate = pdfPage.rotate;
-      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
-      this.viewport = pdfPage.getViewport(1, totalRotation);
-      this.reset();
-    },
-
-    reset: function PDFThumbnailView_reset() {
-      if (this.renderTask) {
-        this.renderTask.cancel();
-      }
-      this.hasImage = false;
-      this.resume = null;
-      this.renderingState = RenderingStates.INITIAL;
-
-      this.pageWidth = this.viewport.width;
-      this.pageHeight = this.viewport.height;
-      this.pageRatio = this.pageWidth / this.pageHeight;
-
-      this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0;
-      this.scale = (this.canvasWidth / this.pageWidth);
-
-      this.div.removeAttribute('data-loaded');
-      var ring = this.ring;
-      var childNodes = ring.childNodes;
-      for (var i = childNodes.length - 1; i >= 0; i--) {
-        ring.removeChild(childNodes[i]);
-      }
-      var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
-      ring.style.width = this.canvasWidth + borderAdjustment + 'px';
-      ring.style.height = this.canvasHeight + borderAdjustment + 'px';
-
-      if (this.canvas) {
-        // Zeroing the width and height causes Firefox to release graphics
-        // resources immediately, which can greatly reduce memory consumption.
-        this.canvas.width = 0;
-        this.canvas.height = 0;
-        delete this.canvas;
-      }
-    },
-
-    update: function PDFThumbnailView_update(rotation) {
-      if (typeof rotation !== 'undefined') {
-        this.rotation = rotation;
-      }
-      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
-      this.viewport = this.viewport.clone({
-        scale: 1,
-        rotation: totalRotation
-      });
-      this.reset();
-    },
-
-    /**
-     * @private
-     */
-    _getPageDrawContext:
-      function PDFThumbnailView_getPageDrawContext(noCtxScale) {
-        var canvas = document.createElement('canvas');
-        canvas.id = this.renderingId;
-
-        canvas.className = 'thumbnailImage';
-        canvas.setAttribute('aria-label', mozL10n.get('thumb_page_canvas',
-          { page: this.id }, 'Thumbnail of Page {{page}}'));
-
-        this.canvas = canvas;
-        this.div.setAttribute('data-loaded', true);
-        this.ring.appendChild(canvas);
-
-        var ctx = canvas.getContext('2d');
-        var outputScale = getOutputScale(ctx);
-        canvas.width = (this.canvasWidth * outputScale.sx) | 0;
-        canvas.height = (this.canvasHeight * outputScale.sy) | 0;
-        canvas.style.width = this.canvasWidth + 'px';
-        canvas.style.height = this.canvasHeight + 'px';
-        if (!noCtxScale && outputScale.scaled) {
-          ctx.scale(outputScale.sx, outputScale.sy);
-        }
-        return ctx;
-      },
-
-    draw: function PDFThumbnailView_draw() {
-      if (this.renderingState !== RenderingStates.INITIAL) {
-        console.error('Must be in new state before drawing');
-      }
-      if (this.hasImage) {
-        return Promise.resolve(undefined);
-      }
-      this.hasImage = true;
-      this.renderingState = RenderingStates.RUNNING;
-
-      var resolveRenderPromise, rejectRenderPromise;
-      var promise = new Promise(function (resolve, reject) {
-        resolveRenderPromise = resolve;
-        rejectRenderPromise = reject;
-      });
-
-      var self = this;
-      function thumbnailDrawCallback(error) {
-        // The renderTask may have been replaced by a new one, so only remove
-        // the reference to the renderTask if it matches the one that is
-        // triggering this callback.
-        if (renderTask === self.renderTask) {
-          self.renderTask = null;
-        }
-        if (error === 'cancelled') {
-          rejectRenderPromise(error);
-          return;
-        }
-        self.renderingState = RenderingStates.FINISHED;
-
-        if (!error) {
-          resolveRenderPromise(undefined);
-        } else {
-          rejectRenderPromise(error);
-        }
-      }
-
-      var ctx = this._getPageDrawContext();
-      var drawViewport = this.viewport.clone({ scale: this.scale });
-      var renderContinueCallback = function renderContinueCallback(cont) {
-        if (!self.renderingQueue.isHighestPriority(self)) {
-          self.renderingState = RenderingStates.PAUSED;
-          self.resume = function resumeCallback() {
-            self.renderingState = RenderingStates.RUNNING;
-            cont();
-          };
-          return;
-        }
-        cont();
-      };
-
-      var renderContext = {
-        canvasContext: ctx,
-        viewport: drawViewport,
-        continueCallback: renderContinueCallback
-      };
-      var renderTask = this.renderTask = this.pdfPage.render(renderContext);
-
-      renderTask.promise.then(
-        function pdfPageRenderCallback() {
-          thumbnailDrawCallback(null);
-        },
-        function pdfPageRenderError(error) {
-          thumbnailDrawCallback(error);
-        }
-      );
-      return promise;
-    },
-
-    setImage: function PDFThumbnailView_setImage(pageView) {
-      var img = pageView.canvas;
-      if (this.hasImage || !img) {
-        return;
-      }
-      if (!this.pdfPage) {
-        this.setPdfPage(pageView.pdfPage);
-      }
-      this.hasImage = true;
-      this.renderingState = RenderingStates.FINISHED;
-
-      var ctx = this._getPageDrawContext(true);
-      var canvas = ctx.canvas;
-
-      if (img.width <= 2 * canvas.width) {
-        ctx.drawImage(img, 0, 0, img.width, img.height,
-          0, 0, canvas.width, canvas.height);
-        return;
-      }
-      // drawImage does an awful job of rescaling the image, doing it gradually.
-      var MAX_NUM_SCALING_STEPS = 3;
-      var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;
-      var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;
-      var reducedImage = getTempCanvas(reducedWidth, reducedHeight);
-      var reducedImageCtx = reducedImage.getContext('2d');
-
-      while (reducedWidth > img.width || reducedHeight > img.height) {
-        reducedWidth >>= 1;
-        reducedHeight >>= 1;
-      }
-      reducedImageCtx.drawImage(img, 0, 0, img.width, img.height,
-        0, 0, reducedWidth, reducedHeight);
-      while (reducedWidth > 2 * canvas.width) {
-        reducedImageCtx.drawImage(reducedImage,
-          0, 0, reducedWidth, reducedHeight,
-          0, 0, reducedWidth >> 1, reducedHeight >> 1);
-        reducedWidth >>= 1;
-        reducedHeight >>= 1;
-      }
-      ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight,
-        0, 0, canvas.width, canvas.height);
-    }
-  };
-
-  return PDFThumbnailView;
-})();
-
-PDFThumbnailView.tempImageCache = null;
-
-
-/**
- * @typedef {Object} PDFThumbnailViewerOptions
- * @property {HTMLDivElement} container - The container for the thumbnail
- *   elements.
- * @property {IPDFLinkService} linkService - The navigation/linking service.
- * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.
- */
-
-/**
- * Simple viewer control to display thumbnails for pages.
- * @class
- * @implements {IRenderableView}
- */
-var PDFThumbnailViewer = (function PDFThumbnailViewerClosure() {
-  /**
-   * @constructs PDFThumbnailViewer
-   * @param {PDFThumbnailViewerOptions} options
-   */
-  function PDFThumbnailViewer(options) {
-    this.container = options.container;
-    this.renderingQueue = options.renderingQueue;
-    this.linkService = options.linkService;
-
-    this.scroll = watchScroll(this.container, this._scrollUpdated.bind(this));
-    this._resetView();
-  }
-
-  PDFThumbnailViewer.prototype = {
-    /**
-     * @private
-     */
-    _scrollUpdated: function PDFThumbnailViewer_scrollUpdated() {
-      this.renderingQueue.renderHighestPriority();
-    },
-
-    getThumbnail: function PDFThumbnailViewer_getThumbnail(index) {
-      return this.thumbnails[index];
-    },
-
-    /**
-     * @private
-     */
-    _getVisibleThumbs: function PDFThumbnailViewer_getVisibleThumbs() {
-      return getVisibleElements(this.container, this.thumbnails);
-    },
-
-    scrollThumbnailIntoView:
-      function PDFThumbnailViewer_scrollThumbnailIntoView(page) {
-        var selected = document.querySelector('.thumbnail.selected');
-        if (selected) {
-          selected.classList.remove('selected');
-        }
-        var thumbnail = document.getElementById('thumbnailContainer' + page);
-        if (thumbnail) {
-          thumbnail.classList.add('selected');
-        }
-        var visibleThumbs = this._getVisibleThumbs();
-        var numVisibleThumbs = visibleThumbs.views.length;
-
-        // If the thumbnail isn't currently visible, scroll it into view.
-        if (numVisibleThumbs > 0) {
-          var first = visibleThumbs.first.id;
-          // Account for only one thumbnail being visible.
-          var last = (numVisibleThumbs > 1 ? visibleThumbs.last.id : first);
-          if (page <= first || page >= last) {
-            scrollIntoView(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN });
-          }
-        }
-      },
-
-    get pagesRotation() {
-      return this._pagesRotation;
-    },
-
-    set pagesRotation(rotation) {
-      this._pagesRotation = rotation;
-      for (var i = 0, l = this.thumbnails.length; i < l; i++) {
-        var thumb = this.thumbnails[i];
-        thumb.update(rotation);
-      }
-    },
-
-    cleanup: function PDFThumbnailViewer_cleanup() {
-      var tempCanvas = PDFThumbnailView.tempImageCache;
-      if (tempCanvas) {
-        // Zeroing the width and height causes Firefox to release graphics
-        // resources immediately, which can greatly reduce memory consumption.
-        tempCanvas.width = 0;
-        tempCanvas.height = 0;
-      }
-      PDFThumbnailView.tempImageCache = null;
-    },
-
-    /**
-     * @private
-     */
-    _resetView: function PDFThumbnailViewer_resetView() {
-      this.thumbnails = [];
-      this._pagesRotation = 0;
-      this._pagesRequests = [];
-    },
-
-    setDocument: function PDFThumbnailViewer_setDocument(pdfDocument) {
-      if (this.pdfDocument) {
-        // cleanup of the elements and views
-        var thumbsView = this.container;
-        while (thumbsView.hasChildNodes()) {
-          thumbsView.removeChild(thumbsView.lastChild);
-        }
-        this._resetView();
-      }
-
-      this.pdfDocument = pdfDocument;
-      if (!pdfDocument) {
-        return Promise.resolve();
-      }
-
-      return pdfDocument.getPage(1).then(function (firstPage) {
-        var pagesCount = pdfDocument.numPages;
-        var viewport = firstPage.getViewport(1.0);
-        for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
-          var thumbnail = new PDFThumbnailView({
-            container: this.container,
-            id: pageNum,
-            defaultViewport: viewport.clone(),
-            linkService: this.linkService,
-            renderingQueue: this.renderingQueue
-          });
-          this.thumbnails.push(thumbnail);
-        }
-      }.bind(this));
-    },
-
-    /**
-     * @param {PDFPageView} pageView
-     * @returns {PDFPage}
-     * @private
-     */
-    _ensurePdfPageLoaded:
-      function PDFThumbnailViewer_ensurePdfPageLoaded(thumbView) {
-        if (thumbView.pdfPage) {
-          return Promise.resolve(thumbView.pdfPage);
-        }
-        var pageNumber = thumbView.id;
-        if (this._pagesRequests[pageNumber]) {
-          return this._pagesRequests[pageNumber];
-        }
-        var promise = this.pdfDocument.getPage(pageNumber).then(
-          function (pdfPage) {
-            thumbView.setPdfPage(pdfPage);
-            this._pagesRequests[pageNumber] = null;
-            return pdfPage;
-          }.bind(this));
-        this._pagesRequests[pageNumber] = promise;
-        return promise;
-      },
-
-    ensureThumbnailVisible:
-      function PDFThumbnailViewer_ensureThumbnailVisible(page) {
-        // Ensure that the thumbnail of the current page is visible
-        // when switching from another view.
-        scrollIntoView(document.getElementById('thumbnailContainer' + page));
-      },
-
-    forceRendering: function () {
-      var visibleThumbs = this._getVisibleThumbs();
-      var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs,
-        this.thumbnails,
-        this.scroll.down);
-      if (thumbView) {
-        this._ensurePdfPageLoaded(thumbView).then(function () {
-          this.renderingQueue.renderView(thumbView);
-        }.bind(this));
-        return true;
-      }
-      return false;
-    }
-  };
-
-  return PDFThumbnailViewer;
-})();
-
-
-/**
- * @typedef {Object} PDFOutlineViewOptions
- * @property {HTMLDivElement} container - The viewer element.
- * @property {Array} outline - An array of outline objects.
- * @property {IPDFLinkService} linkService - The navigation/linking service.
- */
-
-/**
- * @class
- */
-var PDFOutlineView = (function PDFOutlineViewClosure() {
-  /**
-   * @constructs PDFOutlineView
-   * @param {PDFOutlineViewOptions} options
-   */
-  function PDFOutlineView(options) {
-    this.container = options.container;
-    this.outline = options.outline;
-    this.linkService = options.linkService;
-  }
-
-  PDFOutlineView.prototype = {
-    reset: function PDFOutlineView_reset() {
-      var container = this.container;
-      while (container.firstChild) {
-        container.removeChild(container.firstChild);
-      }
-    },
-
-    /**
-     * @private
-     */
-    _dispatchEvent: function PDFOutlineView_dispatchEvent(outlineCount) {
-      var event = document.createEvent('CustomEvent');
-      event.initCustomEvent('outlineloaded', true, true, {
-        outlineCount: outlineCount
-      });
-      this.container.dispatchEvent(event);
-    },
-
-    /**
-     * @private
-     */
-    _bindLink: function PDFOutlineView_bindLink(element, item) {
-      var linkService = this.linkService;
-      element.href = linkService.getDestinationHash(item.dest);
-      element.onclick = function goToDestination(e) {
-        linkService.navigateTo(item.dest);
-        return false;
-      };
-    },
-
-    render: function PDFOutlineView_render() {
-      var outline = this.outline;
-      var outlineCount = 0;
-
-      this.reset();
-
-      if (!outline) {
-        this._dispatchEvent(outlineCount);
-        return;
-      }
-
-      var queue = [{ parent: this.container, items: this.outline }];
-      while (queue.length > 0) {
-        var levelData = queue.shift();
-        for (var i = 0, len = levelData.items.length; i < len; i++) {
-          var item = levelData.items[i];
-          var div = document.createElement('div');
-          div.className = 'outlineItem';
-          var element = document.createElement('a');
-          this._bindLink(element, item);
-          element.textContent = item.title;
-          div.appendChild(element);
-
-          if (item.items.length > 0) {
-            var itemsDiv = document.createElement('div');
-            itemsDiv.className = 'outlineItems';
-            div.appendChild(itemsDiv);
-            queue.push({ parent: itemsDiv, items: item.items });
-          }
-
-          levelData.parent.appendChild(div);
-          outlineCount++;
-        }
-      }
-
-      this._dispatchEvent(outlineCount);
-    }
-  };
-
-  return PDFOutlineView;
-})();
-
-
-/**
- * @typedef {Object} PDFAttachmentViewOptions
- * @property {HTMLDivElement} container - The viewer element.
- * @property {Array} attachments - An array of attachment objects.
- * @property {DownloadManager} downloadManager - The download manager.
- */
-
-/**
- * @class
- */
-var PDFAttachmentView = (function PDFAttachmentViewClosure() {
-  /**
-   * @constructs PDFAttachmentView
-   * @param {PDFAttachmentViewOptions} options
-   */
-  function PDFAttachmentView(options) {
-    this.container = options.container;
-    this.attachments = options.attachments;
-    this.downloadManager = options.downloadManager;
-  }
-
-  PDFAttachmentView.prototype = {
-    reset: function PDFAttachmentView_reset() {
-      var container = this.container;
-      while (container.firstChild) {
-        container.removeChild(container.firstChild);
-      }
-    },
-
-    /**
-     * @private
-     */
-    _dispatchEvent: function PDFAttachmentView_dispatchEvent(attachmentsCount) {
-      var event = document.createEvent('CustomEvent');
-      event.initCustomEvent('attachmentsloaded', true, true, {
-        attachmentsCount: attachmentsCount
-      });
-      this.container.dispatchEvent(event);
-    },
-
-    /**
-     * @private
-     */
-    _bindLink: function PDFAttachmentView_bindLink(button, content, filename) {
-      button.onclick = function downloadFile(e) {
-        this.downloadManager.downloadData(content, filename, '');
-        return false;
-      }.bind(this);
-    },
-
-    render: function PDFAttachmentView_render() {
-      var attachments = this.attachments;
-      var attachmentsCount = 0;
-
-      this.reset();
-
-      if (!attachments) {
-        this._dispatchEvent(attachmentsCount);
-        return;
-      }
-
-      var names = Object.keys(attachments).sort(function (a, b) {
-        return a.toLowerCase().localeCompare(b.toLowerCase());
-      });
-      attachmentsCount = names.length;
-
-      for (var i = 0; i < attachmentsCount; i++) {
-        var item = attachments[names[i]];
-        var filename = getFileName(item.filename);
-        var div = document.createElement('div');
-        div.className = 'attachmentsItem';
-        var button = document.createElement('button');
-        this._bindLink(button, item.content, filename);
-        button.textContent = filename;
-        div.appendChild(button);
-        this.container.appendChild(div);
-      }
-
-      this._dispatchEvent(attachmentsCount);
-    }
-  };
-
-  return PDFAttachmentView;
-})();
-
-
-var PDFViewerApplication = {
-  initialBookmark: document.location.hash.substring(1),
-  initialized: false,
-  fellback: false,
-  pdfDocument: null,
-  sidebarOpen: false,
-  printing: false,
-  /** @type {PDFViewer} */
-  pdfViewer: null,
-  /** @type {PDFThumbnailViewer} */
-  pdfThumbnailViewer: null,
-  /** @type {PDFRenderingQueue} */
-  pdfRenderingQueue: null,
-  /** @type {PDFPresentationMode} */
-  pdfPresentationMode: null,
-  /** @type {PDFDocumentProperties} */
-  pdfDocumentProperties: null,
-  pageRotation: 0,
-  updateScaleControls: true,
-  isInitialViewSet: false,
-  animationStartedPromise: null,
-  preferenceSidebarViewOnLoad: SidebarView.NONE,
-  preferencePdfBugEnabled: false,
-  preferenceShowPreviousViewOnLoad: true,
-  preferenceDefaultZoomValue: '',
-  isViewerEmbedded: (window.parent !== window),
-  url: '',
-
-  // called once when the document is loaded
-  initialize: function pdfViewInitialize() {
-    var pdfRenderingQueue = new PDFRenderingQueue();
-    pdfRenderingQueue.onIdle = this.cleanup.bind(this);
-    this.pdfRenderingQueue = pdfRenderingQueue;
-
-    var container = document.getElementById('viewerContainer');
-    var viewer = document.getElementById('viewer');
-    this.pdfViewer = new PDFViewer({
-      container: container,
-      viewer: viewer,
-      renderingQueue: pdfRenderingQueue,
-      linkService: this
-    });
-    pdfRenderingQueue.setViewer(this.pdfViewer);
-
-    var thumbnailContainer = document.getElementById('thumbnailView');
-    this.pdfThumbnailViewer = new PDFThumbnailViewer({
-      container: thumbnailContainer,
-      renderingQueue: pdfRenderingQueue,
-      linkService: this
-    });
-    pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
-
-    Preferences.initialize();
-
-    this.findController = new PDFFindController({
-      pdfViewer: this.pdfViewer,
-      integratedFind: this.supportsIntegratedFind
-    });
-    this.pdfViewer.setFindController(this.findController);
-
-    this.findBar = new PDFFindBar({
-      bar: document.getElementById('findbar'),
-      toggleButton: document.getElementById('viewFind'),
-      findField: document.getElementById('findInput'),
-      highlightAllCheckbox: document.getElementById('findHighlightAll'),
-      caseSensitiveCheckbox: document.getElementById('findMatchCase'),
-      findMsg: document.getElementById('findMsg'),
-      findStatusIcon: document.getElementById('findStatusIcon'),
-      findPreviousButton: document.getElementById('findPrevious'),
-      findNextButton: document.getElementById('findNext'),
-      findController: this.findController
-    });
-
-    this.findController.setFindBar(this.findBar);
-
-    HandTool.initialize({
-      container: container,
-      toggleHandTool: document.getElementById('toggleHandTool')
-    });
-
-    this.pdfDocumentProperties = new PDFDocumentProperties({
-      overlayName: 'documentPropertiesOverlay',
-      closeButton: document.getElementById('documentPropertiesClose'),
-      fields: {
-        'fileName': document.getElementById('fileNameField'),
-        'fileSize': document.getElementById('fileSizeField'),
-        'title': document.getElementById('titleField'),
-        'author': document.getElementById('authorField'),
-        'subject': document.getElementById('subjectField'),
-        'keywords': document.getElementById('keywordsField'),
-        'creationDate': document.getElementById('creationDateField'),
-        'modificationDate': document.getElementById('modificationDateField'),
-        'creator': document.getElementById('creatorField'),
-        'producer': document.getElementById('producerField'),
-        'version': document.getElementById('versionField'),
-        'pageCount': document.getElementById('pageCountField')
-      }
-    });
-
-    SecondaryToolbar.initialize({
-      toolbar: document.getElementById('secondaryToolbar'),
-      toggleButton: document.getElementById('secondaryToolbarToggle'),
-      presentationModeButton:
-        document.getElementById('secondaryPresentationMode'),
-      openFile: document.getElementById('secondaryOpenFile'),
-      print: document.getElementById('secondaryPrint'),
-      download: document.getElementById('secondaryDownload'),
-      viewBookmark: document.getElementById('secondaryViewBookmark'),
-      firstPage: document.getElementById('firstPage'),
-      lastPage: document.getElementById('lastPage'),
-      pageRotateCw: document.getElementById('pageRotateCw'),
-      pageRotateCcw: document.getElementById('pageRotateCcw'),
-      documentPropertiesButton: document.getElementById('documentProperties')
-    });
-
-    if (this.supportsFullscreen) {
-      var toolbar = SecondaryToolbar;
-      this.pdfPresentationMode = new PDFPresentationMode({
-        container: container,
-        viewer: viewer,
-        pdfThumbnailViewer: this.pdfThumbnailViewer,
-        contextMenuItems: [
-          {
-            element: document.getElementById('contextFirstPage'),
-            handler: toolbar.firstPageClick.bind(toolbar)
-          },
-          {
-            element: document.getElementById('contextLastPage'),
-            handler: toolbar.lastPageClick.bind(toolbar)
-          },
-          {
-            element: document.getElementById('contextPageRotateCw'),
-            handler: toolbar.pageRotateCwClick.bind(toolbar)
-          },
-          {
-            element: document.getElementById('contextPageRotateCcw'),
-            handler: toolbar.pageRotateCcwClick.bind(toolbar)
-          }
-        ]
-      });
-    }
-
-    PasswordPrompt.initialize({
-      overlayName: 'passwordOverlay',
-      passwordField: document.getElementById('password'),
-      passwordText: document.getElementById('passwordText'),
-      passwordSubmit: document.getElementById('passwordSubmit'),
-      passwordCancel: document.getElementById('passwordCancel')
-    });
-
-    var self = this;
-    var initializedPromise = Promise.all([
-      Preferences.get('enableWebGL').then(function resolved(value) {
-        PDFJS.disableWebGL = !value;
-      }),
-      Preferences.get('sidebarViewOnLoad').then(function resolved(value) {
-        self.preferenceSidebarViewOnLoad = value;
-      }),
-      Preferences.get('pdfBugEnabled').then(function resolved(value) {
-        self.preferencePdfBugEnabled = value;
-      }),
-      Preferences.get('showPreviousViewOnLoad').then(function resolved(value) {
-        self.preferenceShowPreviousViewOnLoad = value;
-      }),
-      Preferences.get('defaultZoomValue').then(function resolved(value) {
-        self.preferenceDefaultZoomValue = value;
-      }),
-      Preferences.get('disableTextLayer').then(function resolved(value) {
-        if (PDFJS.disableTextLayer === true) {
-          return;
-        }
-        PDFJS.disableTextLayer = value;
-      }),
-      Preferences.get('disableRange').then(function resolved(value) {
-        if (PDFJS.disableRange === true) {
-          return;
-        }
-        PDFJS.disableRange = value;
-      }),
-      Preferences.get('disableAutoFetch').then(function resolved(value) {
-        PDFJS.disableAutoFetch = value;
-      }),
-      Preferences.get('disableFontFace').then(function resolved(value) {
-        if (PDFJS.disableFontFace === true) {
-          return;
-        }
-        PDFJS.disableFontFace = value;
-      }),
-      Preferences.get('useOnlyCssZoom').then(function resolved(value) {
-        PDFJS.useOnlyCssZoom = value;
-      })
-      // TODO move more preferences and other async stuff here
-    ]).catch(function (reason) { });
-
-    return initializedPromise.then(function () {
-      PDFViewerApplication.initialized = true;
-    });
-  },
-
-  zoomIn: function pdfViewZoomIn(ticks) {
-    var newScale = this.pdfViewer.currentScale;
-    do {
-      newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
-      newScale = Math.ceil(newScale * 10) / 10;
-      newScale = Math.min(MAX_SCALE, newScale);
-    } while (--ticks > 0 && newScale < MAX_SCALE);
-    this.setScale(newScale, true);
-  },
-
-  zoomOut: function pdfViewZoomOut(ticks) {
-    var newScale = this.pdfViewer.currentScale;
-    do {
-      newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
-      newScale = Math.floor(newScale * 10) / 10;
-      newScale = Math.max(MIN_SCALE, newScale);
-    } while (--ticks > 0 && newScale > MIN_SCALE);
-    this.setScale(newScale, true);
-  },
-
-  get currentScaleValue() {
-    return this.pdfViewer.currentScaleValue;
-  },
-
-  get pagesCount() {
-    return this.pdfDocument.numPages;
-  },
-
-  set page(val) {
-    this.pdfViewer.currentPageNumber = val;
-  },
-
-  get page() {
-    return this.pdfViewer.currentPageNumber;
-  },
-
-  get supportsPrinting() {
-    var canvas = document.createElement('canvas');
-    var value = 'mozPrintCallback' in canvas;
-
-    return PDFJS.shadow(this, 'supportsPrinting', value);
-  },
-
-  get supportsFullscreen() {
-    var doc = document.documentElement;
-    var support = !!(doc.requestFullscreen || doc.mozRequestFullScreen ||
-      doc.webkitRequestFullScreen || doc.msRequestFullscreen);
-
-    if (document.fullscreenEnabled === false ||
-      document.mozFullScreenEnabled === false ||
-      document.webkitFullscreenEnabled === false ||
-      document.msFullscreenEnabled === false) {
-      support = false;
-    }
-    if (support && PDFJS.disableFullscreen === true) {
-      support = false;
-    }
-
-    return PDFJS.shadow(this, 'supportsFullscreen', support);
-  },
-
-  get supportsIntegratedFind() {
-    var support = false;
-
-    return PDFJS.shadow(this, 'supportsIntegratedFind', support);
-  },
-
-  get supportsDocumentFonts() {
-    var support = true;
-
-    return PDFJS.shadow(this, 'supportsDocumentFonts', support);
-  },
-
-  get supportsDocumentColors() {
-    var support = true;
-
-    return PDFJS.shadow(this, 'supportsDocumentColors', support);
-  },
-
-  get loadingBar() {
-    var bar = new ProgressBar('#loadingBar', {});
-
-    return PDFJS.shadow(this, 'loadingBar', bar);
-  },
-
-
-  setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
-    this.url = url;
-    try {
-      this.setTitle(decodeURIComponent(getFileName(url)) || url);
-    } catch (e) {
-      // decodeURIComponent may throw URIError,
-      // fall back to using the unprocessed url in that case
-      this.setTitle(url);
-    }
-  },
-
-  setTitle: function pdfViewSetTitle(title) {
-    if (this.isViewerEmbedded) {
-      // Embedded PDF viewers should not be changing their parent page's title.
-      return;
-    }
-    document.title = title;
-  },
-
-  close: function pdfViewClose() {
-    var errorWrapper = document.getElementById('errorWrapper');
-    errorWrapper.setAttribute('hidden', 'true');
-
-    if (!this.pdfDocument) {
-      return;
-    }
-
-    this.pdfDocument.destroy();
-    this.pdfDocument = null;
-
-    this.pdfThumbnailViewer.setDocument(null);
-    this.pdfViewer.setDocument(null);
-
-    if (typeof PDFBug !== 'undefined') {
-      PDFBug.cleanup();
-    }
-  },
-
-  // TODO(mack): This function signature should really be pdfViewOpen(url, args)
-  open: function pdfViewOpen(file, scale, password,
-    pdfDataRangeTransport, args) {
-    if (this.pdfDocument) {
-      // Reload the preferences if a document was previously opened.
-      Preferences.reload();
-    }
-    this.close();
-
-    var parameters = { password: password };
-    if (typeof file === 'string') { // URL
-      this.setTitleUsingUrl(file);
-      parameters.url = file;
-    } else if (file && 'byteLength' in file) { // ArrayBuffer
-      parameters.data = file;
-    } else if (file.url && file.originalUrl) {
-      this.setTitleUsingUrl(file.originalUrl);
-      parameters.url = file.url;
-    }
-    if (args) {
-      for (var prop in args) {
-        parameters[prop] = args[prop];
-      }
-    }
-
-    var self = this;
-    self.loading = true;
-    self.downloadComplete = false;
-
-    var passwordNeeded = function passwordNeeded(updatePassword, reason) {
-      PasswordPrompt.updatePassword = updatePassword;
-      PasswordPrompt.reason = reason;
-      PasswordPrompt.open();
-    };
-
-    function getDocumentProgress(progressData) {
-      self.progress(progressData.loaded / progressData.total);
-    }
-
-    PDFJS.getDocument(parameters, pdfDataRangeTransport, passwordNeeded,
-      getDocumentProgress).then(
-        function getDocumentCallback(pdfDocument) {
-          self.load(pdfDocument, scale);
-          self.loading = false;
-        },
-        function getDocumentError(exception) {
-          var message = exception && exception.message;
-          var loadingErrorMessage = mozL10n.get('loading_error', null,
-            'An error occurred while loading the PDF.');
-
-          if (exception instanceof PDFJS.InvalidPDFException) {
-            // change error message also for other builds
-            loadingErrorMessage = mozL10n.get('invalid_file_error', null,
-              'Invalid or corrupted PDF file.');
-          } else if (exception instanceof PDFJS.MissingPDFException) {
-            // special message for missing PDF's
-            loadingErrorMessage = mozL10n.get('missing_file_error', null,
-              'Missing PDF file.');
-          } else if (exception instanceof PDFJS.UnexpectedResponseException) {
-            loadingErrorMessage = mozL10n.get('unexpected_response_error', null,
-              'Unexpected server response.');
-          }
-
-          var moreInfo = {
-            message: message
-          };
-          self.error(loadingErrorMessage, moreInfo);
-          self.loading = false;
-        }
-      );
-
-    if (args && args.length) {
-      PDFViewerApplication.pdfDocumentProperties.setFileSize(args.length);
-    }
-  },
-
-  download: function pdfViewDownload() {
-    function downloadByUrl() {
-      downloadManager.downloadUrl(url, filename);
-    }
-
-    var url = this.url.split('#')[0];
-    var filename = getPDFFileNameFromURL(url);
-    var downloadManager = new DownloadManager();
-    downloadManager.onerror = function (err) {
-      // This error won't really be helpful because it's likely the
-      // fallback won't work either (or is already open).
-      PDFViewerApplication.error('PDF failed to download.');
-    };
-
-    if (!this.pdfDocument) { // the PDF is not ready yet
-      downloadByUrl();
-      return;
-    }
-
-    if (!this.downloadComplete) { // the PDF is still downloading
-      downloadByUrl();
-      return;
-    }
-
-    this.pdfDocument.getData().then(
-      function getDataSuccess(data) {
-        var blob = PDFJS.createBlob(data, 'application/pdf');
-        downloadManager.download(blob, url, filename);
-      },
-      downloadByUrl // Error occurred try downloading with just the url.
-    ).then(null, downloadByUrl);
-  },
-
-  fallback: function pdfViewFallback(featureId) {
-  },
-
-  navigateTo: function pdfViewNavigateTo(dest) {
-    var destString = '';
-    var self = this;
-
-    var goToDestination = function (destRef) {
-      self.pendingRefStr = null;
-      // dest array looks like that: <page-ref> </XYZ|FitXXX> <args..>
-      var pageNumber = destRef instanceof Object ?
-        self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
-        (destRef + 1);
-      if (pageNumber) {
-        if (pageNumber > self.pagesCount) {
-          pageNumber = self.pagesCount;
-        }
-        self.pdfViewer.scrollPageIntoView(pageNumber, dest);
-
-        // Update the browsing history.
-        PDFHistory.push({ dest: dest, hash: destString, page: pageNumber });
-      } else {
-        self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {
-          var pageNum = pageIndex + 1;
-          self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] = pageNum;
-          goToDestination(destRef);
-        });
-      }
-    };
-
-    var destinationPromise;
-    if (typeof dest === 'string') {
-      destString = dest;
-      destinationPromise = this.pdfDocument.getDestination(dest);
-    } else {
-      destinationPromise = Promise.resolve(dest);
-    }
-    destinationPromise.then(function (destination) {
-      dest = destination;
-      if (!(destination instanceof Array)) {
-        return; // invalid destination
-      }
-      goToDestination(destination[0]);
-    });
-  },
-
-  executeNamedAction: function pdfViewExecuteNamedAction(action) {
-    // See PDF reference, table 8.45 - Named action
-    switch (action) {
-      case 'GoToPage':
-        document.getElementById('pageNumber').focus();
-        break;
-
-      case 'GoBack':
-        PDFHistory.back();
-        break;
-
-      case 'GoForward':
-        PDFHistory.forward();
-        break;
-
-      case 'Find':
-        if (!this.supportsIntegratedFind) {
-          this.findBar.toggle();
-        }
-        break;
-
-      case 'NextPage':
-        this.page++;
-        break;
-
-      case 'PrevPage':
-        this.page--;
-        break;
-
-      case 'LastPage':
-        this.page = this.pagesCount;
-        break;
-
-      case 'FirstPage':
-        this.page = 1;
-        break;
-
-      default:
-        break; // No action according to spec
-    }
-  },
-
-  getDestinationHash: function pdfViewGetDestinationHash(dest) {
-    if (typeof dest === 'string') {
-      return this.getAnchorUrl('#' + escape(dest));
-    }
-    if (dest instanceof Array) {
-      var destRef = dest[0]; // see navigateTo method for dest format
-      var pageNumber = destRef instanceof Object ?
-        this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
-        (destRef + 1);
-      if (pageNumber) {
-        var pdfOpenParams = this.getAnchorUrl('#page=' + pageNumber);
-        var destKind = dest[1];
-        if (typeof destKind === 'object' && 'name' in destKind &&
-          destKind.name === 'XYZ') {
-          var scale = (dest[4] || this.currentScaleValue);
-          var scaleNumber = parseFloat(scale);
-          if (scaleNumber) {
-            scale = scaleNumber * 100;
-          }
-          pdfOpenParams += '&zoom=' + scale;
-          if (dest[2] || dest[3]) {
-            pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0);
-          }
-        }
-        return pdfOpenParams;
-      }
-    }
-    return '';
-  },
-
-  /**
-   * Prefix the full url on anchor links to make sure that links are resolved
-   * relative to the current URL instead of the one defined in <base href>.
-   * @param {String} anchor The anchor hash, including the #.
-   */
-  getAnchorUrl: function getAnchorUrl(anchor) {
-    return anchor;
-  },
-
-  /**
-   * Show the error box.
-   * @param {String} message A message that is human readable.
-   * @param {Object} moreInfo (optional) Further information about the error
-   *                            that is more technical.  Should have a 'message'
-   *                            and optionally a 'stack' property.
-   */
-  error: function pdfViewError(message, moreInfo) {
-    var moreInfoText = mozL10n.get('error_version_info',
-      { version: PDFJS.version || '?', build: PDFJS.build || '?' },
-      'PDF.js v{{version}} (build: {{build}})') + '\n';
-    if (moreInfo) {
-      moreInfoText +=
-        mozL10n.get('error_message', { message: moreInfo.message },
-          'Message: {{message}}');
-      if (moreInfo.stack) {
-        moreInfoText += '\n' +
-          mozL10n.get('error_stack', { stack: moreInfo.stack },
-            'Stack: {{stack}}');
-      } else {
-        if (moreInfo.filename) {
-          moreInfoText += '\n' +
-            mozL10n.get('error_file', { file: moreInfo.filename },
-              'File: {{file}}');
-        }
-        if (moreInfo.lineNumber) {
-          moreInfoText += '\n' +
-            mozL10n.get('error_line', { line: moreInfo.lineNumber },
-              'Line: {{line}}');
-        }
-      }
-    }
-
-    var errorWrapper = document.getElementById('errorWrapper');
-    errorWrapper.removeAttribute('hidden');
-
-    var errorMessage = document.getElementById('errorMessage');
-    errorMessage.textContent = message;
-
-    var closeButton = document.getElementById('errorClose');
-    closeButton.onclick = function () {
-      errorWrapper.setAttribute('hidden', 'true');
-    };
-
-    var errorMoreInfo = document.getElementById('errorMoreInfo');
-    var moreInfoButton = document.getElementById('errorShowMore');
-    var lessInfoButton = document.getElementById('errorShowLess');
-    moreInfoButton.onclick = function () {
-      errorMoreInfo.removeAttribute('hidden');
-      moreInfoButton.setAttribute('hidden', 'true');
-      lessInfoButton.removeAttribute('hidden');
-      errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';
-    };
-    lessInfoButton.onclick = function () {
-      errorMoreInfo.setAttribute('hidden', 'true');
-      moreInfoButton.removeAttribute('hidden');
-      lessInfoButton.setAttribute('hidden', 'true');
-    };
-    moreInfoButton.oncontextmenu = noContextMenuHandler;
-    lessInfoButton.oncontextmenu = noContextMenuHandler;
-    closeButton.oncontextmenu = noContextMenuHandler;
-    moreInfoButton.removeAttribute('hidden');
-    lessInfoButton.setAttribute('hidden', 'true');
-    errorMoreInfo.value = moreInfoText;
-  },
-
-  progress: function pdfViewProgress(level) {
-    var percent = Math.round(level * 100);
-    // When we transition from full request to range requests, it's possible
-    // that we discard some of the loaded data. This can cause the loading
-    // bar to move backwards. So prevent this by only updating the bar if it
-    // increases.
-    if (percent > this.loadingBar.percent || isNaN(percent)) {
-      this.loadingBar.percent = percent;
-
-      // When disableAutoFetch is enabled, it's not uncommon for the entire file
-      // to never be fetched (depends on e.g. the file structure). In this case
-      // the loading bar will not be completely filled, nor will it be hidden.
-      // To prevent displaying a partially filled loading bar permanently, we
-      // hide it when no data has been loaded during a certain amount of time.
-      if (PDFJS.disableAutoFetch && percent) {
-        if (this.disableAutoFetchLoadingBarTimeout) {
-          clearTimeout(this.disableAutoFetchLoadingBarTimeout);
-          this.disableAutoFetchLoadingBarTimeout = null;
-        }
-        this.loadingBar.show();
-
-        this.disableAutoFetchLoadingBarTimeout = setTimeout(function () {
-          this.loadingBar.hide();
-          this.disableAutoFetchLoadingBarTimeout = null;
-        }.bind(this), DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);
-      }
-    }
-  },
-
-  load: function pdfViewLoad(pdfDocument, scale) {
-    var self = this;
-    scale = scale || UNKNOWN_SCALE;
-
-    this.findController.reset();
-
-    this.pdfDocument = pdfDocument;
-
-    this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url);
-
-    var downloadedPromise = pdfDocument.getDownloadInfo().then(function () {
-      self.downloadComplete = true;
-      self.loadingBar.hide();
-    });
-
-    var pagesCount = pdfDocument.numPages;
-    document.getElementById('numPages').textContent =
-      mozL10n.get('page_of', { pageCount: pagesCount }, 'of {{pageCount}}');
-    document.getElementById('pageNumber').max = pagesCount;
-
-    var id = this.documentFingerprint = pdfDocument.fingerprint;
-    var store = this.store = new ViewHistory(id);
-
-    var pdfViewer = this.pdfViewer;
-    pdfViewer.currentScale = scale;
-    pdfViewer.setDocument(pdfDocument);
-    var firstPagePromise = pdfViewer.firstPagePromise;
-    var pagesPromise = pdfViewer.pagesPromise;
-    var onePageRendered = pdfViewer.onePageRendered;
-
-    this.pageRotation = 0;
-    this.isInitialViewSet = false;
-    this.pagesRefMap = pdfViewer.pagesRefMap;
-
-    this.pdfThumbnailViewer.setDocument(pdfDocument);
-
-    firstPagePromise.then(function (pdfPage) {
-      downloadedPromise.then(function () {
-        var event = document.createEvent('CustomEvent');
-        event.initCustomEvent('documentload', true, true, {});
-        window.dispatchEvent(event);
-      });
-
-      self.loadingBar.setWidth(document.getElementById('viewer'));
-
-      if (!PDFJS.disableHistory && !self.isViewerEmbedded) {
-        // The browsing history is only enabled when the viewer is standalone,
-        // i.e. not when it is embedded in a web page.
-        if (!self.preferenceShowPreviousViewOnLoad && window.history.state) {
-          window.history.replaceState(null, '');
-        }
-        PDFHistory.initialize(self.documentFingerprint, self);
-      }
-
-      store.initializedPromise.then(function resolved() {
-        var storedHash = null;
-        if (self.preferenceShowPreviousViewOnLoad &&
-          store.get('exists', false)) {
-          var pageNum = store.get('page', '1');
-          var zoom = self.preferenceDefaultZoomValue ||
-            store.get('zoom', self.pdfViewer.currentScale);
-          var left = store.get('scrollLeft', '0');
-          var top = store.get('scrollTop', '0');
-
-          storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' +
-            left + ',' + top;
-        } else if (self.preferenceDefaultZoomValue) {
-          storedHash = 'page=1&zoom=' + self.preferenceDefaultZoomValue;
-        }
-        self.setInitialView(storedHash, scale);
-
-        // Make all navigation keys work on document load,
-        // unless the viewer is embedded in a web page.
-        if (!self.isViewerEmbedded) {
-          self.pdfViewer.focus();
-        }
-      }, function rejected(reason) {
-        console.error(reason);
-        self.setInitialView(null, scale);
-      });
-    });
-
-    pagesPromise.then(function () {
-      if (self.supportsPrinting) {
-        pdfDocument.getJavaScript().then(function (javaScript) {
-          if (javaScript.length) {
-            console.warn('Warning: JavaScript is not supported');
-            self.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript);
-          }
-          // Hack to support auto printing.
-          var regex = /\bprint\s*\(/g;
-          for (var i = 0, ii = javaScript.length; i < ii; i++) {
-            var js = javaScript[i];
-            if (js && regex.test(js)) {
-              setTimeout(function () {
-                window.print();
-              });
-              return;
-            }
-          }
-        });
-      }
-    });
-
-    // outline depends on pagesRefMap
-    var promises = [pagesPromise, this.animationStartedPromise];
-    Promise.all(promises).then(function () {
-      pdfDocument.getOutline().then(function (outline) {
-        var container = document.getElementById('outlineView');
-        self.outline = new PDFOutlineView({
-          container: container,
-          outline: outline,
-          linkService: self
-        });
-        self.outline.render();
-        document.getElementById('viewOutline').disabled = !outline;
-
-        if (!outline && !container.classList.contains('hidden')) {
-          self.switchSidebarView('thumbs');
-        }
-        if (outline &&
-          self.preferenceSidebarViewOnLoad === SidebarView.OUTLINE) {
-          self.switchSidebarView('outline', true);
-        }
-      });
-      pdfDocument.getAttachments().then(function (attachments) {
-        var container = document.getElementById('attachmentsView');
-        self.attachments = new PDFAttachmentView({
-          container: container,
-          attachments: attachments,
-          downloadManager: new DownloadManager()
-        });
-        self.attachments.render();
-        document.getElementById('viewAttachments').disabled = !attachments;
-
-        if (!attachments && !container.classList.contains('hidden')) {
-          self.switchSidebarView('thumbs');
-        }
-        if (attachments &&
-          self.preferenceSidebarViewOnLoad === SidebarView.ATTACHMENTS) {
-          self.switchSidebarView('attachments', true);
-        }
-      });
-    });
-
-    if (self.preferenceSidebarViewOnLoad === SidebarView.THUMBS) {
-      Promise.all([firstPagePromise, onePageRendered]).then(function () {
-        self.switchSidebarView('thumbs', true);
-      });
-    }
-
-    pdfDocument.getMetadata().then(function (data) {
-      var info = data.info, metadata = data.metadata;
-      self.documentInfo = info;
-      self.metadata = metadata;
-
-      // Provides some basic debug information
-      // console.log('PDF ' + pdfDocument.fingerprint + ' [' +
-      //   info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() +
-      //   ' / ' + (info.Creator || '-').trim() + ']' +
-      //   ' (PDF.js: ' + (PDFJS.version || '-') +
-      //   (!PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');
-
-      var pdfTitle;
-      if (metadata && metadata.has('dc:title')) {
-        var title = metadata.get('dc:title');
-        // Ghostscript sometimes return 'Untitled', sets the title to 'Untitled'
-        if (title !== 'Untitled') {
-          pdfTitle = title;
-        }
-      }
-
-      if (!pdfTitle && info && info['Title']) {
-        pdfTitle = info['Title'];
-      }
-
-      if (pdfTitle) {
-        self.setTitle(pdfTitle + ' - ' + document.title);
-      }
-
-      if (info.IsAcroFormPresent) {
-        console.warn('Warning: AcroForm/XFA is not supported');
-        self.fallback(PDFJS.UNSUPPORTED_FEATURES.forms);
-      }
-
-    });
-  },
-
-  setInitialView: function pdfViewSetInitialView(storedHash, scale) {
-    this.isInitialViewSet = true;
-
-    // When opening a new file (when one is already loaded in the viewer):
-    // Reset 'currentPageNumber', since otherwise the page's scale will be wrong
-    // if 'currentPageNumber' is larger than the number of pages in the file.
-    document.getElementById('pageNumber').value =
-      this.pdfViewer.currentPageNumber = 1;
-
-    if (PDFHistory.initialDestination) {
-      this.navigateTo(PDFHistory.initialDestination);
-      PDFHistory.initialDestination = null;
-    } else if (this.initialBookmark) {
-      this.setHash(this.initialBookmark);
-      PDFHistory.push({ hash: this.initialBookmark }, !!this.initialBookmark);
-      this.initialBookmark = null;
-    } else if (storedHash) {
-      this.setHash(storedHash);
-    } else if (scale) {
-      this.setScale(scale, true);
-      this.page = 1;
-    }
-
-    if (this.pdfViewer.currentScale === UNKNOWN_SCALE) {
-      // Scale was not initialized: invalid bookmark or scale was not specified.
-      // Setting the default one.
-      this.setScale(DEFAULT_SCALE, true);
-    }
-  },
-
-  cleanup: function pdfViewCleanup() {
-    this.pdfViewer.cleanup();
-    this.pdfThumbnailViewer.cleanup();
-    this.pdfDocument.cleanup();
-  },
-
-  forceRendering: function pdfViewForceRendering() {
-    this.pdfRenderingQueue.printing = this.printing;
-    this.pdfRenderingQueue.isThumbnailViewEnabled = this.sidebarOpen;
-    this.pdfRenderingQueue.renderHighestPriority();
-  },
-
-  setHash: function pdfViewSetHash(hash) {
-    if (!this.isInitialViewSet) {
-      this.initialBookmark = hash;
-      return;
-    }
-    if (!hash) {
-      return;
-    }
-
-    if (hash.indexOf('=') >= 0) {
-      var params = this.parseQueryString(hash);
-      // borrowing syntax from "Parameters for Opening PDF Files"
-      if ('nameddest' in params) {
-        PDFHistory.updateNextHashParam(params.nameddest);
-        this.navigateTo(params.nameddest);
-        return;
-      }
-      var pageNumber, dest;
-      if ('page' in params) {
-        pageNumber = (params.page | 0) || 1;
-      }
-      if ('zoom' in params) {
-        // Build the destination array.
-        var zoomArgs = params.zoom.split(','); // scale,left,top
-        var zoomArg = zoomArgs[0];
-        var zoomArgNumber = parseFloat(zoomArg);
-
-        if (zoomArg.indexOf('Fit') === -1) {
-          // If the zoomArg is a number, it has to get divided by 100. If it's
-          // a string, it should stay as it is.
-          dest = [null, { name: 'XYZ' },
-            zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null,
-            zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null,
-            (zoomArgNumber ? zoomArgNumber / 100 : zoomArg)];
-        } else {
-          if (zoomArg === 'Fit' || zoomArg === 'FitB') {
-            dest = [null, { name: zoomArg }];
-          } else if ((zoomArg === 'FitH' || zoomArg === 'FitBH') ||
-            (zoomArg === 'FitV' || zoomArg === 'FitBV')) {
-            dest = [null, { name: zoomArg },
-              zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null];
-          } else if (zoomArg === 'FitR') {
-            if (zoomArgs.length !== 5) {
-              console.error('pdfViewSetHash: ' +
-                'Not enough parameters for \'FitR\'.');
-            } else {
-              dest = [null, { name: zoomArg },
-                (zoomArgs[1] | 0), (zoomArgs[2] | 0),
-                (zoomArgs[3] | 0), (zoomArgs[4] | 0)];
-            }
-          } else {
-            console.error('pdfViewSetHash: \'' + zoomArg +
-              '\' is not a valid zoom value.');
-          }
-        }
-      }
-      if (dest) {
-        this.pdfViewer.scrollPageIntoView(pageNumber || this.page, dest);
-      } else if (pageNumber) {
-        this.page = pageNumber; // simple page
-      }
-      if ('pagemode' in params) {
-        if (params.pagemode === 'thumbs' || params.pagemode === 'bookmarks' ||
-          params.pagemode === 'attachments') {
-          this.switchSidebarView((params.pagemode === 'bookmarks' ?
-            'outline' : params.pagemode), true);
-        } else if (params.pagemode === 'none' && this.sidebarOpen) {
-          document.getElementById('sidebarToggle').click();
-        }
-      }
-    } else if (/^\d+$/.test(hash)) { // page number
-      this.page = hash;
-    } else { // named destination
-      PDFHistory.updateNextHashParam(unescape(hash));
-      this.navigateTo(unescape(hash));
-    }
-  },
-
-  refreshThumbnailViewer: function pdfViewRefreshThumbnailViewer() {
-    var pdfViewer = this.pdfViewer;
-    var thumbnailViewer = this.pdfThumbnailViewer;
-
-    // set thumbnail images of rendered pages
-    var pagesCount = pdfViewer.pagesCount;
-    for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) {
-      var pageView = pdfViewer.getPageView(pageIndex);
-      if (pageView && pageView.renderingState === RenderingStates.FINISHED) {
-        var thumbnailView = thumbnailViewer.getThumbnail(pageIndex);
-        thumbnailView.setImage(pageView);
-      }
-    }
-
-    thumbnailViewer.scrollThumbnailIntoView(this.page);
-  },
-
-  switchSidebarView: function pdfViewSwitchSidebarView(view, openSidebar) {
-    if (openSidebar && !this.sidebarOpen) {
-      document.getElementById('sidebarToggle').click();
-    }
-    var thumbsView = document.getElementById('thumbnailView');
-    var outlineView = document.getElementById('outlineView');
-    var attachmentsView = document.getElementById('attachmentsView');
-
-    var thumbsButton = document.getElementById('viewThumbnail');
-    var outlineButton = document.getElementById('viewOutline');
-    var attachmentsButton = document.getElementById('viewAttachments');
-
-    switch (view) {
-      case 'thumbs':
-        var wasAnotherViewVisible = thumbsView.classList.contains('hidden');
-
-        thumbsButton.classList.add('toggled');
-        outlineButton.classList.remove('toggled');
-        attachmentsButton.classList.remove('toggled');
-        thumbsView.classList.remove('hidden');
-        outlineView.classList.add('hidden');
-        attachmentsView.classList.add('hidden');
-
-        this.forceRendering();
-
-        if (wasAnotherViewVisible) {
-          this.pdfThumbnailViewer.ensureThumbnailVisible(this.page);
-        }
-        break;
-
-      case 'outline':
-        thumbsButton.classList.remove('toggled');
-        outlineButton.classList.add('toggled');
-        attachmentsButton.classList.remove('toggled');
-        thumbsView.classList.add('hidden');
-        outlineView.classList.remove('hidden');
-        attachmentsView.classList.add('hidden');
-
-        if (outlineButton.getAttribute('disabled')) {
-          return;
-        }
-        break;
-
-      case 'attachments':
-        thumbsButton.classList.remove('toggled');
-        outlineButton.classList.remove('toggled');
-        attachmentsButton.classList.add('toggled');
-        thumbsView.classList.add('hidden');
-        outlineView.classList.add('hidden');
-        attachmentsView.classList.remove('hidden');
-
-        if (attachmentsButton.getAttribute('disabled')) {
-          return;
-        }
-        break;
-    }
-  },
-
-  // Helper function to parse query string (e.g. ?param1=value&parm2=...).
-  parseQueryString: function pdfViewParseQueryString(query) {
-    var parts = query.split('&');
-    var params = {};
-    for (var i = 0, ii = parts.length; i < ii; ++i) {
-      var param = parts[i].split('=');
-      var key = param[0].toLowerCase();
-      var value = param.length > 1 ? param[1] : null;
-      params[decodeURIComponent(key)] = decodeURIComponent(value);
-    }
-    return params;
-  },
-
-  beforePrint: function pdfViewSetupBeforePrint() {
-    if (!this.supportsPrinting) {
-      var printMessage = mozL10n.get('printing_not_supported', null,
-        'Warning: Printing is not fully supported by this browser.');
-      this.error(printMessage);
-      return;
-    }
-
-    var alertNotReady = false;
-    var i, ii;
-    if (!this.pagesCount) {
-      alertNotReady = true;
-    } else {
-      for (i = 0, ii = this.pagesCount; i < ii; ++i) {
-        if (!this.pdfViewer.getPageView(i).pdfPage) {
-          alertNotReady = true;
-          break;
-        }
-      }
-    }
-    if (alertNotReady) {
-      var notReadyMessage = mozL10n.get('printing_not_ready', null,
-        'Warning: The PDF is not fully loaded for printing.');
-      window.alert(notReadyMessage);
-      return;
-    }
-
-    this.printing = true;
-    this.forceRendering();
-
-    var body = document.querySelector('body');
-    body.setAttribute('data-mozPrintCallback', true);
-
-    if (!this.hasEqualPageSizes) {
-      console.warn('Not all pages have the same size. The printed result ' +
-        'may be incorrect!');
-    }
-
-    // Insert a @page + size rule to make sure that the page size is correctly
-    // set. Note that we assume that all pages have the same size, because
-    // variable-size pages are not supported yet (at least in Chrome & Firefox).
-    // TODO(robwu): Use named pages when size calculation bugs get resolved
-    // (e.g. https://crbug.com/355116) AND when support for named pages is
-    // added (http://www.w3.org/TR/css3-page/#using-named-pages).
-    // In browsers where @page + size is not supported (such as Firefox,
-    // https://bugzil.la/851441), the next stylesheet will be ignored and the
-    // user has to select the correct paper size in the UI if wanted.
-    this.pageStyleSheet = document.createElement('style');
-    var pageSize = this.pdfViewer.getPageView(0).pdfPage.getViewport(1);
-    this.pageStyleSheet.textContent =
-      // "size:<width> <height>" is what we need. But also add "A4" because
-      // Firefox incorrectly reports support for the other value.
-      '@supports ((size:A4) and (size:1pt 1pt)) {' +
-      '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' +
-      // The canvas and each ancestor node must have a height of 100% to make
-      // sure that each canvas is printed on exactly one page.
-      '#printContainer {height:100%}' +
-      '#printContainer > div {width:100% !important;height:100% !important;}' +
-      '}';
-    body.appendChild(this.pageStyleSheet);
-
-    for (i = 0, ii = this.pagesCount; i < ii; ++i) {
-      this.pdfViewer.getPageView(i).beforePrint();
-    }
-
-  },
-
-  // Whether all pages of the PDF have the same width and height.
-  get hasEqualPageSizes() {
-    var firstPage = this.pdfViewer.getPageView(0);
-    for (var i = 1, ii = this.pagesCount; i < ii; ++i) {
-      var pageView = this.pdfViewer.getPageView(i);
-      if (pageView.width !== firstPage.width ||
-        pageView.height !== firstPage.height) {
-        return false;
-      }
-    }
-    return true;
-  },
-
-  afterPrint: function pdfViewSetupAfterPrint() {
-    var div = document.getElementById('printContainer');
-    while (div.hasChildNodes()) {
-      div.removeChild(div.lastChild);
-    }
-
-    if (this.pageStyleSheet && this.pageStyleSheet.parentNode) {
-      this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet);
-      this.pageStyleSheet = null;
-    }
-
-    this.printing = false;
-    this.forceRendering();
-  },
-
-  setScale: function (value, resetAutoSettings) {
-    this.updateScaleControls = !!resetAutoSettings;
-    this.pdfViewer.currentScaleValue = value;
-    this.updateScaleControls = true;
-  },
-
-  rotatePages: function pdfViewRotatePages(delta) {
-    var pageNumber = this.page;
-    this.pageRotation = (this.pageRotation + 360 + delta) % 360;
-    this.pdfViewer.pagesRotation = this.pageRotation;
-    this.pdfThumbnailViewer.pagesRotation = this.pageRotation;
-
-    this.forceRendering();
-
-    this.pdfViewer.scrollPageIntoView(pageNumber);
-  },
-
-  requestPresentationMode: function pdfViewRequestPresentationMode() {
-    if (!this.pdfPresentationMode) {
-      return;
-    }
-    this.pdfPresentationMode.request();
-  },
-
-  /**
-   * @param {number} delta - The delta value from the mouse event.
-   */
-  scrollPresentationMode: function pdfViewScrollPresentationMode(delta) {
-    if (!this.pdfPresentationMode) {
-      return;
-    }
-    this.pdfPresentationMode.mouseScroll(delta);
-  }
-};
-window.PDFView = PDFViewerApplication; // obsolete name, using it as an alias
-
-
-// function webViewerLoad(evt) {
-//   //   PDFViewerApplication.initialize().then(webViewerInitialized(123));
-//   setUrl("http://61.131.136.25:2081/zhba/upload/20211126/60748e5fda7772c68420e076551065d0.pdf");
-// }
-
-function setUrl(url) {
-  PDFViewerApplication.initialize().then(webViewerInitialized(url));
-}
-
-function webViewerInitialized(url) {
-  if (url) {
-    DEFAULT_URL = url;
-  }
-  var queryString = document.location.search.substring(1);
-  var params = PDFViewerApplication.parseQueryString(queryString);
-  var file = 'file' in params ? params.file : DEFAULT_URL;
-
-  var fileInput = document.createElement('input');
-  fileInput.id = 'fileInput';
-  fileInput.className = 'fileInput';
-  fileInput.setAttribute('type', 'file');
-  fileInput.oncontextmenu = noContextMenuHandler;
-  document.body.appendChild(fileInput);
-
-  if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
-    document.getElementById('openFile').setAttribute('hidden', 'true');
-    document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true');
-  } else {
-    document.getElementById('fileInput').value = null;
-  }
-
-  var locale = PDFJS.locale || navigator.language;
-
-  if (PDFViewerApplication.preferencePdfBugEnabled) {
-    // Special debugging flags in the hash section of the URL.
-    var hash = document.location.hash.substring(1);
-    var hashParams = PDFViewerApplication.parseQueryString(hash);
-
-    if ('disableworker' in hashParams) {
-      PDFJS.disableWorker = (hashParams['disableworker'] === 'true');
-    }
-    if ('disablerange' in hashParams) {
-      PDFJS.disableRange = (hashParams['disablerange'] === 'true');
-    }
-    if ('disablestream' in hashParams) {
-      PDFJS.disableStream = (hashParams['disablestream'] === 'true');
-    }
-    if ('disableautofetch' in hashParams) {
-      PDFJS.disableAutoFetch = (hashParams['disableautofetch'] === 'true');
-    }
-    if ('disablefontface' in hashParams) {
-      PDFJS.disableFontFace = (hashParams['disablefontface'] === 'true');
-    }
-    if ('disablehistory' in hashParams) {
-      PDFJS.disableHistory = (hashParams['disablehistory'] === 'true');
-    }
-    if ('webgl' in hashParams) {
-      PDFJS.disableWebGL = (hashParams['webgl'] !== 'true');
-    }
-    if ('useonlycsszoom' in hashParams) {
-      PDFJS.useOnlyCssZoom = (hashParams['useonlycsszoom'] === 'true');
-    }
-    if ('verbosity' in hashParams) {
-      PDFJS.verbosity = hashParams['verbosity'] | 0;
-    }
-    if ('ignorecurrentpositiononzoom' in hashParams) {
-      IGNORE_CURRENT_POSITION_ON_ZOOM =
-        (hashParams['ignorecurrentpositiononzoom'] === 'true');
-    }
-    if ('locale' in hashParams) {
-      locale = hashParams['locale'];
-    }
-    if ('textlayer' in hashParams) {
-      switch (hashParams['textlayer']) {
-        case 'off':
-          PDFJS.disableTextLayer = true;
-          break;
-        case 'visible':
-        case 'shadow':
-        case 'hover':
-          var viewer = document.getElementById('viewer');
-          viewer.classList.add('textLayer-' + hashParams['textlayer']);
-          break;
-      }
-    }
-    if ('pdfbug' in hashParams) {
-      PDFJS.pdfBug = true;
-      var pdfBug = hashParams['pdfbug'];
-      var enabled = pdfBug.split(',');
-      PDFBug.enable(enabled);
-      PDFBug.init();
-    }
-  }
-
-  mozL10n.setLanguage(locale);
-
-  if (!PDFViewerApplication.supportsPrinting) {
-    document.getElementById('print').classList.add('hidden');
-    document.getElementById('secondaryPrint').classList.add('hidden');
-  }
-
-  if (!PDFViewerApplication.supportsFullscreen) {
-    document.getElementById('presentationMode').classList.add('hidden');
-    document.getElementById('secondaryPresentationMode').
-      classList.add('hidden');
-  }
-
-  if (PDFViewerApplication.supportsIntegratedFind) {
-    document.getElementById('viewFind').classList.add('hidden');
-  }
-
-  // Listen for unsupported features to trigger the fallback UI.
-  PDFJS.UnsupportedManager.listen(
-    PDFViewerApplication.fallback.bind(PDFViewerApplication));
-
-  // Suppress context menus for some controls
-  document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler;
-
-  var mainContainer = document.getElementById('mainContainer');
-  var outerContainer = document.getElementById('outerContainer');
-  mainContainer.addEventListener('transitionend', function (e) {
-    if (e.target === mainContainer) {
-      var event = document.createEvent('UIEvents');
-      event.initUIEvent('resize', false, false, window, 0);
-      window.dispatchEvent(event);
-      outerContainer.classList.remove('sidebarMoving');
-    }
-  }, true);
-
-  document.getElementById('sidebarToggle').addEventListener('click',
-    function () {
-      // console.log(12345)
-
-      this.classList.toggle('toggled');
-      outerContainer.classList.add('sidebarMoving');
-      outerContainer.classList.toggle('sidebarOpen');
-      PDFViewerApplication.sidebarOpen =
-        outerContainer.classList.contains('sidebarOpen');
-      if (PDFViewerApplication.sidebarOpen) {
-        PDFViewerApplication.refreshThumbnailViewer();
-      }
-      PDFViewerApplication.forceRendering();
-    });
-
-  document.getElementById('viewThumbnail').addEventListener('click',
-    function () {
-      PDFViewerApplication.switchSidebarView('thumbs');
-    });
-
-  document.getElementById('viewOutline').addEventListener('click',
-    function () {
-      PDFViewerApplication.switchSidebarView('outline');
-    });
-
-  document.getElementById('viewAttachments').addEventListener('click',
-    function () {
-      PDFViewerApplication.switchSidebarView('attachments');
-    });
-
-  document.getElementById('previous').addEventListener('click',
-    function () {
-      PDFViewerApplication.page--;
-    });
-
-  document.getElementById('next').addEventListener('click',
-    function () {
-      PDFViewerApplication.page++;
-    });
-
-  document.getElementById('zoomIn').addEventListener('click',
-    function () {
-      PDFViewerApplication.zoomIn();
-    });
-
-  document.getElementById('zoomOut').addEventListener('click',
-    function () {
-      PDFViewerApplication.zoomOut();
-    });
-
-  document.getElementById('pageNumber').addEventListener('click', function () {
-    this.select();
-  });
-
-  document.getElementById('pageNumber').addEventListener('change', function () {
-    // Handle the user inputting a floating point number.
-    PDFViewerApplication.page = (this.value | 0);
-
-    if (this.value !== (this.value | 0).toString()) {
-      this.value = PDFViewerApplication.page;
-    }
-  });
-
-  document.getElementById('scaleSelect').addEventListener('change',
-    function () {
-      PDFViewerApplication.setScale(this.value, false);
-    });
-
-  document.getElementById('presentationMode').addEventListener('click',
-    SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar));
-
-  document.getElementById('openFile').addEventListener('click',
-    SecondaryToolbar.openFileClick.bind(SecondaryToolbar));
-
-  document.getElementById('print').addEventListener('click',
-    SecondaryToolbar.printClick.bind(SecondaryToolbar));
-
-  document.getElementById('download').addEventListener('click',
-    SecondaryToolbar.downloadClick.bind(SecondaryToolbar));
-
-
-  if (file && file.lastIndexOf('file:', 0) === 0) {
-    // file:-scheme. Load the contents in the main thread because QtWebKit
-    // cannot load file:-URLs in a Web Worker. file:-URLs are usually loaded
-    // very quickly, so there is no need to set up progress event listeners.
-    PDFViewerApplication.setTitleUsingUrl(file);
-    var xhr = new XMLHttpRequest();
-    xhr.onload = function () {
-      PDFViewerApplication.open(new Uint8Array(xhr.response), 0);
-    };
-    try {
-      xhr.open('GET', file);
-      xhr.responseType = 'arraybuffer';
-      xhr.send();
-    } catch (e) {
-      PDFViewerApplication.error(mozL10n.get('loading_error', null,
-        'An error occurred while loading the PDF.'), e);
-    }
-    return;
-  }
-
-  if (file) {
-    PDFViewerApplication.open(file, 0);
-  }
-}
-
-// document.addEventListener('DOMContentLoaded', webViewerLoad, true);
-
-document.addEventListener('pagerendered', function (e) {
-  var pageNumber = e.detail.pageNumber;
-  var pageIndex = pageNumber - 1;
-  var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
-
-  if (PDFViewerApplication.sidebarOpen) {
-    var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.
-      getThumbnail(pageIndex);
-    thumbnailView.setImage(pageView);
-  }
-
-  if (PDFJS.pdfBug && Stats.enabled && pageView.stats) {
-    Stats.add(pageNumber, pageView.stats);
-  }
-
-  if (pageView.error) {
-    PDFViewerApplication.error(mozL10n.get('rendering_error', null,
-      'An error occurred while rendering the page.'), pageView.error);
-  }
-
-  // If the page is still visible when it has finished rendering,
-  // ensure that the page number input loading indicator is hidden.
-  if (pageNumber === PDFViewerApplication.page) {
-    var pageNumberInput = document.getElementById('pageNumber');
-    pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);
-  }
-
-}, true);
-
-document.addEventListener('textlayerrendered', function (e) {
-  var pageIndex = e.detail.pageNumber - 1;
-  var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
-
-}, true);
-
-window.addEventListener('presentationmodechanged', function (e) {
-  var active = e.detail.active;
-  var switchInProgress = e.detail.switchInProgress;
-  PDFViewerApplication.pdfViewer.presentationModeState =
-    switchInProgress ? PresentationModeState.CHANGING :
-      active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL;
-});
-
-function updateViewarea() {
-  if (!PDFViewerApplication.initialized) {
-    return;
-  }
-  PDFViewerApplication.pdfViewer.update();
-}
-
-window.addEventListener('updateviewarea', function (evt) {
-  if (!PDFViewerApplication.initialized) {
-    return;
-  }
-  var location = evt.location;
-
-  PDFViewerApplication.store.initializedPromise.then(function () {
-    PDFViewerApplication.store.setMultiple({
-      'exists': true,
-      'page': location.pageNumber,
-      'zoom': location.scale,
-      'scrollLeft': location.left,
-      'scrollTop': location.top
-    }).catch(function () {
-      // unable to write to storage
-    });
-  });
-  var href = PDFViewerApplication.getAnchorUrl(location.pdfOpenParams);
-  document.getElementById('viewBookmark').href = href;
-  document.getElementById('secondaryViewBookmark').href = href;
-
-  // Update the current bookmark in the browsing history.
-  PDFHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber);
-
-  // Show/hide the loading indicator in the page number input element.
-  var pageNumberInput = document.getElementById('pageNumber');
-  var currentPage =
-    PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);
-
-  if (currentPage.renderingState === RenderingStates.FINISHED) {
-    pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);
-  } else {
-    pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR);
-  }
-}, true);
-
-window.addEventListener('resize', function webViewerResize(evt) {
-  if (PDFViewerApplication.initialized &&
-    (document.getElementById('pageAutoOption').selected ||
-      /* Note: the scale is constant for |pageActualOption|. */
-      document.getElementById('pageFitOption').selected ||
-      document.getElementById('pageWidthOption').selected)) {
-    var selectedScale = document.getElementById('scaleSelect').value;
-    PDFViewerApplication.setScale(selectedScale, false);
-  }
-  updateViewarea();
-
-  // Set the 'max-height' CSS property of the secondary toolbar.
-  SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer'));
-});
-
-window.addEventListener('hashchange', function webViewerHashchange(evt) {
-  if (PDFHistory.isHashChangeUnlocked) {
-    PDFViewerApplication.setHash(document.location.hash.substring(1));
-  }
-});
-
-window.addEventListener('change', function webViewerChange(evt) {
-  var files = evt.target.files;
-  if (!files || files.length === 0) {
-    return;
-  }
-  var file = files[0];
-
-  if (!PDFJS.disableCreateObjectURL &&
-    typeof URL !== 'undefined' && URL.createObjectURL) {
-    PDFViewerApplication.open(URL.createObjectURL(file), 0);
-  } else {
-    // Read the local file into a Uint8Array.
-    var fileReader = new FileReader();
-    fileReader.onload = function webViewerChangeFileReaderOnload(evt) {
-      var buffer = evt.target.result;
-      var uint8Array = new Uint8Array(buffer);
-      PDFViewerApplication.open(uint8Array, 0);
-    };
-    fileReader.readAsArrayBuffer(file);
-  }
-
-  PDFViewerApplication.setTitleUsingUrl(file.name);
-
-  // URL does not reflect proper document location - hiding some icons.
-  document.getElementById('viewBookmark').setAttribute('hidden', 'true');
-  document.getElementById('secondaryViewBookmark').
-    setAttribute('hidden', 'true');
-  document.getElementById('download').setAttribute('hidden', 'true');
-  document.getElementById('secondaryDownload').setAttribute('hidden', 'true');
-}, true);
-
-function selectScaleOption(value) {
-  var options = document.getElementById('scaleSelect').options;
-  var predefinedValueFound = false;
-  for (var i = 0; i < options.length; i++) {
-    var option = options[i];
-    if (option.value !== value) {
-      option.selected = false;
-      continue;
-    }
-    option.selected = true;
-    predefinedValueFound = true;
-  }
-  return predefinedValueFound;
-}
-
-window.addEventListener('localized', function localized(evt) {
-  document.getElementsByTagName('html')[0].dir = mozL10n.getDirection();
-
-  PDFViewerApplication.animationStartedPromise.then(function () {
-    // Adjust the width of the zoom box to fit the content.
-    // Note: If the window is narrow enough that the zoom box is not visible,
-    //       we temporarily show it to be able to adjust its width.
-    var container = document.getElementById('scaleSelectContainer');
-    if (container.clientWidth === 0) {
-      container.setAttribute('style', 'display: inherit;');
-    }
-    if (container.clientWidth > 0) {
-      var select = document.getElementById('scaleSelect');
-      select.setAttribute('style', 'min-width: inherit;');
-      var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;
-      select.setAttribute('style', 'min-width: ' +
-        (width + SCALE_SELECT_PADDING) + 'px;');
-      container.setAttribute('style', 'min-width: ' + width + 'px; ' +
-        'max-width: ' + width + 'px;');
-    }
-
-    // Set the 'max-height' CSS property of the secondary toolbar.
-    SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer'));
-  });
-}, true);
-
-window.addEventListener('scalechange', function scalechange(evt) {
-  document.getElementById('zoomOut').disabled = (evt.scale === MIN_SCALE);
-  document.getElementById('zoomIn').disabled = (evt.scale === MAX_SCALE);
-
-  var customScaleOption = document.getElementById('customScaleOption');
-  customScaleOption.selected = false;
-
-  if (!PDFViewerApplication.updateScaleControls &&
-    (document.getElementById('pageAutoOption').selected ||
-      document.getElementById('pageActualOption').selected ||
-      document.getElementById('pageFitOption').selected ||
-      document.getElementById('pageWidthOption').selected)) {
-    updateViewarea();
-    return;
-  }
-
-  if (evt.presetValue) {
-    selectScaleOption(evt.presetValue);
-    updateViewarea();
-    return;
-  }
-
-  var predefinedValueFound = selectScaleOption('' + evt.scale);
-  if (!predefinedValueFound) {
-    var customScale = Math.round(evt.scale * 10000) / 100;
-    customScaleOption.textContent =
-      mozL10n.get('page_scale_percent', { scale: customScale }, '{{scale}}%');
-    customScaleOption.selected = true;
-  }
-  updateViewarea();
-}, true);
-
-window.addEventListener('pagechange', function pagechange(evt) {
-  var page = evt.pageNumber;
-  if (evt.previousPageNumber !== page) {
-    document.getElementById('pageNumber').value = page;
-    if (PDFViewerApplication.sidebarOpen) {
-      PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);
-    }
-  }
-  var numPages = PDFViewerApplication.pagesCount;
-
-  document.getElementById('previous').disabled = (page <= 1);
-  document.getElementById('next').disabled = (page >= numPages);
-
-  document.getElementById('firstPage').disabled = (page <= 1);
-  document.getElementById('lastPage').disabled = (page >= numPages);
-
-  // we need to update stats
-  if (PDFJS.pdfBug && Stats.enabled) {
-    var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);
-    if (pageView.stats) {
-      Stats.add(page, pageView.stats);
-    }
-  }
-
-  // checking if the this.page was called from the updateViewarea function
-  if (evt.updateInProgress) {
-    return;
-  }
-  // Avoid scrolling the first page during loading
-  if (this.loading && page === 1) {
-    return;
-  }
-  PDFViewerApplication.pdfViewer.scrollPageIntoView(page);
-}, true);
-
-function handleMouseWheel(evt) {
-  var MOUSE_WHEEL_DELTA_FACTOR = 40;
-  var ticks = (evt.type === 'DOMMouseScroll') ? -evt.detail :
-    evt.wheelDelta / MOUSE_WHEEL_DELTA_FACTOR;
-  var direction = (ticks < 0) ? 'zoomOut' : 'zoomIn';
-
-  if (PDFViewerApplication.pdfViewer.isInPresentationMode) {
-    evt.preventDefault();
-    PDFViewerApplication.scrollPresentationMode(ticks *
-      MOUSE_WHEEL_DELTA_FACTOR);
-  } else if (evt.ctrlKey || evt.metaKey) {
-    // Only zoom the pages, not the entire viewer.
-    evt.preventDefault();
-    PDFViewerApplication[direction](Math.abs(ticks));
-  }
-}
-
-window.addEventListener('DOMMouseScroll', handleMouseWheel);
-window.addEventListener('mousewheel', handleMouseWheel);
-
-window.addEventListener('click', function click(evt) {
-  if (SecondaryToolbar.opened &&
-    PDFViewerApplication.pdfViewer.containsElement(evt.target)) {
-    SecondaryToolbar.close();
-  }
-}, false);
-
-window.addEventListener('keydown', function keydown(evt) {
-  if (OverlayManager.active) {
-    return;
-  }
-
-  var handled = false;
-  var cmd = (evt.ctrlKey ? 1 : 0) |
-    (evt.altKey ? 2 : 0) |
-    (evt.shiftKey ? 4 : 0) |
-    (evt.metaKey ? 8 : 0);
-
-  var pdfViewer = PDFViewerApplication.pdfViewer;
-  var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;
-
-  // First, handle the key bindings that are independent whether an input
-  // control is selected or not.
-  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
-    // either CTRL or META key with optional SHIFT.
-    switch (evt.keyCode) {
-      case 70: // f
-        if (!PDFViewerApplication.supportsIntegratedFind) {
-          PDFViewerApplication.findBar.open();
-          handled = true;
-        }
-        break;
-      case 71: // g
-        if (!PDFViewerApplication.supportsIntegratedFind) {
-          PDFViewerApplication.findBar.dispatchEvent('again',
-            cmd === 5 || cmd === 12);
-          handled = true;
-        }
-        break;
-      case 61: // FF/Mac '='
-      case 107: // FF '+' and '='
-      case 187: // Chrome '+'
-      case 171: // FF with German keyboard
-        if (!isViewerInPresentationMode) {
-          PDFViewerApplication.zoomIn();
-        }
-        handled = true;
-        break;
-      case 173: // FF/Mac '-'
-      case 109: // FF '-'
-      case 189: // Chrome '-'
-        if (!isViewerInPresentationMode) {
-          PDFViewerApplication.zoomOut();
-        }
-        handled = true;
-        break;
-      case 48: // '0'
-      case 96: // '0' on Numpad of Swedish keyboard
-        if (!isViewerInPresentationMode) {
-          // keeping it unhandled (to restore page zoom to 100%)
-          setTimeout(function () {
-            // ... and resetting the scale after browser adjusts its scale
-            PDFViewerApplication.setScale(DEFAULT_SCALE, true);
-          });
-          handled = false;
-        }
-        break;
-    }
-  }
-
-  // CTRL or META without shift
-  if (cmd === 1 || cmd === 8) {
-    switch (evt.keyCode) {
-      case 83: // s
-        PDFViewerApplication.download();
-        handled = true;
-        break;
-    }
-  }
-
-  // CTRL+ALT or Option+Command
-  if (cmd === 3 || cmd === 10) {
-    switch (evt.keyCode) {
-      case 80: // p
-        PDFViewerApplication.requestPresentationMode();
-        handled = true;
-        break;
-      case 71: // g
-        // focuses input#pageNumber field
-        document.getElementById('pageNumber').select();
-        handled = true;
-        break;
-    }
-  }
-
-  if (handled) {
-    evt.preventDefault();
-    return;
-  }
-
-  // Some shortcuts should not get handled if a control/input element
-  // is selected.
-  var curElement = document.activeElement || document.querySelector(':focus');
-  var curElementTagName = curElement && curElement.tagName.toUpperCase();
-  if (curElementTagName === 'INPUT' ||
-    curElementTagName === 'TEXTAREA' ||
-    curElementTagName === 'SELECT') {
-    // Make sure that the secondary toolbar is closed when Escape is pressed.
-    if (evt.keyCode !== 27) { // 'Esc'
-      return;
-    }
-  }
-
-  if (cmd === 0) { // no control key pressed at all.
-    switch (evt.keyCode) {
-      case 38: // up arrow
-      case 33: // pg up
-      case 8: // backspace
-        if (!isViewerInPresentationMode &&
-          PDFViewerApplication.currentScaleValue !== 'page-fit') {
-          break;
-        }
-      /* in presentation mode */
-      /* falls through */
-      case 37: // left arrow
-        // horizontal scrolling using arrow keys
-        if (pdfViewer.isHorizontalScrollbarEnabled) {
-          break;
-        }
-      /* falls through */
-      case 75: // 'k'
-      case 80: // 'p'
-        PDFViewerApplication.page--;
-        handled = true;
-        break;
-      case 27: // esc key
-        if (SecondaryToolbar.opened) {
-          SecondaryToolbar.close();
-          handled = true;
-        }
-        if (!PDFViewerApplication.supportsIntegratedFind &&
-          PDFViewerApplication.findBar.opened) {
-          PDFViewerApplication.findBar.close();
-          handled = true;
-        }
-        break;
-      case 40: // down arrow
-      case 34: // pg down
-      case 32: // spacebar
-        if (!isViewerInPresentationMode &&
-          PDFViewerApplication.currentScaleValue !== 'page-fit') {
-          break;
-        }
-      /* falls through */
-      case 39: // right arrow
-        // horizontal scrolling using arrow keys
-        if (pdfViewer.isHorizontalScrollbarEnabled) {
-          break;
-        }
-      /* falls through */
-      case 74: // 'j'
-      case 78: // 'n'
-        PDFViewerApplication.page++;
-        handled = true;
-        break;
-
-      case 36: // home
-        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {
-          PDFViewerApplication.page = 1;
-          handled = true;
-        }
-        break;
-      case 35: // end
-        if (isViewerInPresentationMode || (PDFViewerApplication.pdfDocument &&
-          PDFViewerApplication.page < PDFViewerApplication.pagesCount)) {
-          PDFViewerApplication.page = PDFViewerApplication.pagesCount;
-          handled = true;
-        }
-        break;
-
-      case 72: // 'h'
-        if (!isViewerInPresentationMode) {
-          HandTool.toggle();
-        }
-        break;
-      case 82: // 'r'
-        PDFViewerApplication.rotatePages(90);
-        break;
-    }
-  }
-
-  if (cmd === 4) { // shift-key
-    switch (evt.keyCode) {
-      case 32: // spacebar
-        if (!isViewerInPresentationMode &&
-          PDFViewerApplication.currentScaleValue !== 'page-fit') {
-          break;
-        }
-        PDFViewerApplication.page--;
-        handled = true;
-        break;
-
-      case 82: // 'r'
-        PDFViewerApplication.rotatePages(-90);
-        break;
-    }
-  }
-
-  if (!handled && !isViewerInPresentationMode) {
-    // 33=Page Up  34=Page Down  35=End    36=Home
-    // 37=Left     38=Up         39=Right  40=Down
-    if (evt.keyCode >= 33 && evt.keyCode <= 40 &&
-      !pdfViewer.containsElement(curElement)) {
-      // The page container is not focused, but a page navigation key has been
-      // pressed. Change the focus to the viewer container to make sure that
-      // navigation by keyboard works as expected.
-      pdfViewer.focus();
-    }
-    // 32=Spacebar
-    if (evt.keyCode === 32 && curElementTagName !== 'BUTTON' &&
-      !pdfViewer.containsElement(curElement)) {
-      pdfViewer.focus();
-    }
-  }
-
-  if (cmd === 2) { // alt-key
-    switch (evt.keyCode) {
-      case 37: // left arrow
-        if (isViewerInPresentationMode) {
-          PDFHistory.back();
-          handled = true;
-        }
-        break;
-      case 39: // right arrow
-        if (isViewerInPresentationMode) {
-          PDFHistory.forward();
-          handled = true;
-        }
-        break;
-    }
-  }
-
-  if (handled) {
-    evt.preventDefault();
-  }
-});
-
-window.addEventListener('beforeprint', function beforePrint(evt) {
-  PDFViewerApplication.beforePrint();
-});
-
-window.addEventListener('afterprint', function afterPrint(evt) {
-  PDFViewerApplication.afterPrint();
-});
-setTimeout(() => {
-  document.getElementById('sidebarToggle').click();
-}, 700);
-(function animationStartedClosure() {
-  // The offsetParent is not set until the pdf.js iframe or object is visible.
-  // Waiting for first animation.
-  PDFViewerApplication.animationStartedPromise = new Promise(
-    function (resolve) {
-      window.requestAnimationFrame(resolve);
-    });
-})();
-
-
diff --git a/public/pfd/build/pdf.js b/public/pfd/build/pdf.js
deleted file mode 100644
index 3156b3a..0000000
--- a/public/pfd/build/pdf.js
+++ /dev/null
@@ -1,8062 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*jshint globalstrict: false */
-/* globals PDFJS */
-
-// Initializing PDFJS global object (if still undefined)
-if (typeof PDFJS === 'undefined') {
-  (typeof window !== 'undefined' ? window : this).PDFJS = {};
-}
-
-PDFJS.version = '1.1.159';
-PDFJS.build = '82536f8';
-
-(function pdfjsWrapper() {
-  // Use strict in our context only - users might not want it
-  'use strict';
-
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL,
-           Promise */
-
-'use strict';
-
-var globalScope = (typeof window === 'undefined') ? this : window;
-
-var isWorker = (typeof window === 'undefined');
-
-var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
-
-var TextRenderingMode = {
-  FILL: 0,
-  STROKE: 1,
-  FILL_STROKE: 2,
-  INVISIBLE: 3,
-  FILL_ADD_TO_PATH: 4,
-  STROKE_ADD_TO_PATH: 5,
-  FILL_STROKE_ADD_TO_PATH: 6,
-  ADD_TO_PATH: 7,
-  FILL_STROKE_MASK: 3,
-  ADD_TO_PATH_FLAG: 4
-};
-
-var ImageKind = {
-  GRAYSCALE_1BPP: 1,
-  RGB_24BPP: 2,
-  RGBA_32BPP: 3
-};
-
-var AnnotationType = {
-  WIDGET: 1,
-  TEXT: 2,
-  LINK: 3
-};
-
-var StreamType = {
-  UNKNOWN: 0,
-  FLATE: 1,
-  LZW: 2,
-  DCT: 3,
-  JPX: 4,
-  JBIG: 5,
-  A85: 6,
-  AHX: 7,
-  CCF: 8,
-  RL: 9
-};
-
-var FontType = {
-  UNKNOWN: 0,
-  TYPE1: 1,
-  TYPE1C: 2,
-  CIDFONTTYPE0: 3,
-  CIDFONTTYPE0C: 4,
-  TRUETYPE: 5,
-  CIDFONTTYPE2: 6,
-  TYPE3: 7,
-  OPENTYPE: 8,
-  TYPE0: 9,
-  MMTYPE1: 10
-};
-
-// The global PDFJS object exposes the API
-// In production, it will be declared outside a global wrapper
-// In development, it will be declared here
-if (!globalScope.PDFJS) {
-  globalScope.PDFJS = {};
-}
-
-globalScope.PDFJS.pdfBug = false;
-
-PDFJS.VERBOSITY_LEVELS = {
-  errors: 0,
-  warnings: 1,
-  infos: 5
-};
-
-// All the possible operations for an operator list.
-var OPS = PDFJS.OPS = {
-  // Intentionally start from 1 so it is easy to spot bad operators that will be
-  // 0's.
-  dependency: 1,
-  setLineWidth: 2,
-  setLineCap: 3,
-  setLineJoin: 4,
-  setMiterLimit: 5,
-  setDash: 6,
-  setRenderingIntent: 7,
-  setFlatness: 8,
-  setGState: 9,
-  save: 10,
-  restore: 11,
-  transform: 12,
-  moveTo: 13,
-  lineTo: 14,
-  curveTo: 15,
-  curveTo2: 16,
-  curveTo3: 17,
-  closePath: 18,
-  rectangle: 19,
-  stroke: 20,
-  closeStroke: 21,
-  fill: 22,
-  eoFill: 23,
-  fillStroke: 24,
-  eoFillStroke: 25,
-  closeFillStroke: 26,
-  closeEOFillStroke: 27,
-  endPath: 28,
-  clip: 29,
-  eoClip: 30,
-  beginText: 31,
-  endText: 32,
-  setCharSpacing: 33,
-  setWordSpacing: 34,
-  setHScale: 35,
-  setLeading: 36,
-  setFont: 37,
-  setTextRenderingMode: 38,
-  setTextRise: 39,
-  moveText: 40,
-  setLeadingMoveText: 41,
-  setTextMatrix: 42,
-  nextLine: 43,
-  showText: 44,
-  showSpacedText: 45,
-  nextLineShowText: 46,
-  nextLineSetSpacingShowText: 47,
-  setCharWidth: 48,
-  setCharWidthAndBounds: 49,
-  setStrokeColorSpace: 50,
-  setFillColorSpace: 51,
-  setStrokeColor: 52,
-  setStrokeColorN: 53,
-  setFillColor: 54,
-  setFillColorN: 55,
-  setStrokeGray: 56,
-  setFillGray: 57,
-  setStrokeRGBColor: 58,
-  setFillRGBColor: 59,
-  setStrokeCMYKColor: 60,
-  setFillCMYKColor: 61,
-  shadingFill: 62,
-  beginInlineImage: 63,
-  beginImageData: 64,
-  endInlineImage: 65,
-  paintXObject: 66,
-  markPoint: 67,
-  markPointProps: 68,
-  beginMarkedContent: 69,
-  beginMarkedContentProps: 70,
-  endMarkedContent: 71,
-  beginCompat: 72,
-  endCompat: 73,
-  paintFormXObjectBegin: 74,
-  paintFormXObjectEnd: 75,
-  beginGroup: 76,
-  endGroup: 77,
-  beginAnnotations: 78,
-  endAnnotations: 79,
-  beginAnnotation: 80,
-  endAnnotation: 81,
-  paintJpegXObject: 82,
-  paintImageMaskXObject: 83,
-  paintImageMaskXObjectGroup: 84,
-  paintImageXObject: 85,
-  paintInlineImageXObject: 86,
-  paintInlineImageXObjectGroup: 87,
-  paintImageXObjectRepeat: 88,
-  paintImageMaskXObjectRepeat: 89,
-  paintSolidColorImageMask: 90,
-  constructPath: 91
-};
-
-// A notice for devs. These are good for things that are helpful to devs, such
-// as warning that Workers were disabled, which is important to devs but not
-// end users.
-function info(msg) {
-  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {
-    console.log('Info: ' + msg);
-  }
-}
-
-// Non-fatal warnings.
-function warn(msg) {
-  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {
-    console.log('Warning: ' + msg);
-  }
-}
-
-// Fatal errors that should trigger the fallback UI and halt execution by
-// throwing an exception.
-function error(msg) {
-  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) {
-    console.log('Error: ' + msg);
-    console.log(backtrace());
-  }
-  UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);
-  throw new Error(msg);
-}
-
-function backtrace() {
-  try {
-    throw new Error();
-  } catch (e) {
-    return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
-  }
-}
-
-function assert(cond, msg) {
-  if (!cond) {
-    error(msg);
-  }
-}
-
-var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {
-  unknown: 'unknown',
-  forms: 'forms',
-  javaScript: 'javaScript',
-  smask: 'smask',
-  shadingPattern: 'shadingPattern',
-  font: 'font'
-};
-
-var UnsupportedManager = PDFJS.UnsupportedManager =
-  (function UnsupportedManagerClosure() {
-  var listeners = [];
-  return {
-    listen: function (cb) {
-      listeners.push(cb);
-    },
-    notify: function (featureId) {
-      warn('Unsupported feature "' + featureId + '"');
-      for (var i = 0, ii = listeners.length; i < ii; i++) {
-        listeners[i](featureId);
-      }
-    }
-  };
-})();
-
-// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
-// absolute URL, it will be returned as is.
-function combineUrl(baseUrl, url) {
-  if (!url) {
-    return baseUrl;
-  }
-  if (/^[a-z][a-z0-9+\-.]*:/i.test(url)) {
-    return url;
-  }
-  var i;
-  if (url.charAt(0) === '/') {
-    // absolute path
-    i = baseUrl.indexOf('://');
-    if (url.charAt(1) === '/') {
-      ++i;
-    } else {
-      i = baseUrl.indexOf('/', i + 3);
-    }
-    return baseUrl.substring(0, i) + url;
-  } else {
-    // relative path
-    var pathLength = baseUrl.length;
-    i = baseUrl.lastIndexOf('#');
-    pathLength = i >= 0 ? i : pathLength;
-    i = baseUrl.lastIndexOf('?', pathLength);
-    pathLength = i >= 0 ? i : pathLength;
-    var prefixLength = baseUrl.lastIndexOf('/', pathLength);
-    return baseUrl.substring(0, prefixLength + 1) + url;
-  }
-}
-
-// Validates if URL is safe and allowed, e.g. to avoid XSS.
-function isValidUrl(url, allowRelative) {
-  if (!url) {
-    return false;
-  }
-  // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)
-  // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
-  var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);
-  if (!protocol) {
-    return allowRelative;
-  }
-  protocol = protocol[0].toLowerCase();
-  switch (protocol) {
-    case 'http':
-    case 'https':
-    case 'ftp':
-    case 'mailto':
-    case 'tel':
-      return true;
-    default:
-      return false;
-  }
-}
-PDFJS.isValidUrl = isValidUrl;
-
-function shadow(obj, prop, value) {
-  Object.defineProperty(obj, prop, { value: value,
-                                     enumerable: true,
-                                     configurable: true,
-                                     writable: false });
-  return value;
-}
-PDFJS.shadow = shadow;
-
-var PasswordResponses = PDFJS.PasswordResponses = {
-  NEED_PASSWORD: 1,
-  INCORRECT_PASSWORD: 2
-};
-
-var PasswordException = (function PasswordExceptionClosure() {
-  function PasswordException(msg, code) {
-    this.name = 'PasswordException';
-    this.message = msg;
-    this.code = code;
-  }
-
-  PasswordException.prototype = new Error();
-  PasswordException.constructor = PasswordException;
-
-  return PasswordException;
-})();
-PDFJS.PasswordException = PasswordException;
-
-var UnknownErrorException = (function UnknownErrorExceptionClosure() {
-  function UnknownErrorException(msg, details) {
-    this.name = 'UnknownErrorException';
-    this.message = msg;
-    this.details = details;
-  }
-
-  UnknownErrorException.prototype = new Error();
-  UnknownErrorException.constructor = UnknownErrorException;
-
-  return UnknownErrorException;
-})();
-PDFJS.UnknownErrorException = UnknownErrorException;
-
-var InvalidPDFException = (function InvalidPDFExceptionClosure() {
-  function InvalidPDFException(msg) {
-    this.name = 'InvalidPDFException';
-    this.message = msg;
-  }
-
-  InvalidPDFException.prototype = new Error();
-  InvalidPDFException.constructor = InvalidPDFException;
-
-  return InvalidPDFException;
-})();
-PDFJS.InvalidPDFException = InvalidPDFException;
-
-var MissingPDFException = (function MissingPDFExceptionClosure() {
-  function MissingPDFException(msg) {
-    this.name = 'MissingPDFException';
-    this.message = msg;
-  }
-
-  MissingPDFException.prototype = new Error();
-  MissingPDFException.constructor = MissingPDFException;
-
-  return MissingPDFException;
-})();
-PDFJS.MissingPDFException = MissingPDFException;
-
-var UnexpectedResponseException =
-    (function UnexpectedResponseExceptionClosure() {
-  function UnexpectedResponseException(msg, status) {
-    this.name = 'UnexpectedResponseException';
-    this.message = msg;
-    this.status = status;
-  }
-
-  UnexpectedResponseException.prototype = new Error();
-  UnexpectedResponseException.constructor = UnexpectedResponseException;
-
-  return UnexpectedResponseException;
-})();
-PDFJS.UnexpectedResponseException = UnexpectedResponseException;
-
-var NotImplementedException = (function NotImplementedExceptionClosure() {
-  function NotImplementedException(msg) {
-    this.message = msg;
-  }
-
-  NotImplementedException.prototype = new Error();
-  NotImplementedException.prototype.name = 'NotImplementedException';
-  NotImplementedException.constructor = NotImplementedException;
-
-  return NotImplementedException;
-})();
-
-var MissingDataException = (function MissingDataExceptionClosure() {
-  function MissingDataException(begin, end) {
-    this.begin = begin;
-    this.end = end;
-    this.message = 'Missing data [' + begin + ', ' + end + ')';
-  }
-
-  MissingDataException.prototype = new Error();
-  MissingDataException.prototype.name = 'MissingDataException';
-  MissingDataException.constructor = MissingDataException;
-
-  return MissingDataException;
-})();
-
-var XRefParseException = (function XRefParseExceptionClosure() {
-  function XRefParseException(msg) {
-    this.message = msg;
-  }
-
-  XRefParseException.prototype = new Error();
-  XRefParseException.prototype.name = 'XRefParseException';
-  XRefParseException.constructor = XRefParseException;
-
-  return XRefParseException;
-})();
-
-
-function bytesToString(bytes) {
-  assert(bytes !== null && typeof bytes === 'object' &&
-         bytes.length !== undefined, 'Invalid argument for bytesToString');
-  var length = bytes.length;
-  var MAX_ARGUMENT_COUNT = 8192;
-  if (length < MAX_ARGUMENT_COUNT) {
-    return String.fromCharCode.apply(null, bytes);
-  }
-  var strBuf = [];
-  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
-    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
-    var chunk = bytes.subarray(i, chunkEnd);
-    strBuf.push(String.fromCharCode.apply(null, chunk));
-  }
-  return strBuf.join('');
-}
-
-function stringToBytes(str) {
-  assert(typeof str === 'string', 'Invalid argument for stringToBytes');
-  var length = str.length;
-  var bytes = new Uint8Array(length);
-  for (var i = 0; i < length; ++i) {
-    bytes[i] = str.charCodeAt(i) & 0xFF;
-  }
-  return bytes;
-}
-
-function string32(value) {
-  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
-                             (value >> 8) & 0xff, value & 0xff);
-}
-
-function log2(x) {
-  var n = 1, i = 0;
-  while (x > n) {
-    n <<= 1;
-    i++;
-  }
-  return i;
-}
-
-function readInt8(data, start) {
-  return (data[start] << 24) >> 24;
-}
-
-function readUint16(data, offset) {
-  return (data[offset] << 8) | data[offset + 1];
-}
-
-function readUint32(data, offset) {
-  return ((data[offset] << 24) | (data[offset + 1] << 16) |
-         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;
-}
-
-// Lazy test the endianness of the platform
-// NOTE: This will be 'true' for simulated TypedArrays
-function isLittleEndian() {
-  var buffer8 = new Uint8Array(2);
-  buffer8[0] = 1;
-  var buffer16 = new Uint16Array(buffer8.buffer);
-  return (buffer16[0] === 1);
-}
-
-Object.defineProperty(PDFJS, 'isLittleEndian', {
-  configurable: true,
-  get: function PDFJS_isLittleEndian() {
-    return shadow(PDFJS, 'isLittleEndian', isLittleEndian());
-  }
-});
-
-//#if !(FIREFOX || MOZCENTRAL || B2G || CHROME)
-//// Lazy test if the userAgant support CanvasTypedArrays
-function hasCanvasTypedArrays() {
-  var canvas = document.createElement('canvas');
-  canvas.width = canvas.height = 1;
-  var ctx = canvas.getContext('2d');
-  var imageData = ctx.createImageData(1, 1);
-  return (typeof imageData.data.buffer !== 'undefined');
-}
-
-Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', {
-  configurable: true,
-  get: function PDFJS_hasCanvasTypedArrays() {
-    return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());
-  }
-});
-
-var Uint32ArrayView = (function Uint32ArrayViewClosure() {
-
-  function Uint32ArrayView(buffer, length) {
-    this.buffer = buffer;
-    this.byteLength = buffer.length;
-    this.length = length === undefined ? (this.byteLength >> 2) : length;
-    ensureUint32ArrayViewProps(this.length);
-  }
-  Uint32ArrayView.prototype = Object.create(null);
-
-  var uint32ArrayViewSetters = 0;
-  function createUint32ArrayProp(index) {
-    return {
-      get: function () {
-        var buffer = this.buffer, offset = index << 2;
-        return (buffer[offset] | (buffer[offset + 1] << 8) |
-          (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;
-      },
-      set: function (value) {
-        var buffer = this.buffer, offset = index << 2;
-        buffer[offset] = value & 255;
-        buffer[offset + 1] = (value >> 8) & 255;
-        buffer[offset + 2] = (value >> 16) & 255;
-        buffer[offset + 3] = (value >>> 24) & 255;
-      }
-    };
-  }
-
-  function ensureUint32ArrayViewProps(length) {
-    while (uint32ArrayViewSetters < length) {
-      Object.defineProperty(Uint32ArrayView.prototype,
-        uint32ArrayViewSetters,
-        createUint32ArrayProp(uint32ArrayViewSetters));
-      uint32ArrayViewSetters++;
-    }
-  }
-
-  return Uint32ArrayView;
-})();
-//#else
-//PDFJS.hasCanvasTypedArrays = true;
-//#endif
-
-var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
-
-var Util = PDFJS.Util = (function UtilClosure() {
-  function Util() {}
-
-  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];
-
-  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids
-  // creating many intermediate strings.
-  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
-    rgbBuf[1] = r;
-    rgbBuf[3] = g;
-    rgbBuf[5] = b;
-    return rgbBuf.join('');
-  };
-
-  // Concatenates two transformation matrices together and returns the result.
-  Util.transform = function Util_transform(m1, m2) {
-    return [
-      m1[0] * m2[0] + m1[2] * m2[1],
-      m1[1] * m2[0] + m1[3] * m2[1],
-      m1[0] * m2[2] + m1[2] * m2[3],
-      m1[1] * m2[2] + m1[3] * m2[3],
-      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],
-      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]
-    ];
-  };
-
-  // For 2d affine transforms
-  Util.applyTransform = function Util_applyTransform(p, m) {
-    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
-    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
-    return [xt, yt];
-  };
-
-  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
-    var d = m[0] * m[3] - m[1] * m[2];
-    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
-    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
-    return [xt, yt];
-  };
-
-  // Applies the transform to the rectangle and finds the minimum axially
-  // aligned bounding box.
-  Util.getAxialAlignedBoundingBox =
-    function Util_getAxialAlignedBoundingBox(r, m) {
-
-    var p1 = Util.applyTransform(r, m);
-    var p2 = Util.applyTransform(r.slice(2, 4), m);
-    var p3 = Util.applyTransform([r[0], r[3]], m);
-    var p4 = Util.applyTransform([r[2], r[1]], m);
-    return [
-      Math.min(p1[0], p2[0], p3[0], p4[0]),
-      Math.min(p1[1], p2[1], p3[1], p4[1]),
-      Math.max(p1[0], p2[0], p3[0], p4[0]),
-      Math.max(p1[1], p2[1], p3[1], p4[1])
-    ];
-  };
-
-  Util.inverseTransform = function Util_inverseTransform(m) {
-    var d = m[0] * m[3] - m[1] * m[2];
-    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
-      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
-  };
-
-  // Apply a generic 3d matrix M on a 3-vector v:
-  //   | a b c |   | X |
-  //   | d e f | x | Y |
-  //   | g h i |   | Z |
-  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
-  // with v as [X,Y,Z]
-  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
-    return [
-      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
-      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
-      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
-    ];
-  };
-
-  // This calculation uses Singular Value Decomposition.
-  // The SVD can be represented with formula A = USV. We are interested in the
-  // matrix S here because it represents the scale values.
-  Util.singularValueDecompose2dScale =
-    function Util_singularValueDecompose2dScale(m) {
-
-    var transpose = [m[0], m[2], m[1], m[3]];
-
-    // Multiply matrix m with its transpose.
-    var a = m[0] * transpose[0] + m[1] * transpose[2];
-    var b = m[0] * transpose[1] + m[1] * transpose[3];
-    var c = m[2] * transpose[0] + m[3] * transpose[2];
-    var d = m[2] * transpose[1] + m[3] * transpose[3];
-
-    // Solve the second degree polynomial to get roots.
-    var first = (a + d) / 2;
-    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
-    var sx = first + second || 1;
-    var sy = first - second || 1;
-
-    // Scale values are the square roots of the eigenvalues.
-    return [Math.sqrt(sx), Math.sqrt(sy)];
-  };
-
-  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
-  // For coordinate systems whose origin lies in the bottom-left, this
-  // means normalization to (BL,TR) ordering. For systems with origin in the
-  // top-left, this means (TL,BR) ordering.
-  Util.normalizeRect = function Util_normalizeRect(rect) {
-    var r = rect.slice(0); // clone rect
-    if (rect[0] > rect[2]) {
-      r[0] = rect[2];
-      r[2] = rect[0];
-    }
-    if (rect[1] > rect[3]) {
-      r[1] = rect[3];
-      r[3] = rect[1];
-    }
-    return r;
-  };
-
-  // Returns a rectangle [x1, y1, x2, y2] corresponding to the
-  // intersection of rect1 and rect2. If no intersection, returns 'false'
-  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
-  Util.intersect = function Util_intersect(rect1, rect2) {
-    function compare(a, b) {
-      return a - b;
-    }
-
-    // Order points along the axes
-    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
-        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
-        result = [];
-
-    rect1 = Util.normalizeRect(rect1);
-    rect2 = Util.normalizeRect(rect2);
-
-    // X: first and second points belong to different rectangles?
-    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
-        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
-      // Intersection must be between second and third points
-      result[0] = orderedX[1];
-      result[2] = orderedX[2];
-    } else {
-      return false;
-    }
-
-    // Y: first and second points belong to different rectangles?
-    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
-        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
-      // Intersection must be between second and third points
-      result[1] = orderedY[1];
-      result[3] = orderedY[2];
-    } else {
-      return false;
-    }
-
-    return result;
-  };
-
-  Util.sign = function Util_sign(num) {
-    return num < 0 ? -1 : 1;
-  };
-
-  Util.appendToArray = function Util_appendToArray(arr1, arr2) {
-    Array.prototype.push.apply(arr1, arr2);
-  };
-
-  Util.prependToArray = function Util_prependToArray(arr1, arr2) {
-    Array.prototype.unshift.apply(arr1, arr2);
-  };
-
-  Util.extendObj = function extendObj(obj1, obj2) {
-    for (var key in obj2) {
-      obj1[key] = obj2[key];
-    }
-  };
-
-  Util.getInheritableProperty = function Util_getInheritableProperty(dict,
-                                                                     name) {
-    while (dict && !dict.has(name)) {
-      dict = dict.get('Parent');
-    }
-    if (!dict) {
-      return null;
-    }
-    return dict.get(name);
-  };
-
-  Util.inherit = function Util_inherit(sub, base, prototype) {
-    sub.prototype = Object.create(base.prototype);
-    sub.prototype.constructor = sub;
-    for (var prop in prototype) {
-      sub.prototype[prop] = prototype[prop];
-    }
-  };
-
-  Util.loadScript = function Util_loadScript(src, callback) {
-    var script = document.createElement('script');
-    var loaded = false;
-    script.setAttribute('src', src);
-    if (callback) {
-      script.onload = function() {
-        if (!loaded) {
-          callback();
-        }
-        loaded = true;
-      };
-    }
-    document.getElementsByTagName('head')[0].appendChild(script);
-  };
-
-  return Util;
-})();
-
-/**
- * PDF page viewport created based on scale, rotation and offset.
- * @class
- * @alias PDFJS.PageViewport
- */
-var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
-  /**
-   * @constructor
-   * @private
-   * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates.
-   * @param scale {number} scale of the viewport.
-   * @param rotation {number} rotations of the viewport in degrees.
-   * @param offsetX {number} offset X
-   * @param offsetY {number} offset Y
-   * @param dontFlip {boolean} if true, axis Y will not be flipped.
-   */
-  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {
-    this.viewBox = viewBox;
-    this.scale = scale;
-    this.rotation = rotation;
-    this.offsetX = offsetX;
-    this.offsetY = offsetY;
-
-    // creating transform to convert pdf coordinate system to the normal
-    // canvas like coordinates taking in account scale and rotation
-    var centerX = (viewBox[2] + viewBox[0]) / 2;
-    var centerY = (viewBox[3] + viewBox[1]) / 2;
-    var rotateA, rotateB, rotateC, rotateD;
-    rotation = rotation % 360;
-    rotation = rotation < 0 ? rotation + 360 : rotation;
-    switch (rotation) {
-      case 180:
-        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
-        break;
-      case 90:
-        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
-        break;
-      case 270:
-        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
-        break;
-      //case 0:
-      default:
-        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
-        break;
-    }
-
-    if (dontFlip) {
-      rotateC = -rotateC; rotateD = -rotateD;
-    }
-
-    var offsetCanvasX, offsetCanvasY;
-    var width, height;
-    if (rotateA === 0) {
-      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
-      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
-      width = Math.abs(viewBox[3] - viewBox[1]) * scale;
-      height = Math.abs(viewBox[2] - viewBox[0]) * scale;
-    } else {
-      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
-      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
-      width = Math.abs(viewBox[2] - viewBox[0]) * scale;
-      height = Math.abs(viewBox[3] - viewBox[1]) * scale;
-    }
-    // creating transform for the following operations:
-    // translate(-centerX, -centerY), rotate and flip vertically,
-    // scale, and translate(offsetCanvasX, offsetCanvasY)
-    this.transform = [
-      rotateA * scale,
-      rotateB * scale,
-      rotateC * scale,
-      rotateD * scale,
-      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
-      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
-    ];
-
-    this.width = width;
-    this.height = height;
-    this.fontScale = scale;
-  }
-  PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ {
-    /**
-     * Clones viewport with additional properties.
-     * @param args {Object} (optional) If specified, may contain the 'scale' or
-     * 'rotation' properties to override the corresponding properties in
-     * the cloned viewport.
-     * @returns {PDFJS.PageViewport} Cloned viewport.
-     */
-    clone: function PageViewPort_clone(args) {
-      args = args || {};
-      var scale = 'scale' in args ? args.scale : this.scale;
-      var rotation = 'rotation' in args ? args.rotation : this.rotation;
-      return new PageViewport(this.viewBox.slice(), scale, rotation,
-                              this.offsetX, this.offsetY, args.dontFlip);
-    },
-    /**
-     * Converts PDF point to the viewport coordinates. For examples, useful for
-     * converting PDF location into canvas pixel coordinates.
-     * @param x {number} X coordinate.
-     * @param y {number} Y coordinate.
-     * @returns {Object} Object that contains 'x' and 'y' properties of the
-     * point in the viewport coordinate space.
-     * @see {@link convertToPdfPoint}
-     * @see {@link convertToViewportRectangle}
-     */
-    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
-      return Util.applyTransform([x, y], this.transform);
-    },
-    /**
-     * Converts PDF rectangle to the viewport coordinates.
-     * @param rect {Array} xMin, yMin, xMax and yMax coordinates.
-     * @returns {Array} Contains corresponding coordinates of the rectangle
-     * in the viewport coordinate space.
-     * @see {@link convertToViewportPoint}
-     */
-    convertToViewportRectangle:
-      function PageViewport_convertToViewportRectangle(rect) {
-      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
-      var br = Util.applyTransform([rect[2], rect[3]], this.transform);
-      return [tl[0], tl[1], br[0], br[1]];
-    },
-    /**
-     * Converts viewport coordinates to the PDF location. For examples, useful
-     * for converting canvas pixel location into PDF one.
-     * @param x {number} X coordinate.
-     * @param y {number} Y coordinate.
-     * @returns {Object} Object that contains 'x' and 'y' properties of the
-     * point in the PDF coordinate space.
-     * @see {@link convertToViewportPoint}
-     */
-    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
-      return Util.applyInverseTransform([x, y], this.transform);
-    }
-  };
-  return PageViewport;
-})();
-
-var PDFStringTranslateTable = [
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
-  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
-  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
-  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
-];
-
-function stringToPDFString(str) {
-  var i, n = str.length, strBuf = [];
-  if (str[0] === '\xFE' && str[1] === '\xFF') {
-    // UTF16BE BOM
-    for (i = 2; i < n; i += 2) {
-      strBuf.push(String.fromCharCode(
-        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));
-    }
-  } else {
-    for (i = 0; i < n; ++i) {
-      var code = PDFStringTranslateTable[str.charCodeAt(i)];
-      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
-    }
-  }
-  return strBuf.join('');
-}
-
-function stringToUTF8String(str) {
-  return decodeURIComponent(escape(str));
-}
-
-function utf8StringToString(str) {
-  return unescape(encodeURIComponent(str));
-}
-
-function isEmptyObj(obj) {
-  for (var key in obj) {
-    return false;
-  }
-  return true;
-}
-
-function isBool(v) {
-  return typeof v === 'boolean';
-}
-
-function isInt(v) {
-  return typeof v === 'number' && ((v | 0) === v);
-}
-
-function isNum(v) {
-  return typeof v === 'number';
-}
-
-function isString(v) {
-  return typeof v === 'string';
-}
-
-function isName(v) {
-  return v instanceof Name;
-}
-
-function isCmd(v, cmd) {
-  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
-}
-
-function isDict(v, type) {
-  if (!(v instanceof Dict)) {
-    return false;
-  }
-  if (!type) {
-    return true;
-  }
-  var dictType = v.get('Type');
-  return isName(dictType) && dictType.name === type;
-}
-
-function isArray(v) {
-  return v instanceof Array;
-}
-
-function isStream(v) {
-  return typeof v === 'object' && v !== null && v.getBytes !== undefined;
-}
-
-function isArrayBuffer(v) {
-  return typeof v === 'object' && v !== null && v.byteLength !== undefined;
-}
-
-function isRef(v) {
-  return v instanceof Ref;
-}
-
-/**
- * Promise Capability object.
- *
- * @typedef {Object} PromiseCapability
- * @property {Promise} promise - A promise object.
- * @property {function} resolve - Fullfills the promise.
- * @property {function} reject - Rejects the promise.
- */
-
-/**
- * Creates a promise capability object.
- * @alias PDFJS.createPromiseCapability
- *
- * @return {PromiseCapability} A capability object contains:
- * - a Promise, resolve and reject methods.
- */
-function createPromiseCapability() {
-  var capability = {};
-  capability.promise = new Promise(function (resolve, reject) {
-    capability.resolve = resolve;
-    capability.reject = reject;
-  });
-  return capability;
-}
-
-PDFJS.createPromiseCapability = createPromiseCapability;
-
-/**
- * Polyfill for Promises:
- * The following promise implementation tries to generally implement the
- * Promise/A+ spec. Some notable differences from other promise libaries are:
- * - There currently isn't a seperate deferred and promise object.
- * - Unhandled rejections eventually show an error if they aren't handled.
- *
- * Based off of the work in:
- * https://bugzilla.mozilla.org/show_bug.cgi?id=810490
- */
-(function PromiseClosure() {
-  if (globalScope.Promise) {
-    // Promises existing in the DOM/Worker, checking presence of all/resolve
-    if (typeof globalScope.Promise.all !== 'function') {
-      globalScope.Promise.all = function (iterable) {
-        var count = 0, results = [], resolve, reject;
-        var promise = new globalScope.Promise(function (resolve_, reject_) {
-          resolve = resolve_;
-          reject = reject_;
-        });
-        iterable.forEach(function (p, i) {
-          count++;
-          p.then(function (result) {
-            results[i] = result;
-            count--;
-            if (count === 0) {
-              resolve(results);
-            }
-          }, reject);
-        });
-        if (count === 0) {
-          resolve(results);
-        }
-        return promise;
-      };
-    }
-    if (typeof globalScope.Promise.resolve !== 'function') {
-      globalScope.Promise.resolve = function (value) {
-        return new globalScope.Promise(function (resolve) { resolve(value); });
-      };
-    }
-    if (typeof globalScope.Promise.reject !== 'function') {
-      globalScope.Promise.reject = function (reason) {
-        return new globalScope.Promise(function (resolve, reject) {
-          reject(reason);
-        });
-      };
-    }
-    if (typeof globalScope.Promise.prototype.catch !== 'function') {
-      globalScope.Promise.prototype.catch = function (onReject) {
-        return globalScope.Promise.prototype.then(undefined, onReject);
-      };
-    }
-    return;
-  }
-//#if !MOZCENTRAL
-  var STATUS_PENDING = 0;
-  var STATUS_RESOLVED = 1;
-  var STATUS_REJECTED = 2;
-
-  // In an attempt to avoid silent exceptions, unhandled rejections are
-  // tracked and if they aren't handled in a certain amount of time an
-  // error is logged.
-  var REJECTION_TIMEOUT = 500;
-
-  var HandlerManager = {
-    handlers: [],
-    running: false,
-    unhandledRejections: [],
-    pendingRejectionCheck: false,
-
-    scheduleHandlers: function scheduleHandlers(promise) {
-      if (promise._status === STATUS_PENDING) {
-        return;
-      }
-
-      this.handlers = this.handlers.concat(promise._handlers);
-      promise._handlers = [];
-
-      if (this.running) {
-        return;
-      }
-      this.running = true;
-
-      setTimeout(this.runHandlers.bind(this), 0);
-    },
-
-    runHandlers: function runHandlers() {
-      var RUN_TIMEOUT = 1; // ms
-      var timeoutAt = Date.now() + RUN_TIMEOUT;
-      while (this.handlers.length > 0) {
-        var handler = this.handlers.shift();
-
-        var nextStatus = handler.thisPromise._status;
-        var nextValue = handler.thisPromise._value;
-
-        try {
-          if (nextStatus === STATUS_RESOLVED) {
-            if (typeof handler.onResolve === 'function') {
-              nextValue = handler.onResolve(nextValue);
-            }
-          } else if (typeof handler.onReject === 'function') {
-              nextValue = handler.onReject(nextValue);
-              nextStatus = STATUS_RESOLVED;
-
-              if (handler.thisPromise._unhandledRejection) {
-                this.removeUnhandeledRejection(handler.thisPromise);
-              }
-          }
-        } catch (ex) {
-          nextStatus = STATUS_REJECTED;
-          nextValue = ex;
-        }
-
-        handler.nextPromise._updateStatus(nextStatus, nextValue);
-        if (Date.now() >= timeoutAt) {
-          break;
-        }
-      }
-
-      if (this.handlers.length > 0) {
-        setTimeout(this.runHandlers.bind(this), 0);
-        return;
-      }
-
-      this.running = false;
-    },
-
-    addUnhandledRejection: function addUnhandledRejection(promise) {
-      this.unhandledRejections.push({
-        promise: promise,
-        time: Date.now()
-      });
-      this.scheduleRejectionCheck();
-    },
-
-    removeUnhandeledRejection: function removeUnhandeledRejection(promise) {
-      promise._unhandledRejection = false;
-      for (var i = 0; i < this.unhandledRejections.length; i++) {
-        if (this.unhandledRejections[i].promise === promise) {
-          this.unhandledRejections.splice(i);
-          i--;
-        }
-      }
-    },
-
-    scheduleRejectionCheck: function scheduleRejectionCheck() {
-      if (this.pendingRejectionCheck) {
-        return;
-      }
-      this.pendingRejectionCheck = true;
-      setTimeout(function rejectionCheck() {
-        this.pendingRejectionCheck = false;
-        var now = Date.now();
-        for (var i = 0; i < this.unhandledRejections.length; i++) {
-          if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) {
-            var unhandled = this.unhandledRejections[i].promise._value;
-            var msg = 'Unhandled rejection: ' + unhandled;
-            if (unhandled.stack) {
-              msg += '\n' + unhandled.stack;
-            }
-            warn(msg);
-            this.unhandledRejections.splice(i);
-            i--;
-          }
-        }
-        if (this.unhandledRejections.length) {
-          this.scheduleRejectionCheck();
-        }
-      }.bind(this), REJECTION_TIMEOUT);
-    }
-  };
-
-  function Promise(resolver) {
-    this._status = STATUS_PENDING;
-    this._handlers = [];
-    try {
-      resolver.call(this, this._resolve.bind(this), this._reject.bind(this));
-    } catch (e) {
-      this._reject(e);
-    }
-  }
-  /**
-   * Builds a promise that is resolved when all the passed in promises are
-   * resolved.
-   * @param {array} array of data and/or promises to wait for.
-   * @return {Promise} New dependant promise.
-   */
-  Promise.all = function Promise_all(promises) {
-    var resolveAll, rejectAll;
-    var deferred = new Promise(function (resolve, reject) {
-      resolveAll = resolve;
-      rejectAll = reject;
-    });
-    var unresolved = promises.length;
-    var results = [];
-    if (unresolved === 0) {
-      resolveAll(results);
-      return deferred;
-    }
-    function reject(reason) {
-      if (deferred._status === STATUS_REJECTED) {
-        return;
-      }
-      results = [];
-      rejectAll(reason);
-    }
-    for (var i = 0, ii = promises.length; i < ii; ++i) {
-      var promise = promises[i];
-      var resolve = (function(i) {
-        return function(value) {
-          if (deferred._status === STATUS_REJECTED) {
-            return;
-          }
-          results[i] = value;
-          unresolved--;
-          if (unresolved === 0) {
-            resolveAll(results);
-          }
-        };
-      })(i);
-      if (Promise.isPromise(promise)) {
-        promise.then(resolve, reject);
-      } else {
-        resolve(promise);
-      }
-    }
-    return deferred;
-  };
-
-  /**
-   * Checks if the value is likely a promise (has a 'then' function).
-   * @return {boolean} true if value is thenable
-   */
-  Promise.isPromise = function Promise_isPromise(value) {
-    return value && typeof value.then === 'function';
-  };
-
-  /**
-   * Creates resolved promise
-   * @param value resolve value
-   * @returns {Promise}
-   */
-  Promise.resolve = function Promise_resolve(value) {
-    return new Promise(function (resolve) { resolve(value); });
-  };
-
-  /**
-   * Creates rejected promise
-   * @param reason rejection value
-   * @returns {Promise}
-   */
-  Promise.reject = function Promise_reject(reason) {
-    return new Promise(function (resolve, reject) { reject(reason); });
-  };
-
-  Promise.prototype = {
-    _status: null,
-    _value: null,
-    _handlers: null,
-    _unhandledRejection: null,
-
-    _updateStatus: function Promise__updateStatus(status, value) {
-      if (this._status === STATUS_RESOLVED ||
-          this._status === STATUS_REJECTED) {
-        return;
-      }
-
-      if (status === STATUS_RESOLVED &&
-          Promise.isPromise(value)) {
-        value.then(this._updateStatus.bind(this, STATUS_RESOLVED),
-                   this._updateStatus.bind(this, STATUS_REJECTED));
-        return;
-      }
-
-      this._status = status;
-      this._value = value;
-
-      if (status === STATUS_REJECTED && this._handlers.length === 0) {
-        this._unhandledRejection = true;
-        HandlerManager.addUnhandledRejection(this);
-      }
-
-      HandlerManager.scheduleHandlers(this);
-    },
-
-    _resolve: function Promise_resolve(value) {
-      this._updateStatus(STATUS_RESOLVED, value);
-    },
-
-    _reject: function Promise_reject(reason) {
-      this._updateStatus(STATUS_REJECTED, reason);
-    },
-
-    then: function Promise_then(onResolve, onReject) {
-      var nextPromise = new Promise(function (resolve, reject) {
-        this.resolve = resolve;
-        this.reject = reject;
-      });
-      this._handlers.push({
-        thisPromise: this,
-        onResolve: onResolve,
-        onReject: onReject,
-        nextPromise: nextPromise
-      });
-      HandlerManager.scheduleHandlers(this);
-      return nextPromise;
-    },
-
-    catch: function Promise_catch(onReject) {
-      return this.then(undefined, onReject);
-    }
-  };
-
-  globalScope.Promise = Promise;
-//#else
-//throw new Error('DOM Promise is not present');
-//#endif
-})();
-
-var StatTimer = (function StatTimerClosure() {
-  function rpad(str, pad, length) {
-    while (str.length < length) {
-      str += pad;
-    }
-    return str;
-  }
-  function StatTimer() {
-    this.started = {};
-    this.times = [];
-    this.enabled = true;
-  }
-  StatTimer.prototype = {
-    time: function StatTimer_time(name) {
-      if (!this.enabled) {
-        return;
-      }
-      if (name in this.started) {
-        warn('Timer is already running for ' + name);
-      }
-      this.started[name] = Date.now();
-    },
-    timeEnd: function StatTimer_timeEnd(name) {
-      if (!this.enabled) {
-        return;
-      }
-      if (!(name in this.started)) {
-        warn('Timer has not been started for ' + name);
-      }
-      this.times.push({
-        'name': name,
-        'start': this.started[name],
-        'end': Date.now()
-      });
-      // Remove timer from started so it can be called again.
-      delete this.started[name];
-    },
-    toString: function StatTimer_toString() {
-      var i, ii;
-      var times = this.times;
-      var out = '';
-      // Find the longest name for padding purposes.
-      var longest = 0;
-      for (i = 0, ii = times.length; i < ii; ++i) {
-        var name = times[i]['name'];
-        if (name.length > longest) {
-          longest = name.length;
-        }
-      }
-      for (i = 0, ii = times.length; i < ii; ++i) {
-        var span = times[i];
-        var duration = span.end - span.start;
-        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
-      }
-      return out;
-    }
-  };
-  return StatTimer;
-})();
-
-PDFJS.createBlob = function createBlob(data, contentType) {
-  if (typeof Blob !== 'undefined') {
-    return new Blob([data], { type: contentType });
-  }
-  // Blob builder is deprecated in FF14 and removed in FF18.
-  var bb = new MozBlobBuilder();
-  bb.append(data);
-  return bb.getBlob(contentType);
-};
-
-PDFJS.createObjectURL = (function createObjectURLClosure() {
-  // Blob/createObjectURL is not available, falling back to data schema.
-  var digits =
-    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
-
-  return function createObjectURL(data, contentType) {
-    if (!PDFJS.disableCreateObjectURL &&
-        typeof URL !== 'undefined' && URL.createObjectURL) {
-      var blob = PDFJS.createBlob(data, contentType);
-      return URL.createObjectURL(blob);
-    }
-
-    var buffer = 'data:' + contentType + ';base64,';
-    for (var i = 0, ii = data.length; i < ii; i += 3) {
-      var b1 = data[i] & 0xFF;
-      var b2 = data[i + 1] & 0xFF;
-      var b3 = data[i + 2] & 0xFF;
-      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
-      var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
-      var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;
-      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
-    }
-    return buffer;
-  };
-})();
-
-function MessageHandler(name, comObj) {
-  this.name = name;
-  this.comObj = comObj;
-  this.callbackIndex = 1;
-  this.postMessageTransfers = true;
-  var callbacksCapabilities = this.callbacksCapabilities = {};
-  var ah = this.actionHandler = {};
-
-  ah['console_log'] = [function ahConsoleLog(data) {
-    console.log.apply(console, data);
-  }];
-  ah['console_error'] = [function ahConsoleError(data) {
-    console.error.apply(console, data);
-  }];
-  ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) {
-    UnsupportedManager.notify(data);
-  }];
-
-  comObj.onmessage = function messageHandlerComObjOnMessage(event) {
-    var data = event.data;
-    if (data.isReply) {
-      var callbackId = data.callbackId;
-      if (data.callbackId in callbacksCapabilities) {
-        var callback = callbacksCapabilities[callbackId];
-        delete callbacksCapabilities[callbackId];
-        if ('error' in data) {
-          callback.reject(data.error);
-        } else {
-          callback.resolve(data.data);
-        }
-      } else {
-        error('Cannot resolve callback ' + callbackId);
-      }
-    } else if (data.action in ah) {
-      var action = ah[data.action];
-      if (data.callbackId) {
-        Promise.resolve().then(function () {
-          return action[0].call(action[1], data.data);
-        }).then(function (result) {
-          comObj.postMessage({
-            isReply: true,
-            callbackId: data.callbackId,
-            data: result
-          });
-        }, function (reason) {
-          comObj.postMessage({
-            isReply: true,
-            callbackId: data.callbackId,
-            error: reason
-          });
-        });
-      } else {
-        action[0].call(action[1], data.data);
-      }
-    } else {
-      error('Unknown action from worker: ' + data.action);
-    }
-  };
-}
-
-MessageHandler.prototype = {
-  on: function messageHandlerOn(actionName, handler, scope) {
-    var ah = this.actionHandler;
-    if (ah[actionName]) {
-      error('There is already an actionName called "' + actionName + '"');
-    }
-    ah[actionName] = [handler, scope];
-  },
-  /**
-   * Sends a message to the comObj to invoke the action with the supplied data.
-   * @param {String} actionName Action to call.
-   * @param {JSON} data JSON data to send.
-   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers
-   */
-  send: function messageHandlerSend(actionName, data, transfers) {
-    var message = {
-      action: actionName,
-      data: data
-    };
-    this.postMessage(message, transfers);
-  },
-  /**
-   * Sends a message to the comObj to invoke the action with the supplied data.
-   * Expects that other side will callback with the response.
-   * @param {String} actionName Action to call.
-   * @param {JSON} data JSON data to send.
-   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers.
-   * @returns {Promise} Promise to be resolved with response data.
-   */
-  sendWithPromise:
-    function messageHandlerSendWithPromise(actionName, data, transfers) {
-    var callbackId = this.callbackIndex++;
-    var message = {
-      action: actionName,
-      data: data,
-      callbackId: callbackId
-    };
-    var capability = createPromiseCapability();
-    this.callbacksCapabilities[callbackId] = capability;
-    try {
-      this.postMessage(message, transfers);
-    } catch (e) {
-      capability.reject(e);
-    }
-    return capability.promise;
-  },
-  /**
-   * Sends raw message to the comObj.
-   * @private
-   * @param message {Object} Raw message.
-   * @param transfers List of transfers/ArrayBuffers, or undefined.
-   */
-  postMessage: function (message, transfers) {
-    if (transfers && this.postMessageTransfers) {
-      this.comObj.postMessage(message, transfers);
-    } else {
-      this.comObj.postMessage(message);
-    }
-  }
-};
-
-function loadJpegStream(id, imageUrl, objs) {
-  var img = new Image();
-  img.onload = (function loadJpegStream_onloadClosure() {
-    objs.resolve(id, img);
-  });
-  img.onerror = (function loadJpegStream_onerrorClosure() {
-    objs.resolve(id, null);
-    warn('Error during JPEG image loading');
-  });
-  img.src = imageUrl;
-}
-
-
-/**
- * The maximum allowed image size in total pixels e.g. width * height. Images
- * above this value will not be drawn. Use -1 for no limit.
- * @var {number}
- */
-PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ?
-                      -1 : PDFJS.maxImageSize);
-
-/**
- * The url of where the predefined Adobe CMaps are located. Include trailing
- * slash.
- * @var {string}
- */
-PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl);
-
-/**
- * Specifies if CMaps are binary packed.
- * @var {boolean}
- */
-PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked;
-
-/**
- * By default fonts are converted to OpenType fonts and loaded via font face
- * rules. If disabled, the font will be rendered using a built in font renderer
- * that constructs the glyphs with primitive path commands.
- * @var {boolean}
- */
-PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ?
-                         false : PDFJS.disableFontFace);
-
-/**
- * Path for image resources, mainly for annotation icons. Include trailing
- * slash.
- * @var {string}
- */
-PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ?
-                            '' : PDFJS.imageResourcesPath);
-
-/**
- * Disable the web worker and run all code on the main thread. This will happen
- * automatically if the browser doesn't support workers or sending typed arrays
- * to workers.
- * @var {boolean}
- */
-PDFJS.disableWorker = (PDFJS.disableWorker === undefined ?
-                       false : PDFJS.disableWorker);
-
-/**
- * Path and filename of the worker file. Required when the worker is enabled in
- * development mode. If unspecified in the production build, the worker will be
- * loaded based on the location of the pdf.js file.
- * @var {string}
- */
-PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc);
-
-/**
- * Disable range request loading of PDF files. When enabled and if the server
- * supports partial content requests then the PDF will be fetched in chunks.
- * Enabled (false) by default.
- * @var {boolean}
- */
-PDFJS.disableRange = (PDFJS.disableRange === undefined ?
-                      false : PDFJS.disableRange);
-
-/**
- * Disable streaming of PDF file data. By default PDF.js attempts to load PDF
- * in chunks. This default behavior can be disabled.
- * @var {boolean}
- */
-PDFJS.disableStream = (PDFJS.disableStream === undefined ?
-                       false : PDFJS.disableStream);
-
-/**
- * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js
- * will automatically keep fetching more data even if it isn't needed to display
- * the current page. This default behavior can be disabled.
- *
- * NOTE: It is also necessary to disable streaming, see above,
- *       in order for disabling of pre-fetching to work correctly.
- * @var {boolean}
- */
-PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ?
-                          false : PDFJS.disableAutoFetch);
-
-/**
- * Enables special hooks for debugging PDF.js.
- * @var {boolean}
- */
-PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug);
-
-/**
- * Enables transfer usage in postMessage for ArrayBuffers.
- * @var {boolean}
- */
-PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ?
-                              true : PDFJS.postMessageTransfers);
-
-/**
- * Disables URL.createObjectURL usage.
- * @var {boolean}
- */
-PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ?
-                                false : PDFJS.disableCreateObjectURL);
-
-/**
- * Disables WebGL usage.
- * @var {boolean}
- */
-PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ?
-                      true : PDFJS.disableWebGL);
-
-/**
- * Disables fullscreen support, and by extension Presentation Mode,
- * in browsers which support the fullscreen API.
- * @var {boolean}
- */
-PDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ?
-                           false : PDFJS.disableFullscreen);
-
-/**
- * Enables CSS only zooming.
- * @var {boolean}
- */
-PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ?
-                        false : PDFJS.useOnlyCssZoom);
-
-/**
- * Controls the logging level.
- * The constants from PDFJS.VERBOSITY_LEVELS should be used:
- * - errors
- * - warnings [default]
- * - infos
- * @var {number}
- */
-PDFJS.verbosity = (PDFJS.verbosity === undefined ?
-                   PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity);
-
-/**
- * The maximum supported canvas size in total pixels e.g. width * height.
- * The default value is 4096 * 4096. Use -1 for no limit.
- * @var {number}
- */
-PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ?
-                         16777216 : PDFJS.maxCanvasPixels);
-
-/**
- * Opens external links in a new window if enabled. The default behavior opens
- * external links in the PDF.js window.
- * @var {boolean}
- */
-PDFJS.openExternalLinksInNewWindow = (
-  PDFJS.openExternalLinksInNewWindow === undefined ?
-    false : PDFJS.openExternalLinksInNewWindow);
-
-/**
- * Document initialization / loading parameters object.
- *
- * @typedef {Object} DocumentInitParameters
- * @property {string}     url   - The URL of the PDF.
- * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays
- *   (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded,
- *   use atob() to convert it to a binary string first.
- * @property {Object}     httpHeaders - Basic authentication headers.
- * @property {boolean}    withCredentials - Indicates whether or not cross-site
- *   Access-Control requests should be made using credentials such as cookies
- *   or authorization headers. The default is false.
- * @property {string}     password - For decrypting password-protected PDFs.
- * @property {TypedArray} initialData - A typed array with the first portion or
- *   all of the pdf data. Used by the extension since some data is already
- *   loaded before the switch to range requests.
- * @property {number}     length - The PDF file length. It's used for progress
- *   reports and range requests operations.
- * @property {PDFDataRangeTransport} range
- */
-
-/**
- * @typedef {Object} PDFDocumentStats
- * @property {Array} streamTypes - Used stream types in the document (an item
- *   is set to true if specific stream ID was used in the document).
- * @property {Array} fontTypes - Used font type in the document (an item is set
- *   to true if specific font ID was used in the document).
- */
-
-/**
- * This is the main entry point for loading a PDF and interacting with it.
- * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
- * is used, which means it must follow the same origin rules that any XHR does
- * e.g. No cross domain requests without CORS.
- *
- * @param {string|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src
- * Can be a url to where a PDF is located, a typed array (Uint8Array)
- * already populated with data or parameter object.
- *
- * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used
- * if you want to manually serve range requests for data in the PDF.
- *
- * @param {function} passwordCallback (deprecated) It is used to request a
- * password if wrong or no password was provided. The callback receives two
- * parameters: function that needs to be called with new password and reason
- * (see {PasswordResponses}).
- *
- * @param {function} progressCallback (deprecated) It is used to be able to
- * monitor the loading progress of the PDF file (necessary to implement e.g.
- * a loading bar). The callback receives an {Object} with the properties:
- * {number} loaded and {number} total.
- *
- * @return {PDFDocumentLoadingTask}
- */
-PDFJS.getDocument = function getDocument(src,
-                                         pdfDataRangeTransport,
-                                         passwordCallback,
-                                         progressCallback) {
-  var task = new PDFDocumentLoadingTask();
-
-  // Support of the obsolete arguments (for compatibility with API v1.0)
-  if (pdfDataRangeTransport) {
-    if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) {
-      // Not a PDFDataRangeTransport instance, trying to add missing properties.
-      pdfDataRangeTransport = Object.create(pdfDataRangeTransport);
-      pdfDataRangeTransport.length = src.length;
-      pdfDataRangeTransport.initialData = src.initialData;
-    }
-    src = Object.create(src);
-    src.range = pdfDataRangeTransport;
-  }
-  task.onPassword = passwordCallback || null;
-  task.onProgress = progressCallback || null;
-
-  var workerInitializedCapability, transport;
-  var source;
-  if (typeof src === 'string') {
-    source = { url: src };
-  } else if (isArrayBuffer(src)) {
-    source = { data: src };
-  } else if (src instanceof PDFDataRangeTransport) {
-    source = { range: src };
-  } else {
-    if (typeof src !== 'object') {
-      error('Invalid parameter in getDocument, need either Uint8Array, ' +
-        'string or a parameter object');
-    }
-    if (!src.url && !src.data && !src.range) {
-      error('Invalid parameter object: need either .data, .range or .url');
-    }
-
-    source = src;
-  }
-
-  var params = {};
-  for (var key in source) {
-    if (key === 'url' && typeof window !== 'undefined') {
-      // The full path is required in the 'url' field.
-      params[key] = combineUrl(window.location.href, source[key]);
-      continue;
-    } else if (key === 'range') {
-      continue;
-    } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {
-      // Converting string or array-like data to Uint8Array.
-      var pdfBytes = source[key];
-      if (typeof pdfBytes === 'string') {
-        params[key] = stringToBytes(pdfBytes);
-      } else if (typeof pdfBytes === 'object' && pdfBytes !== null &&
-                 !isNaN(pdfBytes.length)) {
-        params[key] = new Uint8Array(pdfBytes);
-      } else {
-        error('Invalid PDF binary data: either typed array, string or ' +
-              'array-like object is expected in the data property.');
-      }
-      continue;
-    }
-    params[key] = source[key];
-  }
-
-  workerInitializedCapability = createPromiseCapability();
-  transport = new WorkerTransport(workerInitializedCapability, source.range);
-  workerInitializedCapability.promise.then(function transportInitialized() {
-    transport.fetchDocument(task, params);
-  });
-
-  return task;
-};
-
-/**
- * PDF document loading operation.
- * @class
- */
-var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() {
-  /** @constructs PDFDocumentLoadingTask */
-  function PDFDocumentLoadingTask() {
-    this._capability = createPromiseCapability();
-
-    /**
-     * Callback to request a password if wrong or no password was provided.
-     * The callback receives two parameters: function that needs to be called
-     * with new password and reason (see {PasswordResponses}).
-     */
-    this.onPassword = null;
-
-    /**
-     * Callback to be able to monitor the loading progress of the PDF file
-     * (necessary to implement e.g. a loading bar). The callback receives
-     * an {Object} with the properties: {number} loaded and {number} total.
-     */
-    this.onProgress = null;
-  }
-
-  PDFDocumentLoadingTask.prototype =
-      /** @lends PDFDocumentLoadingTask.prototype */ {
-    /**
-     * @return {Promise}
-     */
-    get promise() {
-      return this._capability.promise;
-    },
-
-    // TODO add cancel or abort method
-
-    /**
-     * Registers callbacks to indicate the document loading completion.
-     *
-     * @param {function} onFulfilled The callback for the loading completion.
-     * @param {function} onRejected The callback for the loading failure.
-     * @return {Promise} A promise that is resolved after the onFulfilled or
-     *                   onRejected callback.
-     */
-    then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {
-      return this.promise.then.apply(this.promise, arguments);
-    }
-  };
-
-  return PDFDocumentLoadingTask;
-})();
-
-/**
- * Abstract class to support range requests file loading.
- * @class
- */
-var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() {
-  /**
-   * @constructs PDFDataRangeTransport
-   * @param {number} length
-   * @param {Uint8Array} initialData
-   */
-  function PDFDataRangeTransport(length, initialData) {
-    this.length = length;
-    this.initialData = initialData;
-
-    this._rangeListeners = [];
-    this._progressListeners = [];
-    this._progressiveReadListeners = [];
-    this._readyCapability = createPromiseCapability();
-  }
-  PDFDataRangeTransport.prototype =
-      /** @lends PDFDataRangeTransport.prototype */ {
-    addRangeListener:
-        function PDFDataRangeTransport_addRangeListener(listener) {
-      this._rangeListeners.push(listener);
-    },
-
-    addProgressListener:
-        function PDFDataRangeTransport_addProgressListener(listener) {
-      this._progressListeners.push(listener);
-    },
-
-    addProgressiveReadListener:
-        function PDFDataRangeTransport_addProgressiveReadListener(listener) {
-      this._progressiveReadListeners.push(listener);
-    },
-
-    onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {
-      var listeners = this._rangeListeners;
-      for (var i = 0, n = listeners.length; i < n; ++i) {
-        listeners[i](begin, chunk);
-      }
-    },
-
-    onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {
-      this._readyCapability.promise.then(function () {
-        var listeners = this._progressListeners;
-        for (var i = 0, n = listeners.length; i < n; ++i) {
-          listeners[i](loaded);
-        }
-      }.bind(this));
-    },
-
-    onDataProgressiveRead:
-        function PDFDataRangeTransport_onDataProgress(chunk) {
-      this._readyCapability.promise.then(function () {
-        var listeners = this._progressiveReadListeners;
-        for (var i = 0, n = listeners.length; i < n; ++i) {
-          listeners[i](chunk);
-        }
-      }.bind(this));
-    },
-
-    transportReady: function PDFDataRangeTransport_transportReady() {
-      this._readyCapability.resolve();
-    },
-
-    requestDataRange:
-        function PDFDataRangeTransport_requestDataRange(begin, end) {
-      throw new Error('Abstract method PDFDataRangeTransport.requestDataRange');
-    }
-  };
-  return PDFDataRangeTransport;
-})();
-
-PDFJS.PDFDataRangeTransport = PDFDataRangeTransport;
-
-/**
- * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
- * properties that can be read synchronously.
- * @class
- */
-var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
-  function PDFDocumentProxy(pdfInfo, transport) {
-    this.pdfInfo = pdfInfo;
-    this.transport = transport;
-  }
-  PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ {
-    /**
-     * @return {number} Total number of pages the PDF contains.
-     */
-    get numPages() {
-      return this.pdfInfo.numPages;
-    },
-    /**
-     * @return {string} A unique ID to identify a PDF. Not guaranteed to be
-     * unique.
-     */
-    get fingerprint() {
-      return this.pdfInfo.fingerprint;
-    },
-    /**
-     * @param {number} pageNumber The page number to get. The first page is 1.
-     * @return {Promise} A promise that is resolved with a {@link PDFPageProxy}
-     * object.
-     */
-    getPage: function PDFDocumentProxy_getPage(pageNumber) {
-      return this.transport.getPage(pageNumber);
-    },
-    /**
-     * @param {{num: number, gen: number}} ref The page reference. Must have
-     *   the 'num' and 'gen' properties.
-     * @return {Promise} A promise that is resolved with the page index that is
-     * associated with the reference.
-     */
-    getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {
-      return this.transport.getPageIndex(ref);
-    },
-    /**
-     * @return {Promise} A promise that is resolved with a lookup table for
-     * mapping named destinations to reference numbers.
-     *
-     * This can be slow for large documents: use getDestination instead
-     */
-    getDestinations: function PDFDocumentProxy_getDestinations() {
-      return this.transport.getDestinations();
-    },
-    /**
-     * @param {string} id The named destination to get.
-     * @return {Promise} A promise that is resolved with all information
-     * of the given named destination.
-     */
-    getDestination: function PDFDocumentProxy_getDestination(id) {
-      return this.transport.getDestination(id);
-    },
-    /**
-     * @return {Promise} A promise that is resolved with a lookup table for
-     * mapping named attachments to their content.
-     */
-    getAttachments: function PDFDocumentProxy_getAttachments() {
-      return this.transport.getAttachments();
-    },
-    /**
-     * @return {Promise} A promise that is resolved with an array of all the
-     * JavaScript strings in the name tree.
-     */
-    getJavaScript: function PDFDocumentProxy_getJavaScript() {
-      return this.transport.getJavaScript();
-    },
-    /**
-     * @return {Promise} A promise that is resolved with an {Array} that is a
-     * tree outline (if it has one) of the PDF. The tree is in the format of:
-     * [
-     *  {
-     *   title: string,
-     *   bold: boolean,
-     *   italic: boolean,
-     *   color: rgb array,
-     *   dest: dest obj,
-     *   items: array of more items like this
-     *  },
-     *  ...
-     * ].
-     */
-    getOutline: function PDFDocumentProxy_getOutline() {
-      return this.transport.getOutline();
-    },
-    /**
-     * @return {Promise} A promise that is resolved with an {Object} that has
-     * info and metadata properties.  Info is an {Object} filled with anything
-     * available in the information dictionary and similarly metadata is a
-     * {Metadata} object with information from the metadata section of the PDF.
-     */
-    getMetadata: function PDFDocumentProxy_getMetadata() {
-      return this.transport.getMetadata();
-    },
-    /**
-     * @return {Promise} A promise that is resolved with a TypedArray that has
-     * the raw data from the PDF.
-     */
-    getData: function PDFDocumentProxy_getData() {
-      return this.transport.getData();
-    },
-    /**
-     * @return {Promise} A promise that is resolved when the document's data
-     * is loaded. It is resolved with an {Object} that contains the length
-     * property that indicates size of the PDF data in bytes.
-     */
-    getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {
-      return this.transport.downloadInfoCapability.promise;
-    },
-    /**
-     * @return {Promise} A promise this is resolved with current stats about
-     * document structures (see {@link PDFDocumentStats}).
-     */
-    getStats: function PDFDocumentProxy_getStats() {
-      return this.transport.getStats();
-    },
-    /**
-     * Cleans up resources allocated by the document, e.g. created @font-face.
-     */
-    cleanup: function PDFDocumentProxy_cleanup() {
-      this.transport.startCleanup();
-    },
-    /**
-     * Destroys current document instance and terminates worker.
-     */
-    destroy: function PDFDocumentProxy_destroy() {
-      this.transport.destroy();
-    }
-  };
-  return PDFDocumentProxy;
-})();
-
-/**
- * Page text content.
- *
- * @typedef {Object} TextContent
- * @property {array} items - array of {@link TextItem}
- * @property {Object} styles - {@link TextStyles} objects, indexed by font
- *                    name.
- */
-
-/**
- * Page text content part.
- *
- * @typedef {Object} TextItem
- * @property {string} str - text content.
- * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'.
- * @property {array} transform - transformation matrix.
- * @property {number} width - width in device space.
- * @property {number} height - height in device space.
- * @property {string} fontName - font name used by pdf.js for converted font.
- */
-
-/**
- * Text style.
- *
- * @typedef {Object} TextStyle
- * @property {number} ascent - font ascent.
- * @property {number} descent - font descent.
- * @property {boolean} vertical - text is in vertical mode.
- * @property {string} fontFamily - possible font family
- */
-
-/**
- * Page render parameters.
- *
- * @typedef {Object} RenderParameters
- * @property {Object} canvasContext - A 2D context of a DOM Canvas object.
- * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by
- *                                calling of PDFPage.getViewport method.
- * @property {string} intent - Rendering intent, can be 'display' or 'print'
- *                    (default value is 'display').
- * @property {Object} imageLayer - (optional) An object that has beginLayout,
- *                    endLayout and appendImage functions.
- * @property {function} continueCallback - (deprecated) A function that will be
- *                      called each time the rendering is paused.  To continue
- *                      rendering call the function that is the first argument
- *                      to the callback.
- */
-
-/**
- * PDF page operator list.
- *
- * @typedef {Object} PDFOperatorList
- * @property {Array} fnArray - Array containing the operator functions.
- * @property {Array} argsArray - Array containing the arguments of the
- *                               functions.
- */
-
-/**
- * Proxy to a PDFPage in the worker thread.
- * @class
- */
-var PDFPageProxy = (function PDFPageProxyClosure() {
-  function PDFPageProxy(pageIndex, pageInfo, transport) {
-    this.pageIndex = pageIndex;
-    this.pageInfo = pageInfo;
-    this.transport = transport;
-    this.stats = new StatTimer();
-    this.stats.enabled = !!globalScope.PDFJS.enableStats;
-    this.commonObjs = transport.commonObjs;
-    this.objs = new PDFObjects();
-    this.cleanupAfterRender = false;
-    this.pendingDestroy = false;
-    this.intentStates = {};
-  }
-  PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ {
-    /**
-     * @return {number} Page number of the page. First page is 1.
-     */
-    get pageNumber() {
-      return this.pageIndex + 1;
-    },
-    /**
-     * @return {number} The number of degrees the page is rotated clockwise.
-     */
-    get rotate() {
-      return this.pageInfo.rotate;
-    },
-    /**
-     * @return {Object} The reference that points to this page. It has 'num' and
-     * 'gen' properties.
-     */
-    get ref() {
-      return this.pageInfo.ref;
-    },
-    /**
-     * @return {Array} An array of the visible portion of the PDF page in the
-     * user space units - [x1, y1, x2, y2].
-     */
-    get view() {
-      return this.pageInfo.view;
-    },
-    /**
-     * @param {number} scale The desired scale of the viewport.
-     * @param {number} rotate Degrees to rotate the viewport. If omitted this
-     * defaults to the page rotation.
-     * @return {PDFJS.PageViewport} Contains 'width' and 'height' properties
-     * along with transforms required for rendering.
-     */
-    getViewport: function PDFPageProxy_getViewport(scale, rotate) {
-      if (arguments.length < 2) {
-        rotate = this.rotate;
-      }
-      return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
-    },
-    /**
-     * @return {Promise} A promise that is resolved with an {Array} of the
-     * annotation objects.
-     */
-    getAnnotations: function PDFPageProxy_getAnnotations() {
-      if (this.annotationsPromise) {
-        return this.annotationsPromise;
-      }
-
-      var promise = this.transport.getAnnotations(this.pageIndex);
-      this.annotationsPromise = promise;
-      return promise;
-    },
-    /**
-     * Begins the process of rendering a page to the desired context.
-     * @param {RenderParameters} params Page render parameters.
-     * @return {RenderTask} An object that contains the promise, which
-     *                      is resolved when the page finishes rendering.
-     */
-    render: function PDFPageProxy_render(params) {
-      var stats = this.stats;
-      stats.time('Overall');
-
-      // If there was a pending destroy cancel it so no cleanup happens during
-      // this call to render.
-      this.pendingDestroy = false;
-
-      var renderingIntent = (params.intent === 'print' ? 'print' : 'display');
-
-      if (!this.intentStates[renderingIntent]) {
-        this.intentStates[renderingIntent] = {};
-      }
-      var intentState = this.intentStates[renderingIntent];
-
-      // If there's no displayReadyCapability yet, then the operatorList
-      // was never requested before. Make the request and create the promise.
-      if (!intentState.displayReadyCapability) {
-        intentState.receivingOperatorList = true;
-        intentState.displayReadyCapability = createPromiseCapability();
-        intentState.operatorList = {
-          fnArray: [],
-          argsArray: [],
-          lastChunk: false
-        };
-
-        this.stats.time('Page Request');
-        this.transport.messageHandler.send('RenderPageRequest', {
-          pageIndex: this.pageNumber - 1,
-          intent: renderingIntent
-        });
-      }
-
-      var internalRenderTask = new InternalRenderTask(complete, params,
-                                                      this.objs,
-                                                      this.commonObjs,
-                                                      intentState.operatorList,
-                                                      this.pageNumber);
-      internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';
-      if (!intentState.renderTasks) {
-        intentState.renderTasks = [];
-      }
-      intentState.renderTasks.push(internalRenderTask);
-      var renderTask = internalRenderTask.task;
-
-      // Obsolete parameter support
-      if (params.continueCallback) {
-        renderTask.onContinue = params.continueCallback;
-      }
-
-      var self = this;
-      intentState.displayReadyCapability.promise.then(
-        function pageDisplayReadyPromise(transparency) {
-          if (self.pendingDestroy) {
-            complete();
-            return;
-          }
-          stats.time('Rendering');
-          internalRenderTask.initalizeGraphics(transparency);
-          internalRenderTask.operatorListChanged();
-        },
-        function pageDisplayReadPromiseError(reason) {
-          complete(reason);
-        }
-      );
-
-      function complete(error) {
-        var i = intentState.renderTasks.indexOf(internalRenderTask);
-        if (i >= 0) {
-          intentState.renderTasks.splice(i, 1);
-        }
-
-        if (self.cleanupAfterRender) {
-          self.pendingDestroy = true;
-        }
-        self._tryDestroy();
-
-        if (error) {
-          internalRenderTask.capability.reject(error);
-        } else {
-          internalRenderTask.capability.resolve();
-        }
-        stats.timeEnd('Rendering');
-        stats.timeEnd('Overall');
-      }
-
-      return renderTask;
-    },
-
-    /**
-     * @return {Promise} A promise resolved with an {@link PDFOperatorList}
-     * object that represents page's operator list.
-     */
-    getOperatorList: function PDFPageProxy_getOperatorList() {
-      function operatorListChanged() {
-        if (intentState.operatorList.lastChunk) {
-          intentState.opListReadCapability.resolve(intentState.operatorList);
-        }
-      }
-
-      var renderingIntent = 'oplist';
-      if (!this.intentStates[renderingIntent]) {
-        this.intentStates[renderingIntent] = {};
-      }
-      var intentState = this.intentStates[renderingIntent];
-
-      if (!intentState.opListReadCapability) {
-        var opListTask = {};
-        opListTask.operatorListChanged = operatorListChanged;
-        intentState.receivingOperatorList = true;
-        intentState.opListReadCapability = createPromiseCapability();
-        intentState.renderTasks = [];
-        intentState.renderTasks.push(opListTask);
-        intentState.operatorList = {
-          fnArray: [],
-          argsArray: [],
-          lastChunk: false
-        };
-
-        this.transport.messageHandler.send('RenderPageRequest', {
-          pageIndex: this.pageIndex,
-          intent: renderingIntent
-        });
-      }
-      return intentState.opListReadCapability.promise;
-    },
-
-    /**
-     * @return {Promise} That is resolved a {@link TextContent}
-     * object that represent the page text content.
-     */
-    getTextContent: function PDFPageProxy_getTextContent() {
-      return this.transport.messageHandler.sendWithPromise('GetTextContent', {
-        pageIndex: this.pageNumber - 1
-      });
-    },
-    /**
-     * Destroys resources allocated by the page.
-     */
-    destroy: function PDFPageProxy_destroy() {
-      this.pendingDestroy = true;
-      this._tryDestroy();
-    },
-    /**
-     * For internal use only. Attempts to clean up if rendering is in a state
-     * where that's possible.
-     * @ignore
-     */
-    _tryDestroy: function PDFPageProxy__destroy() {
-      if (!this.pendingDestroy ||
-          Object.keys(this.intentStates).some(function(intent) {
-            var intentState = this.intentStates[intent];
-            return (intentState.renderTasks.length !== 0 ||
-                    intentState.receivingOperatorList);
-          }, this)) {
-        return;
-      }
-
-      Object.keys(this.intentStates).forEach(function(intent) {
-        delete this.intentStates[intent];
-      }, this);
-      this.objs.clear();
-      this.annotationsPromise = null;
-      this.pendingDestroy = false;
-    },
-    /**
-     * For internal use only.
-     * @ignore
-     */
-    _startRenderPage: function PDFPageProxy_startRenderPage(transparency,
-                                                            intent) {
-      var intentState = this.intentStates[intent];
-      // TODO Refactor RenderPageRequest to separate rendering
-      // and operator list logic
-      if (intentState.displayReadyCapability) {
-        intentState.displayReadyCapability.resolve(transparency);
-      }
-    },
-    /**
-     * For internal use only.
-     * @ignore
-     */
-    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk,
-                                                            intent) {
-      var intentState = this.intentStates[intent];
-      var i, ii;
-      // Add the new chunk to the current operator list.
-      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {
-        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
-        intentState.operatorList.argsArray.push(
-          operatorListChunk.argsArray[i]);
-      }
-      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
-
-      // Notify all the rendering tasks there are more operators to be consumed.
-      for (i = 0; i < intentState.renderTasks.length; i++) {
-        intentState.renderTasks[i].operatorListChanged();
-      }
-
-      if (operatorListChunk.lastChunk) {
-        intentState.receivingOperatorList = false;
-        this._tryDestroy();
-      }
-    }
-  };
-  return PDFPageProxy;
-})();
-
-/**
- * For internal use only.
- * @ignore
- */
-var WorkerTransport = (function WorkerTransportClosure() {
-  function WorkerTransport(workerInitializedCapability, pdfDataRangeTransport) {
-    this.pdfDataRangeTransport = pdfDataRangeTransport;
-    this.workerInitializedCapability = workerInitializedCapability;
-    this.commonObjs = new PDFObjects();
-
-    this.loadingTask = null;
-
-    this.pageCache = [];
-    this.pagePromises = [];
-    this.downloadInfoCapability = createPromiseCapability();
-
-    // If worker support isn't disabled explicit and the browser has worker
-    // support, create a new web worker and test if it/the browser fullfills
-    // all requirements to run parts of pdf.js in a web worker.
-    // Right now, the requirement is, that an Uint8Array is still an Uint8Array
-    // as it arrives on the worker. Chrome added this with version 15.
-//#if !SINGLE_FILE
-    if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
-      var workerSrc = PDFJS.workerSrc;
-      if (!workerSrc) {
-        error('No PDFJS.workerSrc specified');
-      }
-
-      try {
-        // Some versions of FF can't create a worker on localhost, see:
-        // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
-        var worker = new Worker(workerSrc);
-        var messageHandler = new MessageHandler('main', worker);
-        this.messageHandler = messageHandler;
-
-        messageHandler.on('test', function transportTest(data) {
-          var supportTypedArray = data && data.supportTypedArray;
-          if (supportTypedArray) {
-            this.worker = worker;
-            if (!data.supportTransfers) {
-              PDFJS.postMessageTransfers = false;
-            }
-            this.setupMessageHandler(messageHandler);
-            workerInitializedCapability.resolve();
-          } else {
-            this.setupFakeWorker();
-          }
-        }.bind(this));
-
-        var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]);
-        // Some versions of Opera throw a DATA_CLONE_ERR on serializing the
-        // typed array. Also, checking if we can use transfers.
-        try {
-          messageHandler.send('test', testObj, [testObj.buffer]);
-        } catch (ex) {
-          info('Cannot use postMessage transfers');
-          testObj[0] = 0;
-          messageHandler.send('test', testObj);
-        }
-        return;
-      } catch (e) {
-        info('The worker has been disabled.');
-      }
-    }
-//#endif
-    // Either workers are disabled, not supported or have thrown an exception.
-    // Thus, we fallback to a faked worker.
-    this.setupFakeWorker();
-  }
-  WorkerTransport.prototype = {
-    destroy: function WorkerTransport_destroy() {
-      this.pageCache = [];
-      this.pagePromises = [];
-      var self = this;
-      this.messageHandler.sendWithPromise('Terminate', null).then(function () {
-        FontLoader.clear();
-        if (self.worker) {
-          self.worker.terminate();
-        }
-      });
-    },
-
-    setupFakeWorker: function WorkerTransport_setupFakeWorker() {
-      globalScope.PDFJS.disableWorker = true;
-
-      if (!PDFJS.fakeWorkerFilesLoadedCapability) {
-        PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability();
-        // In the developer build load worker_loader which in turn loads all the
-        // other files and resolves the promise. In production only the
-        // pdf.worker.js file is needed.
-//#if !PRODUCTION
-        Util.loadScript(PDFJS.workerSrc);
-//#endif
-//#if PRODUCTION && SINGLE_FILE
-//      PDFJS.fakeWorkerFilesLoadedCapability.resolve();
-//#endif
-//#if PRODUCTION && !SINGLE_FILE
-//      Util.loadScript(PDFJS.workerSrc, function() {
-//        PDFJS.fakeWorkerFilesLoadedCapability.resolve();
-//      });
-//#endif
-      }
-      PDFJS.fakeWorkerFilesLoadedCapability.promise.then(function () {
-        warn('Setting up fake worker.');
-        // If we don't use a worker, just post/sendMessage to the main thread.
-        var fakeWorker = {
-          postMessage: function WorkerTransport_postMessage(obj) {
-            fakeWorker.onmessage({data: obj});
-          },
-          terminate: function WorkerTransport_terminate() {}
-        };
-
-        var messageHandler = new MessageHandler('main', fakeWorker);
-        this.setupMessageHandler(messageHandler);
-
-        // If the main thread is our worker, setup the handling for the messages
-        // the main thread sends to it self.
-        PDFJS.WorkerMessageHandler.setup(messageHandler);
-
-        this.workerInitializedCapability.resolve();
-      }.bind(this));
-    },
-
-    setupMessageHandler:
-      function WorkerTransport_setupMessageHandler(messageHandler) {
-      this.messageHandler = messageHandler;
-
-      function updatePassword(password) {
-        messageHandler.send('UpdatePassword', password);
-      }
-
-      var pdfDataRangeTransport = this.pdfDataRangeTransport;
-      if (pdfDataRangeTransport) {
-        pdfDataRangeTransport.addRangeListener(function(begin, chunk) {
-          messageHandler.send('OnDataRange', {
-            begin: begin,
-            chunk: chunk
-          });
-        });
-
-        pdfDataRangeTransport.addProgressListener(function(loaded) {
-          messageHandler.send('OnDataProgress', {
-            loaded: loaded
-          });
-        });
-
-        pdfDataRangeTransport.addProgressiveReadListener(function(chunk) {
-          messageHandler.send('OnDataRange', {
-            chunk: chunk
-          });
-        });
-
-        messageHandler.on('RequestDataRange',
-          function transportDataRange(data) {
-            pdfDataRangeTransport.requestDataRange(data.begin, data.end);
-          }, this);
-      }
-
-      messageHandler.on('GetDoc', function transportDoc(data) {
-        var pdfInfo = data.pdfInfo;
-        this.numPages = data.pdfInfo.numPages;
-        var pdfDocument = new PDFDocumentProxy(pdfInfo, this);
-        this.pdfDocument = pdfDocument;
-        this.loadingTask._capability.resolve(pdfDocument);
-      }, this);
-
-      messageHandler.on('NeedPassword',
-                        function transportNeedPassword(exception) {
-        var loadingTask = this.loadingTask;
-        if (loadingTask.onPassword) {
-          return loadingTask.onPassword(updatePassword,
-                                        PasswordResponses.NEED_PASSWORD);
-        }
-        loadingTask._capability.reject(
-          new PasswordException(exception.message, exception.code));
-      }, this);
-
-      messageHandler.on('IncorrectPassword',
-                        function transportIncorrectPassword(exception) {
-        var loadingTask = this.loadingTask;
-        if (loadingTask.onPassword) {
-          return loadingTask.onPassword(updatePassword,
-                                        PasswordResponses.INCORRECT_PASSWORD);
-        }
-        loadingTask._capability.reject(
-          new PasswordException(exception.message, exception.code));
-      }, this);
-
-      messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {
-        this.loadingTask._capability.reject(
-          new InvalidPDFException(exception.message));
-      }, this);
-
-      messageHandler.on('MissingPDF', function transportMissingPDF(exception) {
-        this.loadingTask._capability.reject(
-          new MissingPDFException(exception.message));
-      }, this);
-
-      messageHandler.on('UnexpectedResponse',
-                        function transportUnexpectedResponse(exception) {
-        this.loadingTask._capability.reject(
-          new UnexpectedResponseException(exception.message, exception.status));
-      }, this);
-
-      messageHandler.on('UnknownError',
-                        function transportUnknownError(exception) {
-        this.loadingTask._capability.reject(
-          new UnknownErrorException(exception.message, exception.details));
-      }, this);
-
-      messageHandler.on('DataLoaded', function transportPage(data) {
-        this.downloadInfoCapability.resolve(data);
-      }, this);
-
-      messageHandler.on('PDFManagerReady', function transportPage(data) {
-        if (this.pdfDataRangeTransport) {
-          this.pdfDataRangeTransport.transportReady();
-        }
-      }, this);
-
-      messageHandler.on('StartRenderPage', function transportRender(data) {
-        var page = this.pageCache[data.pageIndex];
-
-        page.stats.timeEnd('Page Request');
-        page._startRenderPage(data.transparency, data.intent);
-      }, this);
-
-      messageHandler.on('RenderPageChunk', function transportRender(data) {
-        var page = this.pageCache[data.pageIndex];
-
-        page._renderPageChunk(data.operatorList, data.intent);
-      }, this);
-
-      messageHandler.on('commonobj', function transportObj(data) {
-        var id = data[0];
-        var type = data[1];
-        if (this.commonObjs.hasData(id)) {
-          return;
-        }
-
-        switch (type) {
-          case 'Font':
-            var exportedData = data[2];
-
-            var font;
-            if ('error' in exportedData) {
-              var error = exportedData.error;
-              warn('Error during font loading: ' + error);
-              this.commonObjs.resolve(id, error);
-              break;
-            } else {
-              font = new FontFaceObject(exportedData);
-            }
-
-            FontLoader.bind(
-              [font],
-              function fontReady(fontObjs) {
-                this.commonObjs.resolve(id, font);
-              }.bind(this)
-            );
-            break;
-          case 'FontPath':
-            this.commonObjs.resolve(id, data[2]);
-            break;
-          default:
-            error('Got unknown common object type ' + type);
-        }
-      }, this);
-
-      messageHandler.on('obj', function transportObj(data) {
-        var id = data[0];
-        var pageIndex = data[1];
-        var type = data[2];
-        var pageProxy = this.pageCache[pageIndex];
-        var imageData;
-        if (pageProxy.objs.hasData(id)) {
-          return;
-        }
-
-        switch (type) {
-          case 'JpegStream':
-            imageData = data[3];
-            loadJpegStream(id, imageData, pageProxy.objs);
-            break;
-          case 'Image':
-            imageData = data[3];
-            pageProxy.objs.resolve(id, imageData);
-
-            // heuristics that will allow not to store large data
-            var MAX_IMAGE_SIZE_TO_STORE = 8000000;
-            if (imageData && 'data' in imageData &&
-                imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
-              pageProxy.cleanupAfterRender = true;
-            }
-            break;
-          default:
-            error('Got unknown object type ' + type);
-        }
-      }, this);
-
-      messageHandler.on('DocProgress', function transportDocProgress(data) {
-        var loadingTask = this.loadingTask;
-        if (loadingTask.onProgress) {
-          loadingTask.onProgress({
-            loaded: data.loaded,
-            total: data.total
-          });
-        }
-      }, this);
-
-      messageHandler.on('PageError', function transportError(data) {
-        var page = this.pageCache[data.pageNum - 1];
-        var intentState = page.intentStates[data.intent];
-        if (intentState.displayReadyCapability) {
-          intentState.displayReadyCapability.reject(data.error);
-        } else {
-          error(data.error);
-        }
-      }, this);
-
-      messageHandler.on('JpegDecode', function(data) {
-        var imageUrl = data[0];
-        var components = data[1];
-        if (components !== 3 && components !== 1) {
-          return Promise.reject(
-            new Error('Only 3 components or 1 component can be returned'));
-        }
-
-        return new Promise(function (resolve, reject) {
-          var img = new Image();
-          img.onload = function () {
-            var width = img.width;
-            var height = img.height;
-            var size = width * height;
-            var rgbaLength = size * 4;
-            var buf = new Uint8Array(size * components);
-            var tmpCanvas = createScratchCanvas(width, height);
-            var tmpCtx = tmpCanvas.getContext('2d');
-            tmpCtx.drawImage(img, 0, 0);
-            var data = tmpCtx.getImageData(0, 0, width, height).data;
-            var i, j;
-
-            if (components === 3) {
-              for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
-                buf[j] = data[i];
-                buf[j + 1] = data[i + 1];
-                buf[j + 2] = data[i + 2];
-              }
-            } else if (components === 1) {
-              for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {
-                buf[j] = data[i];
-              }
-            }
-            resolve({ data: buf, width: width, height: height});
-          };
-          img.onerror = function () {
-            reject(new Error('JpegDecode failed to load image'));
-          };
-          img.src = imageUrl;
-        });
-      });
-    },
-
-    fetchDocument: function WorkerTransport_fetchDocument(loadingTask, source) {
-      this.loadingTask = loadingTask;
-
-      source.disableAutoFetch = PDFJS.disableAutoFetch;
-      source.disableStream = PDFJS.disableStream;
-      source.chunkedViewerLoading = !!this.pdfDataRangeTransport;
-      if (this.pdfDataRangeTransport) {
-        source.length = this.pdfDataRangeTransport.length;
-        source.initialData = this.pdfDataRangeTransport.initialData;
-      }
-      this.messageHandler.send('GetDocRequest', {
-        source: source,
-        disableRange: PDFJS.disableRange,
-        maxImageSize: PDFJS.maxImageSize,
-        cMapUrl: PDFJS.cMapUrl,
-        cMapPacked: PDFJS.cMapPacked,
-        disableFontFace: PDFJS.disableFontFace,
-        disableCreateObjectURL: PDFJS.disableCreateObjectURL,
-        verbosity: PDFJS.verbosity
-      });
-    },
-
-    getData: function WorkerTransport_getData() {
-      return this.messageHandler.sendWithPromise('GetData', null);
-    },
-
-    getPage: function WorkerTransport_getPage(pageNumber, capability) {
-      if (pageNumber <= 0 || pageNumber > this.numPages ||
-          (pageNumber|0) !== pageNumber) {
-        return Promise.reject(new Error('Invalid page request'));
-      }
-
-      var pageIndex = pageNumber - 1;
-      if (pageIndex in this.pagePromises) {
-        return this.pagePromises[pageIndex];
-      }
-      var promise = this.messageHandler.sendWithPromise('GetPage', {
-        pageIndex: pageIndex
-      }).then(function (pageInfo) {
-        var page = new PDFPageProxy(pageIndex, pageInfo, this);
-        this.pageCache[pageIndex] = page;
-        return page;
-      }.bind(this));
-      this.pagePromises[pageIndex] = promise;
-      return promise;
-    },
-
-    getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {
-      return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref });
-    },
-
-    getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
-      return this.messageHandler.sendWithPromise('GetAnnotations',
-        { pageIndex: pageIndex });
-    },
-
-    getDestinations: function WorkerTransport_getDestinations() {
-      return this.messageHandler.sendWithPromise('GetDestinations', null);
-    },
-
-    getDestination: function WorkerTransport_getDestination(id) {
-      return this.messageHandler.sendWithPromise('GetDestination', { id: id } );
-    },
-
-    getAttachments: function WorkerTransport_getAttachments() {
-      return this.messageHandler.sendWithPromise('GetAttachments', null);
-    },
-
-    getJavaScript: function WorkerTransport_getJavaScript() {
-      return this.messageHandler.sendWithPromise('GetJavaScript', null);
-    },
-
-    getOutline: function WorkerTransport_getOutline() {
-      return this.messageHandler.sendWithPromise('GetOutline', null);
-    },
-
-    getMetadata: function WorkerTransport_getMetadata() {
-      return this.messageHandler.sendWithPromise('GetMetadata', null).
-        then(function transportMetadata(results) {
-        return {
-          info: results[0],
-          metadata: (results[1] ? new PDFJS.Metadata(results[1]) : null)
-        };
-      });
-    },
-
-    getStats: function WorkerTransport_getStats() {
-      return this.messageHandler.sendWithPromise('GetStats', null);
-    },
-
-    startCleanup: function WorkerTransport_startCleanup() {
-      this.messageHandler.sendWithPromise('Cleanup', null).
-        then(function endCleanup() {
-        for (var i = 0, ii = this.pageCache.length; i < ii; i++) {
-          var page = this.pageCache[i];
-          if (page) {
-            page.destroy();
-          }
-        }
-        this.commonObjs.clear();
-        FontLoader.clear();
-      }.bind(this));
-    }
-  };
-  return WorkerTransport;
-
-})();
-
-/**
- * A PDF document and page is built of many objects. E.g. there are objects
- * for fonts, images, rendering code and such. These objects might get processed
- * inside of a worker. The `PDFObjects` implements some basic functions to
- * manage these objects.
- * @ignore
- */
-var PDFObjects = (function PDFObjectsClosure() {
-  function PDFObjects() {
-    this.objs = {};
-  }
-
-  PDFObjects.prototype = {
-    /**
-     * Internal function.
-     * Ensures there is an object defined for `objId`.
-     */
-    ensureObj: function PDFObjects_ensureObj(objId) {
-      if (this.objs[objId]) {
-        return this.objs[objId];
-      }
-
-      var obj = {
-        capability: createPromiseCapability(),
-        data: null,
-        resolved: false
-      };
-      this.objs[objId] = obj;
-
-      return obj;
-    },
-
-    /**
-     * If called *without* callback, this returns the data of `objId` but the
-     * object needs to be resolved. If it isn't, this function throws.
-     *
-     * If called *with* a callback, the callback is called with the data of the
-     * object once the object is resolved. That means, if you call this
-     * function and the object is already resolved, the callback gets called
-     * right away.
-     */
-    get: function PDFObjects_get(objId, callback) {
-      // If there is a callback, then the get can be async and the object is
-      // not required to be resolved right now
-      if (callback) {
-        this.ensureObj(objId).capability.promise.then(callback);
-        return null;
-      }
-
-      // If there isn't a callback, the user expects to get the resolved data
-      // directly.
-      var obj = this.objs[objId];
-
-      // If there isn't an object yet or the object isn't resolved, then the
-      // data isn't ready yet!
-      if (!obj || !obj.resolved) {
-        error('Requesting object that isn\'t resolved yet ' + objId);
-      }
-
-      return obj.data;
-    },
-
-    /**
-     * Resolves the object `objId` with optional `data`.
-     */
-    resolve: function PDFObjects_resolve(objId, data) {
-      var obj = this.ensureObj(objId);
-
-      obj.resolved = true;
-      obj.data = data;
-      obj.capability.resolve(data);
-    },
-
-    isResolved: function PDFObjects_isResolved(objId) {
-      var objs = this.objs;
-
-      if (!objs[objId]) {
-        return false;
-      } else {
-        return objs[objId].resolved;
-      }
-    },
-
-    hasData: function PDFObjects_hasData(objId) {
-      return this.isResolved(objId);
-    },
-
-    /**
-     * Returns the data of `objId` if object exists, null otherwise.
-     */
-    getData: function PDFObjects_getData(objId) {
-      var objs = this.objs;
-      if (!objs[objId] || !objs[objId].resolved) {
-        return null;
-      } else {
-        return objs[objId].data;
-      }
-    },
-
-    clear: function PDFObjects_clear() {
-      this.objs = {};
-    }
-  };
-  return PDFObjects;
-})();
-
-/**
- * Allows controlling of the rendering tasks.
- * @class
- */
-var RenderTask = (function RenderTaskClosure() {
-  function RenderTask(internalRenderTask) {
-    this._internalRenderTask = internalRenderTask;
-
-    /**
-     * Callback for incremental rendering -- a function that will be called
-     * each time the rendering is paused.  To continue rendering call the
-     * function that is the first argument to the callback.
-     * @type {function}
-     */
-    this.onContinue = null;
-  }
-
-  RenderTask.prototype = /** @lends RenderTask.prototype */ {
-    /**
-     * Promise for rendering task completion.
-     * @return {Promise}
-     */
-    get promise() {
-      return this._internalRenderTask.capability.promise;
-    },
-
-    /**
-     * Cancels the rendering task. If the task is currently rendering it will
-     * not be cancelled until graphics pauses with a timeout. The promise that
-     * this object extends will resolved when cancelled.
-     */
-    cancel: function RenderTask_cancel() {
-      this._internalRenderTask.cancel();
-    },
-
-    /**
-     * Registers callbacks to indicate the rendering task completion.
-     *
-     * @param {function} onFulfilled The callback for the rendering completion.
-     * @param {function} onRejected The callback for the rendering failure.
-     * @return {Promise} A promise that is resolved after the onFulfilled or
-     *                   onRejected callback.
-     */
-    then: function RenderTask_then(onFulfilled, onRejected) {
-      return this.promise.then.apply(this.promise, arguments);
-    }
-  };
-
-  return RenderTask;
-})();
-
-/**
- * For internal use only.
- * @ignore
- */
-var InternalRenderTask = (function InternalRenderTaskClosure() {
-
-  function InternalRenderTask(callback, params, objs, commonObjs, operatorList,
-                              pageNumber) {
-    this.callback = callback;
-    this.params = params;
-    this.objs = objs;
-    this.commonObjs = commonObjs;
-    this.operatorListIdx = null;
-    this.operatorList = operatorList;
-    this.pageNumber = pageNumber;
-    this.running = false;
-    this.graphicsReadyCallback = null;
-    this.graphicsReady = false;
-    this.useRequestAnimationFrame = false;
-    this.cancelled = false;
-    this.capability = createPromiseCapability();
-    this.task = new RenderTask(this);
-    // caching this-bound methods
-    this._continueBound = this._continue.bind(this);
-    this._scheduleNextBound = this._scheduleNext.bind(this);
-    this._nextBound = this._next.bind(this);
-  }
-
-  InternalRenderTask.prototype = {
-
-    initalizeGraphics:
-        function InternalRenderTask_initalizeGraphics(transparency) {
-
-      if (this.cancelled) {
-        return;
-      }
-      if (PDFJS.pdfBug && 'StepperManager' in globalScope &&
-          globalScope.StepperManager.enabled) {
-        this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);
-        this.stepper.init(this.operatorList);
-        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
-      }
-
-      var params = this.params;
-      this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
-                                    this.objs, params.imageLayer);
-
-      this.gfx.beginDrawing(params.viewport, transparency);
-      this.operatorListIdx = 0;
-      this.graphicsReady = true;
-      if (this.graphicsReadyCallback) {
-        this.graphicsReadyCallback();
-      }
-    },
-
-    cancel: function InternalRenderTask_cancel() {
-      this.running = false;
-      this.cancelled = true;
-      this.callback('cancelled');
-    },
-
-    operatorListChanged: function InternalRenderTask_operatorListChanged() {
-      if (!this.graphicsReady) {
-        if (!this.graphicsReadyCallback) {
-          this.graphicsReadyCallback = this._continueBound;
-        }
-        return;
-      }
-
-      if (this.stepper) {
-        this.stepper.updateOperatorList(this.operatorList);
-      }
-
-      if (this.running) {
-        return;
-      }
-      this._continue();
-    },
-
-    _continue: function InternalRenderTask__continue() {
-      this.running = true;
-      if (this.cancelled) {
-        return;
-      }
-      if (this.task.onContinue) {
-        this.task.onContinue.call(this.task, this._scheduleNextBound);
-      } else {
-        this._scheduleNext();
-      }
-    },
-
-    _scheduleNext: function InternalRenderTask__scheduleNext() {
-      if (this.useRequestAnimationFrame) {
-        window.requestAnimationFrame(this._nextBound);
-      } else {
-        Promise.resolve(undefined).then(this._nextBound);
-      }
-    },
-
-    _next: function InternalRenderTask__next() {
-      if (this.cancelled) {
-        return;
-      }
-      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,
-                                        this.operatorListIdx,
-                                        this._continueBound,
-                                        this.stepper);
-      if (this.operatorListIdx === this.operatorList.argsArray.length) {
-        this.running = false;
-        if (this.operatorList.lastChunk) {
-          this.gfx.endDrawing();
-          this.callback();
-        }
-      }
-    }
-
-  };
-
-  return InternalRenderTask;
-})();
-
-
-var Metadata = PDFJS.Metadata = (function MetadataClosure() {
-  function fixMetadata(meta) {
-    return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) {
-      var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g,
-                                function(code, d1, d2, d3) {
-        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
-      });
-      var chars = '';
-      for (var i = 0; i < bytes.length; i += 2) {
-        var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
-        chars += code >= 32 && code < 127 && code !== 60 && code !== 62 &&
-          code !== 38 && false ? String.fromCharCode(code) :
-          '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
-      }
-      return '>' + chars;
-    });
-  }
-
-  function Metadata(meta) {
-    if (typeof meta === 'string') {
-      // Ghostscript produces invalid metadata
-      meta = fixMetadata(meta);
-
-      var parser = new DOMParser();
-      meta = parser.parseFromString(meta, 'application/xml');
-    } else if (!(meta instanceof Document)) {
-      error('Metadata: Invalid metadata object');
-    }
-
-    this.metaDocument = meta;
-    this.metadata = {};
-    this.parse();
-  }
-
-  Metadata.prototype = {
-    parse: function Metadata_parse() {
-      var doc = this.metaDocument;
-      var rdf = doc.documentElement;
-
-      if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>
-        rdf = rdf.firstChild;
-        while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') {
-          rdf = rdf.nextSibling;
-        }
-      }
-
-      var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
-      if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) {
-        return;
-      }
-
-      var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength;
-      for (i = 0, length = children.length; i < length; i++) {
-        desc = children[i];
-        if (desc.nodeName.toLowerCase() !== 'rdf:description') {
-          continue;
-        }
-
-        for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {
-          if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') {
-            entry = desc.childNodes[ii];
-            name = entry.nodeName.toLowerCase();
-            this.metadata[name] = entry.textContent.trim();
-          }
-        }
-      }
-    },
-
-    get: function Metadata_get(name) {
-      return this.metadata[name] || null;
-    },
-
-    has: function Metadata_has(name) {
-      return typeof this.metadata[name] !== 'undefined';
-    }
-  };
-
-  return Metadata;
-})();
-
-
-// <canvas> contexts store most of the state we need natively.
-// However, PDF needs a bit more state, which we store here.
-
-// Minimal font size that would be used during canvas fillText operations.
-var MIN_FONT_SIZE = 16;
-// Maximum font size that would be used during canvas fillText operations.
-var MAX_FONT_SIZE = 100;
-var MAX_GROUP_SIZE = 4096;
-
-// Heuristic value used when enforcing minimum line widths.
-var MIN_WIDTH_FACTOR = 0.65;
-
-var COMPILE_TYPE3_GLYPHS = true;
-var MAX_SIZE_TO_COMPILE = 1000;
-
-var FULL_CHUNK_HEIGHT = 16;
-
-function createScratchCanvas(width, height) {
-  var canvas = document.createElement('canvas');
-  canvas.width = width;
-  canvas.height = height;
-  return canvas;
-}
-
-function addContextCurrentTransform(ctx) {
-  // If the context doesn't expose a `mozCurrentTransform`, add a JS based one.
-  if (!ctx.mozCurrentTransform) {
-    ctx._originalSave = ctx.save;
-    ctx._originalRestore = ctx.restore;
-    ctx._originalRotate = ctx.rotate;
-    ctx._originalScale = ctx.scale;
-    ctx._originalTranslate = ctx.translate;
-    ctx._originalTransform = ctx.transform;
-    ctx._originalSetTransform = ctx.setTransform;
-
-    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];
-    ctx._transformStack = [];
-
-    Object.defineProperty(ctx, 'mozCurrentTransform', {
-      get: function getCurrentTransform() {
-        return this._transformMatrix;
-      }
-    });
-
-    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
-      get: function getCurrentTransformInverse() {
-        // Calculation done using WolframAlpha:
-        // http://www.wolframalpha.com/input/?
-        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
-
-        var m = this._transformMatrix;
-        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
-
-        var ad_bc = a * d - b * c;
-        var bc_ad = b * c - a * d;
-
-        return [
-          d / ad_bc,
-          b / bc_ad,
-          c / bc_ad,
-          a / ad_bc,
-          (d * e - c * f) / bc_ad,
-          (b * e - a * f) / ad_bc
-        ];
-      }
-    });
-
-    ctx.save = function ctxSave() {
-      var old = this._transformMatrix;
-      this._transformStack.push(old);
-      this._transformMatrix = old.slice(0, 6);
-
-      this._originalSave();
-    };
-
-    ctx.restore = function ctxRestore() {
-      var prev = this._transformStack.pop();
-      if (prev) {
-        this._transformMatrix = prev;
-        this._originalRestore();
-      }
-    };
-
-    ctx.translate = function ctxTranslate(x, y) {
-      var m = this._transformMatrix;
-      m[4] = m[0] * x + m[2] * y + m[4];
-      m[5] = m[1] * x + m[3] * y + m[5];
-
-      this._originalTranslate(x, y);
-    };
-
-    ctx.scale = function ctxScale(x, y) {
-      var m = this._transformMatrix;
-      m[0] = m[0] * x;
-      m[1] = m[1] * x;
-      m[2] = m[2] * y;
-      m[3] = m[3] * y;
-
-      this._originalScale(x, y);
-    };
-
-    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
-      var m = this._transformMatrix;
-      this._transformMatrix = [
-        m[0] * a + m[2] * b,
-        m[1] * a + m[3] * b,
-        m[0] * c + m[2] * d,
-        m[1] * c + m[3] * d,
-        m[0] * e + m[2] * f + m[4],
-        m[1] * e + m[3] * f + m[5]
-      ];
-
-      ctx._originalTransform(a, b, c, d, e, f);
-    };
-
-    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
-      this._transformMatrix = [a, b, c, d, e, f];
-
-      ctx._originalSetTransform(a, b, c, d, e, f);
-    };
-
-    ctx.rotate = function ctxRotate(angle) {
-      var cosValue = Math.cos(angle);
-      var sinValue = Math.sin(angle);
-
-      var m = this._transformMatrix;
-      this._transformMatrix = [
-        m[0] * cosValue + m[2] * sinValue,
-        m[1] * cosValue + m[3] * sinValue,
-        m[0] * (-sinValue) + m[2] * cosValue,
-        m[1] * (-sinValue) + m[3] * cosValue,
-        m[4],
-        m[5]
-      ];
-
-      this._originalRotate(angle);
-    };
-  }
-}
-
-var CachedCanvases = (function CachedCanvasesClosure() {
-  var cache = {};
-  return {
-    getCanvas: function CachedCanvases_getCanvas(id, width, height,
-                                                 trackTransform) {
-      var canvasEntry;
-      if (cache[id] !== undefined) {
-        canvasEntry = cache[id];
-        canvasEntry.canvas.width = width;
-        canvasEntry.canvas.height = height;
-        // reset canvas transform for emulated mozCurrentTransform, if needed
-        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
-      } else {
-        var canvas = createScratchCanvas(width, height);
-        var ctx = canvas.getContext('2d');
-        if (trackTransform) {
-          addContextCurrentTransform(ctx);
-        }
-        cache[id] = canvasEntry = {canvas: canvas, context: ctx};
-      }
-      return canvasEntry;
-    },
-    clear: function () {
-      for (var id in cache) {
-        var canvasEntry = cache[id];
-        // Zeroing the width and height causes Firefox to release graphics
-        // resources immediately, which can greatly reduce memory consumption.
-        canvasEntry.canvas.width = 0;
-        canvasEntry.canvas.height = 0;
-        delete cache[id];
-      }
-    }
-  };
-})();
-
-function compileType3Glyph(imgData) {
-  var POINT_TO_PROCESS_LIMIT = 1000;
-
-  var width = imgData.width, height = imgData.height;
-  var i, j, j0, width1 = width + 1;
-  var points = new Uint8Array(width1 * (height + 1));
-  var POINT_TYPES =
-      new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
-
-  // decodes bit-packed mask data
-  var lineSize = (width + 7) & ~7, data0 = imgData.data;
-  var data = new Uint8Array(lineSize * height), pos = 0, ii;
-  for (i = 0, ii = data0.length; i < ii; i++) {
-    var mask = 128, elem = data0[i];
-    while (mask > 0) {
-      data[pos++] = (elem & mask) ? 0 : 255;
-      mask >>= 1;
-    }
-  }
-
-  // finding iteresting points: every point is located between mask pixels,
-  // so there will be points of the (width + 1)x(height + 1) grid. Every point
-  // will have flags assigned based on neighboring mask pixels:
-  //   4 | 8
-  //   --P--
-  //   2 | 1
-  // We are interested only in points with the flags:
-  //   - outside corners: 1, 2, 4, 8;
-  //   - inside corners: 7, 11, 13, 14;
-  //   - and, intersections: 5, 10.
-  var count = 0;
-  pos = 0;
-  if (data[pos] !== 0) {
-    points[0] = 1;
-    ++count;
-  }
-  for (j = 1; j < width; j++) {
-    if (data[pos] !== data[pos + 1]) {
-      points[j] = data[pos] ? 2 : 1;
-      ++count;
-    }
-    pos++;
-  }
-  if (data[pos] !== 0) {
-    points[j] = 2;
-    ++count;
-  }
-  for (i = 1; i < height; i++) {
-    pos = i * lineSize;
-    j0 = i * width1;
-    if (data[pos - lineSize] !== data[pos]) {
-      points[j0] = data[pos] ? 1 : 8;
-      ++count;
-    }
-    // 'sum' is the position of the current pixel configuration in the 'TYPES'
-    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).
-    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
-    for (j = 1; j < width; j++) {
-      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) +
-            (data[pos - lineSize + 1] ? 8 : 0);
-      if (POINT_TYPES[sum]) {
-        points[j0 + j] = POINT_TYPES[sum];
-        ++count;
-      }
-      pos++;
-    }
-    if (data[pos - lineSize] !== data[pos]) {
-      points[j0 + j] = data[pos] ? 2 : 4;
-      ++count;
-    }
-
-    if (count > POINT_TO_PROCESS_LIMIT) {
-      return null;
-    }
-  }
-
-  pos = lineSize * (height - 1);
-  j0 = i * width1;
-  if (data[pos] !== 0) {
-    points[j0] = 8;
-    ++count;
-  }
-  for (j = 1; j < width; j++) {
-    if (data[pos] !== data[pos + 1]) {
-      points[j0 + j] = data[pos] ? 4 : 8;
-      ++count;
-    }
-    pos++;
-  }
-  if (data[pos] !== 0) {
-    points[j0 + j] = 4;
-    ++count;
-  }
-  if (count > POINT_TO_PROCESS_LIMIT) {
-    return null;
-  }
-
-  // building outlines
-  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
-  var outlines = [];
-  for (i = 0; count && i <= height; i++) {
-    var p = i * width1;
-    var end = p + width;
-    while (p < end && !points[p]) {
-      p++;
-    }
-    if (p === end) {
-      continue;
-    }
-    var coords = [p % width1, i];
-
-    var type = points[p], p0 = p, pp;
-    do {
-      var step = steps[type];
-      do {
-        p += step;
-      } while (!points[p]);
-
-      pp = points[p];
-      if (pp !== 5 && pp !== 10) {
-        // set new direction
-        type = pp;
-        // delete mark
-        points[p] = 0;
-      } else { // type is 5 or 10, ie, a crossing
-        // set new direction
-        type = pp & ((0x33 * type) >> 4);
-        // set new type for "future hit"
-        points[p] &= (type >> 2 | type << 2);
-      }
-
-      coords.push(p % width1);
-      coords.push((p / width1) | 0);
-      --count;
-    } while (p0 !== p);
-    outlines.push(coords);
-    --i;
-  }
-
-  var drawOutline = function(c) {
-    c.save();
-    // the path shall be painted in [0..1]x[0..1] space
-    c.scale(1 / width, -1 / height);
-    c.translate(0, -height);
-    c.beginPath();
-    for (var i = 0, ii = outlines.length; i < ii; i++) {
-      var o = outlines[i];
-      c.moveTo(o[0], o[1]);
-      for (var j = 2, jj = o.length; j < jj; j += 2) {
-        c.lineTo(o[j], o[j+1]);
-      }
-    }
-    c.fill();
-    c.beginPath();
-    c.restore();
-  };
-
-  return drawOutline;
-}
-
-var CanvasExtraState = (function CanvasExtraStateClosure() {
-  function CanvasExtraState(old) {
-    // Are soft masks and alpha values shapes or opacities?
-    this.alphaIsShape = false;
-    this.fontSize = 0;
-    this.fontSizeScale = 1;
-    this.textMatrix = IDENTITY_MATRIX;
-    this.textMatrixScale = 1;
-    this.fontMatrix = FONT_IDENTITY_MATRIX;
-    this.leading = 0;
-    // Current point (in user coordinates)
-    this.x = 0;
-    this.y = 0;
-    // Start of text line (in text coordinates)
-    this.lineX = 0;
-    this.lineY = 0;
-    // Character and word spacing
-    this.charSpacing = 0;
-    this.wordSpacing = 0;
-    this.textHScale = 1;
-    this.textRenderingMode = TextRenderingMode.FILL;
-    this.textRise = 0;
-    // Default fore and background colors
-    this.fillColor = '#000000';
-    this.strokeColor = '#000000';
-    this.patternFill = false;
-    // Note: fill alpha applies to all non-stroking operations
-    this.fillAlpha = 1;
-    this.strokeAlpha = 1;
-    this.lineWidth = 1;
-    this.activeSMask = null; // nonclonable field (see the save method below)
-
-    this.old = old;
-  }
-
-  CanvasExtraState.prototype = {
-    clone: function CanvasExtraState_clone() {
-      return Object.create(this);
-    },
-    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
-      this.x = x;
-      this.y = y;
-    }
-  };
-  return CanvasExtraState;
-})();
-
-var CanvasGraphics = (function CanvasGraphicsClosure() {
-  // Defines the time the executeOperatorList is going to be executing
-  // before it stops and shedules a continue of execution.
-  var EXECUTION_TIME = 15;
-  // Defines the number of steps before checking the execution time
-  var EXECUTION_STEPS = 10;
-
-  function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) {
-    this.ctx = canvasCtx;
-    this.current = new CanvasExtraState();
-    this.stateStack = [];
-    this.pendingClip = null;
-    this.pendingEOFill = false;
-    this.res = null;
-    this.xobjs = null;
-    this.commonObjs = commonObjs;
-    this.objs = objs;
-    this.imageLayer = imageLayer;
-    this.groupStack = [];
-    this.processingType3 = null;
-    // Patterns are painted relative to the initial page/form transform, see pdf
-    // spec 8.7.2 NOTE 1.
-    this.baseTransform = null;
-    this.baseTransformStack = [];
-    this.groupLevel = 0;
-    this.smaskStack = [];
-    this.smaskCounter = 0;
-    this.tempSMask = null;
-    if (canvasCtx) {
-      // NOTE: if mozCurrentTransform is polyfilled, then the current state of
-      // the transformation must already be set in canvasCtx._transformMatrix.
-      addContextCurrentTransform(canvasCtx);
-    }
-    this.cachedGetSinglePixelWidth = null;
-  }
-
-  function putBinaryImageData(ctx, imgData) {
-    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {
-      ctx.putImageData(imgData, 0, 0);
-      return;
-    }
-
-    // Put the image data to the canvas in chunks, rather than putting the
-    // whole image at once.  This saves JS memory, because the ImageData object
-    // is smaller. It also possibly saves C++ memory within the implementation
-    // of putImageData(). (E.g. in Firefox we make two short-lived copies of
-    // the data passed to putImageData()). |n| shouldn't be too small, however,
-    // because too many putImageData() calls will slow things down.
-    //
-    // Note: as written, if the last chunk is partial, the putImageData() call
-    // will (conceptually) put pixels past the bounds of the canvas.  But
-    // that's ok; any such pixels are ignored.
-
-    var height = imgData.height, width = imgData.width;
-    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
-    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
-    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
-
-    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
-    var srcPos = 0, destPos;
-    var src = imgData.data;
-    var dest = chunkImgData.data;
-    var i, j, thisChunkHeight, elemsInThisChunk;
-
-    // There are multiple forms in which the pixel data can be passed, and
-    // imgData.kind tells us which one this is.
-    if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {
-      // Grayscale, 1 bit per pixel (i.e. black-and-white).
-      var srcLength = src.byteLength;
-      var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) :
-        new Uint32ArrayView(dest);
-      var dest32DataLength = dest32.length;
-      var fullSrcDiff = (width + 7) >> 3;
-      var white = 0xFFFFFFFF;
-      var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ?
-        0xFF000000 : 0x000000FF;
-      for (i = 0; i < totalChunks; i++) {
-        thisChunkHeight =
-          (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;
-        destPos = 0;
-        for (j = 0; j < thisChunkHeight; j++) {
-          var srcDiff = srcLength - srcPos;
-          var k = 0;
-          var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7;
-          var kEndUnrolled = kEnd & ~7;
-          var mask = 0;
-          var srcByte = 0;
-          for (; k < kEndUnrolled; k += 8) {
-            srcByte = src[srcPos++];
-            dest32[destPos++] = (srcByte & 128) ? white : black;
-            dest32[destPos++] = (srcByte & 64) ? white : black;
-            dest32[destPos++] = (srcByte & 32) ? white : black;
-            dest32[destPos++] = (srcByte & 16) ? white : black;
-            dest32[destPos++] = (srcByte & 8) ? white : black;
-            dest32[destPos++] = (srcByte & 4) ? white : black;
-            dest32[destPos++] = (srcByte & 2) ? white : black;
-            dest32[destPos++] = (srcByte & 1) ? white : black;
-          }
-          for (; k < kEnd; k++) {
-             if (mask === 0) {
-               srcByte = src[srcPos++];
-               mask = 128;
-             }
-
-            dest32[destPos++] = (srcByte & mask) ? white : black;
-            mask >>= 1;
-          }
-        }
-        // We ran out of input. Make all remaining pixels transparent.
-        while (destPos < dest32DataLength) {
-          dest32[destPos++] = 0;
-        }
-
-        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
-      }
-    } else if (imgData.kind === ImageKind.RGBA_32BPP) {
-      // RGBA, 32-bits per pixel.
-
-      j = 0;
-      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;
-      for (i = 0; i < fullChunks; i++) {
-        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
-        srcPos += elemsInThisChunk;
-
-        ctx.putImageData(chunkImgData, 0, j);
-        j += FULL_CHUNK_HEIGHT;
-      }
-      if (i < totalChunks) {
-        elemsInThisChunk = width * partialChunkHeight * 4;
-        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
-        ctx.putImageData(chunkImgData, 0, j);
-      }
-
-    } else if (imgData.kind === ImageKind.RGB_24BPP) {
-      // RGB, 24-bits per pixel.
-      thisChunkHeight = FULL_CHUNK_HEIGHT;
-      elemsInThisChunk = width * thisChunkHeight;
-      for (i = 0; i < totalChunks; i++) {
-        if (i >= fullChunks) {
-          thisChunkHeight = partialChunkHeight;
-          elemsInThisChunk = width * thisChunkHeight;
-        }
-
-        destPos = 0;
-        for (j = elemsInThisChunk; j--;) {
-          dest[destPos++] = src[srcPos++];
-          dest[destPos++] = src[srcPos++];
-          dest[destPos++] = src[srcPos++];
-          dest[destPos++] = 255;
-        }
-        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
-      }
-    } else {
-      error('bad image kind: ' + imgData.kind);
-    }
-  }
-
-  function putBinaryImageMask(ctx, imgData) {
-    var height = imgData.height, width = imgData.width;
-    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
-    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
-    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
-
-    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
-    var srcPos = 0;
-    var src = imgData.data;
-    var dest = chunkImgData.data;
-
-    for (var i = 0; i < totalChunks; i++) {
-      var thisChunkHeight =
-        (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;
-
-      // Expand the mask so it can be used by the canvas.  Any required
-      // inversion has already been handled.
-      var destPos = 3; // alpha component offset
-      for (var j = 0; j < thisChunkHeight; j++) {
-        var mask = 0;
-        for (var k = 0; k < width; k++) {
-          if (!mask) {
-            var elem = src[srcPos++];
-            mask = 128;
-          }
-          dest[destPos] = (elem & mask) ? 0 : 255;
-          destPos += 4;
-          mask >>= 1;
-        }
-      }
-      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
-    }
-  }
-
-  function copyCtxState(sourceCtx, destCtx) {
-    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha',
-                      'lineWidth', 'lineCap', 'lineJoin', 'miterLimit',
-                      'globalCompositeOperation', 'font'];
-    for (var i = 0, ii = properties.length; i < ii; i++) {
-      var property = properties[i];
-      if (sourceCtx[property] !== undefined) {
-        destCtx[property] = sourceCtx[property];
-      }
-    }
-    if (sourceCtx.setLineDash !== undefined) {
-      destCtx.setLineDash(sourceCtx.getLineDash());
-      destCtx.lineDashOffset =  sourceCtx.lineDashOffset;
-    } else if (sourceCtx.mozDashOffset !== undefined) {
-      destCtx.mozDash = sourceCtx.mozDash;
-      destCtx.mozDashOffset = sourceCtx.mozDashOffset;
-    }
-  }
-
-  function composeSMaskBackdrop(bytes, r0, g0, b0) {
-    var length = bytes.length;
-    for (var i = 3; i < length; i += 4) {
-      var alpha = bytes[i];
-      if (alpha === 0) {
-        bytes[i - 3] = r0;
-        bytes[i - 2] = g0;
-        bytes[i - 1] = b0;
-      } else if (alpha < 255) {
-        var alpha_ = 255 - alpha;
-        bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8;
-        bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8;
-        bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8;
-      }
-    }
-  }
-
-  function composeSMaskAlpha(maskData, layerData) {
-    var length = maskData.length;
-    var scale = 1 / 255;
-    for (var i = 3; i < length; i += 4) {
-      var alpha = maskData[i];
-      layerData[i] = (layerData[i] * alpha * scale) | 0;
-    }
-  }
-
-  function composeSMaskLuminosity(maskData, layerData) {
-    var length = maskData.length;
-    for (var i = 3; i < length; i += 4) {
-      var y = (maskData[i - 3] * 77) +  // * 0.3 / 255 * 0x10000
-              (maskData[i - 2] * 152) + // * 0.59 ....
-              (maskData[i - 1] * 28);   // * 0.11 ....
-      layerData[i] = (layerData[i] * y) >> 16;
-    }
-  }
-
-  function genericComposeSMask(maskCtx, layerCtx, width, height,
-                               subtype, backdrop) {
-    var hasBackdrop = !!backdrop;
-    var r0 = hasBackdrop ? backdrop[0] : 0;
-    var g0 = hasBackdrop ? backdrop[1] : 0;
-    var b0 = hasBackdrop ? backdrop[2] : 0;
-
-    var composeFn;
-    if (subtype === 'Luminosity') {
-      composeFn = composeSMaskLuminosity;
-    } else {
-      composeFn = composeSMaskAlpha;
-    }
-
-    // processing image in chunks to save memory
-    var PIXELS_TO_PROCESS = 1048576;
-    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));
-    for (var row = 0; row < height; row += chunkSize) {
-      var chunkHeight = Math.min(chunkSize, height - row);
-      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);
-      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);
-
-      if (hasBackdrop) {
-        composeSMaskBackdrop(maskData.data, r0, g0, b0);
-      }
-      composeFn(maskData.data, layerData.data);
-
-      maskCtx.putImageData(layerData, 0, row);
-    }
-  }
-
-  function composeSMask(ctx, smask, layerCtx) {
-    var mask = smask.canvas;
-    var maskCtx = smask.context;
-
-    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY,
-                     smask.offsetX, smask.offsetY);
-
-    var backdrop = smask.backdrop || null;
-    if (WebGLUtils.isEnabled) {
-      var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask,
-        {subtype: smask.subtype, backdrop: backdrop});
-      ctx.setTransform(1, 0, 0, 1, 0, 0);
-      ctx.drawImage(composed, smask.offsetX, smask.offsetY);
-      return;
-    }
-    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height,
-                        smask.subtype, backdrop);
-    ctx.drawImage(mask, 0, 0);
-  }
-
-  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
-  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
-  var NORMAL_CLIP = {};
-  var EO_CLIP = {};
-
-  CanvasGraphics.prototype = {
-
-    beginDrawing: function CanvasGraphics_beginDrawing(viewport, transparency) {
-      // For pdfs that use blend modes we have to clear the canvas else certain
-      // blend modes can look wrong since we'd be blending with a white
-      // backdrop. The problem with a transparent backdrop though is we then
-      // don't get sub pixel anti aliasing on text, so we fill with white if
-      // we can.
-      var width = this.ctx.canvas.width;
-      var height = this.ctx.canvas.height;
-      if (transparency) {
-        this.ctx.clearRect(0, 0, width, height);
-      } else {
-        this.ctx.mozOpaque = true;
-        this.ctx.save();
-        this.ctx.fillStyle = 'rgb(255, 255, 255)';
-        this.ctx.fillRect(0, 0, width, height);
-        this.ctx.restore();
-      }
-
-      var transform = viewport.transform;
-
-      this.ctx.save();
-      this.ctx.transform.apply(this.ctx, transform);
-
-      this.baseTransform = this.ctx.mozCurrentTransform.slice();
-
-      if (this.imageLayer) {
-        this.imageLayer.beginLayout();
-      }
-    },
-
-    executeOperatorList: function CanvasGraphics_executeOperatorList(
-                                    operatorList,
-                                    executionStartIdx, continueCallback,
-                                    stepper) {
-      var argsArray = operatorList.argsArray;
-      var fnArray = operatorList.fnArray;
-      var i = executionStartIdx || 0;
-      var argsArrayLen = argsArray.length;
-
-      // Sometimes the OperatorList to execute is empty.
-      if (argsArrayLen === i) {
-        return i;
-      }
-
-      var chunkOperations = (argsArrayLen - i > EXECUTION_STEPS &&
-                             typeof continueCallback === 'function');
-      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
-      var steps = 0;
-
-      var commonObjs = this.commonObjs;
-      var objs = this.objs;
-      var fnId;
-
-      while (true) {
-        if (stepper !== undefined && i === stepper.nextBreakPoint) {
-          stepper.breakIt(i, continueCallback);
-          return i;
-        }
-
-        fnId = fnArray[i];
-
-        if (fnId !== OPS.dependency) {
-          this[fnId].apply(this, argsArray[i]);
-        } else {
-          var deps = argsArray[i];
-          for (var n = 0, nn = deps.length; n < nn; n++) {
-            var depObjId = deps[n];
-            var common = depObjId[0] === 'g' && depObjId[1] === '_';
-            var objsPool = common ? commonObjs : objs;
-
-            // If the promise isn't resolved yet, add the continueCallback
-            // to the promise and bail out.
-            if (!objsPool.isResolved(depObjId)) {
-              objsPool.get(depObjId, continueCallback);
-              return i;
-            }
-          }
-        }
-
-        i++;
-
-        // If the entire operatorList was executed, stop as were done.
-        if (i === argsArrayLen) {
-          return i;
-        }
-
-        // If the execution took longer then a certain amount of time and
-        // `continueCallback` is specified, interrupt the execution.
-        if (chunkOperations && ++steps > EXECUTION_STEPS) {
-          if (Date.now() > endTime) {
-            continueCallback();
-            return i;
-          }
-          steps = 0;
-        }
-
-        // If the operatorList isn't executed completely yet OR the execution
-        // time was short enough, do another execution round.
-      }
-    },
-
-    endDrawing: function CanvasGraphics_endDrawing() {
-      this.ctx.restore();
-      CachedCanvases.clear();
-      WebGLUtils.clear();
-
-      if (this.imageLayer) {
-        this.imageLayer.endLayout();
-      }
-    },
-
-    // Graphics state
-    setLineWidth: function CanvasGraphics_setLineWidth(width) {
-      this.current.lineWidth = width;
-      this.ctx.lineWidth = width;
-    },
-    setLineCap: function CanvasGraphics_setLineCap(style) {
-      this.ctx.lineCap = LINE_CAP_STYLES[style];
-    },
-    setLineJoin: function CanvasGraphics_setLineJoin(style) {
-      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
-    },
-    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
-      this.ctx.miterLimit = limit;
-    },
-    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
-      var ctx = this.ctx;
-      if (ctx.setLineDash !== undefined) {
-        ctx.setLineDash(dashArray);
-        ctx.lineDashOffset = dashPhase;
-      } else {
-        ctx.mozDash = dashArray;
-        ctx.mozDashOffset = dashPhase;
-      }
-    },
-    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
-      // Maybe if we one day fully support color spaces this will be important
-      // for now we can ignore.
-      // TODO set rendering intent?
-    },
-    setFlatness: function CanvasGraphics_setFlatness(flatness) {
-      // There's no way to control this with canvas, but we can safely ignore.
-      // TODO set flatness?
-    },
-    setGState: function CanvasGraphics_setGState(states) {
-      for (var i = 0, ii = states.length; i < ii; i++) {
-        var state = states[i];
-        var key = state[0];
-        var value = state[1];
-
-        switch (key) {
-          case 'LW':
-            this.setLineWidth(value);
-            break;
-          case 'LC':
-            this.setLineCap(value);
-            break;
-          case 'LJ':
-            this.setLineJoin(value);
-            break;
-          case 'ML':
-            this.setMiterLimit(value);
-            break;
-          case 'D':
-            this.setDash(value[0], value[1]);
-            break;
-          case 'RI':
-            this.setRenderingIntent(value);
-            break;
-          case 'FL':
-            this.setFlatness(value);
-            break;
-          case 'Font':
-            this.setFont(value[0], value[1]);
-            break;
-          case 'CA':
-            this.current.strokeAlpha = state[1];
-            break;
-          case 'ca':
-            this.current.fillAlpha = state[1];
-            this.ctx.globalAlpha = state[1];
-            break;
-          case 'BM':
-            if (value && value.name && (value.name !== 'Normal')) {
-              var mode = value.name.replace(/([A-Z])/g,
-                function(c) {
-                  return '-' + c.toLowerCase();
-                }
-              ).substring(1);
-              this.ctx.globalCompositeOperation = mode;
-              if (this.ctx.globalCompositeOperation !== mode) {
-                warn('globalCompositeOperation "' + mode +
-                     '" is not supported');
-              }
-            } else {
-              this.ctx.globalCompositeOperation = 'source-over';
-            }
-            break;
-          case 'SMask':
-            if (this.current.activeSMask) {
-              this.endSMaskGroup();
-            }
-            this.current.activeSMask = value ? this.tempSMask : null;
-            if (this.current.activeSMask) {
-              this.beginSMaskGroup();
-            }
-            this.tempSMask = null;
-            break;
-        }
-      }
-    },
-    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {
-
-      var activeSMask = this.current.activeSMask;
-      var drawnWidth = activeSMask.canvas.width;
-      var drawnHeight = activeSMask.canvas.height;
-      var cacheId = 'smaskGroupAt' + this.groupLevel;
-      var scratchCanvas = CachedCanvases.getCanvas(
-        cacheId, drawnWidth, drawnHeight, true);
-
-      var currentCtx = this.ctx;
-      var currentTransform = currentCtx.mozCurrentTransform;
-      this.ctx.save();
-
-      var groupCtx = scratchCanvas.context;
-      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);
-      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);
-      groupCtx.transform.apply(groupCtx, currentTransform);
-
-      copyCtxState(currentCtx, groupCtx);
-      this.ctx = groupCtx;
-      this.setGState([
-        ['BM', 'Normal'],
-        ['ca', 1],
-        ['CA', 1]
-      ]);
-      this.groupStack.push(currentCtx);
-      this.groupLevel++;
-    },
-    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {
-      var groupCtx = this.ctx;
-      this.groupLevel--;
-      this.ctx = this.groupStack.pop();
-
-      composeSMask(this.ctx, this.current.activeSMask, groupCtx);
-      this.ctx.restore();
-    },
-    save: function CanvasGraphics_save() {
-      this.ctx.save();
-      var old = this.current;
-      this.stateStack.push(old);
-      this.current = old.clone();
-      this.current.activeSMask = null;
-    },
-    restore: function CanvasGraphics_restore() {
-      if (this.stateStack.length !== 0) {
-        if (this.current.activeSMask !== null) {
-          this.endSMaskGroup();
-        }
-
-        this.current = this.stateStack.pop();
-        this.ctx.restore();
-
-        this.cachedGetSinglePixelWidth = null;
-      }
-    },
-    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
-      this.ctx.transform(a, b, c, d, e, f);
-
-      this.cachedGetSinglePixelWidth = null;
-    },
-
-    // Path
-    constructPath: function CanvasGraphics_constructPath(ops, args) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var x = current.x, y = current.y;
-      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {
-        switch (ops[i] | 0) {
-          case OPS.rectangle:
-            x = args[j++];
-            y = args[j++];
-            var width = args[j++];
-            var height = args[j++];
-            if (width === 0) {
-              width = this.getSinglePixelWidth();
-            }
-            if (height === 0) {
-              height = this.getSinglePixelWidth();
-            }
-            var xw = x + width;
-            var yh = y + height;
-            this.ctx.moveTo(x, y);
-            this.ctx.lineTo(xw, y);
-            this.ctx.lineTo(xw, yh);
-            this.ctx.lineTo(x, yh);
-            this.ctx.lineTo(x, y);
-            this.ctx.closePath();
-            break;
-          case OPS.moveTo:
-            x = args[j++];
-            y = args[j++];
-            ctx.moveTo(x, y);
-            break;
-          case OPS.lineTo:
-            x = args[j++];
-            y = args[j++];
-            ctx.lineTo(x, y);
-            break;
-          case OPS.curveTo:
-            x = args[j + 4];
-            y = args[j + 5];
-            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3],
-                              x, y);
-            j += 6;
-            break;
-          case OPS.curveTo2:
-            ctx.bezierCurveTo(x, y, args[j], args[j + 1],
-                              args[j + 2], args[j + 3]);
-            x = args[j + 2];
-            y = args[j + 3];
-            j += 4;
-            break;
-          case OPS.curveTo3:
-            x = args[j + 2];
-            y = args[j + 3];
-            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);
-            j += 4;
-            break;
-          case OPS.closePath:
-            ctx.closePath();
-            break;
-        }
-      }
-      current.setCurrentPoint(x, y);
-    },
-    closePath: function CanvasGraphics_closePath() {
-      this.ctx.closePath();
-    },
-    stroke: function CanvasGraphics_stroke(consumePath) {
-      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
-      var ctx = this.ctx;
-      var strokeColor = this.current.strokeColor;
-      // Prevent drawing too thin lines by enforcing a minimum line width.
-      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR,
-                               this.current.lineWidth);
-      // For stroke we want to temporarily change the global alpha to the
-      // stroking alpha.
-      ctx.globalAlpha = this.current.strokeAlpha;
-      if (strokeColor && strokeColor.hasOwnProperty('type') &&
-          strokeColor.type === 'Pattern') {
-        // for patterns, we transform to pattern space, calculate
-        // the pattern, call stroke, and restore to user space
-        ctx.save();
-        ctx.strokeStyle = strokeColor.getPattern(ctx, this);
-        ctx.stroke();
-        ctx.restore();
-      } else {
-        ctx.stroke();
-      }
-      if (consumePath) {
-        this.consumePath();
-      }
-      // Restore the global alpha to the fill alpha
-      ctx.globalAlpha = this.current.fillAlpha;
-    },
-    closeStroke: function CanvasGraphics_closeStroke() {
-      this.closePath();
-      this.stroke();
-    },
-    fill: function CanvasGraphics_fill(consumePath) {
-      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
-      var ctx = this.ctx;
-      var fillColor = this.current.fillColor;
-      var isPatternFill = this.current.patternFill;
-      var needRestore = false;
-
-      if (isPatternFill) {
-        ctx.save();
-        ctx.fillStyle = fillColor.getPattern(ctx, this);
-        needRestore = true;
-      }
-
-      if (this.pendingEOFill) {
-        if (ctx.mozFillRule !== undefined) {
-          ctx.mozFillRule = 'evenodd';
-          ctx.fill();
-          ctx.mozFillRule = 'nonzero';
-        } else {
-          try {
-            ctx.fill('evenodd');
-          } catch (ex) {
-            // shouldn't really happen, but browsers might think differently
-            ctx.fill();
-          }
-        }
-        this.pendingEOFill = false;
-      } else {
-        ctx.fill();
-      }
-
-      if (needRestore) {
-        ctx.restore();
-      }
-      if (consumePath) {
-        this.consumePath();
-      }
-    },
-    eoFill: function CanvasGraphics_eoFill() {
-      this.pendingEOFill = true;
-      this.fill();
-    },
-    fillStroke: function CanvasGraphics_fillStroke() {
-      this.fill(false);
-      this.stroke(false);
-
-      this.consumePath();
-    },
-    eoFillStroke: function CanvasGraphics_eoFillStroke() {
-      this.pendingEOFill = true;
-      this.fillStroke();
-    },
-    closeFillStroke: function CanvasGraphics_closeFillStroke() {
-      this.closePath();
-      this.fillStroke();
-    },
-    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
-      this.pendingEOFill = true;
-      this.closePath();
-      this.fillStroke();
-    },
-    endPath: function CanvasGraphics_endPath() {
-      this.consumePath();
-    },
-
-    // Clipping
-    clip: function CanvasGraphics_clip() {
-      this.pendingClip = NORMAL_CLIP;
-    },
-    eoClip: function CanvasGraphics_eoClip() {
-      this.pendingClip = EO_CLIP;
-    },
-
-    // Text
-    beginText: function CanvasGraphics_beginText() {
-      this.current.textMatrix = IDENTITY_MATRIX;
-      this.current.textMatrixScale = 1;
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-    },
-    endText: function CanvasGraphics_endText() {
-      var paths = this.pendingTextPaths;
-      var ctx = this.ctx;
-      if (paths === undefined) {
-        ctx.beginPath();
-        return;
-      }
-
-      ctx.save();
-      ctx.beginPath();
-      for (var i = 0; i < paths.length; i++) {
-        var path = paths[i];
-        ctx.setTransform.apply(ctx, path.transform);
-        ctx.translate(path.x, path.y);
-        path.addToPath(ctx, path.fontSize);
-      }
-      ctx.restore();
-      ctx.clip();
-      ctx.beginPath();
-      delete this.pendingTextPaths;
-    },
-    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
-      this.current.charSpacing = spacing;
-    },
-    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
-      this.current.wordSpacing = spacing;
-    },
-    setHScale: function CanvasGraphics_setHScale(scale) {
-      this.current.textHScale = scale / 100;
-    },
-    setLeading: function CanvasGraphics_setLeading(leading) {
-      this.current.leading = -leading;
-    },
-    setFont: function CanvasGraphics_setFont(fontRefName, size) {
-      var fontObj = this.commonObjs.get(fontRefName);
-      var current = this.current;
-
-      if (!fontObj) {
-        error('Can\'t find font for ' + fontRefName);
-      }
-
-      current.fontMatrix = (fontObj.fontMatrix ?
-                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
-
-      // A valid matrix needs all main diagonal elements to be non-zero
-      // This also ensures we bypass FF bugzilla bug #719844.
-      if (current.fontMatrix[0] === 0 ||
-          current.fontMatrix[3] === 0) {
-        warn('Invalid font matrix for font ' + fontRefName);
-      }
-
-      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
-      // and in some docs this can be negative (inverted x-y axes).
-      if (size < 0) {
-        size = -size;
-        current.fontDirection = -1;
-      } else {
-        current.fontDirection = 1;
-      }
-
-      this.current.font = fontObj;
-      this.current.fontSize = size;
-
-      if (fontObj.isType3Font) {
-        return; // we don't need ctx.font for Type3 fonts
-      }
-
-      var name = fontObj.loadedName || 'sans-serif';
-      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
-                                 (fontObj.bold ? 'bold' : 'normal');
-
-      var italic = fontObj.italic ? 'italic' : 'normal';
-      var typeface = '"' + name + '", ' + fontObj.fallbackName;
-
-      // Some font backends cannot handle fonts below certain size.
-      // Keeping the font at minimal size and using the fontSizeScale to change
-      // the current transformation matrix before the fillText/strokeText.
-      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
-      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE :
-                            size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;
-      this.current.fontSizeScale = size / browserFontSize;
-
-      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
-      this.ctx.font = rule;
-    },
-    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
-      this.current.textRenderingMode = mode;
-    },
-    setTextRise: function CanvasGraphics_setTextRise(rise) {
-      this.current.textRise = rise;
-    },
-    moveText: function CanvasGraphics_moveText(x, y) {
-      this.current.x = this.current.lineX += x;
-      this.current.y = this.current.lineY += y;
-    },
-    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
-      this.setLeading(-y);
-      this.moveText(x, y);
-    },
-    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
-      this.current.textMatrix = [a, b, c, d, e, f];
-      this.current.textMatrixScale = Math.sqrt(a * a + b * b);
-
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-    },
-    nextLine: function CanvasGraphics_nextLine() {
-      this.moveText(0, this.current.leading);
-    },
-
-    paintChar: function CanvasGraphics_paintChar(character, x, y) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var font = current.font;
-      var textRenderingMode = current.textRenderingMode;
-      var fontSize = current.fontSize / current.fontSizeScale;
-      var fillStrokeMode = textRenderingMode &
-        TextRenderingMode.FILL_STROKE_MASK;
-      var isAddToPathSet = !!(textRenderingMode &
-        TextRenderingMode.ADD_TO_PATH_FLAG);
-
-      var addToPath;
-      if (font.disableFontFace || isAddToPathSet) {
-        addToPath = font.getPathGenerator(this.commonObjs, character);
-      }
-
-      if (font.disableFontFace) {
-        ctx.save();
-        ctx.translate(x, y);
-        ctx.beginPath();
-        addToPath(ctx, fontSize);
-        if (fillStrokeMode === TextRenderingMode.FILL ||
-            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
-          ctx.fill();
-        }
-        if (fillStrokeMode === TextRenderingMode.STROKE ||
-            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
-          ctx.stroke();
-        }
-        ctx.restore();
-      } else {
-        if (fillStrokeMode === TextRenderingMode.FILL ||
-            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
-          ctx.fillText(character, x, y);
-        }
-        if (fillStrokeMode === TextRenderingMode.STROKE ||
-            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
-          ctx.strokeText(character, x, y);
-        }
-      }
-
-      if (isAddToPathSet) {
-        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);
-        paths.push({
-          transform: ctx.mozCurrentTransform,
-          x: x,
-          y: y,
-          fontSize: fontSize,
-          addToPath: addToPath
-        });
-      }
-    },
-
-    get isFontSubpixelAAEnabled() {
-      // Checks if anti-aliasing is enabled when scaled text is painted.
-      // On Windows GDI scaled fonts looks bad.
-      var ctx = document.createElement('canvas').getContext('2d');
-      ctx.scale(1.5, 1);
-      ctx.fillText('I', 0, 10);
-      var data = ctx.getImageData(0, 0, 10, 10).data;
-      var enabled = false;
-      for (var i = 3; i < data.length; i += 4) {
-        if (data[i] > 0 && data[i] < 255) {
-          enabled = true;
-          break;
-        }
-      }
-      return shadow(this, 'isFontSubpixelAAEnabled', enabled);
-    },
-
-    showText: function CanvasGraphics_showText(glyphs) {
-      var current = this.current;
-      var font = current.font;
-      if (font.isType3Font) {
-        return this.showType3Text(glyphs);
-      }
-
-      var fontSize = current.fontSize;
-      if (fontSize === 0) {
-        return;
-      }
-
-      var ctx = this.ctx;
-      var fontSizeScale = current.fontSizeScale;
-      var charSpacing = current.charSpacing;
-      var wordSpacing = current.wordSpacing;
-      var fontDirection = current.fontDirection;
-      var textHScale = current.textHScale * fontDirection;
-      var glyphsLength = glyphs.length;
-      var vertical = font.vertical;
-      var defaultVMetrics = font.defaultVMetrics;
-      var widthAdvanceScale = fontSize * current.fontMatrix[0];
-
-      var simpleFillText =
-        current.textRenderingMode === TextRenderingMode.FILL &&
-        !font.disableFontFace;
-
-      ctx.save();
-      ctx.transform.apply(ctx, current.textMatrix);
-      ctx.translate(current.x, current.y + current.textRise);
-
-      if (fontDirection > 0) {
-        ctx.scale(textHScale, -1);
-      } else {
-        ctx.scale(textHScale, 1);
-      }
-
-      var lineWidth = current.lineWidth;
-      var scale = current.textMatrixScale;
-      if (scale === 0 || lineWidth === 0) {
-        var fillStrokeMode = current.textRenderingMode &
-          TextRenderingMode.FILL_STROKE_MASK;
-        if (fillStrokeMode === TextRenderingMode.STROKE ||
-            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
-          this.cachedGetSinglePixelWidth = null;
-          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;
-        }
-      } else {
-        lineWidth /= scale;
-      }
-
-      if (fontSizeScale !== 1.0) {
-        ctx.scale(fontSizeScale, fontSizeScale);
-        lineWidth /= fontSizeScale;
-      }
-
-      ctx.lineWidth = lineWidth;
-
-      var x = 0, i;
-      for (i = 0; i < glyphsLength; ++i) {
-        var glyph = glyphs[i];
-        if (glyph === null) {
-          // word break
-          x += fontDirection * wordSpacing;
-          continue;
-        } else if (isNum(glyph)) {
-          x += -glyph * fontSize * 0.001;
-          continue;
-        }
-
-        var restoreNeeded = false;
-        var character = glyph.fontChar;
-        var accent = glyph.accent;
-        var scaledX, scaledY, scaledAccentX, scaledAccentY;
-        var width = glyph.width;
-        if (vertical) {
-          var vmetric, vx, vy;
-          vmetric = glyph.vmetric || defaultVMetrics;
-          vx = glyph.vmetric ? vmetric[1] : width * 0.5;
-          vx = -vx * widthAdvanceScale;
-          vy = vmetric[2] * widthAdvanceScale;
-
-          width = vmetric ? -vmetric[0] : width;
-          scaledX = vx / fontSizeScale;
-          scaledY = (x + vy) / fontSizeScale;
-        } else {
-          scaledX = x / fontSizeScale;
-          scaledY = 0;
-        }
-
-        if (font.remeasure && width > 0 && this.isFontSubpixelAAEnabled) {
-          // some standard fonts may not have the exact width, trying to
-          // rescale per character
-          var measuredWidth = ctx.measureText(character).width * 1000 /
-            fontSize * fontSizeScale;
-          var characterScaleX = width / measuredWidth;
-          restoreNeeded = true;
-          ctx.save();
-          ctx.scale(characterScaleX, 1);
-          scaledX /= characterScaleX;
-        }
-
-        if (simpleFillText && !accent) {
-          // common case
-          ctx.fillText(character, scaledX, scaledY);
-        } else {
-          this.paintChar(character, scaledX, scaledY);
-          if (accent) {
-            scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
-            scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
-            this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
-          }
-        }
-
-        var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;
-        x += charWidth;
-
-        if (restoreNeeded) {
-          ctx.restore();
-        }
-      }
-      if (vertical) {
-        current.y -= x * textHScale;
-      } else {
-        current.x += x * textHScale;
-      }
-      ctx.restore();
-    },
-
-    showType3Text: function CanvasGraphics_showType3Text(glyphs) {
-      // Type3 fonts - each glyph is a "mini-PDF"
-      var ctx = this.ctx;
-      var current = this.current;
-      var font = current.font;
-      var fontSize = current.fontSize;
-      var fontDirection = current.fontDirection;
-      var charSpacing = current.charSpacing;
-      var wordSpacing = current.wordSpacing;
-      var textHScale = current.textHScale * fontDirection;
-      var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;
-      var glyphsLength = glyphs.length;
-      var isTextInvisible =
-        current.textRenderingMode === TextRenderingMode.INVISIBLE;
-      var i, glyph, width;
-
-      if (isTextInvisible || fontSize === 0) {
-        return;
-      }
-
-      ctx.save();
-      ctx.transform.apply(ctx, current.textMatrix);
-      ctx.translate(current.x, current.y);
-
-      ctx.scale(textHScale, fontDirection);
-
-      for (i = 0; i < glyphsLength; ++i) {
-        glyph = glyphs[i];
-        if (glyph === null) {
-          // word break
-          this.ctx.translate(wordSpacing, 0);
-          current.x += wordSpacing * textHScale;
-          continue;
-        } else if (isNum(glyph)) {
-          var spacingLength = -glyph * 0.001 * fontSize;
-          this.ctx.translate(spacingLength, 0);
-          current.x += spacingLength * textHScale;
-          continue;
-        }
-
-        var operatorList = font.charProcOperatorList[glyph.operatorListId];
-        if (!operatorList) {
-          warn('Type3 character \"' + glyph.operatorListId +
-               '\" is not available');
-          continue;
-        }
-        this.processingType3 = glyph;
-        this.save();
-        ctx.scale(fontSize, fontSize);
-        ctx.transform.apply(ctx, fontMatrix);
-        this.executeOperatorList(operatorList);
-        this.restore();
-
-        var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
-        width = transformed[0] * fontSize + charSpacing;
-
-        ctx.translate(width, 0);
-        current.x += width * textHScale;
-      }
-      ctx.restore();
-      this.processingType3 = null;
-    },
-
-    // Type3 fonts
-    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
-      // We can safely ignore this since the width should be the same
-      // as the width in the Widths array.
-    },
-    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
-                                                                        yWidth,
-                                                                        llx,
-                                                                        lly,
-                                                                        urx,
-                                                                        ury) {
-      // TODO According to the spec we're also suppose to ignore any operators
-      // that set color or include images while processing this type3 font.
-      this.ctx.rect(llx, lly, urx - llx, ury - lly);
-      this.clip();
-      this.endPath();
-    },
-
-    // Color
-    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {
-      var pattern;
-      if (IR[0] === 'TilingPattern') {
-        var color = IR[1];
-        pattern = new TilingPattern(IR, color, this.ctx, this.objs,
-                                    this.commonObjs, this.baseTransform);
-      } else {
-        pattern = getShadingPatternFromIR(IR);
-      }
-      return pattern;
-    },
-    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
-      this.current.strokeColor = this.getColorN_Pattern(arguments);
-    },
-    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
-      this.current.fillColor = this.getColorN_Pattern(arguments);
-      this.current.patternFill = true;
-    },
-    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
-      var color = Util.makeCssRgb(r, g, b);
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
-      var color = Util.makeCssRgb(r, g, b);
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-      this.current.patternFill = false;
-    },
-
-    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
-      var ctx = this.ctx;
-
-      this.save();
-      var pattern = getShadingPatternFromIR(patternIR);
-      ctx.fillStyle = pattern.getPattern(ctx, this, true);
-
-      var inv = ctx.mozCurrentTransformInverse;
-      if (inv) {
-        var canvas = ctx.canvas;
-        var width = canvas.width;
-        var height = canvas.height;
-
-        var bl = Util.applyTransform([0, 0], inv);
-        var br = Util.applyTransform([0, height], inv);
-        var ul = Util.applyTransform([width, 0], inv);
-        var ur = Util.applyTransform([width, height], inv);
-
-        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
-        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
-        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
-        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
-
-        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
-      } else {
-        // HACK to draw the gradient onto an infinite rectangle.
-        // PDF gradients are drawn across the entire image while
-        // Canvas only allows gradients to be drawn in a rectangle
-        // The following bug should allow us to remove this.
-        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
-
-        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
-      }
-
-      this.restore();
-    },
-
-    // Images
-    beginInlineImage: function CanvasGraphics_beginInlineImage() {
-      error('Should not call beginInlineImage');
-    },
-    beginImageData: function CanvasGraphics_beginImageData() {
-      error('Should not call beginImageData');
-    },
-
-    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
-                                                                        bbox) {
-      this.save();
-      this.baseTransformStack.push(this.baseTransform);
-
-      if (isArray(matrix) && 6 === matrix.length) {
-        this.transform.apply(this, matrix);
-      }
-
-      this.baseTransform = this.ctx.mozCurrentTransform;
-
-      if (isArray(bbox) && 4 === bbox.length) {
-        var width = bbox[2] - bbox[0];
-        var height = bbox[3] - bbox[1];
-        this.ctx.rect(bbox[0], bbox[1], width, height);
-        this.clip();
-        this.endPath();
-      }
-    },
-
-    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
-      this.restore();
-      this.baseTransform = this.baseTransformStack.pop();
-    },
-
-    beginGroup: function CanvasGraphics_beginGroup(group) {
-      this.save();
-      var currentCtx = this.ctx;
-      // TODO non-isolated groups - according to Rik at adobe non-isolated
-      // group results aren't usually that different and they even have tools
-      // that ignore this setting. Notes from Rik on implmenting:
-      // - When you encounter an transparency group, create a new canvas with
-      // the dimensions of the bbox
-      // - copy the content from the previous canvas to the new canvas
-      // - draw as usual
-      // - remove the backdrop alpha:
-      // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha
-      // value of your transparency group and 'alphaBackdrop' the alpha of the
-      // backdrop
-      // - remove background color:
-      // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)
-      if (!group.isolated) {
-        info('TODO: Support non-isolated groups.');
-      }
-
-      // TODO knockout - supposedly possible with the clever use of compositing
-      // modes.
-      if (group.knockout) {
-        warn('Knockout groups not supported.');
-      }
-
-      var currentTransform = currentCtx.mozCurrentTransform;
-      if (group.matrix) {
-        currentCtx.transform.apply(currentCtx, group.matrix);
-      }
-      assert(group.bbox, 'Bounding box is required.');
-
-      // Based on the current transform figure out how big the bounding box
-      // will actually be.
-      var bounds = Util.getAxialAlignedBoundingBox(
-                    group.bbox,
-                    currentCtx.mozCurrentTransform);
-      // Clip the bounding box to the current canvas.
-      var canvasBounds = [0,
-                          0,
-                          currentCtx.canvas.width,
-                          currentCtx.canvas.height];
-      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
-      // Use ceil in case we're between sizes so we don't create canvas that is
-      // too small and make the canvas at least 1x1 pixels.
-      var offsetX = Math.floor(bounds[0]);
-      var offsetY = Math.floor(bounds[1]);
-      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
-      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
-      var scaleX = 1, scaleY = 1;
-      if (drawnWidth > MAX_GROUP_SIZE) {
-        scaleX = drawnWidth / MAX_GROUP_SIZE;
-        drawnWidth = MAX_GROUP_SIZE;
-      }
-      if (drawnHeight > MAX_GROUP_SIZE) {
-        scaleY = drawnHeight / MAX_GROUP_SIZE;
-        drawnHeight = MAX_GROUP_SIZE;
-      }
-
-      var cacheId = 'groupAt' + this.groupLevel;
-      if (group.smask) {
-        // Using two cache entries is case if masks are used one after another.
-        cacheId +=  '_smask_' + ((this.smaskCounter++) % 2);
-      }
-      var scratchCanvas = CachedCanvases.getCanvas(
-        cacheId, drawnWidth, drawnHeight, true);
-      var groupCtx = scratchCanvas.context;
-
-      // Since we created a new canvas that is just the size of the bounding box
-      // we have to translate the group ctx.
-      groupCtx.scale(1 / scaleX, 1 / scaleY);
-      groupCtx.translate(-offsetX, -offsetY);
-      groupCtx.transform.apply(groupCtx, currentTransform);
-
-      if (group.smask) {
-        // Saving state and cached mask to be used in setGState.
-        this.smaskStack.push({
-          canvas: scratchCanvas.canvas,
-          context: groupCtx,
-          offsetX: offsetX,
-          offsetY: offsetY,
-          scaleX: scaleX,
-          scaleY: scaleY,
-          subtype: group.smask.subtype,
-          backdrop: group.smask.backdrop
-        });
-      } else {
-        // Setup the current ctx so when the group is popped we draw it at the
-        // right location.
-        currentCtx.setTransform(1, 0, 0, 1, 0, 0);
-        currentCtx.translate(offsetX, offsetY);
-        currentCtx.scale(scaleX, scaleY);
-      }
-      // The transparency group inherits all off the current graphics state
-      // except the blend mode, soft mask, and alpha constants.
-      copyCtxState(currentCtx, groupCtx);
-      this.ctx = groupCtx;
-      this.setGState([
-        ['BM', 'Normal'],
-        ['ca', 1],
-        ['CA', 1]
-      ]);
-      this.groupStack.push(currentCtx);
-      this.groupLevel++;
-    },
-
-    endGroup: function CanvasGraphics_endGroup(group) {
-      this.groupLevel--;
-      var groupCtx = this.ctx;
-      this.ctx = this.groupStack.pop();
-      // Turn off image smoothing to avoid sub pixel interpolation which can
-      // look kind of blurry for some pdfs.
-      if (this.ctx.imageSmoothingEnabled !== undefined) {
-        this.ctx.imageSmoothingEnabled = false;
-      } else {
-        this.ctx.mozImageSmoothingEnabled = false;
-      }
-      if (group.smask) {
-        this.tempSMask = this.smaskStack.pop();
-      } else {
-        this.ctx.drawImage(groupCtx.canvas, 0, 0);
-      }
-      this.restore();
-    },
-
-    beginAnnotations: function CanvasGraphics_beginAnnotations() {
-      this.save();
-      this.current = new CanvasExtraState();
-    },
-
-    endAnnotations: function CanvasGraphics_endAnnotations() {
-      this.restore();
-    },
-
-    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform,
-                                                             matrix) {
-      this.save();
-
-      if (isArray(rect) && 4 === rect.length) {
-        var width = rect[2] - rect[0];
-        var height = rect[3] - rect[1];
-        this.ctx.rect(rect[0], rect[1], width, height);
-        this.clip();
-        this.endPath();
-      }
-
-      this.transform.apply(this, transform);
-      this.transform.apply(this, matrix);
-    },
-
-    endAnnotation: function CanvasGraphics_endAnnotation() {
-      this.restore();
-    },
-
-    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
-      var domImage = this.objs.get(objId);
-      if (!domImage) {
-        warn('Dependent image isn\'t ready yet');
-        return;
-      }
-
-      this.save();
-
-      var ctx = this.ctx;
-      // scale the image to the unit square
-      ctx.scale(1 / w, -1 / h);
-
-      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
-                    0, -h, w, h);
-      if (this.imageLayer) {
-        var currentTransform = ctx.mozCurrentTransformInverse;
-        var position = this.getCanvasPosition(0, 0);
-        this.imageLayer.appendImage({
-          objId: objId,
-          left: position[0],
-          top: position[1],
-          width: w / currentTransform[0],
-          height: h / currentTransform[3]
-        });
-      }
-      this.restore();
-    },
-
-    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {
-      var ctx = this.ctx;
-      var width = img.width, height = img.height;
-      var fillColor = this.current.fillColor;
-      var isPatternFill = this.current.patternFill;
-
-      var glyph = this.processingType3;
-
-      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {
-        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
-          glyph.compiled =
-            compileType3Glyph({data: img.data, width: width, height: height});
-        } else {
-          glyph.compiled = null;
-        }
-      }
-
-      if (glyph && glyph.compiled) {
-        glyph.compiled(ctx);
-        return;
-      }
-
-      var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
-      var maskCtx = maskCanvas.context;
-      maskCtx.save();
-
-      putBinaryImageMask(maskCtx, img);
-
-      maskCtx.globalCompositeOperation = 'source-in';
-
-      maskCtx.fillStyle = isPatternFill ?
-                          fillColor.getPattern(maskCtx, this) : fillColor;
-      maskCtx.fillRect(0, 0, width, height);
-
-      maskCtx.restore();
-
-      this.paintInlineImageXObject(maskCanvas.canvas);
-    },
-
-    paintImageMaskXObjectRepeat:
-      function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX,
-                                                          scaleY, positions) {
-      var width = imgData.width;
-      var height = imgData.height;
-      var fillColor = this.current.fillColor;
-      var isPatternFill = this.current.patternFill;
-
-      var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
-      var maskCtx = maskCanvas.context;
-      maskCtx.save();
-
-      putBinaryImageMask(maskCtx, imgData);
-
-      maskCtx.globalCompositeOperation = 'source-in';
-
-      maskCtx.fillStyle = isPatternFill ?
-                          fillColor.getPattern(maskCtx, this) : fillColor;
-      maskCtx.fillRect(0, 0, width, height);
-
-      maskCtx.restore();
-
-      var ctx = this.ctx;
-      for (var i = 0, ii = positions.length; i < ii; i += 2) {
-        ctx.save();
-        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);
-        ctx.scale(1, -1);
-        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
-          0, -1, 1, 1);
-        ctx.restore();
-      }
-    },
-
-    paintImageMaskXObjectGroup:
-      function CanvasGraphics_paintImageMaskXObjectGroup(images) {
-      var ctx = this.ctx;
-
-      var fillColor = this.current.fillColor;
-      var isPatternFill = this.current.patternFill;
-      for (var i = 0, ii = images.length; i < ii; i++) {
-        var image = images[i];
-        var width = image.width, height = image.height;
-
-        var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
-        var maskCtx = maskCanvas.context;
-        maskCtx.save();
-
-        putBinaryImageMask(maskCtx, image);
-
-        maskCtx.globalCompositeOperation = 'source-in';
-
-        maskCtx.fillStyle = isPatternFill ?
-                            fillColor.getPattern(maskCtx, this) : fillColor;
-        maskCtx.fillRect(0, 0, width, height);
-
-        maskCtx.restore();
-
-        ctx.save();
-        ctx.transform.apply(ctx, image.transform);
-        ctx.scale(1, -1);
-        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
-                      0, -1, 1, 1);
-        ctx.restore();
-      }
-    },
-
-    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
-      var imgData = this.objs.get(objId);
-      if (!imgData) {
-        warn('Dependent image isn\'t ready yet');
-        return;
-      }
-
-      this.paintInlineImageXObject(imgData);
-    },
-
-    paintImageXObjectRepeat:
-      function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY,
-                                                          positions) {
-      var imgData = this.objs.get(objId);
-      if (!imgData) {
-        warn('Dependent image isn\'t ready yet');
-        return;
-      }
-
-      var width = imgData.width;
-      var height = imgData.height;
-      var map = [];
-      for (var i = 0, ii = positions.length; i < ii; i += 2) {
-        map.push({transform: [scaleX, 0, 0, scaleY, positions[i],
-                 positions[i + 1]], x: 0, y: 0, w: width, h: height});
-      }
-      this.paintInlineImageXObjectGroup(imgData, map);
-    },
-
-    paintInlineImageXObject:
-      function CanvasGraphics_paintInlineImageXObject(imgData) {
-      var width = imgData.width;
-      var height = imgData.height;
-      var ctx = this.ctx;
-
-      this.save();
-      // scale the image to the unit square
-      ctx.scale(1 / width, -1 / height);
-
-      var currentTransform = ctx.mozCurrentTransformInverse;
-      var a = currentTransform[0], b = currentTransform[1];
-      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);
-      var c = currentTransform[2], d = currentTransform[3];
-      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);
-
-      var imgToPaint, tmpCanvas;
-      // instanceof HTMLElement does not work in jsdom node.js module
-      if (imgData instanceof HTMLElement || !imgData.data) {
-        imgToPaint = imgData;
-      } else {
-        tmpCanvas = CachedCanvases.getCanvas('inlineImage', width, height);
-        var tmpCtx = tmpCanvas.context;
-        putBinaryImageData(tmpCtx, imgData);
-        imgToPaint = tmpCanvas.canvas;
-      }
-
-      var paintWidth = width, paintHeight = height;
-      var tmpCanvasId = 'prescale1';
-      // Vertial or horizontal scaling shall not be more than 2 to not loose the
-      // pixels during drawImage operation, painting on the temporary canvas(es)
-      // that are twice smaller in size
-      while ((widthScale > 2 && paintWidth > 1) ||
-             (heightScale > 2 && paintHeight > 1)) {
-        var newWidth = paintWidth, newHeight = paintHeight;
-        if (widthScale > 2 && paintWidth > 1) {
-          newWidth = Math.ceil(paintWidth / 2);
-          widthScale /= paintWidth / newWidth;
-        }
-        if (heightScale > 2 && paintHeight > 1) {
-          newHeight = Math.ceil(paintHeight / 2);
-          heightScale /= paintHeight / newHeight;
-        }
-        tmpCanvas = CachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);
-        tmpCtx = tmpCanvas.context;
-        tmpCtx.clearRect(0, 0, newWidth, newHeight);
-        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
-                                     0, 0, newWidth, newHeight);
-        imgToPaint = tmpCanvas.canvas;
-        paintWidth = newWidth;
-        paintHeight = newHeight;
-        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';
-      }
-      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
-                                0, -height, width, height);
-
-      if (this.imageLayer) {
-        var position = this.getCanvasPosition(0, -height);
-        this.imageLayer.appendImage({
-          imgData: imgData,
-          left: position[0],
-          top: position[1],
-          width: width / currentTransform[0],
-          height: height / currentTransform[3]
-        });
-      }
-      this.restore();
-    },
-
-    paintInlineImageXObjectGroup:
-      function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {
-      var ctx = this.ctx;
-      var w = imgData.width;
-      var h = imgData.height;
-
-      var tmpCanvas = CachedCanvases.getCanvas('inlineImage', w, h);
-      var tmpCtx = tmpCanvas.context;
-      putBinaryImageData(tmpCtx, imgData);
-
-      for (var i = 0, ii = map.length; i < ii; i++) {
-        var entry = map[i];
-        ctx.save();
-        ctx.transform.apply(ctx, entry.transform);
-        ctx.scale(1, -1);
-        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h,
-                      0, -1, 1, 1);
-        if (this.imageLayer) {
-          var position = this.getCanvasPosition(entry.x, entry.y);
-          this.imageLayer.appendImage({
-            imgData: imgData,
-            left: position[0],
-            top: position[1],
-            width: w,
-            height: h
-          });
-        }
-        ctx.restore();
-      }
-    },
-
-    paintSolidColorImageMask:
-      function CanvasGraphics_paintSolidColorImageMask() {
-        this.ctx.fillRect(0, 0, 1, 1);
-    },
-
-    // Marked content
-
-    markPoint: function CanvasGraphics_markPoint(tag) {
-      // TODO Marked content.
-    },
-    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
-      // TODO Marked content.
-    },
-    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
-      // TODO Marked content.
-    },
-    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
-                                        tag, properties) {
-      // TODO Marked content.
-    },
-    endMarkedContent: function CanvasGraphics_endMarkedContent() {
-      // TODO Marked content.
-    },
-
-    // Compatibility
-
-    beginCompat: function CanvasGraphics_beginCompat() {
-      // TODO ignore undefined operators (should we do that anyway?)
-    },
-    endCompat: function CanvasGraphics_endCompat() {
-      // TODO stop ignoring undefined operators
-    },
-
-    // Helper functions
-
-    consumePath: function CanvasGraphics_consumePath() {
-      var ctx = this.ctx;
-      if (this.pendingClip) {
-        if (this.pendingClip === EO_CLIP) {
-          if (ctx.mozFillRule !== undefined) {
-            ctx.mozFillRule = 'evenodd';
-            ctx.clip();
-            ctx.mozFillRule = 'nonzero';
-          } else {
-            try {
-              ctx.clip('evenodd');
-            } catch (ex) {
-              // shouldn't really happen, but browsers might think differently
-              ctx.clip();
-            }
-          }
-        } else {
-          ctx.clip();
-        }
-        this.pendingClip = null;
-      }
-      ctx.beginPath();
-    },
-    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
-      if (this.cachedGetSinglePixelWidth === null) {
-        var inverse = this.ctx.mozCurrentTransformInverse;
-        // max of the current horizontal and vertical scale
-        this.cachedGetSinglePixelWidth = Math.sqrt(Math.max(
-          (inverse[0] * inverse[0] + inverse[1] * inverse[1]),
-          (inverse[2] * inverse[2] + inverse[3] * inverse[3])));
-      }
-      return this.cachedGetSinglePixelWidth;
-    },
-    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {
-        var transform = this.ctx.mozCurrentTransform;
-        return [
-          transform[0] * x + transform[2] * y + transform[4],
-          transform[1] * x + transform[3] * y + transform[5]
-        ];
-    }
-  };
-
-  for (var op in OPS) {
-    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];
-  }
-
-  return CanvasGraphics;
-})();
-
-
-var WebGLUtils = (function WebGLUtilsClosure() {
-  function loadShader(gl, code, shaderType) {
-    var shader = gl.createShader(shaderType);
-    gl.shaderSource(shader, code);
-    gl.compileShader(shader);
-    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
-    if (!compiled) {
-      var errorMsg = gl.getShaderInfoLog(shader);
-      throw new Error('Error during shader compilation: ' + errorMsg);
-    }
-    return shader;
-  }
-  function createVertexShader(gl, code) {
-    return loadShader(gl, code, gl.VERTEX_SHADER);
-  }
-  function createFragmentShader(gl, code) {
-    return loadShader(gl, code, gl.FRAGMENT_SHADER);
-  }
-  function createProgram(gl, shaders) {
-    var program = gl.createProgram();
-    for (var i = 0, ii = shaders.length; i < ii; ++i) {
-      gl.attachShader(program, shaders[i]);
-    }
-    gl.linkProgram(program);
-    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
-    if (!linked) {
-      var errorMsg = gl.getProgramInfoLog(program);
-      throw new Error('Error during program linking: ' + errorMsg);
-    }
-    return program;
-  }
-  function createTexture(gl, image, textureId) {
-    gl.activeTexture(textureId);
-    var texture = gl.createTexture();
-    gl.bindTexture(gl.TEXTURE_2D, texture);
-
-    // Set the parameters so we can render any size image.
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
-    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
-
-    // Upload the image into the texture.
-    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
-    return texture;
-  }
-
-  var currentGL, currentCanvas;
-  function generateGL() {
-    if (currentGL) {
-      return;
-    }
-    currentCanvas = document.createElement('canvas');
-    currentGL = currentCanvas.getContext('webgl',
-      { premultipliedalpha: false });
-  }
-
-  var smaskVertexShaderCode = '\
-  attribute vec2 a_position;                                    \
-  attribute vec2 a_texCoord;                                    \
-                                                                \
-  uniform vec2 u_resolution;                                    \
-                                                                \
-  varying vec2 v_texCoord;                                      \
-                                                                \
-  void main() {                                                 \
-    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \
-    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
-                                                                \
-    v_texCoord = a_texCoord;                                    \
-  }                                                             ';
-
-  var smaskFragmentShaderCode = '\
-  precision mediump float;                                      \
-                                                                \
-  uniform vec4 u_backdrop;                                      \
-  uniform int u_subtype;                                        \
-  uniform sampler2D u_image;                                    \
-  uniform sampler2D u_mask;                                     \
-                                                                \
-  varying vec2 v_texCoord;                                      \
-                                                                \
-  void main() {                                                 \
-    vec4 imageColor = texture2D(u_image, v_texCoord);           \
-    vec4 maskColor = texture2D(u_mask, v_texCoord);             \
-    if (u_backdrop.a > 0.0) {                                   \
-      maskColor.rgb = maskColor.rgb * maskColor.a +             \
-                      u_backdrop.rgb * (1.0 - maskColor.a);     \
-    }                                                           \
-    float lum;                                                  \
-    if (u_subtype == 0) {                                       \
-      lum = maskColor.a;                                        \
-    } else {                                                    \
-      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \
-            maskColor.b * 0.11;                                 \
-    }                                                           \
-    imageColor.a *= lum;                                        \
-    imageColor.rgb *= imageColor.a;                             \
-    gl_FragColor = imageColor;                                  \
-  }                                                             ';
-
-  var smaskCache = null;
-
-  function initSmaskGL() {
-    var canvas, gl;
-
-    generateGL();
-    canvas = currentCanvas;
-    currentCanvas = null;
-    gl = currentGL;
-    currentGL = null;
-
-    // setup a GLSL program
-    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);
-    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);
-    var program = createProgram(gl, [vertexShader, fragmentShader]);
-    gl.useProgram(program);
-
-    var cache = {};
-    cache.gl = gl;
-    cache.canvas = canvas;
-    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
-    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
-    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');
-    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');
-
-    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');
-    var texLayerLocation = gl.getUniformLocation(program, 'u_image');
-    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');
-
-    // provide texture coordinates for the rectangle.
-    var texCoordBuffer = gl.createBuffer();
-    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
-    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
-      0.0,  0.0,
-      1.0,  0.0,
-      0.0,  1.0,
-      0.0,  1.0,
-      1.0,  0.0,
-      1.0,  1.0]), gl.STATIC_DRAW);
-    gl.enableVertexAttribArray(texCoordLocation);
-    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
-
-    gl.uniform1i(texLayerLocation, 0);
-    gl.uniform1i(texMaskLocation, 1);
-
-    smaskCache = cache;
-  }
-
-  function composeSMask(layer, mask, properties) {
-    var width = layer.width, height = layer.height;
-
-    if (!smaskCache) {
-      initSmaskGL();
-    }
-    var cache = smaskCache,canvas = cache.canvas, gl = cache.gl;
-    canvas.width = width;
-    canvas.height = height;
-    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
-    gl.uniform2f(cache.resolutionLocation, width, height);
-
-    if (properties.backdrop) {
-      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0],
-                   properties.backdrop[1], properties.backdrop[2], 1);
-    } else {
-      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);
-    }
-    gl.uniform1i(cache.subtypeLocation,
-                 properties.subtype === 'Luminosity' ? 1 : 0);
-
-    // Create a textures
-    var texture = createTexture(gl, layer, gl.TEXTURE0);
-    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);
-
-
-    // Create a buffer and put a single clipspace rectangle in
-    // it (2 triangles)
-    var buffer = gl.createBuffer();
-    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
-    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
-      0, 0,
-      width, 0,
-      0, height,
-      0, height,
-      width, 0,
-      width, height]), gl.STATIC_DRAW);
-    gl.enableVertexAttribArray(cache.positionLocation);
-    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
-
-    // draw
-    gl.clearColor(0, 0, 0, 0);
-    gl.enable(gl.BLEND);
-    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
-    gl.clear(gl.COLOR_BUFFER_BIT);
-
-    gl.drawArrays(gl.TRIANGLES, 0, 6);
-
-    gl.flush();
-
-    gl.deleteTexture(texture);
-    gl.deleteTexture(maskTexture);
-    gl.deleteBuffer(buffer);
-
-    return canvas;
-  }
-
-  var figuresVertexShaderCode = '\
-  attribute vec2 a_position;                                    \
-  attribute vec3 a_color;                                       \
-                                                                \
-  uniform vec2 u_resolution;                                    \
-  uniform vec2 u_scale;                                         \
-  uniform vec2 u_offset;                                        \
-                                                                \
-  varying vec4 v_color;                                         \
-                                                                \
-  void main() {                                                 \
-    vec2 position = (a_position + u_offset) * u_scale;          \
-    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \
-    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
-                                                                \
-    v_color = vec4(a_color / 255.0, 1.0);                       \
-  }                                                             ';
-
-  var figuresFragmentShaderCode = '\
-  precision mediump float;                                      \
-                                                                \
-  varying vec4 v_color;                                         \
-                                                                \
-  void main() {                                                 \
-    gl_FragColor = v_color;                                     \
-  }                                                             ';
-
-  var figuresCache = null;
-
-  function initFiguresGL() {
-    var canvas, gl;
-
-    generateGL();
-    canvas = currentCanvas;
-    currentCanvas = null;
-    gl = currentGL;
-    currentGL = null;
-
-    // setup a GLSL program
-    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);
-    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);
-    var program = createProgram(gl, [vertexShader, fragmentShader]);
-    gl.useProgram(program);
-
-    var cache = {};
-    cache.gl = gl;
-    cache.canvas = canvas;
-    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
-    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');
-    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');
-    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
-    cache.colorLocation = gl.getAttribLocation(program, 'a_color');
-
-    figuresCache = cache;
-  }
-
-  function drawFigures(width, height, backgroundColor, figures, context) {
-    if (!figuresCache) {
-      initFiguresGL();
-    }
-    var cache = figuresCache, canvas = cache.canvas, gl = cache.gl;
-
-    canvas.width = width;
-    canvas.height = height;
-    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
-    gl.uniform2f(cache.resolutionLocation, width, height);
-
-    // count triangle points
-    var count = 0;
-    var i, ii, rows;
-    for (i = 0, ii = figures.length; i < ii; i++) {
-      switch (figures[i].type) {
-        case 'lattice':
-          rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0;
-          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;
-          break;
-        case 'triangles':
-          count += figures[i].coords.length;
-          break;
-      }
-    }
-    // transfer data
-    var coords = new Float32Array(count * 2);
-    var colors = new Uint8Array(count * 3);
-    var coordsMap = context.coords, colorsMap = context.colors;
-    var pIndex = 0, cIndex = 0;
-    for (i = 0, ii = figures.length; i < ii; i++) {
-      var figure = figures[i], ps = figure.coords, cs = figure.colors;
-      switch (figure.type) {
-        case 'lattice':
-          var cols = figure.verticesPerRow;
-          rows = (ps.length / cols) | 0;
-          for (var row = 1; row < rows; row++) {
-            var offset = row * cols + 1;
-            for (var col = 1; col < cols; col++, offset++) {
-              coords[pIndex] = coordsMap[ps[offset - cols - 1]];
-              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];
-              coords[pIndex + 2] = coordsMap[ps[offset - cols]];
-              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];
-              coords[pIndex + 4] = coordsMap[ps[offset - 1]];
-              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];
-              colors[cIndex] = colorsMap[cs[offset - cols - 1]];
-              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];
-              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];
-              colors[cIndex + 3] = colorsMap[cs[offset - cols]];
-              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];
-              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];
-              colors[cIndex + 6] = colorsMap[cs[offset - 1]];
-              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];
-              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];
-
-              coords[pIndex + 6] = coords[pIndex + 2];
-              coords[pIndex + 7] = coords[pIndex + 3];
-              coords[pIndex + 8] = coords[pIndex + 4];
-              coords[pIndex + 9] = coords[pIndex + 5];
-              coords[pIndex + 10] = coordsMap[ps[offset]];
-              coords[pIndex + 11] = coordsMap[ps[offset] + 1];
-              colors[cIndex + 9] = colors[cIndex + 3];
-              colors[cIndex + 10] = colors[cIndex + 4];
-              colors[cIndex + 11] = colors[cIndex + 5];
-              colors[cIndex + 12] = colors[cIndex + 6];
-              colors[cIndex + 13] = colors[cIndex + 7];
-              colors[cIndex + 14] = colors[cIndex + 8];
-              colors[cIndex + 15] = colorsMap[cs[offset]];
-              colors[cIndex + 16] = colorsMap[cs[offset] + 1];
-              colors[cIndex + 17] = colorsMap[cs[offset] + 2];
-              pIndex += 12;
-              cIndex += 18;
-            }
-          }
-          break;
-        case 'triangles':
-          for (var j = 0, jj = ps.length; j < jj; j++) {
-            coords[pIndex] = coordsMap[ps[j]];
-            coords[pIndex + 1] = coordsMap[ps[j] + 1];
-            colors[cIndex] = colorsMap[cs[i]];
-            colors[cIndex + 1] = colorsMap[cs[j] + 1];
-            colors[cIndex + 2] = colorsMap[cs[j] + 2];
-            pIndex += 2;
-            cIndex += 3;
-          }
-          break;
-      }
-    }
-
-    // draw
-    if (backgroundColor) {
-      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255,
-                    backgroundColor[2] / 255, 1.0);
-    } else {
-      gl.clearColor(0, 0, 0, 0);
-    }
-    gl.clear(gl.COLOR_BUFFER_BIT);
-
-    var coordsBuffer = gl.createBuffer();
-    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);
-    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);
-    gl.enableVertexAttribArray(cache.positionLocation);
-    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
-
-    var colorsBuffer = gl.createBuffer();
-    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);
-    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
-    gl.enableVertexAttribArray(cache.colorLocation);
-    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false,
-                           0, 0);
-
-    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);
-    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);
-
-    gl.drawArrays(gl.TRIANGLES, 0, count);
-
-    gl.flush();
-
-    gl.deleteBuffer(coordsBuffer);
-    gl.deleteBuffer(colorsBuffer);
-
-    return canvas;
-  }
-
-  function cleanup() {
-    if (smaskCache && smaskCache.canvas) {
-      smaskCache.canvas.width = 0;
-      smaskCache.canvas.height = 0;
-    }
-    if (figuresCache && figuresCache.canvas) {
-      figuresCache.canvas.width = 0;
-      figuresCache.canvas.height = 0;
-    }
-    smaskCache = null;
-    figuresCache = null;
-  }
-
-  return {
-    get isEnabled() {
-      if (PDFJS.disableWebGL) {
-        return false;
-      }
-      var enabled = false;
-      try {
-        generateGL();
-        enabled = !!currentGL;
-      } catch (e) { }
-      return shadow(this, 'isEnabled', enabled);
-    },
-    composeSMask: composeSMask,
-    drawFigures: drawFigures,
-    clear: cleanup
-  };
-})();
-
-
-var ShadingIRs = {};
-
-ShadingIRs.RadialAxial = {
-  fromIR: function RadialAxial_fromIR(raw) {
-    var type = raw[1];
-    var colorStops = raw[2];
-    var p0 = raw[3];
-    var p1 = raw[4];
-    var r0 = raw[5];
-    var r1 = raw[6];
-    return {
-      type: 'Pattern',
-      getPattern: function RadialAxial_getPattern(ctx) {
-        var grad;
-        if (type === 'axial') {
-          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
-        } else if (type === 'radial') {
-          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
-        }
-
-        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
-          var c = colorStops[i];
-          grad.addColorStop(c[0], c[1]);
-        }
-        return grad;
-      }
-    };
-  }
-};
-
-var createMeshCanvas = (function createMeshCanvasClosure() {
-  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
-    // Very basic Gouraud-shaded triangle rasterization algorithm.
-    var coords = context.coords, colors = context.colors;
-    var bytes = data.data, rowSize = data.width * 4;
-    var tmp;
-    if (coords[p1 + 1] > coords[p2 + 1]) {
-      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
-    }
-    if (coords[p2 + 1] > coords[p3 + 1]) {
-      tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp;
-    }
-    if (coords[p1 + 1] > coords[p2 + 1]) {
-      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
-    }
-    var x1 = (coords[p1] + context.offsetX) * context.scaleX;
-    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;
-    var x2 = (coords[p2] + context.offsetX) * context.scaleX;
-    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;
-    var x3 = (coords[p3] + context.offsetX) * context.scaleX;
-    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;
-    if (y1 >= y3) {
-      return;
-    }
-    var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2];
-    var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2];
-    var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2];
-
-    var minY = Math.round(y1), maxY = Math.round(y3);
-    var xa, car, cag, cab;
-    var xb, cbr, cbg, cbb;
-    var k;
-    for (var y = minY; y <= maxY; y++) {
-      if (y < y2) {
-        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);
-        xa = x1 - (x1 - x2) * k;
-        car = c1r - (c1r - c2r) * k;
-        cag = c1g - (c1g - c2g) * k;
-        cab = c1b - (c1b - c2b) * k;
-      } else {
-        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);
-        xa = x2 - (x2 - x3) * k;
-        car = c2r - (c2r - c3r) * k;
-        cag = c2g - (c2g - c3g) * k;
-        cab = c2b - (c2b - c3b) * k;
-      }
-      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);
-      xb = x1 - (x1 - x3) * k;
-      cbr = c1r - (c1r - c3r) * k;
-      cbg = c1g - (c1g - c3g) * k;
-      cbb = c1b - (c1b - c3b) * k;
-      var x1_ = Math.round(Math.min(xa, xb));
-      var x2_ = Math.round(Math.max(xa, xb));
-      var j = rowSize * y + x1_ * 4;
-      for (var x = x1_; x <= x2_; x++) {
-        k = (xa - x) / (xa - xb);
-        k = k < 0 ? 0 : k > 1 ? 1 : k;
-        bytes[j++] = (car - (car - cbr) * k) | 0;
-        bytes[j++] = (cag - (cag - cbg) * k) | 0;
-        bytes[j++] = (cab - (cab - cbb) * k) | 0;
-        bytes[j++] = 255;
-      }
-    }
-  }
-
-  function drawFigure(data, figure, context) {
-    var ps = figure.coords;
-    var cs = figure.colors;
-    var i, ii;
-    switch (figure.type) {
-      case 'lattice':
-        var verticesPerRow = figure.verticesPerRow;
-        var rows = Math.floor(ps.length / verticesPerRow) - 1;
-        var cols = verticesPerRow - 1;
-        for (i = 0; i < rows; i++) {
-          var q = i * verticesPerRow;
-          for (var j = 0; j < cols; j++, q++) {
-            drawTriangle(data, context,
-              ps[q], ps[q + 1], ps[q + verticesPerRow],
-              cs[q], cs[q + 1], cs[q + verticesPerRow]);
-            drawTriangle(data, context,
-              ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow],
-              cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);
-          }
-        }
-        break;
-      case 'triangles':
-        for (i = 0, ii = ps.length; i < ii; i += 3) {
-          drawTriangle(data, context,
-            ps[i], ps[i + 1], ps[i + 2],
-            cs[i], cs[i + 1], cs[i + 2]);
-        }
-        break;
-      default:
-        error('illigal figure');
-        break;
-    }
-  }
-
-  function createMeshCanvas(bounds, combinesScale, coords, colors, figures,
-                            backgroundColor) {
-    // we will increase scale on some weird factor to let antialiasing take
-    // care of "rough" edges
-    var EXPECTED_SCALE = 1.1;
-    // MAX_PATTERN_SIZE is used to avoid OOM situation.
-    var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
-
-    var offsetX = Math.floor(bounds[0]);
-    var offsetY = Math.floor(bounds[1]);
-    var boundsWidth = Math.ceil(bounds[2]) - offsetX;
-    var boundsHeight = Math.ceil(bounds[3]) - offsetY;
-
-    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] *
-      EXPECTED_SCALE)), MAX_PATTERN_SIZE);
-    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] *
-      EXPECTED_SCALE)), MAX_PATTERN_SIZE);
-    var scaleX = boundsWidth / width;
-    var scaleY = boundsHeight / height;
-
-    var context = {
-      coords: coords,
-      colors: colors,
-      offsetX: -offsetX,
-      offsetY: -offsetY,
-      scaleX: 1 / scaleX,
-      scaleY: 1 / scaleY
-    };
-
-    var canvas, tmpCanvas, i, ii;
-    if (WebGLUtils.isEnabled) {
-      canvas = WebGLUtils.drawFigures(width, height, backgroundColor,
-                                      figures, context);
-
-      // https://bugzilla.mozilla.org/show_bug.cgi?id=972126
-      tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
-      tmpCanvas.context.drawImage(canvas, 0, 0);
-      canvas = tmpCanvas.canvas;
-    } else {
-      tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
-      var tmpCtx = tmpCanvas.context;
-
-      var data = tmpCtx.createImageData(width, height);
-      if (backgroundColor) {
-        var bytes = data.data;
-        for (i = 0, ii = bytes.length; i < ii; i += 4) {
-          bytes[i] = backgroundColor[0];
-          bytes[i + 1] = backgroundColor[1];
-          bytes[i + 2] = backgroundColor[2];
-          bytes[i + 3] = 255;
-        }
-      }
-      for (i = 0; i < figures.length; i++) {
-        drawFigure(data, figures[i], context);
-      }
-      tmpCtx.putImageData(data, 0, 0);
-      canvas = tmpCanvas.canvas;
-    }
-
-    return {canvas: canvas, offsetX: offsetX, offsetY: offsetY,
-            scaleX: scaleX, scaleY: scaleY};
-  }
-  return createMeshCanvas;
-})();
-
-ShadingIRs.Mesh = {
-  fromIR: function Mesh_fromIR(raw) {
-    //var type = raw[1];
-    var coords = raw[2];
-    var colors = raw[3];
-    var figures = raw[4];
-    var bounds = raw[5];
-    var matrix = raw[6];
-    //var bbox = raw[7];
-    var background = raw[8];
-    return {
-      type: 'Pattern',
-      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {
-        var scale;
-        if (shadingFill) {
-          scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);
-        } else {
-          // Obtain scale from matrix and current transformation matrix.
-          scale = Util.singularValueDecompose2dScale(owner.baseTransform);
-          if (matrix) {
-            var matrixScale = Util.singularValueDecompose2dScale(matrix);
-            scale = [scale[0] * matrixScale[0],
-                     scale[1] * matrixScale[1]];
-          }
-        }
-
-
-        // Rasterizing on the main thread since sending/queue large canvases
-        // might cause OOM.
-        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords,
-          colors, figures, shadingFill ? null : background);
-
-        if (!shadingFill) {
-          ctx.setTransform.apply(ctx, owner.baseTransform);
-          if (matrix) {
-            ctx.transform.apply(ctx, matrix);
-          }
-        }
-
-        ctx.translate(temporaryPatternCanvas.offsetX,
-                      temporaryPatternCanvas.offsetY);
-        ctx.scale(temporaryPatternCanvas.scaleX,
-                  temporaryPatternCanvas.scaleY);
-
-        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');
-      }
-    };
-  }
-};
-
-ShadingIRs.Dummy = {
-  fromIR: function Dummy_fromIR() {
-    return {
-      type: 'Pattern',
-      getPattern: function Dummy_fromIR_getPattern() {
-        return 'hotpink';
-      }
-    };
-  }
-};
-
-function getShadingPatternFromIR(raw) {
-  var shadingIR = ShadingIRs[raw[0]];
-  if (!shadingIR) {
-    error('Unknown IR type: ' + raw[0]);
-  }
-  return shadingIR.fromIR(raw);
-}
-
-var TilingPattern = (function TilingPatternClosure() {
-  var PaintType = {
-    COLORED: 1,
-    UNCOLORED: 2
-  };
-
-  var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
-
-  function TilingPattern(IR, color, ctx, objs, commonObjs, baseTransform) {
-    this.operatorList = IR[2];
-    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
-    this.bbox = IR[4];
-    this.xstep = IR[5];
-    this.ystep = IR[6];
-    this.paintType = IR[7];
-    this.tilingType = IR[8];
-    this.color = color;
-    this.objs = objs;
-    this.commonObjs = commonObjs;
-    this.baseTransform = baseTransform;
-    this.type = 'Pattern';
-    this.ctx = ctx;
-  }
-
-  TilingPattern.prototype = {
-    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {
-      var operatorList = this.operatorList;
-      var bbox = this.bbox;
-      var xstep = this.xstep;
-      var ystep = this.ystep;
-      var paintType = this.paintType;
-      var tilingType = this.tilingType;
-      var color = this.color;
-      var objs = this.objs;
-      var commonObjs = this.commonObjs;
-
-      info('TilingType: ' + tilingType);
-
-      var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
-
-      var topLeft = [x0, y0];
-      // we want the canvas to be as large as the step size
-      var botRight = [x0 + xstep, y0 + ystep];
-
-      var width = botRight[0] - topLeft[0];
-      var height = botRight[1] - topLeft[1];
-
-      // Obtain scale from matrix and current transformation matrix.
-      var matrixScale = Util.singularValueDecompose2dScale(this.matrix);
-      var curMatrixScale = Util.singularValueDecompose2dScale(
-        this.baseTransform);
-      var combinedScale = [matrixScale[0] * curMatrixScale[0],
-        matrixScale[1] * curMatrixScale[1]];
-
-      // MAX_PATTERN_SIZE is used to avoid OOM situation.
-      // Use width and height values that are as close as possible to the end
-      // result when the pattern is used. Too low value makes the pattern look
-      // blurry. Too large value makes it look too crispy.
-      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])),
-        MAX_PATTERN_SIZE);
-
-      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])),
-        MAX_PATTERN_SIZE);
-
-      var tmpCanvas = CachedCanvases.getCanvas('pattern', width, height, true);
-      var tmpCtx = tmpCanvas.context;
-      var graphics = new CanvasGraphics(tmpCtx, commonObjs, objs);
-      graphics.groupLevel = owner.groupLevel;
-
-      this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color);
-
-      this.setScale(width, height, xstep, ystep);
-      this.transformToScale(graphics);
-
-      // transform coordinates to pattern space
-      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
-      graphics.transform.apply(graphics, tmpTranslate);
-
-      this.clipBbox(graphics, bbox, x0, y0, x1, y1);
-
-      graphics.executeOperatorList(operatorList);
-      return tmpCanvas.canvas;
-    },
-
-    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {
-      this.scale = [width / xstep, height / ystep];
-    },
-
-    transformToScale: function TilingPattern_transformToScale(graphics) {
-      var scale = this.scale;
-      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
-      graphics.transform.apply(graphics, tmpScale);
-    },
-
-    scaleToContext: function TilingPattern_scaleToContext() {
-      var scale = this.scale;
-      this.ctx.scale(1 / scale[0], 1 / scale[1]);
-    },
-
-    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {
-      if (bbox && isArray(bbox) && bbox.length === 4) {
-        var bboxWidth = x1 - x0;
-        var bboxHeight = y1 - y0;
-        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
-        graphics.clip();
-        graphics.endPath();
-      }
-    },
-
-    setFillAndStrokeStyleToContext:
-      function setFillAndStrokeStyleToContext(context, paintType, color) {
-        switch (paintType) {
-          case PaintType.COLORED:
-            var ctx = this.ctx;
-            context.fillStyle = ctx.fillStyle;
-            context.strokeStyle = ctx.strokeStyle;
-            break;
-          case PaintType.UNCOLORED:
-            var cssColor = Util.makeCssRgb(color[0], color[1], color[2]);
-            context.fillStyle = cssColor;
-            context.strokeStyle = cssColor;
-            break;
-          default:
-            error('Unsupported paint type: ' + paintType);
-        }
-      },
-
-    getPattern: function TilingPattern_getPattern(ctx, owner) {
-      var temporaryPatternCanvas = this.createPatternCanvas(owner);
-
-      ctx = this.ctx;
-      ctx.setTransform.apply(ctx, this.baseTransform);
-      ctx.transform.apply(ctx, this.matrix);
-      this.scaleToContext();
-
-      return ctx.createPattern(temporaryPatternCanvas, 'repeat');
-    }
-  };
-
-  return TilingPattern;
-})();
-
-
-PDFJS.disableFontFace = false;
-
-var FontLoader = {
-  insertRule: function fontLoaderInsertRule(rule) {
-    var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG');
-    if (!styleElement) {
-      styleElement = document.createElement('style');
-      styleElement.id = 'PDFJS_FONT_STYLE_TAG';
-      document.documentElement.getElementsByTagName('head')[0].appendChild(
-        styleElement);
-    }
-
-    var styleSheet = styleElement.sheet;
-    styleSheet.insertRule(rule, styleSheet.cssRules.length);
-  },
-
-  clear: function fontLoaderClear() {
-    var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG');
-    if (styleElement) {
-      styleElement.parentNode.removeChild(styleElement);
-    }
-//#if !(MOZCENTRAL)
-    this.nativeFontFaces.forEach(function(nativeFontFace) {
-      document.fonts.delete(nativeFontFace);
-    });
-    this.nativeFontFaces.length = 0;
-//#endif
-  },
-//#if !(MOZCENTRAL)
-  get loadTestFont() {
-    // This is a CFF font with 1 glyph for '.' that fills its entire width and
-    // height.
-    return shadow(this, 'loadTestFont', atob(
-      'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' +
-      'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' +
-      'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' +
-      'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' +
-      'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' +
-      'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' +
-      'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' +
-      'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' +
-      'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' +
-      'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' +
-      'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' +
-      'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' +
-      'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' +
-      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
-      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
-      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
-      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' +
-      'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' +
-      'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' +
-      'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' +
-      'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' +
-      'ABAAAAAAAAAAAD6AAAAAAAAA=='
-    ));
-  },
-
-  loadTestFontId: 0,
-
-  loadingContext: {
-    requests: [],
-    nextRequestId: 0
-  },
-
-  isSyncFontLoadingSupported: (function detectSyncFontLoadingSupport() {
-    if (isWorker) {
-      return false;
-    }
-
-    // User agent string sniffing is bad, but there is no reliable way to tell
-    // if font is fully loaded and ready to be used with canvas.
-    var userAgent = window.navigator.userAgent;
-    var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent);
-    if (m && m[1] >= 14) {
-      return true;
-    }
-    // TODO other browsers
-    if (userAgent === 'node') {
-      return true;
-    }
-    return false;
-  })(),
-
-  nativeFontFaces: [],
-
-  isFontLoadingAPISupported: (!isWorker && typeof document !== 'undefined' &&
-                              !!document.fonts),
-
-  addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) {
-    this.nativeFontFaces.push(nativeFontFace);
-    document.fonts.add(nativeFontFace);
-  },
-
-  bind: function fontLoaderBind(fonts, callback) {
-    assert(!isWorker, 'bind() shall be called from main thread');
-
-    var rules = [];
-    var fontsToLoad = [];
-    var fontLoadPromises = [];
-    for (var i = 0, ii = fonts.length; i < ii; i++) {
-      var font = fonts[i];
-
-      // Add the font to the DOM only once or skip if the font
-      // is already loaded.
-      if (font.attached || font.loading === false) {
-        continue;
-      }
-      font.attached = true;
-
-      if (this.isFontLoadingAPISupported) {
-        var nativeFontFace = font.createNativeFontFace();
-        if (nativeFontFace) {
-          fontLoadPromises.push(nativeFontFace.loaded);
-        }
-      } else {
-        var rule = font.bindDOM();
-        if (rule) {
-          rules.push(rule);
-          fontsToLoad.push(font);
-        }
-      }
-    }
-
-    var request = FontLoader.queueLoadingCallback(callback);
-    if (this.isFontLoadingAPISupported) {
-      Promise.all(fontsToLoad).then(function() {
-        request.complete();
-      });
-    } else if (rules.length > 0 && !this.isSyncFontLoadingSupported) {
-      FontLoader.prepareFontLoadEvent(rules, fontsToLoad, request);
-    } else {
-      request.complete();
-    }
-  },
-
-  queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) {
-    function LoadLoader_completeRequest() {
-      assert(!request.end, 'completeRequest() cannot be called twice');
-      request.end = Date.now();
-
-      // sending all completed requests in order how they were queued
-      while (context.requests.length > 0 && context.requests[0].end) {
-        var otherRequest = context.requests.shift();
-        setTimeout(otherRequest.callback, 0);
-      }
-    }
-
-    var context = FontLoader.loadingContext;
-    var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++);
-    var request = {
-      id: requestId,
-      complete: LoadLoader_completeRequest,
-      callback: callback,
-      started: Date.now()
-    };
-    context.requests.push(request);
-    return request;
-  },
-
-  prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules,
-                                                                fonts,
-                                                                request) {
-      /** Hack begin */
-      // There's currently no event when a font has finished downloading so the
-      // following code is a dirty hack to 'guess' when a font is
-      // ready. It's assumed fonts are loaded in order, so add a known test
-      // font after the desired fonts and then test for the loading of that
-      // test font.
-
-      function int32(data, offset) {
-        return (data.charCodeAt(offset) << 24) |
-               (data.charCodeAt(offset + 1) << 16) |
-               (data.charCodeAt(offset + 2) << 8) |
-               (data.charCodeAt(offset + 3) & 0xff);
-      }
-
-      function spliceString(s, offset, remove, insert) {
-        var chunk1 = s.substr(0, offset);
-        var chunk2 = s.substr(offset + remove);
-        return chunk1 + insert + chunk2;
-      }
-
-      var i, ii;
-
-      var canvas = document.createElement('canvas');
-      canvas.width = 1;
-      canvas.height = 1;
-      var ctx = canvas.getContext('2d');
-
-      var called = 0;
-      function isFontReady(name, callback) {
-        called++;
-        // With setTimeout clamping this gives the font ~100ms to load.
-        if(called > 30) {
-          warn('Load test font never loaded.');
-          callback();
-          return;
-        }
-        ctx.font = '30px ' + name;
-        ctx.fillText('.', 0, 20);
-        var imageData = ctx.getImageData(0, 0, 1, 1);
-        if (imageData.data[3] > 0) {
-          callback();
-          return;
-        }
-        setTimeout(isFontReady.bind(null, name, callback));
-      }
-
-      var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++;
-      // Chromium seems to cache fonts based on a hash of the actual font data,
-      // so the font must be modified for each load test else it will appear to
-      // be loaded already.
-      // TODO: This could maybe be made faster by avoiding the btoa of the full
-      // font by splitting it in chunks before hand and padding the font id.
-      var data = this.loadTestFont;
-      var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)
-      data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length,
-                          loadTestFontId);
-      // CFF checksum is important for IE, adjusting it
-      var CFF_CHECKSUM_OFFSET = 16;
-      var XXXX_VALUE = 0x58585858; // the "comment" filled with 'X'
-      var checksum = int32(data, CFF_CHECKSUM_OFFSET);
-      for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {
-        checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;
-      }
-      if (i < loadTestFontId.length) { // align to 4 bytes boundary
-        checksum = (checksum - XXXX_VALUE +
-                    int32(loadTestFontId + 'XXX', i)) | 0;
-      }
-      data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));
-
-      var url = 'url(data:font/opentype;base64,' + btoa(data) + ');';
-      var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' +
-                 url + '}';
-      FontLoader.insertRule(rule);
-
-      var names = [];
-      for (i = 0, ii = fonts.length; i < ii; i++) {
-        names.push(fonts[i].loadedName);
-      }
-      names.push(loadTestFontId);
-
-      var div = document.createElement('div');
-      div.setAttribute('style',
-                       'visibility: hidden;' +
-                       'width: 10px; height: 10px;' +
-                       'position: absolute; top: 0px; left: 0px;');
-      for (i = 0, ii = names.length; i < ii; ++i) {
-        var span = document.createElement('span');
-        span.textContent = 'Hi';
-        span.style.fontFamily = names[i];
-        div.appendChild(span);
-      }
-      document.body.appendChild(div);
-
-      isFontReady(loadTestFontId, function() {
-        document.body.removeChild(div);
-        request.complete();
-      });
-      /** Hack end */
-  }
-//#else
-//bind: function fontLoaderBind(fonts, callback) {
-//  assert(!isWorker, 'bind() shall be called from main thread');
-//
-//  for (var i = 0, ii = fonts.length; i < ii; i++) {
-//    var font = fonts[i];
-//    if (font.attached) {
-//      continue;
-//    }
-//
-//    font.attached = true;
-//    font.bindDOM()
-//  }
-//
-//  setTimeout(callback);
-//}
-//#endif
-};
-
-var FontFaceObject = (function FontFaceObjectClosure() {
-  function FontFaceObject(name, file, properties) {
-    this.compiledGlyphs = {};
-    if (arguments.length === 1) {
-      // importing translated data
-      var data = arguments[0];
-      for (var i in data) {
-        this[i] = data[i];
-      }
-      return;
-    }
-  }
-  FontFaceObject.prototype = {
-//#if !(MOZCENTRAL)
-    createNativeFontFace: function FontFaceObject_createNativeFontFace() {
-      if (!this.data) {
-        return null;
-      }
-
-      if (PDFJS.disableFontFace) {
-        this.disableFontFace = true;
-        return null;
-      }
-
-      var nativeFontFace = new FontFace(this.loadedName, this.data, {});
-
-      FontLoader.addNativeFontFace(nativeFontFace);
-
-      if (PDFJS.pdfBug && 'FontInspector' in globalScope &&
-          globalScope['FontInspector'].enabled) {
-        globalScope['FontInspector'].fontAdded(this);
-      }
-      return nativeFontFace;
-    },
-//#endif
-
-    bindDOM: function FontFaceObject_bindDOM() {
-      if (!this.data) {
-        return null;
-      }
-
-      if (PDFJS.disableFontFace) {
-        this.disableFontFace = true;
-        return null;
-      }
-
-      var data = bytesToString(new Uint8Array(this.data));
-      var fontName = this.loadedName;
-
-      // Add the font-face rule to the document
-      var url = ('url(data:' + this.mimetype + ';base64,' +
-                 window.btoa(data) + ');');
-      var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}';
-      FontLoader.insertRule(rule);
-
-      if (PDFJS.pdfBug && 'FontInspector' in globalScope &&
-          globalScope['FontInspector'].enabled) {
-        globalScope['FontInspector'].fontAdded(this, url);
-      }
-
-      return rule;
-    },
-
-    getPathGenerator: function FontLoader_getPathGenerator(objs, character) {
-      if (!(character in this.compiledGlyphs)) {
-        var js = objs.get(this.loadedName + '_path_' + character);
-        /*jshint -W054 */
-        this.compiledGlyphs[character] = new Function('c', 'size', js);
-      }
-      return this.compiledGlyphs[character];
-    }
-  };
-  return FontFaceObject;
-})();
-
-
-var ANNOT_MIN_SIZE = 10; // px
-
-var AnnotationUtils = (function AnnotationUtilsClosure() {
-  // TODO(mack): This dupes some of the logic in CanvasGraphics.setFont()
-  function setTextStyles(element, item, fontObj) {
-
-    var style = element.style;
-    style.fontSize = item.fontSize + 'px';
-    style.direction = item.fontDirection < 0 ? 'rtl': 'ltr';
-
-    if (!fontObj) {
-      return;
-    }
-
-    style.fontWeight = fontObj.black ?
-      (fontObj.bold ? 'bolder' : 'bold') :
-      (fontObj.bold ? 'bold' : 'normal');
-    style.fontStyle = fontObj.italic ? 'italic' : 'normal';
-
-    var fontName = fontObj.loadedName;
-    var fontFamily = fontName ? '"' + fontName + '", ' : '';
-    // Use a reasonable default font if the font doesn't specify a fallback
-    var fallbackName = fontObj.fallbackName || 'Helvetica, sans-serif';
-    style.fontFamily = fontFamily + fallbackName;
-  }
-
-  function initContainer(item, drawBorder) {
-    var container = document.createElement('section');
-    var cstyle = container.style;
-    var width = item.rect[2] - item.rect[0];
-    var height = item.rect[3] - item.rect[1];
-
-    var bWidth = item.borderWidth || 0;
-    if (bWidth) {
-      width = width - 2 * bWidth;
-      height = height - 2 * bWidth;
-      cstyle.borderWidth = bWidth + 'px';
-      var color = item.color;
-      if (drawBorder && color) {
-        cstyle.borderStyle = 'solid';
-        cstyle.borderColor = Util.makeCssRgb(Math.round(color[0] * 255),
-                                             Math.round(color[1] * 255),
-                                             Math.round(color[2] * 255));
-      }
-    }
-    cstyle.width = width + 'px';
-    cstyle.height = height + 'px';
-    return container;
-  }
-
-  function getHtmlElementForTextWidgetAnnotation(item, commonObjs) {
-    var element = document.createElement('div');
-    var width = item.rect[2] - item.rect[0];
-    var height = item.rect[3] - item.rect[1];
-    element.style.width = width + 'px';
-    element.style.height = height + 'px';
-    element.style.display = 'table';
-
-    var content = document.createElement('div');
-    content.textContent = item.fieldValue;
-    var textAlignment = item.textAlignment;
-    content.style.textAlign = ['left', 'center', 'right'][textAlignment];
-    content.style.verticalAlign = 'middle';
-    content.style.display = 'table-cell';
-
-    var fontObj = item.fontRefName ?
-      commonObjs.getData(item.fontRefName) : null;
-    setTextStyles(content, item, fontObj);
-
-    element.appendChild(content);
-
-    return element;
-  }
-
-  function getHtmlElementForTextAnnotation(item) {
-    var rect = item.rect;
-
-    // sanity check because of OOo-generated PDFs
-    if ((rect[3] - rect[1]) < ANNOT_MIN_SIZE) {
-      rect[3] = rect[1] + ANNOT_MIN_SIZE;
-    }
-    if ((rect[2] - rect[0]) < ANNOT_MIN_SIZE) {
-      rect[2] = rect[0] + (rect[3] - rect[1]); // make it square
-    }
-
-    var container = initContainer(item, false);
-    container.className = 'annotText';
-
-    var image  = document.createElement('img');
-    image.style.height = container.style.height;
-    image.style.width = container.style.width;
-    var iconName = item.name;
-    image.src = PDFJS.imageResourcesPath + 'annotation-' +
-      iconName.toLowerCase() + '.svg';
-    image.alt = '[{{type}} Annotation]';
-    image.dataset.l10nId = 'text_annotation_type';
-    image.dataset.l10nArgs = JSON.stringify({type: iconName});
-
-    var contentWrapper = document.createElement('div');
-    contentWrapper.className = 'annotTextContentWrapper';
-    contentWrapper.style.left = Math.floor(rect[2] - rect[0] + 5) + 'px';
-    contentWrapper.style.top = '-10px';
-
-    var content = document.createElement('div');
-    content.className = 'annotTextContent';
-    content.setAttribute('hidden', true);
-
-    var i, ii;
-    if (item.hasBgColor) {
-      var color = item.color;
-
-      // Enlighten the color (70%)
-      var BACKGROUND_ENLIGHT = 0.7;
-      var r = BACKGROUND_ENLIGHT * (1.0 - color[0]) + color[0];
-      var g = BACKGROUND_ENLIGHT * (1.0 - color[1]) + color[1];
-      var b = BACKGROUND_ENLIGHT * (1.0 - color[2]) + color[2];
-      content.style.backgroundColor = Util.makeCssRgb((r * 255) | 0,
-                                                      (g * 255) | 0,
-                                                      (b * 255) | 0);
-    }
-
-    var title = document.createElement('h1');
-    var text = document.createElement('p');
-    title.textContent = item.title;
-
-    if (!item.content && !item.title) {
-      content.setAttribute('hidden', true);
-    } else {
-      var e = document.createElement('span');
-      var lines = item.content.split(/(?:\r\n?|\n)/);
-      for (i = 0, ii = lines.length; i < ii; ++i) {
-        var line = lines[i];
-        e.appendChild(document.createTextNode(line));
-        if (i < (ii - 1)) {
-          e.appendChild(document.createElement('br'));
-        }
-      }
-      text.appendChild(e);
-
-      var pinned = false;
-
-      var showAnnotation = function showAnnotation(pin) {
-        if (pin) {
-          pinned = true;
-        }
-        if (content.hasAttribute('hidden')) {
-          container.style.zIndex += 1;
-          content.removeAttribute('hidden');
-        }
-      };
-
-      var hideAnnotation = function hideAnnotation(unpin) {
-        if (unpin) {
-          pinned = false;
-        }
-        if (!content.hasAttribute('hidden') && !pinned) {
-          container.style.zIndex -= 1;
-          content.setAttribute('hidden', true);
-        }
-      };
-
-      var toggleAnnotation = function toggleAnnotation() {
-        if (pinned) {
-          hideAnnotation(true);
-        } else {
-          showAnnotation(true);
-        }
-      };
-
-      image.addEventListener('click', function image_clickHandler() {
-        toggleAnnotation();
-      }, false);
-      image.addEventListener('mouseover', function image_mouseOverHandler() {
-        showAnnotation();
-      }, false);
-      image.addEventListener('mouseout', function image_mouseOutHandler() {
-        hideAnnotation();
-      }, false);
-
-      content.addEventListener('click', function content_clickHandler() {
-        hideAnnotation(true);
-      }, false);
-    }
-
-    content.appendChild(title);
-    content.appendChild(text);
-    contentWrapper.appendChild(content);
-    container.appendChild(image);
-    container.appendChild(contentWrapper);
-
-    return container;
-  }
-
-  function getHtmlElementForLinkAnnotation(item) {
-    var container = initContainer(item, true);
-    container.className = 'annotLink';
-
-    var link = document.createElement('a');
-    link.href = link.title = item.url || '';
-    if (item.url && PDFJS.openExternalLinksInNewWindow) {
-      link.target = '_blank';
-    }
-
-    container.appendChild(link);
-
-    return container;
-  }
-
-  function getHtmlElement(data, objs) {
-    switch (data.annotationType) {
-      case AnnotationType.WIDGET:
-        return getHtmlElementForTextWidgetAnnotation(data, objs);
-      case AnnotationType.TEXT:
-        return getHtmlElementForTextAnnotation(data);
-      case AnnotationType.LINK:
-        return getHtmlElementForLinkAnnotation(data);
-      default:
-        throw new Error('Unsupported annotationType: ' + data.annotationType);
-    }
-  }
-
-  return {
-    getHtmlElement: getHtmlElement
-  };
-})();
-PDFJS.AnnotationUtils = AnnotationUtils;
-
-
-//#if (GENERIC || SINGLE_FILE)
-var SVG_DEFAULTS = {
-  fontStyle: 'normal',
-  fontWeight: 'normal',
-  fillColor: '#000000'
-};
-
-var convertImgDataToPng = (function convertImgDataToPngClosure() {
-  var PNG_HEADER =
-    new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
-
-  var CHUNK_WRAPPER_SIZE = 12;
-
-  var crcTable = new Int32Array(256);
-  for (var i = 0; i < 256; i++) {
-    var c = i;
-    for (var h = 0; h < 8; h++) {
-      if (c & 1) {
-        c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff);
-      } else {
-        c = (c >> 1) & 0x7fffffff;
-      }
-    }
-    crcTable[i] = c;
-  }
-
-  function crc32(data, start, end) {
-    var crc = -1;
-    for (var i = start; i < end; i++) {
-      var a = (crc ^ data[i]) & 0xff;
-      var b = crcTable[a];
-      crc = (crc >>> 8) ^ b;
-    }
-    return crc ^ -1;
-  }
-
-  function writePngChunk(type, body, data, offset) {
-    var p = offset;
-    var len = body.length;
-
-    data[p] = len >> 24 & 0xff;
-    data[p + 1] = len >> 16 & 0xff;
-    data[p + 2] = len >> 8 & 0xff;
-    data[p + 3] = len & 0xff;
-    p += 4;
-
-    data[p] = type.charCodeAt(0) & 0xff;
-    data[p + 1] = type.charCodeAt(1) & 0xff;
-    data[p + 2] = type.charCodeAt(2) & 0xff;
-    data[p + 3] = type.charCodeAt(3) & 0xff;
-    p += 4;
-
-    data.set(body, p);
-    p += body.length;
-
-    var crc = crc32(data, offset + 4, p);
-
-    data[p] = crc >> 24 & 0xff;
-    data[p + 1] = crc >> 16 & 0xff;
-    data[p + 2] = crc >> 8 & 0xff;
-    data[p + 3] = crc & 0xff;
-  }
-
-  function adler32(data, start, end) {
-    var a = 1;
-    var b = 0;
-    for (var i = start; i < end; ++i) {
-      a = (a + (data[i] & 0xff)) % 65521;
-      b = (b + a) % 65521;
-    }
-    return (b << 16) | a;
-  }
-
-  function encode(imgData, kind) {
-    var width = imgData.width;
-    var height = imgData.height;
-    var bitDepth, colorType, lineSize;
-    var bytes = imgData.data;
-
-    switch (kind) {
-      case ImageKind.GRAYSCALE_1BPP:
-        colorType = 0;
-        bitDepth = 1;
-        lineSize = (width + 7) >> 3;
-        break;
-      case ImageKind.RGB_24BPP:
-        colorType = 2;
-        bitDepth = 8;
-        lineSize = width * 3;
-        break;
-      case ImageKind.RGBA_32BPP:
-        colorType = 6;
-        bitDepth = 8;
-        lineSize = width * 4;
-        break;
-      default:
-        throw new Error('invalid format');
-    }
-
-    // prefix every row with predictor 0
-    var literals = new Uint8Array((1 + lineSize) * height);
-    var offsetLiterals = 0, offsetBytes = 0;
-    var y, i;
-    for (y = 0; y < height; ++y) {
-      literals[offsetLiterals++] = 0; // no prediction
-      literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize),
-                   offsetLiterals);
-      offsetBytes += lineSize;
-      offsetLiterals += lineSize;
-    }
-
-    if (kind === ImageKind.GRAYSCALE_1BPP) {
-      // inverting for B/W
-      offsetLiterals = 0;
-      for (y = 0; y < height; y++) {
-        offsetLiterals++; // skipping predictor
-        for (i = 0; i < lineSize; i++) {
-          literals[offsetLiterals++] ^= 0xFF;
-        }
-      }
-    }
-
-    var ihdr = new Uint8Array([
-      width >> 24 & 0xff,
-      width >> 16 & 0xff,
-      width >> 8 & 0xff,
-      width & 0xff,
-      height >> 24 & 0xff,
-      height >> 16 & 0xff,
-      height >> 8 & 0xff,
-      height & 0xff,
-      bitDepth, // bit depth
-      colorType, // color type
-      0x00, // compression method
-      0x00, // filter method
-      0x00 // interlace method
-    ]);
-
-    var len = literals.length;
-    var maxBlockLength = 0xFFFF;
-
-    var deflateBlocks = Math.ceil(len / maxBlockLength);
-    var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);
-    var pi = 0;
-    idat[pi++] = 0x78; // compression method and flags
-    idat[pi++] = 0x9c; // flags
-
-    var pos = 0;
-    while (len > maxBlockLength) {
-      // writing non-final DEFLATE blocks type 0 and length of 65535
-      idat[pi++] = 0x00;
-      idat[pi++] = 0xff;
-      idat[pi++] = 0xff;
-      idat[pi++] = 0x00;
-      idat[pi++] = 0x00;
-      idat.set(literals.subarray(pos, pos + maxBlockLength), pi);
-      pi += maxBlockLength;
-      pos += maxBlockLength;
-      len -= maxBlockLength;
-    }
-
-    // writing non-final DEFLATE blocks type 0
-    idat[pi++] = 0x01;
-    idat[pi++] = len & 0xff;
-    idat[pi++] = len >> 8 & 0xff;
-    idat[pi++] = (~len & 0xffff) & 0xff;
-    idat[pi++] = (~len & 0xffff) >> 8 & 0xff;
-    idat.set(literals.subarray(pos), pi);
-    pi += literals.length - pos;
-
-    var adler = adler32(literals, 0, literals.length); // checksum
-    idat[pi++] = adler >> 24 & 0xff;
-    idat[pi++] = adler >> 16 & 0xff;
-    idat[pi++] = adler >> 8 & 0xff;
-    idat[pi++] = adler & 0xff;
-
-    // PNG will consists: header, IHDR+data, IDAT+data, and IEND.
-    var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) +
-                    ihdr.length + idat.length;
-    var data = new Uint8Array(pngLength);
-    var offset = 0;
-    data.set(PNG_HEADER, offset);
-    offset += PNG_HEADER.length;
-    writePngChunk('IHDR', ihdr, data, offset);
-    offset += CHUNK_WRAPPER_SIZE + ihdr.length;
-    writePngChunk('IDATA', idat, data, offset);
-    offset += CHUNK_WRAPPER_SIZE + idat.length;
-    writePngChunk('IEND', new Uint8Array(0), data, offset);
-
-    return PDFJS.createObjectURL(data, 'image/png');
-  }
-
-  return function convertImgDataToPng(imgData) {
-    var kind = (imgData.kind === undefined ?
-                ImageKind.GRAYSCALE_1BPP : imgData.kind);
-    return encode(imgData, kind);
-  };
-})();
-
-var SVGExtraState = (function SVGExtraStateClosure() {
-  function SVGExtraState() {
-    this.fontSizeScale = 1;
-    this.fontWeight = SVG_DEFAULTS.fontWeight;
-    this.fontSize = 0;
-
-    this.textMatrix = IDENTITY_MATRIX;
-    this.fontMatrix = FONT_IDENTITY_MATRIX;
-    this.leading = 0;
-
-    // Current point (in user coordinates)
-    this.x = 0;
-    this.y = 0;
-
-    // Start of text line (in text coordinates)
-    this.lineX = 0;
-    this.lineY = 0;
-
-    // Character and word spacing
-    this.charSpacing = 0;
-    this.wordSpacing = 0;
-    this.textHScale = 1;
-    this.textRise = 0;
-
-    // Default foreground and background colors
-    this.fillColor = SVG_DEFAULTS.fillColor;
-    this.strokeColor = '#000000';
-
-    this.fillAlpha = 1;
-    this.strokeAlpha = 1;
-    this.lineWidth = 1;
-    this.lineJoin = '';
-    this.lineCap = '';
-    this.miterLimit = 0;
-
-    this.dashArray = [];
-    this.dashPhase = 0;
-
-    this.dependencies = [];
-
-    // Clipping
-    this.clipId = '';
-    this.pendingClip = false;
-
-    this.maskId = '';
-  }
-
-  SVGExtraState.prototype = {
-    clone: function SVGExtraState_clone() {
-      return Object.create(this);
-    },
-    setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {
-      this.x = x;
-      this.y = y;
-    }
-  };
-  return SVGExtraState;
-})();
-
-var SVGGraphics = (function SVGGraphicsClosure() {
-  function createScratchSVG(width, height) {
-    var NS = 'http://www.w3.org/2000/svg';
-    var svg = document.createElementNS(NS, 'svg:svg');
-    svg.setAttributeNS(null, 'version', '1.1');
-    svg.setAttributeNS(null, 'width', width + 'px');
-    svg.setAttributeNS(null, 'height', height + 'px');
-    svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);
-    return svg;
-  }
-
-  function opListToTree(opList) {
-    var opTree = [];
-    var tmp = [];
-    var opListLen = opList.length;
-
-    for (var x = 0; x < opListLen; x++) {
-      if (opList[x].fn === 'save') {
-        opTree.push({'fnId': 92, 'fn': 'group', 'items': []});
-        tmp.push(opTree);
-        opTree = opTree[opTree.length - 1].items;
-        continue;
-      }
-
-      if(opList[x].fn === 'restore') {
-        opTree = tmp.pop();
-      } else {
-        opTree.push(opList[x]);
-      }
-    }
-    return opTree;
-  }
-
-  /**
-   * Formats float number.
-   * @param value {number} number to format.
-   * @returns {string}
-   */
-  function pf(value) {
-    if (value === (value | 0)) { // integer number
-      return value.toString();
-    }
-    var s = value.toFixed(10);
-    var i = s.length - 1;
-    if (s[i] !== '0') {
-      return s;
-    }
-    // removing trailing zeros
-    do {
-      i--;
-    } while (s[i] === '0');
-    return s.substr(0, s[i] === '.' ? i : i + 1);
-  }
-
-  /**
-   * Formats transform matrix. The standard rotation, scale and translate
-   * matrices are replaced by their shorter forms, and for identity matrix
-   * returns empty string to save the memory.
-   * @param m {Array} matrix to format.
-   * @returns {string}
-   */
-  function pm(m) {
-    if (m[4] === 0 && m[5] === 0) {
-      if (m[1] === 0 && m[2] === 0) {
-        if (m[0] === 1 && m[3] === 1) {
-          return '';
-        }
-        return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';
-      }
-      if (m[0] === m[3] && m[1] === -m[2]) {
-        var a = Math.acos(m[0]) * 180 / Math.PI;
-        return 'rotate(' + pf(a) + ')';
-      }
-    } else {
-      if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {
-        return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';
-      }
-    }
-    return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' +
-      pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';
-  }
-
-  function SVGGraphics(commonObjs, objs) {
-    this.current = new SVGExtraState();
-    this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix
-    this.transformStack = [];
-    this.extraStack = [];
-    this.commonObjs = commonObjs;
-    this.objs = objs;
-    this.pendingEOFill = false;
-
-    this.embedFonts = false;
-    this.embeddedFonts = {};
-    this.cssStyle = null;
-  }
-
-  var NS = 'http://www.w3.org/2000/svg';
-  var XML_NS = 'http://www.w3.org/XML/1998/namespace';
-  var XLINK_NS = 'http://www.w3.org/1999/xlink';
-  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
-  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
-  var clipCount = 0;
-  var maskCount = 0;
-
-  SVGGraphics.prototype = {
-    save: function SVGGraphics_save() {
-      this.transformStack.push(this.transformMatrix);
-      var old = this.current;
-      this.extraStack.push(old);
-      this.current = old.clone();
-    },
-
-    restore: function SVGGraphics_restore() {
-      this.transformMatrix = this.transformStack.pop();
-      this.current = this.extraStack.pop();
-
-      this.tgrp = document.createElementNS(NS, 'svg:g');
-      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
-      this.pgrp.appendChild(this.tgrp);
-    },
-
-    group: function SVGGraphics_group(items) {
-      this.save();
-      this.executeOpTree(items);
-      this.restore();
-    },
-
-    loadDependencies: function SVGGraphics_loadDependencies(operatorList) {
-      var fnArray = operatorList.fnArray;
-      var fnArrayLen = fnArray.length;
-      var argsArray = operatorList.argsArray;
-
-      var self = this;
-      for (var i = 0; i < fnArrayLen; i++) {
-        if (OPS.dependency === fnArray[i]) {
-          var deps = argsArray[i];
-          for (var n = 0, nn = deps.length; n < nn; n++) {
-            var obj = deps[n];
-            var common = obj.substring(0, 2) === 'g_';
-            var promise;
-            if (common) {
-              promise = new Promise(function(resolve) {
-                self.commonObjs.get(obj, resolve);
-              });
-            } else {
-              promise = new Promise(function(resolve) {
-                self.objs.get(obj, resolve);
-              });
-            }
-            this.current.dependencies.push(promise);
-          }
-        }
-      }
-      return Promise.all(this.current.dependencies);
-    },
-
-    transform: function SVGGraphics_transform(a, b, c, d, e, f) {
-      var transformMatrix = [a, b, c, d, e, f];
-      this.transformMatrix = PDFJS.Util.transform(this.transformMatrix,
-                                                  transformMatrix);
-
-      this.tgrp = document.createElementNS(NS, 'svg:g');
-      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
-    },
-
-    getSVG: function SVGGraphics_getSVG(operatorList, viewport) {
-      this.svg = createScratchSVG(viewport.width, viewport.height);
-      this.viewport = viewport;
-
-      return this.loadDependencies(operatorList).then(function () {
-        this.transformMatrix = IDENTITY_MATRIX;
-        this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group
-        this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));
-        this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group
-        this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
-        this.defs = document.createElementNS(NS, 'svg:defs');
-        this.pgrp.appendChild(this.defs);
-        this.pgrp.appendChild(this.tgrp);
-        this.svg.appendChild(this.pgrp);
-        var opTree = this.convertOpList(operatorList);
-        this.executeOpTree(opTree);
-        return this.svg;
-      }.bind(this));
-    },
-
-    convertOpList: function SVGGraphics_convertOpList(operatorList) {
-      var argsArray = operatorList.argsArray;
-      var fnArray = operatorList.fnArray;
-      var fnArrayLen  = fnArray.length;
-      var REVOPS = [];
-      var opList = [];
-
-      for (var op in OPS) {
-        REVOPS[OPS[op]] = op;
-      }
-
-      for (var x = 0; x < fnArrayLen; x++) {
-        var fnId = fnArray[x];
-        opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]});
-      }
-      return opListToTree(opList);
-    },
-
-    executeOpTree: function SVGGraphics_executeOpTree(opTree) {
-      var opTreeLen = opTree.length;
-      for(var x = 0; x < opTreeLen; x++) {
-        var fn = opTree[x].fn;
-        var fnId = opTree[x].fnId;
-        var args = opTree[x].args;
-
-        switch (fnId | 0) {
-          case OPS.beginText:
-            this.beginText();
-            break;
-          case OPS.setLeading:
-            this.setLeading(args);
-            break;
-          case OPS.setLeadingMoveText:
-            this.setLeadingMoveText(args[0], args[1]);
-            break;
-          case OPS.setFont:
-            this.setFont(args);
-            break;
-          case OPS.showText:
-            this.showText(args[0]);
-            break;
-          case OPS.showSpacedText:
-            this.showText(args[0]);
-            break;
-          case OPS.endText:
-            this.endText();
-            break;
-          case OPS.moveText:
-            this.moveText(args[0], args[1]);
-            break;
-          case OPS.setCharSpacing:
-            this.setCharSpacing(args[0]);
-            break;
-          case OPS.setWordSpacing:
-            this.setWordSpacing(args[0]);
-            break;
-          case OPS.setHScale:
-            this.setHScale(args[0]);
-            break;
-          case OPS.setTextMatrix:
-            this.setTextMatrix(args[0], args[1], args[2],
-                               args[3], args[4], args[5]);
-            break;
-          case OPS.setLineWidth:
-            this.setLineWidth(args[0]);
-            break;
-          case OPS.setLineJoin:
-            this.setLineJoin(args[0]);
-            break;
-          case OPS.setLineCap:
-            this.setLineCap(args[0]);
-            break;
-          case OPS.setMiterLimit:
-            this.setMiterLimit(args[0]);
-            break;
-          case OPS.setFillRGBColor:
-            this.setFillRGBColor(args[0], args[1], args[2]);
-            break;
-          case OPS.setStrokeRGBColor:
-            this.setStrokeRGBColor(args[0], args[1], args[2]);
-            break;
-          case OPS.setDash:
-            this.setDash(args[0], args[1]);
-            break;
-          case OPS.setGState:
-            this.setGState(args[0]);
-            break;
-          case OPS.fill:
-            this.fill();
-            break;
-          case OPS.eoFill:
-            this.eoFill();
-            break;
-          case OPS.stroke:
-            this.stroke();
-            break;
-          case OPS.fillStroke:
-            this.fillStroke();
-            break;
-          case OPS.eoFillStroke:
-            this.eoFillStroke();
-            break;
-          case OPS.clip:
-            this.clip('nonzero');
-            break;
-          case OPS.eoClip:
-            this.clip('evenodd');
-            break;
-          case OPS.paintSolidColorImageMask:
-            this.paintSolidColorImageMask();
-            break;
-          case OPS.paintJpegXObject:
-            this.paintJpegXObject(args[0], args[1], args[2]);
-            break;
-          case OPS.paintImageXObject:
-            this.paintImageXObject(args[0]);
-            break;
-          case OPS.paintInlineImageXObject:
-            this.paintInlineImageXObject(args[0]);
-            break;
-          case OPS.paintImageMaskXObject:
-            this.paintImageMaskXObject(args[0]);
-            break;
-          case OPS.paintFormXObjectBegin:
-            this.paintFormXObjectBegin(args[0], args[1]);
-            break;
-          case OPS.paintFormXObjectEnd:
-            this.paintFormXObjectEnd();
-            break;
-          case OPS.closePath:
-            this.closePath();
-            break;
-          case OPS.closeStroke:
-            this.closeStroke();
-            break;
-          case OPS.closeFillStroke:
-            this.closeFillStroke();
-            break;
-          case OPS.nextLine:
-            this.nextLine();
-            break;
-          case OPS.transform:
-            this.transform(args[0], args[1], args[2], args[3],
-                           args[4], args[5]);
-            break;
-          case OPS.constructPath:
-            this.constructPath(args[0], args[1]);
-            break;
-          case OPS.endPath:
-            this.endPath();
-            break;
-          case 92:
-            this.group(opTree[x].items);
-            break;
-          default:
-            warn('Unimplemented method '+ fn);
-            break;
-        }
-      }
-    },
-
-    setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {
-      this.current.wordSpacing = wordSpacing;
-    },
-
-    setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {
-      this.current.charSpacing = charSpacing;
-    },
-
-    nextLine: function SVGGraphics_nextLine() {
-      this.moveText(0, this.current.leading);
-    },
-
-    setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {
-      var current = this.current;
-      this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];
-
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-
-      current.xcoords = [];
-      current.tspan = document.createElementNS(NS, 'svg:tspan');
-      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
-      current.tspan.setAttributeNS(null, 'font-size',
-                                   pf(current.fontSize) + 'px');
-      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
-
-      current.txtElement = document.createElementNS(NS, 'svg:text');
-      current.txtElement.appendChild(current.tspan);
-    },
-
-    beginText: function SVGGraphics_beginText() {
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-      this.current.textMatrix = IDENTITY_MATRIX;
-      this.current.lineMatrix = IDENTITY_MATRIX;
-      this.current.tspan = document.createElementNS(NS, 'svg:tspan');
-      this.current.txtElement = document.createElementNS(NS, 'svg:text');
-      this.current.txtgrp = document.createElementNS(NS, 'svg:g');
-      this.current.xcoords = [];
-    },
-
-    moveText: function SVGGraphics_moveText(x, y) {
-      var current = this.current;
-      this.current.x = this.current.lineX += x;
-      this.current.y = this.current.lineY += y;
-
-      current.xcoords = [];
-      current.tspan = document.createElementNS(NS, 'svg:tspan');
-      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
-      current.tspan.setAttributeNS(null, 'font-size',
-                                   pf(current.fontSize) + 'px');
-      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
-    },
-
-    showText: function SVGGraphics_showText(glyphs) {
-      var current = this.current;
-      var font = current.font;
-      var fontSize = current.fontSize;
-
-      if (fontSize === 0) {
-        return;
-      }
-
-      var charSpacing = current.charSpacing;
-      var wordSpacing = current.wordSpacing;
-      var fontDirection = current.fontDirection;
-      var textHScale = current.textHScale * fontDirection;
-      var glyphsLength = glyphs.length;
-      var vertical = font.vertical;
-      var widthAdvanceScale = fontSize * current.fontMatrix[0];
-
-      var x = 0, i;
-      for (i = 0; i < glyphsLength; ++i) {
-        var glyph = glyphs[i];
-        if (glyph === null) {
-          // word break
-          x += fontDirection * wordSpacing;
-          continue;
-        } else if (isNum(glyph)) {
-          x += -glyph * fontSize * 0.001;
-          continue;
-        }
-        current.xcoords.push(current.x + x * textHScale);
-
-        var width = glyph.width;
-        var character = glyph.fontChar;
-        var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;
-        x += charWidth;
-
-        current.tspan.textContent += character;
-      }
-      if (vertical) {
-        current.y -= x * textHScale;
-      } else {
-        current.x += x * textHScale;
-      }
-
-      current.tspan.setAttributeNS(null, 'x',
-                                   current.xcoords.map(pf).join(' '));
-      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
-      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
-      current.tspan.setAttributeNS(null, 'font-size',
-                                   pf(current.fontSize) + 'px');
-      if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {
-        current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);
-      }
-      if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {
-        current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);
-      }
-      if (current.fillColor !== SVG_DEFAULTS.fillColor) {
-        current.tspan.setAttributeNS(null, 'fill', current.fillColor);
-      }
-
-      current.txtElement.setAttributeNS(null, 'transform',
-                                        pm(current.textMatrix) +
-                                        ' scale(1, -1)' );
-      current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');
-      current.txtElement.appendChild(current.tspan);
-      current.txtgrp.appendChild(current.txtElement);
-
-      this.tgrp.appendChild(current.txtElement);
-
-    },
-
-    setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {
-      this.setLeading(-y);
-      this.moveText(x, y);
-    },
-
-    addFontStyle: function SVGGraphics_addFontStyle(fontObj) {
-      if (!this.cssStyle) {
-        this.cssStyle = document.createElementNS(NS, 'svg:style');
-        this.cssStyle.setAttributeNS(null, 'type', 'text/css');
-        this.defs.appendChild(this.cssStyle);
-      }
-
-      var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype);
-      this.cssStyle.textContent +=
-        '@font-face { font-family: "' + fontObj.loadedName + '";' +
-        ' src: url(' + url + '); }\n';
-    },
-
-    setFont: function SVGGraphics_setFont(details) {
-      var current = this.current;
-      var fontObj = this.commonObjs.get(details[0]);
-      var size = details[1];
-      this.current.font = fontObj;
-
-      if (this.embedFonts && fontObj.data &&
-          !this.embeddedFonts[fontObj.loadedName]) {
-        this.addFontStyle(fontObj);
-        this.embeddedFonts[fontObj.loadedName] = fontObj;
-      }
-
-      current.fontMatrix = (fontObj.fontMatrix ?
-                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
-
-      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
-                                 (fontObj.bold ? 'bold' : 'normal');
-      var italic = fontObj.italic ? 'italic' : 'normal';
-
-      if (size < 0) {
-        size = -size;
-        current.fontDirection = -1;
-      } else {
-        current.fontDirection = 1;
-      }
-      current.fontSize = size;
-      current.fontFamily = fontObj.loadedName;
-      current.fontWeight = bold;
-      current.fontStyle = italic;
-
-      current.tspan = document.createElementNS(NS, 'svg:tspan');
-      current.tspan.setAttributeNS(null, 'y', pf(-current.y));
-      current.xcoords = [];
-    },
-
-    endText: function SVGGraphics_endText() {
-      if (this.current.pendingClip) {
-        this.cgrp.appendChild(this.tgrp);
-        this.pgrp.appendChild(this.cgrp);
-      } else {
-        this.pgrp.appendChild(this.tgrp);
-      }
-      this.tgrp = document.createElementNS(NS, 'svg:g');
-      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
-    },
-
-    // Path properties
-    setLineWidth: function SVGGraphics_setLineWidth(width) {
-      this.current.lineWidth = width;
-    },
-    setLineCap: function SVGGraphics_setLineCap(style) {
-      this.current.lineCap = LINE_CAP_STYLES[style];
-    },
-    setLineJoin: function SVGGraphics_setLineJoin(style) {
-      this.current.lineJoin = LINE_JOIN_STYLES[style];
-    },
-    setMiterLimit: function SVGGraphics_setMiterLimit(limit) {
-      this.current.miterLimit = limit;
-    },
-    setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {
-      var color = Util.makeCssRgb(r, g, b);
-      this.current.strokeColor = color;
-    },
-    setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {
-      var color = Util.makeCssRgb(r, g, b);
-      this.current.fillColor = color;
-      this.current.tspan = document.createElementNS(NS, 'svg:tspan');
-      this.current.xcoords = [];
-    },
-    setDash: function SVGGraphics_setDash(dashArray, dashPhase) {
-      this.current.dashArray = dashArray;
-      this.current.dashPhase = dashPhase;
-    },
-
-    constructPath: function SVGGraphics_constructPath(ops, args) {
-      var current = this.current;
-      var x = current.x, y = current.y;
-      current.path = document.createElementNS(NS, 'svg:path');
-      var d = [];
-      var opLength = ops.length;
-
-      for (var i = 0, j = 0; i < opLength; i++) {
-        switch (ops[i] | 0) {
-          case OPS.rectangle:
-            x = args[j++];
-            y = args[j++];
-            var width = args[j++];
-            var height = args[j++];
-            var xw = x + width;
-            var yh = y + height;
-            d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh),
-                   'L', pf(x), pf(yh), 'Z');
-            break;
-          case OPS.moveTo:
-            x = args[j++];
-            y = args[j++];
-            d.push('M', pf(x), pf(y));
-            break;
-          case OPS.lineTo:
-            x = args[j++];
-            y = args[j++];
-            d.push('L', pf(x) , pf(y));
-            break;
-          case OPS.curveTo:
-            x = args[j + 4];
-            y = args[j + 5];
-            d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]),
-                   pf(args[j + 3]), pf(x), pf(y));
-            j += 6;
-            break;
-          case OPS.curveTo2:
-            x = args[j + 2];
-            y = args[j + 3];
-            d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]),
-                   pf(args[j + 2]), pf(args[j + 3]));
-            j += 4;
-            break;
-          case OPS.curveTo3:
-            x = args[j + 2];
-            y = args[j + 3];
-            d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y),
-                   pf(x), pf(y));
-            j += 4;
-            break;
-          case OPS.closePath:
-            d.push('Z');
-            break;
-        }
-      }
-      current.path.setAttributeNS(null, 'd', d.join(' '));
-      current.path.setAttributeNS(null, 'stroke-miterlimit',
-                                  pf(current.miterLimit));
-      current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap);
-      current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);
-      current.path.setAttributeNS(null, 'stroke-width',
-                                  pf(current.lineWidth) + 'px');
-      current.path.setAttributeNS(null, 'stroke-dasharray',
-                                  current.dashArray.map(pf).join(' '));
-      current.path.setAttributeNS(null, 'stroke-dashoffset',
-                                  pf(current.dashPhase) + 'px');
-      current.path.setAttributeNS(null, 'fill', 'none');
-
-      this.tgrp.appendChild(current.path);
-      if (current.pendingClip) {
-        this.cgrp.appendChild(this.tgrp);
-        this.pgrp.appendChild(this.cgrp);
-      } else {
-        this.pgrp.appendChild(this.tgrp);
-      }
-      // Saving a reference in current.element so that it can be addressed
-      // in 'fill' and 'stroke'
-      current.element = current.path;
-      current.setCurrentPoint(x, y);
-    },
-
-    endPath: function SVGGraphics_endPath() {
-      var current = this.current;
-      if (current.pendingClip) {
-        this.cgrp.appendChild(this.tgrp);
-        this.pgrp.appendChild(this.cgrp);
-      } else {
-        this.pgrp.appendChild(this.tgrp);
-      }
-      this.tgrp = document.createElementNS(NS, 'svg:g');
-      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
-    },
-
-    clip: function SVGGraphics_clip(type) {
-      var current = this.current;
-      // Add current path to clipping path
-      current.clipId = 'clippath' + clipCount;
-      clipCount++;
-      this.clippath = document.createElementNS(NS, 'svg:clipPath');
-      this.clippath.setAttributeNS(null, 'id', current.clipId);
-      var clipElement = current.element.cloneNode();
-      if (type === 'evenodd') {
-        clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');
-      } else {
-        clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');
-      }
-      this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix));
-      this.clippath.appendChild(clipElement);
-      this.defs.appendChild(this.clippath);
-
-      // Create a new group with that attribute
-      current.pendingClip = true;
-      this.cgrp = document.createElementNS(NS, 'svg:g');
-      this.cgrp.setAttributeNS(null, 'clip-path',
-                               'url(#' + current.clipId + ')');
-      this.pgrp.appendChild(this.cgrp);
-    },
-
-    closePath: function SVGGraphics_closePath() {
-      var current = this.current;
-      var d = current.path.getAttributeNS(null, 'd');
-      d += 'Z';
-      current.path.setAttributeNS(null, 'd', d);
-    },
-
-    setLeading: function SVGGraphics_setLeading(leading) {
-      this.current.leading = -leading;
-    },
-
-    setTextRise: function SVGGraphics_setTextRise(textRise) {
-      this.current.textRise = textRise;
-    },
-
-    setHScale: function SVGGraphics_setHScale(scale) {
-      this.current.textHScale = scale / 100;
-    },
-
-    setGState: function SVGGraphics_setGState(states) {
-      for (var i = 0, ii = states.length; i < ii; i++) {
-        var state = states[i];
-        var key = state[0];
-        var value = state[1];
-
-        switch (key) {
-          case 'LW':
-            this.setLineWidth(value);
-            break;
-          case 'LC':
-            this.setLineCap(value);
-            break;
-          case 'LJ':
-            this.setLineJoin(value);
-            break;
-          case 'ML':
-            this.setMiterLimit(value);
-            break;
-          case 'D':
-            this.setDash(value[0], value[1]);
-            break;
-          case 'RI':
-            break;
-          case 'FL':
-            break;
-          case 'Font':
-            this.setFont(value);
-            break;
-          case 'CA':
-            break;
-          case 'ca':
-            break;
-          case 'BM':
-            break;
-          case 'SMask':
-            break;
-        }
-      }
-    },
-
-    fill: function SVGGraphics_fill() {
-      var current = this.current;
-      current.element.setAttributeNS(null, 'fill', current.fillColor);
-    },
-
-    stroke: function SVGGraphics_stroke() {
-      var current = this.current;
-      current.element.setAttributeNS(null, 'stroke', current.strokeColor);
-      current.element.setAttributeNS(null, 'fill', 'none');
-    },
-
-    eoFill: function SVGGraphics_eoFill() {
-      var current = this.current;
-      current.element.setAttributeNS(null, 'fill', current.fillColor);
-      current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
-    },
-
-    fillStroke: function SVGGraphics_fillStroke() {
-      // Order is important since stroke wants fill to be none.
-      // First stroke, then if fill needed, it will be overwritten.
-      this.stroke();
-      this.fill();
-    },
-
-    eoFillStroke: function SVGGraphics_eoFillStroke() {
-      this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
-      this.fillStroke();
-    },
-
-    closeStroke: function SVGGraphics_closeStroke() {
-      this.closePath();
-      this.stroke();
-    },
-
-    closeFillStroke: function SVGGraphics_closeFillStroke() {
-      this.closePath();
-      this.fillStroke();
-    },
-
-    paintSolidColorImageMask:
-        function SVGGraphics_paintSolidColorImageMask() {
-      var current = this.current;
-      var rect = document.createElementNS(NS, 'svg:rect');
-      rect.setAttributeNS(null, 'x', '0');
-      rect.setAttributeNS(null, 'y', '0');
-      rect.setAttributeNS(null, 'width', '1px');
-      rect.setAttributeNS(null, 'height', '1px');
-      rect.setAttributeNS(null, 'fill', current.fillColor);
-      this.tgrp.appendChild(rect);
-    },
-
-    paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {
-      var current = this.current;
-      var imgObj = this.objs.get(objId);
-      var imgEl = document.createElementNS(NS, 'svg:image');
-      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);
-      imgEl.setAttributeNS(null, 'width', imgObj.width + 'px');
-      imgEl.setAttributeNS(null, 'height', imgObj.height + 'px');
-      imgEl.setAttributeNS(null, 'x', '0');
-      imgEl.setAttributeNS(null, 'y', pf(-h));
-      imgEl.setAttributeNS(null, 'transform',
-                           'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');
-
-      this.tgrp.appendChild(imgEl);
-      if (current.pendingClip) {
-        this.cgrp.appendChild(this.tgrp);
-        this.pgrp.appendChild(this.cgrp);
-      } else {
-        this.pgrp.appendChild(this.tgrp);
-      }
-    },
-
-    paintImageXObject: function SVGGraphics_paintImageXObject(objId) {
-      var imgData = this.objs.get(objId);
-      if (!imgData) {
-        warn('Dependent image isn\'t ready yet');
-        return;
-      }
-      this.paintInlineImageXObject(imgData);
-    },
-
-    paintInlineImageXObject:
-        function SVGGraphics_paintInlineImageXObject(imgData, mask) {
-      var current = this.current;
-      var width = imgData.width;
-      var height = imgData.height;
-
-      var imgSrc = convertImgDataToPng(imgData);
-      var cliprect = document.createElementNS(NS, 'svg:rect');
-      cliprect.setAttributeNS(null, 'x', '0');
-      cliprect.setAttributeNS(null, 'y', '0');
-      cliprect.setAttributeNS(null, 'width', pf(width));
-      cliprect.setAttributeNS(null, 'height', pf(height));
-      current.element = cliprect;
-      this.clip('nonzero');
-      var imgEl = document.createElementNS(NS, 'svg:image');
-      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);
-      imgEl.setAttributeNS(null, 'x', '0');
-      imgEl.setAttributeNS(null, 'y', pf(-height));
-      imgEl.setAttributeNS(null, 'width', pf(width) + 'px');
-      imgEl.setAttributeNS(null, 'height', pf(height) + 'px');
-      imgEl.setAttributeNS(null, 'transform',
-                           'scale(' + pf(1 / width) + ' ' +
-                           pf(-1 / height) + ')');
-      if (mask) {
-        mask.appendChild(imgEl);
-      } else {
-        this.tgrp.appendChild(imgEl);
-      }
-      if (current.pendingClip) {
-        this.cgrp.appendChild(this.tgrp);
-        this.pgrp.appendChild(this.cgrp);
-      } else {
-        this.pgrp.appendChild(this.tgrp);
-      }
-    },
-
-    paintImageMaskXObject:
-        function SVGGraphics_paintImageMaskXObject(imgData) {
-      var current = this.current;
-      var width = imgData.width;
-      var height = imgData.height;
-      var fillColor = current.fillColor;
-
-      current.maskId = 'mask' + maskCount++;
-      var mask = document.createElementNS(NS, 'svg:mask');
-      mask.setAttributeNS(null, 'id', current.maskId);
-
-      var rect = document.createElementNS(NS, 'svg:rect');
-      rect.setAttributeNS(null, 'x', '0');
-      rect.setAttributeNS(null, 'y', '0');
-      rect.setAttributeNS(null, 'width', pf(width));
-      rect.setAttributeNS(null, 'height', pf(height));
-      rect.setAttributeNS(null, 'fill', fillColor);
-      rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')');
-      this.defs.appendChild(mask);
-      this.tgrp.appendChild(rect);
-
-      this.paintInlineImageXObject(imgData, mask);
-    },
-
-    paintFormXObjectBegin:
-        function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {
-      this.save();
-
-      if (isArray(matrix) && matrix.length === 6) {
-        this.transform(matrix[0], matrix[1], matrix[2],
-                       matrix[3], matrix[4], matrix[5]);
-      }
-
-      if (isArray(bbox) && bbox.length === 4) {
-        var width = bbox[2] - bbox[0];
-        var height = bbox[3] - bbox[1];
-
-        var cliprect = document.createElementNS(NS, 'svg:rect');
-        cliprect.setAttributeNS(null, 'x', bbox[0]);
-        cliprect.setAttributeNS(null, 'y', bbox[1]);
-        cliprect.setAttributeNS(null, 'width', pf(width));
-        cliprect.setAttributeNS(null, 'height', pf(height));
-        this.current.element = cliprect;
-        this.clip('nonzero');
-        this.endPath();
-      }
-    },
-
-    paintFormXObjectEnd:
-        function SVGGraphics_paintFormXObjectEnd() {
-      this.restore();
-    }
-  };
-  return SVGGraphics;
-})();
-
-PDFJS.SVGGraphics = SVGGraphics;
-//#endif
-
-
-}).call((typeof window === 'undefined') ? this : window);
-
-if (!PDFJS.workerSrc && typeof document !== 'undefined') {
-  // workerSrc is not set -- using last script url to define default location
-  PDFJS.workerSrc = (function () {
-    'use strict';
-    var scriptTagContainer = document.body ||
-                             document.getElementsByTagName('head')[0];
-    var pdfjsSrc = scriptTagContainer.lastChild.src;
-    return pdfjsSrc && pdfjsSrc.replace(/\.js$/i, '.worker.js');
-  })();
-}
-
diff --git a/public/pfd/build/pdf.worker.js b/public/pfd/build/pdf.worker.js
deleted file mode 100644
index f78258c..0000000
--- a/public/pfd/build/pdf.worker.js
+++ /dev/null
@@ -1,39422 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*jshint globalstrict: false */
-/* globals PDFJS */
-
-// Initializing PDFJS global object (if still undefined)
-if (typeof PDFJS === 'undefined') {
-  (typeof window !== 'undefined' ? window : this).PDFJS = {};
-}
-
-PDFJS.version = '1.1.159';
-PDFJS.build = '82536f8';
-
-(function pdfjsWrapper() {
-  // Use strict in our context only - users might not want it
-  'use strict';
-
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL,
-           Promise */
-
-'use strict';
-
-var globalScope = (typeof window === 'undefined') ? this : window;
-
-var isWorker = (typeof window === 'undefined');
-
-var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
-
-var TextRenderingMode = {
-  FILL: 0,
-  STROKE: 1,
-  FILL_STROKE: 2,
-  INVISIBLE: 3,
-  FILL_ADD_TO_PATH: 4,
-  STROKE_ADD_TO_PATH: 5,
-  FILL_STROKE_ADD_TO_PATH: 6,
-  ADD_TO_PATH: 7,
-  FILL_STROKE_MASK: 3,
-  ADD_TO_PATH_FLAG: 4
-};
-
-var ImageKind = {
-  GRAYSCALE_1BPP: 1,
-  RGB_24BPP: 2,
-  RGBA_32BPP: 3
-};
-
-var AnnotationType = {
-  WIDGET: 1,
-  TEXT: 2,
-  LINK: 3
-};
-
-var StreamType = {
-  UNKNOWN: 0,
-  FLATE: 1,
-  LZW: 2,
-  DCT: 3,
-  JPX: 4,
-  JBIG: 5,
-  A85: 6,
-  AHX: 7,
-  CCF: 8,
-  RL: 9
-};
-
-var FontType = {
-  UNKNOWN: 0,
-  TYPE1: 1,
-  TYPE1C: 2,
-  CIDFONTTYPE0: 3,
-  CIDFONTTYPE0C: 4,
-  TRUETYPE: 5,
-  CIDFONTTYPE2: 6,
-  TYPE3: 7,
-  OPENTYPE: 8,
-  TYPE0: 9,
-  MMTYPE1: 10
-};
-
-// The global PDFJS object exposes the API
-// In production, it will be declared outside a global wrapper
-// In development, it will be declared here
-if (!globalScope.PDFJS) {
-  globalScope.PDFJS = {};
-}
-
-globalScope.PDFJS.pdfBug = false;
-
-PDFJS.VERBOSITY_LEVELS = {
-  errors: 0,
-  warnings: 1,
-  infos: 5
-};
-
-// All the possible operations for an operator list.
-var OPS = PDFJS.OPS = {
-  // Intentionally start from 1 so it is easy to spot bad operators that will be
-  // 0's.
-  dependency: 1,
-  setLineWidth: 2,
-  setLineCap: 3,
-  setLineJoin: 4,
-  setMiterLimit: 5,
-  setDash: 6,
-  setRenderingIntent: 7,
-  setFlatness: 8,
-  setGState: 9,
-  save: 10,
-  restore: 11,
-  transform: 12,
-  moveTo: 13,
-  lineTo: 14,
-  curveTo: 15,
-  curveTo2: 16,
-  curveTo3: 17,
-  closePath: 18,
-  rectangle: 19,
-  stroke: 20,
-  closeStroke: 21,
-  fill: 22,
-  eoFill: 23,
-  fillStroke: 24,
-  eoFillStroke: 25,
-  closeFillStroke: 26,
-  closeEOFillStroke: 27,
-  endPath: 28,
-  clip: 29,
-  eoClip: 30,
-  beginText: 31,
-  endText: 32,
-  setCharSpacing: 33,
-  setWordSpacing: 34,
-  setHScale: 35,
-  setLeading: 36,
-  setFont: 37,
-  setTextRenderingMode: 38,
-  setTextRise: 39,
-  moveText: 40,
-  setLeadingMoveText: 41,
-  setTextMatrix: 42,
-  nextLine: 43,
-  showText: 44,
-  showSpacedText: 45,
-  nextLineShowText: 46,
-  nextLineSetSpacingShowText: 47,
-  setCharWidth: 48,
-  setCharWidthAndBounds: 49,
-  setStrokeColorSpace: 50,
-  setFillColorSpace: 51,
-  setStrokeColor: 52,
-  setStrokeColorN: 53,
-  setFillColor: 54,
-  setFillColorN: 55,
-  setStrokeGray: 56,
-  setFillGray: 57,
-  setStrokeRGBColor: 58,
-  setFillRGBColor: 59,
-  setStrokeCMYKColor: 60,
-  setFillCMYKColor: 61,
-  shadingFill: 62,
-  beginInlineImage: 63,
-  beginImageData: 64,
-  endInlineImage: 65,
-  paintXObject: 66,
-  markPoint: 67,
-  markPointProps: 68,
-  beginMarkedContent: 69,
-  beginMarkedContentProps: 70,
-  endMarkedContent: 71,
-  beginCompat: 72,
-  endCompat: 73,
-  paintFormXObjectBegin: 74,
-  paintFormXObjectEnd: 75,
-  beginGroup: 76,
-  endGroup: 77,
-  beginAnnotations: 78,
-  endAnnotations: 79,
-  beginAnnotation: 80,
-  endAnnotation: 81,
-  paintJpegXObject: 82,
-  paintImageMaskXObject: 83,
-  paintImageMaskXObjectGroup: 84,
-  paintImageXObject: 85,
-  paintInlineImageXObject: 86,
-  paintInlineImageXObjectGroup: 87,
-  paintImageXObjectRepeat: 88,
-  paintImageMaskXObjectRepeat: 89,
-  paintSolidColorImageMask: 90,
-  constructPath: 91
-};
-
-// A notice for devs. These are good for things that are helpful to devs, such
-// as warning that Workers were disabled, which is important to devs but not
-// end users.
-function info(msg) {
-  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {
-    console.log('Info: ' + msg);
-  }
-}
-
-// Non-fatal warnings.
-function warn(msg) {
-  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {
-    console.log('Warning: ' + msg);
-  }
-}
-
-// Fatal errors that should trigger the fallback UI and halt execution by
-// throwing an exception.
-function error(msg) {
-  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) {
-    console.log('Error: ' + msg);
-    console.log(backtrace());
-  }
-  UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);
-  throw new Error(msg);
-}
-
-function backtrace() {
-  try {
-    throw new Error();
-  } catch (e) {
-    return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
-  }
-}
-
-function assert(cond, msg) {
-  if (!cond) {
-    error(msg);
-  }
-}
-
-var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {
-  unknown: 'unknown',
-  forms: 'forms',
-  javaScript: 'javaScript',
-  smask: 'smask',
-  shadingPattern: 'shadingPattern',
-  font: 'font'
-};
-
-var UnsupportedManager = PDFJS.UnsupportedManager =
-  (function UnsupportedManagerClosure() {
-  var listeners = [];
-  return {
-    listen: function (cb) {
-      listeners.push(cb);
-    },
-    notify: function (featureId) {
-      warn('Unsupported feature "' + featureId + '"');
-      for (var i = 0, ii = listeners.length; i < ii; i++) {
-        listeners[i](featureId);
-      }
-    }
-  };
-})();
-
-// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
-// absolute URL, it will be returned as is.
-function combineUrl(baseUrl, url) {
-  if (!url) {
-    return baseUrl;
-  }
-  if (/^[a-z][a-z0-9+\-.]*:/i.test(url)) {
-    return url;
-  }
-  var i;
-  if (url.charAt(0) === '/') {
-    // absolute path
-    i = baseUrl.indexOf('://');
-    if (url.charAt(1) === '/') {
-      ++i;
-    } else {
-      i = baseUrl.indexOf('/', i + 3);
-    }
-    return baseUrl.substring(0, i) + url;
-  } else {
-    // relative path
-    var pathLength = baseUrl.length;
-    i = baseUrl.lastIndexOf('#');
-    pathLength = i >= 0 ? i : pathLength;
-    i = baseUrl.lastIndexOf('?', pathLength);
-    pathLength = i >= 0 ? i : pathLength;
-    var prefixLength = baseUrl.lastIndexOf('/', pathLength);
-    return baseUrl.substring(0, prefixLength + 1) + url;
-  }
-}
-
-// Validates if URL is safe and allowed, e.g. to avoid XSS.
-function isValidUrl(url, allowRelative) {
-  if (!url) {
-    return false;
-  }
-  // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)
-  // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
-  var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);
-  if (!protocol) {
-    return allowRelative;
-  }
-  protocol = protocol[0].toLowerCase();
-  switch (protocol) {
-    case 'http':
-    case 'https':
-    case 'ftp':
-    case 'mailto':
-    case 'tel':
-      return true;
-    default:
-      return false;
-  }
-}
-PDFJS.isValidUrl = isValidUrl;
-
-function shadow(obj, prop, value) {
-  Object.defineProperty(obj, prop, { value: value,
-                                     enumerable: true,
-                                     configurable: true,
-                                     writable: false });
-  return value;
-}
-PDFJS.shadow = shadow;
-
-var PasswordResponses = PDFJS.PasswordResponses = {
-  NEED_PASSWORD: 1,
-  INCORRECT_PASSWORD: 2
-};
-
-var PasswordException = (function PasswordExceptionClosure() {
-  function PasswordException(msg, code) {
-    this.name = 'PasswordException';
-    this.message = msg;
-    this.code = code;
-  }
-
-  PasswordException.prototype = new Error();
-  PasswordException.constructor = PasswordException;
-
-  return PasswordException;
-})();
-PDFJS.PasswordException = PasswordException;
-
-var UnknownErrorException = (function UnknownErrorExceptionClosure() {
-  function UnknownErrorException(msg, details) {
-    this.name = 'UnknownErrorException';
-    this.message = msg;
-    this.details = details;
-  }
-
-  UnknownErrorException.prototype = new Error();
-  UnknownErrorException.constructor = UnknownErrorException;
-
-  return UnknownErrorException;
-})();
-PDFJS.UnknownErrorException = UnknownErrorException;
-
-var InvalidPDFException = (function InvalidPDFExceptionClosure() {
-  function InvalidPDFException(msg) {
-    this.name = 'InvalidPDFException';
-    this.message = msg;
-  }
-
-  InvalidPDFException.prototype = new Error();
-  InvalidPDFException.constructor = InvalidPDFException;
-
-  return InvalidPDFException;
-})();
-PDFJS.InvalidPDFException = InvalidPDFException;
-
-var MissingPDFException = (function MissingPDFExceptionClosure() {
-  function MissingPDFException(msg) {
-    this.name = 'MissingPDFException';
-    this.message = msg;
-  }
-
-  MissingPDFException.prototype = new Error();
-  MissingPDFException.constructor = MissingPDFException;
-
-  return MissingPDFException;
-})();
-PDFJS.MissingPDFException = MissingPDFException;
-
-var UnexpectedResponseException =
-    (function UnexpectedResponseExceptionClosure() {
-  function UnexpectedResponseException(msg, status) {
-    this.name = 'UnexpectedResponseException';
-    this.message = msg;
-    this.status = status;
-  }
-
-  UnexpectedResponseException.prototype = new Error();
-  UnexpectedResponseException.constructor = UnexpectedResponseException;
-
-  return UnexpectedResponseException;
-})();
-PDFJS.UnexpectedResponseException = UnexpectedResponseException;
-
-var NotImplementedException = (function NotImplementedExceptionClosure() {
-  function NotImplementedException(msg) {
-    this.message = msg;
-  }
-
-  NotImplementedException.prototype = new Error();
-  NotImplementedException.prototype.name = 'NotImplementedException';
-  NotImplementedException.constructor = NotImplementedException;
-
-  return NotImplementedException;
-})();
-
-var MissingDataException = (function MissingDataExceptionClosure() {
-  function MissingDataException(begin, end) {
-    this.begin = begin;
-    this.end = end;
-    this.message = 'Missing data [' + begin + ', ' + end + ')';
-  }
-
-  MissingDataException.prototype = new Error();
-  MissingDataException.prototype.name = 'MissingDataException';
-  MissingDataException.constructor = MissingDataException;
-
-  return MissingDataException;
-})();
-
-var XRefParseException = (function XRefParseExceptionClosure() {
-  function XRefParseException(msg) {
-    this.message = msg;
-  }
-
-  XRefParseException.prototype = new Error();
-  XRefParseException.prototype.name = 'XRefParseException';
-  XRefParseException.constructor = XRefParseException;
-
-  return XRefParseException;
-})();
-
-
-function bytesToString(bytes) {
-  assert(bytes !== null && typeof bytes === 'object' &&
-         bytes.length !== undefined, 'Invalid argument for bytesToString');
-  var length = bytes.length;
-  var MAX_ARGUMENT_COUNT = 8192;
-  if (length < MAX_ARGUMENT_COUNT) {
-    return String.fromCharCode.apply(null, bytes);
-  }
-  var strBuf = [];
-  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
-    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
-    var chunk = bytes.subarray(i, chunkEnd);
-    strBuf.push(String.fromCharCode.apply(null, chunk));
-  }
-  return strBuf.join('');
-}
-
-function stringToBytes(str) {
-  assert(typeof str === 'string', 'Invalid argument for stringToBytes');
-  var length = str.length;
-  var bytes = new Uint8Array(length);
-  for (var i = 0; i < length; ++i) {
-    bytes[i] = str.charCodeAt(i) & 0xFF;
-  }
-  return bytes;
-}
-
-function string32(value) {
-  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
-                             (value >> 8) & 0xff, value & 0xff);
-}
-
-function log2(x) {
-  var n = 1, i = 0;
-  while (x > n) {
-    n <<= 1;
-    i++;
-  }
-  return i;
-}
-
-function readInt8(data, start) {
-  return (data[start] << 24) >> 24;
-}
-
-function readUint16(data, offset) {
-  return (data[offset] << 8) | data[offset + 1];
-}
-
-function readUint32(data, offset) {
-  return ((data[offset] << 24) | (data[offset + 1] << 16) |
-         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;
-}
-
-// Lazy test the endianness of the platform
-// NOTE: This will be 'true' for simulated TypedArrays
-function isLittleEndian() {
-  var buffer8 = new Uint8Array(2);
-  buffer8[0] = 1;
-  var buffer16 = new Uint16Array(buffer8.buffer);
-  return (buffer16[0] === 1);
-}
-
-Object.defineProperty(PDFJS, 'isLittleEndian', {
-  configurable: true,
-  get: function PDFJS_isLittleEndian() {
-    return shadow(PDFJS, 'isLittleEndian', isLittleEndian());
-  }
-});
-
-//#if !(FIREFOX || MOZCENTRAL || B2G || CHROME)
-//// Lazy test if the userAgant support CanvasTypedArrays
-function hasCanvasTypedArrays() {
-  var canvas = document.createElement('canvas');
-  canvas.width = canvas.height = 1;
-  var ctx = canvas.getContext('2d');
-  var imageData = ctx.createImageData(1, 1);
-  return (typeof imageData.data.buffer !== 'undefined');
-}
-
-Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', {
-  configurable: true,
-  get: function PDFJS_hasCanvasTypedArrays() {
-    return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());
-  }
-});
-
-var Uint32ArrayView = (function Uint32ArrayViewClosure() {
-
-  function Uint32ArrayView(buffer, length) {
-    this.buffer = buffer;
-    this.byteLength = buffer.length;
-    this.length = length === undefined ? (this.byteLength >> 2) : length;
-    ensureUint32ArrayViewProps(this.length);
-  }
-  Uint32ArrayView.prototype = Object.create(null);
-
-  var uint32ArrayViewSetters = 0;
-  function createUint32ArrayProp(index) {
-    return {
-      get: function () {
-        var buffer = this.buffer, offset = index << 2;
-        return (buffer[offset] | (buffer[offset + 1] << 8) |
-          (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;
-      },
-      set: function (value) {
-        var buffer = this.buffer, offset = index << 2;
-        buffer[offset] = value & 255;
-        buffer[offset + 1] = (value >> 8) & 255;
-        buffer[offset + 2] = (value >> 16) & 255;
-        buffer[offset + 3] = (value >>> 24) & 255;
-      }
-    };
-  }
-
-  function ensureUint32ArrayViewProps(length) {
-    while (uint32ArrayViewSetters < length) {
-      Object.defineProperty(Uint32ArrayView.prototype,
-        uint32ArrayViewSetters,
-        createUint32ArrayProp(uint32ArrayViewSetters));
-      uint32ArrayViewSetters++;
-    }
-  }
-
-  return Uint32ArrayView;
-})();
-//#else
-//PDFJS.hasCanvasTypedArrays = true;
-//#endif
-
-var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
-
-var Util = PDFJS.Util = (function UtilClosure() {
-  function Util() {}
-
-  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];
-
-  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids
-  // creating many intermediate strings.
-  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
-    rgbBuf[1] = r;
-    rgbBuf[3] = g;
-    rgbBuf[5] = b;
-    return rgbBuf.join('');
-  };
-
-  // Concatenates two transformation matrices together and returns the result.
-  Util.transform = function Util_transform(m1, m2) {
-    return [
-      m1[0] * m2[0] + m1[2] * m2[1],
-      m1[1] * m2[0] + m1[3] * m2[1],
-      m1[0] * m2[2] + m1[2] * m2[3],
-      m1[1] * m2[2] + m1[3] * m2[3],
-      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],
-      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]
-    ];
-  };
-
-  // For 2d affine transforms
-  Util.applyTransform = function Util_applyTransform(p, m) {
-    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
-    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
-    return [xt, yt];
-  };
-
-  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
-    var d = m[0] * m[3] - m[1] * m[2];
-    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
-    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
-    return [xt, yt];
-  };
-
-  // Applies the transform to the rectangle and finds the minimum axially
-  // aligned bounding box.
-  Util.getAxialAlignedBoundingBox =
-    function Util_getAxialAlignedBoundingBox(r, m) {
-
-    var p1 = Util.applyTransform(r, m);
-    var p2 = Util.applyTransform(r.slice(2, 4), m);
-    var p3 = Util.applyTransform([r[0], r[3]], m);
-    var p4 = Util.applyTransform([r[2], r[1]], m);
-    return [
-      Math.min(p1[0], p2[0], p3[0], p4[0]),
-      Math.min(p1[1], p2[1], p3[1], p4[1]),
-      Math.max(p1[0], p2[0], p3[0], p4[0]),
-      Math.max(p1[1], p2[1], p3[1], p4[1])
-    ];
-  };
-
-  Util.inverseTransform = function Util_inverseTransform(m) {
-    var d = m[0] * m[3] - m[1] * m[2];
-    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
-      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
-  };
-
-  // Apply a generic 3d matrix M on a 3-vector v:
-  //   | a b c |   | X |
-  //   | d e f | x | Y |
-  //   | g h i |   | Z |
-  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
-  // with v as [X,Y,Z]
-  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
-    return [
-      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
-      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
-      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
-    ];
-  };
-
-  // This calculation uses Singular Value Decomposition.
-  // The SVD can be represented with formula A = USV. We are interested in the
-  // matrix S here because it represents the scale values.
-  Util.singularValueDecompose2dScale =
-    function Util_singularValueDecompose2dScale(m) {
-
-    var transpose = [m[0], m[2], m[1], m[3]];
-
-    // Multiply matrix m with its transpose.
-    var a = m[0] * transpose[0] + m[1] * transpose[2];
-    var b = m[0] * transpose[1] + m[1] * transpose[3];
-    var c = m[2] * transpose[0] + m[3] * transpose[2];
-    var d = m[2] * transpose[1] + m[3] * transpose[3];
-
-    // Solve the second degree polynomial to get roots.
-    var first = (a + d) / 2;
-    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
-    var sx = first + second || 1;
-    var sy = first - second || 1;
-
-    // Scale values are the square roots of the eigenvalues.
-    return [Math.sqrt(sx), Math.sqrt(sy)];
-  };
-
-  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
-  // For coordinate systems whose origin lies in the bottom-left, this
-  // means normalization to (BL,TR) ordering. For systems with origin in the
-  // top-left, this means (TL,BR) ordering.
-  Util.normalizeRect = function Util_normalizeRect(rect) {
-    var r = rect.slice(0); // clone rect
-    if (rect[0] > rect[2]) {
-      r[0] = rect[2];
-      r[2] = rect[0];
-    }
-    if (rect[1] > rect[3]) {
-      r[1] = rect[3];
-      r[3] = rect[1];
-    }
-    return r;
-  };
-
-  // Returns a rectangle [x1, y1, x2, y2] corresponding to the
-  // intersection of rect1 and rect2. If no intersection, returns 'false'
-  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
-  Util.intersect = function Util_intersect(rect1, rect2) {
-    function compare(a, b) {
-      return a - b;
-    }
-
-    // Order points along the axes
-    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
-        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
-        result = [];
-
-    rect1 = Util.normalizeRect(rect1);
-    rect2 = Util.normalizeRect(rect2);
-
-    // X: first and second points belong to different rectangles?
-    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
-        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
-      // Intersection must be between second and third points
-      result[0] = orderedX[1];
-      result[2] = orderedX[2];
-    } else {
-      return false;
-    }
-
-    // Y: first and second points belong to different rectangles?
-    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
-        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
-      // Intersection must be between second and third points
-      result[1] = orderedY[1];
-      result[3] = orderedY[2];
-    } else {
-      return false;
-    }
-
-    return result;
-  };
-
-  Util.sign = function Util_sign(num) {
-    return num < 0 ? -1 : 1;
-  };
-
-  Util.appendToArray = function Util_appendToArray(arr1, arr2) {
-    Array.prototype.push.apply(arr1, arr2);
-  };
-
-  Util.prependToArray = function Util_prependToArray(arr1, arr2) {
-    Array.prototype.unshift.apply(arr1, arr2);
-  };
-
-  Util.extendObj = function extendObj(obj1, obj2) {
-    for (var key in obj2) {
-      obj1[key] = obj2[key];
-    }
-  };
-
-  Util.getInheritableProperty = function Util_getInheritableProperty(dict,
-                                                                     name) {
-    while (dict && !dict.has(name)) {
-      dict = dict.get('Parent');
-    }
-    if (!dict) {
-      return null;
-    }
-    return dict.get(name);
-  };
-
-  Util.inherit = function Util_inherit(sub, base, prototype) {
-    sub.prototype = Object.create(base.prototype);
-    sub.prototype.constructor = sub;
-    for (var prop in prototype) {
-      sub.prototype[prop] = prototype[prop];
-    }
-  };
-
-  Util.loadScript = function Util_loadScript(src, callback) {
-    var script = document.createElement('script');
-    var loaded = false;
-    script.setAttribute('src', src);
-    if (callback) {
-      script.onload = function() {
-        if (!loaded) {
-          callback();
-        }
-        loaded = true;
-      };
-    }
-    document.getElementsByTagName('head')[0].appendChild(script);
-  };
-
-  return Util;
-})();
-
-/**
- * PDF page viewport created based on scale, rotation and offset.
- * @class
- * @alias PDFJS.PageViewport
- */
-var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
-  /**
-   * @constructor
-   * @private
-   * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates.
-   * @param scale {number} scale of the viewport.
-   * @param rotation {number} rotations of the viewport in degrees.
-   * @param offsetX {number} offset X
-   * @param offsetY {number} offset Y
-   * @param dontFlip {boolean} if true, axis Y will not be flipped.
-   */
-  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {
-    this.viewBox = viewBox;
-    this.scale = scale;
-    this.rotation = rotation;
-    this.offsetX = offsetX;
-    this.offsetY = offsetY;
-
-    // creating transform to convert pdf coordinate system to the normal
-    // canvas like coordinates taking in account scale and rotation
-    var centerX = (viewBox[2] + viewBox[0]) / 2;
-    var centerY = (viewBox[3] + viewBox[1]) / 2;
-    var rotateA, rotateB, rotateC, rotateD;
-    rotation = rotation % 360;
-    rotation = rotation < 0 ? rotation + 360 : rotation;
-    switch (rotation) {
-      case 180:
-        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
-        break;
-      case 90:
-        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
-        break;
-      case 270:
-        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
-        break;
-      //case 0:
-      default:
-        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
-        break;
-    }
-
-    if (dontFlip) {
-      rotateC = -rotateC; rotateD = -rotateD;
-    }
-
-    var offsetCanvasX, offsetCanvasY;
-    var width, height;
-    if (rotateA === 0) {
-      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
-      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
-      width = Math.abs(viewBox[3] - viewBox[1]) * scale;
-      height = Math.abs(viewBox[2] - viewBox[0]) * scale;
-    } else {
-      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
-      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
-      width = Math.abs(viewBox[2] - viewBox[0]) * scale;
-      height = Math.abs(viewBox[3] - viewBox[1]) * scale;
-    }
-    // creating transform for the following operations:
-    // translate(-centerX, -centerY), rotate and flip vertically,
-    // scale, and translate(offsetCanvasX, offsetCanvasY)
-    this.transform = [
-      rotateA * scale,
-      rotateB * scale,
-      rotateC * scale,
-      rotateD * scale,
-      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
-      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
-    ];
-
-    this.width = width;
-    this.height = height;
-    this.fontScale = scale;
-  }
-  PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ {
-    /**
-     * Clones viewport with additional properties.
-     * @param args {Object} (optional) If specified, may contain the 'scale' or
-     * 'rotation' properties to override the corresponding properties in
-     * the cloned viewport.
-     * @returns {PDFJS.PageViewport} Cloned viewport.
-     */
-    clone: function PageViewPort_clone(args) {
-      args = args || {};
-      var scale = 'scale' in args ? args.scale : this.scale;
-      var rotation = 'rotation' in args ? args.rotation : this.rotation;
-      return new PageViewport(this.viewBox.slice(), scale, rotation,
-                              this.offsetX, this.offsetY, args.dontFlip);
-    },
-    /**
-     * Converts PDF point to the viewport coordinates. For examples, useful for
-     * converting PDF location into canvas pixel coordinates.
-     * @param x {number} X coordinate.
-     * @param y {number} Y coordinate.
-     * @returns {Object} Object that contains 'x' and 'y' properties of the
-     * point in the viewport coordinate space.
-     * @see {@link convertToPdfPoint}
-     * @see {@link convertToViewportRectangle}
-     */
-    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
-      return Util.applyTransform([x, y], this.transform);
-    },
-    /**
-     * Converts PDF rectangle to the viewport coordinates.
-     * @param rect {Array} xMin, yMin, xMax and yMax coordinates.
-     * @returns {Array} Contains corresponding coordinates of the rectangle
-     * in the viewport coordinate space.
-     * @see {@link convertToViewportPoint}
-     */
-    convertToViewportRectangle:
-      function PageViewport_convertToViewportRectangle(rect) {
-      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
-      var br = Util.applyTransform([rect[2], rect[3]], this.transform);
-      return [tl[0], tl[1], br[0], br[1]];
-    },
-    /**
-     * Converts viewport coordinates to the PDF location. For examples, useful
-     * for converting canvas pixel location into PDF one.
-     * @param x {number} X coordinate.
-     * @param y {number} Y coordinate.
-     * @returns {Object} Object that contains 'x' and 'y' properties of the
-     * point in the PDF coordinate space.
-     * @see {@link convertToViewportPoint}
-     */
-    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
-      return Util.applyInverseTransform([x, y], this.transform);
-    }
-  };
-  return PageViewport;
-})();
-
-var PDFStringTranslateTable = [
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
-  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
-  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
-  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
-];
-
-function stringToPDFString(str) {
-  var i, n = str.length, strBuf = [];
-  if (str[0] === '\xFE' && str[1] === '\xFF') {
-    // UTF16BE BOM
-    for (i = 2; i < n; i += 2) {
-      strBuf.push(String.fromCharCode(
-        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));
-    }
-  } else {
-    for (i = 0; i < n; ++i) {
-      var code = PDFStringTranslateTable[str.charCodeAt(i)];
-      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
-    }
-  }
-  return strBuf.join('');
-}
-
-function stringToUTF8String(str) {
-  return decodeURIComponent(escape(str));
-}
-
-function utf8StringToString(str) {
-  return unescape(encodeURIComponent(str));
-}
-
-function isEmptyObj(obj) {
-  for (var key in obj) {
-    return false;
-  }
-  return true;
-}
-
-function isBool(v) {
-  return typeof v === 'boolean';
-}
-
-function isInt(v) {
-  return typeof v === 'number' && ((v | 0) === v);
-}
-
-function isNum(v) {
-  return typeof v === 'number';
-}
-
-function isString(v) {
-  return typeof v === 'string';
-}
-
-function isName(v) {
-  return v instanceof Name;
-}
-
-function isCmd(v, cmd) {
-  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
-}
-
-function isDict(v, type) {
-  if (!(v instanceof Dict)) {
-    return false;
-  }
-  if (!type) {
-    return true;
-  }
-  var dictType = v.get('Type');
-  return isName(dictType) && dictType.name === type;
-}
-
-function isArray(v) {
-  return v instanceof Array;
-}
-
-function isStream(v) {
-  return typeof v === 'object' && v !== null && v.getBytes !== undefined;
-}
-
-function isArrayBuffer(v) {
-  return typeof v === 'object' && v !== null && v.byteLength !== undefined;
-}
-
-function isRef(v) {
-  return v instanceof Ref;
-}
-
-/**
- * Promise Capability object.
- *
- * @typedef {Object} PromiseCapability
- * @property {Promise} promise - A promise object.
- * @property {function} resolve - Fullfills the promise.
- * @property {function} reject - Rejects the promise.
- */
-
-/**
- * Creates a promise capability object.
- * @alias PDFJS.createPromiseCapability
- *
- * @return {PromiseCapability} A capability object contains:
- * - a Promise, resolve and reject methods.
- */
-function createPromiseCapability() {
-  var capability = {};
-  capability.promise = new Promise(function (resolve, reject) {
-    capability.resolve = resolve;
-    capability.reject = reject;
-  });
-  return capability;
-}
-
-PDFJS.createPromiseCapability = createPromiseCapability;
-
-/**
- * Polyfill for Promises:
- * The following promise implementation tries to generally implement the
- * Promise/A+ spec. Some notable differences from other promise libaries are:
- * - There currently isn't a seperate deferred and promise object.
- * - Unhandled rejections eventually show an error if they aren't handled.
- *
- * Based off of the work in:
- * https://bugzilla.mozilla.org/show_bug.cgi?id=810490
- */
-(function PromiseClosure() {
-  if (globalScope.Promise) {
-    // Promises existing in the DOM/Worker, checking presence of all/resolve
-    if (typeof globalScope.Promise.all !== 'function') {
-      globalScope.Promise.all = function (iterable) {
-        var count = 0, results = [], resolve, reject;
-        var promise = new globalScope.Promise(function (resolve_, reject_) {
-          resolve = resolve_;
-          reject = reject_;
-        });
-        iterable.forEach(function (p, i) {
-          count++;
-          p.then(function (result) {
-            results[i] = result;
-            count--;
-            if (count === 0) {
-              resolve(results);
-            }
-          }, reject);
-        });
-        if (count === 0) {
-          resolve(results);
-        }
-        return promise;
-      };
-    }
-    if (typeof globalScope.Promise.resolve !== 'function') {
-      globalScope.Promise.resolve = function (value) {
-        return new globalScope.Promise(function (resolve) { resolve(value); });
-      };
-    }
-    if (typeof globalScope.Promise.reject !== 'function') {
-      globalScope.Promise.reject = function (reason) {
-        return new globalScope.Promise(function (resolve, reject) {
-          reject(reason);
-        });
-      };
-    }
-    if (typeof globalScope.Promise.prototype.catch !== 'function') {
-      globalScope.Promise.prototype.catch = function (onReject) {
-        return globalScope.Promise.prototype.then(undefined, onReject);
-      };
-    }
-    return;
-  }
-//#if !MOZCENTRAL
-  var STATUS_PENDING = 0;
-  var STATUS_RESOLVED = 1;
-  var STATUS_REJECTED = 2;
-
-  // In an attempt to avoid silent exceptions, unhandled rejections are
-  // tracked and if they aren't handled in a certain amount of time an
-  // error is logged.
-  var REJECTION_TIMEOUT = 500;
-
-  var HandlerManager = {
-    handlers: [],
-    running: false,
-    unhandledRejections: [],
-    pendingRejectionCheck: false,
-
-    scheduleHandlers: function scheduleHandlers(promise) {
-      if (promise._status === STATUS_PENDING) {
-        return;
-      }
-
-      this.handlers = this.handlers.concat(promise._handlers);
-      promise._handlers = [];
-
-      if (this.running) {
-        return;
-      }
-      this.running = true;
-
-      setTimeout(this.runHandlers.bind(this), 0);
-    },
-
-    runHandlers: function runHandlers() {
-      var RUN_TIMEOUT = 1; // ms
-      var timeoutAt = Date.now() + RUN_TIMEOUT;
-      while (this.handlers.length > 0) {
-        var handler = this.handlers.shift();
-
-        var nextStatus = handler.thisPromise._status;
-        var nextValue = handler.thisPromise._value;
-
-        try {
-          if (nextStatus === STATUS_RESOLVED) {
-            if (typeof handler.onResolve === 'function') {
-              nextValue = handler.onResolve(nextValue);
-            }
-          } else if (typeof handler.onReject === 'function') {
-              nextValue = handler.onReject(nextValue);
-              nextStatus = STATUS_RESOLVED;
-
-              if (handler.thisPromise._unhandledRejection) {
-                this.removeUnhandeledRejection(handler.thisPromise);
-              }
-          }
-        } catch (ex) {
-          nextStatus = STATUS_REJECTED;
-          nextValue = ex;
-        }
-
-        handler.nextPromise._updateStatus(nextStatus, nextValue);
-        if (Date.now() >= timeoutAt) {
-          break;
-        }
-      }
-
-      if (this.handlers.length > 0) {
-        setTimeout(this.runHandlers.bind(this), 0);
-        return;
-      }
-
-      this.running = false;
-    },
-
-    addUnhandledRejection: function addUnhandledRejection(promise) {
-      this.unhandledRejections.push({
-        promise: promise,
-        time: Date.now()
-      });
-      this.scheduleRejectionCheck();
-    },
-
-    removeUnhandeledRejection: function removeUnhandeledRejection(promise) {
-      promise._unhandledRejection = false;
-      for (var i = 0; i < this.unhandledRejections.length; i++) {
-        if (this.unhandledRejections[i].promise === promise) {
-          this.unhandledRejections.splice(i);
-          i--;
-        }
-      }
-    },
-
-    scheduleRejectionCheck: function scheduleRejectionCheck() {
-      if (this.pendingRejectionCheck) {
-        return;
-      }
-      this.pendingRejectionCheck = true;
-      setTimeout(function rejectionCheck() {
-        this.pendingRejectionCheck = false;
-        var now = Date.now();
-        for (var i = 0; i < this.unhandledRejections.length; i++) {
-          if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) {
-            var unhandled = this.unhandledRejections[i].promise._value;
-            var msg = 'Unhandled rejection: ' + unhandled;
-            if (unhandled.stack) {
-              msg += '\n' + unhandled.stack;
-            }
-            warn(msg);
-            this.unhandledRejections.splice(i);
-            i--;
-          }
-        }
-        if (this.unhandledRejections.length) {
-          this.scheduleRejectionCheck();
-        }
-      }.bind(this), REJECTION_TIMEOUT);
-    }
-  };
-
-  function Promise(resolver) {
-    this._status = STATUS_PENDING;
-    this._handlers = [];
-    try {
-      resolver.call(this, this._resolve.bind(this), this._reject.bind(this));
-    } catch (e) {
-      this._reject(e);
-    }
-  }
-  /**
-   * Builds a promise that is resolved when all the passed in promises are
-   * resolved.
-   * @param {array} array of data and/or promises to wait for.
-   * @return {Promise} New dependant promise.
-   */
-  Promise.all = function Promise_all(promises) {
-    var resolveAll, rejectAll;
-    var deferred = new Promise(function (resolve, reject) {
-      resolveAll = resolve;
-      rejectAll = reject;
-    });
-    var unresolved = promises.length;
-    var results = [];
-    if (unresolved === 0) {
-      resolveAll(results);
-      return deferred;
-    }
-    function reject(reason) {
-      if (deferred._status === STATUS_REJECTED) {
-        return;
-      }
-      results = [];
-      rejectAll(reason);
-    }
-    for (var i = 0, ii = promises.length; i < ii; ++i) {
-      var promise = promises[i];
-      var resolve = (function(i) {
-        return function(value) {
-          if (deferred._status === STATUS_REJECTED) {
-            return;
-          }
-          results[i] = value;
-          unresolved--;
-          if (unresolved === 0) {
-            resolveAll(results);
-          }
-        };
-      })(i);
-      if (Promise.isPromise(promise)) {
-        promise.then(resolve, reject);
-      } else {
-        resolve(promise);
-      }
-    }
-    return deferred;
-  };
-
-  /**
-   * Checks if the value is likely a promise (has a 'then' function).
-   * @return {boolean} true if value is thenable
-   */
-  Promise.isPromise = function Promise_isPromise(value) {
-    return value && typeof value.then === 'function';
-  };
-
-  /**
-   * Creates resolved promise
-   * @param value resolve value
-   * @returns {Promise}
-   */
-  Promise.resolve = function Promise_resolve(value) {
-    return new Promise(function (resolve) { resolve(value); });
-  };
-
-  /**
-   * Creates rejected promise
-   * @param reason rejection value
-   * @returns {Promise}
-   */
-  Promise.reject = function Promise_reject(reason) {
-    return new Promise(function (resolve, reject) { reject(reason); });
-  };
-
-  Promise.prototype = {
-    _status: null,
-    _value: null,
-    _handlers: null,
-    _unhandledRejection: null,
-
-    _updateStatus: function Promise__updateStatus(status, value) {
-      if (this._status === STATUS_RESOLVED ||
-          this._status === STATUS_REJECTED) {
-        return;
-      }
-
-      if (status === STATUS_RESOLVED &&
-          Promise.isPromise(value)) {
-        value.then(this._updateStatus.bind(this, STATUS_RESOLVED),
-                   this._updateStatus.bind(this, STATUS_REJECTED));
-        return;
-      }
-
-      this._status = status;
-      this._value = value;
-
-      if (status === STATUS_REJECTED && this._handlers.length === 0) {
-        this._unhandledRejection = true;
-        HandlerManager.addUnhandledRejection(this);
-      }
-
-      HandlerManager.scheduleHandlers(this);
-    },
-
-    _resolve: function Promise_resolve(value) {
-      this._updateStatus(STATUS_RESOLVED, value);
-    },
-
-    _reject: function Promise_reject(reason) {
-      this._updateStatus(STATUS_REJECTED, reason);
-    },
-
-    then: function Promise_then(onResolve, onReject) {
-      var nextPromise = new Promise(function (resolve, reject) {
-        this.resolve = resolve;
-        this.reject = reject;
-      });
-      this._handlers.push({
-        thisPromise: this,
-        onResolve: onResolve,
-        onReject: onReject,
-        nextPromise: nextPromise
-      });
-      HandlerManager.scheduleHandlers(this);
-      return nextPromise;
-    },
-
-    catch: function Promise_catch(onReject) {
-      return this.then(undefined, onReject);
-    }
-  };
-
-  globalScope.Promise = Promise;
-//#else
-//throw new Error('DOM Promise is not present');
-//#endif
-})();
-
-var StatTimer = (function StatTimerClosure() {
-  function rpad(str, pad, length) {
-    while (str.length < length) {
-      str += pad;
-    }
-    return str;
-  }
-  function StatTimer() {
-    this.started = {};
-    this.times = [];
-    this.enabled = true;
-  }
-  StatTimer.prototype = {
-    time: function StatTimer_time(name) {
-      if (!this.enabled) {
-        return;
-      }
-      if (name in this.started) {
-        warn('Timer is already running for ' + name);
-      }
-      this.started[name] = Date.now();
-    },
-    timeEnd: function StatTimer_timeEnd(name) {
-      if (!this.enabled) {
-        return;
-      }
-      if (!(name in this.started)) {
-        warn('Timer has not been started for ' + name);
-      }
-      this.times.push({
-        'name': name,
-        'start': this.started[name],
-        'end': Date.now()
-      });
-      // Remove timer from started so it can be called again.
-      delete this.started[name];
-    },
-    toString: function StatTimer_toString() {
-      var i, ii;
-      var times = this.times;
-      var out = '';
-      // Find the longest name for padding purposes.
-      var longest = 0;
-      for (i = 0, ii = times.length; i < ii; ++i) {
-        var name = times[i]['name'];
-        if (name.length > longest) {
-          longest = name.length;
-        }
-      }
-      for (i = 0, ii = times.length; i < ii; ++i) {
-        var span = times[i];
-        var duration = span.end - span.start;
-        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
-      }
-      return out;
-    }
-  };
-  return StatTimer;
-})();
-
-PDFJS.createBlob = function createBlob(data, contentType) {
-  if (typeof Blob !== 'undefined') {
-    return new Blob([data], { type: contentType });
-  }
-  // Blob builder is deprecated in FF14 and removed in FF18.
-  var bb = new MozBlobBuilder();
-  bb.append(data);
-  return bb.getBlob(contentType);
-};
-
-PDFJS.createObjectURL = (function createObjectURLClosure() {
-  // Blob/createObjectURL is not available, falling back to data schema.
-  var digits =
-    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
-
-  return function createObjectURL(data, contentType) {
-    if (!PDFJS.disableCreateObjectURL &&
-        typeof URL !== 'undefined' && URL.createObjectURL) {
-      var blob = PDFJS.createBlob(data, contentType);
-      return URL.createObjectURL(blob);
-    }
-
-    var buffer = 'data:' + contentType + ';base64,';
-    for (var i = 0, ii = data.length; i < ii; i += 3) {
-      var b1 = data[i] & 0xFF;
-      var b2 = data[i + 1] & 0xFF;
-      var b3 = data[i + 2] & 0xFF;
-      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
-      var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
-      var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;
-      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
-    }
-    return buffer;
-  };
-})();
-
-function MessageHandler(name, comObj) {
-  this.name = name;
-  this.comObj = comObj;
-  this.callbackIndex = 1;
-  this.postMessageTransfers = true;
-  var callbacksCapabilities = this.callbacksCapabilities = {};
-  var ah = this.actionHandler = {};
-
-  ah['console_log'] = [function ahConsoleLog(data) {
-    console.log.apply(console, data);
-  }];
-  ah['console_error'] = [function ahConsoleError(data) {
-    console.error.apply(console, data);
-  }];
-  ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) {
-    UnsupportedManager.notify(data);
-  }];
-
-  comObj.onmessage = function messageHandlerComObjOnMessage(event) {
-    var data = event.data;
-    if (data.isReply) {
-      var callbackId = data.callbackId;
-      if (data.callbackId in callbacksCapabilities) {
-        var callback = callbacksCapabilities[callbackId];
-        delete callbacksCapabilities[callbackId];
-        if ('error' in data) {
-          callback.reject(data.error);
-        } else {
-          callback.resolve(data.data);
-        }
-      } else {
-        error('Cannot resolve callback ' + callbackId);
-      }
-    } else if (data.action in ah) {
-      var action = ah[data.action];
-      if (data.callbackId) {
-        Promise.resolve().then(function () {
-          return action[0].call(action[1], data.data);
-        }).then(function (result) {
-          comObj.postMessage({
-            isReply: true,
-            callbackId: data.callbackId,
-            data: result
-          });
-        }, function (reason) {
-          comObj.postMessage({
-            isReply: true,
-            callbackId: data.callbackId,
-            error: reason
-          });
-        });
-      } else {
-        action[0].call(action[1], data.data);
-      }
-    } else {
-      error('Unknown action from worker: ' + data.action);
-    }
-  };
-}
-
-MessageHandler.prototype = {
-  on: function messageHandlerOn(actionName, handler, scope) {
-    var ah = this.actionHandler;
-    if (ah[actionName]) {
-      error('There is already an actionName called "' + actionName + '"');
-    }
-    ah[actionName] = [handler, scope];
-  },
-  /**
-   * Sends a message to the comObj to invoke the action with the supplied data.
-   * @param {String} actionName Action to call.
-   * @param {JSON} data JSON data to send.
-   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers
-   */
-  send: function messageHandlerSend(actionName, data, transfers) {
-    var message = {
-      action: actionName,
-      data: data
-    };
-    this.postMessage(message, transfers);
-  },
-  /**
-   * Sends a message to the comObj to invoke the action with the supplied data.
-   * Expects that other side will callback with the response.
-   * @param {String} actionName Action to call.
-   * @param {JSON} data JSON data to send.
-   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers.
-   * @returns {Promise} Promise to be resolved with response data.
-   */
-  sendWithPromise:
-    function messageHandlerSendWithPromise(actionName, data, transfers) {
-    var callbackId = this.callbackIndex++;
-    var message = {
-      action: actionName,
-      data: data,
-      callbackId: callbackId
-    };
-    var capability = createPromiseCapability();
-    this.callbacksCapabilities[callbackId] = capability;
-    try {
-      this.postMessage(message, transfers);
-    } catch (e) {
-      capability.reject(e);
-    }
-    return capability.promise;
-  },
-  /**
-   * Sends raw message to the comObj.
-   * @private
-   * @param message {Object} Raw message.
-   * @param transfers List of transfers/ArrayBuffers, or undefined.
-   */
-  postMessage: function (message, transfers) {
-    if (transfers && this.postMessageTransfers) {
-      this.comObj.postMessage(message, transfers);
-    } else {
-      this.comObj.postMessage(message);
-    }
-  }
-};
-
-function loadJpegStream(id, imageUrl, objs) {
-  var img = new Image();
-  img.onload = (function loadJpegStream_onloadClosure() {
-    objs.resolve(id, img);
-  });
-  img.onerror = (function loadJpegStream_onerrorClosure() {
-    objs.resolve(id, null);
-    warn('Error during JPEG image loading');
-  });
-  img.src = imageUrl;
-}
-
-
-
-//#if (FIREFOX || MOZCENTRAL)
-//
-//Components.utils.import('resource://gre/modules/Services.jsm');
-//
-//var EXPORTED_SYMBOLS = ['NetworkManager'];
-//
-//var console = {
-//  log: function console_log(aMsg) {
-//    var msg = 'network.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
-//    Services.console.logStringMessage(msg);
-//    // TODO(mack): dump() doesn't seem to work here...
-//    dump(msg + '\n');
-//  }
-//}
-//#endif
-
-var NetworkManager = (function NetworkManagerClosure() {
-
-  var OK_RESPONSE = 200;
-  var PARTIAL_CONTENT_RESPONSE = 206;
-
-  function NetworkManager(url, args) {
-    this.url = url;
-    args = args || {};
-    this.isHttp = /^https?:/i.test(url);
-    this.httpHeaders = (this.isHttp && args.httpHeaders) || {};
-    this.withCredentials = args.withCredentials || false;
-    this.getXhr = args.getXhr ||
-      function NetworkManager_getXhr() {
-//#if B2G
-//      return new XMLHttpRequest({ mozSystem: true });
-//#else
-        return new XMLHttpRequest();
-//#endif
-      };
-
-    this.currXhrId = 0;
-    this.pendingRequests = {};
-    this.loadedRequests = {};
-  }
-
-  function getArrayBuffer(xhr) {
-    var data = xhr.response;
-    if (typeof data !== 'string') {
-      return data;
-    }
-    var length = data.length;
-    var array = new Uint8Array(length);
-    for (var i = 0; i < length; i++) {
-      array[i] = data.charCodeAt(i) & 0xFF;
-    }
-    return array.buffer;
-  }
-
-  NetworkManager.prototype = {
-    requestRange: function NetworkManager_requestRange(begin, end, listeners) {
-      var args = {
-        begin: begin,
-        end: end
-      };
-      for (var prop in listeners) {
-        args[prop] = listeners[prop];
-      }
-      return this.request(args);
-    },
-
-    requestFull: function NetworkManager_requestFull(listeners) {
-      return this.request(listeners);
-    },
-
-    request: function NetworkManager_request(args) {
-      var xhr = this.getXhr();
-      var xhrId = this.currXhrId++;
-      var pendingRequest = this.pendingRequests[xhrId] = {
-        xhr: xhr
-      };
-
-      xhr.open('GET', this.url);
-      xhr.withCredentials = this.withCredentials;
-      for (var property in this.httpHeaders) {
-        var value = this.httpHeaders[property];
-        if (typeof value === 'undefined') {
-          continue;
-        }
-        xhr.setRequestHeader(property, value);
-      }
-      if (this.isHttp && 'begin' in args && 'end' in args) {
-        var rangeStr = args.begin + '-' + (args.end - 1);
-        xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
-        pendingRequest.expectedStatus = 206;
-      } else {
-        pendingRequest.expectedStatus = 200;
-      }
-
-      if (args.onProgressiveData) {
-        // Some legacy browsers might throw an exception.
-        try {
-          xhr.responseType = 'moz-chunked-arraybuffer';
-        } catch(e) {}
-        if (xhr.responseType === 'moz-chunked-arraybuffer') {
-          pendingRequest.onProgressiveData = args.onProgressiveData;
-          pendingRequest.mozChunked = true;
-        } else {
-          xhr.responseType = 'arraybuffer';
-        }
-      } else {
-        xhr.responseType = 'arraybuffer';
-      }
-
-      if (args.onError) {
-        xhr.onerror = function(evt) {
-          args.onError(xhr.status);
-        };
-      }
-      xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
-      xhr.onprogress = this.onProgress.bind(this, xhrId);
-
-      pendingRequest.onHeadersReceived = args.onHeadersReceived;
-      pendingRequest.onDone = args.onDone;
-      pendingRequest.onError = args.onError;
-      pendingRequest.onProgress = args.onProgress;
-
-      xhr.send(null);
-
-      return xhrId;
-    },
-
-    onProgress: function NetworkManager_onProgress(xhrId, evt) {
-      var pendingRequest = this.pendingRequests[xhrId];
-      if (!pendingRequest) {
-        // Maybe abortRequest was called...
-        return;
-      }
-
-      if (pendingRequest.mozChunked) {
-        var chunk = getArrayBuffer(pendingRequest.xhr);
-        pendingRequest.onProgressiveData(chunk);
-      }
-
-      var onProgress = pendingRequest.onProgress;
-      if (onProgress) {
-        onProgress(evt);
-      }
-    },
-
-    onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
-      var pendingRequest = this.pendingRequests[xhrId];
-      if (!pendingRequest) {
-        // Maybe abortRequest was called...
-        return;
-      }
-
-      var xhr = pendingRequest.xhr;
-      if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
-        pendingRequest.onHeadersReceived();
-        delete pendingRequest.onHeadersReceived;
-      }
-
-      if (xhr.readyState !== 4) {
-        return;
-      }
-
-      if (!(xhrId in this.pendingRequests)) {
-        // The XHR request might have been aborted in onHeadersReceived()
-        // callback, in which case we should abort request
-        return;
-      }
-
-      delete this.pendingRequests[xhrId];
-
-      // success status == 0 can be on ftp, file and other protocols
-      if (xhr.status === 0 && this.isHttp) {
-        if (pendingRequest.onError) {
-          pendingRequest.onError(xhr.status);
-        }
-        return;
-      }
-      var xhrStatus = xhr.status || OK_RESPONSE;
-
-      // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:
-      // "A server MAY ignore the Range header". This means it's possible to
-      // get a 200 rather than a 206 response from a range request.
-      var ok_response_on_range_request =
-          xhrStatus === OK_RESPONSE &&
-          pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
-
-      if (!ok_response_on_range_request &&
-          xhrStatus !== pendingRequest.expectedStatus) {
-        if (pendingRequest.onError) {
-          pendingRequest.onError(xhr.status);
-        }
-        return;
-      }
-
-      this.loadedRequests[xhrId] = true;
-
-      var chunk = getArrayBuffer(xhr);
-      if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
-        var rangeHeader = xhr.getResponseHeader('Content-Range');
-        var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
-        var begin = parseInt(matches[1], 10);
-        pendingRequest.onDone({
-          begin: begin,
-          chunk: chunk
-        });
-      } else if (pendingRequest.onProgressiveData) {
-        pendingRequest.onDone(null);
-      } else {
-        pendingRequest.onDone({
-          begin: 0,
-          chunk: chunk
-        });
-      }
-    },
-
-    hasPendingRequests: function NetworkManager_hasPendingRequests() {
-      for (var xhrId in this.pendingRequests) {
-        return true;
-      }
-      return false;
-    },
-
-    getRequestXhr: function NetworkManager_getXhr(xhrId) {
-      return this.pendingRequests[xhrId].xhr;
-    },
-
-    isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {
-      return !!(this.pendingRequests[xhrId].onProgressiveData);
-    },
-
-    isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
-      return xhrId in this.pendingRequests;
-    },
-
-    isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
-      return xhrId in this.loadedRequests;
-    },
-
-    abortAllRequests: function NetworkManager_abortAllRequests() {
-      for (var xhrId in this.pendingRequests) {
-        this.abortRequest(xhrId | 0);
-      }
-    },
-
-    abortRequest: function NetworkManager_abortRequest(xhrId) {
-      var xhr = this.pendingRequests[xhrId].xhr;
-      delete this.pendingRequests[xhrId];
-      xhr.abort();
-    }
-  };
-
-  return NetworkManager;
-})();
-
-
-var ChunkedStream = (function ChunkedStreamClosure() {
-  function ChunkedStream(length, chunkSize, manager) {
-    this.bytes = new Uint8Array(length);
-    this.start = 0;
-    this.pos = 0;
-    this.end = length;
-    this.chunkSize = chunkSize;
-    this.loadedChunks = [];
-    this.numChunksLoaded = 0;
-    this.numChunks = Math.ceil(length / chunkSize);
-    this.manager = manager;
-    this.progressiveDataLength = 0;
-    this.lastSuccessfulEnsureByteChunk = -1;  // a single-entry cache
-  }
-
-  // required methods for a stream. if a particular stream does not
-  // implement these, an error should be thrown
-  ChunkedStream.prototype = {
-
-    getMissingChunks: function ChunkedStream_getMissingChunks() {
-      var chunks = [];
-      for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {
-        if (!this.loadedChunks[chunk]) {
-          chunks.push(chunk);
-        }
-      }
-      return chunks;
-    },
-
-    getBaseStreams: function ChunkedStream_getBaseStreams() {
-      return [this];
-    },
-
-    allChunksLoaded: function ChunkedStream_allChunksLoaded() {
-      return this.numChunksLoaded === this.numChunks;
-    },
-
-    onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) {
-      var end = begin + chunk.byteLength;
-
-      assert(begin % this.chunkSize === 0, 'Bad begin offset: ' + begin);
-      // Using this.length is inaccurate here since this.start can be moved
-      // See ChunkedStream.moveStart()
-      var length = this.bytes.length;
-      assert(end % this.chunkSize === 0 || end === length,
-             'Bad end offset: ' + end);
-
-      this.bytes.set(new Uint8Array(chunk), begin);
-      var chunkSize = this.chunkSize;
-      var beginChunk = Math.floor(begin / chunkSize);
-      var endChunk = Math.floor((end - 1) / chunkSize) + 1;
-      var curChunk;
-
-      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
-        if (!this.loadedChunks[curChunk]) {
-          this.loadedChunks[curChunk] = true;
-          ++this.numChunksLoaded;
-        }
-      }
-    },
-
-    onReceiveProgressiveData:
-        function ChunkedStream_onReceiveProgressiveData(data) {
-      var position = this.progressiveDataLength;
-      var beginChunk = Math.floor(position / this.chunkSize);
-
-      this.bytes.set(new Uint8Array(data), position);
-      position += data.byteLength;
-      this.progressiveDataLength = position;
-      var endChunk = position >= this.end ? this.numChunks :
-                     Math.floor(position / this.chunkSize);
-      var curChunk;
-      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
-        if (!this.loadedChunks[curChunk]) {
-          this.loadedChunks[curChunk] = true;
-          ++this.numChunksLoaded;
-        }
-      }
-    },
-
-    ensureByte: function ChunkedStream_ensureByte(pos) {
-      var chunk = Math.floor(pos / this.chunkSize);
-      if (chunk === this.lastSuccessfulEnsureByteChunk) {
-        return;
-      }
-
-      if (!this.loadedChunks[chunk]) {
-        throw new MissingDataException(pos, pos + 1);
-      }
-      this.lastSuccessfulEnsureByteChunk = chunk;
-    },
-
-    ensureRange: function ChunkedStream_ensureRange(begin, end) {
-      if (begin >= end) {
-        return;
-      }
-
-      if (end <= this.progressiveDataLength) {
-        return;
-      }
-
-      var chunkSize = this.chunkSize;
-      var beginChunk = Math.floor(begin / chunkSize);
-      var endChunk = Math.floor((end - 1) / chunkSize) + 1;
-      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-        if (!this.loadedChunks[chunk]) {
-          throw new MissingDataException(begin, end);
-        }
-      }
-    },
-
-    nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) {
-      var chunk, n;
-      for (chunk = beginChunk, n = this.numChunks; chunk < n; ++chunk) {
-        if (!this.loadedChunks[chunk]) {
-          return chunk;
-        }
-      }
-      // Wrap around to beginning
-      for (chunk = 0; chunk < beginChunk; ++chunk) {
-        if (!this.loadedChunks[chunk]) {
-          return chunk;
-        }
-      }
-      return null;
-    },
-
-    hasChunk: function ChunkedStream_hasChunk(chunk) {
-      return !!this.loadedChunks[chunk];
-    },
-
-    get length() {
-      return this.end - this.start;
-    },
-
-    get isEmpty() {
-      return this.length === 0;
-    },
-
-    getByte: function ChunkedStream_getByte() {
-      var pos = this.pos;
-      if (pos >= this.end) {
-        return -1;
-      }
-      this.ensureByte(pos);
-      return this.bytes[this.pos++];
-    },
-
-    getUint16: function ChunkedStream_getUint16() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-      if (b0 === -1 || b1 === -1) {
-        return -1;
-      }
-      return (b0 << 8) + b1;
-    },
-
-    getInt32: function ChunkedStream_getInt32() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-      var b2 = this.getByte();
-      var b3 = this.getByte();
-      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
-    },
-
-    // returns subarray of original buffer
-    // should only be read
-    getBytes: function ChunkedStream_getBytes(length) {
-      var bytes = this.bytes;
-      var pos = this.pos;
-      var strEnd = this.end;
-
-      if (!length) {
-        this.ensureRange(pos, strEnd);
-        return bytes.subarray(pos, strEnd);
-      }
-
-      var end = pos + length;
-      if (end > strEnd) {
-        end = strEnd;
-      }
-      this.ensureRange(pos, end);
-
-      this.pos = end;
-      return bytes.subarray(pos, end);
-    },
-
-    peekByte: function ChunkedStream_peekByte() {
-      var peekedByte = this.getByte();
-      this.pos--;
-      return peekedByte;
-    },
-
-    peekBytes: function ChunkedStream_peekBytes(length) {
-      var bytes = this.getBytes(length);
-      this.pos -= bytes.length;
-      return bytes;
-    },
-
-    getByteRange: function ChunkedStream_getBytes(begin, end) {
-      this.ensureRange(begin, end);
-      return this.bytes.subarray(begin, end);
-    },
-
-    skip: function ChunkedStream_skip(n) {
-      if (!n) {
-        n = 1;
-      }
-      this.pos += n;
-    },
-
-    reset: function ChunkedStream_reset() {
-      this.pos = this.start;
-    },
-
-    moveStart: function ChunkedStream_moveStart() {
-      this.start = this.pos;
-    },
-
-    makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) {
-      this.ensureRange(start, start + length);
-
-      function ChunkedStreamSubstream() {}
-      ChunkedStreamSubstream.prototype = Object.create(this);
-      ChunkedStreamSubstream.prototype.getMissingChunks = function() {
-        var chunkSize = this.chunkSize;
-        var beginChunk = Math.floor(this.start / chunkSize);
-        var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;
-        var missingChunks = [];
-        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-          if (!this.loadedChunks[chunk]) {
-            missingChunks.push(chunk);
-          }
-        }
-        return missingChunks;
-      };
-      var subStream = new ChunkedStreamSubstream();
-      subStream.pos = subStream.start = start;
-      subStream.end = start + length || this.end;
-      subStream.dict = dict;
-      return subStream;
-    },
-
-    isStream: true
-  };
-
-  return ChunkedStream;
-})();
-
-var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
-
-  function ChunkedStreamManager(length, chunkSize, url, args) {
-    this.stream = new ChunkedStream(length, chunkSize, this);
-    this.length = length;
-    this.chunkSize = chunkSize;
-    this.url = url;
-    this.disableAutoFetch = args.disableAutoFetch;
-    var msgHandler = this.msgHandler = args.msgHandler;
-
-    if (args.chunkedViewerLoading) {
-      msgHandler.on('OnDataRange', this.onReceiveData.bind(this));
-      msgHandler.on('OnDataProgress', this.onProgress.bind(this));
-      this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
-        msgHandler.send('RequestDataRange', { begin: begin, end: end });
-      };
-    } else {
-
-      var getXhr = function getXhr() {
-//#if B2G
-//      return new XMLHttpRequest({ mozSystem: true });
-//#else
-        return new XMLHttpRequest();
-//#endif
-      };
-      this.networkManager = new NetworkManager(this.url, {
-        getXhr: getXhr,
-        httpHeaders: args.httpHeaders,
-        withCredentials: args.withCredentials
-      });
-      this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
-        this.networkManager.requestRange(begin, end, {
-          onDone: this.onReceiveData.bind(this),
-          onProgress: this.onProgress.bind(this)
-        });
-      };
-    }
-
-    this.currRequestId = 0;
-
-    this.chunksNeededByRequest = {};
-    this.requestsByChunk = {};
-    this.callbacksByRequest = {};
-    this.progressiveDataLength = 0;
-
-    this._loadedStreamCapability = createPromiseCapability();
-
-    if (args.initialData) {
-      this.onReceiveData({chunk: args.initialData});
-    }
-  }
-
-  ChunkedStreamManager.prototype = {
-    onLoadedStream: function ChunkedStreamManager_getLoadedStream() {
-      return this._loadedStreamCapability.promise;
-    },
-
-    // Get all the chunks that are not yet loaded and groups them into
-    // contiguous ranges to load in as few requests as possible
-    requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
-      var missingChunks = this.stream.getMissingChunks();
-      this.requestChunks(missingChunks);
-      return this._loadedStreamCapability.promise;
-    },
-
-    requestChunks: function ChunkedStreamManager_requestChunks(chunks,
-                                                               callback) {
-      var requestId = this.currRequestId++;
-
-      var chunksNeeded;
-      var i, ii;
-      this.chunksNeededByRequest[requestId] = chunksNeeded = {};
-      for (i = 0, ii = chunks.length; i < ii; i++) {
-        if (!this.stream.hasChunk(chunks[i])) {
-          chunksNeeded[chunks[i]] = true;
-        }
-      }
-
-      if (isEmptyObj(chunksNeeded)) {
-        if (callback) {
-          callback();
-        }
-        return;
-      }
-
-      this.callbacksByRequest[requestId] = callback;
-
-      var chunksToRequest = [];
-      for (var chunk in chunksNeeded) {
-        chunk = chunk | 0;
-        if (!(chunk in this.requestsByChunk)) {
-          this.requestsByChunk[chunk] = [];
-          chunksToRequest.push(chunk);
-        }
-        this.requestsByChunk[chunk].push(requestId);
-      }
-
-      if (!chunksToRequest.length) {
-        return;
-      }
-
-      var groupedChunksToRequest = this.groupChunks(chunksToRequest);
-
-      for (i = 0; i < groupedChunksToRequest.length; ++i) {
-        var groupedChunk = groupedChunksToRequest[i];
-        var begin = groupedChunk.beginChunk * this.chunkSize;
-        var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);
-        this.sendRequest(begin, end);
-      }
-    },
-
-    getStream: function ChunkedStreamManager_getStream() {
-      return this.stream;
-    },
-
-    // Loads any chunks in the requested range that are not yet loaded
-    requestRange: function ChunkedStreamManager_requestRange(
-                      begin, end, callback) {
-
-      end = Math.min(end, this.length);
-
-      var beginChunk = this.getBeginChunk(begin);
-      var endChunk = this.getEndChunk(end);
-
-      var chunks = [];
-      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-        chunks.push(chunk);
-      }
-
-      this.requestChunks(chunks, callback);
-    },
-
-    requestRanges: function ChunkedStreamManager_requestRanges(ranges,
-                                                               callback) {
-      ranges = ranges || [];
-      var chunksToRequest = [];
-
-      for (var i = 0; i < ranges.length; i++) {
-        var beginChunk = this.getBeginChunk(ranges[i].begin);
-        var endChunk = this.getEndChunk(ranges[i].end);
-        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
-          if (chunksToRequest.indexOf(chunk) < 0) {
-            chunksToRequest.push(chunk);
-          }
-        }
-      }
-
-      chunksToRequest.sort(function(a, b) { return a - b; });
-      this.requestChunks(chunksToRequest, callback);
-    },
-
-    // Groups a sorted array of chunks into as few continguous larger
-    // chunks as possible
-    groupChunks: function ChunkedStreamManager_groupChunks(chunks) {
-      var groupedChunks = [];
-      var beginChunk = -1;
-      var prevChunk = -1;
-      for (var i = 0; i < chunks.length; ++i) {
-        var chunk = chunks[i];
-
-        if (beginChunk < 0) {
-          beginChunk = chunk;
-        }
-
-        if (prevChunk >= 0 && prevChunk + 1 !== chunk) {
-          groupedChunks.push({ beginChunk: beginChunk,
-                               endChunk: prevChunk + 1 });
-          beginChunk = chunk;
-        }
-        if (i + 1 === chunks.length) {
-          groupedChunks.push({ beginChunk: beginChunk,
-                               endChunk: chunk + 1 });
-        }
-
-        prevChunk = chunk;
-      }
-      return groupedChunks;
-    },
-
-    onProgress: function ChunkedStreamManager_onProgress(args) {
-      var bytesLoaded = (this.stream.numChunksLoaded * this.chunkSize +
-                         args.loaded);
-      this.msgHandler.send('DocProgress', {
-        loaded: bytesLoaded,
-        total: this.length
-      });
-    },
-
-    onReceiveData: function ChunkedStreamManager_onReceiveData(args) {
-      var chunk = args.chunk;
-      var isProgressive = args.begin === undefined;
-      var begin = isProgressive ? this.progressiveDataLength : args.begin;
-      var end = begin + chunk.byteLength;
-
-      var beginChunk = Math.floor(begin / this.chunkSize);
-      var endChunk = end < this.length ? Math.floor(end / this.chunkSize) :
-                                         Math.ceil(end / this.chunkSize);
-
-      if (isProgressive) {
-        this.stream.onReceiveProgressiveData(chunk);
-        this.progressiveDataLength = end;
-      } else {
-        this.stream.onReceiveData(begin, chunk);
-      }
-
-      if (this.stream.allChunksLoaded()) {
-        this._loadedStreamCapability.resolve(this.stream);
-      }
-
-      var loadedRequests = [];
-      var i, requestId;
-      for (chunk = beginChunk; chunk < endChunk; ++chunk) {
-        // The server might return more chunks than requested
-        var requestIds = this.requestsByChunk[chunk] || [];
-        delete this.requestsByChunk[chunk];
-
-        for (i = 0; i < requestIds.length; ++i) {
-          requestId = requestIds[i];
-          var chunksNeeded = this.chunksNeededByRequest[requestId];
-          if (chunk in chunksNeeded) {
-            delete chunksNeeded[chunk];
-          }
-
-          if (!isEmptyObj(chunksNeeded)) {
-            continue;
-          }
-
-          loadedRequests.push(requestId);
-        }
-      }
-
-      // If there are no pending requests, automatically fetch the next
-      // unfetched chunk of the PDF
-      if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) {
-        var nextEmptyChunk;
-        if (this.stream.numChunksLoaded === 1) {
-          // This is a special optimization so that after fetching the first
-          // chunk, rather than fetching the second chunk, we fetch the last
-          // chunk.
-          var lastChunk = this.stream.numChunks - 1;
-          if (!this.stream.hasChunk(lastChunk)) {
-            nextEmptyChunk = lastChunk;
-          }
-        } else {
-          nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);
-        }
-        if (isInt(nextEmptyChunk)) {
-          this.requestChunks([nextEmptyChunk]);
-        }
-      }
-
-      for (i = 0; i < loadedRequests.length; ++i) {
-        requestId = loadedRequests[i];
-        var callback = this.callbacksByRequest[requestId];
-        delete this.callbacksByRequest[requestId];
-        if (callback) {
-          callback();
-        }
-      }
-
-      this.msgHandler.send('DocProgress', {
-        loaded: this.stream.numChunksLoaded * this.chunkSize,
-        total: this.length
-      });
-    },
-
-    onError: function ChunkedStreamManager_onError(err) {
-      this._loadedStreamCapability.reject(err);
-    },
-
-    getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) {
-      var chunk = Math.floor(begin / this.chunkSize);
-      return chunk;
-    },
-
-    getEndChunk: function ChunkedStreamManager_getEndChunk(end) {
-      if (end % this.chunkSize === 0) {
-        return end / this.chunkSize;
-      }
-
-      // 0 -> 0
-      // 1 -> 1
-      // 99 -> 1
-      // 100 -> 1
-      // 101 -> 2
-      var chunk = Math.floor((end - 1) / this.chunkSize) + 1;
-      return chunk;
-    }
-  };
-
-  return ChunkedStreamManager;
-})();
-
-
-// The maximum number of bytes fetched per range request
-var RANGE_CHUNK_SIZE = 65536;
-
-// TODO(mack): Make use of PDFJS.Util.inherit() when it becomes available
-var BasePdfManager = (function BasePdfManagerClosure() {
-  function BasePdfManager() {
-    throw new Error('Cannot initialize BaseManagerManager');
-  }
-
-  BasePdfManager.prototype = {
-    onLoadedStream: function BasePdfManager_onLoadedStream() {
-      throw new NotImplementedException();
-    },
-
-    ensureDoc: function BasePdfManager_ensureDoc(prop, args) {
-      return this.ensure(this.pdfDocument, prop, args);
-    },
-
-    ensureXRef: function BasePdfManager_ensureXRef(prop, args) {
-      return this.ensure(this.pdfDocument.xref, prop, args);
-    },
-
-    ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) {
-      return this.ensure(this.pdfDocument.catalog, prop, args);
-    },
-
-    getPage: function BasePdfManager_pagePage(pageIndex) {
-      return this.pdfDocument.getPage(pageIndex);
-    },
-
-    cleanup: function BasePdfManager_cleanup() {
-      return this.pdfDocument.cleanup();
-    },
-
-    ensure: function BasePdfManager_ensure(obj, prop, args) {
-      return new NotImplementedException();
-    },
-
-    requestRange: function BasePdfManager_ensure(begin, end) {
-      return new NotImplementedException();
-    },
-
-    requestLoadedStream: function BasePdfManager_requestLoadedStream() {
-      return new NotImplementedException();
-    },
-
-    sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) {
-      return new NotImplementedException();
-    },
-
-    updatePassword: function BasePdfManager_updatePassword(password) {
-      this.pdfDocument.xref.password = this.password = password;
-      if (this._passwordChangedCapability) {
-        this._passwordChangedCapability.resolve();
-      }
-    },
-
-    passwordChanged: function BasePdfManager_passwordChanged() {
-      this._passwordChangedCapability = createPromiseCapability();
-      return this._passwordChangedCapability.promise;
-    },
-
-    terminate: function BasePdfManager_terminate() {
-      return new NotImplementedException();
-    }
-  };
-
-  return BasePdfManager;
-})();
-
-var LocalPdfManager = (function LocalPdfManagerClosure() {
-  function LocalPdfManager(data, password) {
-    var stream = new Stream(data);
-    this.pdfDocument = new PDFDocument(this, stream, password);
-    this._loadedStreamCapability = createPromiseCapability();
-    this._loadedStreamCapability.resolve(stream);
-  }
-
-  LocalPdfManager.prototype = Object.create(BasePdfManager.prototype);
-  LocalPdfManager.prototype.constructor = LocalPdfManager;
-
-  LocalPdfManager.prototype.ensure =
-      function LocalPdfManager_ensure(obj, prop, args) {
-    return new Promise(function (resolve, reject) {
-      try {
-        var value = obj[prop];
-        var result;
-        if (typeof value === 'function') {
-          result = value.apply(obj, args);
-        } else {
-          result = value;
-        }
-        resolve(result);
-      } catch (e) {
-        reject(e);
-      }
-    });
-  };
-
-  LocalPdfManager.prototype.requestRange =
-      function LocalPdfManager_requestRange(begin, end) {
-    return Promise.resolve();
-  };
-
-  LocalPdfManager.prototype.requestLoadedStream =
-      function LocalPdfManager_requestLoadedStream() {
-  };
-
-  LocalPdfManager.prototype.onLoadedStream =
-      function LocalPdfManager_getLoadedStream() {
-    return this._loadedStreamCapability.promise;
-  };
-
-  LocalPdfManager.prototype.terminate =
-      function LocalPdfManager_terminate() {
-    return;
-  };
-
-  return LocalPdfManager;
-})();
-
-var NetworkPdfManager = (function NetworkPdfManagerClosure() {
-  function NetworkPdfManager(args, msgHandler) {
-
-    this.msgHandler = msgHandler;
-
-    var params = {
-      msgHandler: msgHandler,
-      httpHeaders: args.httpHeaders,
-      withCredentials: args.withCredentials,
-      chunkedViewerLoading: args.chunkedViewerLoading,
-      disableAutoFetch: args.disableAutoFetch,
-      initialData: args.initialData
-    };
-    this.streamManager = new ChunkedStreamManager(args.length, RANGE_CHUNK_SIZE,
-                                                  args.url, params);
-
-    this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(),
-                                    args.password);
-  }
-
-  NetworkPdfManager.prototype = Object.create(BasePdfManager.prototype);
-  NetworkPdfManager.prototype.constructor = NetworkPdfManager;
-
-  NetworkPdfManager.prototype.ensure =
-      function NetworkPdfManager_ensure(obj, prop, args) {
-    var pdfManager = this;
-
-    return new Promise(function (resolve, reject) {
-      function ensureHelper() {
-        try {
-          var result;
-          var value = obj[prop];
-          if (typeof value === 'function') {
-            result = value.apply(obj, args);
-          } else {
-            result = value;
-          }
-          resolve(result);
-        } catch(e) {
-          if (!(e instanceof MissingDataException)) {
-            reject(e);
-            return;
-          }
-          pdfManager.streamManager.requestRange(e.begin, e.end, ensureHelper);
-        }
-      }
-
-      ensureHelper();
-    });
-  };
-
-  NetworkPdfManager.prototype.requestRange =
-      function NetworkPdfManager_requestRange(begin, end) {
-    return new Promise(function (resolve) {
-      this.streamManager.requestRange(begin, end, function() {
-        resolve();
-      });
-    }.bind(this));
-  };
-
-  NetworkPdfManager.prototype.requestLoadedStream =
-      function NetworkPdfManager_requestLoadedStream() {
-    this.streamManager.requestAllChunks();
-  };
-
-  NetworkPdfManager.prototype.sendProgressiveData =
-      function NetworkPdfManager_sendProgressiveData(chunk) {
-    this.streamManager.onReceiveData({ chunk: chunk });
-  };
-
-  NetworkPdfManager.prototype.onLoadedStream =
-      function NetworkPdfManager_getLoadedStream() {
-    return this.streamManager.onLoadedStream();
-  };
-
-  NetworkPdfManager.prototype.terminate =
-      function NetworkPdfManager_terminate() {
-    this.streamManager.networkManager.abortAllRequests();
-  };
-
-  return NetworkPdfManager;
-})();
-
-
-var Page = (function PageClosure() {
-
-  var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];
-
-  function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) {
-    this.pdfManager = pdfManager;
-    this.pageIndex = pageIndex;
-    this.pageDict = pageDict;
-    this.xref = xref;
-    this.ref = ref;
-    this.fontCache = fontCache;
-    this.idCounters = {
-      obj: 0
-    };
-    this.resourcesPromise = null;
-  }
-
-  Page.prototype = {
-    getPageProp: function Page_getPageProp(key) {
-      return this.pageDict.get(key);
-    },
-
-    getInheritedPageProp: function Page_inheritPageProp(key) {
-      var dict = this.pageDict;
-      var value = dict.get(key);
-      while (value === undefined) {
-        dict = dict.get('Parent');
-        if (!dict) {
-          break;
-        }
-        value = dict.get(key);
-      }
-      return value;
-    },
-
-    get content() {
-      return this.getPageProp('Contents');
-    },
-
-    get resources() {
-      var value = this.getInheritedPageProp('Resources');
-      // For robustness: The spec states that a \Resources entry has to be
-      // present, but can be empty. Some document omit it still. In this case
-      // return an empty dictionary:
-      if (value === undefined) {
-        value = Dict.empty;
-      }
-      return shadow(this, 'resources', value);
-    },
-
-    get mediaBox() {
-      var obj = this.getInheritedPageProp('MediaBox');
-      // Reset invalid media box to letter size.
-      if (!isArray(obj) || obj.length !== 4) {
-        obj = LETTER_SIZE_MEDIABOX;
-      }
-      return shadow(this, 'mediaBox', obj);
-    },
-
-    get view() {
-      var mediaBox = this.mediaBox;
-      var cropBox = this.getInheritedPageProp('CropBox');
-      if (!isArray(cropBox) || cropBox.length !== 4) {
-        return shadow(this, 'view', mediaBox);
-      }
-
-      // From the spec, 6th ed., p.963:
-      // "The crop, bleed, trim, and art boxes should not ordinarily
-      // extend beyond the boundaries of the media box. If they do, they are
-      // effectively reduced to their intersection with the media box."
-      cropBox = Util.intersect(cropBox, mediaBox);
-      if (!cropBox) {
-        return shadow(this, 'view', mediaBox);
-      }
-      return shadow(this, 'view', cropBox);
-    },
-
-    get annotationRefs() {
-      return shadow(this, 'annotationRefs',
-                    this.getInheritedPageProp('Annots'));
-    },
-
-    get rotate() {
-      var rotate = this.getInheritedPageProp('Rotate') || 0;
-      // Normalize rotation so it's a multiple of 90 and between 0 and 270
-      if (rotate % 90 !== 0) {
-        rotate = 0;
-      } else if (rotate >= 360) {
-        rotate = rotate % 360;
-      } else if (rotate < 0) {
-        // The spec doesn't cover negatives, assume its counterclockwise
-        // rotation. The following is the other implementation of modulo.
-        rotate = ((rotate % 360) + 360) % 360;
-      }
-      return shadow(this, 'rotate', rotate);
-    },
-
-    getContentStream: function Page_getContentStream() {
-      var content = this.content;
-      var stream;
-      if (isArray(content)) {
-        // fetching items
-        var xref = this.xref;
-        var i, n = content.length;
-        var streams = [];
-        for (i = 0; i < n; ++i) {
-          streams.push(xref.fetchIfRef(content[i]));
-        }
-        stream = new StreamsSequenceStream(streams);
-      } else if (isStream(content)) {
-        stream = content;
-      } else {
-        // replacing non-existent page content with empty one
-        stream = new NullStream();
-      }
-      return stream;
-    },
-
-    loadResources: function Page_loadResources(keys) {
-      if (!this.resourcesPromise) {
-        // TODO: add async getInheritedPageProp and remove this.
-        this.resourcesPromise = this.pdfManager.ensure(this, 'resources');
-      }
-      return this.resourcesPromise.then(function resourceSuccess() {
-        var objectLoader = new ObjectLoader(this.resources.map,
-                                            keys,
-                                            this.xref);
-        return objectLoader.load();
-      }.bind(this));
-    },
-
-    getOperatorList: function Page_getOperatorList(handler, intent) {
-      var self = this;
-
-      var pdfManager = this.pdfManager;
-      var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
-                                                   []);
-      var resourcesPromise = this.loadResources([
-        'ExtGState',
-        'ColorSpace',
-        'Pattern',
-        'Shading',
-        'XObject',
-        'Font'
-        // ProcSet
-        // Properties
-      ]);
-
-      var partialEvaluator = new PartialEvaluator(pdfManager, this.xref,
-                                                  handler, this.pageIndex,
-                                                  'p' + this.pageIndex + '_',
-                                                  this.idCounters,
-                                                  this.fontCache);
-
-      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);
-      var pageListPromise = dataPromises.then(function(data) {
-        var contentStream = data[0];
-        var opList = new OperatorList(intent, handler, self.pageIndex);
-
-        handler.send('StartRenderPage', {
-          transparency: partialEvaluator.hasBlendModes(self.resources),
-          pageIndex: self.pageIndex,
-          intent: intent
-        });
-        return partialEvaluator.getOperatorList(contentStream, self.resources,
-          opList).then(function () {
-            return opList;
-          });
-      });
-
-      var annotationsPromise = pdfManager.ensure(this, 'annotations');
-      return Promise.all([pageListPromise, annotationsPromise]).then(
-          function(datas) {
-        var pageOpList = datas[0];
-        var annotations = datas[1];
-
-        if (annotations.length === 0) {
-          pageOpList.flush(true);
-          return pageOpList;
-        }
-
-        var annotationsReadyPromise = Annotation.appendToOperatorList(
-          annotations, pageOpList, pdfManager, partialEvaluator, intent);
-        return annotationsReadyPromise.then(function () {
-          pageOpList.flush(true);
-          return pageOpList;
-        });
-      });
-    },
-
-    extractTextContent: function Page_extractTextContent() {
-      var handler = {
-        on: function nullHandlerOn() {},
-        send: function nullHandlerSend() {}
-      };
-
-      var self = this;
-
-      var pdfManager = this.pdfManager;
-      var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
-                                                   []);
-
-      var resourcesPromise = this.loadResources([
-        'ExtGState',
-        'XObject',
-        'Font'
-      ]);
-
-      var dataPromises = Promise.all([contentStreamPromise,
-                                      resourcesPromise]);
-      return dataPromises.then(function(data) {
-        var contentStream = data[0];
-        var partialEvaluator = new PartialEvaluator(pdfManager, self.xref,
-                                                    handler, self.pageIndex,
-                                                    'p' + self.pageIndex + '_',
-                                                    self.idCounters,
-                                                    self.fontCache);
-
-        return partialEvaluator.getTextContent(contentStream,
-                                               self.resources);
-      });
-    },
-
-    getAnnotationsData: function Page_getAnnotationsData() {
-      var annotations = this.annotations;
-      var annotationsData = [];
-      for (var i = 0, n = annotations.length; i < n; ++i) {
-        annotationsData.push(annotations[i].getData());
-      }
-      return annotationsData;
-    },
-
-    get annotations() {
-      var annotations = [];
-      var annotationRefs = (this.annotationRefs || []);
-      for (var i = 0, n = annotationRefs.length; i < n; ++i) {
-        var annotationRef = annotationRefs[i];
-        var annotation = Annotation.fromRef(this.xref, annotationRef);
-        if (annotation) {
-          annotations.push(annotation);
-        }
-      }
-      return shadow(this, 'annotations', annotations);
-    }
-  };
-
-  return Page;
-})();
-
-/**
- * The `PDFDocument` holds all the data of the PDF file. Compared to the
- * `PDFDoc`, this one doesn't have any job management code.
- * Right now there exists one PDFDocument on the main thread + one object
- * for each worker. If there is no worker support enabled, there are two
- * `PDFDocument` objects on the main thread created.
- */
-var PDFDocument = (function PDFDocumentClosure() {
-  var FINGERPRINT_FIRST_BYTES = 1024;
-  var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' +
-    '\x00\x00\x00\x00\x00\x00\x00\x00\x00';
-
-  function PDFDocument(pdfManager, arg, password) {
-    if (isStream(arg)) {
-      init.call(this, pdfManager, arg, password);
-    } else if (isArrayBuffer(arg)) {
-      init.call(this, pdfManager, new Stream(arg), password);
-    } else {
-      error('PDFDocument: Unknown argument type');
-    }
-  }
-
-  function init(pdfManager, stream, password) {
-    assert(stream.length > 0, 'stream must have data');
-    this.pdfManager = pdfManager;
-    this.stream = stream;
-    var xref = new XRef(this.stream, password, pdfManager);
-    this.xref = xref;
-  }
-
-  function find(stream, needle, limit, backwards) {
-    var pos = stream.pos;
-    var end = stream.end;
-    var strBuf = [];
-    if (pos + limit > end) {
-      limit = end - pos;
-    }
-    for (var n = 0; n < limit; ++n) {
-      strBuf.push(String.fromCharCode(stream.getByte()));
-    }
-    var str = strBuf.join('');
-    stream.pos = pos;
-    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
-    if (index === -1) {
-      return false; /* not found */
-    }
-    stream.pos += index;
-    return true; /* found */
-  }
-
-  var DocumentInfoValidators = {
-    get entries() {
-      // Lazily build this since all the validation functions below are not
-      // defined until after this file loads.
-      return shadow(this, 'entries', {
-        Title: isString,
-        Author: isString,
-        Subject: isString,
-        Keywords: isString,
-        Creator: isString,
-        Producer: isString,
-        CreationDate: isString,
-        ModDate: isString,
-        Trapped: isName
-      });
-    }
-  };
-
-  PDFDocument.prototype = {
-    parse: function PDFDocument_parse(recoveryMode) {
-      this.setup(recoveryMode);
-      try {
-        // checking if AcroForm is present
-        this.acroForm = this.catalog.catDict.get('AcroForm');
-        if (this.acroForm) {
-          this.xfa = this.acroForm.get('XFA');
-          var fields = this.acroForm.get('Fields');
-          if ((!fields || !isArray(fields) || fields.length === 0) &&
-              !this.xfa) {
-            // no fields and no XFA -- not a form (?)
-            this.acroForm = null;
-          }
-        }
-      } catch (ex) {
-        info('Something wrong with AcroForm entry');
-        this.acroForm = null;
-      }
-    },
-
-    get linearization() {
-      var linearization = null;
-      if (this.stream.length) {
-        try {
-          linearization = Linearization.create(this.stream);
-        } catch (err) {
-          if (err instanceof MissingDataException) {
-            throw err;
-          }
-          info(err);
-        }
-      }
-      // shadow the prototype getter with a data property
-      return shadow(this, 'linearization', linearization);
-    },
-    get startXRef() {
-      var stream = this.stream;
-      var startXRef = 0;
-      var linearization = this.linearization;
-      if (linearization) {
-        // Find end of first obj.
-        stream.reset();
-        if (find(stream, 'endobj', 1024)) {
-          startXRef = stream.pos + 6;
-        }
-      } else {
-        // Find startxref by jumping backward from the end of the file.
-        var step = 1024;
-        var found = false, pos = stream.end;
-        while (!found && pos > 0) {
-          pos -= step - 'startxref'.length;
-          if (pos < 0) {
-            pos = 0;
-          }
-          stream.pos = pos;
-          found = find(stream, 'startxref', step, true);
-        }
-        if (found) {
-          stream.skip(9);
-          var ch;
-          do {
-            ch = stream.getByte();
-          } while (Lexer.isSpace(ch));
-          var str = '';
-          while (ch >= 0x20 && ch <= 0x39) { // < '9'
-            str += String.fromCharCode(ch);
-            ch = stream.getByte();
-          }
-          startXRef = parseInt(str, 10);
-          if (isNaN(startXRef)) {
-            startXRef = 0;
-          }
-        }
-      }
-      // shadow the prototype getter with a data property
-      return shadow(this, 'startXRef', startXRef);
-    },
-    get mainXRefEntriesOffset() {
-      var mainXRefEntriesOffset = 0;
-      var linearization = this.linearization;
-      if (linearization) {
-        mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
-      }
-      // shadow the prototype getter with a data property
-      return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
-    },
-    // Find the header, remove leading garbage and setup the stream
-    // starting from the header.
-    checkHeader: function PDFDocument_checkHeader() {
-      var stream = this.stream;
-      stream.reset();
-      if (find(stream, '%PDF-', 1024)) {
-        // Found the header, trim off any garbage before it.
-        stream.moveStart();
-        // Reading file format version
-        var MAX_VERSION_LENGTH = 12;
-        var version = '', ch;
-        while ((ch = stream.getByte()) > 0x20) { // SPACE
-          if (version.length >= MAX_VERSION_LENGTH) {
-            break;
-          }
-          version += String.fromCharCode(ch);
-        }
-        // removing "%PDF-"-prefix
-        this.pdfFormatVersion = version.substring(5);
-        return;
-      }
-      // May not be a PDF file, continue anyway.
-    },
-    parseStartXRef: function PDFDocument_parseStartXRef() {
-      var startXRef = this.startXRef;
-      this.xref.setStartXRef(startXRef);
-    },
-    setup: function PDFDocument_setup(recoveryMode) {
-      this.xref.parse(recoveryMode);
-      this.catalog = new Catalog(this.pdfManager, this.xref);
-    },
-    get numPages() {
-      var linearization = this.linearization;
-      var num = linearization ? linearization.numPages : this.catalog.numPages;
-      // shadow the prototype getter
-      return shadow(this, 'numPages', num);
-    },
-    get documentInfo() {
-      var docInfo = {
-        PDFFormatVersion: this.pdfFormatVersion,
-        IsAcroFormPresent: !!this.acroForm,
-        IsXFAPresent: !!this.xfa
-      };
-      var infoDict;
-      try {
-        infoDict = this.xref.trailer.get('Info');
-      } catch (err) {
-        info('The document information dictionary is invalid.');
-      }
-      if (infoDict) {
-        var validEntries = DocumentInfoValidators.entries;
-        // Only fill the document info with valid entries from the spec.
-        for (var key in validEntries) {
-          if (infoDict.has(key)) {
-            var value = infoDict.get(key);
-            // Make sure the value conforms to the spec.
-            if (validEntries[key](value)) {
-              docInfo[key] = (typeof value !== 'string' ?
-                              value : stringToPDFString(value));
-            } else {
-              info('Bad value in document info for "' + key + '"');
-            }
-          }
-        }
-      }
-      return shadow(this, 'documentInfo', docInfo);
-    },
-    get fingerprint() {
-      var xref = this.xref, idArray, hash, fileID = '';
-
-      if (xref.trailer.has('ID')) {
-        idArray = xref.trailer.get('ID');
-      }
-      if (idArray && isArray(idArray) && idArray[0] !== EMPTY_FINGERPRINT) {
-        hash = stringToBytes(idArray[0]);
-      } else {
-        if (this.stream.ensureRange) {
-          this.stream.ensureRange(0,
-            Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end));
-        }
-        hash = calculateMD5(this.stream.bytes.subarray(0,
-          FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);
-      }
-
-      for (var i = 0, n = hash.length; i < n; i++) {
-        var hex = hash[i].toString(16);
-        fileID += hex.length === 1 ? '0' + hex : hex;
-      }
-
-      return shadow(this, 'fingerprint', fileID);
-    },
-
-    getPage: function PDFDocument_getPage(pageIndex) {
-      return this.catalog.getPage(pageIndex);
-    },
-
-    cleanup: function PDFDocument_cleanup() {
-      return this.catalog.cleanup();
-    }
-  };
-
-  return PDFDocument;
-})();
-
-
-var Name = (function NameClosure() {
-  function Name(name) {
-    this.name = name;
-  }
-
-  Name.prototype = {};
-
-  var nameCache = {};
-
-  Name.get = function Name_get(name) {
-    var nameValue = nameCache[name];
-    return (nameValue ? nameValue : (nameCache[name] = new Name(name)));
-  };
-
-  return Name;
-})();
-
-var Cmd = (function CmdClosure() {
-  function Cmd(cmd) {
-    this.cmd = cmd;
-  }
-
-  Cmd.prototype = {};
-
-  var cmdCache = {};
-
-  Cmd.get = function Cmd_get(cmd) {
-    var cmdValue = cmdCache[cmd];
-    return (cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd)));
-  };
-
-  return Cmd;
-})();
-
-var Dict = (function DictClosure() {
-  var nonSerializable = function nonSerializableClosure() {
-    return nonSerializable; // creating closure on some variable
-  };
-
-  var GETALL_DICTIONARY_TYPES_WHITELIST = {
-    'Background': true,
-    'ExtGState': true,
-    'Halftone': true,
-    'Layout': true,
-    'Mask': true,
-    'Pagination': true,
-    'Printing': true
-  };
-
-  function isRecursionAllowedFor(dict) {
-    if (!isName(dict.Type)) {
-      return true;
-    }
-    var dictType = dict.Type.name;
-    return GETALL_DICTIONARY_TYPES_WHITELIST[dictType] === true;
-  }
-
-  // xref is optional
-  function Dict(xref) {
-    // Map should only be used internally, use functions below to access.
-    this.map = Object.create(null);
-    this.xref = xref;
-    this.objId = null;
-    this.__nonSerializable__ = nonSerializable; // disable cloning of the Dict
-  }
-
-  Dict.prototype = {
-    assignXref: function Dict_assignXref(newXref) {
-      this.xref = newXref;
-    },
-
-    // automatically dereferences Ref objects
-    get: function Dict_get(key1, key2, key3) {
-      var value;
-      var xref = this.xref;
-      if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map ||
-          typeof key2 === 'undefined') {
-        return xref ? xref.fetchIfRef(value) : value;
-      }
-      if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map ||
-          typeof key3 === 'undefined') {
-        return xref ? xref.fetchIfRef(value) : value;
-      }
-      value = this.map[key3] || null;
-      return xref ? xref.fetchIfRef(value) : value;
-    },
-
-    // Same as get(), but returns a promise and uses fetchIfRefAsync().
-    getAsync: function Dict_getAsync(key1, key2, key3) {
-      var value;
-      var xref = this.xref;
-      if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map ||
-          typeof key2 === 'undefined') {
-        if (xref) {
-          return xref.fetchIfRefAsync(value);
-        }
-        return Promise.resolve(value);
-      }
-      if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map ||
-          typeof key3 === 'undefined') {
-        if (xref) {
-          return xref.fetchIfRefAsync(value);
-        }
-        return Promise.resolve(value);
-      }
-      value = this.map[key3] || null;
-      if (xref) {
-        return xref.fetchIfRefAsync(value);
-      }
-      return Promise.resolve(value);
-    },
-
-    // no dereferencing
-    getRaw: function Dict_getRaw(key) {
-      return this.map[key];
-    },
-
-    // creates new map and dereferences all Refs
-    getAll: function Dict_getAll() {
-      var all = Object.create(null);
-      var queue = null;
-      var key, obj;
-      for (key in this.map) {
-        obj = this.get(key);
-        if (obj instanceof Dict) {
-          if (isRecursionAllowedFor(obj)) {
-            (queue || (queue = [])).push({target: all, key: key, obj: obj});
-          } else {
-            all[key] = this.getRaw(key);
-          }
-        } else {
-          all[key] = obj;
-        }
-      }
-      if (!queue) {
-        return all;
-      }
-
-      // trying to take cyclic references into the account
-      var processed = Object.create(null);
-      while (queue.length > 0) {
-        var item = queue.shift();
-        var itemObj = item.obj;
-        var objId = itemObj.objId;
-        if (objId && objId in processed) {
-          item.target[item.key] = processed[objId];
-          continue;
-        }
-        var dereferenced = Object.create(null);
-        for (key in itemObj.map) {
-          obj = itemObj.get(key);
-          if (obj instanceof Dict) {
-            if (isRecursionAllowedFor(obj)) {
-              queue.push({target: dereferenced, key: key, obj: obj});
-            } else {
-              dereferenced[key] = itemObj.getRaw(key);
-            }
-          } else {
-            dereferenced[key] = obj;
-          }
-        }
-        if (objId) {
-          processed[objId] = dereferenced;
-        }
-        item.target[item.key] = dereferenced;
-      }
-      return all;
-    },
-
-    getKeys: function Dict_getKeys() {
-      return Object.keys(this.map);
-    },
-
-    set: function Dict_set(key, value) {
-      this.map[key] = value;
-    },
-
-    has: function Dict_has(key) {
-      return key in this.map;
-    },
-
-    forEach: function Dict_forEach(callback) {
-      for (var key in this.map) {
-        callback(key, this.get(key));
-      }
-    }
-  };
-
-  Dict.empty = new Dict(null);
-
-  return Dict;
-})();
-
-var Ref = (function RefClosure() {
-  function Ref(num, gen) {
-    this.num = num;
-    this.gen = gen;
-  }
-
-  Ref.prototype = {
-    toString: function Ref_toString() {
-      // This function is hot, so we make the string as compact as possible.
-      // |this.gen| is almost always zero, so we treat that case specially.
-      var str = this.num + 'R';
-      if (this.gen !== 0) {
-        str += this.gen;
-      }
-      return str;
-    }
-  };
-
-  return Ref;
-})();
-
-// The reference is identified by number and generation.
-// This structure stores only one instance of the reference.
-var RefSet = (function RefSetClosure() {
-  function RefSet() {
-    this.dict = {};
-  }
-
-  RefSet.prototype = {
-    has: function RefSet_has(ref) {
-      return ref.toString() in this.dict;
-    },
-
-    put: function RefSet_put(ref) {
-      this.dict[ref.toString()] = true;
-    },
-
-    remove: function RefSet_remove(ref) {
-      delete this.dict[ref.toString()];
-    }
-  };
-
-  return RefSet;
-})();
-
-var RefSetCache = (function RefSetCacheClosure() {
-  function RefSetCache() {
-    this.dict = Object.create(null);
-  }
-
-  RefSetCache.prototype = {
-    get: function RefSetCache_get(ref) {
-      return this.dict[ref.toString()];
-    },
-
-    has: function RefSetCache_has(ref) {
-      return ref.toString() in this.dict;
-    },
-
-    put: function RefSetCache_put(ref, obj) {
-      this.dict[ref.toString()] = obj;
-    },
-
-    putAlias: function RefSetCache_putAlias(ref, aliasRef) {
-      this.dict[ref.toString()] = this.get(aliasRef);
-    },
-
-    forEach: function RefSetCache_forEach(fn, thisArg) {
-      for (var i in this.dict) {
-        fn.call(thisArg, this.dict[i]);
-      }
-    },
-
-    clear: function RefSetCache_clear() {
-      this.dict = Object.create(null);
-    }
-  };
-
-  return RefSetCache;
-})();
-
-var Catalog = (function CatalogClosure() {
-  function Catalog(pdfManager, xref) {
-    this.pdfManager = pdfManager;
-    this.xref = xref;
-    this.catDict = xref.getCatalogObj();
-    this.fontCache = new RefSetCache();
-    assert(isDict(this.catDict),
-      'catalog object is not a dictionary');
-
-    this.pagePromises = [];
-  }
-
-  Catalog.prototype = {
-    get metadata() {
-      var streamRef = this.catDict.getRaw('Metadata');
-      if (!isRef(streamRef)) {
-        return shadow(this, 'metadata', null);
-      }
-
-      var encryptMetadata = (!this.xref.encrypt ? false :
-                             this.xref.encrypt.encryptMetadata);
-
-      var stream = this.xref.fetch(streamRef, !encryptMetadata);
-      var metadata;
-      if (stream && isDict(stream.dict)) {
-        var type = stream.dict.get('Type');
-        var subtype = stream.dict.get('Subtype');
-
-        if (isName(type) && isName(subtype) &&
-            type.name === 'Metadata' && subtype.name === 'XML') {
-          // XXX: This should examine the charset the XML document defines,
-          // however since there are currently no real means to decode
-          // arbitrary charsets, let's just hope that the author of the PDF
-          // was reasonable enough to stick with the XML default charset,
-          // which is UTF-8.
-          try {
-            metadata = stringToUTF8String(bytesToString(stream.getBytes()));
-          } catch (e) {
-            info('Skipping invalid metadata.');
-          }
-        }
-      }
-
-      return shadow(this, 'metadata', metadata);
-    },
-    get toplevelPagesDict() {
-      var pagesObj = this.catDict.get('Pages');
-      assert(isDict(pagesObj), 'invalid top-level pages dictionary');
-      // shadow the prototype getter
-      return shadow(this, 'toplevelPagesDict', pagesObj);
-    },
-    get documentOutline() {
-      var obj = null;
-      try {
-        obj = this.readDocumentOutline();
-      } catch (ex) {
-        if (ex instanceof MissingDataException) {
-          throw ex;
-        }
-        warn('Unable to read document outline');
-      }
-      return shadow(this, 'documentOutline', obj);
-    },
-    readDocumentOutline: function Catalog_readDocumentOutline() {
-      var xref = this.xref;
-      var obj = this.catDict.get('Outlines');
-      var root = { items: [] };
-      if (isDict(obj)) {
-        obj = obj.getRaw('First');
-        var processed = new RefSet();
-        if (isRef(obj)) {
-          var queue = [{obj: obj, parent: root}];
-          // to avoid recursion keeping track of the items
-          // in the processed dictionary
-          processed.put(obj);
-          while (queue.length > 0) {
-            var i = queue.shift();
-            var outlineDict = xref.fetchIfRef(i.obj);
-            if (outlineDict === null) {
-              continue;
-            }
-            if (!outlineDict.has('Title')) {
-              error('Invalid outline item');
-            }
-            var dest = outlineDict.get('A');
-            if (dest) {
-              dest = dest.get('D');
-            } else if (outlineDict.has('Dest')) {
-              dest = outlineDict.getRaw('Dest');
-              if (isName(dest)) {
-                dest = dest.name;
-              }
-            }
-            var title = outlineDict.get('Title');
-            var outlineItem = {
-              dest: dest,
-              title: stringToPDFString(title),
-              color: outlineDict.get('C') || [0, 0, 0],
-              count: outlineDict.get('Count'),
-              bold: !!(outlineDict.get('F') & 2),
-              italic: !!(outlineDict.get('F') & 1),
-              items: []
-            };
-            i.parent.items.push(outlineItem);
-            obj = outlineDict.getRaw('First');
-            if (isRef(obj) && !processed.has(obj)) {
-              queue.push({obj: obj, parent: outlineItem});
-              processed.put(obj);
-            }
-            obj = outlineDict.getRaw('Next');
-            if (isRef(obj) && !processed.has(obj)) {
-              queue.push({obj: obj, parent: i.parent});
-              processed.put(obj);
-            }
-          }
-        }
-      }
-      return (root.items.length > 0 ? root.items : null);
-    },
-    get numPages() {
-      var obj = this.toplevelPagesDict.get('Count');
-      assert(
-        isInt(obj),
-        'page count in top level pages object is not an integer'
-      );
-      // shadow the prototype getter
-      return shadow(this, 'num', obj);
-    },
-    get destinations() {
-      function fetchDestination(dest) {
-        return isDict(dest) ? dest.get('D') : dest;
-      }
-
-      var xref = this.xref;
-      var dests = {}, nameTreeRef, nameDictionaryRef;
-      var obj = this.catDict.get('Names');
-      if (obj && obj.has('Dests')) {
-        nameTreeRef = obj.getRaw('Dests');
-      } else if (this.catDict.has('Dests')) {
-        nameDictionaryRef = this.catDict.get('Dests');
-      }
-
-      if (nameDictionaryRef) {
-        // reading simple destination dictionary
-        obj = nameDictionaryRef;
-        obj.forEach(function catalogForEach(key, value) {
-          if (!value) {
-            return;
-          }
-          dests[key] = fetchDestination(value);
-        });
-      }
-      if (nameTreeRef) {
-        var nameTree = new NameTree(nameTreeRef, xref);
-        var names = nameTree.getAll();
-        for (var name in names) {
-          if (!names.hasOwnProperty(name)) {
-            continue;
-          }
-          dests[name] = fetchDestination(names[name]);
-        }
-      }
-      return shadow(this, 'destinations', dests);
-    },
-    getDestination: function Catalog_getDestination(destinationId) {
-      function fetchDestination(dest) {
-        return isDict(dest) ? dest.get('D') : dest;
-      }
-
-      var xref = this.xref;
-      var dest, nameTreeRef, nameDictionaryRef;
-      var obj = this.catDict.get('Names');
-      if (obj && obj.has('Dests')) {
-        nameTreeRef = obj.getRaw('Dests');
-      } else if (this.catDict.has('Dests')) {
-        nameDictionaryRef = this.catDict.get('Dests');
-      }
-
-      if (nameDictionaryRef) {
-        // reading simple destination dictionary
-        obj = nameDictionaryRef;
-        obj.forEach(function catalogForEach(key, value) {
-          if (!value) {
-            return;
-          }
-          if (key === destinationId) {
-            dest = fetchDestination(value);
-          }
-        });
-      }
-      if (nameTreeRef) {
-        var nameTree = new NameTree(nameTreeRef, xref);
-        dest = fetchDestination(nameTree.get(destinationId));
-      }
-      return dest;
-    },
-    get attachments() {
-      var xref = this.xref;
-      var attachments = null, nameTreeRef;
-      var obj = this.catDict.get('Names');
-      if (obj) {
-        nameTreeRef = obj.getRaw('EmbeddedFiles');
-      }
-
-      if (nameTreeRef) {
-        var nameTree = new NameTree(nameTreeRef, xref);
-        var names = nameTree.getAll();
-        for (var name in names) {
-          if (!names.hasOwnProperty(name)) {
-            continue;
-          }
-          var fs = new FileSpec(names[name], xref);
-          if (!attachments) {
-            attachments = {};
-          }
-          attachments[stringToPDFString(name)] = fs.serializable;
-        }
-      }
-      return shadow(this, 'attachments', attachments);
-    },
-    get javaScript() {
-      var xref = this.xref;
-      var obj = this.catDict.get('Names');
-
-      var javaScript = [];
-      if (obj && obj.has('JavaScript')) {
-        var nameTree = new NameTree(obj.getRaw('JavaScript'), xref);
-        var names = nameTree.getAll();
-        for (var name in names) {
-          if (!names.hasOwnProperty(name)) {
-            continue;
-          }
-          // We don't really use the JavaScript right now. This code is
-          // defensive so we don't cause errors on document load.
-          var jsDict = names[name];
-          if (!isDict(jsDict)) {
-            continue;
-          }
-          var type = jsDict.get('S');
-          if (!isName(type) || type.name !== 'JavaScript') {
-            continue;
-          }
-          var js = jsDict.get('JS');
-          if (!isString(js) && !isStream(js)) {
-            continue;
-          }
-          if (isStream(js)) {
-            js = bytesToString(js.getBytes());
-          }
-          javaScript.push(stringToPDFString(js));
-        }
-      }
-
-      // Append OpenAction actions to javaScript array
-      var openactionDict = this.catDict.get('OpenAction');
-      if (isDict(openactionDict)) {
-        var objType = openactionDict.get('Type');
-        var actionType = openactionDict.get('S');
-        var action = openactionDict.get('N');
-        var isPrintAction = (isName(objType) && objType.name === 'Action' &&
-                            isName(actionType) && actionType.name === 'Named' &&
-                            isName(action) && action.name === 'Print');
-
-        if (isPrintAction) {
-          javaScript.push('print(true);');
-        }
-      }
-
-      return shadow(this, 'javaScript', javaScript);
-    },
-
-    cleanup: function Catalog_cleanup() {
-      var promises = [];
-      this.fontCache.forEach(function (promise) {
-        promises.push(promise);
-      });
-      return Promise.all(promises).then(function (translatedFonts) {
-        for (var i = 0, ii = translatedFonts.length; i < ii; i++) {
-          var font = translatedFonts[i].dict;
-          delete font.translated;
-        }
-        this.fontCache.clear();
-      }.bind(this));
-    },
-
-    getPage: function Catalog_getPage(pageIndex) {
-      if (!(pageIndex in this.pagePromises)) {
-        this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(
-          function (a) {
-            var dict = a[0];
-            var ref = a[1];
-            return new Page(this.pdfManager, this.xref, pageIndex, dict, ref,
-                            this.fontCache);
-          }.bind(this)
-        );
-      }
-      return this.pagePromises[pageIndex];
-    },
-
-    getPageDict: function Catalog_getPageDict(pageIndex) {
-      var capability = createPromiseCapability();
-      var nodesToVisit = [this.catDict.getRaw('Pages')];
-      var currentPageIndex = 0;
-      var xref = this.xref;
-      var checkAllKids = false;
-
-      function next() {
-        while (nodesToVisit.length) {
-          var currentNode = nodesToVisit.pop();
-
-          if (isRef(currentNode)) {
-            xref.fetchAsync(currentNode).then(function (obj) {
-              if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {
-                if (pageIndex === currentPageIndex) {
-                  capability.resolve([obj, currentNode]);
-                } else {
-                  currentPageIndex++;
-                  next();
-                }
-                return;
-              }
-              nodesToVisit.push(obj);
-              next();
-            }, capability.reject);
-            return;
-          }
-
-          // Must be a child page dictionary.
-          assert(
-            isDict(currentNode),
-            'page dictionary kid reference points to wrong type of object'
-          );
-          var count = currentNode.get('Count');
-          // If the current node doesn't have any children, avoid getting stuck
-          // in an empty node further down in the tree (see issue5644.pdf).
-          if (count === 0) {
-            checkAllKids = true;
-          }
-          // Skip nodes where the page can't be.
-          if (currentPageIndex + count <= pageIndex) {
-            currentPageIndex += count;
-            continue;
-          }
-
-          var kids = currentNode.get('Kids');
-          assert(isArray(kids), 'page dictionary kids object is not an array');
-          if (!checkAllKids && count === kids.length) {
-            // Nodes that don't have the page have been skipped and this is the
-            // bottom of the tree which means the page requested must be a
-            // descendant of this pages node. Ideally we would just resolve the
-            // promise with the page ref here, but there is the case where more
-            // pages nodes could link to single a page (see issue 3666 pdf). To
-            // handle this push it back on the queue so if it is a pages node it
-            // will be descended into.
-            nodesToVisit = [kids[pageIndex - currentPageIndex]];
-            currentPageIndex = pageIndex;
-            continue;
-          } else {
-            for (var last = kids.length - 1; last >= 0; last--) {
-              nodesToVisit.push(kids[last]);
-            }
-          }
-        }
-        capability.reject('Page index ' + pageIndex + ' not found.');
-      }
-      next();
-      return capability.promise;
-    },
-
-    getPageIndex: function Catalog_getPageIndex(ref) {
-      // The page tree nodes have the count of all the leaves below them. To get
-      // how many pages are before we just have to walk up the tree and keep
-      // adding the count of siblings to the left of the node.
-      var xref = this.xref;
-      function pagesBeforeRef(kidRef) {
-        var total = 0;
-        var parentRef;
-        return xref.fetchAsync(kidRef).then(function (node) {
-          if (!node) {
-            return null;
-          }
-          parentRef = node.getRaw('Parent');
-          return node.getAsync('Parent');
-        }).then(function (parent) {
-          if (!parent) {
-            return null;
-          }
-          return parent.getAsync('Kids');
-        }).then(function (kids) {
-          if (!kids) {
-            return null;
-          }
-          var kidPromises = [];
-          var found = false;
-          for (var i = 0; i < kids.length; i++) {
-            var kid = kids[i];
-            assert(isRef(kid), 'kids must be a ref');
-            if (kid.num === kidRef.num) {
-              found = true;
-              break;
-            }
-            kidPromises.push(xref.fetchAsync(kid).then(function (kid) {
-              if (kid.has('Count')) {
-                var count = kid.get('Count');
-                total += count;
-              } else { // page leaf node
-                total++;
-              }
-            }));
-          }
-          if (!found) {
-            error('kid ref not found in parents kids');
-          }
-          return Promise.all(kidPromises).then(function () {
-            return [total, parentRef];
-          });
-        });
-      }
-
-      var total = 0;
-      function next(ref) {
-        return pagesBeforeRef(ref).then(function (args) {
-          if (!args) {
-            return total;
-          }
-          var count = args[0];
-          var parentRef = args[1];
-          total += count;
-          return next(parentRef);
-        });
-      }
-
-      return next(ref);
-    }
-  };
-
-  return Catalog;
-})();
-
-var XRef = (function XRefClosure() {
-  function XRef(stream, password) {
-    this.stream = stream;
-    this.entries = [];
-    this.xrefstms = {};
-    // prepare the XRef cache
-    this.cache = [];
-    this.password = password;
-    this.stats = {
-      streamTypes: [],
-      fontTypes: []
-    };
-  }
-
-  XRef.prototype = {
-    setStartXRef: function XRef_setStartXRef(startXRef) {
-      // Store the starting positions of xref tables as we process them
-      // so we can recover from missing data errors
-      this.startXRefQueue = [startXRef];
-    },
-
-    parse: function XRef_parse(recoveryMode) {
-      var trailerDict;
-      if (!recoveryMode) {
-        trailerDict = this.readXRef();
-      } else {
-        warn('Indexing all PDF objects');
-        trailerDict = this.indexObjects();
-      }
-      trailerDict.assignXref(this);
-      this.trailer = trailerDict;
-      var encrypt = trailerDict.get('Encrypt');
-      if (encrypt) {
-        var ids = trailerDict.get('ID');
-        var fileId = (ids && ids.length) ? ids[0] : '';
-        this.encrypt = new CipherTransformFactory(encrypt, fileId,
-                                                  this.password);
-      }
-
-      // get the root dictionary (catalog) object
-      if (!(this.root = trailerDict.get('Root'))) {
-        error('Invalid root reference');
-      }
-    },
-
-    processXRefTable: function XRef_processXRefTable(parser) {
-      if (!('tableState' in this)) {
-        // Stores state of the table as we process it so we can resume
-        // from middle of table in case of missing data error
-        this.tableState = {
-          entryNum: 0,
-          streamPos: parser.lexer.stream.pos,
-          parserBuf1: parser.buf1,
-          parserBuf2: parser.buf2
-        };
-      }
-
-      var obj = this.readXRefTable(parser);
-
-      // Sanity check
-      if (!isCmd(obj, 'trailer')) {
-        error('Invalid XRef table: could not find trailer dictionary');
-      }
-      // Read trailer dictionary, e.g.
-      // trailer
-      //    << /Size 22
-      //      /Root 20R
-      //      /Info 10R
-      //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
-      //    >>
-      // The parser goes through the entire stream << ... >> and provides
-      // a getter interface for the key-value table
-      var dict = parser.getObj();
-
-      // The pdflib PDF generator can generate a nested trailer dictionary
-      if (!isDict(dict) && dict.dict) {
-        dict = dict.dict;
-      }
-      if (!isDict(dict)) {
-        error('Invalid XRef table: could not parse trailer dictionary');
-      }
-      delete this.tableState;
-
-      return dict;
-    },
-
-    readXRefTable: function XRef_readXRefTable(parser) {
-      // Example of cross-reference table:
-      // xref
-      // 0 1                    <-- subsection header (first obj #, obj count)
-      // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)
-      // 23 2                   <-- subsection header ... and so on ...
-      // 0000025518 00002 n
-      // 0000025635 00000 n
-      // trailer
-      // ...
-
-      var stream = parser.lexer.stream;
-      var tableState = this.tableState;
-      stream.pos = tableState.streamPos;
-      parser.buf1 = tableState.parserBuf1;
-      parser.buf2 = tableState.parserBuf2;
-
-      // Outer loop is over subsection headers
-      var obj;
-
-      while (true) {
-        if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {
-          if (isCmd(obj = parser.getObj(), 'trailer')) {
-            break;
-          }
-          tableState.firstEntryNum = obj;
-          tableState.entryCount = parser.getObj();
-        }
-
-        var first = tableState.firstEntryNum;
-        var count = tableState.entryCount;
-        if (!isInt(first) || !isInt(count)) {
-          error('Invalid XRef table: wrong types in subsection header');
-        }
-        // Inner loop is over objects themselves
-        for (var i = tableState.entryNum; i < count; i++) {
-          tableState.streamPos = stream.pos;
-          tableState.entryNum = i;
-          tableState.parserBuf1 = parser.buf1;
-          tableState.parserBuf2 = parser.buf2;
-
-          var entry = {};
-          entry.offset = parser.getObj();
-          entry.gen = parser.getObj();
-          var type = parser.getObj();
-
-          if (isCmd(type, 'f')) {
-            entry.free = true;
-          } else if (isCmd(type, 'n')) {
-            entry.uncompressed = true;
-          }
-
-          // Validate entry obj
-          if (!isInt(entry.offset) || !isInt(entry.gen) ||
-              !(entry.free || entry.uncompressed)) {
-            error('Invalid entry in XRef subsection: ' + first + ', ' + count);
-          }
-
-          if (!this.entries[i + first]) {
-            this.entries[i + first] = entry;
-          }
-        }
-
-        tableState.entryNum = 0;
-        tableState.streamPos = stream.pos;
-        tableState.parserBuf1 = parser.buf1;
-        tableState.parserBuf2 = parser.buf2;
-        delete tableState.firstEntryNum;
-        delete tableState.entryCount;
-      }
-
-      // Per issue 3248: hp scanners generate bad XRef
-      if (first === 1 && this.entries[1] && this.entries[1].free) {
-        // shifting the entries
-        this.entries.shift();
-      }
-
-      // Sanity check: as per spec, first object must be free
-      if (this.entries[0] && !this.entries[0].free) {
-        error('Invalid XRef table: unexpected first object');
-      }
-      return obj;
-    },
-
-    processXRefStream: function XRef_processXRefStream(stream) {
-      if (!('streamState' in this)) {
-        // Stores state of the stream as we process it so we can resume
-        // from middle of stream in case of missing data error
-        var streamParameters = stream.dict;
-        var byteWidths = streamParameters.get('W');
-        var range = streamParameters.get('Index');
-        if (!range) {
-          range = [0, streamParameters.get('Size')];
-        }
-
-        this.streamState = {
-          entryRanges: range,
-          byteWidths: byteWidths,
-          entryNum: 0,
-          streamPos: stream.pos
-        };
-      }
-      this.readXRefStream(stream);
-      delete this.streamState;
-
-      return stream.dict;
-    },
-
-    readXRefStream: function XRef_readXRefStream(stream) {
-      var i, j;
-      var streamState = this.streamState;
-      stream.pos = streamState.streamPos;
-
-      var byteWidths = streamState.byteWidths;
-      var typeFieldWidth = byteWidths[0];
-      var offsetFieldWidth = byteWidths[1];
-      var generationFieldWidth = byteWidths[2];
-
-      var entryRanges = streamState.entryRanges;
-      while (entryRanges.length > 0) {
-        var first = entryRanges[0];
-        var n = entryRanges[1];
-
-        if (!isInt(first) || !isInt(n)) {
-          error('Invalid XRef range fields: ' + first + ', ' + n);
-        }
-        if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
-            !isInt(generationFieldWidth)) {
-          error('Invalid XRef entry fields length: ' + first + ', ' + n);
-        }
-        for (i = streamState.entryNum; i < n; ++i) {
-          streamState.entryNum = i;
-          streamState.streamPos = stream.pos;
-
-          var type = 0, offset = 0, generation = 0;
-          for (j = 0; j < typeFieldWidth; ++j) {
-            type = (type << 8) | stream.getByte();
-          }
-          // if type field is absent, its default value is 1
-          if (typeFieldWidth === 0) {
-            type = 1;
-          }
-          for (j = 0; j < offsetFieldWidth; ++j) {
-            offset = (offset << 8) | stream.getByte();
-          }
-          for (j = 0; j < generationFieldWidth; ++j) {
-            generation = (generation << 8) | stream.getByte();
-          }
-          var entry = {};
-          entry.offset = offset;
-          entry.gen = generation;
-          switch (type) {
-            case 0:
-              entry.free = true;
-              break;
-            case 1:
-              entry.uncompressed = true;
-              break;
-            case 2:
-              break;
-            default:
-              error('Invalid XRef entry type: ' + type);
-          }
-          if (!this.entries[first + i]) {
-            this.entries[first + i] = entry;
-          }
-        }
-
-        streamState.entryNum = 0;
-        streamState.streamPos = stream.pos;
-        entryRanges.splice(0, 2);
-      }
-    },
-
-    indexObjects: function XRef_indexObjects() {
-      // Simple scan through the PDF content to find objects,
-      // trailers and XRef streams.
-      function readToken(data, offset) {
-        var token = '', ch = data[offset];
-        while (ch !== 13 && ch !== 10) {
-          if (++offset >= data.length) {
-            break;
-          }
-          token += String.fromCharCode(ch);
-          ch = data[offset];
-        }
-        return token;
-      }
-      function skipUntil(data, offset, what) {
-        var length = what.length, dataLength = data.length;
-        var skipped = 0;
-        // finding byte sequence
-        while (offset < dataLength) {
-          var i = 0;
-          while (i < length && data[offset + i] === what[i]) {
-            ++i;
-          }
-          if (i >= length) {
-            break; // sequence found
-          }
-          offset++;
-          skipped++;
-        }
-        return skipped;
-      }
-      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
-      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
-                                          101, 102]);
-      var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
-      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
-
-      var stream = this.stream;
-      stream.pos = 0;
-      var buffer = stream.getBytes();
-      var position = stream.start, length = buffer.length;
-      var trailers = [], xrefStms = [];
-      while (position < length) {
-        var ch = buffer[position];
-        if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
-          ++position;
-          continue;
-        }
-        if (ch === 37) { // %-comment
-          do {
-            ++position;
-            if (position >= length) {
-              break;
-            }
-            ch = buffer[position];
-          } while (ch !== 13 && ch !== 10);
-          continue;
-        }
-        var token = readToken(buffer, position);
-        var m;
-        if (token === 'xref') {
-          position += skipUntil(buffer, position, trailerBytes);
-          trailers.push(position);
-          position += skipUntil(buffer, position, startxrefBytes);
-        } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
-          if (typeof this.entries[m[1]] === 'undefined') {
-            this.entries[m[1]] = {
-              offset: position,
-              gen: m[2] | 0,
-              uncompressed: true
-            };
-          }
-          var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
-          var content = buffer.subarray(position, position + contentLength);
-
-          // checking XRef stream suspect
-          // (it shall have '/XRef' and next char is not a letter)
-          var xrefTagOffset = skipUntil(content, 0, xrefBytes);
-          if (xrefTagOffset < contentLength &&
-              content[xrefTagOffset + 5] < 64) {
-            xrefStms.push(position);
-            this.xrefstms[position] = 1; // don't read it recursively
-          }
-
-          position += contentLength;
-        } else {
-          position += token.length + 1;
-        }
-      }
-      // reading XRef streams
-      var i, ii;
-      for (i = 0, ii = xrefStms.length; i < ii; ++i) {
-        this.startXRefQueue.push(xrefStms[i]);
-        this.readXRef(/* recoveryMode */ true);
-      }
-      // finding main trailer
-      var dict;
-      for (i = 0, ii = trailers.length; i < ii; ++i) {
-        stream.pos = trailers[i];
-        var parser = new Parser(new Lexer(stream), true, this);
-        var obj = parser.getObj();
-        if (!isCmd(obj, 'trailer')) {
-          continue;
-        }
-        // read the trailer dictionary
-        if (!isDict(dict = parser.getObj())) {
-          continue;
-        }
-        // taking the first one with 'ID'
-        if (dict.has('ID')) {
-          return dict;
-        }
-      }
-      // no tailer with 'ID', taking last one (if exists)
-      if (dict) {
-        return dict;
-      }
-      // nothing helps
-      // calling error() would reject worker with an UnknownErrorException.
-      throw new InvalidPDFException('Invalid PDF structure');
-    },
-
-    readXRef: function XRef_readXRef(recoveryMode) {
-      var stream = this.stream;
-
-      try {
-        while (this.startXRefQueue.length) {
-          var startXRef = this.startXRefQueue[0];
-
-          stream.pos = startXRef + stream.start;
-
-          var parser = new Parser(new Lexer(stream), true, this);
-          var obj = parser.getObj();
-          var dict;
-
-          // Get dictionary
-          if (isCmd(obj, 'xref')) {
-            // Parse end-of-file XRef
-            dict = this.processXRefTable(parser);
-            if (!this.topDict) {
-              this.topDict = dict;
-            }
-
-            // Recursively get other XRefs 'XRefStm', if any
-            obj = dict.get('XRefStm');
-            if (isInt(obj)) {
-              var pos = obj;
-              // ignore previously loaded xref streams
-              // (possible infinite recursion)
-              if (!(pos in this.xrefstms)) {
-                this.xrefstms[pos] = 1;
-                this.startXRefQueue.push(pos);
-              }
-            }
-          } else if (isInt(obj)) {
-            // Parse in-stream XRef
-            if (!isInt(parser.getObj()) ||
-                !isCmd(parser.getObj(), 'obj') ||
-                !isStream(obj = parser.getObj())) {
-              error('Invalid XRef stream');
-            }
-            dict = this.processXRefStream(obj);
-            if (!this.topDict) {
-              this.topDict = dict;
-            }
-            if (!dict) {
-              error('Failed to read XRef stream');
-            }
-          } else {
-            error('Invalid XRef stream header');
-          }
-
-          // Recursively get previous dictionary, if any
-          obj = dict.get('Prev');
-          if (isInt(obj)) {
-            this.startXRefQueue.push(obj);
-          } else if (isRef(obj)) {
-            // The spec says Prev must not be a reference, i.e. "/Prev NNN"
-            // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
-            this.startXRefQueue.push(obj.num);
-          }
-
-          this.startXRefQueue.shift();
-        }
-
-        return this.topDict;
-      } catch (e) {
-        if (e instanceof MissingDataException) {
-          throw e;
-        }
-        info('(while reading XRef): ' + e);
-      }
-
-      if (recoveryMode) {
-        return;
-      }
-      throw new XRefParseException();
-    },
-
-    getEntry: function XRef_getEntry(i) {
-      var xrefEntry = this.entries[i];
-      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
-        return xrefEntry;
-      }
-      return null;
-    },
-
-    fetchIfRef: function XRef_fetchIfRef(obj) {
-      if (!isRef(obj)) {
-        return obj;
-      }
-      return this.fetch(obj);
-    },
-
-    fetch: function XRef_fetch(ref, suppressEncryption) {
-      assert(isRef(ref), 'ref object is not a reference');
-      var num = ref.num;
-      if (num in this.cache) {
-        var cacheEntry = this.cache[num];
-        return cacheEntry;
-      }
-
-      var xrefEntry = this.getEntry(num);
-
-      // the referenced entry can be free
-      if (xrefEntry === null) {
-        return (this.cache[num] = null);
-      }
-
-      if (xrefEntry.uncompressed) {
-        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);
-      } else {
-        xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption);
-      }
-      if (isDict(xrefEntry)){
-        xrefEntry.objId = ref.toString();
-      } else if (isStream(xrefEntry)) {
-        xrefEntry.dict.objId = ref.toString();
-      }
-      return xrefEntry;
-    },
-
-    fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry,
-                                                       suppressEncryption) {
-      var gen = ref.gen;
-      var num = ref.num;
-      if (xrefEntry.gen !== gen) {
-        error('inconsistent generation in XRef');
-      }
-      var stream = this.stream.makeSubStream(xrefEntry.offset +
-                                             this.stream.start);
-      var parser = new Parser(new Lexer(stream), true, this);
-      var obj1 = parser.getObj();
-      var obj2 = parser.getObj();
-      var obj3 = parser.getObj();
-      if (!isInt(obj1) || parseInt(obj1, 10) !== num ||
-          !isInt(obj2) || parseInt(obj2, 10) !== gen ||
-          !isCmd(obj3)) {
-        error('bad XRef entry');
-      }
-      if (!isCmd(obj3, 'obj')) {
-        // some bad PDFs use "obj1234" and really mean 1234
-        if (obj3.cmd.indexOf('obj') === 0) {
-          num = parseInt(obj3.cmd.substring(3), 10);
-          if (!isNaN(num)) {
-            return num;
-          }
-        }
-        error('bad XRef entry');
-      }
-      if (this.encrypt && !suppressEncryption) {
-        xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));
-      } else {
-        xrefEntry = parser.getObj();
-      }
-      if (!isStream(xrefEntry)) {
-        this.cache[num] = xrefEntry;
-      }
-      return xrefEntry;
-    },
-
-    fetchCompressed: function XRef_fetchCompressed(xrefEntry,
-                                                   suppressEncryption) {
-      var tableOffset = xrefEntry.offset;
-      var stream = this.fetch(new Ref(tableOffset, 0));
-      if (!isStream(stream)) {
-        error('bad ObjStm stream');
-      }
-      var first = stream.dict.get('First');
-      var n = stream.dict.get('N');
-      if (!isInt(first) || !isInt(n)) {
-        error('invalid first and n parameters for ObjStm stream');
-      }
-      var parser = new Parser(new Lexer(stream), false, this);
-      parser.allowStreams = true;
-      var i, entries = [], num, nums = [];
-      // read the object numbers to populate cache
-      for (i = 0; i < n; ++i) {
-        num = parser.getObj();
-        if (!isInt(num)) {
-          error('invalid object number in the ObjStm stream: ' + num);
-        }
-        nums.push(num);
-        var offset = parser.getObj();
-        if (!isInt(offset)) {
-          error('invalid object offset in the ObjStm stream: ' + offset);
-        }
-      }
-      // read stream objects for cache
-      for (i = 0; i < n; ++i) {
-        entries.push(parser.getObj());
-        num = nums[i];
-        var entry = this.entries[num];
-        if (entry && entry.offset === tableOffset && entry.gen === i) {
-          this.cache[num] = entries[i];
-        }
-      }
-      xrefEntry = entries[xrefEntry.gen];
-      if (xrefEntry === undefined) {
-        error('bad XRef entry for compressed object');
-      }
-      return xrefEntry;
-    },
-
-    fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) {
-      if (!isRef(obj)) {
-        return Promise.resolve(obj);
-      }
-      return this.fetchAsync(obj);
-    },
-
-    fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) {
-      var streamManager = this.stream.manager;
-      var xref = this;
-      return new Promise(function tryFetch(resolve, reject) {
-        try {
-          resolve(xref.fetch(ref, suppressEncryption));
-        } catch (e) {
-          if (e instanceof MissingDataException) {
-            streamManager.requestRange(e.begin, e.end, function () {
-              tryFetch(resolve, reject);
-            });
-            return;
-          }
-          reject(e);
-        }
-      });
-    },
-
-    getCatalogObj: function XRef_getCatalogObj() {
-      return this.root;
-    }
-  };
-
-  return XRef;
-})();
-
-/**
- * A NameTree is like a Dict but has some advantageous properties, see the
- * spec (7.9.6) for more details.
- * TODO: implement all the Dict functions and make this more efficent.
- */
-var NameTree = (function NameTreeClosure() {
-  function NameTree(root, xref) {
-    this.root = root;
-    this.xref = xref;
-  }
-
-  NameTree.prototype = {
-    getAll: function NameTree_getAll() {
-      var dict = {};
-      if (!this.root) {
-        return dict;
-      }
-      var xref = this.xref;
-      // reading name tree
-      var processed = new RefSet();
-      processed.put(this.root);
-      var queue = [this.root];
-      while (queue.length > 0) {
-        var i, n;
-        var obj = xref.fetchIfRef(queue.shift());
-        if (!isDict(obj)) {
-          continue;
-        }
-        if (obj.has('Kids')) {
-          var kids = obj.get('Kids');
-          for (i = 0, n = kids.length; i < n; i++) {
-            var kid = kids[i];
-            if (processed.has(kid)) {
-              error('invalid destinations');
-            }
-            queue.push(kid);
-            processed.put(kid);
-          }
-          continue;
-        }
-        var names = obj.get('Names');
-        if (names) {
-          for (i = 0, n = names.length; i < n; i += 2) {
-            dict[names[i]] = xref.fetchIfRef(names[i + 1]);
-          }
-        }
-      }
-      return dict;
-    },
-
-    get: function NameTree_get(destinationId) {
-      if (!this.root) {
-        return null;
-      }
-
-      var xref = this.xref;
-      var kidsOrNames = xref.fetchIfRef(this.root);
-      var loopCount = 0;
-      var MAX_NAMES_LEVELS = 10;
-      var l, r, m;
-
-      // Perform a binary search to quickly find the entry that
-      // contains the named destination we are looking for.
-      while (kidsOrNames.has('Kids')) {
-        loopCount++;
-        if (loopCount > MAX_NAMES_LEVELS) {
-          warn('Search depth limit for named destionations has been reached.');
-          return null;
-        }
-
-        var kids = kidsOrNames.get('Kids');
-        if (!isArray(kids)) {
-          return null;
-        }
-
-        l = 0;
-        r = kids.length - 1;
-        while (l <= r) {
-          m = (l + r) >> 1;
-          var kid = xref.fetchIfRef(kids[m]);
-          var limits = kid.get('Limits');
-
-          if (destinationId < limits[0]) {
-            r = m - 1;
-          } else if (destinationId > limits[1]) {
-            l = m + 1;
-          } else {
-            kidsOrNames = xref.fetchIfRef(kids[m]);
-            break;
-          }
-        }
-        if (l > r) {
-          return null;
-        }
-      }
-
-      // If we get here, then we have found the right entry. Now
-      // go through the named destinations in the Named dictionary
-      // until we find the exact destination we're looking for.
-      var names = kidsOrNames.get('Names');
-      if (isArray(names)) {
-        // Perform a binary search to reduce the lookup time.
-        l = 0;
-        r = names.length - 2;
-        while (l <= r) {
-          // Check only even indices (0, 2, 4, ...) because the
-          // odd indices contain the actual D array.
-          m = (l + r) & ~1;
-          if (destinationId < names[m]) {
-            r = m - 2;
-          } else if (destinationId > names[m]) {
-            l = m + 2;
-          } else {
-            return xref.fetchIfRef(names[m + 1]);
-          }
-        }
-      }
-      return null;
-    }
-  };
-  return NameTree;
-})();
-
-/**
- * "A PDF file can refer to the contents of another file by using a File
- * Specification (PDF 1.1)", see the spec (7.11) for more details.
- * NOTE: Only embedded files are supported (as part of the attachments support)
- * TODO: support the 'URL' file system (with caching if !/V), portable
- * collections attributes and related files (/RF)
- */
-var FileSpec = (function FileSpecClosure() {
-  function FileSpec(root, xref) {
-    if (!root || !isDict(root)) {
-      return;
-    }
-    this.xref = xref;
-    this.root = root;
-    if (root.has('FS')) {
-      this.fs = root.get('FS');
-    }
-    this.description = root.has('Desc') ?
-                         stringToPDFString(root.get('Desc')) :
-                         '';
-    if (root.has('RF')) {
-      warn('Related file specifications are not supported');
-    }
-    this.contentAvailable = true;
-    if (!root.has('EF')) {
-      this.contentAvailable = false;
-      warn('Non-embedded file specifications are not supported');
-    }
-  }
-
-  function pickPlatformItem(dict) {
-    // Look for the filename in this order:
-    // UF, F, Unix, Mac, DOS
-    if (dict.has('UF')) {
-      return dict.get('UF');
-    } else if (dict.has('F')) {
-      return dict.get('F');
-    } else if (dict.has('Unix')) {
-      return dict.get('Unix');
-    } else if (dict.has('Mac')) {
-      return dict.get('Mac');
-    } else if (dict.has('DOS')) {
-      return dict.get('DOS');
-    } else {
-      return null;
-    }
-  }
-
-  FileSpec.prototype = {
-    get filename() {
-      if (!this._filename && this.root) {
-        var filename = pickPlatformItem(this.root) || 'unnamed';
-        this._filename = stringToPDFString(filename).
-          replace(/\\\\/g, '\\').
-          replace(/\\\//g, '/').
-          replace(/\\/g, '/');
-      }
-      return this._filename;
-    },
-    get content() {
-      if (!this.contentAvailable) {
-        return null;
-      }
-      if (!this.contentRef && this.root) {
-        this.contentRef = pickPlatformItem(this.root.get('EF'));
-      }
-      var content = null;
-      if (this.contentRef) {
-        var xref = this.xref;
-        var fileObj = xref.fetchIfRef(this.contentRef);
-        if (fileObj && isStream(fileObj)) {
-          content = fileObj.getBytes();
-        } else {
-          warn('Embedded file specification points to non-existing/invalid ' +
-            'content');
-        }
-      } else {
-        warn('Embedded file specification does not have a content');
-      }
-      return content;
-    },
-    get serializable() {
-      return {
-        filename: this.filename,
-        content: this.content
-      };
-    }
-  };
-  return FileSpec;
-})();
-
-/**
- * A helper for loading missing data in object graphs. It traverses the graph
- * depth first and queues up any objects that have missing data. Once it has
- * has traversed as many objects that are available it attempts to bundle the
- * missing data requests and then resume from the nodes that weren't ready.
- *
- * NOTE: It provides protection from circular references by keeping track of
- * of loaded references. However, you must be careful not to load any graphs
- * that have references to the catalog or other pages since that will cause the
- * entire PDF document object graph to be traversed.
- */
-var ObjectLoader = (function() {
-  function mayHaveChildren(value) {
-    return isRef(value) || isDict(value) || isArray(value) || isStream(value);
-  }
-
-  function addChildren(node, nodesToVisit) {
-    var value;
-    if (isDict(node) || isStream(node)) {
-      var map;
-      if (isDict(node)) {
-        map = node.map;
-      } else {
-        map = node.dict.map;
-      }
-      for (var key in map) {
-        value = map[key];
-        if (mayHaveChildren(value)) {
-          nodesToVisit.push(value);
-        }
-      }
-    } else if (isArray(node)) {
-      for (var i = 0, ii = node.length; i < ii; i++) {
-        value = node[i];
-        if (mayHaveChildren(value)) {
-          nodesToVisit.push(value);
-        }
-      }
-    }
-  }
-
-  function ObjectLoader(obj, keys, xref) {
-    this.obj = obj;
-    this.keys = keys;
-    this.xref = xref;
-    this.refSet = null;
-  }
-
-  ObjectLoader.prototype = {
-    load: function ObjectLoader_load() {
-      var keys = this.keys;
-      this.capability = createPromiseCapability();
-      // Don't walk the graph if all the data is already loaded.
-      if (!(this.xref.stream instanceof ChunkedStream) ||
-          this.xref.stream.getMissingChunks().length === 0) {
-        this.capability.resolve();
-        return this.capability.promise;
-      }
-
-      this.refSet = new RefSet();
-      // Setup the initial nodes to visit.
-      var nodesToVisit = [];
-      for (var i = 0; i < keys.length; i++) {
-        nodesToVisit.push(this.obj[keys[i]]);
-      }
-
-      this.walk(nodesToVisit);
-      return this.capability.promise;
-    },
-
-    walk: function ObjectLoader_walk(nodesToVisit) {
-      var nodesToRevisit = [];
-      var pendingRequests = [];
-      // DFS walk of the object graph.
-      while (nodesToVisit.length) {
-        var currentNode = nodesToVisit.pop();
-
-        // Only references or chunked streams can cause missing data exceptions.
-        if (isRef(currentNode)) {
-          // Skip nodes that have already been visited.
-          if (this.refSet.has(currentNode)) {
-            continue;
-          }
-          try {
-            var ref = currentNode;
-            this.refSet.put(ref);
-            currentNode = this.xref.fetch(currentNode);
-          } catch (e) {
-            if (!(e instanceof MissingDataException)) {
-              throw e;
-            }
-            nodesToRevisit.push(currentNode);
-            pendingRequests.push({ begin: e.begin, end: e.end });
-          }
-        }
-        if (currentNode && currentNode.getBaseStreams) {
-          var baseStreams = currentNode.getBaseStreams();
-          var foundMissingData = false;
-          for (var i = 0; i < baseStreams.length; i++) {
-            var stream = baseStreams[i];
-            if (stream.getMissingChunks && stream.getMissingChunks().length) {
-              foundMissingData = true;
-              pendingRequests.push({
-                begin: stream.start,
-                end: stream.end
-              });
-            }
-          }
-          if (foundMissingData) {
-            nodesToRevisit.push(currentNode);
-          }
-        }
-
-        addChildren(currentNode, nodesToVisit);
-      }
-
-      if (pendingRequests.length) {
-        this.xref.stream.manager.requestRanges(pendingRequests,
-            function pendingRequestCallback() {
-          nodesToVisit = nodesToRevisit;
-          for (var i = 0; i < nodesToRevisit.length; i++) {
-            var node = nodesToRevisit[i];
-            // Remove any reference nodes from the currrent refset so they
-            // aren't skipped when we revist them.
-            if (isRef(node)) {
-              this.refSet.remove(node);
-            }
-          }
-          this.walk(nodesToVisit);
-        }.bind(this));
-        return;
-      }
-      // Everything is loaded.
-      this.refSet = null;
-      this.capability.resolve();
-    }
-  };
-
-  return ObjectLoader;
-})();
-
-
-var ISOAdobeCharset = [
-  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
-  'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
-  'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
-  'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
-  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
-  'at', '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',
-  'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
-  'quoteleft', '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',
-  'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
-  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
-  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
-  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
-  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
-  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
-  'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
-  'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
-  'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
-  'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
-  'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
-  'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
-  'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
-  'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
-  'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
-  'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
-  'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
-  'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
-  'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
-  'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
-  'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
-  'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
-  'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
-  'ugrave', 'yacute', 'ydieresis', 'zcaron'
-];
-
-var ExpertCharset = [
-  '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
-  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
-  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
-  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
-  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
-  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
-  'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
-  'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
-  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
-  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
-  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
-  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
-  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
-  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
-  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
-  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
-  'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
-  'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
-  'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
-  'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
-  'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
-  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
-  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
-  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
-  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
-  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
-  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
-  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
-  'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
-  'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
-  'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
-  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
-  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
-  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
-  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
-  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
-  'Ydieresissmall'
-];
-
-var ExpertSubsetCharset = [
-  '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
-  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
-  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
-  'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
-  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
-  'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
-  'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
-  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
-  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
-  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
-  'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
-  'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
-  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
-  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
-  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
-  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
-  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
-  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
-  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
-  'periodinferior', 'commainferior'
-];
-
-
-var DEFAULT_ICON_SIZE = 22; // px
-var SUPPORTED_TYPES = ['Link', 'Text', 'Widget'];
-
-var Annotation = (function AnnotationClosure() {
-  // 12.5.5: Algorithm: Appearance streams
-  function getTransformMatrix(rect, bbox, matrix) {
-    var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix);
-    var minX = bounds[0];
-    var minY = bounds[1];
-    var maxX = bounds[2];
-    var maxY = bounds[3];
-
-    if (minX === maxX || minY === maxY) {
-      // From real-life file, bbox was [0, 0, 0, 0]. In this case,
-      // just apply the transform for rect
-      return [1, 0, 0, 1, rect[0], rect[1]];
-    }
-
-    var xRatio = (rect[2] - rect[0]) / (maxX - minX);
-    var yRatio = (rect[3] - rect[1]) / (maxY - minY);
-    return [
-      xRatio,
-      0,
-      0,
-      yRatio,
-      rect[0] - minX * xRatio,
-      rect[1] - minY * yRatio
-    ];
-  }
-
-  function getDefaultAppearance(dict) {
-    var appearanceState = dict.get('AP');
-    if (!isDict(appearanceState)) {
-      return;
-    }
-
-    var appearance;
-    var appearances = appearanceState.get('N');
-    if (isDict(appearances)) {
-      var as = dict.get('AS');
-      if (as && appearances.has(as.name)) {
-        appearance = appearances.get(as.name);
-      }
-    } else {
-      appearance = appearances;
-    }
-    return appearance;
-  }
-
-  function Annotation(params) {
-    var dict = params.dict;
-    var data = this.data = {};
-
-    data.subtype = dict.get('Subtype').name;
-    var rect = dict.get('Rect') || [0, 0, 0, 0];
-    data.rect = Util.normalizeRect(rect);
-    data.annotationFlags = dict.get('F');
-
-    var color = dict.get('C');
-    if (!color) {
-      // The PDF spec does not mention how a missing color array is interpreted.
-      // Adobe Reader seems to default to black in this case.
-      data.color = [0, 0, 0];
-    } else if (isArray(color)) {
-      switch (color.length) {
-        case 0:
-          // Empty array denotes transparent border.
-          data.color = null;
-          break;
-        case 1:
-          // TODO: implement DeviceGray
-          break;
-        case 3:
-          data.color = color;
-          break;
-        case 4:
-          // TODO: implement DeviceCMYK
-          break;
-      }
-    }
-
-    // Some types of annotations have border style dict which has more
-    // info than the border array
-    if (dict.has('BS')) {
-      var borderStyle = dict.get('BS');
-      data.borderWidth = borderStyle.has('W') ? borderStyle.get('W') : 1;
-    } else {
-      var borderArray = dict.get('Border') || [0, 0, 1];
-      data.borderWidth = borderArray[2] || 0;
-
-      // TODO: implement proper support for annotations with line dash patterns.
-      var dashArray = borderArray[3];
-      if (data.borderWidth > 0 && dashArray) {
-        if (!isArray(dashArray)) {
-          // Ignore the border if dashArray is not actually an array,
-          // this is consistent with the behaviour in Adobe Reader.
-          data.borderWidth = 0;
-        } else {
-          var dashArrayLength = dashArray.length;
-          if (dashArrayLength > 0) {
-            // According to the PDF specification: the elements in a dashArray
-            // shall be numbers that are nonnegative and not all equal to zero.
-            var isInvalid = false;
-            var numPositive = 0;
-            for (var i = 0; i < dashArrayLength; i++) {
-              var validNumber = (+dashArray[i] >= 0);
-              if (!validNumber) {
-                isInvalid = true;
-                break;
-              } else if (dashArray[i] > 0) {
-                numPositive++;
-              }
-            }
-            if (isInvalid || numPositive === 0) {
-              data.borderWidth = 0;
-            }
-          }
-        }
-      }
-    }
-
-    this.appearance = getDefaultAppearance(dict);
-    data.hasAppearance = !!this.appearance;
-    data.id = params.ref.num;
-  }
-
-  Annotation.prototype = {
-
-    getData: function Annotation_getData() {
-      return this.data;
-    },
-
-    isInvisible: function Annotation_isInvisible() {
-      var data = this.data;
-      if (data && SUPPORTED_TYPES.indexOf(data.subtype) !== -1) {
-        return false;
-      } else {
-        return !!(data &&
-                  data.annotationFlags &&            // Default: not invisible
-                  data.annotationFlags & 0x1);       // Invisible
-      }
-    },
-
-    isViewable: function Annotation_isViewable() {
-      var data = this.data;
-      return !!(!this.isInvisible() &&
-                data &&
-                (!data.annotationFlags ||
-                 !(data.annotationFlags & 0x22)) &&  // Hidden or NoView
-                data.rect);                          // rectangle is necessary
-    },
-
-    isPrintable: function Annotation_isPrintable() {
-      var data = this.data;
-      return !!(!this.isInvisible() &&
-                data &&
-                data.annotationFlags &&              // Default: not printable
-                data.annotationFlags & 0x4 &&        // Print
-                !(data.annotationFlags & 0x2) &&     // Hidden
-                data.rect);                          // rectangle is necessary
-    },
-
-    loadResources: function Annotation_loadResources(keys) {
-      return new Promise(function (resolve, reject) {
-        this.appearance.dict.getAsync('Resources').then(function (resources) {
-          if (!resources) {
-            resolve();
-            return;
-          }
-          var objectLoader = new ObjectLoader(resources.map,
-                                              keys,
-                                              resources.xref);
-          objectLoader.load().then(function() {
-            resolve(resources);
-          }, reject);
-        }, reject);
-      }.bind(this));
-    },
-
-    getOperatorList: function Annotation_getOperatorList(evaluator) {
-
-      if (!this.appearance) {
-        return Promise.resolve(new OperatorList());
-      }
-
-      var data = this.data;
-
-      var appearanceDict = this.appearance.dict;
-      var resourcesPromise = this.loadResources([
-        'ExtGState',
-        'ColorSpace',
-        'Pattern',
-        'Shading',
-        'XObject',
-        'Font'
-        // ProcSet
-        // Properties
-      ]);
-      var bbox = appearanceDict.get('BBox') || [0, 0, 1, 1];
-      var matrix = appearanceDict.get('Matrix') || [1, 0, 0, 1, 0 ,0];
-      var transform = getTransformMatrix(data.rect, bbox, matrix);
-      var self = this;
-
-      return resourcesPromise.then(function(resources) {
-          var opList = new OperatorList();
-          opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]);
-          return evaluator.getOperatorList(self.appearance, resources, opList).
-            then(function () {
-              opList.addOp(OPS.endAnnotation, []);
-              self.appearance.reset();
-              return opList;
-            });
-        });
-    }
-  };
-
-  Annotation.getConstructor =
-      function Annotation_getConstructor(subtype, fieldType) {
-
-    if (!subtype) {
-      return;
-    }
-
-    // TODO(mack): Implement FreeText annotations
-    if (subtype === 'Link') {
-      return LinkAnnotation;
-    } else if (subtype === 'Text') {
-      return TextAnnotation;
-    } else if (subtype === 'Widget') {
-      if (!fieldType) {
-        return;
-      }
-
-      if (fieldType === 'Tx') {
-        return TextWidgetAnnotation;
-      } else {
-        return WidgetAnnotation;
-      }
-    } else {
-      return Annotation;
-    }
-  };
-
-  Annotation.fromRef = function Annotation_fromRef(xref, ref) {
-
-    var dict = xref.fetchIfRef(ref);
-    if (!isDict(dict)) {
-      return;
-    }
-
-    var subtype = dict.get('Subtype');
-    subtype = isName(subtype) ? subtype.name : '';
-    if (!subtype) {
-      return;
-    }
-
-    var fieldType = Util.getInheritableProperty(dict, 'FT');
-    fieldType = isName(fieldType) ? fieldType.name : '';
-
-    var Constructor = Annotation.getConstructor(subtype, fieldType);
-    if (!Constructor) {
-      return;
-    }
-
-    var params = {
-      dict: dict,
-      ref: ref,
-    };
-
-    var annotation = new Constructor(params);
-
-    if (annotation.isViewable() || annotation.isPrintable()) {
-      return annotation;
-    } else {
-      if (SUPPORTED_TYPES.indexOf(subtype) === -1) {
-        warn('unimplemented annotation type: ' + subtype);
-      }
-    }
-  };
-
-  Annotation.appendToOperatorList = function Annotation_appendToOperatorList(
-      annotations, opList, pdfManager, partialEvaluator, intent) {
-
-    function reject(e) {
-      annotationsReadyCapability.reject(e);
-    }
-
-    var annotationsReadyCapability = createPromiseCapability();
-
-    var annotationPromises = [];
-    for (var i = 0, n = annotations.length; i < n; ++i) {
-      if (intent === 'display' && annotations[i].isViewable() ||
-          intent === 'print' && annotations[i].isPrintable()) {
-        annotationPromises.push(
-          annotations[i].getOperatorList(partialEvaluator));
-      }
-    }
-    Promise.all(annotationPromises).then(function(datas) {
-      opList.addOp(OPS.beginAnnotations, []);
-      for (var i = 0, n = datas.length; i < n; ++i) {
-        var annotOpList = datas[i];
-        opList.addOpList(annotOpList);
-      }
-      opList.addOp(OPS.endAnnotations, []);
-      annotationsReadyCapability.resolve();
-    }, reject);
-
-    return annotationsReadyCapability.promise;
-  };
-
-  return Annotation;
-})();
-
-var WidgetAnnotation = (function WidgetAnnotationClosure() {
-
-  function WidgetAnnotation(params) {
-    Annotation.call(this, params);
-
-    var dict = params.dict;
-    var data = this.data;
-
-    data.fieldValue = stringToPDFString(
-      Util.getInheritableProperty(dict, 'V') || '');
-    data.alternativeText = stringToPDFString(dict.get('TU') || '');
-    data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || '';
-    var fieldType = Util.getInheritableProperty(dict, 'FT');
-    data.fieldType = isName(fieldType) ? fieldType.name : '';
-    data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0;
-    this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty;
-
-    // Building the full field name by collecting the field and
-    // its ancestors 'T' data and joining them using '.'.
-    var fieldName = [];
-    var namedItem = dict;
-    var ref = params.ref;
-    while (namedItem) {
-      var parent = namedItem.get('Parent');
-      var parentRef = namedItem.getRaw('Parent');
-      var name = namedItem.get('T');
-      if (name) {
-        fieldName.unshift(stringToPDFString(name));
-      } else if (parent && ref) {
-        // The field name is absent, that means more than one field
-        // with the same name may exist. Replacing the empty name
-        // with the '`' plus index in the parent's 'Kids' array.
-        // This is not in the PDF spec but necessary to id the
-        // the input controls.
-        var kids = parent.get('Kids');
-        var j, jj;
-        for (j = 0, jj = kids.length; j < jj; j++) {
-          var kidRef = kids[j];
-          if (kidRef.num === ref.num && kidRef.gen === ref.gen) {
-            break;
-          }
-        }
-        fieldName.unshift('`' + j);
-      }
-      namedItem = parent;
-      ref = parentRef;
-    }
-    data.fullName = fieldName.join('.');
-  }
-
-  var parent = Annotation.prototype;
-  Util.inherit(WidgetAnnotation, Annotation, {
-    isViewable: function WidgetAnnotation_isViewable() {
-      if (this.data.fieldType === 'Sig') {
-        warn('unimplemented annotation type: Widget signature');
-        return false;
-      }
-
-      return parent.isViewable.call(this);
-    }
-  });
-
-  return WidgetAnnotation;
-})();
-
-var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() {
-  function TextWidgetAnnotation(params) {
-    WidgetAnnotation.call(this, params);
-
-    this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q');
-    this.data.annotationType = AnnotationType.WIDGET;
-    this.data.hasHtml = !this.data.hasAppearance && !!this.data.fieldValue;
-  }
-
-  Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {
-    getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator) {
-      if (this.appearance) {
-        return Annotation.prototype.getOperatorList.call(this, evaluator);
-      }
-
-      var opList = new OperatorList();
-      var data = this.data;
-
-      // Even if there is an appearance stream, ignore it. This is the
-      // behaviour used by Adobe Reader.
-      if (!data.defaultAppearance) {
-        return Promise.resolve(opList);
-      }
-
-      var stream = new Stream(stringToBytes(data.defaultAppearance));
-      return evaluator.getOperatorList(stream, this.fieldResources, opList).
-        then(function () {
-          return opList;
-        });
-    }
-  });
-
-  return TextWidgetAnnotation;
-})();
-
-var InteractiveAnnotation = (function InteractiveAnnotationClosure() {
-  function InteractiveAnnotation(params) {
-    Annotation.call(this, params);
-
-    this.data.hasHtml = true;
-  }
-
-  Util.inherit(InteractiveAnnotation, Annotation, { });
-
-  return InteractiveAnnotation;
-})();
-
-var TextAnnotation = (function TextAnnotationClosure() {
-  function TextAnnotation(params) {
-    InteractiveAnnotation.call(this, params);
-
-    var dict = params.dict;
-    var data = this.data;
-
-    var content = dict.get('Contents');
-    var title = dict.get('T');
-    data.annotationType = AnnotationType.TEXT;
-    data.content = stringToPDFString(content || '');
-    data.title = stringToPDFString(title || '');
-
-    if (data.hasAppearance) {
-      data.name = 'NoIcon';
-    } else {
-      data.rect[1] = data.rect[3] - DEFAULT_ICON_SIZE;
-      data.rect[2] = data.rect[0] + DEFAULT_ICON_SIZE;
-      data.name = dict.has('Name') ? dict.get('Name').name : 'Note';
-    }
-
-    if (dict.has('C')) {
-      data.hasBgColor = true;
-    }
-  }
-
-  Util.inherit(TextAnnotation, InteractiveAnnotation, { });
-
-  return TextAnnotation;
-})();
-
-var LinkAnnotation = (function LinkAnnotationClosure() {
-  function LinkAnnotation(params) {
-    InteractiveAnnotation.call(this, params);
-
-    var dict = params.dict;
-    var data = this.data;
-    data.annotationType = AnnotationType.LINK;
-
-    var action = dict.get('A');
-    if (action && isDict(action)) {
-      var linkType = action.get('S').name;
-      if (linkType === 'URI') {
-        var url = action.get('URI');
-        if (isName(url)) {
-          // Some bad PDFs do not put parentheses around relative URLs.
-          url = '/' + url.name;
-        } else if (url) {
-          url = addDefaultProtocolToUrl(url);
-        }
-        // TODO: pdf spec mentions urls can be relative to a Base
-        // entry in the dictionary.
-        if (!isValidUrl(url, false)) {
-          url = '';
-        }
-        // According to ISO 32000-1:2008, section 12.6.4.7, 
-        // URI should to be encoded in 7-bit ASCII.
-        // Some bad PDFs may have URIs in UTF-8 encoding, see Bugzilla 1122280.
-        try {
-          data.url = stringToUTF8String(url);
-        } catch (e) {
-          // Fall back to a simple copy.
-          data.url = url;
-        }
-      } else if (linkType === 'GoTo') {
-        data.dest = action.get('D');
-      } else if (linkType === 'GoToR') {
-        var urlDict = action.get('F');
-        if (isDict(urlDict)) {
-          // We assume that the 'url' is a Filspec dictionary
-          // and fetch the url without checking any further
-          url = urlDict.get('F') || '';
-        }
-
-        // TODO: pdf reference says that GoToR
-        // can also have 'NewWindow' attribute
-        if (!isValidUrl(url, false)) {
-          url = '';
-        }
-        data.url = url;
-        data.dest = action.get('D');
-      } else if (linkType === 'Named') {
-        data.action = action.get('N').name;
-      } else {
-        warn('unrecognized link type: ' + linkType);
-      }
-    } else if (dict.has('Dest')) {
-      // simple destination link
-      var dest = dict.get('Dest');
-      data.dest = isName(dest) ? dest.name : dest;
-    }
-  }
-
-  // Lets URLs beginning with 'www.' default to using the 'http://' protocol.
-  function addDefaultProtocolToUrl(url) {
-    if (url && url.indexOf('www.') === 0) {
-      return ('http://' + url);
-    }
-    return url;
-  }
-
-  Util.inherit(LinkAnnotation, InteractiveAnnotation, { });
-
-  return LinkAnnotation;
-})();
-
-
-var PDFFunction = (function PDFFunctionClosure() {
-  var CONSTRUCT_SAMPLED = 0;
-  var CONSTRUCT_INTERPOLATED = 2;
-  var CONSTRUCT_STICHED = 3;
-  var CONSTRUCT_POSTSCRIPT = 4;
-
-  return {
-    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
-                                                       str) {
-      var i, ii;
-      var length = 1;
-      for (i = 0, ii = size.length; i < ii; i++) {
-        length *= size[i];
-      }
-      length *= outputSize;
-
-      var array = new Array(length);
-      var codeSize = 0;
-      var codeBuf = 0;
-      // 32 is a valid bps so shifting won't work
-      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
-
-      var strBytes = str.getBytes((length * bps + 7) / 8);
-      var strIdx = 0;
-      for (i = 0; i < length; i++) {
-        while (codeSize < bps) {
-          codeBuf <<= 8;
-          codeBuf |= strBytes[strIdx++];
-          codeSize += 8;
-        }
-        codeSize -= bps;
-        array[i] = (codeBuf >> codeSize) * sampleMul;
-        codeBuf &= (1 << codeSize) - 1;
-      }
-      return array;
-    },
-
-    getIR: function PDFFunction_getIR(xref, fn) {
-      var dict = fn.dict;
-      if (!dict) {
-        dict = fn;
-      }
-
-      var types = [this.constructSampled,
-                   null,
-                   this.constructInterpolated,
-                   this.constructStiched,
-                   this.constructPostScript];
-
-      var typeNum = dict.get('FunctionType');
-      var typeFn = types[typeNum];
-      if (!typeFn) {
-        error('Unknown type of function');
-      }
-
-      return typeFn.call(this, fn, dict, xref);
-    },
-
-    fromIR: function PDFFunction_fromIR(IR) {
-      var type = IR[0];
-      switch (type) {
-        case CONSTRUCT_SAMPLED:
-          return this.constructSampledFromIR(IR);
-        case CONSTRUCT_INTERPOLATED:
-          return this.constructInterpolatedFromIR(IR);
-        case CONSTRUCT_STICHED:
-          return this.constructStichedFromIR(IR);
-        //case CONSTRUCT_POSTSCRIPT:
-        default:
-          return this.constructPostScriptFromIR(IR);
-      }
-    },
-
-    parse: function PDFFunction_parse(xref, fn) {
-      var IR = this.getIR(xref, fn);
-      return this.fromIR(IR);
-    },
-
-    parseArray: function PDFFunction_parseArray(xref, fnObj) {
-      if (!isArray(fnObj)) {
-        // not an array -- parsing as regular function
-        return this.parse(xref, fnObj);
-      }
-
-      var fnArray = [];
-      for (var j = 0, jj = fnObj.length; j < jj; j++) {
-        var obj = xref.fetchIfRef(fnObj[j]);
-        fnArray.push(PDFFunction.parse(xref, obj));
-      }
-      return function (src, srcOffset, dest, destOffset) {
-        for (var i = 0, ii = fnArray.length; i < ii; i++) {
-          fnArray[i](src, srcOffset, dest, destOffset + i);
-        }
-      };
-    },
-
-    constructSampled: function PDFFunction_constructSampled(str, dict) {
-      function toMultiArray(arr) {
-        var inputLength = arr.length;
-        var out = [];
-        var index = 0;
-        for (var i = 0; i < inputLength; i += 2) {
-          out[index] = [arr[i], arr[i + 1]];
-          ++index;
-        }
-        return out;
-      }
-      var domain = dict.get('Domain');
-      var range = dict.get('Range');
-
-      if (!domain || !range) {
-        error('No domain or range');
-      }
-
-      var inputSize = domain.length / 2;
-      var outputSize = range.length / 2;
-
-      domain = toMultiArray(domain);
-      range = toMultiArray(range);
-
-      var size = dict.get('Size');
-      var bps = dict.get('BitsPerSample');
-      var order = dict.get('Order') || 1;
-      if (order !== 1) {
-        // No description how cubic spline interpolation works in PDF32000:2008
-        // As in poppler, ignoring order, linear interpolation may work as good
-        info('No support for cubic spline interpolation: ' + order);
-      }
-
-      var encode = dict.get('Encode');
-      if (!encode) {
-        encode = [];
-        for (var i = 0; i < inputSize; ++i) {
-          encode.push(0);
-          encode.push(size[i] - 1);
-        }
-      }
-      encode = toMultiArray(encode);
-
-      var decode = dict.get('Decode');
-      if (!decode) {
-        decode = range;
-      } else {
-        decode = toMultiArray(decode);
-      }
-
-      var samples = this.getSampleArray(size, outputSize, bps, str);
-
-      return [
-        CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
-        outputSize, Math.pow(2, bps) - 1, range
-      ];
-    },
-
-    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
-      // See chapter 3, page 109 of the PDF reference
-      function interpolate(x, xmin, xmax, ymin, ymax) {
-        return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
-      }
-
-      return function constructSampledFromIRResult(src, srcOffset,
-                                                   dest, destOffset) {
-        // See chapter 3, page 110 of the PDF reference.
-        var m = IR[1];
-        var domain = IR[2];
-        var encode = IR[3];
-        var decode = IR[4];
-        var samples = IR[5];
-        var size = IR[6];
-        var n = IR[7];
-        //var mask = IR[8];
-        var range = IR[9];
-
-        // Building the cube vertices: its part and sample index
-        // http://rjwagner49.com/Mathematics/Interpolation.pdf
-        var cubeVertices = 1 << m;
-        var cubeN = new Float64Array(cubeVertices);
-        var cubeVertex = new Uint32Array(cubeVertices);
-        var i, j;
-        for (j = 0; j < cubeVertices; j++) {
-          cubeN[j] = 1;
-        }
-
-        var k = n, pos = 1;
-        // Map x_i to y_j for 0 <= i < m using the sampled function.
-        for (i = 0; i < m; ++i) {
-          // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
-          var domain_2i = domain[i][0];
-          var domain_2i_1 = domain[i][1];
-          var xi = Math.min(Math.max(src[srcOffset +i], domain_2i),
-                            domain_2i_1);
-
-          // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
-          //                   Encode_2i, Encode_2i+1)
-          var e = interpolate(xi, domain_2i, domain_2i_1,
-                              encode[i][0], encode[i][1]);
-
-          // e_i' = min(max(e_i, 0), Size_i - 1)
-          var size_i = size[i];
-          e = Math.min(Math.max(e, 0), size_i - 1);
-
-          // Adjusting the cube: N and vertex sample index
-          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
-          var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
-          var n1 = e - e0; // (e - e0) / (e1 - e0);
-          var offset0 = e0 * k;
-          var offset1 = offset0 + k; // e1 * k
-          for (j = 0; j < cubeVertices; j++) {
-            if (j & pos) {
-              cubeN[j] *= n1;
-              cubeVertex[j] += offset1;
-            } else {
-              cubeN[j] *= n0;
-              cubeVertex[j] += offset0;
-            }
-          }
-
-          k *= size_i;
-          pos <<= 1;
-        }
-
-        for (j = 0; j < n; ++j) {
-          // Sum all cube vertices' samples portions
-          var rj = 0;
-          for (i = 0; i < cubeVertices; i++) {
-            rj += samples[cubeVertex[i] + j] * cubeN[i];
-          }
-
-          // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
-          //                    Decode_2j, Decode_2j+1)
-          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
-
-          // y_j = min(max(r_j, range_2j), range_2j+1)
-          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]),
-                                          range[j][1]);
-        }
-      };
-    },
-
-    constructInterpolated: function PDFFunction_constructInterpolated(str,
-                                                                      dict) {
-      var c0 = dict.get('C0') || [0];
-      var c1 = dict.get('C1') || [1];
-      var n = dict.get('N');
-
-      if (!isArray(c0) || !isArray(c1)) {
-        error('Illegal dictionary for interpolated function');
-      }
-
-      var length = c0.length;
-      var diff = [];
-      for (var i = 0; i < length; ++i) {
-        diff.push(c1[i] - c0[i]);
-      }
-
-      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
-    },
-
-    constructInterpolatedFromIR:
-      function PDFFunction_constructInterpolatedFromIR(IR) {
-      var c0 = IR[1];
-      var diff = IR[2];
-      var n = IR[3];
-
-      var length = diff.length;
-
-      return function constructInterpolatedFromIRResult(src, srcOffset,
-                                                        dest, destOffset) {
-        var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);
-
-        for (var j = 0; j < length; ++j) {
-          dest[destOffset + j] = c0[j] + (x * diff[j]);
-        }
-      };
-    },
-
-    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
-      var domain = dict.get('Domain');
-
-      if (!domain) {
-        error('No domain');
-      }
-
-      var inputSize = domain.length / 2;
-      if (inputSize !== 1) {
-        error('Bad domain for stiched function');
-      }
-
-      var fnRefs = dict.get('Functions');
-      var fns = [];
-      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
-        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
-      }
-
-      var bounds = dict.get('Bounds');
-      var encode = dict.get('Encode');
-
-      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
-    },
-
-    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
-      var domain = IR[1];
-      var bounds = IR[2];
-      var encode = IR[3];
-      var fnsIR = IR[4];
-      var fns = [];
-      var tmpBuf = new Float32Array(1);
-
-      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
-        fns.push(PDFFunction.fromIR(fnsIR[i]));
-      }
-
-      return function constructStichedFromIRResult(src, srcOffset,
-                                                   dest, destOffset) {
-        var clip = function constructStichedFromIRClip(v, min, max) {
-          if (v > max) {
-            v = max;
-          } else if (v < min) {
-            v = min;
-          }
-          return v;
-        };
-
-        // clip to domain
-        var v = clip(src[srcOffset], domain[0], domain[1]);
-        // calulate which bound the value is in
-        for (var i = 0, ii = bounds.length; i < ii; ++i) {
-          if (v < bounds[i]) {
-            break;
-          }
-        }
-
-        // encode value into domain of function
-        var dmin = domain[0];
-        if (i > 0) {
-          dmin = bounds[i - 1];
-        }
-        var dmax = domain[1];
-        if (i < bounds.length) {
-          dmax = bounds[i];
-        }
-
-        var rmin = encode[2 * i];
-        var rmax = encode[2 * i + 1];
-
-        tmpBuf[0] = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
-
-        // call the appropriate function
-        fns[i](tmpBuf, 0, dest, destOffset);
-      };
-    },
-
-    constructPostScript: function PDFFunction_constructPostScript(fn, dict,
-                                                                  xref) {
-      var domain = dict.get('Domain');
-      var range = dict.get('Range');
-
-      if (!domain) {
-        error('No domain.');
-      }
-
-      if (!range) {
-        error('No range.');
-      }
-
-      var lexer = new PostScriptLexer(fn);
-      var parser = new PostScriptParser(lexer);
-      var code = parser.parse();
-
-      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
-    },
-
-    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
-                                          IR) {
-      var domain = IR[1];
-      var range = IR[2];
-      var code = IR[3];
-
-      var compiled = (new PostScriptCompiler()).compile(code, domain, range);
-      if (compiled) {
-        // Compiled function consists of simple expressions such as addition,
-        // subtraction, Math.max, and also contains 'var' and 'return'
-        // statements. See the generation in the PostScriptCompiler below.
-        /*jshint -W054 */
-        return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);
-      }
-
-      info('Unable to compile PS function');
-
-      var numOutputs = range.length >> 1;
-      var numInputs = domain.length >> 1;
-      var evaluator = new PostScriptEvaluator(code);
-      // Cache the values for a big speed up, the cache size is limited though
-      // since the number of possible values can be huge from a PS function.
-      var cache = {};
-      // The MAX_CACHE_SIZE is set to ~4x the maximum number of distinct values
-      // seen in our tests.
-      var MAX_CACHE_SIZE = 2048 * 4;
-      var cache_available = MAX_CACHE_SIZE;
-      var tmpBuf = new Float32Array(numInputs);
-
-      return function constructPostScriptFromIRResult(src, srcOffset,
-                                                      dest, destOffset) {
-        var i, value;
-        var key = '';
-        var input = tmpBuf;
-        for (i = 0; i < numInputs; i++) {
-          value = src[srcOffset + i];
-          input[i] = value;
-          key += value + '_';
-        }
-
-        var cachedValue = cache[key];
-        if (cachedValue !== undefined) {
-          dest.set(cachedValue, destOffset);
-          return;
-        }
-
-        var output = new Float32Array(numOutputs);
-        var stack = evaluator.execute(input);
-        var stackIndex = stack.length - numOutputs;
-        for (i = 0; i < numOutputs; i++) {
-          value = stack[stackIndex + i];
-          var bound = range[i * 2];
-          if (value < bound) {
-            value = bound;
-          } else {
-            bound = range[i * 2 +1];
-            if (value > bound) {
-              value = bound;
-            }
-          }
-          output[i] = value;
-        }
-        if (cache_available > 0) {
-          cache_available--;
-          cache[key] = output;
-        }
-        dest.set(output, destOffset);
-      };
-    }
-  };
-})();
-
-function isPDFFunction(v) {
-  var fnDict;
-  if (typeof v !== 'object') {
-    return false;
-  } else if (isDict(v)) {
-    fnDict = v;
-  } else if (isStream(v)) {
-    fnDict = v.dict;
-  } else {
-    return false;
-  }
-  return fnDict.has('FunctionType');
-}
-
-var PostScriptStack = (function PostScriptStackClosure() {
-  var MAX_STACK_SIZE = 100;
-  function PostScriptStack(initialStack) {
-    this.stack = !initialStack ? [] :
-                 Array.prototype.slice.call(initialStack, 0);
-  }
-
-  PostScriptStack.prototype = {
-    push: function PostScriptStack_push(value) {
-      if (this.stack.length >= MAX_STACK_SIZE) {
-        error('PostScript function stack overflow.');
-      }
-      this.stack.push(value);
-    },
-    pop: function PostScriptStack_pop() {
-      if (this.stack.length <= 0) {
-        error('PostScript function stack underflow.');
-      }
-      return this.stack.pop();
-    },
-    copy: function PostScriptStack_copy(n) {
-      if (this.stack.length + n >= MAX_STACK_SIZE) {
-        error('PostScript function stack overflow.');
-      }
-      var stack = this.stack;
-      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
-        stack.push(stack[i]);
-      }
-    },
-    index: function PostScriptStack_index(n) {
-      this.push(this.stack[this.stack.length - n - 1]);
-    },
-    // rotate the last n stack elements p times
-    roll: function PostScriptStack_roll(n, p) {
-      var stack = this.stack;
-      var l = stack.length - n;
-      var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
-      for (i = l, j = r; i < j; i++, j--) {
-        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
-      }
-      for (i = l, j = c - 1; i < j; i++, j--) {
-        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
-      }
-      for (i = c, j = r; i < j; i++, j--) {
-        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
-      }
-    }
-  };
-  return PostScriptStack;
-})();
-var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
-  function PostScriptEvaluator(operators) {
-    this.operators = operators;
-  }
-  PostScriptEvaluator.prototype = {
-    execute: function PostScriptEvaluator_execute(initialStack) {
-      var stack = new PostScriptStack(initialStack);
-      var counter = 0;
-      var operators = this.operators;
-      var length = operators.length;
-      var operator, a, b;
-      while (counter < length) {
-        operator = operators[counter++];
-        if (typeof operator === 'number') {
-          // Operator is really an operand and should be pushed to the stack.
-          stack.push(operator);
-          continue;
-        }
-        switch (operator) {
-          // non standard ps operators
-          case 'jz': // jump if false
-            b = stack.pop();
-            a = stack.pop();
-            if (!a) {
-              counter = b;
-            }
-            break;
-          case 'j': // jump
-            a = stack.pop();
-            counter = a;
-            break;
-
-          // all ps operators in alphabetical order (excluding if/ifelse)
-          case 'abs':
-            a = stack.pop();
-            stack.push(Math.abs(a));
-            break;
-          case 'add':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a + b);
-            break;
-          case 'and':
-            b = stack.pop();
-            a = stack.pop();
-            if (isBool(a) && isBool(b)) {
-              stack.push(a && b);
-            } else {
-              stack.push(a & b);
-            }
-            break;
-          case 'atan':
-            a = stack.pop();
-            stack.push(Math.atan(a));
-            break;
-          case 'bitshift':
-            b = stack.pop();
-            a = stack.pop();
-            if (a > 0) {
-              stack.push(a << b);
-            } else {
-              stack.push(a >> b);
-            }
-            break;
-          case 'ceiling':
-            a = stack.pop();
-            stack.push(Math.ceil(a));
-            break;
-          case 'copy':
-            a = stack.pop();
-            stack.copy(a);
-            break;
-          case 'cos':
-            a = stack.pop();
-            stack.push(Math.cos(a));
-            break;
-          case 'cvi':
-            a = stack.pop() | 0;
-            stack.push(a);
-            break;
-          case 'cvr':
-            // noop
-            break;
-          case 'div':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a / b);
-            break;
-          case 'dup':
-            stack.copy(1);
-            break;
-          case 'eq':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a === b);
-            break;
-          case 'exch':
-            stack.roll(2, 1);
-            break;
-          case 'exp':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(Math.pow(a, b));
-            break;
-          case 'false':
-            stack.push(false);
-            break;
-          case 'floor':
-            a = stack.pop();
-            stack.push(Math.floor(a));
-            break;
-          case 'ge':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a >= b);
-            break;
-          case 'gt':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a > b);
-            break;
-          case 'idiv':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push((a / b) | 0);
-            break;
-          case 'index':
-            a = stack.pop();
-            stack.index(a);
-            break;
-          case 'le':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a <= b);
-            break;
-          case 'ln':
-            a = stack.pop();
-            stack.push(Math.log(a));
-            break;
-          case 'log':
-            a = stack.pop();
-            stack.push(Math.log(a) / Math.LN10);
-            break;
-          case 'lt':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a < b);
-            break;
-          case 'mod':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a % b);
-            break;
-          case 'mul':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a * b);
-            break;
-          case 'ne':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a !== b);
-            break;
-          case 'neg':
-            a = stack.pop();
-            stack.push(-a);
-            break;
-          case 'not':
-            a = stack.pop();
-            if (isBool(a)) {
-              stack.push(!a);
-            } else {
-              stack.push(~a);
-            }
-            break;
-          case 'or':
-            b = stack.pop();
-            a = stack.pop();
-            if (isBool(a) && isBool(b)) {
-              stack.push(a || b);
-            } else {
-              stack.push(a | b);
-            }
-            break;
-          case 'pop':
-            stack.pop();
-            break;
-          case 'roll':
-            b = stack.pop();
-            a = stack.pop();
-            stack.roll(a, b);
-            break;
-          case 'round':
-            a = stack.pop();
-            stack.push(Math.round(a));
-            break;
-          case 'sin':
-            a = stack.pop();
-            stack.push(Math.sin(a));
-            break;
-          case 'sqrt':
-            a = stack.pop();
-            stack.push(Math.sqrt(a));
-            break;
-          case 'sub':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a - b);
-            break;
-          case 'true':
-            stack.push(true);
-            break;
-          case 'truncate':
-            a = stack.pop();
-            a = a < 0 ? Math.ceil(a) : Math.floor(a);
-            stack.push(a);
-            break;
-          case 'xor':
-            b = stack.pop();
-            a = stack.pop();
-            if (isBool(a) && isBool(b)) {
-              stack.push(a !== b);
-            } else {
-              stack.push(a ^ b);
-            }
-            break;
-          default:
-            error('Unknown operator ' + operator);
-            break;
-        }
-      }
-      return stack.stack;
-    }
-  };
-  return PostScriptEvaluator;
-})();
-
-// Most of the PDFs functions consist of simple operations such as:
-//   roll, exch, sub, cvr, pop, index, dup, mul, if, gt, add.
-//
-// We can compile most of such programs, and at the same moment, we can
-// optimize some expressions using basic math properties. Keeping track of
-// min/max values will allow us to avoid extra Math.min/Math.max calls.
-var PostScriptCompiler = (function PostScriptCompilerClosure() {
-  function AstNode(type) {
-    this.type = type;
-  }
-  AstNode.prototype.visit = function (visitor) {
-    throw new Error('abstract method');
-  };
-
-  function AstArgument(index, min, max) {
-    AstNode.call(this, 'args');
-    this.index = index;
-    this.min = min;
-    this.max = max;
-  }
-  AstArgument.prototype = Object.create(AstNode.prototype);
-  AstArgument.prototype.visit = function (visitor) {
-    visitor.visitArgument(this);
-  };
-
-  function AstLiteral(number) {
-    AstNode.call(this, 'literal');
-    this.number = number;
-    this.min = number;
-    this.max = number;
-  }
-  AstLiteral.prototype = Object.create(AstNode.prototype);
-  AstLiteral.prototype.visit = function (visitor) {
-    visitor.visitLiteral(this);
-  };
-
-  function AstBinaryOperation(op, arg1, arg2, min, max) {
-    AstNode.call(this, 'binary');
-    this.op = op;
-    this.arg1 = arg1;
-    this.arg2 = arg2;
-    this.min = min;
-    this.max = max;
-  }
-  AstBinaryOperation.prototype = Object.create(AstNode.prototype);
-  AstBinaryOperation.prototype.visit = function (visitor) {
-    visitor.visitBinaryOperation(this);
-  };
-
-  function AstMin(arg, max) {
-    AstNode.call(this, 'max');
-    this.arg = arg;
-    this.min = arg.min;
-    this.max = max;
-  }
-  AstMin.prototype = Object.create(AstNode.prototype);
-  AstMin.prototype.visit = function (visitor) {
-    visitor.visitMin(this);
-  };
-
-  function AstVariable(index, min, max) {
-    AstNode.call(this, 'var');
-    this.index = index;
-    this.min = min;
-    this.max = max;
-  }
-  AstVariable.prototype = Object.create(AstNode.prototype);
-  AstVariable.prototype.visit = function (visitor) {
-    visitor.visitVariable(this);
-  };
-
-  function AstVariableDefinition(variable, arg) {
-    AstNode.call(this, 'definition');
-    this.variable = variable;
-    this.arg = arg;
-  }
-  AstVariableDefinition.prototype = Object.create(AstNode.prototype);
-  AstVariableDefinition.prototype.visit = function (visitor) {
-    visitor.visitVariableDefinition(this);
-  };
-
-  function ExpressionBuilderVisitor() {
-    this.parts = [];
-  }
-  ExpressionBuilderVisitor.prototype = {
-    visitArgument: function (arg) {
-      this.parts.push('Math.max(', arg.min, ', Math.min(',
-                      arg.max, ', src[srcOffset + ', arg.index, ']))');
-    },
-    visitVariable: function (variable) {
-      this.parts.push('v', variable.index);
-    },
-    visitLiteral: function (literal) {
-      this.parts.push(literal.number);
-    },
-    visitBinaryOperation: function (operation) {
-      this.parts.push('(');
-      operation.arg1.visit(this);
-      this.parts.push(' ', operation.op, ' ');
-      operation.arg2.visit(this);
-      this.parts.push(')');
-    },
-    visitVariableDefinition: function (definition) {
-      this.parts.push('var ');
-      definition.variable.visit(this);
-      this.parts.push(' = ');
-      definition.arg.visit(this);
-      this.parts.push(';');
-    },
-    visitMin: function (max) {
-      this.parts.push('Math.min(');
-      max.arg.visit(this);
-      this.parts.push(', ', max.max, ')');
-    },
-    toString: function () {
-      return this.parts.join('');
-    }
-  };
-
-  function buildAddOperation(num1, num2) {
-    if (num2.type === 'literal' && num2.number === 0) {
-      // optimization: second operand is 0
-      return num1;
-    }
-    if (num1.type === 'literal' && num1.number === 0) {
-      // optimization: first operand is 0
-      return num2;
-    }
-    if (num2.type === 'literal' && num1.type === 'literal') {
-      // optimization: operands operand are literals
-      return new AstLiteral(num1.number + num2.number);
-    }
-    return new AstBinaryOperation('+', num1, num2,
-                                  num1.min + num2.min, num1.max + num2.max);
-  }
-
-  function buildMulOperation(num1, num2) {
-    if (num2.type === 'literal') {
-      // optimization: second operands is a literal...
-      if (num2.number === 0) {
-        return new AstLiteral(0); // and it's 0
-      } else if (num2.number === 1) {
-        return num1; // and it's 1
-      } else if (num1.type === 'literal') {
-        // ... and first operands is a literal too
-        return new AstLiteral(num1.number * num2.number);
-      }
-    }
-    if (num1.type === 'literal') {
-      // optimization: first operands is a literal...
-      if (num1.number === 0) {
-        return new AstLiteral(0); // and it's 0
-      } else if (num1.number === 1) {
-        return num2; // and it's 1
-      }
-    }
-    var min = Math.min(num1.min * num2.min, num1.min * num2.max,
-                       num1.max * num2.min, num1.max * num2.max);
-    var max = Math.max(num1.min * num2.min, num1.min * num2.max,
-                       num1.max * num2.min, num1.max * num2.max);
-    return new AstBinaryOperation('*', num1, num2, min, max);
-  }
-
-  function buildSubOperation(num1, num2) {
-    if (num2.type === 'literal') {
-      // optimization: second operands is a literal...
-      if (num2.number === 0) {
-        return num1; // ... and it's 0
-      } else if (num1.type === 'literal') {
-        // ... and first operands is a literal too
-        return new AstLiteral(num1.number - num2.number);
-      }
-    }
-    if (num2.type === 'binary' && num2.op === '-' &&
-      num1.type === 'literal' && num1.number === 1 &&
-      num2.arg1.type === 'literal' && num2.arg1.number === 1) {
-      // optimization for case: 1 - (1 - x)
-      return num2.arg2;
-    }
-    return new AstBinaryOperation('-', num1, num2,
-                                  num1.min - num2.max, num1.max - num2.min);
-  }
-
-  function buildMinOperation(num1, max) {
-    if (num1.min >= max) {
-      // optimization: num1 min value is not less than required max
-      return new AstLiteral(max); // just returning max
-    } else if (num1.max <= max) {
-      // optimization: num1 max value is not greater than required max
-      return num1; // just returning an argument
-    }
-    return new AstMin(num1, max);
-  }
-
-  function PostScriptCompiler() {}
-  PostScriptCompiler.prototype = {
-    compile: function PostScriptCompiler_compile(code, domain, range) {
-      var stack = [];
-      var i, ii;
-      var instructions = [];
-      var inputSize = domain.length >> 1, outputSize = range.length >> 1;
-      var lastRegister = 0;
-      var n, j, min, max;
-      var num1, num2, ast1, ast2, tmpVar, item;
-      for (i = 0; i < inputSize; i++) {
-        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));
-      }
-
-      for (i = 0, ii = code.length; i < ii; i++) {
-        item = code[i];
-        if (typeof item === 'number') {
-          stack.push(new AstLiteral(item));
-          continue;
-        }
-
-        switch (item) {
-          case 'add':
-            if (stack.length < 2) {
-              return null;
-            }
-            num2 = stack.pop();
-            num1 = stack.pop();
-            stack.push(buildAddOperation(num1, num2));
-            break;
-          case 'cvr':
-            if (stack.length < 1) {
-              return null;
-            }
-            break;
-          case 'mul':
-            if (stack.length < 2) {
-              return null;
-            }
-            num2 = stack.pop();
-            num1 = stack.pop();
-            stack.push(buildMulOperation(num1, num2));
-            break;
-          case 'sub':
-            if (stack.length < 2) {
-              return null;
-            }
-            num2 = stack.pop();
-            num1 = stack.pop();
-            stack.push(buildSubOperation(num1, num2));
-            break;
-          case 'exch':
-            if (stack.length < 2) {
-              return null;
-            }
-            ast1 = stack.pop(); ast2 = stack.pop();
-            stack.push(ast1, ast2);
-            break;
-          case 'pop':
-            if (stack.length < 1) {
-              return null;
-            }
-            stack.pop();
-            break;
-          case 'index':
-            if (stack.length < 1) {
-              return null;
-            }
-            num1 = stack.pop();
-            if (num1.type !== 'literal') {
-              return null;
-            }
-            n = num1.number;
-            if (n < 0 || (n|0) !== n || stack.length < n) {
-              return null;
-            }
-            ast1 = stack[stack.length - n - 1];
-            if (ast1.type === 'literal' || ast1.type === 'var') {
-              stack.push(ast1);
-              break;
-            }
-            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
-            stack[stack.length - n - 1] = tmpVar;
-            stack.push(tmpVar);
-            instructions.push(new AstVariableDefinition(tmpVar, ast1));
-            break;
-          case 'dup':
-            if (stack.length < 1) {
-              return null;
-            }
-            if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' &&
-                code[i + 3] === i + 7 && code[i + 4] === 'jz' &&
-                code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {
-              // special case of the commands sequence for the min operation
-              num1 = stack.pop();
-              stack.push(buildMinOperation(num1, code[i + 1]));
-              i += 6;
-              break;
-            }
-            ast1 = stack[stack.length - 1];
-            if (ast1.type === 'literal' || ast1.type === 'var') {
-              // we don't have to save into intermediate variable a literal or
-              // variable.
-              stack.push(ast1);
-              break;
-            }
-            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
-            stack[stack.length - 1] = tmpVar;
-            stack.push(tmpVar);
-            instructions.push(new AstVariableDefinition(tmpVar, ast1));
-            break;
-          case 'roll':
-            if (stack.length < 2) {
-              return null;
-            }
-            num2 = stack.pop();
-            num1 = stack.pop();
-            if (num2.type !== 'literal' || num1.type !== 'literal') {
-              // both roll operands must be numbers
-              return null;
-            }
-            j = num2.number;
-            n = num1.number;
-            if (n <= 0 || (n|0) !== n || (j|0) !== j || stack.length < n) {
-              // ... and integers
-              return null;
-            }
-            j = ((j % n) + n) % n;
-            if (j === 0) {
-              break; // just skipping -- there are nothing to rotate
-            }
-            Array.prototype.push.apply(stack,
-                                       stack.splice(stack.length - n, n - j));
-            break;
-          default:
-            return null; // unsupported operator
-        }
-      }
-
-      if (stack.length !== outputSize) {
-        return null;
-      }
-
-      var result = [];
-      instructions.forEach(function (instruction) {
-        var statementBuilder = new ExpressionBuilderVisitor();
-        instruction.visit(statementBuilder);
-        result.push(statementBuilder.toString());
-      });
-      stack.forEach(function (expr, i) {
-        var statementBuilder = new ExpressionBuilderVisitor();
-        expr.visit(statementBuilder);
-        var min = range[i * 2], max = range[i * 2 + 1];
-        var out = [statementBuilder.toString()];
-        if (min > expr.min) {
-          out.unshift('Math.max(', min, ', ');
-          out.push(')');
-        }
-        if (max < expr.max) {
-          out.unshift('Math.min(', max, ', ');
-          out.push(')');
-        }
-        out.unshift('dest[destOffset + ', i, '] = ');
-        out.push(';');
-        result.push(out.join(''));
-      });
-      return result.join('\n');
-    }
-  };
-
-  return PostScriptCompiler;
-})();
-
-
-var ColorSpace = (function ColorSpaceClosure() {
-  // Constructor should define this.numComps, this.defaultColor, this.name
-  function ColorSpace() {
-    error('should not call ColorSpace constructor');
-  }
-
-  ColorSpace.prototype = {
-    /**
-     * Converts the color value to the RGB color. The color components are
-     * located in the src array starting from the srcOffset. Returns the array
-     * of the rgb components, each value ranging from [0,255].
-     */
-    getRgb: function ColorSpace_getRgb(src, srcOffset) {
-      var rgb = new Uint8Array(3);
-      this.getRgbItem(src, srcOffset, rgb, 0);
-      return rgb;
-    },
-    /**
-     * Converts the color value to the RGB color, similar to the getRgb method.
-     * The result placed into the dest array starting from the destOffset.
-     */
-    getRgbItem: function ColorSpace_getRgbItem(src, srcOffset,
-                                               dest, destOffset) {
-      error('Should not call ColorSpace.getRgbItem');
-    },
-    /**
-     * Converts the specified number of the color values to the RGB colors.
-     * The colors are located in the src array starting from the srcOffset.
-     * The result is placed into the dest array starting from the destOffset.
-     * The src array items shall be in [0,2^bits) range, the dest array items
-     * will be in [0,255] range. alpha01 indicates how many alpha components
-     * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA
-     * array).
-     */
-    getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count,
-                                                   dest, destOffset, bits,
-                                                   alpha01) {
-      error('Should not call ColorSpace.getRgbBuffer');
-    },
-    /**
-     * Determines the number of bytes required to store the result of the
-     * conversion done by the getRgbBuffer method. As in getRgbBuffer,
-     * |alpha01| is either 0 (RGB output) or 1 (RGBA output).
-     */
-    getOutputLength: function ColorSpace_getOutputLength(inputLength,
-                                                         alpha01) {
-      error('Should not call ColorSpace.getOutputLength');
-    },
-    /**
-     * Returns true if source data will be equal the result/output data.
-     */
-    isPassthrough: function ColorSpace_isPassthrough(bits) {
-      return false;
-    },
-    /**
-     * Fills in the RGB colors in the destination buffer.  alpha01 indicates
-     * how many alpha components there are in the dest array; it will be either
-     * 0 (RGB array) or 1 (RGBA array).
-     */
-    fillRgb: function ColorSpace_fillRgb(dest, originalWidth,
-                                         originalHeight, width, height,
-                                         actualHeight, bpc, comps, alpha01) {
-      var count = originalWidth * originalHeight;
-      var rgbBuf = null;
-      var numComponentColors = 1 << bpc;
-      var needsResizing = originalHeight !== height || originalWidth !== width;
-      var i, ii;
-
-      if (this.isPassthrough(bpc)) {
-        rgbBuf = comps;
-      } else if (this.numComps === 1 && count > numComponentColors &&
-          this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {
-        // Optimization: create a color map when there is just one component and
-        // we are converting more colors than the size of the color map. We
-        // don't build the map if the colorspace is gray or rgb since those
-        // methods are faster than building a map. This mainly offers big speed
-        // ups for indexed and alternate colorspaces.
-        //
-        // TODO it may be worth while to cache the color map. While running
-        // testing I never hit a cache so I will leave that out for now (perhaps
-        // we are reparsing colorspaces too much?).
-        var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) :
-                                   new Uint16Array(numComponentColors);
-        var key;
-        for (i = 0; i < numComponentColors; i++) {
-          allColors[i] = i;
-        }
-        var colorMap = new Uint8Array(numComponentColors * 3);
-        this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc,
-                          /* alpha01 = */ 0);
-
-        var destPos, rgbPos;
-        if (!needsResizing) {
-          // Fill in the RGB values directly into |dest|.
-          destPos = 0;
-          for (i = 0; i < count; ++i) {
-            key = comps[i] * 3;
-            dest[destPos++] = colorMap[key];
-            dest[destPos++] = colorMap[key + 1];
-            dest[destPos++] = colorMap[key + 2];
-            destPos += alpha01;
-          }
-        } else {
-          rgbBuf = new Uint8Array(count * 3);
-          rgbPos = 0;
-          for (i = 0; i < count; ++i) {
-            key = comps[i] * 3;
-            rgbBuf[rgbPos++] = colorMap[key];
-            rgbBuf[rgbPos++] = colorMap[key + 1];
-            rgbBuf[rgbPos++] = colorMap[key + 2];
-          }
-        }
-      } else {
-        if (!needsResizing) {
-          // Fill in the RGB values directly into |dest|.
-          this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc,
-                            alpha01);
-        } else {
-          rgbBuf = new Uint8Array(count * 3);
-          this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc,
-                            /* alpha01 = */ 0);
-        }
-      }
-
-      if (rgbBuf) {
-        if (needsResizing) {
-          PDFImage.resize(rgbBuf, bpc, 3, originalWidth, originalHeight, width,
-                          height, dest, alpha01);
-        } else {
-          rgbPos = 0;
-          destPos = 0;
-          for (i = 0, ii = width * actualHeight; i < ii; i++) {
-            dest[destPos++] = rgbBuf[rgbPos++];
-            dest[destPos++] = rgbBuf[rgbPos++];
-            dest[destPos++] = rgbBuf[rgbPos++];
-            destPos += alpha01;
-          }
-        }
-      }
-    },
-    /**
-     * True if the colorspace has components in the default range of [0, 1].
-     * This should be true for all colorspaces except for lab color spaces
-     * which are [0,100], [-128, 127], [-128, 127].
-     */
-    usesZeroToOneRange: true
-  };
-
-  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
-    var IR = ColorSpace.parseToIR(cs, xref, res);
-    if (IR instanceof AlternateCS) {
-      return IR;
-    }
-    return ColorSpace.fromIR(IR);
-  };
-
-  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
-    var name = isArray(IR) ? IR[0] : IR;
-    var whitePoint, blackPoint, gamma;
-
-    switch (name) {
-      case 'DeviceGrayCS':
-        return this.singletons.gray;
-      case 'DeviceRgbCS':
-        return this.singletons.rgb;
-      case 'DeviceCmykCS':
-        return this.singletons.cmyk;
-      case 'CalGrayCS':
-        whitePoint = IR[1].WhitePoint;
-        blackPoint = IR[1].BlackPoint;
-        gamma = IR[1].Gamma;
-        return new CalGrayCS(whitePoint, blackPoint, gamma);
-      case 'CalRGBCS':
-        whitePoint = IR[1].WhitePoint;
-        blackPoint = IR[1].BlackPoint;
-        gamma = IR[1].Gamma;
-        var matrix = IR[1].Matrix;
-        return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);
-      case 'PatternCS':
-        var basePatternCS = IR[1];
-        if (basePatternCS) {
-          basePatternCS = ColorSpace.fromIR(basePatternCS);
-        }
-        return new PatternCS(basePatternCS);
-      case 'IndexedCS':
-        var baseIndexedCS = IR[1];
-        var hiVal = IR[2];
-        var lookup = IR[3];
-        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
-      case 'AlternateCS':
-        var numComps = IR[1];
-        var alt = IR[2];
-        var tintFnIR = IR[3];
-
-        return new AlternateCS(numComps, ColorSpace.fromIR(alt),
-                                PDFFunction.fromIR(tintFnIR));
-      case 'LabCS':
-        whitePoint = IR[1].WhitePoint;
-        blackPoint = IR[1].BlackPoint;
-        var range = IR[1].Range;
-        return new LabCS(whitePoint, blackPoint, range);
-      default:
-        error('Unknown name ' + name);
-    }
-    return null;
-  };
-
-  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
-    if (isName(cs)) {
-      var colorSpaces = res.get('ColorSpace');
-      if (isDict(colorSpaces)) {
-        var refcs = colorSpaces.get(cs.name);
-        if (refcs) {
-          cs = refcs;
-        }
-      }
-    }
-
-    cs = xref.fetchIfRef(cs);
-    var mode;
-
-    if (isName(cs)) {
-      mode = cs.name;
-      this.mode = mode;
-
-      switch (mode) {
-        case 'DeviceGray':
-        case 'G':
-          return 'DeviceGrayCS';
-        case 'DeviceRGB':
-        case 'RGB':
-          return 'DeviceRgbCS';
-        case 'DeviceCMYK':
-        case 'CMYK':
-          return 'DeviceCmykCS';
-        case 'Pattern':
-          return ['PatternCS', null];
-        default:
-          error('unrecognized colorspace ' + mode);
-      }
-    } else if (isArray(cs)) {
-      mode = cs[0].name;
-      this.mode = mode;
-      var numComps, params;
-
-      switch (mode) {
-        case 'DeviceGray':
-        case 'G':
-          return 'DeviceGrayCS';
-        case 'DeviceRGB':
-        case 'RGB':
-          return 'DeviceRgbCS';
-        case 'DeviceCMYK':
-        case 'CMYK':
-          return 'DeviceCmykCS';
-        case 'CalGray':
-          params = xref.fetchIfRef(cs[1]).getAll();
-          return ['CalGrayCS', params];
-        case 'CalRGB':
-          params = xref.fetchIfRef(cs[1]).getAll();
-          return ['CalRGBCS', params];
-        case 'ICCBased':
-          var stream = xref.fetchIfRef(cs[1]);
-          var dict = stream.dict;
-          numComps = dict.get('N');
-          if (numComps === 1) {
-            return 'DeviceGrayCS';
-          } else if (numComps === 3) {
-            return 'DeviceRgbCS';
-          } else if (numComps === 4) {
-            return 'DeviceCmykCS';
-          }
-          break;
-        case 'Pattern':
-          var basePatternCS = cs[1];
-          if (basePatternCS) {
-            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
-          }
-          return ['PatternCS', basePatternCS];
-        case 'Indexed':
-        case 'I':
-          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
-          var hiVal = cs[2] + 1;
-          var lookup = xref.fetchIfRef(cs[3]);
-          if (isStream(lookup)) {
-            lookup = lookup.getBytes();
-          }
-          return ['IndexedCS', baseIndexedCS, hiVal, lookup];
-        case 'Separation':
-        case 'DeviceN':
-          var name = cs[1];
-          numComps = 1;
-          if (isName(name)) {
-            numComps = 1;
-          } else if (isArray(name)) {
-            numComps = name.length;
-          }
-          var alt = ColorSpace.parseToIR(cs[2], xref, res);
-          var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
-          return ['AlternateCS', numComps, alt, tintFnIR];
-        case 'Lab':
-          params = cs[1].getAll();
-          return ['LabCS', params];
-        default:
-          error('unimplemented color space object "' + mode + '"');
-      }
-    } else {
-      error('unrecognized color space object: "' + cs + '"');
-    }
-    return null;
-  };
-  /**
-   * Checks if a decode map matches the default decode map for a color space.
-   * This handles the general decode maps where there are two values per
-   * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
-   * This does not handle Lab, Indexed, or Pattern decode maps since they are
-   * slightly different.
-   * @param {Array} decode Decode map (usually from an image).
-   * @param {Number} n Number of components the color space has.
-   */
-  ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
-    if (!decode) {
-      return true;
-    }
-
-    if (n * 2 !== decode.length) {
-      warn('The decode map is not the correct length');
-      return true;
-    }
-    for (var i = 0, ii = decode.length; i < ii; i += 2) {
-      if (decode[i] !== 0 || decode[i + 1] !== 1) {
-        return false;
-      }
-    }
-    return true;
-  };
-
-  ColorSpace.singletons = {
-    get gray() {
-      return shadow(this, 'gray', new DeviceGrayCS());
-    },
-    get rgb() {
-      return shadow(this, 'rgb', new DeviceRgbCS());
-    },
-    get cmyk() {
-      return shadow(this, 'cmyk', new DeviceCmykCS());
-    }
-  };
-
-  return ColorSpace;
-})();
-
-/**
- * Alternate color space handles both Separation and DeviceN color spaces.  A
- * Separation color space is actually just a DeviceN with one color component.
- * Both color spaces use a tinting function to convert colors to a base color
- * space.
- */
-var AlternateCS = (function AlternateCSClosure() {
-  function AlternateCS(numComps, base, tintFn) {
-    this.name = 'Alternate';
-    this.numComps = numComps;
-    this.defaultColor = new Float32Array(numComps);
-    for (var i = 0; i < numComps; ++i) {
-      this.defaultColor[i] = 1;
-    }
-    this.base = base;
-    this.tintFn = tintFn;
-    this.tmpBuf = new Float32Array(base.numComps);
-  }
-
-  AlternateCS.prototype = {
-    getRgb: ColorSpace.prototype.getRgb,
-    getRgbItem: function AlternateCS_getRgbItem(src, srcOffset,
-                                                dest, destOffset) {
-      var tmpBuf = this.tmpBuf;
-      this.tintFn(src, srcOffset, tmpBuf, 0);
-      this.base.getRgbItem(tmpBuf, 0, dest, destOffset);
-    },
-    getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count,
-                                                    dest, destOffset, bits,
-                                                    alpha01) {
-      var tintFn = this.tintFn;
-      var base = this.base;
-      var scale = 1 / ((1 << bits) - 1);
-      var baseNumComps = base.numComps;
-      var usesZeroToOneRange = base.usesZeroToOneRange;
-      var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) &&
-                          alpha01 === 0;
-      var pos = isPassthrough ? destOffset : 0;
-      var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count);
-      var numComps = this.numComps;
-
-      var scaled = new Float32Array(numComps);
-      var tinted = new Float32Array(baseNumComps);
-      var i, j;
-      if (usesZeroToOneRange) {
-        for (i = 0; i < count; i++) {
-          for (j = 0; j < numComps; j++) {
-            scaled[j] = src[srcOffset++] * scale;
-          }
-          tintFn(scaled, 0, tinted, 0);
-          for (j = 0; j < baseNumComps; j++) {
-            baseBuf[pos++] = tinted[j] * 255;
-          }
-        }
-      } else {
-        for (i = 0; i < count; i++) {
-          for (j = 0; j < numComps; j++) {
-            scaled[j] = src[srcOffset++] * scale;
-          }
-          tintFn(scaled, 0, tinted, 0);
-          base.getRgbItem(tinted, 0, baseBuf, pos);
-          pos += baseNumComps;
-        }
-      }
-      if (!isPassthrough) {
-        base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
-      }
-    },
-    getOutputLength: function AlternateCS_getOutputLength(inputLength,
-                                                          alpha01) {
-      return this.base.getOutputLength(inputLength *
-                                       this.base.numComps / this.numComps,
-                                       alpha01);
-    },
-    isPassthrough: ColorSpace.prototype.isPassthrough,
-    fillRgb: ColorSpace.prototype.fillRgb,
-    isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    },
-    usesZeroToOneRange: true
-  };
-
-  return AlternateCS;
-})();
-
-var PatternCS = (function PatternCSClosure() {
-  function PatternCS(baseCS) {
-    this.name = 'Pattern';
-    this.base = baseCS;
-  }
-  PatternCS.prototype = {};
-
-  return PatternCS;
-})();
-
-var IndexedCS = (function IndexedCSClosure() {
-  function IndexedCS(base, highVal, lookup) {
-    this.name = 'Indexed';
-    this.numComps = 1;
-    this.defaultColor = new Uint8Array([0]);
-    this.base = base;
-    this.highVal = highVal;
-
-    var baseNumComps = base.numComps;
-    var length = baseNumComps * highVal;
-    var lookupArray;
-
-    if (isStream(lookup)) {
-      lookupArray = new Uint8Array(length);
-      var bytes = lookup.getBytes(length);
-      lookupArray.set(bytes);
-    } else if (isString(lookup)) {
-      lookupArray = new Uint8Array(length);
-      for (var i = 0; i < length; ++i) {
-        lookupArray[i] = lookup.charCodeAt(i);
-      }
-    } else if (lookup instanceof Uint8Array || lookup instanceof Array) {
-      lookupArray = lookup;
-    } else {
-      error('Unrecognized lookup table: ' + lookup);
-    }
-    this.lookup = lookupArray;
-  }
-
-  IndexedCS.prototype = {
-    getRgb: ColorSpace.prototype.getRgb,
-    getRgbItem: function IndexedCS_getRgbItem(src, srcOffset,
-                                              dest, destOffset) {
-      var numComps = this.base.numComps;
-      var start = src[srcOffset] * numComps;
-      this.base.getRgbItem(this.lookup, start, dest, destOffset);
-    },
-    getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count,
-                                                  dest, destOffset, bits,
-                                                  alpha01) {
-      var base = this.base;
-      var numComps = base.numComps;
-      var outputDelta = base.getOutputLength(numComps, alpha01);
-      var lookup = this.lookup;
-
-      for (var i = 0; i < count; ++i) {
-        var lookupPos = src[srcOffset++] * numComps;
-        base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
-        destOffset += outputDelta;
-      }
-    },
-    getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) {
-      return this.base.getOutputLength(inputLength * this.base.numComps,
-                                       alpha01);
-    },
-    isPassthrough: ColorSpace.prototype.isPassthrough,
-    fillRgb: ColorSpace.prototype.fillRgb,
-    isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
-      // indexed color maps shouldn't be changed
-      return true;
-    },
-    usesZeroToOneRange: true
-  };
-  return IndexedCS;
-})();
-
-var DeviceGrayCS = (function DeviceGrayCSClosure() {
-  function DeviceGrayCS() {
-    this.name = 'DeviceGray';
-    this.numComps = 1;
-    this.defaultColor = new Float32Array([0]);
-  }
-
-  DeviceGrayCS.prototype = {
-    getRgb: ColorSpace.prototype.getRgb,
-    getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset,
-                                                 dest, destOffset) {
-      var c = (src[srcOffset] * 255) | 0;
-      c = c < 0 ? 0 : c > 255 ? 255 : c;
-      dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
-    },
-    getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count,
-                                                     dest, destOffset, bits,
-                                                     alpha01) {
-      var scale = 255 / ((1 << bits) - 1);
-      var j = srcOffset, q = destOffset;
-      for (var i = 0; i < count; ++i) {
-        var c = (scale * src[j++]) | 0;
-        dest[q++] = c;
-        dest[q++] = c;
-        dest[q++] = c;
-        q += alpha01;
-      }
-    },
-    getOutputLength: function DeviceGrayCS_getOutputLength(inputLength,
-                                                           alpha01) {
-      return inputLength * (3 + alpha01);
-    },
-    isPassthrough: ColorSpace.prototype.isPassthrough,
-    fillRgb: ColorSpace.prototype.fillRgb,
-    isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    },
-    usesZeroToOneRange: true
-  };
-  return DeviceGrayCS;
-})();
-
-var DeviceRgbCS = (function DeviceRgbCSClosure() {
-  function DeviceRgbCS() {
-    this.name = 'DeviceRGB';
-    this.numComps = 3;
-    this.defaultColor = new Float32Array([0, 0, 0]);
-  }
-  DeviceRgbCS.prototype = {
-    getRgb: ColorSpace.prototype.getRgb,
-    getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset,
-                                                dest, destOffset) {
-      var r = (src[srcOffset] * 255) | 0;
-      var g = (src[srcOffset + 1] * 255) | 0;
-      var b = (src[srcOffset + 2] * 255) | 0;
-      dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r;
-      dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g;
-      dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b;
-    },
-    getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count,
-                                                    dest, destOffset, bits,
-                                                    alpha01) {
-      if (bits === 8 && alpha01 === 0) {
-        dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
-        return;
-      }
-      var scale = 255 / ((1 << bits) - 1);
-      var j = srcOffset, q = destOffset;
-      for (var i = 0; i < count; ++i) {
-        dest[q++] = (scale * src[j++]) | 0;
-        dest[q++] = (scale * src[j++]) | 0;
-        dest[q++] = (scale * src[j++]) | 0;
-        q += alpha01;
-      }
-    },
-    getOutputLength: function DeviceRgbCS_getOutputLength(inputLength,
-                                                          alpha01) {
-      return (inputLength * (3 + alpha01) / 3) | 0;
-    },
-    isPassthrough: function DeviceRgbCS_isPassthrough(bits) {
-      return bits === 8;
-    },
-    fillRgb: ColorSpace.prototype.fillRgb,
-    isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    },
-    usesZeroToOneRange: true
-  };
-  return DeviceRgbCS;
-})();
-
-var DeviceCmykCS = (function DeviceCmykCSClosure() {
-  // The coefficients below was found using numerical analysis: the method of
-  // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors,
-  // where color_value is the tabular value from the table of sampled RGB colors
-  // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding
-  // CMYK color conversion using the estimation below:
-  //   f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255
-  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {
-    var c = src[srcOffset + 0] * srcScale;
-    var m = src[srcOffset + 1] * srcScale;
-    var y = src[srcOffset + 2] * srcScale;
-    var k = src[srcOffset + 3] * srcScale;
-
-    var r =
-      (c * (-4.387332384609988 * c + 54.48615194189176 * m +
-            18.82290502165302 * y + 212.25662451639585 * k +
-            -285.2331026137004) +
-       m * (1.7149763477362134 * m - 5.6096736904047315 * y +
-            -17.873870861415444 * k - 5.497006427196366) +
-       y * (-2.5217340131683033 * y - 21.248923337353073 * k +
-            17.5119270841813) +
-       k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0;
-    var g =
-      (c * (8.841041422036149 * c + 60.118027045597366 * m +
-            6.871425592049007 * y + 31.159100130055922 * k +
-            -79.2970844816548) +
-       m * (-15.310361306967817 * m + 17.575251261109482 * y +
-            131.35250912493976 * k - 190.9453302588951) +
-       y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) +
-       k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0;
-    var b =
-      (c * (0.8842522430003296 * c + 8.078677503112928 * m +
-            30.89978309703729 * y - 0.23883238689178934 * k +
-            -14.183576799673286) +
-       m * (10.49593273432072 * m + 63.02378494754052 * y +
-            50.606957656360734 * k - 112.23884253719248) +
-       y * (0.03296041114873217 * y + 115.60384449646641 * k +
-            -193.58209356861505) +
-       k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0;
-
-    dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r;
-    dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g;
-    dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b;
-  }
-
-  function DeviceCmykCS() {
-    this.name = 'DeviceCMYK';
-    this.numComps = 4;
-    this.defaultColor = new Float32Array([0, 0, 0, 1]);
-  }
-  DeviceCmykCS.prototype = {
-    getRgb: ColorSpace.prototype.getRgb,
-    getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset,
-                                                 dest, destOffset) {
-      convertToRgb(src, srcOffset, 1, dest, destOffset);
-    },
-    getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count,
-                                                     dest, destOffset, bits,
-                                                     alpha01) {
-      var scale = 1 / ((1 << bits) - 1);
-      for (var i = 0; i < count; i++) {
-        convertToRgb(src, srcOffset, scale, dest, destOffset);
-        srcOffset += 4;
-        destOffset += 3 + alpha01;
-      }
-    },
-    getOutputLength: function DeviceCmykCS_getOutputLength(inputLength,
-                                                           alpha01) {
-      return (inputLength / 4 * (3 + alpha01)) | 0;
-    },
-    isPassthrough: ColorSpace.prototype.isPassthrough,
-    fillRgb: ColorSpace.prototype.fillRgb,
-    isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    },
-    usesZeroToOneRange: true
-  };
-
-  return DeviceCmykCS;
-})();
-
-//
-// CalGrayCS: Based on "PDF Reference, Sixth Ed", p.245
-//
-var CalGrayCS = (function CalGrayCSClosure() {
-  function CalGrayCS(whitePoint, blackPoint, gamma) {
-    this.name = 'CalGray';
-    this.numComps = 1;
-    this.defaultColor = new Float32Array([0]);
-
-    if (!whitePoint) {
-      error('WhitePoint missing - required for color space CalGray');
-    }
-    blackPoint = blackPoint || [0, 0, 0];
-    gamma = gamma || 1;
-
-    // Translate arguments to spec variables.
-    this.XW = whitePoint[0];
-    this.YW = whitePoint[1];
-    this.ZW = whitePoint[2];
-
-    this.XB = blackPoint[0];
-    this.YB = blackPoint[1];
-    this.ZB = blackPoint[2];
-
-    this.G = gamma;
-
-    // Validate variables as per spec.
-    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
-      error('Invalid WhitePoint components for ' + this.name +
-            ', no fallback available');
-    }
-
-    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
-      info('Invalid BlackPoint for ' + this.name + ', falling back to default');
-      this.XB = this.YB = this.ZB = 0;
-    }
-
-    if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {
-      warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB +
-           ', ZB: ' + this.ZB + ', only default values are supported.');
-    }
-
-    if (this.G < 1) {
-      info('Invalid Gamma: ' + this.G + ' for ' + this.name +
-           ', falling back to default');
-      this.G = 1;
-    }
-  }
-
-  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
-    // A represents a gray component of a calibrated gray space.
-    // A <---> AG in the spec
-    var A = src[srcOffset] * scale;
-    var AG = Math.pow(A, cs.G);
-
-    // Computes L as per spec. ( = cs.YW * AG )
-    // Except if other than default BlackPoint values are used.
-    var L = cs.YW * AG;
-    // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4.
-    // Convert values to rgb range [0, 255].
-    var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0;
-    dest[destOffset] = val;
-    dest[destOffset + 1] = val;
-    dest[destOffset + 2] = val;
-  }
-
-  CalGrayCS.prototype = {
-    getRgb: ColorSpace.prototype.getRgb,
-    getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset,
-                                              dest, destOffset) {
-      convertToRgb(this, src, srcOffset, dest, destOffset, 1);
-    },
-    getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count,
-                                                  dest, destOffset, bits,
-                                                  alpha01) {
-      var scale = 1 / ((1 << bits) - 1);
-
-      for (var i = 0; i < count; ++i) {
-        convertToRgb(this, src, srcOffset, dest, destOffset, scale);
-        srcOffset += 1;
-        destOffset += 3 + alpha01;
-      }
-    },
-    getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) {
-      return inputLength * (3 + alpha01);
-    },
-    isPassthrough: ColorSpace.prototype.isPassthrough,
-    fillRgb: ColorSpace.prototype.fillRgb,
-    isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    },
-    usesZeroToOneRange: true
-  };
-  return CalGrayCS;
-})();
-
-//
-// CalRGBCS: Based on "PDF Reference, Sixth Ed", p.247
-//
-var CalRGBCS = (function CalRGBCSClosure() {
-
-  // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these
-  // matrices.
-  var BRADFORD_SCALE_MATRIX = new Float32Array([
-    0.8951, 0.2664, -0.1614,
-    -0.7502, 1.7135, 0.0367,
-    0.0389, -0.0685, 1.0296]);
-
-  var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([
-    0.9869929, -0.1470543, 0.1599627,
-    0.4323053, 0.5183603, 0.0492912,
-    -0.0085287, 0.0400428, 0.9684867]);
-
-  // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html.
-  var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([
-    3.2404542, -1.5371385, -0.4985314,
-    -0.9692660, 1.8760108, 0.0415560,
-    0.0556434, -0.2040259, 1.0572252]);
-
-  var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);
-
-  var tempNormalizeMatrix = new Float32Array(3);
-  var tempConvertMatrix1 = new Float32Array(3);
-  var tempConvertMatrix2 = new Float32Array(3);
-
-  var DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0;
-
-  function CalRGBCS(whitePoint, blackPoint, gamma, matrix) {
-    this.name = 'CalRGB';
-    this.numComps = 3;
-    this.defaultColor = new Float32Array(3);
-
-    if (!whitePoint) {
-      error('WhitePoint missing - required for color space CalRGB');
-    }
-    blackPoint = blackPoint || new Float32Array(3);
-    gamma = gamma || new Float32Array([1, 1, 1]);
-    matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
-
-    // Translate arguments to spec variables.
-    var XW = whitePoint[0];
-    var YW = whitePoint[1];
-    var ZW = whitePoint[2];
-    this.whitePoint = whitePoint;
-
-    var XB = blackPoint[0];
-    var YB = blackPoint[1];
-    var ZB = blackPoint[2];
-    this.blackPoint = blackPoint;
-
-    this.GR = gamma[0];
-    this.GG = gamma[1];
-    this.GB = gamma[2];
-
-    this.MXA = matrix[0];
-    this.MYA = matrix[1];
-    this.MZA = matrix[2];
-    this.MXB = matrix[3];
-    this.MYB = matrix[4];
-    this.MZB = matrix[5];
-    this.MXC = matrix[6];
-    this.MYC = matrix[7];
-    this.MZC = matrix[8];
-
-    // Validate variables as per spec.
-    if (XW < 0 || ZW < 0 || YW !== 1) {
-      error('Invalid WhitePoint components for ' + this.name +
-            ', no fallback available');
-    }
-
-    if (XB < 0 || YB < 0 || ZB < 0) {
-      info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB +
-           ', ' + ZB + '], falling back to default');
-      this.blackPoint = new Float32Array(3);
-    }
-
-    if (this.GR < 0 || this.GG < 0 || this.GB < 0) {
-      info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB +
-           '] for ' + this.name + ', falling back to default');
-      this.GR = this.GG = this.GB = 1;
-    }
-
-    if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 ||
-        this.MXB < 0 || this.MYB < 0 || this.MZB < 0 ||
-        this.MXC < 0 || this.MYC < 0 || this.MZC < 0) {
-      info('Invalid Matrix for ' + this.name + ' [' +
-           this.MXA + ', ' + this.MYA + ', ' + this.MZA +
-           this.MXB + ', ' + this.MYB + ', ' + this.MZB +
-           this.MXC + ', ' + this.MYC + ', ' + this.MZC +
-           '], falling back to default');
-      this.MXA = this.MYB = this.MZC = 1;
-      this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0;
-    }
-  }
-
-  function matrixProduct(a, b, result) {
-      result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
-      result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];
-      result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];
-  }
-
-  function convertToFlat(sourceWhitePoint, LMS, result) {
-      result[0] = LMS[0] * 1 / sourceWhitePoint[0];
-      result[1] = LMS[1] * 1 / sourceWhitePoint[1];
-      result[2] = LMS[2] * 1 / sourceWhitePoint[2];
-  }
-
-  function convertToD65(sourceWhitePoint, LMS, result) {
-    var D65X = 0.95047;
-    var D65Y = 1;
-    var D65Z = 1.08883;
-
-    result[0] = LMS[0] * D65X / sourceWhitePoint[0];
-    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];
-    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];
-  }
-
-  function sRGBTransferFunction(color) {
-    // See http://en.wikipedia.org/wiki/SRGB.
-    if (color <= 0.0031308){
-      return adjustToRange(0, 1, 12.92 * color);
-    }
-
-    return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055);
-  }
-
-  function adjustToRange(min, max, value) {
-    return Math.max(min, Math.min(max, value));
-  }
-
-  function decodeL(L) {
-    if (L < 0) {
-      return -decodeL(-L);
-    }
-
-    if (L > 8.0) {
-      return Math.pow(((L + 16) / 116), 3);
-    }
-
-    return L * DECODE_L_CONSTANT;
-  }
-
-  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {
-
-    // In case the blackPoint is already the default blackPoint then there is
-    // no need to do compensation.
-    if (sourceBlackPoint[0] === 0 &&
-        sourceBlackPoint[1] === 0 &&
-        sourceBlackPoint[2] === 0) {
-      result[0] = XYZ_Flat[0];
-      result[1] = XYZ_Flat[1];
-      result[2] = XYZ_Flat[2];
-      return;
-    }
-
-    // For the blackPoint calculation details, please see
-    // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/
-    // AdobeBPC.pdf.
-    // The destination blackPoint is the default blackPoint [0, 0, 0].
-    var zeroDecodeL = decodeL(0);
-
-    var X_DST = zeroDecodeL;
-    var X_SRC = decodeL(sourceBlackPoint[0]);
-
-    var Y_DST = zeroDecodeL;
-    var Y_SRC = decodeL(sourceBlackPoint[1]);
-
-    var Z_DST = zeroDecodeL;
-    var Z_SRC = decodeL(sourceBlackPoint[2]);
-
-    var X_Scale = (1 - X_DST) / (1 - X_SRC);
-    var X_Offset = 1 - X_Scale;
-
-    var Y_Scale = (1 - Y_DST) / (1 - Y_SRC);
-    var Y_Offset = 1 - Y_Scale;
-
-    var Z_Scale = (1 - Z_DST) / (1 - Z_SRC);
-    var Z_Offset = 1 - Z_Scale;
-
-    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;
-    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;
-    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;
-  }
-
-  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {
-
-    // In case the whitePoint is already flat then there is no need to do
-    // normalization.
-    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {
-      result[0] = XYZ_In[0];
-      result[1] = XYZ_In[1];
-      result[2] = XYZ_In[2];
-      return;
-    }
-
-    var LMS = result;
-    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
-
-    var LMS_Flat = tempNormalizeMatrix;
-    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);
-
-    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);
-  }
-
-  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {
-
-    var LMS = result;
-    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
-
-    var LMS_D65 = tempNormalizeMatrix;
-    convertToD65(sourceWhitePoint, LMS, LMS_D65);
-
-    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);
-  }
-
-  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
-    // A, B and C represent a red, green and blue components of a calibrated
-    // rgb space.
-    var A = adjustToRange(0, 1, src[srcOffset] * scale);
-    var B = adjustToRange(0, 1, src[srcOffset + 1] * scale);
-    var C = adjustToRange(0, 1, src[srcOffset + 2] * scale);
-
-    // A <---> AGR in the spec
-    // B <---> BGG in the spec
-    // C <---> CGB in the spec
-    var AGR = Math.pow(A, cs.GR);
-    var BGG = Math.pow(B, cs.GG);
-    var CGB = Math.pow(C, cs.GB);
-
-    // Computes intermediate variables L, M, N as per spec.
-    // To decode X, Y, Z values map L, M, N directly to them.
-    var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;
-    var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;
-    var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;
-
-    // The following calculations are based on this document:
-    // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/
-    // AdobeBPC.pdf.
-    var XYZ = tempConvertMatrix1;
-    XYZ[0] = X;
-    XYZ[1] = Y;
-    XYZ[2] = Z;
-    var XYZ_Flat = tempConvertMatrix2;
-
-    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);
-
-    var XYZ_Black = tempConvertMatrix1;
-    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);
-
-    var XYZ_D65 = tempConvertMatrix2;
-    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);
-
-    var SRGB = tempConvertMatrix1;
-    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);
-
-    var sR = sRGBTransferFunction(SRGB[0]);
-    var sG = sRGBTransferFunction(SRGB[1]);
-    var sB = sRGBTransferFunction(SRGB[2]);
-
-    // Convert the values to rgb range [0, 255].
-    dest[destOffset] = Math.round(sR * 255);
-    dest[destOffset + 1] = Math.round(sG * 255);
-    dest[destOffset + 2] = Math.round(sB * 255);
-  }
-
-  CalRGBCS.prototype = {
-    getRgb: function CalRGBCS_getRgb(src, srcOffset) {
-      var rgb = new Uint8Array(3);
-      this.getRgbItem(src, srcOffset, rgb, 0);
-      return rgb;
-    },
-    getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset,
-                                             dest, destOffset) {
-      convertToRgb(this, src, srcOffset, dest, destOffset, 1);
-    },
-    getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count,
-                                                 dest, destOffset, bits,
-                                                 alpha01) {
-      var scale = 1 / ((1 << bits) - 1);
-
-      for (var i = 0; i < count; ++i) {
-        convertToRgb(this, src, srcOffset, dest, destOffset, scale);
-        srcOffset += 3;
-        destOffset += 3 + alpha01;
-      }
-    },
-    getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) {
-      return (inputLength * (3 + alpha01) / 3) | 0;
-    },
-    isPassthrough: ColorSpace.prototype.isPassthrough,
-    fillRgb: ColorSpace.prototype.fillRgb,
-    isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    },
-    usesZeroToOneRange: true
-  };
-  return CalRGBCS;
-})();
-
-//
-// LabCS: Based on "PDF Reference, Sixth Ed", p.250
-//
-var LabCS = (function LabCSClosure() {
-  function LabCS(whitePoint, blackPoint, range) {
-    this.name = 'Lab';
-    this.numComps = 3;
-    this.defaultColor = new Float32Array([0, 0, 0]);
-
-    if (!whitePoint) {
-      error('WhitePoint missing - required for color space Lab');
-    }
-    blackPoint = blackPoint || [0, 0, 0];
-    range = range || [-100, 100, -100, 100];
-
-    // Translate args to spec variables
-    this.XW = whitePoint[0];
-    this.YW = whitePoint[1];
-    this.ZW = whitePoint[2];
-    this.amin = range[0];
-    this.amax = range[1];
-    this.bmin = range[2];
-    this.bmax = range[3];
-
-    // These are here just for completeness - the spec doesn't offer any
-    // formulas that use BlackPoint in Lab
-    this.XB = blackPoint[0];
-    this.YB = blackPoint[1];
-    this.ZB = blackPoint[2];
-
-    // Validate vars as per spec
-    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
-      error('Invalid WhitePoint components, no fallback available');
-    }
-
-    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
-      info('Invalid BlackPoint, falling back to default');
-      this.XB = this.YB = this.ZB = 0;
-    }
-
-    if (this.amin > this.amax || this.bmin > this.bmax) {
-      info('Invalid Range, falling back to defaults');
-      this.amin = -100;
-      this.amax = 100;
-      this.bmin = -100;
-      this.bmax = 100;
-    }
-  }
-
-  // Function g(x) from spec
-  function fn_g(x) {
-    if (x >= 6 / 29) {
-      return x * x * x;
-    } else {
-      return (108 / 841) * (x - 4 / 29);
-    }
-  }
-
-  function decode(value, high1, low2, high2) {
-    return low2 + (value) * (high2 - low2) / (high1);
-  }
-
-  // If decoding is needed maxVal should be 2^bits per component - 1.
-  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {
-    // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax]
-    // not the usual [0, 1]. If a command like setFillColor is used the src
-    // values will already be within the correct range. However, if we are
-    // converting an image we have to map the values to the correct range given
-    // above.
-    // Ls,as,bs <---> L*,a*,b* in the spec
-    var Ls = src[srcOffset];
-    var as = src[srcOffset + 1];
-    var bs = src[srcOffset + 2];
-    if (maxVal !== false) {
-      Ls = decode(Ls, maxVal, 0, 100);
-      as = decode(as, maxVal, cs.amin, cs.amax);
-      bs = decode(bs, maxVal, cs.bmin, cs.bmax);
-    }
-
-    // Adjust limits of 'as' and 'bs'
-    as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;
-    bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;
-
-    // Computes intermediate variables X,Y,Z as per spec
-    var M = (Ls + 16) / 116;
-    var L = M + (as / 500);
-    var N = M - (bs / 200);
-
-    var X = cs.XW * fn_g(L);
-    var Y = cs.YW * fn_g(M);
-    var Z = cs.ZW * fn_g(N);
-
-    var r, g, b;
-    // Using different conversions for D50 and D65 white points,
-    // per http://www.color.org/srgb.pdf
-    if (cs.ZW < 1) {
-      // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249)
-      r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;
-      g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;
-      b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;
-    } else {
-      // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888)
-      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
-      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
-      b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;
-    }
-    // clamp color values to [0,1] range then convert to [0,255] range.
-    dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0;
-    dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0;
-    dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0;
-  }
-
-  LabCS.prototype = {
-    getRgb: ColorSpace.prototype.getRgb,
-    getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) {
-      convertToRgb(this, src, srcOffset, false, dest, destOffset);
-    },
-    getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count,
-                                              dest, destOffset, bits,
-                                              alpha01) {
-      var maxVal = (1 << bits) - 1;
-      for (var i = 0; i < count; i++) {
-        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);
-        srcOffset += 3;
-        destOffset += 3 + alpha01;
-      }
-    },
-    getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) {
-      return (inputLength * (3 + alpha01) / 3) | 0;
-    },
-    isPassthrough: ColorSpace.prototype.isPassthrough,
-    fillRgb: ColorSpace.prototype.fillRgb,
-    isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
-      // XXX: Decoding is handled with the lab conversion because of the strange
-      // ranges that are used.
-      return true;
-    },
-    usesZeroToOneRange: false
-  };
-  return LabCS;
-})();
-
-
-var ARCFourCipher = (function ARCFourCipherClosure() {
-  function ARCFourCipher(key) {
-    this.a = 0;
-    this.b = 0;
-    var s = new Uint8Array(256);
-    var i, j = 0, tmp, keyLength = key.length;
-    for (i = 0; i < 256; ++i) {
-      s[i] = i;
-    }
-    for (i = 0; i < 256; ++i) {
-      tmp = s[i];
-      j = (j + tmp + key[i % keyLength]) & 0xFF;
-      s[i] = s[j];
-      s[j] = tmp;
-    }
-    this.s = s;
-  }
-
-  ARCFourCipher.prototype = {
-    encryptBlock: function ARCFourCipher_encryptBlock(data) {
-      var i, n = data.length, tmp, tmp2;
-      var a = this.a, b = this.b, s = this.s;
-      var output = new Uint8Array(n);
-      for (i = 0; i < n; ++i) {
-        a = (a + 1) & 0xFF;
-        tmp = s[a];
-        b = (b + tmp) & 0xFF;
-        tmp2 = s[b];
-        s[a] = tmp2;
-        s[b] = tmp;
-        output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
-      }
-      this.a = a;
-      this.b = b;
-      return output;
-    }
-  };
-  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
-
-  return ARCFourCipher;
-})();
-
-var calculateMD5 = (function calculateMD5Closure() {
-  var r = new Uint8Array([
-    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
-    5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
-    4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
-    6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
-
-  var k = new Int32Array([
-    -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
-    -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
-    1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
-    643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
-    568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
-    1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
-    -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
-    -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
-    -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
-    -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
-    -145523070, -1120210379, 718787259, -343485551]);
-
-  function hash(data, offset, length) {
-    var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
-    // pre-processing
-    var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
-    var padded = new Uint8Array(paddedLength);
-    var i, j, n;
-    for (i = 0; i < length; ++i) {
-      padded[i] = data[offset++];
-    }
-    padded[i++] = 0x80;
-    n = paddedLength - 8;
-    while (i < n) {
-      padded[i++] = 0;
-    }
-    padded[i++] = (length << 3) & 0xFF;
-    padded[i++] = (length >> 5) & 0xFF;
-    padded[i++] = (length >> 13) & 0xFF;
-    padded[i++] = (length >> 21) & 0xFF;
-    padded[i++] = (length >>> 29) & 0xFF;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    var w = new Int32Array(16);
-    for (i = 0; i < paddedLength;) {
-      for (j = 0; j < 16; ++j, i += 4) {
-        w[j] = (padded[i] | (padded[i + 1] << 8) |
-               (padded[i + 2] << 16) | (padded[i + 3] << 24));
-      }
-      var a = h0, b = h1, c = h2, d = h3, f, g;
-      for (j = 0; j < 64; ++j) {
-        if (j < 16) {
-          f = (b & c) | ((~b) & d);
-          g = j;
-        } else if (j < 32) {
-          f = (d & b) | ((~d) & c);
-          g = (5 * j + 1) & 15;
-        } else if (j < 48) {
-          f = b ^ c ^ d;
-          g = (3 * j + 5) & 15;
-        } else {
-          f = c ^ (b | (~d));
-          g = (7 * j) & 15;
-        }
-        var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
-        d = c;
-        c = b;
-        b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
-        a = tmp;
-      }
-      h0 = (h0 + a) | 0;
-      h1 = (h1 + b) | 0;
-      h2 = (h2 + c) | 0;
-      h3 = (h3 + d) | 0;
-    }
-    return new Uint8Array([
-      h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
-      h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
-      h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
-      h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
-    ]);
-  }
-
-  return hash;
-})();
-var Word64 = (function Word64Closure() {
-  function Word64(highInteger, lowInteger) {
-    this.high = highInteger | 0;
-    this.low = lowInteger | 0;
-  }
-  Word64.prototype = {
-    and: function Word64_and(word) {
-      this.high &= word.high;
-      this.low &= word.low;
-    },
-    xor: function Word64_xor(word) {
-     this.high ^= word.high;
-     this.low ^= word.low;
-    },
-
-    or: function Word64_or(word) {
-      this.high |= word.high;
-      this.low |= word.low;
-    },
-
-    shiftRight: function Word64_shiftRight(places) {
-      if (places >= 32) {
-        this.low = (this.high >>> (places - 32)) | 0;
-        this.high = 0;
-      } else {
-        this.low = (this.low >>> places) | (this.high << (32 - places));
-        this.high = (this.high >>> places) | 0;
-      }
-    },
-
-    shiftLeft: function Word64_shiftLeft(places) {
-      if (places >= 32) {
-        this.high = this.low << (places - 32);
-        this.low = 0;
-      } else {
-        this.high = (this.high << places) | (this.low >>> (32 - places));
-        this.low = this.low << places;
-      }
-    },
-
-    rotateRight: function Word64_rotateRight(places) {
-      var low, high;
-      if (places & 32) {
-        high = this.low;
-        low = this.high;
-      } else {
-        low = this.low;
-        high = this.high;
-      }
-      places &= 31;
-      this.low = (low >>> places) | (high << (32 - places));
-      this.high = (high >>> places) | (low << (32 - places));
-    },
-
-    not: function Word64_not() {
-      this.high = ~this.high;
-      this.low = ~this.low;
-    },
-
-    add: function Word64_add(word) {
-      var lowAdd = (this.low >>> 0) + (word.low >>> 0);
-      var highAdd = (this.high >>> 0) + (word.high >>> 0);
-      if (lowAdd > 0xFFFFFFFF) {
-        highAdd += 1;
-      }
-      this.low = lowAdd | 0;
-      this.high = highAdd | 0;
-    },
-
-    copyTo: function Word64_copyTo(bytes, offset) {
-      bytes[offset] = (this.high >>> 24) & 0xFF;
-      bytes[offset + 1] = (this.high >> 16) & 0xFF;
-      bytes[offset + 2] = (this.high >> 8) & 0xFF;
-      bytes[offset + 3] = this.high & 0xFF;
-      bytes[offset + 4] = (this.low >>> 24) & 0xFF;
-      bytes[offset + 5] = (this.low >> 16) & 0xFF;
-      bytes[offset + 6] = (this.low >> 8) & 0xFF;
-      bytes[offset + 7] = this.low & 0xFF;
-    },
-
-    assign: function Word64_assign(word) {
-      this.high = word.high;
-      this.low = word.low;
-    }
-  };
-  return Word64;
-})();
-
-var calculateSHA256 = (function calculateSHA256Closure() {
-  function rotr(x, n) {
-    return (x >>> n) | (x << 32 - n);
-  }
-
-  function ch(x, y, z) {
-    return (x & y) ^ (~x & z);
-  }
-
-  function maj(x, y, z) {
-    return (x & y) ^ (x & z) ^ (y & z);
-  }
-
-  function sigma(x) {
-    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
-  }
-
-  function sigmaPrime(x) {
-    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
-  }
-
-  function littleSigma(x) {
-    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;
-  }
-
-  function littleSigmaPrime(x) {
-    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;
-  }
-
-  var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
-           0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
-           0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
-           0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
-           0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
-           0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
-           0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
-           0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
-           0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
-           0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
-           0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
-           0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
-           0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
-           0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
-           0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
-           0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
-
-  function hash(data, offset, length) {
-    // initial hash values
-    var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372,
-        h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c,
-        h6 = 0x1f83d9ab, h7 = 0x5be0cd19;
-    // pre-processing
-    var paddedLength = Math.ceil((length + 9) / 64) * 64;
-    var padded = new Uint8Array(paddedLength);
-    var i, j, n;
-    for (i = 0; i < length; ++i) {
-      padded[i] = data[offset++];
-    }
-    padded[i++] = 0x80;
-    n = paddedLength - 8;
-    while (i < n) {
-      padded[i++] = 0;
-    }
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = (length >>> 29) & 0xFF;
-    padded[i++] = (length >> 21) & 0xFF;
-    padded[i++] = (length >> 13) & 0xFF;
-    padded[i++] = (length >> 5) & 0xFF;
-    padded[i++] = (length << 3) & 0xFF;
-    var w = new Uint32Array(64);
-    // for each 512 bit block
-    for (i = 0; i < paddedLength;) {
-      for (j = 0; j < 16; ++j) {
-        w[j] = (padded[i] << 24 | (padded[i + 1] << 16) |
-               (padded[i + 2] << 8) | (padded[i + 3]));
-        i += 4;
-      }
-
-      for (j = 16; j < 64; ++j) {
-        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] +
-               littleSigma(w[j - 15]) + w[j - 16] | 0;
-      }
-      var a = h0, b = h1, c = h2, d = h3, e = h4,
-          f = h5, g = h6, h = h7, t1, t2;
-      for (j = 0; j < 64; ++j) {
-        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];
-        t2 = sigma(a) + maj(a, b, c);
-        h = g;
-        g = f;
-        f = e;
-        e = (d + t1) | 0;
-        d = c;
-        c = b;
-        b = a;
-        a = (t1 + t2) | 0;
-      }
-      h0 = (h0 + a) | 0;
-      h1 = (h1 + b) | 0;
-      h2 = (h2 + c) | 0;
-      h3 = (h3 + d) | 0;
-      h4 = (h4 + e) | 0;
-      h5 = (h5 + f) | 0;
-      h6 = (h6 + g) | 0;
-      h7 = (h7 + h) | 0;
-    }
-    return new Uint8Array([
-      (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF,
-      (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF,
-      (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF,
-      (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF,
-      (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF,
-      (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF,
-      (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF,
-      (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF
-    ]);
-  }
-
-  return hash;
-})();
-
-var calculateSHA512 = (function calculateSHA512Closure() {
-  function ch(result, x, y, z, tmp) {
-    result.assign(x);
-    result.and(y);
-    tmp.assign(x);
-    tmp.not();
-    tmp.and(z);
-    result.xor(tmp);
-  }
-
-  function maj(result, x, y, z, tmp) {
-    result.assign(x);
-    result.and(y);
-    tmp.assign(x);
-    tmp.and(z);
-    result.xor(tmp);
-    tmp.assign(y);
-    tmp.and(z);
-    result.xor(tmp);
-  }
-
-  function sigma(result, x, tmp) {
-    result.assign(x);
-    result.rotateRight(28);
-    tmp.assign(x);
-    tmp.rotateRight(34);
-    result.xor(tmp);
-    tmp.assign(x);
-    tmp.rotateRight(39);
-    result.xor(tmp);
-  }
-
-  function sigmaPrime(result, x, tmp) {
-    result.assign(x);
-    result.rotateRight(14);
-    tmp.assign(x);
-    tmp.rotateRight(18);
-    result.xor(tmp);
-    tmp.assign(x);
-    tmp.rotateRight(41);
-    result.xor(tmp);
-  }
-
-  function littleSigma(result, x, tmp) {
-    result.assign(x);
-    result.rotateRight(1);
-    tmp.assign(x);
-    tmp.rotateRight(8);
-    result.xor(tmp);
-    tmp.assign(x);
-    tmp.shiftRight(7);
-    result.xor(tmp);
-  }
-
-  function littleSigmaPrime(result, x, tmp) {
-    result.assign(x);
-    result.rotateRight(19);
-    tmp.assign(x);
-    tmp.rotateRight(61);
-    result.xor(tmp);
-    tmp.assign(x);
-    tmp.shiftRight(6);
-    result.xor(tmp);
-  }
-
-  var k = [
-    new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd),
-    new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc),
-    new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019),
-    new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118),
-    new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe),
-    new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2),
-    new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1),
-    new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694),
-    new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3),
-    new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65),
-    new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483),
-    new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5),
-    new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210),
-    new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4),
-    new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725),
-    new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70),
-    new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926),
-    new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df),
-    new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8),
-    new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b),
-    new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001),
-    new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30),
-    new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910),
-    new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8),
-    new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53),
-    new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8),
-    new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb),
-    new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3),
-    new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60),
-    new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec),
-    new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9),
-    new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b),
-    new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207),
-    new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178),
-    new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6),
-    new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b),
-    new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493),
-    new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c),
-    new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a),
-    new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];
-
-  function hash(data, offset, length, mode384) {
-    mode384 = !!mode384;
-    // initial hash values
-    var h0, h1, h2, h3, h4, h5, h6, h7;
-    if (!mode384) {
-      h0 = new Word64(0x6a09e667, 0xf3bcc908);
-      h1 = new Word64(0xbb67ae85, 0x84caa73b);
-      h2 = new Word64(0x3c6ef372, 0xfe94f82b);
-      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);
-      h4 = new Word64(0x510e527f, 0xade682d1);
-      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);
-      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);
-      h7 = new Word64(0x5be0cd19, 0x137e2179);
-    }
-    else {
-      // SHA384 is exactly the same
-      // except with different starting values and a trimmed result
-      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);
-      h1 = new Word64(0x629a292a, 0x367cd507);
-      h2 = new Word64(0x9159015a, 0x3070dd17);
-      h3 = new Word64(0x152fecd8, 0xf70e5939);
-      h4 = new Word64(0x67332667, 0xffc00b31);
-      h5 = new Word64(0x8eb44a87, 0x68581511);
-      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);
-      h7 = new Word64(0x47b5481d, 0xbefa4fa4);
-    }
-
-    // pre-processing
-    var paddedLength = Math.ceil((length + 17) / 128) * 128;
-    var padded = new Uint8Array(paddedLength);
-    var i, j, n;
-    for (i = 0; i < length; ++i) {
-      padded[i] = data[offset++];
-    }
-    padded[i++] = 0x80;
-    n = paddedLength - 16;
-    while (i < n) {
-      padded[i++] = 0;
-    }
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = (length >>> 29) & 0xFF;
-    padded[i++] = (length >> 21) & 0xFF;
-    padded[i++] = (length >> 13) & 0xFF;
-    padded[i++] = (length >> 5) & 0xFF;
-    padded[i++] = (length << 3) & 0xFF;
-
-    var w = new Array(80);
-    for (i = 0; i < 80; i++) {
-      w[i] = new Word64(0, 0);
-    }
-    var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0);
-    var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0);
-    var g = new Word64(0, 0), h = new Word64(0, 0);
-    var t1 = new Word64(0, 0), t2 = new Word64(0, 0);
-    var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3;
-
-    // for each 1024 bit block
-    for (i = 0; i < paddedLength;) {
-      for (j = 0; j < 16; ++j) {
-        w[j].high = (padded[i] << 24) | (padded[i + 1] << 16) |
-                    (padded[i + 2] << 8) | (padded[i + 3]);
-        w[j].low = (padded[i + 4]) << 24 | (padded[i + 5]) << 16 |
-                   (padded[i + 6]) << 8 | (padded[i + 7]);
-        i += 8;
-      }
-      for (j = 16; j < 80; ++j) {
-        tmp3 = w[j];
-        littleSigmaPrime(tmp3, w[j - 2], tmp2);
-        tmp3.add(w[j - 7]);
-        littleSigma(tmp1, w[j - 15], tmp2);
-        tmp3.add(tmp1);
-        tmp3.add(w[j - 16]);
-      }
-
-      a.assign(h0); b.assign(h1); c.assign(h2); d.assign(h3);
-      e.assign(h4); f.assign(h5); g.assign(h6); h.assign(h7);
-      for (j = 0; j < 80; ++j) {
-        t1.assign(h);
-        sigmaPrime(tmp1, e, tmp2);
-        t1.add(tmp1);
-        ch(tmp1, e, f, g, tmp2);
-        t1.add(tmp1);
-        t1.add(k[j]);
-        t1.add(w[j]);
-
-        sigma(t2, a, tmp2);
-        maj(tmp1, a, b, c, tmp2);
-        t2.add(tmp1);
-
-        tmp3 = h;
-        h = g;
-        g = f;
-        f = e;
-        d.add(t1);
-        e = d;
-        d = c;
-        c = b;
-        b = a;
-        tmp3.assign(t1);
-        tmp3.add(t2);
-        a = tmp3;
-      }
-      h0.add(a);
-      h1.add(b);
-      h2.add(c);
-      h3.add(d);
-      h4.add(e);
-      h5.add(f);
-      h6.add(g);
-      h7.add(h);
-    }
-
-    var result;
-    if (!mode384) {
-      result = new Uint8Array(64);
-      h0.copyTo(result,0);
-      h1.copyTo(result,8);
-      h2.copyTo(result,16);
-      h3.copyTo(result,24);
-      h4.copyTo(result,32);
-      h5.copyTo(result,40);
-      h6.copyTo(result,48);
-      h7.copyTo(result,56);
-    }
-    else {
-      result = new Uint8Array(48);
-      h0.copyTo(result,0);
-      h1.copyTo(result,8);
-      h2.copyTo(result,16);
-      h3.copyTo(result,24);
-      h4.copyTo(result,32);
-      h5.copyTo(result,40);
-    }
-    return result;
-  }
-
-  return hash;
-})();
-var calculateSHA384 = (function calculateSHA384Closure() {
-  function hash(data, offset, length) {
-    return calculateSHA512(data, offset, length, true);
-  }
-
-  return hash;
-})();
-var NullCipher = (function NullCipherClosure() {
-  function NullCipher() {
-  }
-
-  NullCipher.prototype = {
-    decryptBlock: function NullCipher_decryptBlock(data) {
-      return data;
-    }
-  };
-
-  return NullCipher;
-})();
-
-var AES128Cipher = (function AES128CipherClosure() {
-  var rcon = new Uint8Array([
-    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
-    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
-    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
-    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
-    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
-    0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
-    0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
-    0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
-    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
-    0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
-    0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
-    0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
-    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
-    0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
-    0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
-    0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
-    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
-    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
-    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
-    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
-    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
-    0x74, 0xe8, 0xcb, 0x8d]);
-
-  var s = new Uint8Array([
-    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
-    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
-    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
-    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
-    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
-    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
-    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
-    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
-    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
-    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
-    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
-    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
-    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
-    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
-    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
-    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
-    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
-    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
-    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
-    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
-    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
-    0xb0, 0x54, 0xbb, 0x16]);
-
-  var inv_s = new Uint8Array([
-    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
-    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
-    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
-    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
-    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
-    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
-    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
-    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
-    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
-    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
-    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
-    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
-    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
-    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
-    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
-    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
-    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
-    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
-    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
-    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
-    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
-    0x55, 0x21, 0x0c, 0x7d]);
-  var mixCol = new Uint8Array(256);
-  for (var i = 0; i < 256; i++) {
-    if (i < 128) {
-      mixCol[i] = i << 1;
-    } else {
-      mixCol[i] = (i << 1) ^ 0x1b;
-    }
-  }
-  var mix = new Uint32Array([
-    0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
-    0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
-    0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
-    0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
-    0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
-    0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
-    0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
-    0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
-    0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
-    0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
-    0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
-    0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
-    0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
-    0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
-    0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
-    0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
-    0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
-    0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
-    0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
-    0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
-    0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
-    0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
-    0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
-    0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
-    0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
-    0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
-    0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
-    0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
-    0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
-    0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
-    0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
-    0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
-    0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
-    0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
-    0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
-    0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
-    0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
-    0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
-    0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
-    0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
-    0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
-    0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
-    0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
-
-  function expandKey128(cipherKey) {
-    var b = 176, result = new Uint8Array(b);
-    result.set(cipherKey);
-    for (var j = 16, i = 1; j < b; ++i) {
-      // RotWord
-      var t1 = result[j - 3], t2 = result[j - 2],
-          t3 = result[j - 1], t4 = result[j - 4];
-      // SubWord
-      t1 = s[t1];
-      t2 = s[t2];
-      t3 = s[t3];
-      t4 = s[t4];
-      // Rcon
-      t1 = t1 ^ rcon[i];
-      for (var n = 0; n < 4; ++n) {
-        result[j] = (t1 ^= result[j - 16]);
-        j++;
-        result[j] = (t2 ^= result[j - 16]);
-        j++;
-        result[j] = (t3 ^= result[j - 16]);
-        j++;
-        result[j] = (t4 ^= result[j - 16]);
-        j++;
-      }
-    }
-    return result;
-  }
-
-  function decrypt128(input, key) {
-    var state = new Uint8Array(16);
-    state.set(input);
-    var i, j, k;
-    var t, u, v;
-    // AddRoundKey
-    for (j = 0, k = 160; j < 16; ++j, ++k) {
-      state[j] ^= key[k];
-    }
-    for (i = 9; i >= 1; --i) {
-      // InvShiftRows
-      t = state[13];
-      state[13] = state[9];
-      state[9] = state[5];
-      state[5] = state[1];
-      state[1] = t;
-      t = state[14];
-      u = state[10];
-      state[14] = state[6];
-      state[10] = state[2];
-      state[6] = t;
-      state[2] = u;
-      t = state[15];
-      u = state[11];
-      v = state[7];
-      state[15] = state[3];
-      state[11] = t;
-      state[7] = u;
-      state[3] = v;
-      // InvSubBytes
-      for (j = 0; j < 16; ++j) {
-        state[j] = inv_s[state[j]];
-      }
-      // AddRoundKey
-      for (j = 0, k = i * 16; j < 16; ++j, ++k) {
-        state[j] ^= key[k];
-      }
-      // InvMixColumns
-      for (j = 0; j < 16; j += 4) {
-        var s0 = mix[state[j]], s1 = mix[state[j + 1]],
-          s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
-        t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
-          (s3 >>> 24) ^ (s3 << 8));
-        state[j] = (t >>> 24) & 0xFF;
-        state[j + 1] = (t >> 16) & 0xFF;
-        state[j + 2] = (t >> 8) & 0xFF;
-        state[j + 3] = t & 0xFF;
-      }
-    }
-    // InvShiftRows
-    t = state[13];
-    state[13] = state[9];
-    state[9] = state[5];
-    state[5] = state[1];
-    state[1] = t;
-    t = state[14];
-    u = state[10];
-    state[14] = state[6];
-    state[10] = state[2];
-    state[6] = t;
-    state[2] = u;
-    t = state[15];
-    u = state[11];
-    v = state[7];
-    state[15] = state[3];
-    state[11] = t;
-    state[7] = u;
-    state[3] = v;
-    for (j = 0; j < 16; ++j) {
-      // InvSubBytes
-      state[j] = inv_s[state[j]];
-      // AddRoundKey
-      state[j] ^= key[j];
-    }
-    return state;
-  }
-
-  function encrypt128(input, key) {
-    var t, u, v, k;
-    var state = new Uint8Array(16);
-    state.set(input);
-    for (j = 0; j < 16; ++j) {
-      // AddRoundKey
-      state[j] ^= key[j];
-    }
-
-    for (i = 1; i < 10; i++) {
-      //SubBytes
-      for (j = 0; j < 16; ++j) {
-        state[j] = s[state[j]];
-      }
-      //ShiftRows
-      v = state[1];
-      state[1] = state[5];
-      state[5] = state[9];
-      state[9] = state[13];
-      state[13] = v;
-      v = state[2];
-      u = state[6];
-      state[2] = state[10];
-      state[6] = state[14];
-      state[10] = v;
-      state[14] = u;
-      v = state[3];
-      u = state[7];
-      t = state[11];
-      state[3] = state[15];
-      state[7] = v;
-      state[11] = u;
-      state[15] = t;
-      //MixColumns
-      for (var j = 0; j < 16; j += 4) {
-        var s0 = state[j + 0], s1 = state[j + 1];
-        var s2 = state[j + 2], s3 = state[j + 3];
-        t = s0 ^ s1 ^ s2 ^ s3;
-        state[j + 0] ^= t ^ mixCol[s0 ^ s1];
-        state[j + 1] ^= t ^ mixCol[s1 ^ s2];
-        state[j + 2] ^= t ^ mixCol[s2 ^ s3];
-        state[j + 3] ^= t ^ mixCol[s3 ^ s0];
-      }
-      //AddRoundKey
-      for (j = 0, k = i * 16; j < 16; ++j, ++k) {
-        state[j] ^= key[k];
-      }
-    }
-
-    //SubBytes
-    for (j = 0; j < 16; ++j) {
-      state[j] = s[state[j]];
-    }
-    //ShiftRows
-    v = state[1];
-    state[1] = state[5];
-    state[5] = state[9];
-    state[9] = state[13];
-    state[13] = v;
-    v = state[2];
-    u = state[6];
-    state[2] = state[10];
-    state[6] = state[14];
-    state[10] = v;
-    state[14] = u;
-    v = state[3];
-    u = state[7];
-    t = state[11];
-    state[3] = state[15];
-    state[7] = v;
-    state[11] = u;
-    state[15] = t;
-    //AddRoundKey
-    for (j = 0, k = 160; j < 16; ++j, ++k) {
-      state[j] ^= key[k];
-    }
-    return state;
-  }
-
-  function AES128Cipher(key) {
-    this.key = expandKey128(key);
-    this.buffer = new Uint8Array(16);
-    this.bufferPosition = 0;
-  }
-
-  function decryptBlock2(data, finalize) {
-    var i, j, ii, sourceLength = data.length,
-        buffer = this.buffer, bufferLength = this.bufferPosition,
-        result = [], iv = this.iv;
-    for (i = 0; i < sourceLength; ++i) {
-      buffer[bufferLength] = data[i];
-      ++bufferLength;
-      if (bufferLength < 16) {
-        continue;
-      }
-      // buffer is full, decrypting
-      var plain = decrypt128(buffer, this.key);
-      // xor-ing the IV vector to get plain text
-      for (j = 0; j < 16; ++j) {
-        plain[j] ^= iv[j];
-      }
-      iv = buffer;
-      result.push(plain);
-      buffer = new Uint8Array(16);
-      bufferLength = 0;
-    }
-    // saving incomplete buffer
-    this.buffer = buffer;
-    this.bufferLength = bufferLength;
-    this.iv = iv;
-    if (result.length === 0) {
-      return new Uint8Array([]);
-    }
-    // combining plain text blocks into one
-    var outputLength = 16 * result.length;
-    if (finalize) {
-      // undo a padding that is described in RFC 2898
-      var lastBlock = result[result.length - 1];
-      var psLen = lastBlock[15];
-      if (psLen <= 16) {
-        for (i = 15, ii = 16 - psLen; i >= ii; --i) {
-          if (lastBlock[i] !== psLen) {
-            // Invalid padding, assume that the block has no padding.
-            psLen = 0;
-            break;
-          }
-        }
-        outputLength -= psLen;
-        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
-      }
-    }
-    var output = new Uint8Array(outputLength);
-    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
-      output.set(result[i], j);
-    }
-    return output;
-  }
-
-  AES128Cipher.prototype = {
-    decryptBlock: function AES128Cipher_decryptBlock(data, finalize) {
-      var i, sourceLength = data.length;
-      var buffer = this.buffer, bufferLength = this.bufferPosition;
-      // waiting for IV values -- they are at the start of the stream
-      for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
-        buffer[bufferLength] = data[i];
-      }
-      if (bufferLength < 16) {
-        // need more data
-        this.bufferLength = bufferLength;
-        return new Uint8Array([]);
-      }
-      this.iv = buffer;
-      this.buffer = new Uint8Array(16);
-      this.bufferLength = 0;
-      // starting decryption
-      this.decryptBlock = decryptBlock2;
-      return this.decryptBlock(data.subarray(16), finalize);
-    },
-    encrypt: function AES128Cipher_encrypt(data, iv) {
-      var i, j, ii, sourceLength = data.length,
-          buffer = this.buffer, bufferLength = this.bufferPosition,
-          result = [];
-      if (!iv) {
-        iv = new Uint8Array(16);
-      }
-      for (i = 0; i < sourceLength; ++i) {
-        buffer[bufferLength] = data[i];
-        ++bufferLength;
-        if (bufferLength < 16) {
-          continue;
-        }
-        for (j = 0; j < 16; ++j) {
-          buffer[j] ^= iv[j];
-        }
-
-        // buffer is full, encrypting
-        var cipher = encrypt128(buffer, this.key);
-        iv = cipher;
-        result.push(cipher);
-        buffer = new Uint8Array(16);
-        bufferLength = 0;
-      }
-      // saving incomplete buffer
-      this.buffer = buffer;
-      this.bufferLength = bufferLength;
-      this.iv = iv;
-      if (result.length === 0) {
-        return new Uint8Array([]);
-      }
-      // combining plain text blocks into one
-      var outputLength = 16 * result.length;
-      var output = new Uint8Array(outputLength);
-      for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
-        output.set(result[i], j);
-      }
-      return output;
-    }
-  };
-
-  return AES128Cipher;
-})();
-
-var AES256Cipher = (function AES256CipherClosure() {
-  var rcon = new Uint8Array([
-    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
-    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
-    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
-    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
-    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
-    0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
-    0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
-    0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
-    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
-    0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
-    0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
-    0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
-    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
-    0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
-    0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
-    0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
-    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
-    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
-    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
-    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
-    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
-    0x74, 0xe8, 0xcb, 0x8d]);
-
-  var s = new Uint8Array([
-    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
-    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
-    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
-    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
-    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
-    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
-    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
-    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
-    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
-    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
-    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
-    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
-    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
-    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
-    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
-    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
-    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
-    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
-    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
-    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
-    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
-    0xb0, 0x54, 0xbb, 0x16]);
-
-  var inv_s = new Uint8Array([
-    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
-    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
-    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
-    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
-    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
-    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
-    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
-    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
-    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
-    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
-    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
-    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
-    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
-    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
-    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
-    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
-    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
-    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
-    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
-    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
-    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
-    0x55, 0x21, 0x0c, 0x7d]);
-
-  var mixCol = new Uint8Array(256);
-  for (var i = 0; i < 256; i++) {
-    if (i < 128) {
-      mixCol[i] = i << 1;
-    } else {
-      mixCol[i] = (i << 1) ^ 0x1b;
-    }
-  }
-  var mix = new Uint32Array([
-    0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
-    0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
-    0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
-    0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
-    0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
-    0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
-    0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
-    0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
-    0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
-    0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
-    0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
-    0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
-    0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
-    0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
-    0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
-    0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
-    0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
-    0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
-    0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
-    0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
-    0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
-    0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
-    0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
-    0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
-    0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
-    0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
-    0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
-    0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
-    0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
-    0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
-    0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
-    0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
-    0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
-    0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
-    0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
-    0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
-    0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
-    0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
-    0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
-    0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
-    0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
-    0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
-    0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
-
-  function expandKey256(cipherKey) {
-    var b = 240, result = new Uint8Array(b);
-    var r = 1;
-
-    result.set(cipherKey);
-    for (var j = 32, i = 1; j < b; ++i) {
-      if (j % 32 === 16) {
-        t1 = s[t1];
-        t2 = s[t2];
-        t3 = s[t3];
-        t4 = s[t4];
-      } else if (j % 32 === 0) {
-        // RotWord
-        var t1 = result[j - 3], t2 = result[j - 2],
-          t3 = result[j - 1], t4 = result[j - 4];
-        // SubWord
-        t1 = s[t1];
-        t2 = s[t2];
-        t3 = s[t3];
-        t4 = s[t4];
-        // Rcon
-        t1 = t1 ^ r;
-        if ((r <<= 1) >= 256) {
-          r = (r ^ 0x1b) & 0xFF;
-        }
-      }
-
-      for (var n = 0; n < 4; ++n) {
-        result[j] = (t1 ^= result[j - 32]);
-        j++;
-        result[j] = (t2 ^= result[j - 32]);
-        j++;
-        result[j] = (t3 ^= result[j - 32]);
-        j++;
-        result[j] = (t4 ^= result[j - 32]);
-        j++;
-      }
-    }
-    return result;
-  }
-
-  function decrypt256(input, key) {
-    var state = new Uint8Array(16);
-    state.set(input);
-    var i, j, k;
-    var t, u, v;
-    // AddRoundKey
-    for (j = 0, k = 224; j < 16; ++j, ++k) {
-      state[j] ^= key[k];
-    }
-    for (i = 13; i >= 1; --i) {
-      // InvShiftRows
-      t = state[13];
-      state[13] = state[9];
-      state[9] = state[5];
-      state[5] = state[1];
-      state[1] = t;
-      t = state[14];
-      u = state[10];
-      state[14] = state[6];
-      state[10] = state[2];
-      state[6] = t;
-      state[2] = u;
-      t = state[15];
-      u = state[11];
-      v = state[7];
-      state[15] = state[3];
-      state[11] = t;
-      state[7] = u;
-      state[3] = v;
-      // InvSubBytes
-      for (j = 0; j < 16; ++j) {
-        state[j] = inv_s[state[j]];
-      }
-      // AddRoundKey
-      for (j = 0, k = i * 16; j < 16; ++j, ++k) {
-        state[j] ^= key[k];
-      }
-      // InvMixColumns
-      for (j = 0; j < 16; j += 4) {
-        var s0 = mix[state[j]], s1 = mix[state[j + 1]],
-            s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
-        t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
-            (s3 >>> 24) ^ (s3 << 8));
-        state[j] = (t >>> 24) & 0xFF;
-        state[j + 1] = (t >> 16) & 0xFF;
-        state[j + 2] = (t >> 8) & 0xFF;
-        state[j + 3] = t & 0xFF;
-      }
-    }
-    // InvShiftRows
-    t = state[13];
-    state[13] = state[9];
-    state[9] = state[5];
-    state[5] = state[1];
-    state[1] = t;
-    t = state[14];
-    u = state[10];
-    state[14] = state[6];
-    state[10] = state[2];
-    state[6] = t;
-    state[2] = u;
-    t = state[15];
-    u = state[11];
-    v = state[7];
-    state[15] = state[3];
-    state[11] = t;
-    state[7] = u;
-    state[3] = v;
-    for (j = 0; j < 16; ++j) {
-      // InvSubBytes
-      state[j] = inv_s[state[j]];
-      // AddRoundKey
-      state[j] ^= key[j];
-    }
-    return state;
-  }
-
-  function encrypt256(input, key) {
-    var t, u, v, k;
-    var state = new Uint8Array(16);
-    state.set(input);
-    for (j = 0; j < 16; ++j) {
-      // AddRoundKey
-      state[j] ^= key[j];
-    }
-
-    for (i = 1; i < 14; i++) {
-      //SubBytes
-      for (j = 0; j < 16; ++j) {
-        state[j] = s[state[j]];
-      }
-      //ShiftRows
-      v = state[1];
-      state[1] = state[5];
-      state[5] = state[9];
-      state[9] = state[13];
-      state[13] = v;
-      v = state[2];
-      u = state[6];
-      state[2] = state[10];
-      state[6] = state[14];
-      state[10] = v;
-      state[14] = u;
-      v = state[3];
-      u = state[7];
-      t = state[11];
-      state[3] = state[15];
-      state[7] = v;
-      state[11] = u;
-      state[15] = t;
-      //MixColumns
-      for (var j = 0; j < 16; j += 4) {
-        var s0 = state[j + 0], s1 = state[j + 1];
-        var s2 = state[j + 2], s3 = state[j + 3];
-        t = s0 ^ s1 ^ s2 ^ s3;
-        state[j + 0] ^= t ^ mixCol[s0 ^ s1];
-        state[j + 1] ^= t ^ mixCol[s1 ^ s2];
-        state[j + 2] ^= t ^ mixCol[s2 ^ s3];
-        state[j + 3] ^= t ^ mixCol[s3 ^ s0];
-      }
-      //AddRoundKey
-      for (j = 0, k = i * 16; j < 16; ++j, ++k) {
-        state[j] ^= key[k];
-      }
-    }
-
-    //SubBytes
-    for (j = 0; j < 16; ++j) {
-      state[j] = s[state[j]];
-    }
-    //ShiftRows
-    v = state[1];
-    state[1] = state[5];
-    state[5] = state[9];
-    state[9] = state[13];
-    state[13] = v;
-    v = state[2];
-    u = state[6];
-    state[2] = state[10];
-    state[6] = state[14];
-    state[10] = v;
-    state[14] = u;
-    v = state[3];
-    u = state[7];
-    t = state[11];
-    state[3] = state[15];
-    state[7] = v;
-    state[11] = u;
-    state[15] = t;
-    //AddRoundKey
-    for (j = 0, k = 224; j < 16; ++j, ++k) {
-      state[j] ^= key[k];
-    }
-
-    return state;
-
-  }
-
-  function AES256Cipher(key) {
-    this.key = expandKey256(key);
-    this.buffer = new Uint8Array(16);
-    this.bufferPosition = 0;
-  }
-
-  function decryptBlock2(data, finalize) {
-    var i, j, ii, sourceLength = data.length,
-        buffer = this.buffer, bufferLength = this.bufferPosition,
-        result = [], iv = this.iv;
-
-    for (i = 0; i < sourceLength; ++i) {
-      buffer[bufferLength] = data[i];
-      ++bufferLength;
-      if (bufferLength < 16) {
-        continue;
-      }
-      // buffer is full, decrypting
-      var plain = decrypt256(buffer, this.key);
-      // xor-ing the IV vector to get plain text
-      for (j = 0; j < 16; ++j) {
-        plain[j] ^= iv[j];
-      }
-      iv = buffer;
-      result.push(plain);
-      buffer = new Uint8Array(16);
-      bufferLength = 0;
-    }
-    // saving incomplete buffer
-    this.buffer = buffer;
-    this.bufferLength = bufferLength;
-    this.iv = iv;
-    if (result.length === 0) {
-      return new Uint8Array([]);
-    }
-    // combining plain text blocks into one
-    var outputLength = 16 * result.length;
-    if (finalize) {
-      // undo a padding that is described in RFC 2898
-      var lastBlock = result[result.length - 1];
-      var psLen = lastBlock[15];
-      if (psLen <= 16) {
-        for (i = 15, ii = 16 - psLen; i >= ii; --i) {
-          if (lastBlock[i] !== psLen) {
-            // Invalid padding, assume that the block has no padding.
-            psLen = 0;
-            break;
-          }
-        }
-        outputLength -= psLen;
-        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
-      }
-    }
-    var output = new Uint8Array(outputLength);
-    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
-      output.set(result[i], j);
-    }
-    return output;
-
-  }
-
-  AES256Cipher.prototype = {
-    decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) {
-      var i, sourceLength = data.length;
-      var buffer = this.buffer, bufferLength = this.bufferPosition;
-      // if not supplied an IV wait for IV values
-      // they are at the start of the stream
-      if (iv) {
-        this.iv = iv;
-      } else {
-        for (i = 0; bufferLength < 16 &&
-             i < sourceLength; ++i, ++bufferLength) {
-          buffer[bufferLength] = data[i];
-        }
-        if (bufferLength < 16) {
-          //need more data
-          this.bufferLength = bufferLength;
-          return new Uint8Array([]);
-        }
-        this.iv = buffer;
-        data = data.subarray(16);
-      }
-      this.buffer = new Uint8Array(16);
-      this.bufferLength = 0;
-      // starting decryption
-      this.decryptBlock = decryptBlock2;
-      return this.decryptBlock(data, finalize);
-    },
-    encrypt: function AES256Cipher_encrypt(data, iv) {
-      var i, j, ii, sourceLength = data.length,
-          buffer = this.buffer, bufferLength = this.bufferPosition,
-          result = [];
-      if (!iv) {
-        iv = new Uint8Array(16);
-      }
-      for (i = 0; i < sourceLength; ++i) {
-        buffer[bufferLength] = data[i];
-        ++bufferLength;
-        if (bufferLength < 16) {
-          continue;
-        }
-        for (j = 0; j < 16; ++j) {
-          buffer[j] ^= iv[j];
-        }
-
-        // buffer is full, encrypting
-        var cipher = encrypt256(buffer, this.key);
-        this.iv = cipher;
-        result.push(cipher);
-        buffer = new Uint8Array(16);
-        bufferLength = 0;
-      }
-      // saving incomplete buffer
-      this.buffer = buffer;
-      this.bufferLength = bufferLength;
-      this.iv = iv;
-      if (result.length === 0) {
-        return new Uint8Array([]);
-      }
-      // combining plain text blocks into one
-      var outputLength = 16 * result.length;
-      var output = new Uint8Array(outputLength);
-      for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
-        output.set(result[i], j);
-      }
-      return output;
-    }
-  };
-
-  return AES256Cipher;
-})();
-
-var PDF17 = (function PDF17Closure() {
-
-  function compareByteArrays(array1, array2) {
-    if (array1.length !== array2.length) {
-      return false;
-    }
-    for (var i = 0; i < array1.length; i++) {
-      if (array1[i] !== array2[i]) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  function PDF17() {
-  }
-
-  PDF17.prototype = {
-    checkOwnerPassword: function PDF17_checkOwnerPassword(password,
-                                                          ownerValidationSalt,
-                                                          userBytes,
-                                                          ownerPassword) {
-      var hashData = new Uint8Array(password.length + 56);
-      hashData.set(password, 0);
-      hashData.set(ownerValidationSalt, password.length);
-      hashData.set(userBytes, password.length + ownerValidationSalt.length);
-      var result = calculateSHA256(hashData, 0, hashData.length);
-      return compareByteArrays(result, ownerPassword);
-    },
-    checkUserPassword: function PDF17_checkUserPassword(password,
-                                                        userValidationSalt,
-                                                        userPassword) {
-      var hashData = new Uint8Array(password.length + 8);
-      hashData.set(password, 0);
-      hashData.set(userValidationSalt, password.length);
-      var result = calculateSHA256(hashData, 0, hashData.length);
-      return compareByteArrays(result, userPassword);
-    },
-    getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes,
-                                            ownerEncryption) {
-      var hashData = new Uint8Array(password.length + 56);
-      hashData.set(password, 0);
-      hashData.set(ownerKeySalt, password.length);
-      hashData.set(userBytes, password.length + ownerKeySalt.length);
-      var key = calculateSHA256(hashData, 0, hashData.length);
-      var cipher = new AES256Cipher(key);
-      return cipher.decryptBlock(ownerEncryption,
-                                 false,
-                                 new Uint8Array(16));
-
-    },
-    getUserKey: function PDF17_getUserKey(password, userKeySalt,
-                                          userEncryption) {
-      var hashData = new Uint8Array(password.length + 8);
-      hashData.set(password, 0);
-      hashData.set(userKeySalt, password.length);
-      //key is the decryption key for the UE string
-      var key = calculateSHA256(hashData, 0, hashData.length);
-      var cipher = new AES256Cipher(key);
-      return cipher.decryptBlock(userEncryption,
-                                 false,
-                                 new Uint8Array(16));
-    }
-  };
-  return PDF17;
-})();
-
-var PDF20 = (function PDF20Closure() {
-
-  function concatArrays(array1, array2) {
-    var t = new Uint8Array(array1.length + array2.length);
-    t.set(array1, 0);
-    t.set(array2, array1.length);
-    return t;
-  }
-
-  function calculatePDF20Hash(password, input, userBytes) {
-    //This refers to Algorithm 2.B as defined in ISO 32000-2
-    var k = calculateSHA256(input, 0, input.length).subarray(0, 32);
-    var e = [0];
-    var i = 0;
-    while (i < 64 || e[e.length - 1] > i - 32) {
-      var arrayLength = password.length + k.length + userBytes.length;
-
-      var k1 = new Uint8Array(arrayLength * 64);
-      var array = concatArrays(password, k);
-      array = concatArrays(array, userBytes);
-      for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {
-        k1.set(array, pos);
-      }
-      //AES128 CBC NO PADDING with
-      //first 16 bytes of k as the key and the second 16 as the iv.
-      var cipher = new AES128Cipher(k.subarray(0, 16));
-      e = cipher.encrypt(k1, k.subarray(16, 32));
-      //Now we have to take the first 16 bytes of an unsigned
-      //big endian integer... and compute the remainder
-      //modulo 3.... That is a fairly large number and
-      //JavaScript isn't going to handle that well...
-      //So we're using a trick that allows us to perform
-      //modulo math byte by byte
-      var remainder = 0;
-      for (var z = 0; z < 16; z++) {
-        remainder *= (256 % 3);
-        remainder %= 3;
-        remainder += ((e[z] >>> 0) % 3);
-        remainder %= 3;
-      }
-      if (remainder === 0) {
-        k = calculateSHA256(e, 0, e.length);
-      }
-      else if (remainder === 1) {
-        k = calculateSHA384(e, 0, e.length);
-      }
-      else if (remainder === 2) {
-        k = calculateSHA512(e, 0, e.length);
-      }
-      i++;
-    }
-    return k.subarray(0, 32);
-  }
-
-  function PDF20() {
-  }
-
-  function compareByteArrays(array1, array2) {
-    if (array1.length !== array2.length) {
-      return false;
-    }
-    for (var i = 0; i < array1.length; i++) {
-      if (array1[i] !== array2[i]) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  PDF20.prototype = {
-    hash: function PDF20_hash(password, concatBytes, userBytes) {
-      return calculatePDF20Hash(password, concatBytes, userBytes);
-    },
-    checkOwnerPassword: function PDF20_checkOwnerPassword(password,
-                                                          ownerValidationSalt,
-                                                          userBytes,
-                                                          ownerPassword) {
-      var hashData = new Uint8Array(password.length + 56);
-      hashData.set(password, 0);
-      hashData.set(ownerValidationSalt, password.length);
-      hashData.set(userBytes, password.length + ownerValidationSalt.length);
-      var result = calculatePDF20Hash(password, hashData, userBytes);
-      return compareByteArrays(result, ownerPassword);
-    },
-    checkUserPassword: function PDF20_checkUserPassword(password,
-                                                        userValidationSalt,
-                                                        userPassword) {
-      var hashData = new Uint8Array(password.length + 8);
-      hashData.set(password, 0);
-      hashData.set(userValidationSalt, password.length);
-      var result = calculatePDF20Hash(password, hashData, []);
-      return compareByteArrays(result, userPassword);
-    },
-    getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes,
-                                            ownerEncryption) {
-      var hashData = new Uint8Array(password.length + 56);
-      hashData.set(password, 0);
-      hashData.set(ownerKeySalt, password.length);
-      hashData.set(userBytes, password.length + ownerKeySalt.length);
-      var key = calculatePDF20Hash(password, hashData, userBytes);
-      var cipher = new AES256Cipher(key);
-      return cipher.decryptBlock(ownerEncryption,
-                                 false,
-                                 new Uint8Array(16));
-
-    },
-    getUserKey: function PDF20_getUserKey(password, userKeySalt,
-                                          userEncryption) {
-      var hashData = new Uint8Array(password.length + 8);
-      hashData.set(password, 0);
-      hashData.set(userKeySalt, password.length);
-      //key is the decryption key for the UE string
-      var key = calculatePDF20Hash(password, hashData, []);
-      var cipher = new AES256Cipher(key);
-      return cipher.decryptBlock(userEncryption,
-                                 false,
-                                 new Uint8Array(16));
-    }
-  };
-  return PDF20;
-})();
-
-var CipherTransform = (function CipherTransformClosure() {
-  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
-    this.stringCipherConstructor = stringCipherConstructor;
-    this.streamCipherConstructor = streamCipherConstructor;
-  }
-
-  CipherTransform.prototype = {
-    createStream: function CipherTransform_createStream(stream, length) {
-      var cipher = new this.streamCipherConstructor();
-      return new DecryptStream(stream, length,
-        function cipherTransformDecryptStream(data, finalize) {
-          return cipher.decryptBlock(data, finalize);
-        }
-      );
-    },
-    decryptString: function CipherTransform_decryptString(s) {
-      var cipher = new this.stringCipherConstructor();
-      var data = stringToBytes(s);
-      data = cipher.decryptBlock(data, true);
-      return bytesToString(data);
-    }
-  };
-  return CipherTransform;
-})();
-
-var CipherTransformFactory = (function CipherTransformFactoryClosure() {
-  var defaultPasswordBytes = new Uint8Array([
-    0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
-    0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
-    0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
-    0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
-
-  function createEncryptionKey20(revision, password, ownerPassword,
-                                 ownerValidationSalt, ownerKeySalt, uBytes,
-                                 userPassword, userValidationSalt, userKeySalt,
-                                 ownerEncryption, userEncryption, perms) {
-    if (password) {
-      var passwordLength = Math.min(127, password.length);
-      password = password.subarray(0, passwordLength);
-    } else {
-      password = [];
-    }
-    var pdfAlgorithm;
-    if (revision === 6) {
-      pdfAlgorithm = new PDF20();
-    } else {
-      pdfAlgorithm = new PDF17();
-    }
-
-    if (pdfAlgorithm) {
-      if (pdfAlgorithm.checkUserPassword(password, userValidationSalt,
-                                         userPassword)) {
-        return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);
-      } else if (pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt,
-                                                 uBytes,
-                                                 ownerPassword)) {
-        return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes,
-                                        ownerEncryption);
-      }
-    }
-
-    return null;
-  }
-
-  function prepareKeyData(fileId, password, ownerPassword, userPassword,
-                          flags, revision, keyLength, encryptMetadata) {
-    var hashDataSize = 40 + ownerPassword.length + fileId.length;
-    var hashData = new Uint8Array(hashDataSize), i = 0, j, n;
-    if (password) {
-      n = Math.min(32, password.length);
-      for (; i < n; ++i) {
-        hashData[i] = password[i];
-      }
-    }
-    j = 0;
-    while (i < 32) {
-      hashData[i++] = defaultPasswordBytes[j++];
-    }
-    // as now the padded password in the hashData[0..i]
-    for (j = 0, n = ownerPassword.length; j < n; ++j) {
-      hashData[i++] = ownerPassword[j];
-    }
-    hashData[i++] = flags & 0xFF;
-    hashData[i++] = (flags >> 8) & 0xFF;
-    hashData[i++] = (flags >> 16) & 0xFF;
-    hashData[i++] = (flags >>> 24) & 0xFF;
-    for (j = 0, n = fileId.length; j < n; ++j) {
-      hashData[i++] = fileId[j];
-    }
-    if (revision >= 4 && !encryptMetadata) {
-      hashData[i++] = 0xFF;
-      hashData[i++] = 0xFF;
-      hashData[i++] = 0xFF;
-      hashData[i++] = 0xFF;
-    }
-    var hash = calculateMD5(hashData, 0, i);
-    var keyLengthInBytes = keyLength >> 3;
-    if (revision >= 3) {
-      for (j = 0; j < 50; ++j) {
-        hash = calculateMD5(hash, 0, keyLengthInBytes);
-      }
-    }
-    var encryptionKey = hash.subarray(0, keyLengthInBytes);
-    var cipher, checkData;
-
-    if (revision >= 3) {
-      for (i = 0; i < 32; ++i) {
-        hashData[i] = defaultPasswordBytes[i];
-      }
-      for (j = 0, n = fileId.length; j < n; ++j) {
-        hashData[i++] = fileId[j];
-      }
-      cipher = new ARCFourCipher(encryptionKey);
-      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
-      n = encryptionKey.length;
-      var derivedKey = new Uint8Array(n), k;
-      for (j = 1; j <= 19; ++j) {
-        for (k = 0; k < n; ++k) {
-          derivedKey[k] = encryptionKey[k] ^ j;
-        }
-        cipher = new ARCFourCipher(derivedKey);
-        checkData = cipher.encryptBlock(checkData);
-      }
-      for (j = 0, n = checkData.length; j < n; ++j) {
-        if (userPassword[j] !== checkData[j]) {
-          return null;
-        }
-      }
-    } else {
-      cipher = new ARCFourCipher(encryptionKey);
-      checkData = cipher.encryptBlock(defaultPasswordBytes);
-      for (j = 0, n = checkData.length; j < n; ++j) {
-        if (userPassword[j] !== checkData[j]) {
-          return null;
-        }
-      }
-    }
-    return encryptionKey;
-  }
-
-  function decodeUserPassword(password, ownerPassword, revision, keyLength) {
-    var hashData = new Uint8Array(32), i = 0, j, n;
-    n = Math.min(32, password.length);
-    for (; i < n; ++i) {
-      hashData[i] = password[i];
-    }
-    j = 0;
-    while (i < 32) {
-      hashData[i++] = defaultPasswordBytes[j++];
-    }
-    var hash = calculateMD5(hashData, 0, i);
-    var keyLengthInBytes = keyLength >> 3;
-    if (revision >= 3) {
-      for (j = 0; j < 50; ++j) {
-        hash = calculateMD5(hash, 0, hash.length);
-      }
-    }
-
-    var cipher, userPassword;
-    if (revision >= 3) {
-      userPassword = ownerPassword;
-      var derivedKey = new Uint8Array(keyLengthInBytes), k;
-      for (j = 19; j >= 0; j--) {
-        for (k = 0; k < keyLengthInBytes; ++k) {
-          derivedKey[k] = hash[k] ^ j;
-        }
-        cipher = new ARCFourCipher(derivedKey);
-        userPassword = cipher.encryptBlock(userPassword);
-      }
-    } else {
-      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
-      userPassword = cipher.encryptBlock(ownerPassword);
-    }
-    return userPassword;
-  }
-
-  var identityName = Name.get('Identity');
-
-  function CipherTransformFactory(dict, fileId, password) {
-    var filter = dict.get('Filter');
-    if (!isName(filter) || filter.name !== 'Standard') {
-      error('unknown encryption method');
-    }
-    this.dict = dict;
-    var algorithm = dict.get('V');
-    if (!isInt(algorithm) ||
-        (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 &&
-        algorithm !== 5)) {
-      error('unsupported encryption algorithm');
-    }
-    this.algorithm = algorithm;
-    var keyLength = dict.get('Length') || 40;
-    if (!isInt(keyLength) ||
-        keyLength < 40 || (keyLength % 8) !== 0) {
-      error('invalid key length');
-    }
-
-    // prepare keys
-    var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32);
-    var userPassword = stringToBytes(dict.get('U')).subarray(0, 32);
-    var flags = dict.get('P');
-    var revision = dict.get('R');
-    // meaningful when V is 4 or 5
-    var encryptMetadata = ((algorithm === 4 || algorithm === 5) &&
-                           dict.get('EncryptMetadata') !== false);
-    this.encryptMetadata = encryptMetadata;
-
-    var fileIdBytes = stringToBytes(fileId);
-    var passwordBytes;
-    if (password) {
-      if (revision === 6) {
-        try {
-          password = utf8StringToString(password);
-        } catch (ex) {
-          warn('CipherTransformFactory: ' +
-               'Unable to convert UTF8 encoded password.');
-        }
-      }
-      passwordBytes = stringToBytes(password);
-    }
-
-    var encryptionKey;
-    if (algorithm !== 5) {
-      encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
-                                     ownerPassword, userPassword, flags,
-                                     revision, keyLength, encryptMetadata);
-    }
-    else {
-      var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40);
-      var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48);
-      var uBytes = stringToBytes(dict.get('U')).subarray(0, 48);
-      var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40);
-      var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48);
-      var ownerEncryption = stringToBytes(dict.get('OE'));
-      var userEncryption = stringToBytes(dict.get('UE'));
-      var perms = stringToBytes(dict.get('Perms'));
-      encryptionKey =
-        createEncryptionKey20(revision, passwordBytes,
-          ownerPassword, ownerValidationSalt,
-          ownerKeySalt, uBytes,
-          userPassword, userValidationSalt,
-          userKeySalt, ownerEncryption,
-          userEncryption, perms);
-    }
-    if (!encryptionKey && !password) {
-      throw new PasswordException('No password given',
-                                  PasswordResponses.NEED_PASSWORD);
-    } else if (!encryptionKey && password) {
-      // Attempting use the password as an owner password
-      var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword,
-                                               revision, keyLength);
-      encryptionKey = prepareKeyData(fileIdBytes, decodedPassword,
-                                     ownerPassword, userPassword, flags,
-                                     revision, keyLength, encryptMetadata);
-    }
-
-    if (!encryptionKey) {
-      throw new PasswordException('Incorrect Password',
-                                  PasswordResponses.INCORRECT_PASSWORD);
-    }
-
-    this.encryptionKey = encryptionKey;
-
-    if (algorithm >= 4) {
-      this.cf = dict.get('CF');
-      this.stmf = dict.get('StmF') || identityName;
-      this.strf = dict.get('StrF') || identityName;
-      this.eff = dict.get('EFF') || this.stmf;
-    }
-  }
-
-  function buildObjectKey(num, gen, encryptionKey, isAes) {
-    var key = new Uint8Array(encryptionKey.length + 9), i, n;
-    for (i = 0, n = encryptionKey.length; i < n; ++i) {
-      key[i] = encryptionKey[i];
-    }
-    key[i++] = num & 0xFF;
-    key[i++] = (num >> 8) & 0xFF;
-    key[i++] = (num >> 16) & 0xFF;
-    key[i++] = gen & 0xFF;
-    key[i++] = (gen >> 8) & 0xFF;
-    if (isAes) {
-      key[i++] = 0x73;
-      key[i++] = 0x41;
-      key[i++] = 0x6C;
-      key[i++] = 0x54;
-    }
-    var hash = calculateMD5(key, 0, i);
-    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
-  }
-
-  function buildCipherConstructor(cf, name, num, gen, key) {
-    var cryptFilter = cf.get(name.name);
-    var cfm;
-    if (cryptFilter !== null && cryptFilter !== undefined) {
-      cfm = cryptFilter.get('CFM');
-    }
-    if (!cfm || cfm.name === 'None') {
-      return function cipherTransformFactoryBuildCipherConstructorNone() {
-        return new NullCipher();
-      };
-    }
-    if ('V2' === cfm.name) {
-      return function cipherTransformFactoryBuildCipherConstructorV2() {
-        return new ARCFourCipher(buildObjectKey(num, gen, key, false));
-      };
-    }
-    if ('AESV2' === cfm.name) {
-      return function cipherTransformFactoryBuildCipherConstructorAESV2() {
-        return new AES128Cipher(buildObjectKey(num, gen, key, true));
-      };
-    }
-    if ('AESV3' === cfm.name) {
-      return function cipherTransformFactoryBuildCipherConstructorAESV3() {
-        return new AES256Cipher(key);
-      };
-    }
-    error('Unknown crypto method');
-  }
-
-  CipherTransformFactory.prototype = {
-    createCipherTransform:
-        function CipherTransformFactory_createCipherTransform(num, gen) {
-      if (this.algorithm === 4 || this.algorithm === 5) {
-        return new CipherTransform(
-          buildCipherConstructor(this.cf, this.stmf,
-                                 num, gen, this.encryptionKey),
-          buildCipherConstructor(this.cf, this.strf,
-                                 num, gen, this.encryptionKey));
-      }
-      // algorithms 1 and 2
-      var key = buildObjectKey(num, gen, this.encryptionKey, false);
-      var cipherConstructor = function buildCipherCipherConstructor() {
-        return new ARCFourCipher(key);
-      };
-      return new CipherTransform(cipherConstructor, cipherConstructor);
-    }
-  };
-
-  return CipherTransformFactory;
-})();
-
-
-var PatternType = {
-  FUNCTION_BASED: 1,
-  AXIAL: 2,
-  RADIAL: 3,
-  FREE_FORM_MESH: 4,
-  LATTICE_FORM_MESH: 5,
-  COONS_PATCH_MESH: 6,
-  TENSOR_PATCH_MESH: 7
-};
-
-var Pattern = (function PatternClosure() {
-  // Constructor should define this.getPattern
-  function Pattern() {
-    error('should not call Pattern constructor');
-  }
-
-  Pattern.prototype = {
-    // Input: current Canvas context
-    // Output: the appropriate fillStyle or strokeStyle
-    getPattern: function Pattern_getPattern(ctx) {
-      error('Should not call Pattern.getStyle: ' + ctx);
-    }
-  };
-
-  Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
-                                                       res) {
-
-    var dict = isStream(shading) ? shading.dict : shading;
-    var type = dict.get('ShadingType');
-
-    try {
-      switch (type) {
-        case PatternType.AXIAL:
-        case PatternType.RADIAL:
-          // Both radial and axial shadings are handled by RadialAxial shading.
-          return new Shadings.RadialAxial(dict, matrix, xref, res);
-        case PatternType.FREE_FORM_MESH:
-        case PatternType.LATTICE_FORM_MESH:
-        case PatternType.COONS_PATCH_MESH:
-        case PatternType.TENSOR_PATCH_MESH:
-          return new Shadings.Mesh(shading, matrix, xref, res);
-        default:
-          throw new Error('Unknown PatternType: ' + type);
-      }
-    } catch (ex) {
-      if (ex instanceof MissingDataException) {
-        throw ex;
-      }
-      UnsupportedManager.notify(UNSUPPORTED_FEATURES.shadingPattern);
-      warn(ex);
-      return new Shadings.Dummy();
-    }
-  };
-  return Pattern;
-})();
-
-var Shadings = {};
-
-// A small number to offset the first/last color stops so we can insert ones to
-// support extend.  Number.MIN_VALUE appears to be too small and breaks the
-// extend. 1e-7 works in FF but chrome seems to use an even smaller sized number
-// internally so we have to go bigger.
-Shadings.SMALL_NUMBER = 1e-2;
-
-// Radial and axial shading have very similar implementations
-// If needed, the implementations can be broken into two classes
-Shadings.RadialAxial = (function RadialAxialClosure() {
-  function RadialAxial(dict, matrix, xref, res) {
-    this.matrix = matrix;
-    this.coordsArr = dict.get('Coords');
-    this.shadingType = dict.get('ShadingType');
-    this.type = 'Pattern';
-    var cs = dict.get('ColorSpace', 'CS');
-    cs = ColorSpace.parse(cs, xref, res);
-    this.cs = cs;
-
-    var t0 = 0.0, t1 = 1.0;
-    if (dict.has('Domain')) {
-      var domainArr = dict.get('Domain');
-      t0 = domainArr[0];
-      t1 = domainArr[1];
-    }
-
-    var extendStart = false, extendEnd = false;
-    if (dict.has('Extend')) {
-      var extendArr = dict.get('Extend');
-      extendStart = extendArr[0];
-      extendEnd = extendArr[1];
-    }
-
-    if (this.shadingType === PatternType.RADIAL &&
-       (!extendStart || !extendEnd)) {
-      // Radial gradient only currently works if either circle is fully within
-      // the other circle.
-      var x1 = this.coordsArr[0];
-      var y1 = this.coordsArr[1];
-      var r1 = this.coordsArr[2];
-      var x2 = this.coordsArr[3];
-      var y2 = this.coordsArr[4];
-      var r2 = this.coordsArr[5];
-      var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
-      if (r1 <= r2 + distance &&
-          r2 <= r1 + distance) {
-        warn('Unsupported radial gradient.');
-      }
-    }
-
-    this.extendStart = extendStart;
-    this.extendEnd = extendEnd;
-
-    var fnObj = dict.get('Function');
-    var fn = PDFFunction.parseArray(xref, fnObj);
-
-    // 10 samples seems good enough for now, but probably won't work
-    // if there are sharp color changes. Ideally, we would implement
-    // the spec faithfully and add lossless optimizations.
-    var diff = t1 - t0;
-    var step = diff / 10;
-
-    var colorStops = this.colorStops = [];
-
-    // Protect against bad domains so we don't end up in an infinte loop below.
-    if (t0 >= t1 || step <= 0) {
-      // Acrobat doesn't seem to handle these cases so we'll ignore for
-      // now.
-      info('Bad shading domain.');
-      return;
-    }
-
-    var color = new Float32Array(cs.numComps), ratio = new Float32Array(1);
-    var rgbColor;
-    for (var i = t0; i <= t1; i += step) {
-      ratio[0] = i;
-      fn(ratio, 0, color, 0);
-      rgbColor = cs.getRgb(color, 0);
-      var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
-      colorStops.push([(i - t0) / diff, cssColor]);
-    }
-
-    var background = 'transparent';
-    if (dict.has('Background')) {
-      rgbColor = cs.getRgb(dict.get('Background'), 0);
-      background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
-    }
-
-    if (!extendStart) {
-      // Insert a color stop at the front and offset the first real color stop
-      // so it doesn't conflict with the one we insert.
-      colorStops.unshift([0, background]);
-      colorStops[1][0] += Shadings.SMALL_NUMBER;
-    }
-    if (!extendEnd) {
-      // Same idea as above in extendStart but for the end.
-      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;
-      colorStops.push([1, background]);
-    }
-
-    this.colorStops = colorStops;
-  }
-
-  RadialAxial.prototype = {
-    getIR: function RadialAxial_getIR() {
-      var coordsArr = this.coordsArr;
-      var shadingType = this.shadingType;
-      var type, p0, p1, r0, r1;
-      if (shadingType === PatternType.AXIAL) {
-        p0 = [coordsArr[0], coordsArr[1]];
-        p1 = [coordsArr[2], coordsArr[3]];
-        r0 = null;
-        r1 = null;
-        type = 'axial';
-      } else if (shadingType === PatternType.RADIAL) {
-        p0 = [coordsArr[0], coordsArr[1]];
-        p1 = [coordsArr[3], coordsArr[4]];
-        r0 = coordsArr[2];
-        r1 = coordsArr[5];
-        type = 'radial';
-      } else {
-        error('getPattern type unknown: ' + shadingType);
-      }
-
-      var matrix = this.matrix;
-      if (matrix) {
-        p0 = Util.applyTransform(p0, matrix);
-        p1 = Util.applyTransform(p1, matrix);
-      }
-
-      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
-    }
-  };
-
-  return RadialAxial;
-})();
-
-// All mesh shading. For now, they will be presented as set of the triangles
-// to be drawn on the canvas and rgb color for each vertex.
-Shadings.Mesh = (function MeshClosure() {
-  function MeshStreamReader(stream, context) {
-    this.stream = stream;
-    this.context = context;
-    this.buffer = 0;
-    this.bufferLength = 0;
-
-    var numComps = context.numComps;
-    this.tmpCompsBuf = new Float32Array(numComps);
-    var csNumComps = context.colorSpace;
-    this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) :
-                                           this.tmpCompsBuf;
-  }
-  MeshStreamReader.prototype = {
-    get hasData() {
-      if (this.stream.end) {
-        return this.stream.pos < this.stream.end;
-      }
-      if (this.bufferLength > 0) {
-        return true;
-      }
-      var nextByte = this.stream.getByte();
-      if (nextByte < 0) {
-        return false;
-      }
-      this.buffer = nextByte;
-      this.bufferLength = 8;
-      return true;
-    },
-    readBits: function MeshStreamReader_readBits(n) {
-      var buffer = this.buffer;
-      var bufferLength = this.bufferLength;
-      if (n === 32) {
-        if (bufferLength === 0) {
-          return ((this.stream.getByte() << 24) |
-            (this.stream.getByte() << 16) | (this.stream.getByte() << 8) |
-            this.stream.getByte()) >>> 0;
-        }
-        buffer = (buffer << 24) | (this.stream.getByte() << 16) |
-          (this.stream.getByte() << 8) | this.stream.getByte();
-        var nextByte = this.stream.getByte();
-        this.buffer = nextByte & ((1 << bufferLength) - 1);
-        return ((buffer << (8 - bufferLength)) |
-          ((nextByte & 0xFF) >> bufferLength)) >>> 0;
-      }
-      if (n === 8 && bufferLength === 0) {
-        return this.stream.getByte();
-      }
-      while (bufferLength < n) {
-        buffer = (buffer << 8) | this.stream.getByte();
-        bufferLength += 8;
-      }
-      bufferLength -= n;
-      this.bufferLength = bufferLength;
-      this.buffer = buffer & ((1 << bufferLength) - 1);
-      return buffer >> bufferLength;
-    },
-    align: function MeshStreamReader_align() {
-      this.buffer = 0;
-      this.bufferLength = 0;
-    },
-    readFlag: function MeshStreamReader_readFlag() {
-      return this.readBits(this.context.bitsPerFlag);
-    },
-    readCoordinate: function MeshStreamReader_readCoordinate() {
-      var bitsPerCoordinate = this.context.bitsPerCoordinate;
-      var xi = this.readBits(bitsPerCoordinate);
-      var yi = this.readBits(bitsPerCoordinate);
-      var decode = this.context.decode;
-      var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) :
-        2.3283064365386963e-10; // 2 ^ -32
-      return [
-        xi * scale * (decode[1] - decode[0]) + decode[0],
-        yi * scale * (decode[3] - decode[2]) + decode[2]
-      ];
-    },
-    readComponents: function MeshStreamReader_readComponents() {
-      var numComps = this.context.numComps;
-      var bitsPerComponent = this.context.bitsPerComponent;
-      var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) :
-        2.3283064365386963e-10; // 2 ^ -32
-      var decode = this.context.decode;
-      var components = this.tmpCompsBuf;
-      for (var i = 0, j = 4; i < numComps; i++, j += 2) {
-        var ci = this.readBits(bitsPerComponent);
-        components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];
-      }
-      var color = this.tmpCsCompsBuf;
-      if (this.context.colorFn) {
-        this.context.colorFn(components, 0, color, 0);
-      }
-      return this.context.colorSpace.getRgb(color, 0);
-    }
-  };
-
-  function decodeType4Shading(mesh, reader) {
-    var coords = mesh.coords;
-    var colors = mesh.colors;
-    var operators = [];
-    var ps = []; // not maintaining cs since that will match ps
-    var verticesLeft = 0; // assuming we have all data to start a new triangle
-    while (reader.hasData) {
-      var f = reader.readFlag();
-      var coord = reader.readCoordinate();
-      var color = reader.readComponents();
-      if (verticesLeft === 0) { // ignoring flags if we started a triangle
-        assert(0 <= f && f <= 2, 'Unknown type4 flag');
-        switch (f) {
-          case 0:
-            verticesLeft = 3;
-            break;
-          case 1:
-            ps.push(ps[ps.length - 2], ps[ps.length - 1]);
-            verticesLeft = 1;
-            break;
-          case 2:
-            ps.push(ps[ps.length - 3], ps[ps.length - 1]);
-            verticesLeft = 1;
-            break;
-        }
-        operators.push(f);
-      }
-      ps.push(coords.length);
-      coords.push(coord);
-      colors.push(color);
-      verticesLeft--;
-
-      reader.align();
-    }
-
-    var psPacked = new Int32Array(ps);
-
-    mesh.figures.push({
-      type: 'triangles',
-      coords: psPacked,
-      colors: psPacked
-    });
-  }
-
-  function decodeType5Shading(mesh, reader, verticesPerRow) {
-    var coords = mesh.coords;
-    var colors = mesh.colors;
-    var ps = []; // not maintaining cs since that will match ps
-    while (reader.hasData) {
-      var coord = reader.readCoordinate();
-      var color = reader.readComponents();
-      ps.push(coords.length);
-      coords.push(coord);
-      colors.push(color);
-    }
-
-    var psPacked = new Int32Array(ps);
-
-    mesh.figures.push({
-      type: 'lattice',
-      coords: psPacked,
-      colors: psPacked,
-      verticesPerRow: verticesPerRow
-    });
-  }
-
-  var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;
-  var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;
-
-  var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds
-
-  var getB = (function getBClosure() {
-    function buildB(count) {
-      var lut = [];
-      for (var i = 0; i <= count; i++) {
-        var t = i / count, t_ = 1 - t;
-        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_,
-          3 * t * t * t_, t * t * t]));
-      }
-      return lut;
-    }
-    var cache = [];
-    return function getB(count) {
-      if (!cache[count]) {
-        cache[count] = buildB(count);
-      }
-      return cache[count];
-    };
-  })();
-
-  function buildFigureFromPatch(mesh, index) {
-    var figure = mesh.figures[index];
-    assert(figure.type === 'patch', 'Unexpected patch mesh figure');
-
-    var coords = mesh.coords, colors = mesh.colors;
-    var pi = figure.coords;
-    var ci = figure.colors;
-
-    var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0],
-                              coords[pi[12]][0], coords[pi[15]][0]);
-    var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1],
-                              coords[pi[12]][1], coords[pi[15]][1]);
-    var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0],
-                              coords[pi[12]][0], coords[pi[15]][0]);
-    var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1],
-                              coords[pi[12]][1], coords[pi[15]][1]);
-    var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY /
-                             (mesh.bounds[2] - mesh.bounds[0]));
-    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,
-               Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));
-    var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY /
-                             (mesh.bounds[3] - mesh.bounds[1]));
-    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,
-               Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));
-
-    var verticesPerRow = splitXBy + 1;
-    var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
-    var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
-    var k = 0;
-    var cl = new Uint8Array(3), cr = new Uint8Array(3);
-    var c0 = colors[ci[0]], c1 = colors[ci[1]],
-      c2 = colors[ci[2]], c3 = colors[ci[3]];
-    var bRow = getB(splitYBy), bCol = getB(splitXBy);
-    for (var row = 0; row <= splitYBy; row++) {
-      cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0;
-      cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0;
-      cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0;
-
-      cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0;
-      cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0;
-      cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0;
-
-      for (var col = 0; col <= splitXBy; col++, k++) {
-        if ((row === 0 || row === splitYBy) &&
-            (col === 0 || col === splitXBy)) {
-          continue;
-        }
-        var x = 0, y = 0;
-        var q = 0;
-        for (var i = 0; i <= 3; i++) {
-          for (var j = 0; j <= 3; j++, q++) {
-            var m = bRow[row][i] * bCol[col][j];
-            x += coords[pi[q]][0] * m;
-            y += coords[pi[q]][1] * m;
-          }
-        }
-        figureCoords[k] = coords.length;
-        coords.push([x, y]);
-        figureColors[k] = colors.length;
-        var newColor = new Uint8Array(3);
-        newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0;
-        newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0;
-        newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0;
-        colors.push(newColor);
-      }
-    }
-    figureCoords[0] = pi[0];
-    figureColors[0] = ci[0];
-    figureCoords[splitXBy] = pi[3];
-    figureColors[splitXBy] = ci[1];
-    figureCoords[verticesPerRow * splitYBy] = pi[12];
-    figureColors[verticesPerRow * splitYBy] = ci[2];
-    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
-    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
-
-    mesh.figures[index] = {
-      type: 'lattice',
-      coords: figureCoords,
-      colors: figureColors,
-      verticesPerRow: verticesPerRow
-    };
-  }
-
-  function decodeType6Shading(mesh, reader) {
-    // A special case of Type 7. The p11, p12, p21, p22 automatically filled
-    var coords = mesh.coords;
-    var colors = mesh.colors;
-    var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33
-    var cs = new Int32Array(4); // c00, c30, c03, c33
-    while (reader.hasData) {
-      var f = reader.readFlag();
-      assert(0 <= f && f <= 3, 'Unknown type6 flag');
-      var i, ii;
-      var pi = coords.length;
-      for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) {
-        coords.push(reader.readCoordinate());
-      }
-      var ci = colors.length;
-      for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {
-        colors.push(reader.readComponents());
-      }
-      var tmp1, tmp2, tmp3, tmp4;
-      switch (f) {
-        case 0:
-          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;
-          ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 7;
-          ps[ 4] = pi + 1; /* calculated below              */ ps[ 7] = pi + 8;
-          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;
-          cs[2] = ci + 1; cs[3] = ci + 2;
-          cs[0] = ci;     cs[1] = ci + 3;
-          break;
-        case 1:
-          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];
-          ps[12] = pi + 5; ps[13] = pi + 4;  ps[14] = pi + 3;  ps[15] = pi + 2;
-          ps[ 8] = pi + 6; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 1;
-          ps[ 4] = pi + 7; /* calculated below              */ ps[ 7] = pi;
-          ps[ 0] = tmp1;   ps[ 1] = tmp2;    ps[ 2] = tmp3;    ps[ 3] = tmp4;
-          tmp1 = cs[2]; tmp2 = cs[3];
-          cs[2] = ci + 1; cs[3] = ci;
-          cs[0] = tmp1;   cs[1] = tmp2;
-          break;
-        case 2:
-          ps[12] = ps[15]; ps[13] = pi + 7; ps[14] = pi + 6;   ps[15] = pi + 5;
-          ps[ 8] = ps[11]; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 4;
-          ps[ 4] = ps[7];  /* calculated below              */ ps[ 7] = pi + 3;
-          ps[ 0] = ps[3];  ps[ 1] = pi;     ps[ 2] = pi + 1;   ps[ 3] = pi + 2;
-          cs[2] = cs[3]; cs[3] = ci + 1;
-          cs[0] = cs[1]; cs[1] = ci;
-          break;
-        case 3:
-          ps[12] = ps[0];  ps[13] = ps[1];   ps[14] = ps[2];   ps[15] = ps[3];
-          ps[ 8] = pi;     /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 7;
-          ps[ 4] = pi + 1; /* calculated below              */ ps[ 7] = pi + 6;
-          ps[ 0] = pi + 2; ps[ 1] = pi + 3;  ps[ 2] = pi + 4;  ps[ 3] = pi + 5;
-          cs[2] = cs[0]; cs[3] = cs[1];
-          cs[0] = ci;    cs[1] = ci + 1;
-          break;
-      }
-      // set p11, p12, p21, p22
-      ps[5] = coords.length;
-      coords.push([
-        (-4 * coords[ps[0]][0] - coords[ps[15]][0] +
-          6 * (coords[ps[4]][0] + coords[ps[1]][0]) -
-          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +
-          3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9,
-        (-4 * coords[ps[0]][1] - coords[ps[15]][1] +
-          6 * (coords[ps[4]][1] + coords[ps[1]][1]) -
-          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +
-          3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9
-      ]);
-      ps[6] = coords.length;
-      coords.push([
-        (-4 * coords[ps[3]][0] - coords[ps[12]][0] +
-          6 * (coords[ps[2]][0] + coords[ps[7]][0]) -
-          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +
-          3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9,
-        (-4 * coords[ps[3]][1] - coords[ps[12]][1] +
-          6 * (coords[ps[2]][1] + coords[ps[7]][1]) -
-          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +
-          3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9
-      ]);
-      ps[9] = coords.length;
-      coords.push([
-        (-4 * coords[ps[12]][0] - coords[ps[3]][0] +
-          6 * (coords[ps[8]][0] + coords[ps[13]][0]) -
-          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +
-          3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9,
-        (-4 * coords[ps[12]][1] - coords[ps[3]][1] +
-          6 * (coords[ps[8]][1] + coords[ps[13]][1]) -
-          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +
-          3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9
-      ]);
-      ps[10] = coords.length;
-      coords.push([
-        (-4 * coords[ps[15]][0] - coords[ps[0]][0] +
-          6 * (coords[ps[11]][0] + coords[ps[14]][0]) -
-          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +
-          3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9,
-        (-4 * coords[ps[15]][1] - coords[ps[0]][1] +
-          6 * (coords[ps[11]][1] + coords[ps[14]][1]) -
-          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +
-          3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9
-      ]);
-      mesh.figures.push({
-        type: 'patch',
-        coords: new Int32Array(ps), // making copies of ps and cs
-        colors: new Int32Array(cs)
-      });
-    }
-  }
-
-  function decodeType7Shading(mesh, reader) {
-    var coords = mesh.coords;
-    var colors = mesh.colors;
-    var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33
-    var cs = new Int32Array(4); // c00, c30, c03, c33
-    while (reader.hasData) {
-      var f = reader.readFlag();
-      assert(0 <= f && f <= 3, 'Unknown type7 flag');
-      var i, ii;
-      var pi = coords.length;
-      for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) {
-        coords.push(reader.readCoordinate());
-      }
-      var ci = colors.length;
-      for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {
-        colors.push(reader.readComponents());
-      }
-      var tmp1, tmp2, tmp3, tmp4;
-      switch (f) {
-        case 0:
-          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;
-          ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7;
-          ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8;
-          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;
-          cs[2] = ci + 1; cs[3] = ci + 2;
-          cs[0] = ci;     cs[1] = ci + 3;
-          break;
-        case 1:
-          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];
-          ps[12] = pi + 5; ps[13] = pi + 4;  ps[14] = pi + 3;  ps[15] = pi + 2;
-          ps[ 8] = pi + 6; ps[ 9] = pi + 11; ps[10] = pi + 10; ps[11] = pi + 1;
-          ps[ 4] = pi + 7; ps[ 5] = pi + 8;  ps[ 6] = pi + 9;  ps[ 7] = pi;
-          ps[ 0] = tmp1;   ps[ 1] = tmp2;    ps[ 2] = tmp3;    ps[ 3] = tmp4;
-          tmp1 = cs[2]; tmp2 = cs[3];
-          cs[2] = ci + 1; cs[3] = ci;
-          cs[0] = tmp1;   cs[1] = tmp2;
-          break;
-        case 2:
-          ps[12] = ps[15]; ps[13] = pi + 7; ps[14] = pi + 6;  ps[15] = pi + 5;
-          ps[ 8] = ps[11]; ps[ 9] = pi + 8; ps[10] = pi + 11; ps[11] = pi + 4;
-          ps[ 4] = ps[7];  ps[ 5] = pi + 9; ps[ 6] = pi + 10; ps[ 7] = pi + 3;
-          ps[ 0] = ps[3];  ps[ 1] = pi;     ps[ 2] = pi + 1;  ps[ 3] = pi + 2;
-          cs[2] = cs[3]; cs[3] = ci + 1;
-          cs[0] = cs[1]; cs[1] = ci;
-          break;
-        case 3:
-          ps[12] = ps[0];  ps[13] = ps[1];   ps[14] = ps[2];   ps[15] = ps[3];
-          ps[ 8] = pi;     ps[ 9] = pi + 9;  ps[10] = pi + 8;  ps[11] = pi + 7;
-          ps[ 4] = pi + 1; ps[ 5] = pi + 10; ps[ 6] = pi + 11; ps[ 7] = pi + 6;
-          ps[ 0] = pi + 2; ps[ 1] = pi + 3;  ps[ 2] = pi + 4;  ps[ 3] = pi + 5;
-          cs[2] = cs[0]; cs[3] = cs[1];
-          cs[0] = ci;    cs[1] = ci + 1;
-          break;
-      }
-      mesh.figures.push({
-        type: 'patch',
-        coords: new Int32Array(ps), // making copies of ps and cs
-        colors: new Int32Array(cs)
-      });
-    }
-  }
-
-  function updateBounds(mesh) {
-    var minX = mesh.coords[0][0], minY = mesh.coords[0][1],
-      maxX = minX, maxY = minY;
-    for (var i = 1, ii = mesh.coords.length; i < ii; i++) {
-      var x = mesh.coords[i][0], y = mesh.coords[i][1];
-      minX = minX > x ? x : minX;
-      minY = minY > y ? y : minY;
-      maxX = maxX < x ? x : maxX;
-      maxY = maxY < y ? y : maxY;
-    }
-    mesh.bounds = [minX, minY, maxX, maxY];
-  }
-
-  function packData(mesh) {
-    var i, ii, j, jj;
-
-    var coords = mesh.coords;
-    var coordsPacked = new Float32Array(coords.length * 2);
-    for (i = 0, j = 0, ii = coords.length; i < ii; i++) {
-      var xy = coords[i];
-      coordsPacked[j++] = xy[0];
-      coordsPacked[j++] = xy[1];
-    }
-    mesh.coords = coordsPacked;
-
-    var colors = mesh.colors;
-    var colorsPacked = new Uint8Array(colors.length * 3);
-    for (i = 0, j = 0, ii = colors.length; i < ii; i++) {
-      var c = colors[i];
-      colorsPacked[j++] = c[0];
-      colorsPacked[j++] = c[1];
-      colorsPacked[j++] = c[2];
-    }
-    mesh.colors = colorsPacked;
-
-    var figures = mesh.figures;
-    for (i = 0, ii = figures.length; i < ii; i++) {
-      var figure = figures[i], ps = figure.coords, cs = figure.colors;
-      for (j = 0, jj = ps.length; j < jj; j++) {
-        ps[j] *= 2;
-        cs[j] *= 3;
-      }
-    }
-  }
-
-  function Mesh(stream, matrix, xref, res) {
-    assert(isStream(stream), 'Mesh data is not a stream');
-    var dict = stream.dict;
-    this.matrix = matrix;
-    this.shadingType = dict.get('ShadingType');
-    this.type = 'Pattern';
-    this.bbox = dict.get('BBox');
-    var cs = dict.get('ColorSpace', 'CS');
-    cs = ColorSpace.parse(cs, xref, res);
-    this.cs = cs;
-    this.background = dict.has('Background') ?
-      cs.getRgb(dict.get('Background'), 0) : null;
-
-    var fnObj = dict.get('Function');
-    var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null;
-
-    this.coords = [];
-    this.colors = [];
-    this.figures = [];
-
-    var decodeContext = {
-      bitsPerCoordinate: dict.get('BitsPerCoordinate'),
-      bitsPerComponent: dict.get('BitsPerComponent'),
-      bitsPerFlag: dict.get('BitsPerFlag'),
-      decode: dict.get('Decode'),
-      colorFn: fn,
-      colorSpace: cs,
-      numComps: fn ? 1 : cs.numComps
-    };
-    var reader = new MeshStreamReader(stream, decodeContext);
-
-    var patchMesh = false;
-    switch (this.shadingType) {
-      case PatternType.FREE_FORM_MESH:
-        decodeType4Shading(this, reader);
-        break;
-      case PatternType.LATTICE_FORM_MESH:
-        var verticesPerRow = dict.get('VerticesPerRow') | 0;
-        assert(verticesPerRow >= 2, 'Invalid VerticesPerRow');
-        decodeType5Shading(this, reader, verticesPerRow);
-        break;
-      case PatternType.COONS_PATCH_MESH:
-        decodeType6Shading(this, reader);
-        patchMesh = true;
-        break;
-      case PatternType.TENSOR_PATCH_MESH:
-        decodeType7Shading(this, reader);
-        patchMesh = true;
-        break;
-      default:
-        error('Unsupported mesh type.');
-        break;
-    }
-
-    if (patchMesh) {
-      // dirty bounds calculation for determining, how dense shall be triangles
-      updateBounds(this);
-      for (var i = 0, ii = this.figures.length; i < ii; i++) {
-        buildFigureFromPatch(this, i);
-      }
-    }
-    // calculate bounds
-    updateBounds(this);
-
-    packData(this);
-  }
-
-  Mesh.prototype = {
-    getIR: function Mesh_getIR() {
-      return ['Mesh', this.shadingType, this.coords, this.colors, this.figures,
-        this.bounds, this.matrix, this.bbox, this.background];
-    }
-  };
-
-  return Mesh;
-})();
-
-Shadings.Dummy = (function DummyClosure() {
-  function Dummy() {
-    this.type = 'Pattern';
-  }
-
-  Dummy.prototype = {
-    getIR: function Dummy_getIR() {
-      return ['Dummy'];
-    }
-  };
-  return Dummy;
-})();
-
-function getTilingPatternIR(operatorList, dict, args) {
-  var matrix = dict.get('Matrix');
-  var bbox = dict.get('BBox');
-  var xstep = dict.get('XStep');
-  var ystep = dict.get('YStep');
-  var paintType = dict.get('PaintType');
-  var tilingType = dict.get('TilingType');
-
-  return [
-    'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep,
-    paintType, tilingType
-  ];
-}
-
-
-var PartialEvaluator = (function PartialEvaluatorClosure() {
-  function PartialEvaluator(pdfManager, xref, handler, pageIndex,
-                            uniquePrefix, idCounters, fontCache) {
-    this.pdfManager = pdfManager;
-    this.xref = xref;
-    this.handler = handler;
-    this.pageIndex = pageIndex;
-    this.uniquePrefix = uniquePrefix;
-    this.idCounters = idCounters;
-    this.fontCache = fontCache;
-  }
-
-  // Trying to minimize Date.now() usage and check every 100 time
-  var TIME_SLOT_DURATION_MS = 20;
-  var CHECK_TIME_EVERY = 100;
-  function TimeSlotManager() {
-    this.reset();
-  }
-  TimeSlotManager.prototype = {
-    check: function TimeSlotManager_check() {
-      if (++this.checked < CHECK_TIME_EVERY) {
-        return false;
-      }
-      this.checked = 0;
-      return this.endTime <= Date.now();
-    },
-    reset: function TimeSlotManager_reset() {
-      this.endTime = Date.now() + TIME_SLOT_DURATION_MS;
-      this.checked = 0;
-    }
-  };
-
-  var deferred = Promise.resolve();
-
-  var TILING_PATTERN = 1, SHADING_PATTERN = 2;
-
-  PartialEvaluator.prototype = {
-    hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {
-      if (!isDict(resources)) {
-        return false;
-      }
-
-      var processed = Object.create(null);
-      if (resources.objId) {
-        processed[resources.objId] = true;
-      }
-
-      var nodes = [resources];
-      while (nodes.length) {
-        var key;
-        var node = nodes.shift();
-        // First check the current resources for blend modes.
-        var graphicStates = node.get('ExtGState');
-        if (isDict(graphicStates)) {
-          graphicStates = graphicStates.getAll();
-          for (key in graphicStates) {
-            var graphicState = graphicStates[key];
-            var bm = graphicState['BM'];
-            if (isName(bm) && bm.name !== 'Normal') {
-              return true;
-            }
-          }
-        }
-        // Descend into the XObjects to look for more resources and blend modes.
-        var xObjects = node.get('XObject');
-        if (!isDict(xObjects)) {
-          continue;
-        }
-        xObjects = xObjects.getAll();
-        for (key in xObjects) {
-          var xObject = xObjects[key];
-          if (!isStream(xObject)) {
-            continue;
-          }
-          if (xObject.dict.objId) {
-            if (processed[xObject.dict.objId]) {
-              // stream has objId and is processed already
-              continue;
-            }
-            processed[xObject.dict.objId] = true;
-          }
-          var xResources = xObject.dict.get('Resources');
-          // Checking objId to detect an infinite loop.
-          if (isDict(xResources) &&
-              (!xResources.objId || !processed[xResources.objId])) {
-            nodes.push(xResources);
-            if (xResources.objId) {
-              processed[xResources.objId] = true;
-            }
-          }
-        }
-      }
-      return false;
-    },
-
-    buildFormXObject: function PartialEvaluator_buildFormXObject(resources,
-                                                                 xobj, smask,
-                                                                 operatorList,
-                                                                 initialState) {
-      var matrix = xobj.dict.get('Matrix');
-      var bbox = xobj.dict.get('BBox');
-      var group = xobj.dict.get('Group');
-      if (group) {
-        var groupOptions = {
-          matrix: matrix,
-          bbox: bbox,
-          smask: smask,
-          isolated: false,
-          knockout: false
-        };
-
-        var groupSubtype = group.get('S');
-        var colorSpace;
-        if (isName(groupSubtype) && groupSubtype.name === 'Transparency') {
-          groupOptions.isolated = (group.get('I') || false);
-          groupOptions.knockout = (group.get('K') || false);
-          colorSpace = (group.has('CS') ?
-            ColorSpace.parse(group.get('CS'), this.xref, resources) : null);
-        }
-
-        if (smask && smask.backdrop) {
-          colorSpace = colorSpace || ColorSpace.singletons.rgb;
-          smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);
-        }
-
-        operatorList.addOp(OPS.beginGroup, [groupOptions]);
-      }
-
-      operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]);
-
-      return this.getOperatorList(xobj,
-        (xobj.dict.get('Resources') || resources), operatorList, initialState).
-        then(function () {
-          operatorList.addOp(OPS.paintFormXObjectEnd, []);
-
-          if (group) {
-            operatorList.addOp(OPS.endGroup, [groupOptions]);
-          }
-        });
-    },
-
-    buildPaintImageXObject:
-        function PartialEvaluator_buildPaintImageXObject(resources, image,
-                                                         inline, operatorList,
-                                                         cacheKey, imageCache) {
-      var self = this;
-      var dict = image.dict;
-      var w = dict.get('Width', 'W');
-      var h = dict.get('Height', 'H');
-
-      if (!(w && isNum(w)) || !(h && isNum(h))) {
-        warn('Image dimensions are missing, or not numbers.');
-        return;
-      }
-      if (PDFJS.maxImageSize !== -1 && w * h > PDFJS.maxImageSize) {
-        warn('Image exceeded maximum allowed size and was removed.');
-        return;
-      }
-
-      var imageMask = (dict.get('ImageMask', 'IM') || false);
-      var imgData, args;
-      if (imageMask) {
-        // This depends on a tmpCanvas being filled with the
-        // current fillStyle, such that processing the pixel
-        // data can't be done here. Instead of creating a
-        // complete PDFImage, only read the information needed
-        // for later.
-
-        var width = dict.get('Width', 'W');
-        var height = dict.get('Height', 'H');
-        var bitStrideLength = (width + 7) >> 3;
-        var imgArray = image.getBytes(bitStrideLength * height);
-        var decode = dict.get('Decode', 'D');
-        var inverseDecode = (!!decode && decode[0] > 0);
-
-        imgData = PDFImage.createMask(imgArray, width, height,
-                                      image instanceof DecodeStream,
-                                      inverseDecode);
-        imgData.cached = true;
-        args = [imgData];
-        operatorList.addOp(OPS.paintImageMaskXObject, args);
-        if (cacheKey) {
-          imageCache[cacheKey] = {
-            fn: OPS.paintImageMaskXObject,
-            args: args
-          };
-        }
-        return;
-      }
-
-      var softMask = (dict.get('SMask', 'SM') || false);
-      var mask = (dict.get('Mask') || false);
-
-      var SMALL_IMAGE_DIMENSIONS = 200;
-      // Inlining small images into the queue as RGB data
-      if (inline && !softMask && !mask && !(image instanceof JpegStream) &&
-          (w + h) < SMALL_IMAGE_DIMENSIONS) {
-        var imageObj = new PDFImage(this.xref, resources, image,
-                                    inline, null, null);
-        // We force the use of RGBA_32BPP images here, because we can't handle
-        // any other kind.
-        imgData = imageObj.createImageData(/* forceRGBA = */ true);
-        operatorList.addOp(OPS.paintInlineImageXObject, [imgData]);
-        return;
-      }
-
-      // If there is no imageMask, create the PDFImage and a lot
-      // of image processing can be done here.
-      var uniquePrefix = (this.uniquePrefix || '');
-      var objId = 'img_' + uniquePrefix + (++this.idCounters.obj);
-      operatorList.addDependency(objId);
-      args = [objId, w, h];
-
-      if (!softMask && !mask && image instanceof JpegStream &&
-          image.isNativelySupported(this.xref, resources)) {
-        // These JPEGs don't need any more processing so we can just send it.
-        operatorList.addOp(OPS.paintJpegXObject, args);
-        this.handler.send('obj',
-          [objId, this.pageIndex, 'JpegStream', image.getIR()]);
-        return;
-      }
-
-      PDFImage.buildImage(self.handler, self.xref, resources, image, inline).
-        then(function(imageObj) {
-          var imgData = imageObj.createImageData(/* forceRGBA = */ false);
-          self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData],
-            [imgData.data.buffer]);
-        }).then(undefined, function (reason) {
-          warn('Unable to decode image: ' + reason);
-          self.handler.send('obj', [objId, self.pageIndex, 'Image', null]);
-        });
-
-      operatorList.addOp(OPS.paintImageXObject, args);
-      if (cacheKey) {
-        imageCache[cacheKey] = {
-          fn: OPS.paintImageXObject,
-          args: args
-        };
-      }
-    },
-
-    handleSMask: function PartialEvaluator_handleSmask(smask, resources,
-                                                       operatorList,
-                                                       stateManager) {
-      var smaskContent = smask.get('G');
-      var smaskOptions = {
-        subtype: smask.get('S').name,
-        backdrop: smask.get('BC')
-      };
-      return this.buildFormXObject(resources, smaskContent, smaskOptions,
-                            operatorList, stateManager.state.clone());
-    },
-
-    handleTilingType:
-        function PartialEvaluator_handleTilingType(fn, args, resources,
-                                                   pattern, patternDict,
-                                                   operatorList) {
-      // Create an IR of the pattern code.
-      var tilingOpList = new OperatorList();
-      return this.getOperatorList(pattern,
-        (patternDict.get('Resources') || resources), tilingOpList).
-        then(function () {
-          // Add the dependencies to the parent operator list so they are
-          // resolved before sub operator list is executed synchronously.
-          operatorList.addDependencies(tilingOpList.dependencies);
-          operatorList.addOp(fn, getTilingPatternIR({
-            fnArray: tilingOpList.fnArray,
-            argsArray: tilingOpList.argsArray
-          }, patternDict, args));
-        });
-    },
-
-    handleSetFont:
-        function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef,
-                                                operatorList, state) {
-      // TODO(mack): Not needed?
-      var fontName;
-      if (fontArgs) {
-        fontArgs = fontArgs.slice();
-        fontName = fontArgs[0].name;
-      }
-
-      var self = this;
-      return this.loadFont(fontName, fontRef, this.xref, resources).then(
-          function (translated) {
-        if (!translated.font.isType3Font) {
-          return translated;
-        }
-        return translated.loadType3Data(self, resources, operatorList).then(
-            function () {
-          return translated;
-        });
-      }).then(function (translated) {
-        state.font = translated.font;
-        translated.send(self.handler);
-        return translated.loadedName;
-      });
-    },
-
-    handleText: function PartialEvaluator_handleText(chars, state) {
-      var font = state.font;
-      var glyphs = font.charsToGlyphs(chars);
-      var isAddToPathSet = !!(state.textRenderingMode &
-                              TextRenderingMode.ADD_TO_PATH_FLAG);
-      if (font.data && (isAddToPathSet || PDFJS.disableFontFace)) {
-        var buildPath = function (fontChar) {
-          if (!font.renderer.hasBuiltPath(fontChar)) {
-            var path = font.renderer.getPathJs(fontChar);
-            this.handler.send('commonobj', [
-              font.loadedName + '_path_' + fontChar,
-              'FontPath',
-              path
-            ]);
-          }
-        }.bind(this);
-
-        for (var i = 0, ii = glyphs.length; i < ii; i++) {
-          var glyph = glyphs[i];
-          if (glyph === null) {
-            continue;
-          }
-          buildPath(glyph.fontChar);
-
-          // If the glyph has an accent we need to build a path for its
-          // fontChar too, otherwise CanvasGraphics_paintChar will fail.
-          var accent = glyph.accent;
-          if (accent && accent.fontChar) {
-            buildPath(accent.fontChar);
-          }
-        }
-      }
-
-      return glyphs;
-    },
-
-    setGState: function PartialEvaluator_setGState(resources, gState,
-                                                   operatorList, xref,
-                                                   stateManager) {
-      // This array holds the converted/processed state data.
-      var gStateObj = [];
-      var gStateMap = gState.map;
-      var self = this;
-      var promise = Promise.resolve();
-      for (var key in gStateMap) {
-        var value = gStateMap[key];
-        switch (key) {
-          case 'Type':
-            break;
-          case 'LW':
-          case 'LC':
-          case 'LJ':
-          case 'ML':
-          case 'D':
-          case 'RI':
-          case 'FL':
-          case 'CA':
-          case 'ca':
-            gStateObj.push([key, value]);
-            break;
-          case 'Font':
-            promise = promise.then(function () {
-              return self.handleSetFont(resources, null, value[0],
-                                        operatorList, stateManager.state).
-                then(function (loadedName) {
-                  operatorList.addDependency(loadedName);
-                  gStateObj.push([key, [loadedName, value[1]]]);
-                });
-            });
-            break;
-          case 'BM':
-            gStateObj.push([key, value]);
-            break;
-          case 'SMask':
-            if (isName(value) && value.name === 'None') {
-              gStateObj.push([key, false]);
-              break;
-            }
-            var dict = xref.fetchIfRef(value);
-            if (isDict(dict)) {
-              promise = promise.then(function () {
-                return self.handleSMask(dict, resources, operatorList,
-                                        stateManager);
-              });
-              gStateObj.push([key, true]);
-            } else {
-              warn('Unsupported SMask type');
-            }
-
-            break;
-          // Only generate info log messages for the following since
-          // they are unlikely to have a big impact on the rendering.
-          case 'OP':
-          case 'op':
-          case 'OPM':
-          case 'BG':
-          case 'BG2':
-          case 'UCR':
-          case 'UCR2':
-          case 'TR':
-          case 'TR2':
-          case 'HT':
-          case 'SM':
-          case 'SA':
-          case 'AIS':
-          case 'TK':
-            // TODO implement these operators.
-            info('graphic state operator ' + key);
-            break;
-          default:
-            info('Unknown graphic state operator ' + key);
-            break;
-        }
-      }
-      return promise.then(function () {
-        if (gStateObj.length >= 0) {
-          operatorList.addOp(OPS.setGState, [gStateObj]);
-        }
-      });
-    },
-
-    loadFont: function PartialEvaluator_loadFont(fontName, font, xref,
-                                                 resources) {
-
-      function errorFont() {
-        return Promise.resolve(new TranslatedFont('g_font_error',
-          new ErrorFont('Font ' + fontName + ' is not available'), font));
-      }
-      var fontRef;
-      if (font) { // Loading by ref.
-        assert(isRef(font));
-        fontRef = font;
-      } else { // Loading by name.
-        var fontRes = resources.get('Font');
-        if (fontRes) {
-          fontRef = fontRes.getRaw(fontName);
-        } else {
-          warn('fontRes not available');
-          return errorFont();
-        }
-      }
-      if (!fontRef) {
-        warn('fontRef not available');
-        return errorFont();
-      }
-
-      if (this.fontCache.has(fontRef)) {
-        return this.fontCache.get(fontRef);
-      }
-
-      font = xref.fetchIfRef(fontRef);
-      if (!isDict(font)) {
-        return errorFont();
-      }
-
-      // We are holding font.translated references just for fontRef that are not
-      // dictionaries (Dict). See explanation below.
-      if (font.translated) {
-        return font.translated;
-      }
-
-      var fontCapability = createPromiseCapability();
-
-      var preEvaluatedFont = this.preEvaluateFont(font, xref);
-      var descriptor = preEvaluatedFont.descriptor;
-      var fontID = fontRef.num + '_' + fontRef.gen;
-      if (isDict(descriptor)) {
-        if (!descriptor.fontAliases) {
-          descriptor.fontAliases = Object.create(null);
-        }
-
-        var fontAliases = descriptor.fontAliases;
-        var hash = preEvaluatedFont.hash;
-        if (fontAliases[hash]) {
-          var aliasFontRef = fontAliases[hash].aliasRef;
-          if (aliasFontRef && this.fontCache.has(aliasFontRef)) {
-            this.fontCache.putAlias(fontRef, aliasFontRef);
-            return this.fontCache.get(fontRef);
-          }
-        }
-
-        if (!fontAliases[hash]) {
-          fontAliases[hash] = {
-            fontID: Font.getFontID()
-          };
-        }
-
-        fontAliases[hash].aliasRef = fontRef;
-        fontID = fontAliases[hash].fontID;
-      }
-
-      // Workaround for bad PDF generators that don't reference fonts
-      // properly, i.e. by not using an object identifier.
-      // Check if the fontRef is a Dict (as opposed to a standard object),
-      // in which case we don't cache the font and instead reference it by
-      // fontName in font.loadedName below.
-      var fontRefIsDict = isDict(fontRef);
-      if (!fontRefIsDict) {
-        this.fontCache.put(fontRef, fontCapability.promise);
-      }
-
-      // Keep track of each font we translated so the caller can
-      // load them asynchronously before calling display on a page.
-      font.loadedName = 'g_font_' + (fontRefIsDict ?
-        fontName.replace(/\W/g, '') : fontID);
-
-      font.translated = fontCapability.promise;
-
-      // TODO move promises into translate font
-      var translatedPromise;
-      try {
-        translatedPromise = Promise.resolve(
-          this.translateFont(preEvaluatedFont, xref));
-      } catch (e) {
-        translatedPromise = Promise.reject(e);
-      }
-
-      translatedPromise.then(function (translatedFont) {
-        if (translatedFont.fontType !== undefined) {
-          var xrefFontStats = xref.stats.fontTypes;
-          xrefFontStats[translatedFont.fontType] = true;
-        }
-
-        fontCapability.resolve(new TranslatedFont(font.loadedName,
-          translatedFont, font));
-      }, function (reason) {
-        // TODO fontCapability.reject?
-        UnsupportedManager.notify(UNSUPPORTED_FEATURES.font);
-
-        try {
-          // error, but it's still nice to have font type reported
-          var descriptor = preEvaluatedFont.descriptor;
-          var fontFile3 = descriptor && descriptor.get('FontFile3');
-          var subtype = fontFile3 && fontFile3.get('Subtype');
-          var fontType = getFontType(preEvaluatedFont.type,
-                                     subtype && subtype.name);
-          var xrefFontStats = xref.stats.fontTypes;
-          xrefFontStats[fontType] = true;
-        } catch (ex) { }
-
-        fontCapability.resolve(new TranslatedFont(font.loadedName,
-          new ErrorFont(reason instanceof Error ? reason.message : reason),
-          font));
-      });
-      return fontCapability.promise;
-    },
-
-    buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) {
-      var lastIndex = operatorList.length - 1;
-      if (!args) {
-        args = [];
-      }
-      if (lastIndex < 0 ||
-          operatorList.fnArray[lastIndex] !== OPS.constructPath) {
-        operatorList.addOp(OPS.constructPath, [[fn], args]);
-      } else {
-        var opArgs = operatorList.argsArray[lastIndex];
-        opArgs[0].push(fn);
-        Array.prototype.push.apply(opArgs[1], args);
-      }
-    },
-
-    handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args,
-          cs, patterns, resources, xref) {
-      // compile tiling patterns
-      var patternName = args[args.length - 1];
-      // SCN/scn applies patterns along with normal colors
-      var pattern;
-      if (isName(patternName) &&
-          (pattern = patterns.get(patternName.name))) {
-        var dict = (isStream(pattern) ? pattern.dict : pattern);
-        var typeNum = dict.get('PatternType');
-
-        if (typeNum === TILING_PATTERN) {
-          var color = cs.base ? cs.base.getRgb(args, 0) : null;
-          return this.handleTilingType(fn, color, resources, pattern,
-                                       dict, operatorList);
-        } else if (typeNum === SHADING_PATTERN) {
-          var shading = dict.get('Shading');
-          var matrix = dict.get('Matrix');
-          pattern = Pattern.parseShading(shading, matrix, xref, resources);
-          operatorList.addOp(fn, pattern.getIR());
-          return Promise.resolve();
-        } else {
-          return Promise.reject('Unknown PatternType: ' + typeNum);
-        }
-      }
-      // TODO shall we fail here?
-      operatorList.addOp(fn, args);
-      return Promise.resolve();
-    },
-
-    getOperatorList: function PartialEvaluator_getOperatorList(stream,
-                                                               resources,
-                                                               operatorList,
-                                                               initialState) {
-
-      var self = this;
-      var xref = this.xref;
-      var imageCache = {};
-
-      assert(operatorList);
-
-      resources = (resources || Dict.empty);
-      var xobjs = (resources.get('XObject') || Dict.empty);
-      var patterns = (resources.get('Pattern') || Dict.empty);
-      var stateManager = new StateManager(initialState || new EvalState());
-      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
-      var timeSlotManager = new TimeSlotManager();
-
-      return new Promise(function next(resolve, reject) {
-        timeSlotManager.reset();
-        var stop, operation = {}, i, ii, cs;
-        while (!(stop = timeSlotManager.check())) {
-          // The arguments parsed by read() are used beyond this loop, so we
-          // cannot reuse the same array on each iteration. Therefore we pass
-          // in |null| as the initial value (see the comment on
-          // EvaluatorPreprocessor_read() for why).
-          operation.args = null;
-          if (!(preprocessor.read(operation))) {
-            break;
-          }
-          var args = operation.args;
-          var fn = operation.fn;
-
-          switch (fn | 0) {
-            case OPS.paintXObject:
-              if (args[0].code) {
-                break;
-              }
-              // eagerly compile XForm objects
-              var name = args[0].name;
-              if (imageCache[name] !== undefined) {
-                operatorList.addOp(imageCache[name].fn, imageCache[name].args);
-                args = null;
-                continue;
-              }
-
-              var xobj = xobjs.get(name);
-              if (xobj) {
-                assert(isStream(xobj), 'XObject should be a stream');
-
-                var type = xobj.dict.get('Subtype');
-                assert(isName(type),
-                  'XObject should have a Name subtype');
-
-                if (type.name === 'Form') {
-                  stateManager.save();
-                  return self.buildFormXObject(resources, xobj, null,
-                                               operatorList,
-                                               stateManager.state.clone()).
-                    then(function () {
-                      stateManager.restore();
-                      next(resolve, reject);
-                    }, reject);
-                } else if (type.name === 'Image') {
-                  self.buildPaintImageXObject(resources, xobj, false,
-                    operatorList, name, imageCache);
-                  args = null;
-                  continue;
-                } else if (type.name === 'PS') {
-                  // PostScript XObjects are unused when viewing documents.
-                  // See section 4.7.1 of Adobe's PDF reference.
-                  info('Ignored XObject subtype PS');
-                  continue;
-                } else {
-                  error('Unhandled XObject subtype ' + type.name);
-                }
-              }
-              break;
-            case OPS.setFont:
-              var fontSize = args[1];
-              // eagerly collect all fonts
-              return self.handleSetFont(resources, args, null,
-                                        operatorList, stateManager.state).
-                then(function (loadedName) {
-                  operatorList.addDependency(loadedName);
-                  operatorList.addOp(OPS.setFont, [loadedName, fontSize]);
-                  next(resolve, reject);
-                }, reject);
-            case OPS.endInlineImage:
-              var cacheKey = args[0].cacheKey;
-              if (cacheKey) {
-                var cacheEntry = imageCache[cacheKey];
-                if (cacheEntry !== undefined) {
-                  operatorList.addOp(cacheEntry.fn, cacheEntry.args);
-                  args = null;
-                  continue;
-                }
-              }
-              self.buildPaintImageXObject(resources, args[0], true,
-                operatorList, cacheKey, imageCache);
-              args = null;
-              continue;
-            case OPS.showText:
-              args[0] = self.handleText(args[0], stateManager.state);
-              break;
-            case OPS.showSpacedText:
-              var arr = args[0];
-              var combinedGlyphs = [];
-              var arrLength = arr.length;
-              for (i = 0; i < arrLength; ++i) {
-                var arrItem = arr[i];
-                if (isString(arrItem)) {
-                  Array.prototype.push.apply(combinedGlyphs,
-                    self.handleText(arrItem, stateManager.state));
-                } else if (isNum(arrItem)) {
-                  combinedGlyphs.push(arrItem);
-                }
-              }
-              args[0] = combinedGlyphs;
-              fn = OPS.showText;
-              break;
-            case OPS.nextLineShowText:
-              operatorList.addOp(OPS.nextLine);
-              args[0] = self.handleText(args[0], stateManager.state);
-              fn = OPS.showText;
-              break;
-            case OPS.nextLineSetSpacingShowText:
-              operatorList.addOp(OPS.nextLine);
-              operatorList.addOp(OPS.setWordSpacing, [args.shift()]);
-              operatorList.addOp(OPS.setCharSpacing, [args.shift()]);
-              args[0] = self.handleText(args[0], stateManager.state);
-              fn = OPS.showText;
-              break;
-            case OPS.setTextRenderingMode:
-              stateManager.state.textRenderingMode = args[0];
-              break;
-
-            case OPS.setFillColorSpace:
-              stateManager.state.fillColorSpace =
-                ColorSpace.parse(args[0], xref, resources);
-              continue;
-            case OPS.setStrokeColorSpace:
-              stateManager.state.strokeColorSpace =
-                ColorSpace.parse(args[0], xref, resources);
-              continue;
-            case OPS.setFillColor:
-              cs = stateManager.state.fillColorSpace;
-              args = cs.getRgb(args, 0);
-              fn = OPS.setFillRGBColor;
-              break;
-            case OPS.setStrokeColor:
-              cs = stateManager.state.strokeColorSpace;
-              args = cs.getRgb(args, 0);
-              fn = OPS.setStrokeRGBColor;
-              break;
-            case OPS.setFillGray:
-              stateManager.state.fillColorSpace = ColorSpace.singletons.gray;
-              args = ColorSpace.singletons.gray.getRgb(args, 0);
-              fn = OPS.setFillRGBColor;
-              break;
-            case OPS.setStrokeGray:
-              stateManager.state.strokeColorSpace = ColorSpace.singletons.gray;
-              args = ColorSpace.singletons.gray.getRgb(args, 0);
-              fn = OPS.setStrokeRGBColor;
-              break;
-            case OPS.setFillCMYKColor:
-              stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk;
-              args = ColorSpace.singletons.cmyk.getRgb(args, 0);
-              fn = OPS.setFillRGBColor;
-              break;
-            case OPS.setStrokeCMYKColor:
-              stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk;
-              args = ColorSpace.singletons.cmyk.getRgb(args, 0);
-              fn = OPS.setStrokeRGBColor;
-              break;
-            case OPS.setFillRGBColor:
-              stateManager.state.fillColorSpace = ColorSpace.singletons.rgb;
-              args = ColorSpace.singletons.rgb.getRgb(args, 0);
-              break;
-            case OPS.setStrokeRGBColor:
-              stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb;
-              args = ColorSpace.singletons.rgb.getRgb(args, 0);
-              break;
-            case OPS.setFillColorN:
-              cs = stateManager.state.fillColorSpace;
-              if (cs.name === 'Pattern') {
-                return self.handleColorN(operatorList, OPS.setFillColorN,
-                  args, cs, patterns, resources, xref).then(function() {
-                    next(resolve, reject);
-                  }, reject);
-              }
-              args = cs.getRgb(args, 0);
-              fn = OPS.setFillRGBColor;
-              break;
-            case OPS.setStrokeColorN:
-              cs = stateManager.state.strokeColorSpace;
-              if (cs.name === 'Pattern') {
-                return self.handleColorN(operatorList, OPS.setStrokeColorN,
-                  args, cs, patterns, resources, xref).then(function() {
-                    next(resolve, reject);
-                  }, reject);
-              }
-              args = cs.getRgb(args, 0);
-              fn = OPS.setStrokeRGBColor;
-              break;
-
-            case OPS.shadingFill:
-              var shadingRes = resources.get('Shading');
-              if (!shadingRes) {
-                error('No shading resource found');
-              }
-
-              var shading = shadingRes.get(args[0].name);
-              if (!shading) {
-                error('No shading object found');
-              }
-
-              var shadingFill = Pattern.parseShading(shading, null, xref,
-                resources);
-              var patternIR = shadingFill.getIR();
-              args = [patternIR];
-              fn = OPS.shadingFill;
-              break;
-            case OPS.setGState:
-              var dictName = args[0];
-              var extGState = resources.get('ExtGState');
-
-              if (!isDict(extGState) || !extGState.has(dictName.name)) {
-                break;
-              }
-
-              var gState = extGState.get(dictName.name);
-              return self.setGState(resources, gState, operatorList, xref,
-                stateManager).then(function() {
-                  next(resolve, reject);
-                }, reject);
-            case OPS.moveTo:
-            case OPS.lineTo:
-            case OPS.curveTo:
-            case OPS.curveTo2:
-            case OPS.curveTo3:
-            case OPS.closePath:
-              self.buildPath(operatorList, fn, args);
-              continue;
-            case OPS.rectangle:
-              self.buildPath(operatorList, fn, args);
-              continue;
-          }
-          operatorList.addOp(fn, args);
-        }
-        if (stop) {
-          deferred.then(function () {
-            next(resolve, reject);
-          });
-          return;
-        }
-        // Some PDFs don't close all restores inside object/form.
-        // Closing those for them.
-        for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
-          operatorList.addOp(OPS.restore, []);
-        }
-        resolve();
-      });
-    },
-
-    getTextContent: function PartialEvaluator_getTextContent(stream, resources,
-                                                             stateManager) {
-
-      stateManager = (stateManager || new StateManager(new TextState()));
-
-      var textContent = {
-        items: [],
-        styles: Object.create(null)
-      };
-      var bidiTexts = textContent.items;
-      var SPACE_FACTOR = 0.3;
-      var MULTI_SPACE_FACTOR = 1.5;
-
-      var self = this;
-      var xref = this.xref;
-
-      resources = (xref.fetchIfRef(resources) || Dict.empty);
-
-      // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd.
-      var xobjs = null;
-      var xobjsCache = {};
-
-      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
-
-      var textState;
-
-      function newTextChunk() {
-        var font = textState.font;
-        if (!(font.loadedName in textContent.styles)) {
-          textContent.styles[font.loadedName] = {
-            fontFamily: font.fallbackName,
-            ascent: font.ascent,
-            descent: font.descent,
-            vertical: font.vertical
-          };
-        }
-        return {
-          // |str| is initially an array which we push individual chars to, and
-          // then runBidi() overwrites it with the final string.
-          str: [],
-          dir: null,
-          width: 0,
-          height: 0,
-          transform: null,
-          fontName: font.loadedName
-        };
-      }
-
-      function runBidi(textChunk) {
-        var str = textChunk.str.join('');
-        var bidiResult = PDFJS.bidi(str, -1, textState.font.vertical);
-        textChunk.str = bidiResult.str;
-        textChunk.dir = bidiResult.dir;
-        return textChunk;
-      }
-
-      function handleSetFont(fontName, fontRef) {
-        return self.loadFont(fontName, fontRef, xref, resources).
-          then(function (translated) {
-            textState.font = translated.font;
-            textState.fontMatrix = translated.font.fontMatrix ||
-              FONT_IDENTITY_MATRIX;
-          });
-      }
-
-      function buildTextGeometry(chars, textChunk) {
-        var font = textState.font;
-        textChunk = textChunk || newTextChunk();
-        if (!textChunk.transform) {
-          // 9.4.4 Text Space Details
-          var tsm = [textState.fontSize * textState.textHScale, 0,
-                     0, textState.fontSize,
-                     0, textState.textRise];
-
-          if (font.isType3Font &&
-              textState.fontMatrix !== FONT_IDENTITY_MATRIX &&
-              textState.fontSize === 1) {
-            var glyphHeight = font.bbox[3] - font.bbox[1];
-            if (glyphHeight > 0) {
-              glyphHeight = glyphHeight * textState.fontMatrix[3];
-              tsm[3] *= glyphHeight;
-            }
-          }
-
-          var trm = textChunk.transform = Util.transform(textState.ctm,
-                                    Util.transform(textState.textMatrix, tsm));
-          if (!font.vertical) {
-            textChunk.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);
-          } else {
-            textChunk.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);
-          }
-        }
-        var width = 0;
-        var height = 0;
-        var glyphs = font.charsToGlyphs(chars);
-        var defaultVMetrics = font.defaultVMetrics;
-        for (var i = 0; i < glyphs.length; i++) {
-          var glyph = glyphs[i];
-          if (!glyph) { // Previous glyph was a space.
-            width += textState.wordSpacing * textState.textHScale;
-            continue;
-          }
-          var vMetricX = null;
-          var vMetricY = null;
-          var glyphWidth = null;
-          if (font.vertical) {
-            if (glyph.vmetric) {
-              glyphWidth = glyph.vmetric[0];
-              vMetricX = glyph.vmetric[1];
-              vMetricY = glyph.vmetric[2];
-            } else {
-              glyphWidth = glyph.width;
-              vMetricX = glyph.width * 0.5;
-              vMetricY = defaultVMetrics[2];
-            }
-          } else {
-            glyphWidth = glyph.width;
-          }
-
-          var glyphUnicode = glyph.unicode;
-          if (NormalizedUnicodes[glyphUnicode] !== undefined) {
-            glyphUnicode = NormalizedUnicodes[glyphUnicode];
-          }
-          glyphUnicode = reverseIfRtl(glyphUnicode);
-
-          // The following will calculate the x and y of the individual glyphs.
-          // if (font.vertical) {
-          //   tsm[4] -= vMetricX * Math.abs(textState.fontSize) *
-          //             textState.fontMatrix[0];
-          //   tsm[5] -= vMetricY * textState.fontSize *
-          //             textState.fontMatrix[0];
-          // }
-          // var trm = Util.transform(textState.textMatrix, tsm);
-          // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm);
-          // var x = pt[0];
-          // var y = pt[1];
-
-          var charSpacing = 0;
-          if (textChunk.str.length > 0) {
-            // Apply char spacing only when there are chars.
-            // As a result there is only spacing between glyphs.
-            charSpacing = textState.charSpacing;
-          }
-
-          var tx = 0;
-          var ty = 0;
-          if (!font.vertical) {
-            var w0 = glyphWidth * textState.fontMatrix[0];
-            tx = (w0 * textState.fontSize + charSpacing) *
-                 textState.textHScale;
-            width += tx;
-          } else {
-            var w1 = glyphWidth * textState.fontMatrix[0];
-            ty = w1 * textState.fontSize + charSpacing;
-            height += ty;
-          }
-          textState.translateTextMatrix(tx, ty);
-
-          textChunk.str.push(glyphUnicode);
-        }
-
-        var a = textState.textLineMatrix[0];
-        var b = textState.textLineMatrix[1];
-        var scaleLineX = Math.sqrt(a * a + b * b);
-        a = textState.ctm[0];
-        b = textState.ctm[1];
-        var scaleCtmX = Math.sqrt(a * a + b * b);
-        if (!font.vertical) {
-          textChunk.width += width * scaleCtmX * scaleLineX;
-        } else {
-          textChunk.height += Math.abs(height * scaleCtmX * scaleLineX);
-        }
-        return textChunk;
-      }
-
-      var timeSlotManager = new TimeSlotManager();
-
-      return new Promise(function next(resolve, reject) {
-        timeSlotManager.reset();
-        var stop, operation = {}, args = [];
-        while (!(stop = timeSlotManager.check())) {
-          // The arguments parsed by read() are not used beyond this loop, so
-          // we can reuse the same array on every iteration, thus avoiding
-          // unnecessary allocations.
-          args.length = 0;
-          operation.args = args;
-          if (!(preprocessor.read(operation))) {
-            break;
-          }
-          textState = stateManager.state;
-          var fn = operation.fn;
-          args = operation.args;
-
-          switch (fn | 0) {
-            case OPS.setFont:
-              textState.fontSize = args[1];
-              return handleSetFont(args[0].name).then(function() {
-                next(resolve, reject);
-              }, reject);
-            case OPS.setTextRise:
-              textState.textRise = args[0];
-              break;
-            case OPS.setHScale:
-              textState.textHScale = args[0] / 100;
-              break;
-            case OPS.setLeading:
-              textState.leading = args[0];
-              break;
-            case OPS.moveText:
-              textState.translateTextLineMatrix(args[0], args[1]);
-              textState.textMatrix = textState.textLineMatrix.slice();
-              break;
-            case OPS.setLeadingMoveText:
-              textState.leading = -args[1];
-              textState.translateTextLineMatrix(args[0], args[1]);
-              textState.textMatrix = textState.textLineMatrix.slice();
-              break;
-            case OPS.nextLine:
-              textState.carriageReturn();
-              break;
-            case OPS.setTextMatrix:
-              textState.setTextMatrix(args[0], args[1], args[2], args[3],
-                args[4], args[5]);
-              textState.setTextLineMatrix(args[0], args[1], args[2], args[3],
-                args[4], args[5]);
-              break;
-            case OPS.setCharSpacing:
-              textState.charSpacing = args[0];
-              break;
-            case OPS.setWordSpacing:
-              textState.wordSpacing = args[0];
-              break;
-            case OPS.beginText:
-              textState.textMatrix = IDENTITY_MATRIX.slice();
-              textState.textLineMatrix = IDENTITY_MATRIX.slice();
-              break;
-            case OPS.showSpacedText:
-              var items = args[0];
-              var textChunk = newTextChunk();
-              var offset;
-              for (var j = 0, jj = items.length; j < jj; j++) {
-                if (typeof items[j] === 'string') {
-                  buildTextGeometry(items[j], textChunk);
-                } else {
-                  var val = items[j] / 1000;
-                  if (!textState.font.vertical) {
-                    offset = -val * textState.fontSize * textState.textHScale *
-                      textState.textMatrix[0];
-                    textState.translateTextMatrix(offset, 0);
-                    textChunk.width += offset;
-                  } else {
-                    offset = -val * textState.fontSize *
-                      textState.textMatrix[3];
-                    textState.translateTextMatrix(0, offset);
-                    textChunk.height += offset;
-                  }
-                  if (items[j] < 0 && textState.font.spaceWidth > 0) {
-                    var fakeSpaces = -items[j] / textState.font.spaceWidth;
-                    if (fakeSpaces > MULTI_SPACE_FACTOR) {
-                      fakeSpaces = Math.round(fakeSpaces);
-                      while (fakeSpaces--) {
-                        textChunk.str.push(' ');
-                      }
-                    } else if (fakeSpaces > SPACE_FACTOR) {
-                      textChunk.str.push(' ');
-                    }
-                  }
-                }
-              }
-              bidiTexts.push(runBidi(textChunk));
-              break;
-            case OPS.showText:
-              bidiTexts.push(runBidi(buildTextGeometry(args[0])));
-              break;
-            case OPS.nextLineShowText:
-              textState.carriageReturn();
-              bidiTexts.push(runBidi(buildTextGeometry(args[0])));
-              break;
-            case OPS.nextLineSetSpacingShowText:
-              textState.wordSpacing = args[0];
-              textState.charSpacing = args[1];
-              textState.carriageReturn();
-              bidiTexts.push(runBidi(buildTextGeometry(args[2])));
-              break;
-            case OPS.paintXObject:
-              if (args[0].code) {
-                break;
-              }
-
-              if (!xobjs) {
-                xobjs = (resources.get('XObject') || Dict.empty);
-              }
-
-              var name = args[0].name;
-              if (xobjsCache.key === name) {
-                if (xobjsCache.texts) {
-                  Util.appendToArray(bidiTexts, xobjsCache.texts.items);
-                  Util.extendObj(textContent.styles, xobjsCache.texts.styles);
-                }
-                break;
-              }
-
-              var xobj = xobjs.get(name);
-              if (!xobj) {
-                break;
-              }
-              assert(isStream(xobj), 'XObject should be a stream');
-
-              var type = xobj.dict.get('Subtype');
-              assert(isName(type),
-                'XObject should have a Name subtype');
-
-              if ('Form' !== type.name) {
-                xobjsCache.key = name;
-                xobjsCache.texts = null;
-                break;
-              }
-
-              stateManager.save();
-              var matrix = xobj.dict.get('Matrix');
-              if (isArray(matrix) && matrix.length === 6) {
-                stateManager.transform(matrix);
-              }
-
-              return self.getTextContent(xobj,
-                xobj.dict.get('Resources') || resources, stateManager).
-                then(function (formTextContent) {
-                  Util.appendToArray(bidiTexts, formTextContent.items);
-                  Util.extendObj(textContent.styles, formTextContent.styles);
-                  stateManager.restore();
-
-                  xobjsCache.key = name;
-                  xobjsCache.texts = formTextContent;
-
-                  next(resolve, reject);
-                }, reject);
-            case OPS.setGState:
-              var dictName = args[0];
-              var extGState = resources.get('ExtGState');
-
-              if (!isDict(extGState) || !extGState.has(dictName.name)) {
-                break;
-              }
-
-              var gsStateMap = extGState.get(dictName.name);
-              var gsStateFont = null;
-              for (var key in gsStateMap) {
-                if (key === 'Font') {
-                  assert(!gsStateFont);
-                  gsStateFont = gsStateMap[key];
-                }
-              }
-              if (gsStateFont) {
-                textState.fontSize = gsStateFont[1];
-                return handleSetFont(gsStateFont[0]).then(function() {
-                  next(resolve, reject);
-                }, reject);
-              }
-              break;
-          } // switch
-        } // while
-        if (stop) {
-          deferred.then(function () {
-            next(resolve, reject);
-          });
-          return;
-        }
-        resolve(textContent);
-      });
-    },
-
-    extractDataStructures: function
-      partialEvaluatorExtractDataStructures(dict, baseDict,
-                                            xref, properties) {
-      // 9.10.2
-      var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode'));
-      if (toUnicode) {
-        properties.toUnicode = this.readToUnicode(toUnicode);
-      }
-      if (properties.composite) {
-        // CIDSystemInfo helps to match CID to glyphs
-        var cidSystemInfo = dict.get('CIDSystemInfo');
-        if (isDict(cidSystemInfo)) {
-          properties.cidSystemInfo = {
-            registry: cidSystemInfo.get('Registry'),
-            ordering: cidSystemInfo.get('Ordering'),
-            supplement: cidSystemInfo.get('Supplement')
-          };
-        }
-
-        var cidToGidMap = dict.get('CIDToGIDMap');
-        if (isStream(cidToGidMap)) {
-          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
-        }
-      }
-
-      // Based on 9.6.6 of the spec the encoding can come from multiple places
-      // and depends on the font type. The base encoding and differences are
-      // read here, but the encoding that is actually used is chosen during
-      // glyph mapping in the font.
-      // TODO: Loading the built in encoding in the font would allow the
-      // differences to be merged in here not require us to hold on to it.
-      var differences = [];
-      var baseEncodingName = null;
-      var encoding;
-      if (dict.has('Encoding')) {
-        encoding = dict.get('Encoding');
-        if (isDict(encoding)) {
-          baseEncodingName = encoding.get('BaseEncoding');
-          baseEncodingName = (isName(baseEncodingName) ?
-                              baseEncodingName.name : null);
-          // Load the differences between the base and original
-          if (encoding.has('Differences')) {
-            var diffEncoding = encoding.get('Differences');
-            var index = 0;
-            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
-              var data = diffEncoding[j];
-              if (isNum(data)) {
-                index = data;
-              } else if (isName(data)) {
-                differences[index++] = data.name;
-              } else if (isRef(data)) {
-                diffEncoding[j--] = xref.fetch(data);
-                continue;
-              } else {
-                error('Invalid entry in \'Differences\' array: ' + data);
-              }
-            }
-          }
-        } else if (isName(encoding)) {
-          baseEncodingName = encoding.name;
-        } else {
-          error('Encoding is not a Name nor a Dict');
-        }
-        // According to table 114 if the encoding is a named encoding it must be
-        // one of these predefined encodings.
-        if ((baseEncodingName !== 'MacRomanEncoding' &&
-             baseEncodingName !== 'MacExpertEncoding' &&
-             baseEncodingName !== 'WinAnsiEncoding')) {
-          baseEncodingName = null;
-        }
-      }
-
-      if (baseEncodingName) {
-        properties.defaultEncoding = Encodings[baseEncodingName].slice();
-      } else {
-        encoding = (properties.type === 'TrueType' ?
-                    Encodings.WinAnsiEncoding : Encodings.StandardEncoding);
-        // The Symbolic attribute can be misused for regular fonts
-        // Heuristic: we have to check if the font is a standard one also
-        if (!!(properties.flags & FontFlags.Symbolic)) {
-          encoding = Encodings.MacRomanEncoding;
-          if (!properties.file) {
-            if (/Symbol/i.test(properties.name)) {
-              encoding = Encodings.SymbolSetEncoding;
-            } else if (/Dingbats/i.test(properties.name)) {
-              encoding = Encodings.ZapfDingbatsEncoding;
-            }
-          }
-        }
-        properties.defaultEncoding = encoding;
-      }
-
-      properties.differences = differences;
-      properties.baseEncodingName = baseEncodingName;
-      properties.dict = dict;
-    },
-
-    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {
-      var cmap, cmapObj = toUnicode;
-      if (isName(cmapObj)) {
-        cmap = CMapFactory.create(cmapObj,
-          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);
-        if (cmap instanceof IdentityCMap) {
-          return new IdentityToUnicodeMap(0, 0xFFFF);
-        }
-        return new ToUnicodeMap(cmap.getMap());
-      } else if (isStream(cmapObj)) {
-        cmap = CMapFactory.create(cmapObj,
-          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);
-        if (cmap instanceof IdentityCMap) {
-          return new IdentityToUnicodeMap(0, 0xFFFF);
-        }
-        cmap = cmap.getMap();
-        // Convert UTF-16BE
-        // NOTE: cmap can be a sparse array, so use forEach instead of for(;;)
-        // to iterate over all keys.
-        cmap.forEach(function(token, i) {
-          var str = [];
-          for (var k = 0; k < token.length; k += 2) {
-            var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);
-            if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF
-              str.push(w1);
-              continue;
-            }
-            k += 2;
-            var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);
-            str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
-          }
-          cmap[i] = String.fromCharCode.apply(String, str);
-        });
-        return new ToUnicodeMap(cmap);
-      }
-      return null;
-    },
-
-    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
-      // Extract the encoding from the CIDToGIDMap
-      var glyphsData = cidToGidStream.getBytes();
-
-      // Set encoding 0 to later verify the font has an encoding
-      var result = [];
-      for (var j = 0, jj = glyphsData.length; j < jj; j++) {
-        var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
-        if (glyphID === 0) {
-          continue;
-        }
-        var code = j >> 1;
-        result[code] = glyphID;
-      }
-      return result;
-    },
-
-    extractWidths: function PartialEvaluator_extractWidths(dict, xref,
-                                                           descriptor,
-                                                           properties) {
-      var glyphsWidths = [];
-      var defaultWidth = 0;
-      var glyphsVMetrics = [];
-      var defaultVMetrics;
-      var i, ii, j, jj, start, code, widths;
-      if (properties.composite) {
-        defaultWidth = dict.get('DW') || 1000;
-
-        widths = dict.get('W');
-        if (widths) {
-          for (i = 0, ii = widths.length; i < ii; i++) {
-            start = widths[i++];
-            code = xref.fetchIfRef(widths[i]);
-            if (isArray(code)) {
-              for (j = 0, jj = code.length; j < jj; j++) {
-                glyphsWidths[start++] = code[j];
-              }
-            } else {
-              var width = widths[++i];
-              for (j = start; j <= code; j++) {
-                glyphsWidths[j] = width;
-              }
-            }
-          }
-        }
-
-        if (properties.vertical) {
-          var vmetrics = (dict.get('DW2') || [880, -1000]);
-          defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
-          vmetrics = dict.get('W2');
-          if (vmetrics) {
-            for (i = 0, ii = vmetrics.length; i < ii; i++) {
-              start = vmetrics[i++];
-              code = xref.fetchIfRef(vmetrics[i]);
-              if (isArray(code)) {
-                for (j = 0, jj = code.length; j < jj; j++) {
-                  glyphsVMetrics[start++] = [code[j++], code[j++], code[j]];
-                }
-              } else {
-                var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]];
-                for (j = start; j <= code; j++) {
-                  glyphsVMetrics[j] = vmetric;
-                }
-              }
-            }
-          }
-        }
-      } else {
-        var firstChar = properties.firstChar;
-        widths = dict.get('Widths');
-        if (widths) {
-          j = firstChar;
-          for (i = 0, ii = widths.length; i < ii; i++) {
-            glyphsWidths[j++] = widths[i];
-          }
-          defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0);
-        } else {
-          // Trying get the BaseFont metrics (see comment above).
-          var baseFontName = dict.get('BaseFont');
-          if (isName(baseFontName)) {
-            var metrics = this.getBaseFontMetrics(baseFontName.name);
-
-            glyphsWidths = this.buildCharCodeToWidth(metrics.widths,
-                                                     properties);
-            defaultWidth = metrics.defaultWidth;
-          }
-        }
-      }
-
-      // Heuristic: detection of monospace font by checking all non-zero widths
-      var isMonospace = true;
-      var firstWidth = defaultWidth;
-      for (var glyph in glyphsWidths) {
-        var glyphWidth = glyphsWidths[glyph];
-        if (!glyphWidth) {
-          continue;
-        }
-        if (!firstWidth) {
-          firstWidth = glyphWidth;
-          continue;
-        }
-        if (firstWidth !== glyphWidth) {
-          isMonospace = false;
-          break;
-        }
-      }
-      if (isMonospace) {
-        properties.flags |= FontFlags.FixedPitch;
-      }
-
-      properties.defaultWidth = defaultWidth;
-      properties.widths = glyphsWidths;
-      properties.defaultVMetrics = defaultVMetrics;
-      properties.vmetrics = glyphsVMetrics;
-    },
-
-    isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {
-      // Simulating descriptor flags attribute
-      var fontNameWoStyle = baseFontName.split('-')[0];
-      return (fontNameWoStyle in serifFonts) ||
-              (fontNameWoStyle.search(/serif/gi) !== -1);
-    },
-
-    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
-      var defaultWidth = 0;
-      var widths = [];
-      var monospace = false;
-      var lookupName = (stdFontMap[name] || name);
-
-      if (!(lookupName in Metrics)) {
-        // Use default fonts for looking up font metrics if the passed
-        // font is not a base font
-        if (this.isSerifFont(name)) {
-          lookupName = 'Times-Roman';
-        } else {
-          lookupName = 'Helvetica';
-        }
-      }
-      var glyphWidths = Metrics[lookupName];
-
-      if (isNum(glyphWidths)) {
-        defaultWidth = glyphWidths;
-        monospace = true;
-      } else {
-        widths = glyphWidths;
-      }
-
-      return {
-        defaultWidth: defaultWidth,
-        monospace: monospace,
-        widths: widths
-      };
-    },
-
-    buildCharCodeToWidth:
-        function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName,
-                                                        properties) {
-      var widths = Object.create(null);
-      var differences = properties.differences;
-      var encoding = properties.defaultEncoding;
-      for (var charCode = 0; charCode < 256; charCode++) {
-        if (charCode in differences &&
-            widthsByGlyphName[differences[charCode]]) {
-          widths[charCode] = widthsByGlyphName[differences[charCode]];
-          continue;
-        }
-        if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
-          widths[charCode] = widthsByGlyphName[encoding[charCode]];
-          continue;
-        }
-      }
-      return widths;
-    },
-
-    preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) {
-      var baseDict = dict;
-      var type = dict.get('Subtype');
-      assert(isName(type), 'invalid font Subtype');
-
-      var composite = false;
-      var uint8array;
-      if (type.name === 'Type0') {
-        // If font is a composite
-        //  - get the descendant font
-        //  - set the type according to the descendant font
-        //  - get the FontDescriptor from the descendant font
-        var df = dict.get('DescendantFonts');
-        if (!df) {
-          error('Descendant fonts are not specified');
-        }
-        dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df);
-
-        type = dict.get('Subtype');
-        assert(isName(type), 'invalid font Subtype');
-        composite = true;
-      }
-
-      var descriptor = dict.get('FontDescriptor');
-      if (descriptor) {
-        var hash = new MurmurHash3_64();
-        var encoding = baseDict.getRaw('Encoding');
-        if (isName(encoding)) {
-          hash.update(encoding.name);
-        } else if (isRef(encoding)) {
-          hash.update(encoding.num + '_' + encoding.gen);
-        } else if (isDict(encoding)) {
-          var keys = encoding.getKeys();
-          for (var i = 0, ii = keys.length; i < ii; i++) {
-            var entry = encoding.getRaw(keys[i]);
-            if (isName(entry)) {
-              hash.update(entry.name);
-            } else if (isRef(entry)) {
-              hash.update(entry.num + '_' + entry.gen);
-            } else if (isArray(entry)) { // 'Differences' entry.
-              // Ideally we should check the contents of the array, but to avoid
-              // parsing it here and then again in |extractDataStructures|,
-              // we only use the array length for now (fixes bug1157493.pdf).
-              hash.update(entry.length.toString());
-            }
-          }
-        }
-
-        var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');
-        if (isStream(toUnicode)) {
-          var stream = toUnicode.str || toUnicode;
-          uint8array = stream.buffer ?
-            new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) :
-            new Uint8Array(stream.bytes.buffer,
-                           stream.start, stream.end - stream.start);
-          hash.update(uint8array);
-
-        } else if (isName(toUnicode)) {
-          hash.update(toUnicode.name);
-        }
-
-        var widths = dict.get('Widths') || baseDict.get('Widths');
-        if (widths) {
-          uint8array = new Uint8Array(new Uint32Array(widths).buffer);
-          hash.update(uint8array);
-        }
-      }
-
-      return {
-        descriptor: descriptor,
-        dict: dict,
-        baseDict: baseDict,
-        composite: composite,
-        type: type.name,
-        hash: hash ? hash.hexdigest() : ''
-      };
-    },
-
-    translateFont: function PartialEvaluator_translateFont(preEvaluatedFont,
-                                                           xref) {
-      var baseDict = preEvaluatedFont.baseDict;
-      var dict = preEvaluatedFont.dict;
-      var composite = preEvaluatedFont.composite;
-      var descriptor = preEvaluatedFont.descriptor;
-      var type = preEvaluatedFont.type;
-      var maxCharIndex = (composite ? 0xFFFF : 0xFF);
-      var properties;
-
-      if (!descriptor) {
-        if (type === 'Type3') {
-          // FontDescriptor is only required for Type3 fonts when the document
-          // is a tagged pdf. Create a barbebones one to get by.
-          descriptor = new Dict(null);
-          descriptor.set('FontName', Name.get(type));
-          descriptor.set('FontBBox', dict.get('FontBBox'));
-        } else {
-          // Before PDF 1.5 if the font was one of the base 14 fonts, having a
-          // FontDescriptor was not required.
-          // This case is here for compatibility.
-          var baseFontName = dict.get('BaseFont');
-          if (!isName(baseFontName)) {
-            error('Base font is not specified');
-          }
-
-          // Using base font name as a font name.
-          baseFontName = baseFontName.name.replace(/[,_]/g, '-');
-          var metrics = this.getBaseFontMetrics(baseFontName);
-
-          // Simulating descriptor flags attribute
-          var fontNameWoStyle = baseFontName.split('-')[0];
-          var flags =
-            (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) |
-            (metrics.monospace ? FontFlags.FixedPitch : 0) |
-            (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :
-                                             FontFlags.Nonsymbolic);
-
-          properties = {
-            type: type,
-            name: baseFontName,
-            widths: metrics.widths,
-            defaultWidth: metrics.defaultWidth,
-            flags: flags,
-            firstChar: 0,
-            lastChar: maxCharIndex
-          };
-          this.extractDataStructures(dict, dict, xref, properties);
-          properties.widths = this.buildCharCodeToWidth(metrics.widths,
-                                                        properties);
-          return new Font(baseFontName, null, properties);
-        }
-      }
-
-      // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
-      // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
-      // to ignore this rule when a variant of a standart font is used.
-      // TODO Fill the width array depending on which of the base font this is
-      // a variant.
-      var firstChar = (dict.get('FirstChar') || 0);
-      var lastChar = (dict.get('LastChar') || maxCharIndex);
-
-      var fontName = descriptor.get('FontName');
-      var baseFont = dict.get('BaseFont');
-      // Some bad PDFs have a string as the font name.
-      if (isString(fontName)) {
-        fontName = Name.get(fontName);
-      }
-      if (isString(baseFont)) {
-        baseFont = Name.get(baseFont);
-      }
-
-      if (type !== 'Type3') {
-        var fontNameStr = fontName && fontName.name;
-        var baseFontStr = baseFont && baseFont.name;
-        if (fontNameStr !== baseFontStr) {
-          info('The FontDescriptor\'s FontName is "' + fontNameStr +
-               '" but should be the same as the Font\'s BaseFont "' +
-               baseFontStr + '"');
-          // Workaround for cases where e.g. fontNameStr = 'Arial' and
-          // baseFontStr = 'Arial,Bold' (needed when no font file is embedded).
-          if (fontNameStr && baseFontStr &&
-              baseFontStr.indexOf(fontNameStr) === 0) {
-            fontName = baseFont;
-          }
-        }
-      }
-      fontName = (fontName || baseFont);
-
-      assert(isName(fontName), 'invalid font name');
-
-      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
-      if (fontFile) {
-        if (fontFile.dict) {
-          var subtype = fontFile.dict.get('Subtype');
-          if (subtype) {
-            subtype = subtype.name;
-          }
-          var length1 = fontFile.dict.get('Length1');
-          var length2 = fontFile.dict.get('Length2');
-        }
-      }
-
-      properties = {
-        type: type,
-        name: fontName.name,
-        subtype: subtype,
-        file: fontFile,
-        length1: length1,
-        length2: length2,
-        loadedName: baseDict.loadedName,
-        composite: composite,
-        wideChars: composite,
-        fixedPitch: false,
-        fontMatrix: (dict.get('FontMatrix') || FONT_IDENTITY_MATRIX),
-        firstChar: firstChar || 0,
-        lastChar: (lastChar || maxCharIndex),
-        bbox: descriptor.get('FontBBox'),
-        ascent: descriptor.get('Ascent'),
-        descent: descriptor.get('Descent'),
-        xHeight: descriptor.get('XHeight'),
-        capHeight: descriptor.get('CapHeight'),
-        flags: descriptor.get('Flags'),
-        italicAngle: descriptor.get('ItalicAngle'),
-        coded: false
-      };
-
-      if (composite) {
-        var cidEncoding = baseDict.get('Encoding');
-        if (isName(cidEncoding)) {
-          properties.cidEncoding = cidEncoding.name;
-        }
-        properties.cMap = CMapFactory.create(cidEncoding,
-          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);
-        properties.vertical = properties.cMap.vertical;
-      }
-      this.extractDataStructures(dict, baseDict, xref, properties);
-      this.extractWidths(dict, xref, descriptor, properties);
-
-      if (type === 'Type3') {
-        properties.isType3Font = true;
-      }
-
-      return new Font(fontName.name, fontFile, properties);
-    }
-  };
-
-  return PartialEvaluator;
-})();
-
-var TranslatedFont = (function TranslatedFontClosure() {
-  function TranslatedFont(loadedName, font, dict) {
-    this.loadedName = loadedName;
-    this.font = font;
-    this.dict = dict;
-    this.type3Loaded = null;
-    this.sent = false;
-  }
-  TranslatedFont.prototype = {
-    send: function (handler) {
-      if (this.sent) {
-        return;
-      }
-      var fontData = this.font.exportData();
-      handler.send('commonobj', [
-        this.loadedName,
-        'Font',
-        fontData
-      ]);
-      this.sent = true;
-    },
-    loadType3Data: function (evaluator, resources, parentOperatorList) {
-      assert(this.font.isType3Font);
-
-      if (this.type3Loaded) {
-        return this.type3Loaded;
-      }
-
-      var translatedFont = this.font;
-      var loadCharProcsPromise = Promise.resolve();
-      var charProcs = this.dict.get('CharProcs').getAll();
-      var fontResources = this.dict.get('Resources') || resources;
-      var charProcKeys = Object.keys(charProcs);
-      var charProcOperatorList = {};
-      for (var i = 0, n = charProcKeys.length; i < n; ++i) {
-        loadCharProcsPromise = loadCharProcsPromise.then(function (key) {
-          var glyphStream = charProcs[key];
-          var operatorList = new OperatorList();
-          return evaluator.getOperatorList(glyphStream, fontResources,
-                                           operatorList).then(function () {
-            charProcOperatorList[key] = operatorList.getIR();
-
-            // Add the dependencies to the parent operator list so they are
-            // resolved before sub operator list is executed synchronously.
-            parentOperatorList.addDependencies(operatorList.dependencies);
-          }, function (reason) {
-            warn('Type3 font resource \"' + key + '\" is not available');
-            var operatorList = new OperatorList();
-            charProcOperatorList[key] = operatorList.getIR();
-          });
-        }.bind(this, charProcKeys[i]));
-      }
-      this.type3Loaded = loadCharProcsPromise.then(function () {
-        translatedFont.charProcOperatorList = charProcOperatorList;
-      });
-      return this.type3Loaded;
-    }
-  };
-  return TranslatedFont;
-})();
-
-var OperatorList = (function OperatorListClosure() {
-  var CHUNK_SIZE = 1000;
-  var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size
-
-  function getTransfers(queue) {
-    var transfers = [];
-    var fnArray = queue.fnArray, argsArray = queue.argsArray;
-    for (var i = 0, ii = queue.length; i < ii; i++) {
-      switch (fnArray[i]) {
-        case OPS.paintInlineImageXObject:
-        case OPS.paintInlineImageXObjectGroup:
-        case OPS.paintImageMaskXObject:
-          var arg = argsArray[i][0]; // first param in imgData
-          if (!arg.cached) {
-            transfers.push(arg.data.buffer);
-          }
-          break;
-      }
-    }
-    return transfers;
-  }
-
-  function OperatorList(intent, messageHandler, pageIndex) {
-    this.messageHandler = messageHandler;
-    this.fnArray = [];
-    this.argsArray = [];
-    this.dependencies = {};
-    this.pageIndex = pageIndex;
-    this.intent = intent;
-  }
-
-  OperatorList.prototype = {
-    get length() {
-      return this.argsArray.length;
-    },
-
-    addOp: function(fn, args) {
-      this.fnArray.push(fn);
-      this.argsArray.push(args);
-      if (this.messageHandler) {
-        if (this.fnArray.length >= CHUNK_SIZE) {
-          this.flush();
-        } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT &&
-                   (fn === OPS.restore || fn === OPS.endText)) {
-          // heuristic to flush on boundary of restore or endText
-          this.flush();
-        }
-      }
-    },
-
-    addDependency: function(dependency) {
-      if (dependency in this.dependencies) {
-        return;
-      }
-      this.dependencies[dependency] = true;
-      this.addOp(OPS.dependency, [dependency]);
-    },
-
-    addDependencies: function(dependencies) {
-      for (var key in dependencies) {
-        this.addDependency(key);
-      }
-    },
-
-    addOpList: function(opList) {
-      Util.extendObj(this.dependencies, opList.dependencies);
-      for (var i = 0, ii = opList.length; i < ii; i++) {
-        this.addOp(opList.fnArray[i], opList.argsArray[i]);
-      }
-    },
-
-    getIR: function() {
-      return {
-        fnArray: this.fnArray,
-        argsArray: this.argsArray,
-        length: this.length
-      };
-    },
-
-    flush: function(lastChunk) {
-      if (this.intent !== 'oplist') {
-        new QueueOptimizer().optimize(this);
-      }
-      var transfers = getTransfers(this);
-      this.messageHandler.send('RenderPageChunk', {
-        operatorList: {
-          fnArray: this.fnArray,
-          argsArray: this.argsArray,
-          lastChunk: lastChunk,
-          length: this.length
-        },
-        pageIndex: this.pageIndex,
-        intent: this.intent
-      }, transfers);
-      this.dependencies = {};
-      this.fnArray.length = 0;
-      this.argsArray.length = 0;
-    }
-  };
-
-  return OperatorList;
-})();
-
-var StateManager = (function StateManagerClosure() {
-  function StateManager(initialState) {
-    this.state = initialState;
-    this.stateStack = [];
-  }
-  StateManager.prototype = {
-    save: function () {
-      var old = this.state;
-      this.stateStack.push(this.state);
-      this.state = old.clone();
-    },
-    restore: function () {
-      var prev = this.stateStack.pop();
-      if (prev) {
-        this.state = prev;
-      }
-    },
-    transform: function (args) {
-      this.state.ctm = Util.transform(this.state.ctm, args);
-    }
-  };
-  return StateManager;
-})();
-
-var TextState = (function TextStateClosure() {
-  function TextState() {
-    this.ctm = new Float32Array(IDENTITY_MATRIX);
-    this.fontSize = 0;
-    this.font = null;
-    this.fontMatrix = FONT_IDENTITY_MATRIX;
-    this.textMatrix = IDENTITY_MATRIX.slice();
-    this.textLineMatrix = IDENTITY_MATRIX.slice();
-    this.charSpacing = 0;
-    this.wordSpacing = 0;
-    this.leading = 0;
-    this.textHScale = 1;
-    this.textRise = 0;
-  }
-
-  TextState.prototype = {
-    setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
-      var m = this.textMatrix;
-      m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;
-    },
-    setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
-      var m = this.textLineMatrix;
-      m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;
-    },
-    translateTextMatrix: function TextState_translateTextMatrix(x, y) {
-      var m = this.textMatrix;
-      m[4] = m[0] * x + m[2] * y + m[4];
-      m[5] = m[1] * x + m[3] * y + m[5];
-    },
-    translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {
-      var m = this.textLineMatrix;
-      m[4] = m[0] * x + m[2] * y + m[4];
-      m[5] = m[1] * x + m[3] * y + m[5];
-    },
-    calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {
-      // 9.4.4 Text Space Details
-      var tsm = [this.fontSize * this.textHScale, 0,
-                0, this.fontSize,
-                0, this.textRise];
-      return Util.transform(ctm, Util.transform(this.textMatrix, tsm));
-    },
-    carriageReturn: function TextState_carriageReturn() {
-      this.translateTextLineMatrix(0, -this.leading);
-      this.textMatrix = this.textLineMatrix.slice();
-    },
-    clone: function TextState_clone() {
-      var clone = Object.create(this);
-      clone.textMatrix = this.textMatrix.slice();
-      clone.textLineMatrix = this.textLineMatrix.slice();
-      clone.fontMatrix = this.fontMatrix.slice();
-      return clone;
-    }
-  };
-  return TextState;
-})();
-
-var EvalState = (function EvalStateClosure() {
-  function EvalState() {
-    this.ctm = new Float32Array(IDENTITY_MATRIX);
-    this.font = null;
-    this.textRenderingMode = TextRenderingMode.FILL;
-    this.fillColorSpace = ColorSpace.singletons.gray;
-    this.strokeColorSpace = ColorSpace.singletons.gray;
-  }
-  EvalState.prototype = {
-    clone: function CanvasExtraState_clone() {
-      return Object.create(this);
-    },
-  };
-  return EvalState;
-})();
-
-var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
-  // Specifies properties for each command
-  //
-  // If variableArgs === true: [0, `numArgs`] expected
-  // If variableArgs === false: exactly `numArgs` expected
-  var OP_MAP = {
-    // Graphic state
-    w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false },
-    J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false },
-    j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false },
-    M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false },
-    d: { id: OPS.setDash, numArgs: 2, variableArgs: false },
-    ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false },
-    i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false },
-    gs: { id: OPS.setGState, numArgs: 1, variableArgs: false },
-    q: { id: OPS.save, numArgs: 0, variableArgs: false },
-    Q: { id: OPS.restore, numArgs: 0, variableArgs: false },
-    cm: { id: OPS.transform, numArgs: 6, variableArgs: false },
-
-    // Path
-    m: { id: OPS.moveTo, numArgs: 2, variableArgs: false },
-    l: { id: OPS.lineTo, numArgs: 2, variableArgs: false },
-    c: { id: OPS.curveTo, numArgs: 6, variableArgs: false },
-    v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false },
-    y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false },
-    h: { id: OPS.closePath, numArgs: 0, variableArgs: false },
-    re: { id: OPS.rectangle, numArgs: 4, variableArgs: false },
-    S: { id: OPS.stroke, numArgs: 0, variableArgs: false },
-    s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false },
-    f: { id: OPS.fill, numArgs: 0, variableArgs: false },
-    F: { id: OPS.fill, numArgs: 0, variableArgs: false },
-    'f*': { id: OPS.eoFill, numArgs: 0, variableArgs: false },
-    B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false },
-    'B*': { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false },
-    b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false },
-    'b*': { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false },
-    n: { id: OPS.endPath, numArgs: 0, variableArgs: false },
-
-    // Clipping
-    W: { id: OPS.clip, numArgs: 0, variableArgs: false },
-    'W*': { id: OPS.eoClip, numArgs: 0, variableArgs: false },
-
-    // Text
-    BT: { id: OPS.beginText, numArgs: 0, variableArgs: false },
-    ET: { id: OPS.endText, numArgs: 0, variableArgs: false },
-    Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false },
-    Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false },
-    Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false },
-    TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false },
-    Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false },
-    Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false },
-    Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false },
-    Td: { id: OPS.moveText, numArgs: 2, variableArgs: false },
-    TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false },
-    Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false },
-    'T*': { id: OPS.nextLine, numArgs: 0, variableArgs: false },
-    Tj: { id: OPS.showText, numArgs: 1, variableArgs: false },
-    TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false },
-    '\'': { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false },
-    '"': { id: OPS.nextLineSetSpacingShowText, numArgs: 3,
-           variableArgs: false },
-
-    // Type3 fonts
-    d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false },
-    d1: { id: OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: false },
-
-    // Color
-    CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false },
-    cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false },
-    SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true },
-    SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true },
-    sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true },
-    scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true },
-    G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false },
-    g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false },
-    RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false },
-    rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false },
-    K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false },
-    k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false },
-
-    // Shading
-    sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false },
-
-    // Images
-    BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false },
-    ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false },
-    EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false },
-
-    // XObjects
-    Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false },
-    MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false },
-    DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false },
-    BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false },
-    BDC: { id: OPS.beginMarkedContentProps, numArgs: 2,
-           variableArgs: false },
-    EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false },
-
-    // Compatibility
-    BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false },
-    EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false },
-
-    // (reserved partial commands for the lexer)
-    BM: null,
-    BD: null,
-    'true': null,
-    fa: null,
-    fal: null,
-    fals: null,
-    'false': null,
-    nu: null,
-    nul: null,
-    'null': null
-  };
-
-  function EvaluatorPreprocessor(stream, xref, stateManager) {
-    // TODO(mduan): pass array of knownCommands rather than OP_MAP
-    // dictionary
-    this.parser = new Parser(new Lexer(stream, OP_MAP), false, xref);
-    this.stateManager = stateManager;
-    this.nonProcessedArgs = [];
-  }
-
-  EvaluatorPreprocessor.prototype = {
-    get savedStatesDepth() {
-      return this.stateManager.stateStack.length;
-    },
-
-    // |operation| is an object with two fields:
-    //
-    // - |fn| is an out param.
-    //
-    // - |args| is an inout param. On entry, it should have one of two values.
-    //
-    //   - An empty array. This indicates that the caller is providing the
-    //     array in which the args will be stored in. The caller should use
-    //     this value if it can reuse a single array for each call to read().
-    //
-    //   - |null|. This indicates that the caller needs this function to create
-    //     the array in which any args are stored in. If there are zero args,
-    //     this function will leave |operation.args| as |null| (thus avoiding
-    //     allocations that would occur if we used an empty array to represent
-    //     zero arguments). Otherwise, it will replace |null| with a new array
-    //     containing the arguments. The caller should use this value if it
-    //     cannot reuse an array for each call to read().
-    //
-    // These two modes are present because this function is very hot and so
-    // avoiding allocations where possible is worthwhile.
-    //
-    read: function EvaluatorPreprocessor_read(operation) {
-      var args = operation.args;
-      while (true) {
-        var obj = this.parser.getObj();
-        if (isCmd(obj)) {
-          var cmd = obj.cmd;
-          // Check that the command is valid
-          var opSpec = OP_MAP[cmd];
-          if (!opSpec) {
-            warn('Unknown command "' + cmd + '"');
-            continue;
-          }
-
-          var fn = opSpec.id;
-          var numArgs = opSpec.numArgs;
-          var argsLength = args !== null ? args.length : 0;
-
-          if (!opSpec.variableArgs) {
-            // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf
-            if (argsLength !== numArgs) {
-              var nonProcessedArgs = this.nonProcessedArgs;
-              while (argsLength > numArgs) {
-                nonProcessedArgs.push(args.shift());
-                argsLength--;
-              }
-              while (argsLength < numArgs && nonProcessedArgs.length !== 0) {
-                if (!args) {
-                  args = [];
-                }
-                args.unshift(nonProcessedArgs.pop());
-                argsLength++;
-              }
-            }
-
-            if (argsLength < numArgs) {
-              // If we receive too few args, it's not possible to possible
-              // to execute the command, so skip the command
-              info('Command ' + fn + ': because expected ' +
-                   numArgs + ' args, but received ' + argsLength +
-                   ' args; skipping');
-              args = null;
-              continue;
-            }
-          } else if (argsLength > numArgs) {
-            info('Command ' + fn + ': expected [0,' + numArgs +
-                 '] args, but received ' + argsLength + ' args');
-          }
-
-          // TODO figure out how to type-check vararg functions
-          this.preprocessCommand(fn, args);
-
-          operation.fn = fn;
-          operation.args = args;
-          return true;
-        } else {
-          if (isEOF(obj)) {
-            return false; // no more commands
-          }
-          // argument
-          if (obj !== null) {
-            if (!args) {
-              args = [];
-            }
-            args.push((obj instanceof Dict ? obj.getAll() : obj));
-            assert(args.length <= 33, 'Too many arguments');
-          }
-        }
-      }
-    },
-
-    preprocessCommand:
-        function EvaluatorPreprocessor_preprocessCommand(fn, args) {
-      switch (fn | 0) {
-        case OPS.save:
-          this.stateManager.save();
-          break;
-        case OPS.restore:
-          this.stateManager.restore();
-          break;
-        case OPS.transform:
-          this.stateManager.transform(args);
-          break;
-      }
-    }
-  };
-  return EvaluatorPreprocessor;
-})();
-
-var QueueOptimizer = (function QueueOptimizerClosure() {
-  function addState(parentState, pattern, fn) {
-    var state = parentState;
-    for (var i = 0, ii = pattern.length - 1; i < ii; i++) {
-      var item = pattern[i];
-      state = (state[item] || (state[item] = []));
-    }
-    state[pattern[pattern.length - 1]] = fn;
-  }
-
-  function handlePaintSolidColorImageMask(iFirstSave, count, fnArray,
-                                          argsArray) {
-    // Handles special case of mainly LaTeX documents which use image masks to
-    // draw lines with the current fill style.
-    // 'count' groups of (save, transform, paintImageMaskXObject, restore)+
-    // have been found at iFirstSave.
-    var iFirstPIMXO = iFirstSave + 2;
-    for (var i = 0; i < count; i++) {
-      var arg = argsArray[iFirstPIMXO + 4 * i];
-      var imageMask = arg.length === 1 && arg[0];
-      if (imageMask && imageMask.width === 1 && imageMask.height === 1 &&
-          (!imageMask.data.length ||
-           (imageMask.data.length === 1 && imageMask.data[0] === 0))) {
-        fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask;
-        continue;
-      }
-      break;
-    }
-    return count - i;
-  }
-
-  var InitialState = [];
-
-  // This replaces (save, transform, paintInlineImageXObject, restore)+
-  // sequences with one |paintInlineImageXObjectGroup| operation.
-  addState(InitialState,
-    [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore],
-    function foundInlineImageGroup(context) {
-      var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
-      var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
-      var MAX_WIDTH = 1000;
-      var IMAGE_PADDING = 1;
-
-      var fnArray = context.fnArray, argsArray = context.argsArray;
-      var curr = context.iCurr;
-      var iFirstSave = curr - 3;
-      var iFirstTransform = curr - 2;
-      var iFirstPIIXO = curr - 1;
-
-      // Look for the quartets.
-      var i = iFirstSave + 4;
-      var ii = fnArray.length;
-      while (i + 3 < ii) {
-        if (fnArray[i] !== OPS.save ||
-            fnArray[i + 1] !== OPS.transform ||
-            fnArray[i + 2] !== OPS.paintInlineImageXObject ||
-            fnArray[i + 3] !== OPS.restore) {
-          break;    // ops don't match
-        }
-        i += 4;
-      }
-
-      // At this point, i is the index of the first op past the last valid
-      // quartet.
-      var count = Math.min((i - iFirstSave) / 4,
-                           MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);
-      if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
-        return i;
-      }
-
-      // assuming that heights of those image is too small (~1 pixel)
-      // packing as much as possible by lines
-      var maxX = 0;
-      var map = [], maxLineHeight = 0;
-      var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING;
-      var q;
-      for (q = 0; q < count; q++) {
-        var transform = argsArray[iFirstTransform + (q << 2)];
-        var img = argsArray[iFirstPIIXO + (q << 2)][0];
-        if (currentX + img.width > MAX_WIDTH) {
-          // starting new line
-          maxX = Math.max(maxX, currentX);
-          currentY += maxLineHeight + 2 * IMAGE_PADDING;
-          currentX = 0;
-          maxLineHeight = 0;
-        }
-        map.push({
-          transform: transform,
-          x: currentX, y: currentY,
-          w: img.width, h: img.height
-        });
-        currentX += img.width + 2 * IMAGE_PADDING;
-        maxLineHeight = Math.max(maxLineHeight, img.height);
-      }
-      var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
-      var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
-      var imgData = new Uint8Array(imgWidth * imgHeight * 4);
-      var imgRowSize = imgWidth << 2;
-      for (q = 0; q < count; q++) {
-        var data = argsArray[iFirstPIIXO + (q << 2)][0].data;
-        // Copy image by lines and extends pixels into padding.
-        var rowSize = map[q].w << 2;
-        var dataOffset = 0;
-        var offset = (map[q].x + map[q].y * imgWidth) << 2;
-        imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
-        for (var k = 0, kk = map[q].h; k < kk; k++) {
-          imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
-          dataOffset += rowSize;
-          offset += imgRowSize;
-        }
-        imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
-        while (offset >= 0) {
-          data[offset - 4] = data[offset];
-          data[offset - 3] = data[offset + 1];
-          data[offset - 2] = data[offset + 2];
-          data[offset - 1] = data[offset + 3];
-          data[offset + rowSize] = data[offset + rowSize - 4];
-          data[offset + rowSize + 1] = data[offset + rowSize - 3];
-          data[offset + rowSize + 2] = data[offset + rowSize - 2];
-          data[offset + rowSize + 3] = data[offset + rowSize - 1];
-          offset -= imgRowSize;
-        }
-      }
-
-      // Replace queue items.
-      fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup);
-      argsArray.splice(iFirstSave, count * 4,
-        [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP,
-           data: imgData }, map]);
-
-      return iFirstSave + 1;
-    });
-
-  // This replaces (save, transform, paintImageMaskXObject, restore)+
-  // sequences with one |paintImageMaskXObjectGroup| or one
-  // |paintImageMaskXObjectRepeat| operation.
-  addState(InitialState,
-    [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore],
-    function foundImageMaskGroup(context) {
-      var MIN_IMAGES_IN_MASKS_BLOCK = 10;
-      var MAX_IMAGES_IN_MASKS_BLOCK = 100;
-      var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
-
-      var fnArray = context.fnArray, argsArray = context.argsArray;
-      var curr = context.iCurr;
-      var iFirstSave = curr - 3;
-      var iFirstTransform = curr - 2;
-      var iFirstPIMXO = curr - 1;
-
-      // Look for the quartets.
-      var i = iFirstSave + 4;
-      var ii = fnArray.length;
-      while (i + 3 < ii) {
-        if (fnArray[i] !== OPS.save ||
-            fnArray[i + 1] !== OPS.transform ||
-            fnArray[i + 2] !== OPS.paintImageMaskXObject ||
-            fnArray[i + 3] !== OPS.restore) {
-          break;    // ops don't match
-        }
-        i += 4;
-      }
-
-      // At this point, i is the index of the first op past the last valid
-      // quartet.
-      var count = (i - iFirstSave) / 4;
-      count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray,
-                                             argsArray);
-      if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
-        return i;
-      }
-
-      var q;
-      var isSameImage = false;
-      var iTransform, transformArgs;
-      var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
-      if (argsArray[iFirstTransform][1] === 0 &&
-          argsArray[iFirstTransform][2] === 0) {
-        isSameImage = true;
-        var firstTransformArg0 = argsArray[iFirstTransform][0];
-        var firstTransformArg3 = argsArray[iFirstTransform][3];
-        iTransform = iFirstTransform + 4;
-        var iPIMXO = iFirstPIMXO + 4;
-        for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
-          transformArgs = argsArray[iTransform];
-          if (argsArray[iPIMXO][0] !== firstPIMXOArg0 ||
-              transformArgs[0] !== firstTransformArg0 ||
-              transformArgs[1] !== 0 ||
-              transformArgs[2] !== 0 ||
-              transformArgs[3] !== firstTransformArg3) {
-            if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
-              isSameImage = false;
-            } else {
-              count = q;
-            }
-            break; // different image or transform
-          }
-        }
-      }
-
-      if (isSameImage) {
-        count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
-        var positions = new Float32Array(count * 2);
-        iTransform = iFirstTransform;
-        for (q = 0; q < count; q++, iTransform += 4) {
-          transformArgs = argsArray[iTransform];
-          positions[(q << 1)] = transformArgs[4];
-          positions[(q << 1) + 1] = transformArgs[5];
-        }
-
-        // Replace queue items.
-        fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat);
-        argsArray.splice(iFirstSave, count * 4,
-          [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]);
-      } else {
-        count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
-        var images = [];
-        for (q = 0; q < count; q++) {
-          transformArgs = argsArray[iFirstTransform + (q << 2)];
-          var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
-          images.push({ data: maskParams.data, width: maskParams.width,
-                        height: maskParams.height,
-                        transform: transformArgs });
-        }
-
-        // Replace queue items.
-        fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup);
-        argsArray.splice(iFirstSave, count * 4, [images]);
-      }
-
-      return iFirstSave + 1;
-    });
-
-  // This replaces (save, transform, paintImageXObject, restore)+ sequences
-  // with one paintImageXObjectRepeat operation, if the |transform| and
-  // |paintImageXObjectRepeat| ops are appropriate.
-  addState(InitialState,
-    [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore],
-    function (context) {
-      var MIN_IMAGES_IN_BLOCK = 3;
-      var MAX_IMAGES_IN_BLOCK = 1000;
-
-      var fnArray = context.fnArray, argsArray = context.argsArray;
-      var curr = context.iCurr;
-      var iFirstSave = curr - 3;
-      var iFirstTransform = curr - 2;
-      var iFirstPIXO = curr - 1;
-      var iFirstRestore = curr;
-
-      if (argsArray[iFirstTransform][1] !== 0 ||
-          argsArray[iFirstTransform][2] !== 0) {
-        return iFirstRestore + 1;   // transform has the wrong form
-      }
-
-      // Look for the quartets.
-      var firstPIXOArg0 = argsArray[iFirstPIXO][0];
-      var firstTransformArg0 = argsArray[iFirstTransform][0];
-      var firstTransformArg3 = argsArray[iFirstTransform][3];
-      var i = iFirstSave + 4;
-      var ii = fnArray.length;
-      while (i + 3 < ii) {
-        if (fnArray[i] !== OPS.save ||
-            fnArray[i + 1] !== OPS.transform ||
-            fnArray[i + 2] !== OPS.paintImageXObject ||
-            fnArray[i + 3] !== OPS.restore) {
-          break;    // ops don't match
-        }
-        if (argsArray[i + 1][0] !== firstTransformArg0 ||
-            argsArray[i + 1][1] !== 0 ||
-            argsArray[i + 1][2] !== 0 ||
-            argsArray[i + 1][3] !== firstTransformArg3) {
-          break;    // transforms don't match
-        }
-        if (argsArray[i + 2][0] !== firstPIXOArg0) {
-          break;    // images don't match
-        }
-        i += 4;
-      }
-
-      // At this point, i is the index of the first op past the last valid
-      // quartet.
-      var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK);
-      if (count < MIN_IMAGES_IN_BLOCK) {
-        return i;
-      }
-
-      // Extract the (x,y) positions from all of the matching transforms.
-      var positions = new Float32Array(count * 2);
-      var iTransform = iFirstTransform;
-      for (var q = 0; q < count; q++, iTransform += 4) {
-        var transformArgs = argsArray[iTransform];
-        positions[(q << 1)] = transformArgs[4];
-        positions[(q << 1) + 1] = transformArgs[5];
-      }
-
-      // Replace queue items.
-      var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3,
-                  positions];
-      fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat);
-      argsArray.splice(iFirstSave, count * 4, args);
-
-      return iFirstSave + 1;
-    });
-
-  // This replaces (beginText, setFont, setTextMatrix, showText, endText)+
-  // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+
-  // sequences, if the font for each one is the same.
-  addState(InitialState,
-    [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText],
-    function (context) {
-      var MIN_CHARS_IN_BLOCK = 3;
-      var MAX_CHARS_IN_BLOCK = 1000;
-
-      var fnArray = context.fnArray, argsArray = context.argsArray;
-      var curr = context.iCurr;
-      var iFirstBeginText = curr - 4;
-      var iFirstSetFont = curr - 3;
-      var iFirstSetTextMatrix = curr - 2;
-      var iFirstShowText = curr - 1;
-      var iFirstEndText = curr;
-
-      // Look for the quintets.
-      var firstSetFontArg0 = argsArray[iFirstSetFont][0];
-      var firstSetFontArg1 = argsArray[iFirstSetFont][1];
-      var i = iFirstBeginText + 5;
-      var ii = fnArray.length;
-      while (i + 4 < ii) {
-        if (fnArray[i] !== OPS.beginText ||
-            fnArray[i + 1] !== OPS.setFont ||
-            fnArray[i + 2] !== OPS.setTextMatrix ||
-            fnArray[i + 3] !== OPS.showText ||
-            fnArray[i + 4] !== OPS.endText) {
-          break;    // ops don't match
-        }
-        if (argsArray[i + 1][0] !== firstSetFontArg0 ||
-            argsArray[i + 1][1] !== firstSetFontArg1) {
-          break;    // fonts don't match
-        }
-        i += 5;
-      }
-
-      // At this point, i is the index of the first op past the last valid
-      // quintet.
-      var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);
-      if (count < MIN_CHARS_IN_BLOCK) {
-        return i;
-      }
-
-      // If the preceding quintet is (<something>, setFont, setTextMatrix,
-      // showText, endText), include that as well. (E.g. <something> might be
-      // |dependency|.)
-      var iFirst = iFirstBeginText;
-      if (iFirstBeginText >= 4 &&
-          fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] &&
-          fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] &&
-          fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] &&
-          fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] &&
-          argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 &&
-          argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {
-        count++;
-        iFirst -= 5;
-      }
-
-      // Remove (endText, beginText, setFont) trios.
-      var iEndText = iFirst + 4;
-      for (var q = 1; q < count; q++) {
-        fnArray.splice(iEndText, 3);
-        argsArray.splice(iEndText, 3);
-        iEndText += 2;
-      }
-
-      return iEndText + 1;
-    });
-
-  function QueueOptimizer() {}
-
-  QueueOptimizer.prototype = {
-    optimize: function QueueOptimizer_optimize(queue) {
-      var fnArray = queue.fnArray, argsArray = queue.argsArray;
-      var context = {
-        iCurr: 0,
-        fnArray: fnArray,
-        argsArray: argsArray
-      };
-      var state;
-      var i = 0, ii = fnArray.length;
-      while (i < ii) {
-        state = (state || InitialState)[fnArray[i]];
-        if (typeof state === 'function') { // we found some handler
-          context.iCurr = i;
-          // state() returns the index of the first non-matching op (if we
-          // didn't match) or the first op past the modified ops (if we did
-          // match and replace).
-          i = state(context);
-          state = undefined;    // reset the state machine
-          ii = context.fnArray.length;
-        } else {
-          i++;
-        }
-      }
-    }
-  };
-  return QueueOptimizer;
-})();
-
-
-var BUILT_IN_CMAPS = [
-// << Start unicode maps.
-'Adobe-GB1-UCS2',
-'Adobe-CNS1-UCS2',
-'Adobe-Japan1-UCS2',
-'Adobe-Korea1-UCS2',
-// >> End unicode maps.
-'78-EUC-H',
-'78-EUC-V',
-'78-H',
-'78-RKSJ-H',
-'78-RKSJ-V',
-'78-V',
-'78ms-RKSJ-H',
-'78ms-RKSJ-V',
-'83pv-RKSJ-H',
-'90ms-RKSJ-H',
-'90ms-RKSJ-V',
-'90msp-RKSJ-H',
-'90msp-RKSJ-V',
-'90pv-RKSJ-H',
-'90pv-RKSJ-V',
-'Add-H',
-'Add-RKSJ-H',
-'Add-RKSJ-V',
-'Add-V',
-'Adobe-CNS1-0',
-'Adobe-CNS1-1',
-'Adobe-CNS1-2',
-'Adobe-CNS1-3',
-'Adobe-CNS1-4',
-'Adobe-CNS1-5',
-'Adobe-CNS1-6',
-'Adobe-GB1-0',
-'Adobe-GB1-1',
-'Adobe-GB1-2',
-'Adobe-GB1-3',
-'Adobe-GB1-4',
-'Adobe-GB1-5',
-'Adobe-Japan1-0',
-'Adobe-Japan1-1',
-'Adobe-Japan1-2',
-'Adobe-Japan1-3',
-'Adobe-Japan1-4',
-'Adobe-Japan1-5',
-'Adobe-Japan1-6',
-'Adobe-Korea1-0',
-'Adobe-Korea1-1',
-'Adobe-Korea1-2',
-'B5-H',
-'B5-V',
-'B5pc-H',
-'B5pc-V',
-'CNS-EUC-H',
-'CNS-EUC-V',
-'CNS1-H',
-'CNS1-V',
-'CNS2-H',
-'CNS2-V',
-'ETHK-B5-H',
-'ETHK-B5-V',
-'ETen-B5-H',
-'ETen-B5-V',
-'ETenms-B5-H',
-'ETenms-B5-V',
-'EUC-H',
-'EUC-V',
-'Ext-H',
-'Ext-RKSJ-H',
-'Ext-RKSJ-V',
-'Ext-V',
-'GB-EUC-H',
-'GB-EUC-V',
-'GB-H',
-'GB-V',
-'GBK-EUC-H',
-'GBK-EUC-V',
-'GBK2K-H',
-'GBK2K-V',
-'GBKp-EUC-H',
-'GBKp-EUC-V',
-'GBT-EUC-H',
-'GBT-EUC-V',
-'GBT-H',
-'GBT-V',
-'GBTpc-EUC-H',
-'GBTpc-EUC-V',
-'GBpc-EUC-H',
-'GBpc-EUC-V',
-'H',
-'HKdla-B5-H',
-'HKdla-B5-V',
-'HKdlb-B5-H',
-'HKdlb-B5-V',
-'HKgccs-B5-H',
-'HKgccs-B5-V',
-'HKm314-B5-H',
-'HKm314-B5-V',
-'HKm471-B5-H',
-'HKm471-B5-V',
-'HKscs-B5-H',
-'HKscs-B5-V',
-'Hankaku',
-'Hiragana',
-'KSC-EUC-H',
-'KSC-EUC-V',
-'KSC-H',
-'KSC-Johab-H',
-'KSC-Johab-V',
-'KSC-V',
-'KSCms-UHC-H',
-'KSCms-UHC-HW-H',
-'KSCms-UHC-HW-V',
-'KSCms-UHC-V',
-'KSCpc-EUC-H',
-'KSCpc-EUC-V',
-'Katakana',
-'NWP-H',
-'NWP-V',
-'RKSJ-H',
-'RKSJ-V',
-'Roman',
-'UniCNS-UCS2-H',
-'UniCNS-UCS2-V',
-'UniCNS-UTF16-H',
-'UniCNS-UTF16-V',
-'UniCNS-UTF32-H',
-'UniCNS-UTF32-V',
-'UniCNS-UTF8-H',
-'UniCNS-UTF8-V',
-'UniGB-UCS2-H',
-'UniGB-UCS2-V',
-'UniGB-UTF16-H',
-'UniGB-UTF16-V',
-'UniGB-UTF32-H',
-'UniGB-UTF32-V',
-'UniGB-UTF8-H',
-'UniGB-UTF8-V',
-'UniJIS-UCS2-H',
-'UniJIS-UCS2-HW-H',
-'UniJIS-UCS2-HW-V',
-'UniJIS-UCS2-V',
-'UniJIS-UTF16-H',
-'UniJIS-UTF16-V',
-'UniJIS-UTF32-H',
-'UniJIS-UTF32-V',
-'UniJIS-UTF8-H',
-'UniJIS-UTF8-V',
-'UniJIS2004-UTF16-H',
-'UniJIS2004-UTF16-V',
-'UniJIS2004-UTF32-H',
-'UniJIS2004-UTF32-V',
-'UniJIS2004-UTF8-H',
-'UniJIS2004-UTF8-V',
-'UniJISPro-UCS2-HW-V',
-'UniJISPro-UCS2-V',
-'UniJISPro-UTF8-V',
-'UniJISX0213-UTF32-H',
-'UniJISX0213-UTF32-V',
-'UniJISX02132004-UTF32-H',
-'UniJISX02132004-UTF32-V',
-'UniKS-UCS2-H',
-'UniKS-UCS2-V',
-'UniKS-UTF16-H',
-'UniKS-UTF16-V',
-'UniKS-UTF32-H',
-'UniKS-UTF32-V',
-'UniKS-UTF8-H',
-'UniKS-UTF8-V',
-'V',
-'WP-Symbol'];
-
-// CMap, not to be confused with TrueType's cmap.
-var CMap = (function CMapClosure() {
-  function CMap(builtInCMap) {
-    // Codespace ranges are stored as follows:
-    // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]]
-    // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...]
-    this.codespaceRanges = [[], [], [], []];
-    this.numCodespaceRanges = 0;
-    // Map entries have one of two forms.
-    // - cid chars are 16-bit unsigned integers, stored as integers.
-    // - bf chars are variable-length byte sequences, stored as strings, with
-    //   one byte per character.
-    this._map = [];
-    this.name = '';
-    this.vertical = false;
-    this.useCMap = null;
-    this.builtInCMap = builtInCMap;
-  }
-  CMap.prototype = {
-    addCodespaceRange: function(n, low, high) {
-      this.codespaceRanges[n - 1].push(low, high);
-      this.numCodespaceRanges++;
-    },
-
-    mapCidRange: function(low, high, dstLow) {
-      while (low <= high) {
-        this._map[low++] = dstLow++;
-      }
-    },
-
-    mapBfRange: function(low, high, dstLow) {
-      var lastByte = dstLow.length - 1;
-      while (low <= high) {
-        this._map[low++] = dstLow;
-        // Only the last byte has to be incremented.
-        dstLow = dstLow.substr(0, lastByte) +
-                 String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);
-      }
-    },
-
-    mapBfRangeToArray: function(low, high, array) {
-      var i = 0, ii = array.length;
-      while (low <= high && i < ii) {
-        this._map[low] = array[i++];
-        ++low;
-      }
-    },
-
-    // This is used for both bf and cid chars.
-    mapOne: function(src, dst) {
-      this._map[src] = dst;
-    },
-
-    lookup: function(code) {
-      return this._map[code];
-    },
-
-    contains: function(code) {
-      return this._map[code] !== undefined;
-    },
-
-    forEach: function(callback) {
-      // Most maps have fewer than 65536 entries, and for those we use normal
-      // array iteration. But really sparse tables are possible -- e.g. with
-      // indices in the *billions*. For such tables we use for..in, which isn't
-      // ideal because it stringifies the indices for all present elements, but
-      // it does avoid iterating over every undefined entry.
-      var map = this._map;
-      var length = map.length;
-      var i;
-      if (length <= 0x10000) {
-        for (i = 0; i < length; i++) {
-          if (map[i] !== undefined) {
-            callback(i, map[i]);
-          }
-        }
-      } else {
-        for (i in this._map) {
-          callback(i, map[i]);
-        }
-      }
-    },
-
-    charCodeOf: function(value) {
-      return this._map.indexOf(value);
-    },
-
-    getMap: function() {
-      return this._map;
-    },
-
-    readCharCode: function(str, offset, out) {
-      var c = 0;
-      var codespaceRanges = this.codespaceRanges;
-      var codespaceRangesLen = this.codespaceRanges.length;
-      // 9.7.6.2 CMap Mapping
-      // The code length is at most 4.
-      for (var n = 0; n < codespaceRangesLen; n++) {
-        c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0;
-        // Check each codespace range to see if it falls within.
-        var codespaceRange = codespaceRanges[n];
-        for (var k = 0, kk = codespaceRange.length; k < kk;) {
-          var low = codespaceRange[k++];
-          var high = codespaceRange[k++];
-          if (c >= low && c <= high) {
-            out.charcode = c;
-            out.length = n + 1;
-            return;
-          }
-        }
-      }
-      out.charcode = 0;
-      out.length = 1;
-    },
-
-    get isIdentityCMap() {
-      if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) {
-        return false;
-      }
-      if (this._map.length !== 0x10000) {
-        return false;
-      }
-      for (var i = 0; i < 0x10000; i++) {
-        if (this._map[i] !== i) {
-          return false;
-        }
-      }
-      return true;
-    }
-  };
-  return CMap;
-})();
-
-// A special case of CMap, where the _map array implicitly has a length of
-// 65536 and each element is equal to its index.
-var IdentityCMap = (function IdentityCMapClosure() {
-  function IdentityCMap(vertical, n) {
-    CMap.call(this);
-    this.vertical = vertical;
-    this.addCodespaceRange(n, 0, 0xffff);
-  }
-  Util.inherit(IdentityCMap, CMap, {});
-
-  IdentityCMap.prototype = {
-    addCodespaceRange: CMap.prototype.addCodespaceRange,
-
-    mapCidRange: function(low, high, dstLow) {
-      error('should not call mapCidRange');
-    },
-
-    mapBfRange: function(low, high, dstLow) {
-      error('should not call mapBfRange');
-    },
-
-    mapBfRangeToArray: function(low, high, array) {
-      error('should not call mapBfRangeToArray');
-    },
-
-    mapOne: function(src, dst) {
-      error('should not call mapCidOne');
-    },
-
-    lookup: function(code) {
-      return (isInt(code) && code <= 0xffff) ? code : undefined;
-    },
-
-    contains: function(code) {
-      return isInt(code) && code <= 0xffff;
-    },
-
-    forEach: function(callback) {
-      for (var i = 0; i <= 0xffff; i++) {
-        callback(i, i);
-      }
-    },
-
-    charCodeOf: function(value) {
-      return (isInt(value) && value <= 0xffff) ? value : -1;
-    },
-
-    getMap: function() {
-      // Sometimes identity maps must be instantiated, but it's rare.
-      var map = new Array(0x10000);
-      for (var i = 0; i <= 0xffff; i++) {
-        map[i] = i;
-      }
-      return map;
-    },
-
-    readCharCode: CMap.prototype.readCharCode,
-
-    get isIdentityCMap() {
-      error('should not access .isIdentityCMap');
-    }
-  };
-
-  return IdentityCMap;
-})();
-
-var BinaryCMapReader = (function BinaryCMapReaderClosure() {
-  function fetchBinaryData(url) {
-    var nonBinaryRequest = PDFJS.disableWorker;
-    var request = new XMLHttpRequest();
-    request.open('GET', url, false);
-    if (!nonBinaryRequest) {
-      try {
-        request.responseType = 'arraybuffer';
-        nonBinaryRequest = request.responseType !== 'arraybuffer';
-      } catch (e) {
-        nonBinaryRequest = true;
-      }
-    }
-    if (nonBinaryRequest && request.overrideMimeType) {
-      request.overrideMimeType('text/plain; charset=x-user-defined');
-    }
-    request.send(null);
-    if (nonBinaryRequest ? !request.responseText : !request.response) {
-      error('Unable to get binary cMap at: ' + url);
-    }
-    if (nonBinaryRequest) {
-      var data = Array.prototype.map.call(request.responseText, function (ch) {
-        return ch.charCodeAt(0) & 255;
-      });
-      return new Uint8Array(data);
-    }
-    return new Uint8Array(request.response);
-  }
-
-  function hexToInt(a, size) {
-    var n = 0;
-    for (var i = 0; i <= size; i++) {
-      n = (n << 8) | a[i];
-    }
-    return n >>> 0;
-  }
-
-  function hexToStr(a, size) {
-    // This code is hot. Special-case some common values to avoid creating an
-    // object with subarray().
-    if (size === 1) {
-      return String.fromCharCode(a[0], a[1]);
-    }
-    if (size === 3) {
-      return String.fromCharCode(a[0], a[1], a[2], a[3]);
-    }
-    return String.fromCharCode.apply(null, a.subarray(0, size + 1));
-  }
-
-  function addHex(a, b, size) {
-    var c = 0;
-    for (var i = size; i >= 0; i--) {
-      c += a[i] + b[i];
-      a[i] = c & 255;
-      c >>= 8;
-    }
-  }
-
-  function incHex(a, size) {
-    var c = 1;
-    for (var i = size; i >= 0 && c > 0; i--) {
-      c += a[i];
-      a[i] = c & 255;
-      c >>= 8;
-    }
-  }
-
-  var MAX_NUM_SIZE = 16;
-  var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8)
-
-  function BinaryCMapStream(data) {
-    this.buffer = data;
-    this.pos = 0;
-    this.end = data.length;
-    this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);
-  }
-
-  BinaryCMapStream.prototype = {
-    readByte: function () {
-      if (this.pos >= this.end) {
-        return -1;
-      }
-      return this.buffer[this.pos++];
-    },
-    readNumber: function () {
-      var n = 0;
-      var last;
-      do {
-        var b = this.readByte();
-        if (b < 0) {
-          error('unexpected EOF in bcmap');
-        }
-        last = !(b & 0x80);
-        n = (n << 7) | (b & 0x7F);
-      } while (!last);
-      return n;
-    },
-    readSigned: function () {
-      var n = this.readNumber();
-      return (n & 1) ? ~(n >>> 1) : n >>> 1;
-    },
-    readHex: function (num, size) {
-      num.set(this.buffer.subarray(this.pos,
-        this.pos + size + 1));
-      this.pos += size + 1;
-    },
-    readHexNumber: function (num, size) {
-      var last;
-      var stack = this.tmpBuf, sp = 0;
-      do {
-        var b = this.readByte();
-        if (b < 0) {
-          error('unexpected EOF in bcmap');
-        }
-        last = !(b & 0x80);
-        stack[sp++] = b & 0x7F;
-      } while (!last);
-      var i = size, buffer = 0, bufferSize = 0;
-      while (i >= 0) {
-        while (bufferSize < 8 && stack.length > 0) {
-          buffer = (stack[--sp] << bufferSize) | buffer;
-          bufferSize += 7;
-        }
-        num[i] = buffer & 255;
-        i--;
-        buffer >>= 8;
-        bufferSize -= 8;
-      }
-    },
-    readHexSigned: function (num, size) {
-      this.readHexNumber(num, size);
-      var sign = num[size] & 1 ? 255 : 0;
-      var c = 0;
-      for (var i = 0; i <= size; i++) {
-        c = ((c & 1) << 8) | num[i];
-        num[i] = (c >> 1) ^ sign;
-      }
-    },
-    readString: function () {
-      var len = this.readNumber();
-      var s = '';
-      for (var i = 0; i < len; i++) {
-        s += String.fromCharCode(this.readNumber());
-      }
-      return s;
-    }
-  };
-
-  function processBinaryCMap(url, cMap, extend) {
-    var data = fetchBinaryData(url);
-    var stream = new BinaryCMapStream(data);
-
-    var header = stream.readByte();
-    cMap.vertical = !!(header & 1);
-
-    var useCMap = null;
-    var start = new Uint8Array(MAX_NUM_SIZE);
-    var end = new Uint8Array(MAX_NUM_SIZE);
-    var char = new Uint8Array(MAX_NUM_SIZE);
-    var charCode = new Uint8Array(MAX_NUM_SIZE);
-    var tmp = new Uint8Array(MAX_NUM_SIZE);
-    var code;
-
-    var b;
-    while ((b = stream.readByte()) >= 0) {
-      var type = b >> 5;
-      if (type === 7) { // metadata, e.g. comment or usecmap
-        switch (b & 0x1F) {
-          case 0:
-            stream.readString(); // skipping comment
-            break;
-          case 1:
-            useCMap = stream.readString();
-            break;
-        }
-        continue;
-      }
-      var sequence = !!(b & 0x10);
-      var dataSize = b & 15;
-
-      assert(dataSize + 1 <= MAX_NUM_SIZE);
-
-      var ucs2DataSize = 1;
-      var subitemsCount = stream.readNumber();
-      var i;
-      switch (type) {
-        case 0: // codespacerange
-          stream.readHex(start, dataSize);
-          stream.readHexNumber(end, dataSize);
-          addHex(end, start, dataSize);
-          cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),
-                                 hexToInt(end, dataSize));
-          for (i = 1; i < subitemsCount; i++) {
-            incHex(end, dataSize);
-            stream.readHexNumber(start, dataSize);
-            addHex(start, end, dataSize);
-            stream.readHexNumber(end, dataSize);
-            addHex(end, start, dataSize);
-            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),
-                                   hexToInt(end, dataSize));
-          }
-          break;
-        case 1: // notdefrange
-          stream.readHex(start, dataSize);
-          stream.readHexNumber(end, dataSize);
-          addHex(end, start, dataSize);
-          code = stream.readNumber();
-          // undefined range, skipping
-          for (i = 1; i < subitemsCount; i++) {
-            incHex(end, dataSize);
-            stream.readHexNumber(start, dataSize);
-            addHex(start, end, dataSize);
-            stream.readHexNumber(end, dataSize);
-            addHex(end, start, dataSize);
-            code = stream.readNumber();
-            // nop
-          }
-          break;
-        case 2: // cidchar
-          stream.readHex(char, dataSize);
-          code = stream.readNumber();
-          cMap.mapOne(hexToInt(char, dataSize), code);
-          for (i = 1; i < subitemsCount; i++) {
-            incHex(char, dataSize);
-            if (!sequence) {
-              stream.readHexNumber(tmp, dataSize);
-              addHex(char, tmp, dataSize);
-            }
-            code = stream.readSigned() + (code + 1);
-            cMap.mapOne(hexToInt(char, dataSize), code);
-          }
-          break;
-        case 3: // cidrange
-          stream.readHex(start, dataSize);
-          stream.readHexNumber(end, dataSize);
-          addHex(end, start, dataSize);
-          code = stream.readNumber();
-          cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize),
-                           code);
-          for (i = 1; i < subitemsCount; i++) {
-            incHex(end, dataSize);
-            if (!sequence) {
-              stream.readHexNumber(start, dataSize);
-              addHex(start, end, dataSize);
-            } else {
-              start.set(end);
-            }
-            stream.readHexNumber(end, dataSize);
-            addHex(end, start, dataSize);
-            code = stream.readNumber();
-            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize),
-                             code);
-          }
-          break;
-        case 4: // bfchar
-          stream.readHex(char, ucs2DataSize);
-          stream.readHex(charCode, dataSize);
-          cMap.mapOne(hexToInt(char, ucs2DataSize),
-                      hexToStr(charCode, dataSize));
-          for (i = 1; i < subitemsCount; i++) {
-            incHex(char, ucs2DataSize);
-            if (!sequence) {
-              stream.readHexNumber(tmp, ucs2DataSize);
-              addHex(char, tmp, ucs2DataSize);
-            }
-            incHex(charCode, dataSize);
-            stream.readHexSigned(tmp, dataSize);
-            addHex(charCode, tmp, dataSize);
-            cMap.mapOne(hexToInt(char, ucs2DataSize),
-                        hexToStr(charCode, dataSize));
-          }
-          break;
-        case 5: // bfrange
-          stream.readHex(start, ucs2DataSize);
-          stream.readHexNumber(end, ucs2DataSize);
-          addHex(end, start, ucs2DataSize);
-          stream.readHex(charCode, dataSize);
-          cMap.mapBfRange(hexToInt(start, ucs2DataSize),
-                          hexToInt(end, ucs2DataSize),
-                          hexToStr(charCode, dataSize));
-          for (i = 1; i < subitemsCount; i++) {
-            incHex(end, ucs2DataSize);
-            if (!sequence) {
-              stream.readHexNumber(start, ucs2DataSize);
-              addHex(start, end, ucs2DataSize);
-            } else {
-              start.set(end);
-            }
-            stream.readHexNumber(end, ucs2DataSize);
-            addHex(end, start, ucs2DataSize);
-            stream.readHex(charCode, dataSize);
-            cMap.mapBfRange(hexToInt(start, ucs2DataSize),
-                            hexToInt(end, ucs2DataSize),
-                            hexToStr(charCode, dataSize));
-          }
-          break;
-        default:
-          error('Unknown type: ' + type);
-          break;
-      }
-    }
-
-    if (useCMap) {
-      extend(useCMap);
-    }
-    return cMap;
-  }
-
-  function BinaryCMapReader() {}
-
-  BinaryCMapReader.prototype = {
-    read: processBinaryCMap
-  };
-
-  return BinaryCMapReader;
-})();
-
-var CMapFactory = (function CMapFactoryClosure() {
-  function strToInt(str) {
-    var a = 0;
-    for (var i = 0; i < str.length; i++) {
-      a = (a << 8) | str.charCodeAt(i);
-    }
-    return a >>> 0;
-  }
-
-  function expectString(obj) {
-    if (!isString(obj)) {
-      error('Malformed CMap: expected string.');
-    }
-  }
-
-  function expectInt(obj) {
-    if (!isInt(obj)) {
-      error('Malformed CMap: expected int.');
-    }
-  }
-
-  function parseBfChar(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
-      if (isEOF(obj)) {
-        break;
-      }
-      if (isCmd(obj, 'endbfchar')) {
-        return;
-      }
-      expectString(obj);
-      var src = strToInt(obj);
-      obj = lexer.getObj();
-      // TODO are /dstName used?
-      expectString(obj);
-      var dst = obj;
-      cMap.mapOne(src, dst);
-    }
-  }
-
-  function parseBfRange(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
-      if (isEOF(obj)) {
-        break;
-      }
-      if (isCmd(obj, 'endbfrange')) {
-        return;
-      }
-      expectString(obj);
-      var low = strToInt(obj);
-      obj = lexer.getObj();
-      expectString(obj);
-      var high = strToInt(obj);
-      obj = lexer.getObj();
-      if (isInt(obj) || isString(obj)) {
-        var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj;
-        cMap.mapBfRange(low, high, dstLow);
-      } else if (isCmd(obj, '[')) {
-        obj = lexer.getObj();
-        var array = [];
-        while (!isCmd(obj, ']') && !isEOF(obj)) {
-          array.push(obj);
-          obj = lexer.getObj();
-        }
-        cMap.mapBfRangeToArray(low, high, array);
-      } else {
-        break;
-      }
-    }
-    error('Invalid bf range.');
-  }
-
-  function parseCidChar(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
-      if (isEOF(obj)) {
-        break;
-      }
-      if (isCmd(obj, 'endcidchar')) {
-        return;
-      }
-      expectString(obj);
-      var src = strToInt(obj);
-      obj = lexer.getObj();
-      expectInt(obj);
-      var dst = obj;
-      cMap.mapOne(src, dst);
-    }
-  }
-
-  function parseCidRange(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
-      if (isEOF(obj)) {
-        break;
-      }
-      if (isCmd(obj, 'endcidrange')) {
-        return;
-      }
-      expectString(obj);
-      var low = strToInt(obj);
-      obj = lexer.getObj();
-      expectString(obj);
-      var high = strToInt(obj);
-      obj = lexer.getObj();
-      expectInt(obj);
-      var dstLow = obj;
-      cMap.mapCidRange(low, high, dstLow);
-    }
-  }
-
-  function parseCodespaceRange(cMap, lexer) {
-    while (true) {
-      var obj = lexer.getObj();
-      if (isEOF(obj)) {
-        break;
-      }
-      if (isCmd(obj, 'endcodespacerange')) {
-        return;
-      }
-      if (!isString(obj)) {
-        break;
-      }
-      var low = strToInt(obj);
-      obj = lexer.getObj();
-      if (!isString(obj)) {
-        break;
-      }
-      var high = strToInt(obj);
-      cMap.addCodespaceRange(obj.length, low, high);
-    }
-    error('Invalid codespace range.');
-  }
-
-  function parseWMode(cMap, lexer) {
-    var obj = lexer.getObj();
-    if (isInt(obj)) {
-      cMap.vertical = !!obj;
-    }
-  }
-
-  function parseCMapName(cMap, lexer) {
-    var obj = lexer.getObj();
-    if (isName(obj) && isString(obj.name)) {
-      cMap.name = obj.name;
-    }
-  }
-
-  function parseCMap(cMap, lexer, builtInCMapParams, useCMap) {
-    var previous;
-    var embededUseCMap;
-    objLoop: while (true) {
-      var obj = lexer.getObj();
-      if (isEOF(obj)) {
-        break;
-      } else if (isName(obj)) {
-        if (obj.name === 'WMode') {
-          parseWMode(cMap, lexer);
-        } else if (obj.name === 'CMapName') {
-          parseCMapName(cMap, lexer);
-        }
-        previous = obj;
-      } else if (isCmd(obj)) {
-        switch (obj.cmd) {
-          case 'endcmap':
-            break objLoop;
-          case 'usecmap':
-            if (isName(previous)) {
-              embededUseCMap = previous.name;
-            }
-            break;
-          case 'begincodespacerange':
-            parseCodespaceRange(cMap, lexer);
-            break;
-          case 'beginbfchar':
-            parseBfChar(cMap, lexer);
-            break;
-          case 'begincidchar':
-            parseCidChar(cMap, lexer);
-            break;
-          case 'beginbfrange':
-            parseBfRange(cMap, lexer);
-            break;
-          case 'begincidrange':
-            parseCidRange(cMap, lexer);
-            break;
-        }
-      }
-    }
-
-    if (!useCMap && embededUseCMap) {
-      // Load the usecmap definition from the file only if there wasn't one
-      // specified.
-      useCMap = embededUseCMap;
-    }
-    if (useCMap) {
-      extendCMap(cMap, builtInCMapParams, useCMap);
-    }
-  }
-
-  function extendCMap(cMap, builtInCMapParams, useCMap) {
-    cMap.useCMap = createBuiltInCMap(useCMap, builtInCMapParams);
-    // If there aren't any code space ranges defined clone all the parent ones
-    // into this cMap.
-    if (cMap.numCodespaceRanges === 0) {
-      var useCodespaceRanges = cMap.useCMap.codespaceRanges;
-      for (var i = 0; i < useCodespaceRanges.length; i++) {
-        cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();
-      }
-      cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;
-    }
-    // Merge the map into the current one, making sure not to override
-    // any previously defined entries.
-    cMap.useCMap.forEach(function(key, value) {
-      if (!cMap.contains(key)) {
-        cMap.mapOne(key, cMap.useCMap.lookup(key));
-      }
-    });
-  }
-
-  function parseBinaryCMap(name, builtInCMapParams) {
-    var url = builtInCMapParams.url + name + '.bcmap';
-    var cMap = new CMap(true);
-    new BinaryCMapReader().read(url, cMap, function (useCMap) {
-      extendCMap(cMap, builtInCMapParams, useCMap);
-    });
-    return cMap;
-  }
-
-  function createBuiltInCMap(name, builtInCMapParams) {
-    if (name === 'Identity-H') {
-      return new IdentityCMap(false, 2);
-    } else if (name === 'Identity-V') {
-      return new IdentityCMap(true, 2);
-    }
-    if (BUILT_IN_CMAPS.indexOf(name) === -1) {
-      error('Unknown cMap name: ' + name);
-    }
-    assert(builtInCMapParams, 'built-in cMap parameters are not provided');
-
-    if (builtInCMapParams.packed) {
-      return parseBinaryCMap(name, builtInCMapParams);
-    }
-
-    var request = new XMLHttpRequest();
-    var url = builtInCMapParams.url + name;
-    request.open('GET', url, false);
-    request.send(null);
-    if (!request.responseText) {
-      error('Unable to get cMap at: ' + url);
-    }
-    var cMap = new CMap(true);
-    var lexer = new Lexer(new StringStream(request.responseText));
-    parseCMap(cMap, lexer, builtInCMapParams, null);
-    return cMap;
-  }
-
-  return {
-    create: function (encoding, builtInCMapParams, useCMap) {
-      if (isName(encoding)) {
-        return createBuiltInCMap(encoding.name, builtInCMapParams);
-      } else if (isStream(encoding)) {
-        var cMap = new CMap();
-        var lexer = new Lexer(encoding);
-        try {
-          parseCMap(cMap, lexer, builtInCMapParams, useCMap);
-        } catch (e) {
-          warn('Invalid CMap data. ' + e);
-        }
-        if (cMap.isIdentityCMap) {
-          return createBuiltInCMap(cMap.name, builtInCMapParams);
-        }
-        return cMap;
-      }
-      error('Encoding required.');
-    }
-  };
-})();
-
-
-// Unicode Private Use Area
-var PRIVATE_USE_OFFSET_START = 0xE000;
-var PRIVATE_USE_OFFSET_END = 0xF8FF;
-var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false;
-
-// PDF Glyph Space Units are one Thousandth of a TextSpace Unit
-// except for Type 3 fonts
-var PDF_GLYPH_SPACE_UNITS = 1000;
-
-// Hinting is currently disabled due to unknown problems on windows
-// in tracemonkey and various other pdfs with type1 fonts.
-var HINTING_ENABLED = false;
-
-// Accented charactars are not displayed properly on windows, using this flag
-// to control analysis of seac charstrings.
-var SEAC_ANALYSIS_ENABLED = false;
-
-var FontFlags = {
-  FixedPitch: 1,
-  Serif: 2,
-  Symbolic: 4,
-  Script: 8,
-  Nonsymbolic: 32,
-  Italic: 64,
-  AllCap: 65536,
-  SmallCap: 131072,
-  ForceBold: 262144
-};
-
-var Encodings = {
-  ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',
-    'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
-    'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
-    'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
-    'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
-    'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
-    'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',
-    'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',
-    'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
-    'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',
-    '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',
-    'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
-    'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
-    'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
-    'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
-    'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
-    'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
-    '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
-    'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
-    'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
-    'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
-    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
-    'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
-    'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
-    'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
-    'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
-    'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
-    'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
-    'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
-    'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
-    'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
-    'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
-    'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
-    'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
-    'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
-    'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
-    'Ydieresissmall'],
-  MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',
-    'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
-    'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
-    'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',
-    'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',
-    'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',
-    'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',
-    'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',
-    'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
-    'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',
-    'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
-    'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',
-    'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
-    'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
-    'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
-    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
-    'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',
-    'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',
-    'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
-    'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
-    'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
-    'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
-    'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
-    'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
-    'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
-    'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
-    'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
-    'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
-    'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
-    'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
-    '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',
-    'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',
-    'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
-    'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',
-    'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',
-    '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',
-    'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',
-    'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],
-  MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
-    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
-    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
-    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
-    'less', 'equal', 'greater', 'question', 'at', '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', 'bracketleft', 'backslash', 'bracketright',
-    'asciicircum', 'underscore', 'grave', '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', 'braceleft', 'bar', 'braceright', 'asciitilde', '',
-    'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',
-    'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',
-    'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
-    'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',
-    'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',
-    'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',
-    'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',
-    'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',
-    'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',
-    'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',
-    'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',
-    'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',
-    'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE',
-    'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',
-    'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
-    'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
-    'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
-    'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
-    'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
-    'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
-    'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
-    'ogonek', 'caron'],
-  StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
-    'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
-    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
-    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
-    'less', 'equal', 'greater', 'question', 'at', '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', 'bracketleft', 'backslash', 'bracketright',
-    'asciicircum', 'underscore', 'quoteleft', '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', 'braceleft', 'bar', 'braceright', 'asciitilde',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',
-    'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
-    'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
-    'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
-    'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
-    'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
-    'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
-    'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',
-    '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',
-    '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
-    '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
-  WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
-    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
-    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
-    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
-    'less', 'equal', 'greater', 'question', 'at', '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', 'bracketleft', 'backslash', 'bracketright',
-    'asciicircum', 'underscore', 'grave', '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', 'braceleft', 'bar', 'braceright', 'asciitilde',
-    'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',
-    'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
-    'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',
-    'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',
-    'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',
-    'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling',
-    'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',
-    'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',
-    'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',
-    'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
-    'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',
-    'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',
-    'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
-    'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',
-    'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',
-    'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',
-    'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',
-    'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
-    'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
-    'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
-    'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
-    'ydieresis'],
-  SymbolSetEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',
-    'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',
-    'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
-    'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
-    'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',
-    'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',
-    'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',
-    'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',
-    'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',
-    'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',
-    'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',
-    'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',
-    'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',
-    'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',
-    'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',
-    'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',
-    'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',
-    'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',
-    'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',
-    'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',
-    'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',
-    'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',
-    'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',
-    'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',
-    'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',
-    'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',
-    'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',
-    'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',
-    '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
-    'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
-    'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
-    'bracerightbt'],
-  ZapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',
-    'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',
-    'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',
-    'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',
-    'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',
-    'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',
-    'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',
-    'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',
-    'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',
-    'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205',
-    'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103',
-    'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120',
-    'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129',
-    'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138',
-    'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147',
-    'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156',
-    'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165',
-    'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173',
-    'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180',
-    'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185',
-    'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191']
-};
-
-/**
- * Hold a map of decoded fonts and of the standard fourteen Type1
- * fonts and their acronyms.
- */
-var stdFontMap = {
-  'ArialNarrow': 'Helvetica',
-  'ArialNarrow-Bold': 'Helvetica-Bold',
-  'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
-  'ArialNarrow-Italic': 'Helvetica-Oblique',
-  'ArialBlack': 'Helvetica',
-  'ArialBlack-Bold': 'Helvetica-Bold',
-  'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
-  'ArialBlack-Italic': 'Helvetica-Oblique',
-  'Arial': 'Helvetica',
-  'Arial-Bold': 'Helvetica-Bold',
-  'Arial-BoldItalic': 'Helvetica-BoldOblique',
-  'Arial-Italic': 'Helvetica-Oblique',
-  'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
-  'Arial-BoldMT': 'Helvetica-Bold',
-  'Arial-ItalicMT': 'Helvetica-Oblique',
-  'ArialMT': 'Helvetica',
-  'Courier-Bold': 'Courier-Bold',
-  'Courier-BoldItalic': 'Courier-BoldOblique',
-  'Courier-Italic': 'Courier-Oblique',
-  'CourierNew': 'Courier',
-  'CourierNew-Bold': 'Courier-Bold',
-  'CourierNew-BoldItalic': 'Courier-BoldOblique',
-  'CourierNew-Italic': 'Courier-Oblique',
-  'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
-  'CourierNewPS-BoldMT': 'Courier-Bold',
-  'CourierNewPS-ItalicMT': 'Courier-Oblique',
-  'CourierNewPSMT': 'Courier',
-  'Helvetica': 'Helvetica',
-  'Helvetica-Bold': 'Helvetica-Bold',
-  'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
-  'Helvetica-BoldOblique': 'Helvetica-BoldOblique',
-  'Helvetica-Italic': 'Helvetica-Oblique',
-  'Helvetica-Oblique':'Helvetica-Oblique',
-  'Symbol-Bold': 'Symbol',
-  'Symbol-BoldItalic': 'Symbol',
-  'Symbol-Italic': 'Symbol',
-  'TimesNewRoman': 'Times-Roman',
-  'TimesNewRoman-Bold': 'Times-Bold',
-  'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
-  'TimesNewRoman-Italic': 'Times-Italic',
-  'TimesNewRomanPS': 'Times-Roman',
-  'TimesNewRomanPS-Bold': 'Times-Bold',
-  'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
-  'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
-  'TimesNewRomanPS-BoldMT': 'Times-Bold',
-  'TimesNewRomanPS-Italic': 'Times-Italic',
-  'TimesNewRomanPS-ItalicMT': 'Times-Italic',
-  'TimesNewRomanPSMT': 'Times-Roman',
-  'TimesNewRomanPSMT-Bold': 'Times-Bold',
-  'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
-  'TimesNewRomanPSMT-Italic': 'Times-Italic'
-};
-
-/**
- * Holds the map of the non-standard fonts that might be included as a standard
- * fonts without glyph data.
- */
-var nonStdFontMap = {
-  'CenturyGothic': 'Helvetica',
-  'CenturyGothic-Bold': 'Helvetica-Bold',
-  'CenturyGothic-BoldItalic': 'Helvetica-BoldOblique',
-  'CenturyGothic-Italic': 'Helvetica-Oblique',
-  'ComicSansMS': 'Comic Sans MS',
-  'ComicSansMS-Bold': 'Comic Sans MS-Bold',
-  'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',
-  'ComicSansMS-Italic': 'Comic Sans MS-Italic',
-  'LucidaConsole': 'Courier',
-  'LucidaConsole-Bold': 'Courier-Bold',
-  'LucidaConsole-BoldItalic': 'Courier-BoldOblique',
-  'LucidaConsole-Italic': 'Courier-Oblique',
-  'MS-Gothic': 'MS Gothic',
-  'MS-Gothic-Bold': 'MS Gothic-Bold',
-  'MS-Gothic-BoldItalic': 'MS Gothic-BoldItalic',
-  'MS-Gothic-Italic': 'MS Gothic-Italic',
-  'MS-Mincho': 'MS Mincho',
-  'MS-Mincho-Bold': 'MS Mincho-Bold',
-  'MS-Mincho-BoldItalic': 'MS Mincho-BoldItalic',
-  'MS-Mincho-Italic': 'MS Mincho-Italic',
-  'MS-PGothic': 'MS PGothic',
-  'MS-PGothic-Bold': 'MS PGothic-Bold',
-  'MS-PGothic-BoldItalic': 'MS PGothic-BoldItalic',
-  'MS-PGothic-Italic': 'MS PGothic-Italic',
-  'MS-PMincho': 'MS PMincho',
-  'MS-PMincho-Bold': 'MS PMincho-Bold',
-  'MS-PMincho-BoldItalic': 'MS PMincho-BoldItalic',
-  'MS-PMincho-Italic': 'MS PMincho-Italic',
-  'Wingdings': 'ZapfDingbats'
-};
-
-var serifFonts = {
-  'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
-  'Aldus': true, 'Alexandria': true, 'Algerian': true,
-  'American Typewriter': true, 'Antiqua': true, 'Apex': true,
-  'Arno': true, 'Aster': true, 'Aurora': true,
-  'Baskerville': true, 'Bell': true, 'Bembo': true,
-  'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
-  'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
-  'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
-  'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
-  'Calvert': true, 'Capitals': true, 'Cambria': true,
-  'Cartier': true, 'Caslon': true, 'Catull': true,
-  'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
-  'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
-  'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
-  'Cochin': true, 'Colonna': true, 'Computer Modern': true,
-  'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
-  'Corona': true, 'Ecotype': true, 'Egyptienne': true,
-  'Elephant': true, 'Excelsior': true, 'Fairfield': true,
-  'FF Scala': true, 'Folkard': true, 'Footlight': true,
-  'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
-  'Gentium': true, 'Georgia': true, 'Gloucester': true,
-  'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
-  'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
-  'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
-  'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
-  'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
-  'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
-  'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
-  'Lucida Bright': true, 'Melior': true, 'Memphis': true,
-  'Miller': true, 'Minion': true, 'Modern': true,
-  'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
-  'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
-  'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
-  'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
-  'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
-  'Requiem': true, 'Rockwell': true, 'Roman': true,
-  'Rotis Serif': true, 'Sabon': true, 'Scala': true,
-  'Seagull': true, 'Sistina': true, 'Souvenir': true,
-  'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
-  'Sylfaen': true, 'Times': true, 'Trajan': true,
-  'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
-  'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
-  'Versailles': true, 'Wanted': true, 'Weiss': true,
-  'Wide Latin': true, 'Windsor': true, 'XITS': true
-};
-
-var symbolsFonts = {
-  'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true
-};
-
-// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID fonts
-// but does not embed the CID to GID mapping. The mapping is incomplete for all
-// glyphs, but common for some set of the standard fonts.
-var GlyphMapForStandardFonts = {
-  '2': 10, '3': 32, '4': 33, '5': 34, '6': 35, '7': 36, '8': 37, '9': 38,
-  '10': 39, '11': 40, '12': 41, '13': 42, '14': 43, '15': 44, '16': 45,
-  '17': 46, '18': 47, '19': 48, '20': 49, '21': 50, '22': 51, '23': 52,
-  '24': 53, '25': 54, '26': 55, '27': 56, '28': 57, '29': 58, '30': 894,
-  '31': 60, '32': 61, '33': 62, '34': 63, '35': 64, '36': 65, '37': 66,
-  '38': 67, '39': 68, '40': 69, '41': 70, '42': 71, '43': 72, '44': 73,
-  '45': 74, '46': 75, '47': 76, '48': 77, '49': 78, '50': 79, '51': 80,
-  '52': 81, '53': 82, '54': 83, '55': 84, '56': 85, '57': 86, '58': 87,
-  '59': 88, '60': 89, '61': 90, '62': 91, '63': 92, '64': 93, '65': 94,
-  '66': 95, '67': 96, '68': 97, '69': 98, '70': 99, '71': 100, '72': 101,
-  '73': 102, '74': 103, '75': 104, '76': 105, '77': 106, '78': 107, '79': 108,
-  '80': 109, '81': 110, '82': 111, '83': 112, '84': 113, '85': 114, '86': 115,
-  '87': 116, '88': 117, '89': 118, '90': 119, '91': 120, '92': 121, '93': 122,
-  '94': 123, '95': 124, '96': 125, '97': 126, '98': 196, '99': 197, '100': 199,
-  '101': 201, '102': 209, '103': 214, '104': 220, '105': 225, '106': 224,
-  '107': 226, '108': 228, '109': 227, '110': 229, '111': 231, '112': 233,
-  '113': 232, '114': 234, '115': 235, '116': 237, '117': 236, '118': 238,
-  '119': 239, '120': 241, '121': 243, '122': 242, '123': 244, '124': 246,
-  '125': 245, '126': 250, '127': 249, '128': 251, '129': 252, '130': 8224,
-  '131': 176, '132': 162, '133': 163, '134': 167, '135': 8226, '136': 182,
-  '137': 223, '138': 174, '139': 169, '140': 8482, '141': 180, '142': 168,
-  '143': 8800, '144': 198, '145': 216, '146': 8734, '147': 177, '148': 8804,
-  '149': 8805, '150': 165, '151': 181, '152': 8706, '153': 8721, '154': 8719,
-  '156': 8747, '157': 170, '158': 186, '159': 8486, '160': 230, '161': 248,
-  '162': 191, '163': 161, '164': 172, '165': 8730, '166': 402, '167': 8776,
-  '168': 8710, '169': 171, '170': 187, '171': 8230, '210': 218, '223': 711,
-  '224': 321, '225': 322, '227': 353, '229': 382, '234': 253, '252': 263,
-  '253': 268, '254': 269, '258': 258, '260': 260, '261': 261, '265': 280,
-  '266': 281, '268': 283, '269': 313, '275': 323, '276': 324, '278': 328,
-  '284': 345, '285': 346, '286': 347, '292': 367, '295': 377, '296': 378,
-  '298': 380, '305': 963,
-  '306': 964, '307': 966, '308': 8215, '309': 8252, '310': 8319, '311': 8359,
-  '312': 8592, '313': 8593, '337': 9552, '493': 1039, '494': 1040, '705': 1524,
-  '706': 8362, '710': 64288, '711': 64298, '759': 1617, '761': 1776,
-  '763': 1778, '775': 1652, '777': 1764, '778': 1780, '779': 1781, '780': 1782,
-  '782': 771, '783': 64726, '786': 8363, '788': 8532, '790': 768, '791': 769,
-  '792': 768, '795': 803, '797': 64336, '798': 64337, '799': 64342,
-  '800': 64343, '801': 64344, '802': 64345, '803': 64362, '804': 64363,
-  '805': 64364, '2424': 7821, '2425': 7822, '2426': 7823, '2427': 7824,
-  '2428': 7825, '2429': 7826, '2430': 7827, '2433': 7682, '2678': 8045,
-  '2679': 8046, '2830': 1552, '2838': 686, '2840': 751, '2842': 753,
-  '2843': 754, '2844': 755, '2846': 757, '2856': 767, '2857': 848, '2858': 849,
-  '2862': 853, '2863': 854, '2864': 855, '2865': 861, '2866': 862, '2906': 7460,
-  '2908': 7462, '2909': 7463, '2910': 7464, '2912': 7466, '2913': 7467,
-  '2914': 7468, '2916': 7470, '2917': 7471, '2918': 7472, '2920': 7474,
-  '2921': 7475, '2922': 7476, '2924': 7478, '2925': 7479, '2926': 7480,
-  '2928': 7482, '2929': 7483, '2930': 7484, '2932': 7486, '2933': 7487,
-  '2934': 7488, '2936': 7490, '2937': 7491, '2938': 7492, '2940': 7494,
-  '2941': 7495, '2942': 7496, '2944': 7498, '2946': 7500, '2948': 7502,
-  '2950': 7504, '2951': 7505, '2952': 7506, '2954': 7508, '2955': 7509,
-  '2956': 7510, '2958': 7512, '2959': 7513, '2960': 7514, '2962': 7516,
-  '2963': 7517, '2964': 7518, '2966': 7520, '2967': 7521, '2968': 7522,
-  '2970': 7524, '2971': 7525, '2972': 7526, '2974': 7528, '2975': 7529,
-  '2976': 7530, '2978': 1537, '2979': 1538, '2980': 1539, '2982': 1549,
-  '2983': 1551, '2984': 1552, '2986': 1554, '2987': 1555, '2988': 1556,
-  '2990': 1623, '2991': 1624, '2995': 1775, '2999': 1791, '3002': 64290,
-  '3003': 64291, '3004': 64292, '3006': 64294, '3007': 64295, '3008': 64296,
-  '3011': 1900, '3014': 8223, '3015': 8244, '3017': 7532, '3018': 7533,
-  '3019': 7534, '3075': 7590, '3076': 7591, '3079': 7594, '3080': 7595,
-  '3083': 7598, '3084': 7599, '3087': 7602, '3088': 7603, '3091': 7606,
-  '3092': 7607, '3095': 7610, '3096': 7611, '3099': 7614, '3100': 7615,
-  '3103': 7618, '3104': 7619, '3107': 8337, '3108': 8338, '3116': 1884,
-  '3119': 1885, '3120': 1885, '3123': 1886, '3124': 1886, '3127': 1887,
-  '3128': 1887, '3131': 1888, '3132': 1888, '3135': 1889, '3136': 1889,
-  '3139': 1890, '3140': 1890, '3143': 1891, '3144': 1891, '3147': 1892,
-  '3148': 1892, '3153': 580, '3154': 581, '3157': 584, '3158': 585, '3161': 588,
-  '3162': 589, '3165': 891, '3166': 892, '3169': 1274, '3170': 1275,
-  '3173': 1278, '3174': 1279, '3181': 7622, '3182': 7623, '3282': 11799,
-  '3316': 578, '3379': 42785, '3393': 1159, '3416': 8377
-};
-
-// Some characters, e.g. copyrightserif, are mapped to the private use area and
-// might not be displayed using standard fonts. Mapping/hacking well-known chars
-// to the similar equivalents in the normal characters range.
-var SpecialPUASymbols = {
-  '63721': 0x00A9, // copyrightsans (0xF8E9) => copyright
-  '63193': 0x00A9, // copyrightserif (0xF6D9) => copyright
-  '63720': 0x00AE, // registersans (0xF8E8) => registered
-  '63194': 0x00AE, // registerserif (0xF6DA) => registered
-  '63722': 0x2122, // trademarksans (0xF8EA) => trademark
-  '63195': 0x2122, // trademarkserif (0xF6DB) => trademark
-  '63729': 0x23A7, // bracelefttp (0xF8F1)
-  '63730': 0x23A8, // braceleftmid (0xF8F2)
-  '63731': 0x23A9, // braceleftbt (0xF8F3)
-  '63740': 0x23AB, // bracerighttp (0xF8FC)
-  '63741': 0x23AC, // bracerightmid (0xF8FD)
-  '63742': 0x23AD, // bracerightbt (0xF8FE)
-  '63726': 0x23A1, // bracketlefttp (0xF8EE)
-  '63727': 0x23A2, // bracketleftex (0xF8EF)
-  '63728': 0x23A3, // bracketleftbt (0xF8F0)
-  '63737': 0x23A4, // bracketrighttp (0xF8F9)
-  '63738': 0x23A5, // bracketrightex (0xF8FA)
-  '63739': 0x23A6, // bracketrightbt (0xF8FB)
-  '63723': 0x239B, // parenlefttp (0xF8EB)
-  '63724': 0x239C, // parenleftex (0xF8EC)
-  '63725': 0x239D, // parenleftbt (0xF8ED)
-  '63734': 0x239E, // parenrighttp (0xF8F6)
-  '63735': 0x239F, // parenrightex (0xF8F7)
-  '63736': 0x23A0, // parenrightbt (0xF8F8)
-};
-function mapSpecialUnicodeValues(code) {
-  if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block.
-    return 0;
-  } else if (code >= 0xF600 && code <= 0xF8FF) {
-    return (SpecialPUASymbols[code] || code);
-  }
-  return code;
-}
-
-var UnicodeRanges = [
-  { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
-  { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
-  { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
-  { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
-  { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
-  { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
-  { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
-  { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
-  { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
-  { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
-  { 'begin': 0x0530, 'end': 0x058F }, // Armenian
-  { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
-  { 'begin': 0xA500, 'end': 0xA63F }, // Vai
-  { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
-  { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
-  { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
-  { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
-  { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
-  { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
-  { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
-  { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
-  { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
-  { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
-  { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
-  { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
-  { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
-  { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
-  { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
-  { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
-  { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
-  { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
-  { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
-  { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
-  { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
-  { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
-  { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
-  { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
-  { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
-  { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
-  { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
-  { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
-  { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
-  { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
-  { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
-  { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
-  { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
-  { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
-  { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
-  { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
-  { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
-  { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
-  { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
-  { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
-  { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
-  { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
-  { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
-  { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
-  { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
-  { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
-  { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
-  { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
-  { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
-  { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
-  { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
-  { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
-  { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
-  { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
-  { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
-  { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
-  { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
-  { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
-  { 'begin': 0x0700, 'end': 0x074F }, // Syriac
-  { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
-  { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
-  { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
-  { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
-  { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
-  { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
-  { 'begin': 0x1680, 'end': 0x169F }, // Ogham
-  { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
-  { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
-  { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
-  { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
-  { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
-  { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
-  { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
-  { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
-  { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
-  { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
-  { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
-  { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
-  { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
-  { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
-  { 'begin': 0x1900, 'end': 0x194F }, // Limbu
-  { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
-  { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
-  { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
-  { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
-  { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
-  { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
-  { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
-  { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
-  { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
-  { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
-  { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
-  { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
-  { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
-  { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
-  { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
-  { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
-  { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
-  { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
-  { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
-  { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
-  { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
-  { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
-  { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
-  { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
-  { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
-  { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
-  { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
-  { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
-  { 'begin': 0x1F030, 'end': 0x1F09F }  // Domino Tiles
-];
-
-var MacStandardGlyphOrdering = [
-  '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
-  'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
-  'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
-  'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
-  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
-  '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', 'bracketleft',
-  'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', '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', 'braceleft', 'bar', 'braceright',
-  'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
-  'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
-  'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
-  'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
-  'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
-  'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
-  'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
-  'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
-  'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
-  'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
-  'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
-  'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
-  'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
-  'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
-  'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
-  'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
-  'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
-  'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
-  'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
-  'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
-  'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
-  'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
-  'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
-  'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
-  'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
-  'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
-
-function getUnicodeRangeFor(value) {
-  for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
-    var range = UnicodeRanges[i];
-    if (value >= range.begin && value < range.end) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-function isRTLRangeFor(value) {
-  var range = UnicodeRanges[13];
-  if (value >= range.begin && value < range.end) {
-    return true;
-  }
-  range = UnicodeRanges[11];
-  if (value >= range.begin && value < range.end) {
-    return true;
-  }
-  return false;
-}
-
-// The normalization table is obtained by filtering the Unicode characters
-// database with <compat> entries.
-var NormalizedUnicodes = {
-  '\u00A8': '\u0020\u0308',
-  '\u00AF': '\u0020\u0304',
-  '\u00B4': '\u0020\u0301',
-  '\u00B5': '\u03BC',
-  '\u00B8': '\u0020\u0327',
-  '\u0132': '\u0049\u004A',
-  '\u0133': '\u0069\u006A',
-  '\u013F': '\u004C\u00B7',
-  '\u0140': '\u006C\u00B7',
-  '\u0149': '\u02BC\u006E',
-  '\u017F': '\u0073',
-  '\u01C4': '\u0044\u017D',
-  '\u01C5': '\u0044\u017E',
-  '\u01C6': '\u0064\u017E',
-  '\u01C7': '\u004C\u004A',
-  '\u01C8': '\u004C\u006A',
-  '\u01C9': '\u006C\u006A',
-  '\u01CA': '\u004E\u004A',
-  '\u01CB': '\u004E\u006A',
-  '\u01CC': '\u006E\u006A',
-  '\u01F1': '\u0044\u005A',
-  '\u01F2': '\u0044\u007A',
-  '\u01F3': '\u0064\u007A',
-  '\u02D8': '\u0020\u0306',
-  '\u02D9': '\u0020\u0307',
-  '\u02DA': '\u0020\u030A',
-  '\u02DB': '\u0020\u0328',
-  '\u02DC': '\u0020\u0303',
-  '\u02DD': '\u0020\u030B',
-  '\u037A': '\u0020\u0345',
-  '\u0384': '\u0020\u0301',
-  '\u03D0': '\u03B2',
-  '\u03D1': '\u03B8',
-  '\u03D2': '\u03A5',
-  '\u03D5': '\u03C6',
-  '\u03D6': '\u03C0',
-  '\u03F0': '\u03BA',
-  '\u03F1': '\u03C1',
-  '\u03F2': '\u03C2',
-  '\u03F4': '\u0398',
-  '\u03F5': '\u03B5',
-  '\u03F9': '\u03A3',
-  '\u0587': '\u0565\u0582',
-  '\u0675': '\u0627\u0674',
-  '\u0676': '\u0648\u0674',
-  '\u0677': '\u06C7\u0674',
-  '\u0678': '\u064A\u0674',
-  '\u0E33': '\u0E4D\u0E32',
-  '\u0EB3': '\u0ECD\u0EB2',
-  '\u0EDC': '\u0EAB\u0E99',
-  '\u0EDD': '\u0EAB\u0EA1',
-  '\u0F77': '\u0FB2\u0F81',
-  '\u0F79': '\u0FB3\u0F81',
-  '\u1E9A': '\u0061\u02BE',
-  '\u1FBD': '\u0020\u0313',
-  '\u1FBF': '\u0020\u0313',
-  '\u1FC0': '\u0020\u0342',
-  '\u1FFE': '\u0020\u0314',
-  '\u2002': '\u0020',
-  '\u2003': '\u0020',
-  '\u2004': '\u0020',
-  '\u2005': '\u0020',
-  '\u2006': '\u0020',
-  '\u2008': '\u0020',
-  '\u2009': '\u0020',
-  '\u200A': '\u0020',
-  '\u2017': '\u0020\u0333',
-  '\u2024': '\u002E',
-  '\u2025': '\u002E\u002E',
-  '\u2026': '\u002E\u002E\u002E',
-  '\u2033': '\u2032\u2032',
-  '\u2034': '\u2032\u2032\u2032',
-  '\u2036': '\u2035\u2035',
-  '\u2037': '\u2035\u2035\u2035',
-  '\u203C': '\u0021\u0021',
-  '\u203E': '\u0020\u0305',
-  '\u2047': '\u003F\u003F',
-  '\u2048': '\u003F\u0021',
-  '\u2049': '\u0021\u003F',
-  '\u2057': '\u2032\u2032\u2032\u2032',
-  '\u205F': '\u0020',
-  '\u20A8': '\u0052\u0073',
-  '\u2100': '\u0061\u002F\u0063',
-  '\u2101': '\u0061\u002F\u0073',
-  '\u2103': '\u00B0\u0043',
-  '\u2105': '\u0063\u002F\u006F',
-  '\u2106': '\u0063\u002F\u0075',
-  '\u2107': '\u0190',
-  '\u2109': '\u00B0\u0046',
-  '\u2116': '\u004E\u006F',
-  '\u2121': '\u0054\u0045\u004C',
-  '\u2135': '\u05D0',
-  '\u2136': '\u05D1',
-  '\u2137': '\u05D2',
-  '\u2138': '\u05D3',
-  '\u213B': '\u0046\u0041\u0058',
-  '\u2160': '\u0049',
-  '\u2161': '\u0049\u0049',
-  '\u2162': '\u0049\u0049\u0049',
-  '\u2163': '\u0049\u0056',
-  '\u2164': '\u0056',
-  '\u2165': '\u0056\u0049',
-  '\u2166': '\u0056\u0049\u0049',
-  '\u2167': '\u0056\u0049\u0049\u0049',
-  '\u2168': '\u0049\u0058',
-  '\u2169': '\u0058',
-  '\u216A': '\u0058\u0049',
-  '\u216B': '\u0058\u0049\u0049',
-  '\u216C': '\u004C',
-  '\u216D': '\u0043',
-  '\u216E': '\u0044',
-  '\u216F': '\u004D',
-  '\u2170': '\u0069',
-  '\u2171': '\u0069\u0069',
-  '\u2172': '\u0069\u0069\u0069',
-  '\u2173': '\u0069\u0076',
-  '\u2174': '\u0076',
-  '\u2175': '\u0076\u0069',
-  '\u2176': '\u0076\u0069\u0069',
-  '\u2177': '\u0076\u0069\u0069\u0069',
-  '\u2178': '\u0069\u0078',
-  '\u2179': '\u0078',
-  '\u217A': '\u0078\u0069',
-  '\u217B': '\u0078\u0069\u0069',
-  '\u217C': '\u006C',
-  '\u217D': '\u0063',
-  '\u217E': '\u0064',
-  '\u217F': '\u006D',
-  '\u222C': '\u222B\u222B',
-  '\u222D': '\u222B\u222B\u222B',
-  '\u222F': '\u222E\u222E',
-  '\u2230': '\u222E\u222E\u222E',
-  '\u2474': '\u0028\u0031\u0029',
-  '\u2475': '\u0028\u0032\u0029',
-  '\u2476': '\u0028\u0033\u0029',
-  '\u2477': '\u0028\u0034\u0029',
-  '\u2478': '\u0028\u0035\u0029',
-  '\u2479': '\u0028\u0036\u0029',
-  '\u247A': '\u0028\u0037\u0029',
-  '\u247B': '\u0028\u0038\u0029',
-  '\u247C': '\u0028\u0039\u0029',
-  '\u247D': '\u0028\u0031\u0030\u0029',
-  '\u247E': '\u0028\u0031\u0031\u0029',
-  '\u247F': '\u0028\u0031\u0032\u0029',
-  '\u2480': '\u0028\u0031\u0033\u0029',
-  '\u2481': '\u0028\u0031\u0034\u0029',
-  '\u2482': '\u0028\u0031\u0035\u0029',
-  '\u2483': '\u0028\u0031\u0036\u0029',
-  '\u2484': '\u0028\u0031\u0037\u0029',
-  '\u2485': '\u0028\u0031\u0038\u0029',
-  '\u2486': '\u0028\u0031\u0039\u0029',
-  '\u2487': '\u0028\u0032\u0030\u0029',
-  '\u2488': '\u0031\u002E',
-  '\u2489': '\u0032\u002E',
-  '\u248A': '\u0033\u002E',
-  '\u248B': '\u0034\u002E',
-  '\u248C': '\u0035\u002E',
-  '\u248D': '\u0036\u002E',
-  '\u248E': '\u0037\u002E',
-  '\u248F': '\u0038\u002E',
-  '\u2490': '\u0039\u002E',
-  '\u2491': '\u0031\u0030\u002E',
-  '\u2492': '\u0031\u0031\u002E',
-  '\u2493': '\u0031\u0032\u002E',
-  '\u2494': '\u0031\u0033\u002E',
-  '\u2495': '\u0031\u0034\u002E',
-  '\u2496': '\u0031\u0035\u002E',
-  '\u2497': '\u0031\u0036\u002E',
-  '\u2498': '\u0031\u0037\u002E',
-  '\u2499': '\u0031\u0038\u002E',
-  '\u249A': '\u0031\u0039\u002E',
-  '\u249B': '\u0032\u0030\u002E',
-  '\u249C': '\u0028\u0061\u0029',
-  '\u249D': '\u0028\u0062\u0029',
-  '\u249E': '\u0028\u0063\u0029',
-  '\u249F': '\u0028\u0064\u0029',
-  '\u24A0': '\u0028\u0065\u0029',
-  '\u24A1': '\u0028\u0066\u0029',
-  '\u24A2': '\u0028\u0067\u0029',
-  '\u24A3': '\u0028\u0068\u0029',
-  '\u24A4': '\u0028\u0069\u0029',
-  '\u24A5': '\u0028\u006A\u0029',
-  '\u24A6': '\u0028\u006B\u0029',
-  '\u24A7': '\u0028\u006C\u0029',
-  '\u24A8': '\u0028\u006D\u0029',
-  '\u24A9': '\u0028\u006E\u0029',
-  '\u24AA': '\u0028\u006F\u0029',
-  '\u24AB': '\u0028\u0070\u0029',
-  '\u24AC': '\u0028\u0071\u0029',
-  '\u24AD': '\u0028\u0072\u0029',
-  '\u24AE': '\u0028\u0073\u0029',
-  '\u24AF': '\u0028\u0074\u0029',
-  '\u24B0': '\u0028\u0075\u0029',
-  '\u24B1': '\u0028\u0076\u0029',
-  '\u24B2': '\u0028\u0077\u0029',
-  '\u24B3': '\u0028\u0078\u0029',
-  '\u24B4': '\u0028\u0079\u0029',
-  '\u24B5': '\u0028\u007A\u0029',
-  '\u2A0C': '\u222B\u222B\u222B\u222B',
-  '\u2A74': '\u003A\u003A\u003D',
-  '\u2A75': '\u003D\u003D',
-  '\u2A76': '\u003D\u003D\u003D',
-  '\u2E9F': '\u6BCD',
-  '\u2EF3': '\u9F9F',
-  '\u2F00': '\u4E00',
-  '\u2F01': '\u4E28',
-  '\u2F02': '\u4E36',
-  '\u2F03': '\u4E3F',
-  '\u2F04': '\u4E59',
-  '\u2F05': '\u4E85',
-  '\u2F06': '\u4E8C',
-  '\u2F07': '\u4EA0',
-  '\u2F08': '\u4EBA',
-  '\u2F09': '\u513F',
-  '\u2F0A': '\u5165',
-  '\u2F0B': '\u516B',
-  '\u2F0C': '\u5182',
-  '\u2F0D': '\u5196',
-  '\u2F0E': '\u51AB',
-  '\u2F0F': '\u51E0',
-  '\u2F10': '\u51F5',
-  '\u2F11': '\u5200',
-  '\u2F12': '\u529B',
-  '\u2F13': '\u52F9',
-  '\u2F14': '\u5315',
-  '\u2F15': '\u531A',
-  '\u2F16': '\u5338',
-  '\u2F17': '\u5341',
-  '\u2F18': '\u535C',
-  '\u2F19': '\u5369',
-  '\u2F1A': '\u5382',
-  '\u2F1B': '\u53B6',
-  '\u2F1C': '\u53C8',
-  '\u2F1D': '\u53E3',
-  '\u2F1E': '\u56D7',
-  '\u2F1F': '\u571F',
-  '\u2F20': '\u58EB',
-  '\u2F21': '\u5902',
-  '\u2F22': '\u590A',
-  '\u2F23': '\u5915',
-  '\u2F24': '\u5927',
-  '\u2F25': '\u5973',
-  '\u2F26': '\u5B50',
-  '\u2F27': '\u5B80',
-  '\u2F28': '\u5BF8',
-  '\u2F29': '\u5C0F',
-  '\u2F2A': '\u5C22',
-  '\u2F2B': '\u5C38',
-  '\u2F2C': '\u5C6E',
-  '\u2F2D': '\u5C71',
-  '\u2F2E': '\u5DDB',
-  '\u2F2F': '\u5DE5',
-  '\u2F30': '\u5DF1',
-  '\u2F31': '\u5DFE',
-  '\u2F32': '\u5E72',
-  '\u2F33': '\u5E7A',
-  '\u2F34': '\u5E7F',
-  '\u2F35': '\u5EF4',
-  '\u2F36': '\u5EFE',
-  '\u2F37': '\u5F0B',
-  '\u2F38': '\u5F13',
-  '\u2F39': '\u5F50',
-  '\u2F3A': '\u5F61',
-  '\u2F3B': '\u5F73',
-  '\u2F3C': '\u5FC3',
-  '\u2F3D': '\u6208',
-  '\u2F3E': '\u6236',
-  '\u2F3F': '\u624B',
-  '\u2F40': '\u652F',
-  '\u2F41': '\u6534',
-  '\u2F42': '\u6587',
-  '\u2F43': '\u6597',
-  '\u2F44': '\u65A4',
-  '\u2F45': '\u65B9',
-  '\u2F46': '\u65E0',
-  '\u2F47': '\u65E5',
-  '\u2F48': '\u66F0',
-  '\u2F49': '\u6708',
-  '\u2F4A': '\u6728',
-  '\u2F4B': '\u6B20',
-  '\u2F4C': '\u6B62',
-  '\u2F4D': '\u6B79',
-  '\u2F4E': '\u6BB3',
-  '\u2F4F': '\u6BCB',
-  '\u2F50': '\u6BD4',
-  '\u2F51': '\u6BDB',
-  '\u2F52': '\u6C0F',
-  '\u2F53': '\u6C14',
-  '\u2F54': '\u6C34',
-  '\u2F55': '\u706B',
-  '\u2F56': '\u722A',
-  '\u2F57': '\u7236',
-  '\u2F58': '\u723B',
-  '\u2F59': '\u723F',
-  '\u2F5A': '\u7247',
-  '\u2F5B': '\u7259',
-  '\u2F5C': '\u725B',
-  '\u2F5D': '\u72AC',
-  '\u2F5E': '\u7384',
-  '\u2F5F': '\u7389',
-  '\u2F60': '\u74DC',
-  '\u2F61': '\u74E6',
-  '\u2F62': '\u7518',
-  '\u2F63': '\u751F',
-  '\u2F64': '\u7528',
-  '\u2F65': '\u7530',
-  '\u2F66': '\u758B',
-  '\u2F67': '\u7592',
-  '\u2F68': '\u7676',
-  '\u2F69': '\u767D',
-  '\u2F6A': '\u76AE',
-  '\u2F6B': '\u76BF',
-  '\u2F6C': '\u76EE',
-  '\u2F6D': '\u77DB',
-  '\u2F6E': '\u77E2',
-  '\u2F6F': '\u77F3',
-  '\u2F70': '\u793A',
-  '\u2F71': '\u79B8',
-  '\u2F72': '\u79BE',
-  '\u2F73': '\u7A74',
-  '\u2F74': '\u7ACB',
-  '\u2F75': '\u7AF9',
-  '\u2F76': '\u7C73',
-  '\u2F77': '\u7CF8',
-  '\u2F78': '\u7F36',
-  '\u2F79': '\u7F51',
-  '\u2F7A': '\u7F8A',
-  '\u2F7B': '\u7FBD',
-  '\u2F7C': '\u8001',
-  '\u2F7D': '\u800C',
-  '\u2F7E': '\u8012',
-  '\u2F7F': '\u8033',
-  '\u2F80': '\u807F',
-  '\u2F81': '\u8089',
-  '\u2F82': '\u81E3',
-  '\u2F83': '\u81EA',
-  '\u2F84': '\u81F3',
-  '\u2F85': '\u81FC',
-  '\u2F86': '\u820C',
-  '\u2F87': '\u821B',
-  '\u2F88': '\u821F',
-  '\u2F89': '\u826E',
-  '\u2F8A': '\u8272',
-  '\u2F8B': '\u8278',
-  '\u2F8C': '\u864D',
-  '\u2F8D': '\u866B',
-  '\u2F8E': '\u8840',
-  '\u2F8F': '\u884C',
-  '\u2F90': '\u8863',
-  '\u2F91': '\u897E',
-  '\u2F92': '\u898B',
-  '\u2F93': '\u89D2',
-  '\u2F94': '\u8A00',
-  '\u2F95': '\u8C37',
-  '\u2F96': '\u8C46',
-  '\u2F97': '\u8C55',
-  '\u2F98': '\u8C78',
-  '\u2F99': '\u8C9D',
-  '\u2F9A': '\u8D64',
-  '\u2F9B': '\u8D70',
-  '\u2F9C': '\u8DB3',
-  '\u2F9D': '\u8EAB',
-  '\u2F9E': '\u8ECA',
-  '\u2F9F': '\u8F9B',
-  '\u2FA0': '\u8FB0',
-  '\u2FA1': '\u8FB5',
-  '\u2FA2': '\u9091',
-  '\u2FA3': '\u9149',
-  '\u2FA4': '\u91C6',
-  '\u2FA5': '\u91CC',
-  '\u2FA6': '\u91D1',
-  '\u2FA7': '\u9577',
-  '\u2FA8': '\u9580',
-  '\u2FA9': '\u961C',
-  '\u2FAA': '\u96B6',
-  '\u2FAB': '\u96B9',
-  '\u2FAC': '\u96E8',
-  '\u2FAD': '\u9751',
-  '\u2FAE': '\u975E',
-  '\u2FAF': '\u9762',
-  '\u2FB0': '\u9769',
-  '\u2FB1': '\u97CB',
-  '\u2FB2': '\u97ED',
-  '\u2FB3': '\u97F3',
-  '\u2FB4': '\u9801',
-  '\u2FB5': '\u98A8',
-  '\u2FB6': '\u98DB',
-  '\u2FB7': '\u98DF',
-  '\u2FB8': '\u9996',
-  '\u2FB9': '\u9999',
-  '\u2FBA': '\u99AC',
-  '\u2FBB': '\u9AA8',
-  '\u2FBC': '\u9AD8',
-  '\u2FBD': '\u9ADF',
-  '\u2FBE': '\u9B25',
-  '\u2FBF': '\u9B2F',
-  '\u2FC0': '\u9B32',
-  '\u2FC1': '\u9B3C',
-  '\u2FC2': '\u9B5A',
-  '\u2FC3': '\u9CE5',
-  '\u2FC4': '\u9E75',
-  '\u2FC5': '\u9E7F',
-  '\u2FC6': '\u9EA5',
-  '\u2FC7': '\u9EBB',
-  '\u2FC8': '\u9EC3',
-  '\u2FC9': '\u9ECD',
-  '\u2FCA': '\u9ED1',
-  '\u2FCB': '\u9EF9',
-  '\u2FCC': '\u9EFD',
-  '\u2FCD': '\u9F0E',
-  '\u2FCE': '\u9F13',
-  '\u2FCF': '\u9F20',
-  '\u2FD0': '\u9F3B',
-  '\u2FD1': '\u9F4A',
-  '\u2FD2': '\u9F52',
-  '\u2FD3': '\u9F8D',
-  '\u2FD4': '\u9F9C',
-  '\u2FD5': '\u9FA0',
-  '\u3036': '\u3012',
-  '\u3038': '\u5341',
-  '\u3039': '\u5344',
-  '\u303A': '\u5345',
-  '\u309B': '\u0020\u3099',
-  '\u309C': '\u0020\u309A',
-  '\u3131': '\u1100',
-  '\u3132': '\u1101',
-  '\u3133': '\u11AA',
-  '\u3134': '\u1102',
-  '\u3135': '\u11AC',
-  '\u3136': '\u11AD',
-  '\u3137': '\u1103',
-  '\u3138': '\u1104',
-  '\u3139': '\u1105',
-  '\u313A': '\u11B0',
-  '\u313B': '\u11B1',
-  '\u313C': '\u11B2',
-  '\u313D': '\u11B3',
-  '\u313E': '\u11B4',
-  '\u313F': '\u11B5',
-  '\u3140': '\u111A',
-  '\u3141': '\u1106',
-  '\u3142': '\u1107',
-  '\u3143': '\u1108',
-  '\u3144': '\u1121',
-  '\u3145': '\u1109',
-  '\u3146': '\u110A',
-  '\u3147': '\u110B',
-  '\u3148': '\u110C',
-  '\u3149': '\u110D',
-  '\u314A': '\u110E',
-  '\u314B': '\u110F',
-  '\u314C': '\u1110',
-  '\u314D': '\u1111',
-  '\u314E': '\u1112',
-  '\u314F': '\u1161',
-  '\u3150': '\u1162',
-  '\u3151': '\u1163',
-  '\u3152': '\u1164',
-  '\u3153': '\u1165',
-  '\u3154': '\u1166',
-  '\u3155': '\u1167',
-  '\u3156': '\u1168',
-  '\u3157': '\u1169',
-  '\u3158': '\u116A',
-  '\u3159': '\u116B',
-  '\u315A': '\u116C',
-  '\u315B': '\u116D',
-  '\u315C': '\u116E',
-  '\u315D': '\u116F',
-  '\u315E': '\u1170',
-  '\u315F': '\u1171',
-  '\u3160': '\u1172',
-  '\u3161': '\u1173',
-  '\u3162': '\u1174',
-  '\u3163': '\u1175',
-  '\u3164': '\u1160',
-  '\u3165': '\u1114',
-  '\u3166': '\u1115',
-  '\u3167': '\u11C7',
-  '\u3168': '\u11C8',
-  '\u3169': '\u11CC',
-  '\u316A': '\u11CE',
-  '\u316B': '\u11D3',
-  '\u316C': '\u11D7',
-  '\u316D': '\u11D9',
-  '\u316E': '\u111C',
-  '\u316F': '\u11DD',
-  '\u3170': '\u11DF',
-  '\u3171': '\u111D',
-  '\u3172': '\u111E',
-  '\u3173': '\u1120',
-  '\u3174': '\u1122',
-  '\u3175': '\u1123',
-  '\u3176': '\u1127',
-  '\u3177': '\u1129',
-  '\u3178': '\u112B',
-  '\u3179': '\u112C',
-  '\u317A': '\u112D',
-  '\u317B': '\u112E',
-  '\u317C': '\u112F',
-  '\u317D': '\u1132',
-  '\u317E': '\u1136',
-  '\u317F': '\u1140',
-  '\u3180': '\u1147',
-  '\u3181': '\u114C',
-  '\u3182': '\u11F1',
-  '\u3183': '\u11F2',
-  '\u3184': '\u1157',
-  '\u3185': '\u1158',
-  '\u3186': '\u1159',
-  '\u3187': '\u1184',
-  '\u3188': '\u1185',
-  '\u3189': '\u1188',
-  '\u318A': '\u1191',
-  '\u318B': '\u1192',
-  '\u318C': '\u1194',
-  '\u318D': '\u119E',
-  '\u318E': '\u11A1',
-  '\u3200': '\u0028\u1100\u0029',
-  '\u3201': '\u0028\u1102\u0029',
-  '\u3202': '\u0028\u1103\u0029',
-  '\u3203': '\u0028\u1105\u0029',
-  '\u3204': '\u0028\u1106\u0029',
-  '\u3205': '\u0028\u1107\u0029',
-  '\u3206': '\u0028\u1109\u0029',
-  '\u3207': '\u0028\u110B\u0029',
-  '\u3208': '\u0028\u110C\u0029',
-  '\u3209': '\u0028\u110E\u0029',
-  '\u320A': '\u0028\u110F\u0029',
-  '\u320B': '\u0028\u1110\u0029',
-  '\u320C': '\u0028\u1111\u0029',
-  '\u320D': '\u0028\u1112\u0029',
-  '\u320E': '\u0028\u1100\u1161\u0029',
-  '\u320F': '\u0028\u1102\u1161\u0029',
-  '\u3210': '\u0028\u1103\u1161\u0029',
-  '\u3211': '\u0028\u1105\u1161\u0029',
-  '\u3212': '\u0028\u1106\u1161\u0029',
-  '\u3213': '\u0028\u1107\u1161\u0029',
-  '\u3214': '\u0028\u1109\u1161\u0029',
-  '\u3215': '\u0028\u110B\u1161\u0029',
-  '\u3216': '\u0028\u110C\u1161\u0029',
-  '\u3217': '\u0028\u110E\u1161\u0029',
-  '\u3218': '\u0028\u110F\u1161\u0029',
-  '\u3219': '\u0028\u1110\u1161\u0029',
-  '\u321A': '\u0028\u1111\u1161\u0029',
-  '\u321B': '\u0028\u1112\u1161\u0029',
-  '\u321C': '\u0028\u110C\u116E\u0029',
-  '\u321D': '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029',
-  '\u321E': '\u0028\u110B\u1169\u1112\u116E\u0029',
-  '\u3220': '\u0028\u4E00\u0029',
-  '\u3221': '\u0028\u4E8C\u0029',
-  '\u3222': '\u0028\u4E09\u0029',
-  '\u3223': '\u0028\u56DB\u0029',
-  '\u3224': '\u0028\u4E94\u0029',
-  '\u3225': '\u0028\u516D\u0029',
-  '\u3226': '\u0028\u4E03\u0029',
-  '\u3227': '\u0028\u516B\u0029',
-  '\u3228': '\u0028\u4E5D\u0029',
-  '\u3229': '\u0028\u5341\u0029',
-  '\u322A': '\u0028\u6708\u0029',
-  '\u322B': '\u0028\u706B\u0029',
-  '\u322C': '\u0028\u6C34\u0029',
-  '\u322D': '\u0028\u6728\u0029',
-  '\u322E': '\u0028\u91D1\u0029',
-  '\u322F': '\u0028\u571F\u0029',
-  '\u3230': '\u0028\u65E5\u0029',
-  '\u3231': '\u0028\u682A\u0029',
-  '\u3232': '\u0028\u6709\u0029',
-  '\u3233': '\u0028\u793E\u0029',
-  '\u3234': '\u0028\u540D\u0029',
-  '\u3235': '\u0028\u7279\u0029',
-  '\u3236': '\u0028\u8CA1\u0029',
-  '\u3237': '\u0028\u795D\u0029',
-  '\u3238': '\u0028\u52B4\u0029',
-  '\u3239': '\u0028\u4EE3\u0029',
-  '\u323A': '\u0028\u547C\u0029',
-  '\u323B': '\u0028\u5B66\u0029',
-  '\u323C': '\u0028\u76E3\u0029',
-  '\u323D': '\u0028\u4F01\u0029',
-  '\u323E': '\u0028\u8CC7\u0029',
-  '\u323F': '\u0028\u5354\u0029',
-  '\u3240': '\u0028\u796D\u0029',
-  '\u3241': '\u0028\u4F11\u0029',
-  '\u3242': '\u0028\u81EA\u0029',
-  '\u3243': '\u0028\u81F3\u0029',
-  '\u32C0': '\u0031\u6708',
-  '\u32C1': '\u0032\u6708',
-  '\u32C2': '\u0033\u6708',
-  '\u32C3': '\u0034\u6708',
-  '\u32C4': '\u0035\u6708',
-  '\u32C5': '\u0036\u6708',
-  '\u32C6': '\u0037\u6708',
-  '\u32C7': '\u0038\u6708',
-  '\u32C8': '\u0039\u6708',
-  '\u32C9': '\u0031\u0030\u6708',
-  '\u32CA': '\u0031\u0031\u6708',
-  '\u32CB': '\u0031\u0032\u6708',
-  '\u3358': '\u0030\u70B9',
-  '\u3359': '\u0031\u70B9',
-  '\u335A': '\u0032\u70B9',
-  '\u335B': '\u0033\u70B9',
-  '\u335C': '\u0034\u70B9',
-  '\u335D': '\u0035\u70B9',
-  '\u335E': '\u0036\u70B9',
-  '\u335F': '\u0037\u70B9',
-  '\u3360': '\u0038\u70B9',
-  '\u3361': '\u0039\u70B9',
-  '\u3362': '\u0031\u0030\u70B9',
-  '\u3363': '\u0031\u0031\u70B9',
-  '\u3364': '\u0031\u0032\u70B9',
-  '\u3365': '\u0031\u0033\u70B9',
-  '\u3366': '\u0031\u0034\u70B9',
-  '\u3367': '\u0031\u0035\u70B9',
-  '\u3368': '\u0031\u0036\u70B9',
-  '\u3369': '\u0031\u0037\u70B9',
-  '\u336A': '\u0031\u0038\u70B9',
-  '\u336B': '\u0031\u0039\u70B9',
-  '\u336C': '\u0032\u0030\u70B9',
-  '\u336D': '\u0032\u0031\u70B9',
-  '\u336E': '\u0032\u0032\u70B9',
-  '\u336F': '\u0032\u0033\u70B9',
-  '\u3370': '\u0032\u0034\u70B9',
-  '\u33E0': '\u0031\u65E5',
-  '\u33E1': '\u0032\u65E5',
-  '\u33E2': '\u0033\u65E5',
-  '\u33E3': '\u0034\u65E5',
-  '\u33E4': '\u0035\u65E5',
-  '\u33E5': '\u0036\u65E5',
-  '\u33E6': '\u0037\u65E5',
-  '\u33E7': '\u0038\u65E5',
-  '\u33E8': '\u0039\u65E5',
-  '\u33E9': '\u0031\u0030\u65E5',
-  '\u33EA': '\u0031\u0031\u65E5',
-  '\u33EB': '\u0031\u0032\u65E5',
-  '\u33EC': '\u0031\u0033\u65E5',
-  '\u33ED': '\u0031\u0034\u65E5',
-  '\u33EE': '\u0031\u0035\u65E5',
-  '\u33EF': '\u0031\u0036\u65E5',
-  '\u33F0': '\u0031\u0037\u65E5',
-  '\u33F1': '\u0031\u0038\u65E5',
-  '\u33F2': '\u0031\u0039\u65E5',
-  '\u33F3': '\u0032\u0030\u65E5',
-  '\u33F4': '\u0032\u0031\u65E5',
-  '\u33F5': '\u0032\u0032\u65E5',
-  '\u33F6': '\u0032\u0033\u65E5',
-  '\u33F7': '\u0032\u0034\u65E5',
-  '\u33F8': '\u0032\u0035\u65E5',
-  '\u33F9': '\u0032\u0036\u65E5',
-  '\u33FA': '\u0032\u0037\u65E5',
-  '\u33FB': '\u0032\u0038\u65E5',
-  '\u33FC': '\u0032\u0039\u65E5',
-  '\u33FD': '\u0033\u0030\u65E5',
-  '\u33FE': '\u0033\u0031\u65E5',
-  '\uFB00': '\u0066\u0066',
-  '\uFB01': '\u0066\u0069',
-  '\uFB02': '\u0066\u006C',
-  '\uFB03': '\u0066\u0066\u0069',
-  '\uFB04': '\u0066\u0066\u006C',
-  '\uFB05': '\u017F\u0074',
-  '\uFB06': '\u0073\u0074',
-  '\uFB13': '\u0574\u0576',
-  '\uFB14': '\u0574\u0565',
-  '\uFB15': '\u0574\u056B',
-  '\uFB16': '\u057E\u0576',
-  '\uFB17': '\u0574\u056D',
-  '\uFB4F': '\u05D0\u05DC',
-  '\uFB50': '\u0671',
-  '\uFB51': '\u0671',
-  '\uFB52': '\u067B',
-  '\uFB53': '\u067B',
-  '\uFB54': '\u067B',
-  '\uFB55': '\u067B',
-  '\uFB56': '\u067E',
-  '\uFB57': '\u067E',
-  '\uFB58': '\u067E',
-  '\uFB59': '\u067E',
-  '\uFB5A': '\u0680',
-  '\uFB5B': '\u0680',
-  '\uFB5C': '\u0680',
-  '\uFB5D': '\u0680',
-  '\uFB5E': '\u067A',
-  '\uFB5F': '\u067A',
-  '\uFB60': '\u067A',
-  '\uFB61': '\u067A',
-  '\uFB62': '\u067F',
-  '\uFB63': '\u067F',
-  '\uFB64': '\u067F',
-  '\uFB65': '\u067F',
-  '\uFB66': '\u0679',
-  '\uFB67': '\u0679',
-  '\uFB68': '\u0679',
-  '\uFB69': '\u0679',
-  '\uFB6A': '\u06A4',
-  '\uFB6B': '\u06A4',
-  '\uFB6C': '\u06A4',
-  '\uFB6D': '\u06A4',
-  '\uFB6E': '\u06A6',
-  '\uFB6F': '\u06A6',
-  '\uFB70': '\u06A6',
-  '\uFB71': '\u06A6',
-  '\uFB72': '\u0684',
-  '\uFB73': '\u0684',
-  '\uFB74': '\u0684',
-  '\uFB75': '\u0684',
-  '\uFB76': '\u0683',
-  '\uFB77': '\u0683',
-  '\uFB78': '\u0683',
-  '\uFB79': '\u0683',
-  '\uFB7A': '\u0686',
-  '\uFB7B': '\u0686',
-  '\uFB7C': '\u0686',
-  '\uFB7D': '\u0686',
-  '\uFB7E': '\u0687',
-  '\uFB7F': '\u0687',
-  '\uFB80': '\u0687',
-  '\uFB81': '\u0687',
-  '\uFB82': '\u068D',
-  '\uFB83': '\u068D',
-  '\uFB84': '\u068C',
-  '\uFB85': '\u068C',
-  '\uFB86': '\u068E',
-  '\uFB87': '\u068E',
-  '\uFB88': '\u0688',
-  '\uFB89': '\u0688',
-  '\uFB8A': '\u0698',
-  '\uFB8B': '\u0698',
-  '\uFB8C': '\u0691',
-  '\uFB8D': '\u0691',
-  '\uFB8E': '\u06A9',
-  '\uFB8F': '\u06A9',
-  '\uFB90': '\u06A9',
-  '\uFB91': '\u06A9',
-  '\uFB92': '\u06AF',
-  '\uFB93': '\u06AF',
-  '\uFB94': '\u06AF',
-  '\uFB95': '\u06AF',
-  '\uFB96': '\u06B3',
-  '\uFB97': '\u06B3',
-  '\uFB98': '\u06B3',
-  '\uFB99': '\u06B3',
-  '\uFB9A': '\u06B1',
-  '\uFB9B': '\u06B1',
-  '\uFB9C': '\u06B1',
-  '\uFB9D': '\u06B1',
-  '\uFB9E': '\u06BA',
-  '\uFB9F': '\u06BA',
-  '\uFBA0': '\u06BB',
-  '\uFBA1': '\u06BB',
-  '\uFBA2': '\u06BB',
-  '\uFBA3': '\u06BB',
-  '\uFBA4': '\u06C0',
-  '\uFBA5': '\u06C0',
-  '\uFBA6': '\u06C1',
-  '\uFBA7': '\u06C1',
-  '\uFBA8': '\u06C1',
-  '\uFBA9': '\u06C1',
-  '\uFBAA': '\u06BE',
-  '\uFBAB': '\u06BE',
-  '\uFBAC': '\u06BE',
-  '\uFBAD': '\u06BE',
-  '\uFBAE': '\u06D2',
-  '\uFBAF': '\u06D2',
-  '\uFBB0': '\u06D3',
-  '\uFBB1': '\u06D3',
-  '\uFBD3': '\u06AD',
-  '\uFBD4': '\u06AD',
-  '\uFBD5': '\u06AD',
-  '\uFBD6': '\u06AD',
-  '\uFBD7': '\u06C7',
-  '\uFBD8': '\u06C7',
-  '\uFBD9': '\u06C6',
-  '\uFBDA': '\u06C6',
-  '\uFBDB': '\u06C8',
-  '\uFBDC': '\u06C8',
-  '\uFBDD': '\u0677',
-  '\uFBDE': '\u06CB',
-  '\uFBDF': '\u06CB',
-  '\uFBE0': '\u06C5',
-  '\uFBE1': '\u06C5',
-  '\uFBE2': '\u06C9',
-  '\uFBE3': '\u06C9',
-  '\uFBE4': '\u06D0',
-  '\uFBE5': '\u06D0',
-  '\uFBE6': '\u06D0',
-  '\uFBE7': '\u06D0',
-  '\uFBE8': '\u0649',
-  '\uFBE9': '\u0649',
-  '\uFBEA': '\u0626\u0627',
-  '\uFBEB': '\u0626\u0627',
-  '\uFBEC': '\u0626\u06D5',
-  '\uFBED': '\u0626\u06D5',
-  '\uFBEE': '\u0626\u0648',
-  '\uFBEF': '\u0626\u0648',
-  '\uFBF0': '\u0626\u06C7',
-  '\uFBF1': '\u0626\u06C7',
-  '\uFBF2': '\u0626\u06C6',
-  '\uFBF3': '\u0626\u06C6',
-  '\uFBF4': '\u0626\u06C8',
-  '\uFBF5': '\u0626\u06C8',
-  '\uFBF6': '\u0626\u06D0',
-  '\uFBF7': '\u0626\u06D0',
-  '\uFBF8': '\u0626\u06D0',
-  '\uFBF9': '\u0626\u0649',
-  '\uFBFA': '\u0626\u0649',
-  '\uFBFB': '\u0626\u0649',
-  '\uFBFC': '\u06CC',
-  '\uFBFD': '\u06CC',
-  '\uFBFE': '\u06CC',
-  '\uFBFF': '\u06CC',
-  '\uFC00': '\u0626\u062C',
-  '\uFC01': '\u0626\u062D',
-  '\uFC02': '\u0626\u0645',
-  '\uFC03': '\u0626\u0649',
-  '\uFC04': '\u0626\u064A',
-  '\uFC05': '\u0628\u062C',
-  '\uFC06': '\u0628\u062D',
-  '\uFC07': '\u0628\u062E',
-  '\uFC08': '\u0628\u0645',
-  '\uFC09': '\u0628\u0649',
-  '\uFC0A': '\u0628\u064A',
-  '\uFC0B': '\u062A\u062C',
-  '\uFC0C': '\u062A\u062D',
-  '\uFC0D': '\u062A\u062E',
-  '\uFC0E': '\u062A\u0645',
-  '\uFC0F': '\u062A\u0649',
-  '\uFC10': '\u062A\u064A',
-  '\uFC11': '\u062B\u062C',
-  '\uFC12': '\u062B\u0645',
-  '\uFC13': '\u062B\u0649',
-  '\uFC14': '\u062B\u064A',
-  '\uFC15': '\u062C\u062D',
-  '\uFC16': '\u062C\u0645',
-  '\uFC17': '\u062D\u062C',
-  '\uFC18': '\u062D\u0645',
-  '\uFC19': '\u062E\u062C',
-  '\uFC1A': '\u062E\u062D',
-  '\uFC1B': '\u062E\u0645',
-  '\uFC1C': '\u0633\u062C',
-  '\uFC1D': '\u0633\u062D',
-  '\uFC1E': '\u0633\u062E',
-  '\uFC1F': '\u0633\u0645',
-  '\uFC20': '\u0635\u062D',
-  '\uFC21': '\u0635\u0645',
-  '\uFC22': '\u0636\u062C',
-  '\uFC23': '\u0636\u062D',
-  '\uFC24': '\u0636\u062E',
-  '\uFC25': '\u0636\u0645',
-  '\uFC26': '\u0637\u062D',
-  '\uFC27': '\u0637\u0645',
-  '\uFC28': '\u0638\u0645',
-  '\uFC29': '\u0639\u062C',
-  '\uFC2A': '\u0639\u0645',
-  '\uFC2B': '\u063A\u062C',
-  '\uFC2C': '\u063A\u0645',
-  '\uFC2D': '\u0641\u062C',
-  '\uFC2E': '\u0641\u062D',
-  '\uFC2F': '\u0641\u062E',
-  '\uFC30': '\u0641\u0645',
-  '\uFC31': '\u0641\u0649',
-  '\uFC32': '\u0641\u064A',
-  '\uFC33': '\u0642\u062D',
-  '\uFC34': '\u0642\u0645',
-  '\uFC35': '\u0642\u0649',
-  '\uFC36': '\u0642\u064A',
-  '\uFC37': '\u0643\u0627',
-  '\uFC38': '\u0643\u062C',
-  '\uFC39': '\u0643\u062D',
-  '\uFC3A': '\u0643\u062E',
-  '\uFC3B': '\u0643\u0644',
-  '\uFC3C': '\u0643\u0645',
-  '\uFC3D': '\u0643\u0649',
-  '\uFC3E': '\u0643\u064A',
-  '\uFC3F': '\u0644\u062C',
-  '\uFC40': '\u0644\u062D',
-  '\uFC41': '\u0644\u062E',
-  '\uFC42': '\u0644\u0645',
-  '\uFC43': '\u0644\u0649',
-  '\uFC44': '\u0644\u064A',
-  '\uFC45': '\u0645\u062C',
-  '\uFC46': '\u0645\u062D',
-  '\uFC47': '\u0645\u062E',
-  '\uFC48': '\u0645\u0645',
-  '\uFC49': '\u0645\u0649',
-  '\uFC4A': '\u0645\u064A',
-  '\uFC4B': '\u0646\u062C',
-  '\uFC4C': '\u0646\u062D',
-  '\uFC4D': '\u0646\u062E',
-  '\uFC4E': '\u0646\u0645',
-  '\uFC4F': '\u0646\u0649',
-  '\uFC50': '\u0646\u064A',
-  '\uFC51': '\u0647\u062C',
-  '\uFC52': '\u0647\u0645',
-  '\uFC53': '\u0647\u0649',
-  '\uFC54': '\u0647\u064A',
-  '\uFC55': '\u064A\u062C',
-  '\uFC56': '\u064A\u062D',
-  '\uFC57': '\u064A\u062E',
-  '\uFC58': '\u064A\u0645',
-  '\uFC59': '\u064A\u0649',
-  '\uFC5A': '\u064A\u064A',
-  '\uFC5B': '\u0630\u0670',
-  '\uFC5C': '\u0631\u0670',
-  '\uFC5D': '\u0649\u0670',
-  '\uFC5E': '\u0020\u064C\u0651',
-  '\uFC5F': '\u0020\u064D\u0651',
-  '\uFC60': '\u0020\u064E\u0651',
-  '\uFC61': '\u0020\u064F\u0651',
-  '\uFC62': '\u0020\u0650\u0651',
-  '\uFC63': '\u0020\u0651\u0670',
-  '\uFC64': '\u0626\u0631',
-  '\uFC65': '\u0626\u0632',
-  '\uFC66': '\u0626\u0645',
-  '\uFC67': '\u0626\u0646',
-  '\uFC68': '\u0626\u0649',
-  '\uFC69': '\u0626\u064A',
-  '\uFC6A': '\u0628\u0631',
-  '\uFC6B': '\u0628\u0632',
-  '\uFC6C': '\u0628\u0645',
-  '\uFC6D': '\u0628\u0646',
-  '\uFC6E': '\u0628\u0649',
-  '\uFC6F': '\u0628\u064A',
-  '\uFC70': '\u062A\u0631',
-  '\uFC71': '\u062A\u0632',
-  '\uFC72': '\u062A\u0645',
-  '\uFC73': '\u062A\u0646',
-  '\uFC74': '\u062A\u0649',
-  '\uFC75': '\u062A\u064A',
-  '\uFC76': '\u062B\u0631',
-  '\uFC77': '\u062B\u0632',
-  '\uFC78': '\u062B\u0645',
-  '\uFC79': '\u062B\u0646',
-  '\uFC7A': '\u062B\u0649',
-  '\uFC7B': '\u062B\u064A',
-  '\uFC7C': '\u0641\u0649',
-  '\uFC7D': '\u0641\u064A',
-  '\uFC7E': '\u0642\u0649',
-  '\uFC7F': '\u0642\u064A',
-  '\uFC80': '\u0643\u0627',
-  '\uFC81': '\u0643\u0644',
-  '\uFC82': '\u0643\u0645',
-  '\uFC83': '\u0643\u0649',
-  '\uFC84': '\u0643\u064A',
-  '\uFC85': '\u0644\u0645',
-  '\uFC86': '\u0644\u0649',
-  '\uFC87': '\u0644\u064A',
-  '\uFC88': '\u0645\u0627',
-  '\uFC89': '\u0645\u0645',
-  '\uFC8A': '\u0646\u0631',
-  '\uFC8B': '\u0646\u0632',
-  '\uFC8C': '\u0646\u0645',
-  '\uFC8D': '\u0646\u0646',
-  '\uFC8E': '\u0646\u0649',
-  '\uFC8F': '\u0646\u064A',
-  '\uFC90': '\u0649\u0670',
-  '\uFC91': '\u064A\u0631',
-  '\uFC92': '\u064A\u0632',
-  '\uFC93': '\u064A\u0645',
-  '\uFC94': '\u064A\u0646',
-  '\uFC95': '\u064A\u0649',
-  '\uFC96': '\u064A\u064A',
-  '\uFC97': '\u0626\u062C',
-  '\uFC98': '\u0626\u062D',
-  '\uFC99': '\u0626\u062E',
-  '\uFC9A': '\u0626\u0645',
-  '\uFC9B': '\u0626\u0647',
-  '\uFC9C': '\u0628\u062C',
-  '\uFC9D': '\u0628\u062D',
-  '\uFC9E': '\u0628\u062E',
-  '\uFC9F': '\u0628\u0645',
-  '\uFCA0': '\u0628\u0647',
-  '\uFCA1': '\u062A\u062C',
-  '\uFCA2': '\u062A\u062D',
-  '\uFCA3': '\u062A\u062E',
-  '\uFCA4': '\u062A\u0645',
-  '\uFCA5': '\u062A\u0647',
-  '\uFCA6': '\u062B\u0645',
-  '\uFCA7': '\u062C\u062D',
-  '\uFCA8': '\u062C\u0645',
-  '\uFCA9': '\u062D\u062C',
-  '\uFCAA': '\u062D\u0645',
-  '\uFCAB': '\u062E\u062C',
-  '\uFCAC': '\u062E\u0645',
-  '\uFCAD': '\u0633\u062C',
-  '\uFCAE': '\u0633\u062D',
-  '\uFCAF': '\u0633\u062E',
-  '\uFCB0': '\u0633\u0645',
-  '\uFCB1': '\u0635\u062D',
-  '\uFCB2': '\u0635\u062E',
-  '\uFCB3': '\u0635\u0645',
-  '\uFCB4': '\u0636\u062C',
-  '\uFCB5': '\u0636\u062D',
-  '\uFCB6': '\u0636\u062E',
-  '\uFCB7': '\u0636\u0645',
-  '\uFCB8': '\u0637\u062D',
-  '\uFCB9': '\u0638\u0645',
-  '\uFCBA': '\u0639\u062C',
-  '\uFCBB': '\u0639\u0645',
-  '\uFCBC': '\u063A\u062C',
-  '\uFCBD': '\u063A\u0645',
-  '\uFCBE': '\u0641\u062C',
-  '\uFCBF': '\u0641\u062D',
-  '\uFCC0': '\u0641\u062E',
-  '\uFCC1': '\u0641\u0645',
-  '\uFCC2': '\u0642\u062D',
-  '\uFCC3': '\u0642\u0645',
-  '\uFCC4': '\u0643\u062C',
-  '\uFCC5': '\u0643\u062D',
-  '\uFCC6': '\u0643\u062E',
-  '\uFCC7': '\u0643\u0644',
-  '\uFCC8': '\u0643\u0645',
-  '\uFCC9': '\u0644\u062C',
-  '\uFCCA': '\u0644\u062D',
-  '\uFCCB': '\u0644\u062E',
-  '\uFCCC': '\u0644\u0645',
-  '\uFCCD': '\u0644\u0647',
-  '\uFCCE': '\u0645\u062C',
-  '\uFCCF': '\u0645\u062D',
-  '\uFCD0': '\u0645\u062E',
-  '\uFCD1': '\u0645\u0645',
-  '\uFCD2': '\u0646\u062C',
-  '\uFCD3': '\u0646\u062D',
-  '\uFCD4': '\u0646\u062E',
-  '\uFCD5': '\u0646\u0645',
-  '\uFCD6': '\u0646\u0647',
-  '\uFCD7': '\u0647\u062C',
-  '\uFCD8': '\u0647\u0645',
-  '\uFCD9': '\u0647\u0670',
-  '\uFCDA': '\u064A\u062C',
-  '\uFCDB': '\u064A\u062D',
-  '\uFCDC': '\u064A\u062E',
-  '\uFCDD': '\u064A\u0645',
-  '\uFCDE': '\u064A\u0647',
-  '\uFCDF': '\u0626\u0645',
-  '\uFCE0': '\u0626\u0647',
-  '\uFCE1': '\u0628\u0645',
-  '\uFCE2': '\u0628\u0647',
-  '\uFCE3': '\u062A\u0645',
-  '\uFCE4': '\u062A\u0647',
-  '\uFCE5': '\u062B\u0645',
-  '\uFCE6': '\u062B\u0647',
-  '\uFCE7': '\u0633\u0645',
-  '\uFCE8': '\u0633\u0647',
-  '\uFCE9': '\u0634\u0645',
-  '\uFCEA': '\u0634\u0647',
-  '\uFCEB': '\u0643\u0644',
-  '\uFCEC': '\u0643\u0645',
-  '\uFCED': '\u0644\u0645',
-  '\uFCEE': '\u0646\u0645',
-  '\uFCEF': '\u0646\u0647',
-  '\uFCF0': '\u064A\u0645',
-  '\uFCF1': '\u064A\u0647',
-  '\uFCF2': '\u0640\u064E\u0651',
-  '\uFCF3': '\u0640\u064F\u0651',
-  '\uFCF4': '\u0640\u0650\u0651',
-  '\uFCF5': '\u0637\u0649',
-  '\uFCF6': '\u0637\u064A',
-  '\uFCF7': '\u0639\u0649',
-  '\uFCF8': '\u0639\u064A',
-  '\uFCF9': '\u063A\u0649',
-  '\uFCFA': '\u063A\u064A',
-  '\uFCFB': '\u0633\u0649',
-  '\uFCFC': '\u0633\u064A',
-  '\uFCFD': '\u0634\u0649',
-  '\uFCFE': '\u0634\u064A',
-  '\uFCFF': '\u062D\u0649',
-  '\uFD00': '\u062D\u064A',
-  '\uFD01': '\u062C\u0649',
-  '\uFD02': '\u062C\u064A',
-  '\uFD03': '\u062E\u0649',
-  '\uFD04': '\u062E\u064A',
-  '\uFD05': '\u0635\u0649',
-  '\uFD06': '\u0635\u064A',
-  '\uFD07': '\u0636\u0649',
-  '\uFD08': '\u0636\u064A',
-  '\uFD09': '\u0634\u062C',
-  '\uFD0A': '\u0634\u062D',
-  '\uFD0B': '\u0634\u062E',
-  '\uFD0C': '\u0634\u0645',
-  '\uFD0D': '\u0634\u0631',
-  '\uFD0E': '\u0633\u0631',
-  '\uFD0F': '\u0635\u0631',
-  '\uFD10': '\u0636\u0631',
-  '\uFD11': '\u0637\u0649',
-  '\uFD12': '\u0637\u064A',
-  '\uFD13': '\u0639\u0649',
-  '\uFD14': '\u0639\u064A',
-  '\uFD15': '\u063A\u0649',
-  '\uFD16': '\u063A\u064A',
-  '\uFD17': '\u0633\u0649',
-  '\uFD18': '\u0633\u064A',
-  '\uFD19': '\u0634\u0649',
-  '\uFD1A': '\u0634\u064A',
-  '\uFD1B': '\u062D\u0649',
-  '\uFD1C': '\u062D\u064A',
-  '\uFD1D': '\u062C\u0649',
-  '\uFD1E': '\u062C\u064A',
-  '\uFD1F': '\u062E\u0649',
-  '\uFD20': '\u062E\u064A',
-  '\uFD21': '\u0635\u0649',
-  '\uFD22': '\u0635\u064A',
-  '\uFD23': '\u0636\u0649',
-  '\uFD24': '\u0636\u064A',
-  '\uFD25': '\u0634\u062C',
-  '\uFD26': '\u0634\u062D',
-  '\uFD27': '\u0634\u062E',
-  '\uFD28': '\u0634\u0645',
-  '\uFD29': '\u0634\u0631',
-  '\uFD2A': '\u0633\u0631',
-  '\uFD2B': '\u0635\u0631',
-  '\uFD2C': '\u0636\u0631',
-  '\uFD2D': '\u0634\u062C',
-  '\uFD2E': '\u0634\u062D',
-  '\uFD2F': '\u0634\u062E',
-  '\uFD30': '\u0634\u0645',
-  '\uFD31': '\u0633\u0647',
-  '\uFD32': '\u0634\u0647',
-  '\uFD33': '\u0637\u0645',
-  '\uFD34': '\u0633\u062C',
-  '\uFD35': '\u0633\u062D',
-  '\uFD36': '\u0633\u062E',
-  '\uFD37': '\u0634\u062C',
-  '\uFD38': '\u0634\u062D',
-  '\uFD39': '\u0634\u062E',
-  '\uFD3A': '\u0637\u0645',
-  '\uFD3B': '\u0638\u0645',
-  '\uFD3C': '\u0627\u064B',
-  '\uFD3D': '\u0627\u064B',
-  '\uFD50': '\u062A\u062C\u0645',
-  '\uFD51': '\u062A\u062D\u062C',
-  '\uFD52': '\u062A\u062D\u062C',
-  '\uFD53': '\u062A\u062D\u0645',
-  '\uFD54': '\u062A\u062E\u0645',
-  '\uFD55': '\u062A\u0645\u062C',
-  '\uFD56': '\u062A\u0645\u062D',
-  '\uFD57': '\u062A\u0645\u062E',
-  '\uFD58': '\u062C\u0645\u062D',
-  '\uFD59': '\u062C\u0645\u062D',
-  '\uFD5A': '\u062D\u0645\u064A',
-  '\uFD5B': '\u062D\u0645\u0649',
-  '\uFD5C': '\u0633\u062D\u062C',
-  '\uFD5D': '\u0633\u062C\u062D',
-  '\uFD5E': '\u0633\u062C\u0649',
-  '\uFD5F': '\u0633\u0645\u062D',
-  '\uFD60': '\u0633\u0645\u062D',
-  '\uFD61': '\u0633\u0645\u062C',
-  '\uFD62': '\u0633\u0645\u0645',
-  '\uFD63': '\u0633\u0645\u0645',
-  '\uFD64': '\u0635\u062D\u062D',
-  '\uFD65': '\u0635\u062D\u062D',
-  '\uFD66': '\u0635\u0645\u0645',
-  '\uFD67': '\u0634\u062D\u0645',
-  '\uFD68': '\u0634\u062D\u0645',
-  '\uFD69': '\u0634\u062C\u064A',
-  '\uFD6A': '\u0634\u0645\u062E',
-  '\uFD6B': '\u0634\u0645\u062E',
-  '\uFD6C': '\u0634\u0645\u0645',
-  '\uFD6D': '\u0634\u0645\u0645',
-  '\uFD6E': '\u0636\u062D\u0649',
-  '\uFD6F': '\u0636\u062E\u0645',
-  '\uFD70': '\u0636\u062E\u0645',
-  '\uFD71': '\u0637\u0645\u062D',
-  '\uFD72': '\u0637\u0645\u062D',
-  '\uFD73': '\u0637\u0645\u0645',
-  '\uFD74': '\u0637\u0645\u064A',
-  '\uFD75': '\u0639\u062C\u0645',
-  '\uFD76': '\u0639\u0645\u0645',
-  '\uFD77': '\u0639\u0645\u0645',
-  '\uFD78': '\u0639\u0645\u0649',
-  '\uFD79': '\u063A\u0645\u0645',
-  '\uFD7A': '\u063A\u0645\u064A',
-  '\uFD7B': '\u063A\u0645\u0649',
-  '\uFD7C': '\u0641\u062E\u0645',
-  '\uFD7D': '\u0641\u062E\u0645',
-  '\uFD7E': '\u0642\u0645\u062D',
-  '\uFD7F': '\u0642\u0645\u0645',
-  '\uFD80': '\u0644\u062D\u0645',
-  '\uFD81': '\u0644\u062D\u064A',
-  '\uFD82': '\u0644\u062D\u0649',
-  '\uFD83': '\u0644\u062C\u062C',
-  '\uFD84': '\u0644\u062C\u062C',
-  '\uFD85': '\u0644\u062E\u0645',
-  '\uFD86': '\u0644\u062E\u0645',
-  '\uFD87': '\u0644\u0645\u062D',
-  '\uFD88': '\u0644\u0645\u062D',
-  '\uFD89': '\u0645\u062D\u062C',
-  '\uFD8A': '\u0645\u062D\u0645',
-  '\uFD8B': '\u0645\u062D\u064A',
-  '\uFD8C': '\u0645\u062C\u062D',
-  '\uFD8D': '\u0645\u062C\u0645',
-  '\uFD8E': '\u0645\u062E\u062C',
-  '\uFD8F': '\u0645\u062E\u0645',
-  '\uFD92': '\u0645\u062C\u062E',
-  '\uFD93': '\u0647\u0645\u062C',
-  '\uFD94': '\u0647\u0645\u0645',
-  '\uFD95': '\u0646\u062D\u0645',
-  '\uFD96': '\u0646\u062D\u0649',
-  '\uFD97': '\u0646\u062C\u0645',
-  '\uFD98': '\u0646\u062C\u0645',
-  '\uFD99': '\u0646\u062C\u0649',
-  '\uFD9A': '\u0646\u0645\u064A',
-  '\uFD9B': '\u0646\u0645\u0649',
-  '\uFD9C': '\u064A\u0645\u0645',
-  '\uFD9D': '\u064A\u0645\u0645',
-  '\uFD9E': '\u0628\u062E\u064A',
-  '\uFD9F': '\u062A\u062C\u064A',
-  '\uFDA0': '\u062A\u062C\u0649',
-  '\uFDA1': '\u062A\u062E\u064A',
-  '\uFDA2': '\u062A\u062E\u0649',
-  '\uFDA3': '\u062A\u0645\u064A',
-  '\uFDA4': '\u062A\u0645\u0649',
-  '\uFDA5': '\u062C\u0645\u064A',
-  '\uFDA6': '\u062C\u062D\u0649',
-  '\uFDA7': '\u062C\u0645\u0649',
-  '\uFDA8': '\u0633\u062E\u0649',
-  '\uFDA9': '\u0635\u062D\u064A',
-  '\uFDAA': '\u0634\u062D\u064A',
-  '\uFDAB': '\u0636\u062D\u064A',
-  '\uFDAC': '\u0644\u062C\u064A',
-  '\uFDAD': '\u0644\u0645\u064A',
-  '\uFDAE': '\u064A\u062D\u064A',
-  '\uFDAF': '\u064A\u062C\u064A',
-  '\uFDB0': '\u064A\u0645\u064A',
-  '\uFDB1': '\u0645\u0645\u064A',
-  '\uFDB2': '\u0642\u0645\u064A',
-  '\uFDB3': '\u0646\u062D\u064A',
-  '\uFDB4': '\u0642\u0645\u062D',
-  '\uFDB5': '\u0644\u062D\u0645',
-  '\uFDB6': '\u0639\u0645\u064A',
-  '\uFDB7': '\u0643\u0645\u064A',
-  '\uFDB8': '\u0646\u062C\u062D',
-  '\uFDB9': '\u0645\u062E\u064A',
-  '\uFDBA': '\u0644\u062C\u0645',
-  '\uFDBB': '\u0643\u0645\u0645',
-  '\uFDBC': '\u0644\u062C\u0645',
-  '\uFDBD': '\u0646\u062C\u062D',
-  '\uFDBE': '\u062C\u062D\u064A',
-  '\uFDBF': '\u062D\u062C\u064A',
-  '\uFDC0': '\u0645\u062C\u064A',
-  '\uFDC1': '\u0641\u0645\u064A',
-  '\uFDC2': '\u0628\u062D\u064A',
-  '\uFDC3': '\u0643\u0645\u0645',
-  '\uFDC4': '\u0639\u062C\u0645',
-  '\uFDC5': '\u0635\u0645\u0645',
-  '\uFDC6': '\u0633\u062E\u064A',
-  '\uFDC7': '\u0646\u062C\u064A',
-  '\uFE49': '\u203E',
-  '\uFE4A': '\u203E',
-  '\uFE4B': '\u203E',
-  '\uFE4C': '\u203E',
-  '\uFE4D': '\u005F',
-  '\uFE4E': '\u005F',
-  '\uFE4F': '\u005F',
-  '\uFE80': '\u0621',
-  '\uFE81': '\u0622',
-  '\uFE82': '\u0622',
-  '\uFE83': '\u0623',
-  '\uFE84': '\u0623',
-  '\uFE85': '\u0624',
-  '\uFE86': '\u0624',
-  '\uFE87': '\u0625',
-  '\uFE88': '\u0625',
-  '\uFE89': '\u0626',
-  '\uFE8A': '\u0626',
-  '\uFE8B': '\u0626',
-  '\uFE8C': '\u0626',
-  '\uFE8D': '\u0627',
-  '\uFE8E': '\u0627',
-  '\uFE8F': '\u0628',
-  '\uFE90': '\u0628',
-  '\uFE91': '\u0628',
-  '\uFE92': '\u0628',
-  '\uFE93': '\u0629',
-  '\uFE94': '\u0629',
-  '\uFE95': '\u062A',
-  '\uFE96': '\u062A',
-  '\uFE97': '\u062A',
-  '\uFE98': '\u062A',
-  '\uFE99': '\u062B',
-  '\uFE9A': '\u062B',
-  '\uFE9B': '\u062B',
-  '\uFE9C': '\u062B',
-  '\uFE9D': '\u062C',
-  '\uFE9E': '\u062C',
-  '\uFE9F': '\u062C',
-  '\uFEA0': '\u062C',
-  '\uFEA1': '\u062D',
-  '\uFEA2': '\u062D',
-  '\uFEA3': '\u062D',
-  '\uFEA4': '\u062D',
-  '\uFEA5': '\u062E',
-  '\uFEA6': '\u062E',
-  '\uFEA7': '\u062E',
-  '\uFEA8': '\u062E',
-  '\uFEA9': '\u062F',
-  '\uFEAA': '\u062F',
-  '\uFEAB': '\u0630',
-  '\uFEAC': '\u0630',
-  '\uFEAD': '\u0631',
-  '\uFEAE': '\u0631',
-  '\uFEAF': '\u0632',
-  '\uFEB0': '\u0632',
-  '\uFEB1': '\u0633',
-  '\uFEB2': '\u0633',
-  '\uFEB3': '\u0633',
-  '\uFEB4': '\u0633',
-  '\uFEB5': '\u0634',
-  '\uFEB6': '\u0634',
-  '\uFEB7': '\u0634',
-  '\uFEB8': '\u0634',
-  '\uFEB9': '\u0635',
-  '\uFEBA': '\u0635',
-  '\uFEBB': '\u0635',
-  '\uFEBC': '\u0635',
-  '\uFEBD': '\u0636',
-  '\uFEBE': '\u0636',
-  '\uFEBF': '\u0636',
-  '\uFEC0': '\u0636',
-  '\uFEC1': '\u0637',
-  '\uFEC2': '\u0637',
-  '\uFEC3': '\u0637',
-  '\uFEC4': '\u0637',
-  '\uFEC5': '\u0638',
-  '\uFEC6': '\u0638',
-  '\uFEC7': '\u0638',
-  '\uFEC8': '\u0638',
-  '\uFEC9': '\u0639',
-  '\uFECA': '\u0639',
-  '\uFECB': '\u0639',
-  '\uFECC': '\u0639',
-  '\uFECD': '\u063A',
-  '\uFECE': '\u063A',
-  '\uFECF': '\u063A',
-  '\uFED0': '\u063A',
-  '\uFED1': '\u0641',
-  '\uFED2': '\u0641',
-  '\uFED3': '\u0641',
-  '\uFED4': '\u0641',
-  '\uFED5': '\u0642',
-  '\uFED6': '\u0642',
-  '\uFED7': '\u0642',
-  '\uFED8': '\u0642',
-  '\uFED9': '\u0643',
-  '\uFEDA': '\u0643',
-  '\uFEDB': '\u0643',
-  '\uFEDC': '\u0643',
-  '\uFEDD': '\u0644',
-  '\uFEDE': '\u0644',
-  '\uFEDF': '\u0644',
-  '\uFEE0': '\u0644',
-  '\uFEE1': '\u0645',
-  '\uFEE2': '\u0645',
-  '\uFEE3': '\u0645',
-  '\uFEE4': '\u0645',
-  '\uFEE5': '\u0646',
-  '\uFEE6': '\u0646',
-  '\uFEE7': '\u0646',
-  '\uFEE8': '\u0646',
-  '\uFEE9': '\u0647',
-  '\uFEEA': '\u0647',
-  '\uFEEB': '\u0647',
-  '\uFEEC': '\u0647',
-  '\uFEED': '\u0648',
-  '\uFEEE': '\u0648',
-  '\uFEEF': '\u0649',
-  '\uFEF0': '\u0649',
-  '\uFEF1': '\u064A',
-  '\uFEF2': '\u064A',
-  '\uFEF3': '\u064A',
-  '\uFEF4': '\u064A',
-  '\uFEF5': '\u0644\u0622',
-  '\uFEF6': '\u0644\u0622',
-  '\uFEF7': '\u0644\u0623',
-  '\uFEF8': '\u0644\u0623',
-  '\uFEF9': '\u0644\u0625',
-  '\uFEFA': '\u0644\u0625',
-  '\uFEFB': '\u0644\u0627',
-  '\uFEFC': '\u0644\u0627'
-};
-
-function reverseIfRtl(chars) {
-  var charsLength = chars.length;
-  //reverse an arabic ligature
-  if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {
-    return chars;
-  }
-  var s = '';
-  for (var ii = charsLength - 1; ii >= 0; ii--) {
-    s += chars[ii];
-  }
-  return s;
-}
-
-function adjustWidths(properties) {
-  if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) {
-    return;
-  }
-  // adjusting width to fontMatrix scale
-  var scale = 0.001 / properties.fontMatrix[0];
-  var glyphsWidths = properties.widths;
-  for (var glyph in glyphsWidths) {
-    glyphsWidths[glyph] *= scale;
-  }
-  properties.defaultWidth *= scale;
-}
-
-function getFontType(type, subtype) {
-  switch (type) {
-    case 'Type1':
-      return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1;
-    case 'CIDFontType0':
-      return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C :
-        FontType.CIDFONTTYPE0;
-    case 'OpenType':
-      return FontType.OPENTYPE;
-    case 'TrueType':
-      return FontType.TRUETYPE;
-    case 'CIDFontType2':
-      return FontType.CIDFONTTYPE2;
-    case 'MMType1':
-      return FontType.MMTYPE1;
-    case 'Type0':
-      return FontType.TYPE0;
-    default:
-      return FontType.UNKNOWN;
-  }
-}
-
-var Glyph = (function GlyphClosure() {
-  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId) {
-    this.fontChar = fontChar;
-    this.unicode = unicode;
-    this.accent = accent;
-    this.width = width;
-    this.vmetric = vmetric;
-    this.operatorListId = operatorListId;
-  }
-
-  Glyph.prototype.matchesForCache =
-      function(fontChar, unicode, accent, width, vmetric, operatorListId) {
-    return this.fontChar === fontChar &&
-           this.unicode === unicode &&
-           this.accent === accent &&
-           this.width === width &&
-           this.vmetric === vmetric &&
-           this.operatorListId === operatorListId;
-  };
-
-  return Glyph;
-})();
-
-var ToUnicodeMap = (function ToUnicodeMapClosure() {
-  function ToUnicodeMap(cmap) {
-    // The elements of this._map can be integers or strings, depending on how
-    // |cmap| was created.
-    this._map = cmap;
-  }
-
-  ToUnicodeMap.prototype = {
-    get length() {
-      return this._map.length;
-    },
-
-    forEach: function(callback) {
-      for (var charCode in this._map) {
-        callback(charCode, this._map[charCode].charCodeAt(0));
-      }
-    },
-
-    has: function(i) {
-      return this._map[i] !== undefined;
-    },
-
-    get: function(i) {
-      return this._map[i];
-    },
-
-    charCodeOf: function(v) {
-      return this._map.indexOf(v);
-    }
-  };
-
-  return ToUnicodeMap;
-})();
-
-var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() {
-  function IdentityToUnicodeMap(firstChar, lastChar) {
-    this.firstChar = firstChar;
-    this.lastChar = lastChar;
-  }
-
-  IdentityToUnicodeMap.prototype = {
-    get length() {
-      return (this.lastChar + 1) - this.firstChar;
-    },
-
-    forEach: function (callback) {
-      for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {
-        callback(i, i);
-      }
-    },
-
-    has: function (i) {
-      return this.firstChar <= i && i <= this.lastChar;
-    },
-
-    get: function (i) {
-      if (this.firstChar <= i && i <= this.lastChar) {
-        return String.fromCharCode(i);
-      }
-      return undefined;
-    },
-
-    charCodeOf: function (v) {
-      error('should not call .charCodeOf');
-    }
-  };
-
-  return IdentityToUnicodeMap;
-})();
-
-var OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() {
-  function writeInt16(dest, offset, num) {
-    dest[offset] = (num >> 8) & 0xFF;
-    dest[offset + 1] = num & 0xFF;
-  }
-
-  function writeInt32(dest, offset, num) {
-    dest[offset] = (num >> 24) & 0xFF;
-    dest[offset + 1] = (num >> 16) & 0xFF;
-    dest[offset + 2] = (num >> 8) & 0xFF;
-    dest[offset + 3] = num & 0xFF;
-  }
-
-  function writeData(dest, offset, data) {
-    var i, ii;
-    if (data instanceof Uint8Array) {
-      dest.set(data, offset);
-    } else if (typeof data === 'string') {
-      for (i = 0, ii = data.length; i < ii; i++) {
-        dest[offset++] = data.charCodeAt(i) & 0xFF;
-      }
-    } else {
-      // treating everything else as array
-      for (i = 0, ii = data.length; i < ii; i++) {
-        dest[offset++] = data[i] & 0xFF;
-      }
-    }
-  }
-
-  function OpenTypeFileBuilder(sfnt) {
-    this.sfnt = sfnt;
-    this.tables = Object.create(null);
-  }
-
-  OpenTypeFileBuilder.getSearchParams =
-      function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) {
-    var maxPower2 = 1, log2 = 0;
-    while ((maxPower2 ^ entriesCount) > maxPower2) {
-      maxPower2 <<= 1;
-      log2++;
-    }
-    var searchRange = maxPower2 * entrySize;
-    return {
-      range: searchRange,
-      entry: log2,
-      rangeShift: entrySize * entriesCount - searchRange
-    };
-  };
-
-  var OTF_HEADER_SIZE = 12;
-  var OTF_TABLE_ENTRY_SIZE = 16;
-
-  OpenTypeFileBuilder.prototype = {
-    toArray: function OpenTypeFileBuilder_toArray() {
-      var sfnt = this.sfnt;
-
-      // Tables needs to be written by ascendant alphabetic order
-      var tables = this.tables;
-      var tablesNames = Object.keys(tables);
-      tablesNames.sort();
-      var numTables = tablesNames.length;
-
-      var i, j, jj, table, tableName;
-      // layout the tables data
-      var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;
-      var tableOffsets = [offset];
-      for (i = 0; i < numTables; i++) {
-        table = tables[tablesNames[i]];
-        var paddedLength = ((table.length + 3) & ~3) >>> 0;
-        offset += paddedLength;
-        tableOffsets.push(offset);
-      }
-
-      var file = new Uint8Array(offset);
-      // write the table data first (mostly for checksum)
-      for (i = 0; i < numTables; i++) {
-        table = tables[tablesNames[i]];
-        writeData(file, tableOffsets[i], table);
-      }
-
-      // sfnt version (4 bytes)
-      if (sfnt === 'true') {
-        // Windows hates the Mac TrueType sfnt version number
-        sfnt = string32(0x00010000);
-      }
-      file[0] = sfnt.charCodeAt(0) & 0xFF;
-      file[1] = sfnt.charCodeAt(1) & 0xFF;
-      file[2] = sfnt.charCodeAt(2) & 0xFF;
-      file[3] = sfnt.charCodeAt(3) & 0xFF;
-
-      // numTables (2 bytes)
-      writeInt16(file, 4, numTables);
-
-      var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);
-
-      // searchRange (2 bytes)
-      writeInt16(file, 6, searchParams.range);
-      // entrySelector (2 bytes)
-      writeInt16(file, 8, searchParams.entry);
-      // rangeShift (2 bytes)
-      writeInt16(file, 10, searchParams.rangeShift);
-
-      offset = OTF_HEADER_SIZE;
-      // writing table entries
-      for (i = 0; i < numTables; i++) {
-        tableName = tablesNames[i];
-        file[offset] = tableName.charCodeAt(0) & 0xFF;
-        file[offset + 1] = tableName.charCodeAt(1) & 0xFF;
-        file[offset + 2] = tableName.charCodeAt(2) & 0xFF;
-        file[offset + 3] = tableName.charCodeAt(3) & 0xFF;
-
-        // checksum
-        var checksum = 0;
-        for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {
-          var quad = (file[j] << 24) + (file[j + 1] << 16) +
-                     (file[j + 2] << 8) + file[j + 3];
-          checksum = (checksum + quad) | 0;
-        }
-        writeInt32(file, offset + 4, checksum);
-
-        // offset
-        writeInt32(file, offset + 8, tableOffsets[i]);
-        // length
-        writeInt32(file, offset + 12, tables[tableName].length);
-
-        offset += OTF_TABLE_ENTRY_SIZE;
-      }
-      return file;
-    },
-
-    addTable: function OpenTypeFileBuilder_addTable(tag, data) {
-      if (tag in this.tables) {
-        throw new Error('Table ' + tag + ' already exists');
-      }
-      this.tables[tag] = data;
-    }
-  };
-
-  return OpenTypeFileBuilder;
-})();
-
-/**
- * 'Font' is the class the outside world should use, it encapsulate all the font
- * decoding logics whatever type it is (assuming the font type is supported).
- *
- * For example to read a Type1 font and to attach it to the document:
- *   var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
- *   type1Font.bind();
- */
-var Font = (function FontClosure() {
-  function Font(name, file, properties) {
-    var charCode, glyphName, fontChar;
-
-    this.name = name;
-    this.loadedName = properties.loadedName;
-    this.isType3Font = properties.isType3Font;
-    this.sizes = [];
-
-    this.glyphCache = {};
-
-    var names = name.split('+');
-    names = names.length > 1 ? names[1] : names[0];
-    names = names.split(/[-,_]/g)[0];
-    this.isSerifFont = !!(properties.flags & FontFlags.Serif);
-    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
-    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);
-
-    var type = properties.type;
-    var subtype = properties.subtype;
-    this.type = type;
-
-    this.fallbackName = (this.isMonospace ? 'monospace' :
-                         (this.isSerifFont ? 'serif' : 'sans-serif'));
-
-    this.differences = properties.differences;
-    this.widths = properties.widths;
-    this.defaultWidth = properties.defaultWidth;
-    this.composite = properties.composite;
-    this.wideChars = properties.wideChars;
-    this.cMap = properties.cMap;
-    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;
-    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;
-    this.fontMatrix = properties.fontMatrix;
-    this.bbox = properties.bbox;
-
-    this.toUnicode = properties.toUnicode = this.buildToUnicode(properties);
-
-    this.toFontChar = [];
-
-    if (properties.type === 'Type3') {
-      for (charCode = 0; charCode < 256; charCode++) {
-        this.toFontChar[charCode] = (this.differences[charCode] ||
-                                     properties.defaultEncoding[charCode]);
-      }
-      this.fontType = FontType.TYPE3;
-      return;
-    }
-
-    this.cidEncoding = properties.cidEncoding;
-    this.vertical = properties.vertical;
-    if (this.vertical) {
-      this.vmetrics = properties.vmetrics;
-      this.defaultVMetrics = properties.defaultVMetrics;
-    }
-
-    if (!file || file.isEmpty) {
-      if (file) {
-        // Some bad PDF generators will include empty font files,
-        // attempting to recover by assuming that no file exists.
-        warn('Font file is empty in "' + name + '" (' + this.loadedName + ')');
-      }
-
-      this.missingFile = true;
-      // The file data is not specified. Trying to fix the font name
-      // to be used with the canvas.font.
-      var fontName = name.replace(/[,_]/g, '-');
-      var isStandardFont = !!stdFontMap[fontName] ||
-        !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);
-      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
-
-      this.bold = (fontName.search(/bold/gi) !== -1);
-      this.italic = ((fontName.search(/oblique/gi) !== -1) ||
-                     (fontName.search(/italic/gi) !== -1));
-
-      // Use 'name' instead of 'fontName' here because the original
-      // name ArialBlack for example will be replaced by Helvetica.
-      this.black = (name.search(/Black/g) !== -1);
-
-      // if at least one width is present, remeasure all chars when exists
-      this.remeasure = Object.keys(this.widths).length > 0;
-      if (isStandardFont && type === 'CIDFontType2' &&
-          properties.cidEncoding.indexOf('Identity-') === 0) {
-        // Standard fonts might be embedded as CID font without glyph mapping.
-        // Building one based on GlyphMapForStandardFonts.
-        var map = [];
-        for (var code in GlyphMapForStandardFonts) {
-          map[+code] = GlyphMapForStandardFonts[code];
-        }
-        var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;
-        if (!isIdentityUnicode) {
-          this.toUnicode.forEach(function(charCode, unicodeCharCode) {
-            map[+charCode] = unicodeCharCode;
-          });
-        }
-        this.toFontChar = map;
-        this.toUnicode = new ToUnicodeMap(map);
-      } else if (/Symbol/i.test(fontName)) {
-        var symbols = Encodings.SymbolSetEncoding;
-        for (charCode in symbols) {
-          fontChar = GlyphsUnicode[symbols[charCode]];
-          if (!fontChar) {
-            continue;
-          }
-          this.toFontChar[charCode] = fontChar;
-        }
-        for (charCode in properties.differences) {
-          fontChar = GlyphsUnicode[properties.differences[charCode]];
-          if (!fontChar) {
-            continue;
-          }
-          this.toFontChar[charCode] = fontChar;
-        }
-      } else if (/Dingbats/i.test(fontName)) {
-        if (/Wingdings/i.test(name)) {
-          warn('Wingdings font without embedded font file, ' +
-               'falling back to the ZapfDingbats encoding.');
-        }
-        var dingbats = Encodings.ZapfDingbatsEncoding;
-        for (charCode in dingbats) {
-          fontChar = DingbatsGlyphsUnicode[dingbats[charCode]];
-          if (!fontChar) {
-            continue;
-          }
-          this.toFontChar[charCode] = fontChar;
-        }
-        for (charCode in properties.differences) {
-          fontChar = DingbatsGlyphsUnicode[properties.differences[charCode]];
-          if (!fontChar) {
-            continue;
-          }
-          this.toFontChar[charCode] = fontChar;
-        }
-      } else if (isStandardFont) {
-        this.toFontChar = [];
-        for (charCode in properties.defaultEncoding) {
-          glyphName = (properties.differences[charCode] ||
-                       properties.defaultEncoding[charCode]);
-          this.toFontChar[charCode] = GlyphsUnicode[glyphName];
-        }
-      } else {
-        var unicodeCharCode, notCidFont = (type.indexOf('CIDFontType') === -1);
-        this.toUnicode.forEach(function(charCode, unicodeCharCode) {
-          if (notCidFont) {
-            glyphName = (properties.differences[charCode] ||
-                         properties.defaultEncoding[charCode]);
-            unicodeCharCode = (GlyphsUnicode[glyphName] || unicodeCharCode);
-          }
-          this.toFontChar[charCode] = unicodeCharCode;
-        }.bind(this));
-      }
-      this.loadedName = fontName.split('-')[0];
-      this.loading = false;
-      this.fontType = getFontType(type, subtype);
-      return;
-    }
-
-    // Some fonts might use wrong font types for Type1C or CIDFontType0C
-    if (subtype === 'Type1C' && (type !== 'Type1' && type !== 'MMType1')) {
-      // Some TrueType fonts by mistake claim Type1C
-      if (isTrueTypeFile(file)) {
-        subtype = 'TrueType';
-      } else {
-        type = 'Type1';
-      }
-    }
-    if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') {
-      type = 'CIDFontType0';
-    }
-    if (subtype === 'OpenType') {
-      type = 'OpenType';
-    }
-    // Some CIDFontType0C fonts by mistake claim CIDFontType0.
-    if (type === 'CIDFontType0') {
-      subtype = isType1File(file) ? 'CIDFontType0' : 'CIDFontType0C';
-    }
-
-    var data;
-    switch (type) {
-      case 'MMType1':
-        info('MMType1 font (' + name + '), falling back to Type1.');
-        /* falls through */
-      case 'Type1':
-      case 'CIDFontType0':
-        this.mimetype = 'font/opentype';
-
-        var cff = (subtype === 'Type1C' || subtype === 'CIDFontType0C') ?
-          new CFFFont(file, properties) : new Type1Font(name, file, properties);
-
-        adjustWidths(properties);
-
-        // Wrap the CFF data inside an OTF font file
-        data = this.convert(name, cff, properties);
-        break;
-
-      case 'OpenType':
-      case 'TrueType':
-      case 'CIDFontType2':
-        this.mimetype = 'font/opentype';
-
-        // Repair the TrueType file. It is can be damaged in the point of
-        // view of the sanitizer
-        data = this.checkAndRepair(name, file, properties);
-        if (this.isOpenType) {
-          type = 'OpenType';
-        }
-        break;
-
-      default:
-        error('Font ' + type + ' is not supported');
-        break;
-    }
-
-    this.data = data;
-    this.fontType = getFontType(type, subtype);
-
-    // Transfer some properties again that could change during font conversion
-    this.fontMatrix = properties.fontMatrix;
-    this.widths = properties.widths;
-    this.defaultWidth = properties.defaultWidth;
-    this.encoding = properties.baseEncoding;
-    this.seacMap = properties.seacMap;
-
-    this.loading = true;
-  }
-
-  Font.getFontID = (function () {
-    var ID = 1;
-    return function Font_getFontID() {
-      return String(ID++);
-    };
-  })();
-
-  function int16(b0, b1) {
-    return (b0 << 8) + b1;
-  }
-
-  function int32(b0, b1, b2, b3) {
-    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
-  }
-
-  function string16(value) {
-    return String.fromCharCode((value >> 8) & 0xff, value & 0xff);
-  }
-
-  function safeString16(value) {
-    // clamp value to the 16-bit int range
-    value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value));
-    return String.fromCharCode((value >> 8) & 0xff, value & 0xff);
-  }
-
-  function isTrueTypeFile(file) {
-    var header = file.peekBytes(4);
-    return readUint32(header, 0) === 0x00010000;
-  }
-
-  function isType1File(file) {
-    var header = file.peekBytes(2);
-    // All Type1 font programs must begin with the comment '%!' (0x25 + 0x21).
-    if (header[0] === 0x25 && header[1] === 0x21) {
-      return true;
-    }
-    // ... obviously some fonts violate that part of the specification,
-    // please refer to the comment in |Type1Font| below.
-    if (header[0] === 0x80 && header[1] === 0x01) { // pfb file header.
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Helper function for |adjustMapping|.
-   * @return {boolean}
-   */
-  function isProblematicUnicodeLocation(code) {
-    if (code <= 0x1F) { // Control chars
-      return true;
-    }
-    if (code >= 0x80 && code <= 0x9F) { // Control chars
-      return true;
-    }
-    if ((code >= 0x2000 && code <= 0x200F) || // General punctuation chars
-        (code >= 0x2028 && code <= 0x202F) ||
-        (code >= 0x2060 && code <= 0x206F)) {
-      return true;
-    }
-    if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials Unicode block
-      return true;
-    }
-    switch (code) {
-      case 0x7F: // Control char
-      case 0xA0: // Non breaking space
-      case 0xAD: // Soft hyphen
-      case 0x0E33: // Thai character SARA AM
-      case 0x2011: // Non breaking hyphen
-      case 0x205F: // Medium mathematical space
-      case 0x25CC: // Dotted circle (combining mark)
-        return true;
-    }
-    return false;
-  }
-
-  /**
-   * Rebuilds the char code to glyph ID map by trying to replace the char codes
-   * with their unicode value. It also moves char codes that are in known
-   * problematic locations.
-   * @return {Object} Two properties:
-   * 'toFontChar' - maps original char codes(the value that will be read
-   * from commands such as show text) to the char codes that will be used in the
-   * font that we build
-   * 'charCodeToGlyphId' - maps the new font char codes to glyph ids
-   */
-  function adjustMapping(charCodeToGlyphId, properties) {
-    var toUnicode = properties.toUnicode;
-    var isSymbolic = !!(properties.flags & FontFlags.Symbolic);
-    var isIdentityUnicode =
-      properties.toUnicode instanceof IdentityToUnicodeMap;
-    var newMap = Object.create(null);
-    var toFontChar = [];
-    var usedFontCharCodes = [];
-    var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START;
-    for (var originalCharCode in charCodeToGlyphId) {
-      originalCharCode |= 0;
-      var glyphId = charCodeToGlyphId[originalCharCode];
-      var fontCharCode = originalCharCode;
-      // First try to map the value to a unicode position if a non identity map
-      // was created.
-      if (!isIdentityUnicode && toUnicode.has(originalCharCode)) {
-        var unicode = toUnicode.get(fontCharCode);
-        // TODO: Try to map ligatures to the correct spot.
-        if (unicode.length === 1) {
-          fontCharCode = unicode.charCodeAt(0);
-        }
-      }
-      // Try to move control characters, special characters and already mapped
-      // characters to the private use area since they will not be drawn by
-      // canvas if left in their current position. Also, move characters if the
-      // font was symbolic and there is only an identity unicode map since the
-      // characters probably aren't in the correct position (fixes an issue
-      // with firefox and thuluthfont).
-      if ((usedFontCharCodes[fontCharCode] !== undefined ||
-           isProblematicUnicodeLocation(fontCharCode) ||
-           (isSymbolic && isIdentityUnicode)) &&
-          nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { // Room left.
-        // Loop to try and find a free spot in the private use area.
-        do {
-          fontCharCode = nextAvailableFontCharCode++;
-
-          if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) {
-            fontCharCode = 0xF020;
-            nextAvailableFontCharCode = fontCharCode + 1;
-          }
-
-        } while (usedFontCharCodes[fontCharCode] !== undefined &&
-                 nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END);
-      }
-
-      newMap[fontCharCode] = glyphId;
-      toFontChar[originalCharCode] = fontCharCode;
-      usedFontCharCodes[fontCharCode] = true;
-    }
-    return {
-      toFontChar: toFontChar,
-      charCodeToGlyphId: newMap,
-      nextAvailableFontCharCode: nextAvailableFontCharCode
-    };
-  }
-
-  function getRanges(glyphs) {
-    // Array.sort() sorts by characters, not numerically, so convert to an
-    // array of characters.
-    var codes = [];
-    for (var charCode in glyphs) {
-      codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] });
-    }
-    codes.sort(function fontGetRangesSort(a, b) {
-      return a.fontCharCode - b.fontCharCode;
-    });
-
-    // Split the sorted codes into ranges.
-    var ranges = [];
-    var length = codes.length;
-    for (var n = 0; n < length; ) {
-      var start = codes[n].fontCharCode;
-      var codeIndices = [codes[n].glyphId];
-      ++n;
-      var end = start;
-      while (n < length && end + 1 === codes[n].fontCharCode) {
-        codeIndices.push(codes[n].glyphId);
-        ++end;
-        ++n;
-        if (end === 0xFFFF) {
-          break;
-        }
-      }
-      ranges.push([start, end, codeIndices]);
-    }
-
-    return ranges;
-  }
-
-  function createCmapTable(glyphs) {
-    var ranges = getRanges(glyphs);
-    var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;
-    var cmap = '\x00\x00' + // version
-               string16(numTables) +  // numTables
-               '\x00\x03' + // platformID
-               '\x00\x01' + // encodingID
-               string32(4 + numTables * 8); // start of the table record
-
-    var i, ii, j, jj;
-    for (i = ranges.length - 1; i >= 0; --i) {
-      if (ranges[i][0] <= 0xFFFF) { break; }
-    }
-    var bmpLength = i + 1;
-
-    if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {
-      ranges[i][1] = 0xFFFE;
-    }
-    var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;
-    var segCount = bmpLength + trailingRangesCount;
-    var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);
-
-    // Fill up the 4 parallel arrays describing the segments.
-    var startCount = '';
-    var endCount = '';
-    var idDeltas = '';
-    var idRangeOffsets = '';
-    var glyphsIds = '';
-    var bias = 0;
-
-    var range, start, end, codes;
-    for (i = 0, ii = bmpLength; i < ii; i++) {
-      range = ranges[i];
-      start = range[0];
-      end = range[1];
-      startCount += string16(start);
-      endCount += string16(end);
-      codes = range[2];
-      var contiguous = true;
-      for (j = 1, jj = codes.length; j < jj; ++j) {
-        if (codes[j] !== codes[j - 1] + 1) {
-          contiguous = false;
-          break;
-        }
-      }
-      if (!contiguous) {
-        var offset = (segCount - i) * 2 + bias * 2;
-        bias += (end - start + 1);
-
-        idDeltas += string16(0);
-        idRangeOffsets += string16(offset);
-
-        for (j = 0, jj = codes.length; j < jj; ++j) {
-          glyphsIds += string16(codes[j]);
-        }
-      } else {
-        var startCode = codes[0];
-
-        idDeltas += string16((startCode - start) & 0xFFFF);
-        idRangeOffsets += string16(0);
-      }
-    }
-
-    if (trailingRangesCount > 0) {
-      endCount += '\xFF\xFF';
-      startCount += '\xFF\xFF';
-      idDeltas += '\x00\x01';
-      idRangeOffsets += '\x00\x00';
-    }
-
-    var format314 = '\x00\x00' + // language
-                    string16(2 * segCount) +
-                    string16(searchParams.range) +
-                    string16(searchParams.entry) +
-                    string16(searchParams.rangeShift) +
-                    endCount + '\x00\x00' + startCount +
-                    idDeltas + idRangeOffsets + glyphsIds;
-
-    var format31012 = '';
-    var header31012 = '';
-    if (numTables > 1) {
-      cmap += '\x00\x03' + // platformID
-              '\x00\x0A' + // encodingID
-              string32(4 + numTables * 8 +
-                       4 + format314.length); // start of the table record
-      format31012 = '';
-      for (i = 0, ii = ranges.length; i < ii; i++) {
-        range = ranges[i];
-        start = range[0];
-        codes = range[2];
-        var code = codes[0];
-        for (j = 1, jj = codes.length; j < jj; ++j) {
-          if (codes[j] !== codes[j - 1] + 1) {
-            end = range[0] + j - 1;
-            format31012 += string32(start) + // startCharCode
-                           string32(end) + // endCharCode
-                           string32(code); // startGlyphID
-            start = end + 1;
-            code = codes[j];
-          }
-        }
-        format31012 += string32(start) + // startCharCode
-                       string32(range[1]) + // endCharCode
-                       string32(code); // startGlyphID
-      }
-      header31012 = '\x00\x0C' + // format
-                    '\x00\x00' + // reserved
-                    string32(format31012.length + 16) + // length
-                    '\x00\x00\x00\x00' + // language
-                    string32(format31012.length / 12); // nGroups
-    }
-
-    return cmap + '\x00\x04' + // format
-                  string16(format314.length + 4) + // length
-                  format314 + header31012 + format31012;
-  }
-
-  function validateOS2Table(os2) {
-    var stream = new Stream(os2.data);
-    var version = stream.getUint16();
-    // TODO verify all OS/2 tables fields, but currently we validate only those
-    // that give us issues
-    stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges
-    var selection = stream.getUint16();
-    if (version < 4 && (selection & 0x0300)) {
-      return false;
-    }
-    var firstChar = stream.getUint16();
-    var lastChar = stream.getUint16();
-    if (firstChar > lastChar) {
-      return false;
-    }
-    stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap
-    var usWinAscent = stream.getUint16();
-    if (usWinAscent === 0) { // makes font unreadable by windows
-      return false;
-    }
-
-    // OS/2 appears to be valid, resetting some fields
-    os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0
-    return true;
-  }
-
-  function createOS2Table(properties, charstrings, override) {
-    override = override || {
-      unitsPerEm: 0,
-      yMax: 0,
-      yMin: 0,
-      ascent: 0,
-      descent: 0
-    };
-
-    var ulUnicodeRange1 = 0;
-    var ulUnicodeRange2 = 0;
-    var ulUnicodeRange3 = 0;
-    var ulUnicodeRange4 = 0;
-
-    var firstCharIndex = null;
-    var lastCharIndex = 0;
-
-    if (charstrings) {
-      for (var code in charstrings) {
-        code |= 0;
-        if (firstCharIndex > code || !firstCharIndex) {
-          firstCharIndex = code;
-        }
-        if (lastCharIndex < code) {
-          lastCharIndex = code;
-        }
-
-        var position = getUnicodeRangeFor(code);
-        if (position < 32) {
-          ulUnicodeRange1 |= 1 << position;
-        } else if (position < 64) {
-          ulUnicodeRange2 |= 1 << position - 32;
-        } else if (position < 96) {
-          ulUnicodeRange3 |= 1 << position - 64;
-        } else if (position < 123) {
-          ulUnicodeRange4 |= 1 << position - 96;
-        } else {
-          error('Unicode ranges Bits > 123 are reserved for internal usage');
-        }
-      }
-    } else {
-      // TODO
-      firstCharIndex = 0;
-      lastCharIndex = 255;
-    }
-
-    var bbox = properties.bbox || [0, 0, 0, 0];
-    var unitsPerEm = (override.unitsPerEm ||
-                      1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]);
-
-    // if the font units differ to the PDF glyph space units
-    // then scale up the values
-    var scale = (properties.ascentScaled ? 1.0 :
-                 unitsPerEm / PDF_GLYPH_SPACE_UNITS);
-
-    var typoAscent = (override.ascent ||
-                      Math.round(scale * (properties.ascent || bbox[3])));
-    var typoDescent = (override.descent ||
-                       Math.round(scale * (properties.descent || bbox[1])));
-    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {
-      typoDescent = -typoDescent; // fixing incorrect descent
-    }
-    var winAscent = override.yMax || typoAscent;
-    var winDescent = -override.yMin || -typoDescent;
-
-    return '\x00\x03' + // version
-           '\x02\x24' + // xAvgCharWidth
-           '\x01\xF4' + // usWeightClass
-           '\x00\x05' + // usWidthClass
-           '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
-           '\x02\x8A' + // ySubscriptXSize
-           '\x02\xBB' + // ySubscriptYSize
-           '\x00\x00' + // ySubscriptXOffset
-           '\x00\x8C' + // ySubscriptYOffset
-           '\x02\x8A' + // ySuperScriptXSize
-           '\x02\xBB' + // ySuperScriptYSize
-           '\x00\x00' + // ySuperScriptXOffset
-           '\x01\xDF' + // ySuperScriptYOffset
-           '\x00\x31' + // yStrikeOutSize
-           '\x01\x02' + // yStrikeOutPosition
-           '\x00\x00' + // sFamilyClass
-           '\x00\x00\x06' +
-           String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
-           '\x00\x00\x00\x00\x00\x00' + // Panose
-           string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
-           string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
-           string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
-           string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
-           '\x2A\x32\x31\x2A' + // achVendID
-           string16(properties.italicAngle ? 1 : 0) + // fsSelection
-           string16(firstCharIndex ||
-                    properties.firstChar) + // usFirstCharIndex
-           string16(lastCharIndex || properties.lastChar) +  // usLastCharIndex
-           string16(typoAscent) + // sTypoAscender
-           string16(typoDescent) + // sTypoDescender
-           '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
-           string16(winAscent) + // usWinAscent
-           string16(winDescent) + // usWinDescent
-           '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
-           '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
-           string16(properties.xHeight) + // sxHeight
-           string16(properties.capHeight) + // sCapHeight
-           string16(0) + // usDefaultChar
-           string16(firstCharIndex || properties.firstChar) + // usBreakChar
-           '\x00\x03';  // usMaxContext
-  }
-
-  function createPostTable(properties) {
-    var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
-    return ('\x00\x03\x00\x00' + // Version number
-            string32(angle) + // italicAngle
-            '\x00\x00' + // underlinePosition
-            '\x00\x00' + // underlineThickness
-            string32(properties.fixedPitch) + // isFixedPitch
-            '\x00\x00\x00\x00' + // minMemType42
-            '\x00\x00\x00\x00' + // maxMemType42
-            '\x00\x00\x00\x00' + // minMemType1
-            '\x00\x00\x00\x00');  // maxMemType1
-  }
-
-  function createNameTable(name, proto) {
-    if (!proto) {
-      proto = [[], []]; // no strings and unicode strings
-    }
-
-    var strings = [
-      proto[0][0] || 'Original licence',  // 0.Copyright
-      proto[0][1] || name,                // 1.Font family
-      proto[0][2] || 'Unknown',           // 2.Font subfamily (font weight)
-      proto[0][3] || 'uniqueID',          // 3.Unique ID
-      proto[0][4] || name,                // 4.Full font name
-      proto[0][5] || 'Version 0.11',      // 5.Version
-      proto[0][6] || '',                  // 6.Postscript name
-      proto[0][7] || 'Unknown',           // 7.Trademark
-      proto[0][8] || 'Unknown',           // 8.Manufacturer
-      proto[0][9] || 'Unknown'            // 9.Designer
-    ];
-
-    // Mac want 1-byte per character strings while Windows want
-    // 2-bytes per character, so duplicate the names table
-    var stringsUnicode = [];
-    var i, ii, j, jj, str;
-    for (i = 0, ii = strings.length; i < ii; i++) {
-      str = proto[1][i] || strings[i];
-
-      var strBufUnicode = [];
-      for (j = 0, jj = str.length; j < jj; j++) {
-        strBufUnicode.push(string16(str.charCodeAt(j)));
-      }
-      stringsUnicode.push(strBufUnicode.join(''));
-    }
-
-    var names = [strings, stringsUnicode];
-    var platforms = ['\x00\x01', '\x00\x03'];
-    var encodings = ['\x00\x00', '\x00\x01'];
-    var languages = ['\x00\x00', '\x04\x09'];
-
-    var namesRecordCount = strings.length * platforms.length;
-    var nameTable =
-      '\x00\x00' +                           // format
-      string16(namesRecordCount) +           // Number of names Record
-      string16(namesRecordCount * 12 + 6);   // Storage
-
-    // Build the name records field
-    var strOffset = 0;
-    for (i = 0, ii = platforms.length; i < ii; i++) {
-      var strs = names[i];
-      for (j = 0, jj = strs.length; j < jj; j++) {
-        str = strs[j];
-        var nameRecord =
-          platforms[i] + // platform ID
-          encodings[i] + // encoding ID
-          languages[i] + // language ID
-          string16(j) + // name ID
-          string16(str.length) +
-          string16(strOffset);
-        nameTable += nameRecord;
-        strOffset += str.length;
-      }
-    }
-
-    nameTable += strings.join('') + stringsUnicode.join('');
-    return nameTable;
-  }
-
-  Font.prototype = {
-    name: null,
-    font: null,
-    mimetype: null,
-    encoding: null,
-    get renderer() {
-      var renderer = FontRendererFactory.create(this);
-      return shadow(this, 'renderer', renderer);
-    },
-
-    exportData: function Font_exportData() {
-      var data = {};
-      for (var i in this) {
-        if (this.hasOwnProperty(i)) {
-          data[i] = this[i];
-        }
-      }
-      return data;
-    },
-
-    checkAndRepair: function Font_checkAndRepair(name, font, properties) {
-      function readTableEntry(file) {
-        var tag = bytesToString(file.getBytes(4));
-
-        var checksum = file.getInt32();
-        var offset = file.getInt32() >>> 0;
-        var length = file.getInt32() >>> 0;
-
-        // Read the table associated data
-        var previousPosition = file.pos;
-        file.pos = file.start ? file.start : 0;
-        file.skip(offset);
-        var data = file.getBytes(length);
-        file.pos = previousPosition;
-
-        if (tag === 'head') {
-          // clearing checksum adjustment
-          data[8] = data[9] = data[10] = data[11] = 0;
-          data[17] |= 0x20; //Set font optimized for cleartype flag
-        }
-
-        return {
-          tag: tag,
-          checksum: checksum,
-          length: length,
-          offset: offset,
-          data: data
-        };
-      }
-
-      function readOpenTypeHeader(ttf) {
-        return {
-          version: bytesToString(ttf.getBytes(4)),
-          numTables: ttf.getUint16(),
-          searchRange: ttf.getUint16(),
-          entrySelector: ttf.getUint16(),
-          rangeShift: ttf.getUint16()
-        };
-      }
-
-      /**
-       * Read the appropriate subtable from the cmap according to 9.6.6.4 from
-       * PDF spec
-       */
-      function readCmapTable(cmap, font, isSymbolicFont) {
-        var segment;
-        var start = (font.start ? font.start : 0) + cmap.offset;
-        font.pos = start;
-
-        var version = font.getUint16();
-        var numTables = font.getUint16();
-
-        var potentialTable;
-        var canBreak = false;
-        // There's an order of preference in terms of which cmap subtable to
-        // use:
-        // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table
-        // - symbolic fonts the preference is a 3,0 table then a 1,0 table
-        // The following takes advantage of the fact that the tables are sorted
-        // to work.
-        for (var i = 0; i < numTables; i++) {
-          var platformId = font.getUint16();
-          var encodingId = font.getUint16();
-          var offset = font.getInt32() >>> 0;
-          var useTable = false;
-
-          if (platformId === 0 && encodingId === 0) {
-            useTable = true;
-            // Continue the loop since there still may be a higher priority
-            // table.
-          } else if (platformId === 1 && encodingId === 0) {
-            useTable = true;
-            // Continue the loop since there still may be a higher priority
-            // table.
-          } else if (platformId === 3 && encodingId === 1 &&
-                     (!isSymbolicFont || !potentialTable)) {
-            useTable = true;
-            if (!isSymbolicFont) {
-              canBreak = true;
-            }
-          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {
-            useTable = true;
-            canBreak = true;
-          }
-
-          if (useTable) {
-            potentialTable = {
-              platformId: platformId,
-              encodingId: encodingId,
-              offset: offset
-            };
-          }
-          if (canBreak) {
-            break;
-          }
-        }
-
-        if (potentialTable) {
-          font.pos = start + potentialTable.offset;
-        }
-        if (!potentialTable || font.peekByte() === -1) {
-          warn('Could not find a preferred cmap table.');
-          return {
-            platformId: -1,
-            encodingId: -1,
-            mappings: [],
-            hasShortCmap: false
-          };
-        }
-
-        var format = font.getUint16();
-        var length = font.getUint16();
-        var language = font.getUint16();
-
-        var hasShortCmap = false;
-        var mappings = [];
-        var j, glyphId;
-
-        // TODO(mack): refactor this cmap subtable reading logic out
-        if (format === 0) {
-          for (j = 0; j < 256; j++) {
-            var index = font.getByte();
-            if (!index) {
-              continue;
-            }
-            mappings.push({
-              charCode: j,
-              glyphId: index
-            });
-          }
-          hasShortCmap = true;
-        } else if (format === 4) {
-          // re-creating the table in format 4 since the encoding
-          // might be changed
-          var segCount = (font.getUint16() >> 1);
-          font.getBytes(6); // skipping range fields
-          var segIndex, segments = [];
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segments.push({ end: font.getUint16() });
-          }
-          font.getUint16();
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segments[segIndex].start = font.getUint16();
-          }
-
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segments[segIndex].delta = font.getUint16();
-          }
-
-          var offsetsCount = 0;
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segment = segments[segIndex];
-            var rangeOffset = font.getUint16();
-            if (!rangeOffset) {
-              segment.offsetIndex = -1;
-              continue;
-            }
-
-            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
-            segment.offsetIndex = offsetIndex;
-            offsetsCount = Math.max(offsetsCount, offsetIndex +
-                                    segment.end - segment.start + 1);
-          }
-
-          var offsets = [];
-          for (j = 0; j < offsetsCount; j++) {
-            offsets.push(font.getUint16());
-          }
-
-          for (segIndex = 0; segIndex < segCount; segIndex++) {
-            segment = segments[segIndex];
-            start = segment.start;
-            var end = segment.end;
-            var delta = segment.delta;
-            offsetIndex = segment.offsetIndex;
-
-            for (j = start; j <= end; j++) {
-              if (j === 0xFFFF) {
-                continue;
-              }
-
-              glyphId = (offsetIndex < 0 ?
-                         j : offsets[offsetIndex + j - start]);
-              glyphId = (glyphId + delta) & 0xFFFF;
-              if (glyphId === 0) {
-                continue;
-              }
-              mappings.push({
-                charCode: j,
-                glyphId: glyphId
-              });
-            }
-          }
-        } else if (format === 6) {
-          // Format 6 is a 2-bytes dense mapping, which means the font data
-          // lives glue together even if they are pretty far in the unicode
-          // table. (This looks weird, so I can have missed something), this
-          // works on Linux but seems to fails on Mac so let's rewrite the
-          // cmap table to a 3-1-4 style
-          var firstCode = font.getUint16();
-          var entryCount = font.getUint16();
-
-          for (j = 0; j < entryCount; j++) {
-            glyphId = font.getUint16();
-            var charCode = firstCode + j;
-
-            mappings.push({
-              charCode: charCode,
-              glyphId: glyphId
-            });
-          }
-        } else {
-          error('cmap table has unsupported format: ' + format);
-        }
-
-        // removing duplicate entries
-        mappings.sort(function (a, b) {
-          return a.charCode - b.charCode;
-        });
-        for (i = 1; i < mappings.length; i++) {
-          if (mappings[i - 1].charCode === mappings[i].charCode) {
-            mappings.splice(i, 1);
-            i--;
-          }
-        }
-
-        return {
-          platformId: potentialTable.platformId,
-          encodingId: potentialTable.encodingId,
-          mappings: mappings,
-          hasShortCmap: hasShortCmap
-        };
-      }
-
-      function sanitizeMetrics(font, header, metrics, numGlyphs) {
-        if (!header) {
-          if (metrics) {
-            metrics.data = null;
-          }
-          return;
-        }
-
-        font.pos = (font.start ? font.start : 0) + header.offset;
-        font.pos += header.length - 2;
-        var numOfMetrics = font.getUint16();
-
-        if (numOfMetrics > numGlyphs) {
-          info('The numOfMetrics (' + numOfMetrics + ') should not be ' +
-               'greater than the numGlyphs (' + numGlyphs + ')');
-          // Reduce numOfMetrics if it is greater than numGlyphs
-          numOfMetrics = numGlyphs;
-          header.data[34] = (numOfMetrics & 0xff00) >> 8;
-          header.data[35] = numOfMetrics & 0x00ff;
-        }
-
-        var numOfSidebearings = numGlyphs - numOfMetrics;
-        var numMissing = numOfSidebearings -
-          ((metrics.length - numOfMetrics * 4) >> 1);
-
-        if (numMissing > 0) {
-          // For each missing glyph, we set both the width and lsb to 0 (zero).
-          // Since we need to add two properties for each glyph, this explains
-          // the use of |numMissing * 2| when initializing the typed array.
-          var entries = new Uint8Array(metrics.length + numMissing * 2);
-          entries.set(metrics.data);
-          metrics.data = entries;
-        }
-      }
-
-      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart,
-                             hintsValid) {
-        if (sourceEnd - sourceStart <= 12) {
-          // glyph with data less than 12 is invalid one
-          return 0;
-        }
-        var glyf = source.subarray(sourceStart, sourceEnd);
-        var contoursCount = (glyf[0] << 8) | glyf[1];
-        if (contoursCount & 0x8000) {
-          // complex glyph, writing as is
-          dest.set(glyf, destStart);
-          return glyf.length;
-        }
-
-        var i, j = 10, flagsCount = 0;
-        for (i = 0; i < contoursCount; i++) {
-          var endPoint = (glyf[j] << 8) | glyf[j + 1];
-          flagsCount = endPoint + 1;
-          j += 2;
-        }
-        // skipping instructions
-        var instructionsStart = j;
-        var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
-        j += 2 + instructionsLength;
-        var instructionsEnd = j;
-        // validating flags
-        var coordinatesLength = 0;
-        for (i = 0; i < flagsCount; i++) {
-          var flag = glyf[j++];
-          if (flag & 0xC0) {
-            // reserved flags must be zero, cleaning up
-            glyf[j - 1] = flag & 0x3F;
-          }
-          var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
-                         ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
-          coordinatesLength += xyLength;
-          if (flag & 8) {
-            var repeat = glyf[j++];
-            i += repeat;
-            coordinatesLength += repeat * xyLength;
-          }
-        }
-        // glyph without coordinates will be rejected
-        if (coordinatesLength === 0) {
-          return 0;
-        }
-        var glyphDataLength = j + coordinatesLength;
-        if (glyphDataLength > glyf.length) {
-          // not enough data for coordinates
-          return 0;
-        }
-        if (!hintsValid && instructionsLength > 0) {
-          dest.set(glyf.subarray(0, instructionsStart), destStart);
-          dest.set([0, 0], destStart + instructionsStart);
-          dest.set(glyf.subarray(instructionsEnd, glyphDataLength),
-                   destStart + instructionsStart + 2);
-          glyphDataLength -= instructionsLength;
-          if (glyf.length - glyphDataLength > 3) {
-            glyphDataLength = (glyphDataLength + 3) & ~3;
-          }
-          return glyphDataLength;
-        }
-        if (glyf.length - glyphDataLength > 3) {
-          // truncating and aligning to 4 bytes the long glyph data
-          glyphDataLength = (glyphDataLength + 3) & ~3;
-          dest.set(glyf.subarray(0, glyphDataLength), destStart);
-          return glyphDataLength;
-        }
-        // glyph data is fine
-        dest.set(glyf, destStart);
-        return glyf.length;
-      }
-
-      function sanitizeHead(head, numGlyphs, locaLength) {
-        var data = head.data;
-
-        // Validate version:
-        // Should always be 0x00010000
-        var version = int32(data[0], data[1], data[2], data[3]);
-        if (version >> 16 !== 1) {
-          info('Attempting to fix invalid version in head table: ' + version);
-          data[0] = 0;
-          data[1] = 1;
-          data[2] = 0;
-          data[3] = 0;
-        }
-
-        var indexToLocFormat = int16(data[50], data[51]);
-        if (indexToLocFormat < 0 || indexToLocFormat > 1) {
-          info('Attempting to fix invalid indexToLocFormat in head table: ' +
-               indexToLocFormat);
-
-          // The value of indexToLocFormat should be 0 if the loca table
-          // consists of short offsets, and should be 1 if the loca table
-          // consists of long offsets.
-          //
-          // The number of entries in the loca table should be numGlyphs + 1.
-          //
-          // Using this information, we can work backwards to deduce if the
-          // size of each offset in the loca table, and thus figure out the
-          // appropriate value for indexToLocFormat.
-
-          var numGlyphsPlusOne = numGlyphs + 1;
-          if (locaLength === numGlyphsPlusOne << 1) {
-            // 0x0000 indicates the loca table consists of short offsets
-            data[50] = 0;
-            data[51] = 0;
-          } else if (locaLength === numGlyphsPlusOne << 2) {
-            // 0x0001 indicates the loca table consists of long offsets
-            data[50] = 0;
-            data[51] = 1;
-          } else {
-            warn('Could not fix indexToLocFormat: ' + indexToLocFormat);
-          }
-        }
-      }
-
-      function sanitizeGlyphLocations(loca, glyf, numGlyphs,
-                                      isGlyphLocationsLong, hintsValid,
-                                      dupFirstEntry) {
-        var itemSize, itemDecode, itemEncode;
-        if (isGlyphLocationsLong) {
-          itemSize = 4;
-          itemDecode = function fontItemDecodeLong(data, offset) {
-            return (data[offset] << 24) | (data[offset + 1] << 16) |
-                   (data[offset + 2] << 8) | data[offset + 3];
-          };
-          itemEncode = function fontItemEncodeLong(data, offset, value) {
-            data[offset] = (value >>> 24) & 0xFF;
-            data[offset + 1] = (value >> 16) & 0xFF;
-            data[offset + 2] = (value >> 8) & 0xFF;
-            data[offset + 3] = value & 0xFF;
-          };
-        } else {
-          itemSize = 2;
-          itemDecode = function fontItemDecode(data, offset) {
-            return (data[offset] << 9) | (data[offset + 1] << 1);
-          };
-          itemEncode = function fontItemEncode(data, offset, value) {
-            data[offset] = (value >> 9) & 0xFF;
-            data[offset + 1] = (value >> 1) & 0xFF;
-          };
-        }
-        var locaData = loca.data;
-        var locaDataSize = itemSize * (1 + numGlyphs);
-        // is loca.data too short or long?
-        if (locaData.length !== locaDataSize) {
-          locaData = new Uint8Array(locaDataSize);
-          locaData.set(loca.data.subarray(0, locaDataSize));
-          loca.data = locaData;
-        }
-        // removing the invalid glyphs
-        var oldGlyfData = glyf.data;
-        var oldGlyfDataLength = oldGlyfData.length;
-        var newGlyfData = new Uint8Array(oldGlyfDataLength);
-        var startOffset = itemDecode(locaData, 0);
-        var writeOffset = 0;
-        var missingGlyphData = {};
-        itemEncode(locaData, 0, writeOffset);
-        var i, j;
-        for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
-          var endOffset = itemDecode(locaData, j);
-          if (endOffset > oldGlyfDataLength &&
-              ((oldGlyfDataLength + 3) & ~3) === endOffset) {
-            // Aspose breaks fonts by aligning the glyphs to the qword, but not
-            // the glyf table size, which makes last glyph out of range.
-            endOffset = oldGlyfDataLength;
-          }
-          if (endOffset > oldGlyfDataLength) {
-            // glyph end offset points outside glyf data, rejecting the glyph
-            itemEncode(locaData, j, writeOffset);
-            startOffset = endOffset;
-            continue;
-          }
-
-          if (startOffset === endOffset) {
-            missingGlyphData[i] = true;
-          }
-
-          var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
-                                        newGlyfData, writeOffset, hintsValid);
-          writeOffset += newLength;
-          itemEncode(locaData, j, writeOffset);
-          startOffset = endOffset;
-        }
-
-        if (writeOffset === 0) {
-          // glyf table cannot be empty -- redoing the glyf and loca tables
-          // to have single glyph with one point
-          var simpleGlyph = new Uint8Array(
-            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
-          for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
-            itemEncode(locaData, j, simpleGlyph.length);
-          }
-          glyf.data = simpleGlyph;
-          return missingGlyphData;
-        }
-
-        if (dupFirstEntry) {
-          var firstEntryLength = itemDecode(locaData, itemSize);
-          if (newGlyfData.length > firstEntryLength + writeOffset) {
-            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
-          } else {
-            glyf.data = new Uint8Array(firstEntryLength + writeOffset);
-            glyf.data.set(newGlyfData.subarray(0, writeOffset));
-          }
-          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
-          itemEncode(loca.data, locaData.length - itemSize,
-                     writeOffset + firstEntryLength);
-        } else {
-          glyf.data = newGlyfData.subarray(0, writeOffset);
-        }
-        return missingGlyphData;
-      }
-
-      function readPostScriptTable(post, properties, maxpNumGlyphs) {
-        var start = (font.start ? font.start : 0) + post.offset;
-        font.pos = start;
-
-        var length = post.length, end = start + length;
-        var version = font.getInt32();
-        // skip rest to the tables
-        font.getBytes(28);
-
-        var glyphNames;
-        var valid = true;
-        var i;
-
-        switch (version) {
-          case 0x00010000:
-            glyphNames = MacStandardGlyphOrdering;
-            break;
-          case 0x00020000:
-            var numGlyphs = font.getUint16();
-            if (numGlyphs !== maxpNumGlyphs) {
-              valid = false;
-              break;
-            }
-            var glyphNameIndexes = [];
-            for (i = 0; i < numGlyphs; ++i) {
-              var index = font.getUint16();
-              if (index >= 32768) {
-                valid = false;
-                break;
-              }
-              glyphNameIndexes.push(index);
-            }
-            if (!valid) {
-              break;
-            }
-            var customNames = [];
-            var strBuf = [];
-            while (font.pos < end) {
-              var stringLength = font.getByte();
-              strBuf.length = stringLength;
-              for (i = 0; i < stringLength; ++i) {
-                strBuf[i] = String.fromCharCode(font.getByte());
-              }
-              customNames.push(strBuf.join(''));
-            }
-            glyphNames = [];
-            for (i = 0; i < numGlyphs; ++i) {
-              var j = glyphNameIndexes[i];
-              if (j < 258) {
-                glyphNames.push(MacStandardGlyphOrdering[j]);
-                continue;
-              }
-              glyphNames.push(customNames[j - 258]);
-            }
-            break;
-          case 0x00030000:
-            break;
-          default:
-            warn('Unknown/unsupported post table version ' + version);
-            valid = false;
-            if (properties.defaultEncoding) {
-              glyphNames = properties.defaultEncoding;
-            }
-            break;
-        }
-        properties.glyphNames = glyphNames;
-        return valid;
-      }
-
-      function readNameTable(nameTable) {
-        var start = (font.start ? font.start : 0) + nameTable.offset;
-        font.pos = start;
-
-        var names = [[], []];
-        var length = nameTable.length, end = start + length;
-        var format = font.getUint16();
-        var FORMAT_0_HEADER_LENGTH = 6;
-        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {
-          // unsupported name table format or table "too" small
-          return names;
-        }
-        var numRecords = font.getUint16();
-        var stringsStart = font.getUint16();
-        var records = [];
-        var NAME_RECORD_LENGTH = 12;
-        var i, ii;
-
-        for (i = 0; i < numRecords &&
-                        font.pos + NAME_RECORD_LENGTH <= end; i++) {
-          var r = {
-            platform: font.getUint16(),
-            encoding: font.getUint16(),
-            language: font.getUint16(),
-            name: font.getUint16(),
-            length: font.getUint16(),
-            offset: font.getUint16()
-          };
-          // using only Macintosh and Windows platform/encoding names
-          if ((r.platform === 1 && r.encoding === 0 && r.language === 0) ||
-              (r.platform === 3 && r.encoding === 1 && r.language === 0x409)) {
-            records.push(r);
-          }
-        }
-        for (i = 0, ii = records.length; i < ii; i++) {
-          var record = records[i];
-          var pos = start + stringsStart + record.offset;
-          if (pos + record.length > end) {
-            continue; // outside of name table, ignoring
-          }
-          font.pos = pos;
-          var nameIndex = record.name;
-          if (record.encoding) {
-            // unicode
-            var str = '';
-            for (var j = 0, jj = record.length; j < jj; j += 2) {
-              str += String.fromCharCode(font.getUint16());
-            }
-            names[1][nameIndex] = str;
-          } else {
-            names[0][nameIndex] = bytesToString(font.getBytes(record.length));
-          }
-        }
-        return names;
-      }
-
-      var TTOpsStackDeltas = [
-        0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5,
-        -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1,
-        1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1,
-        0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2,
-        0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1,
-        -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1,
-        -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1,
-        -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];
-        // 0xC0-DF == -1 and 0xE0-FF == -2
-
-      function sanitizeTTProgram(table, ttContext) {
-        var data = table.data;
-        var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0;
-        var stack = [];
-        var callstack = [];
-        var functionsCalled = [];
-        var tooComplexToFollowFunctions =
-          ttContext.tooComplexToFollowFunctions;
-        var inFDEF = false, ifLevel = 0, inELSE = 0;
-        for (var ii = data.length; i < ii;) {
-          var op = data[i++];
-          // The TrueType instruction set docs can be found at
-          // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html
-          if (op === 0x40) { // NPUSHB - pushes n bytes
-            n = data[i++];
-            if (inFDEF || inELSE) {
-              i += n;
-            } else {
-              for (j = 0; j < n; j++) {
-                stack.push(data[i++]);
-              }
-            }
-          } else if (op === 0x41) { // NPUSHW - pushes n words
-            n = data[i++];
-            if (inFDEF || inELSE) {
-              i += n * 2;
-            } else {
-              for (j = 0; j < n; j++) {
-                b = data[i++];
-                stack.push((b << 8) | data[i++]);
-              }
-            }
-          } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes
-            n = op - 0xB0 + 1;
-            if (inFDEF || inELSE) {
-              i += n;
-            } else {
-              for (j = 0; j < n; j++) {
-                stack.push(data[i++]);
-              }
-            }
-          } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words
-            n = op - 0xB8 + 1;
-            if (inFDEF || inELSE) {
-              i += n * 2;
-            } else {
-              for (j = 0; j < n; j++) {
-                b = data[i++];
-                stack.push((b << 8) | data[i++]);
-              }
-            }
-          } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL
-            if (!inFDEF && !inELSE) {
-              // collecting inforamtion about which functions are used
-              funcId = stack[stack.length - 1];
-              ttContext.functionsUsed[funcId] = true;
-              if (funcId in ttContext.functionsStackDeltas) {
-                stack.length += ttContext.functionsStackDeltas[funcId];
-              } else if (funcId in ttContext.functionsDefined &&
-                         functionsCalled.indexOf(funcId) < 0) {
-                callstack.push({data: data, i: i, stackTop: stack.length - 1});
-                functionsCalled.push(funcId);
-                pc = ttContext.functionsDefined[funcId];
-                if (!pc) {
-                  warn('TT: CALL non-existent function');
-                  ttContext.hintsValid = false;
-                  return;
-                }
-                data = pc.data;
-                i = pc.i;
-              }
-            }
-          } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF
-            if (inFDEF || inELSE) {
-              warn('TT: nested FDEFs not allowed');
-              tooComplexToFollowFunctions = true;
-            }
-            inFDEF = true;
-            // collecting inforamtion about which functions are defined
-            lastDeff = i;
-            funcId = stack.pop();
-            ttContext.functionsDefined[funcId] = {data: data, i: i};
-          } else if (op === 0x2D) { // ENDF - end of function
-            if (inFDEF) {
-              inFDEF = false;
-              lastEndf = i;
-            } else {
-              pc = callstack.pop();
-              if (!pc) {
-                warn('TT: ENDF bad stack');
-                ttContext.hintsValid = false;
-                return;
-              }
-              funcId = functionsCalled.pop();
-              data = pc.data;
-              i = pc.i;
-              ttContext.functionsStackDeltas[funcId] =
-                stack.length - pc.stackTop;
-            }
-          } else if (op === 0x89) { // IDEF - instruction definition
-            if (inFDEF || inELSE) {
-              warn('TT: nested IDEFs not allowed');
-              tooComplexToFollowFunctions = true;
-            }
-            inFDEF = true;
-            // recording it as a function to track ENDF
-            lastDeff = i;
-          } else if (op === 0x58) { // IF
-            ++ifLevel;
-          } else if (op === 0x1B) { // ELSE
-            inELSE = ifLevel;
-          } else if (op === 0x59) { // EIF
-            if (inELSE === ifLevel) {
-              inELSE = 0;
-            }
-            --ifLevel;
-          } else if (op === 0x1C) { // JMPR
-            if (!inFDEF && !inELSE) {
-              var offset = stack[stack.length - 1];
-              // only jumping forward to prevent infinite loop
-              if (offset > 0) {
-                i += offset - 1;
-              }
-            }
-          }
-          // Adjusting stack not extactly, but just enough to get function id
-          if (!inFDEF && !inELSE) {
-            var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] :
-              op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0;
-            if (op >= 0x71 && op <= 0x75) {
-              n = stack.pop();
-              if (n === n) {
-                stackDelta = -n * 2;
-              }
-            }
-            while (stackDelta < 0 && stack.length > 0) {
-              stack.pop();
-              stackDelta++;
-            }
-            while (stackDelta > 0) {
-              stack.push(NaN); // pushing any number into stack
-              stackDelta--;
-            }
-          }
-        }
-        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;
-        var content = [data];
-        if (i > data.length) {
-          content.push(new Uint8Array(i - data.length));
-        }
-        if (lastDeff > lastEndf) {
-          warn('TT: complementing a missing function tail');
-          // new function definition started, but not finished
-          // complete function by [CLEAR, ENDF]
-          content.push(new Uint8Array([0x22, 0x2D]));
-        }
-        foldTTTable(table, content);
-      }
-
-      function checkInvalidFunctions(ttContext, maxFunctionDefs) {
-        if (ttContext.tooComplexToFollowFunctions) {
-          return;
-        }
-        if (ttContext.functionsDefined.length > maxFunctionDefs) {
-          warn('TT: more functions defined than expected');
-          ttContext.hintsValid = false;
-          return;
-        }
-        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {
-          if (j > maxFunctionDefs) {
-            warn('TT: invalid function id: ' + j);
-            ttContext.hintsValid = false;
-            return;
-          }
-          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {
-            warn('TT: undefined function: ' + j);
-            ttContext.hintsValid = false;
-            return;
-          }
-        }
-      }
-
-      function foldTTTable(table, content) {
-        if (content.length > 1) {
-          // concatenating the content items
-          var newLength = 0;
-          var j, jj;
-          for (j = 0, jj = content.length; j < jj; j++) {
-            newLength += content[j].length;
-          }
-          newLength = (newLength + 3) & ~3;
-          var result = new Uint8Array(newLength);
-          var pos = 0;
-          for (j = 0, jj = content.length; j < jj; j++) {
-            result.set(content[j], pos);
-            pos += content[j].length;
-          }
-          table.data = result;
-          table.length = newLength;
-        }
-      }
-
-      function sanitizeTTPrograms(fpgm, prep, cvt) {
-        var ttContext = {
-          functionsDefined: [],
-          functionsUsed: [],
-          functionsStackDeltas: [],
-          tooComplexToFollowFunctions: false,
-          hintsValid: true
-        };
-        if (fpgm) {
-          sanitizeTTProgram(fpgm, ttContext);
-        }
-        if (prep) {
-          sanitizeTTProgram(prep, ttContext);
-        }
-        if (fpgm) {
-          checkInvalidFunctions(ttContext, maxFunctionDefs);
-        }
-        if (cvt && (cvt.length & 1)) {
-          var cvtData = new Uint8Array(cvt.length + 1);
-          cvtData.set(cvt.data);
-          cvt.data = cvtData;
-        }
-        return ttContext.hintsValid;
-      }
-
-      // The following steps modify the original font data, making copy
-      font = new Stream(new Uint8Array(font.getBytes()));
-
-      var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp',
-        'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF '];
-
-      var header = readOpenTypeHeader(font);
-      var numTables = header.numTables;
-      var cff, cffFile;
-
-      var tables = { 'OS/2': null, cmap: null, head: null, hhea: null,
-                     hmtx: null, maxp: null, name: null, post: null };
-      var table;
-      for (var i = 0; i < numTables; i++) {
-        table = readTableEntry(font);
-        if (VALID_TABLES.indexOf(table.tag) < 0) {
-          continue; // skipping table if it's not a required or optional table
-        }
-        if (table.length === 0) {
-          continue; // skipping empty tables
-        }
-        tables[table.tag] = table;
-      }
-
-      var isTrueType = !tables['CFF '];
-      if (!isTrueType) {
-        // OpenType font
-        if (header.version === 'OTTO' ||
-            !tables.head || !tables.hhea || !tables.maxp || !tables.post) {
-          // no major tables: throwing everything at CFFFont
-          cffFile = new Stream(tables['CFF '].data);
-          cff = new CFFFont(cffFile, properties);
-
-          return this.convert(name, cff, properties);
-        }
-
-        delete tables.glyf;
-        delete tables.loca;
-        delete tables.fpgm;
-        delete tables.prep;
-        delete tables['cvt '];
-        this.isOpenType = true;
-      } else {
-        if (!tables.glyf || !tables.loca) {
-          error('Required "glyf" or "loca" tables are not found');
-        }
-        this.isOpenType = false;
-      }
-
-      if (!tables.maxp) {
-        error('Required "maxp" table is not found');
-      }
-
-      font.pos = (font.start || 0) + tables.maxp.offset;
-      var version = font.getInt32();
-      var numGlyphs = font.getUint16();
-      var maxFunctionDefs = 0;
-      if (version >= 0x00010000 && tables.maxp.length >= 22) {
-        // maxZones can be invalid
-        font.pos += 8;
-        var maxZones = font.getUint16();
-        if (maxZones > 2) { // reset to 2 if font has invalid maxZones
-          tables.maxp.data[14] = 0;
-          tables.maxp.data[15] = 2;
-        }
-        font.pos += 4;
-        maxFunctionDefs = font.getUint16();
-      }
-
-      var dupFirstEntry = false;
-      if (properties.type === 'CIDFontType2' && properties.toUnicode &&
-          properties.toUnicode.get(0) > '\u0000') {
-        // oracle's defect (see 3427), duplicating first entry
-        dupFirstEntry = true;
-        numGlyphs++;
-        tables.maxp.data[4] = numGlyphs >> 8;
-        tables.maxp.data[5] = numGlyphs & 255;
-      }
-
-      var hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep,
-                                          tables['cvt '], maxFunctionDefs);
-      if (!hintsValid) {
-        delete tables.fpgm;
-        delete tables.prep;
-        delete tables['cvt '];
-      }
-
-      // Ensure the hmtx table contains the advance width and
-      // sidebearings information for numGlyphs in the maxp table
-      sanitizeMetrics(font, tables.hhea, tables.hmtx, numGlyphs);
-
-      if (!tables.head) {
-        error('Required "head" table is not found');
-      }
-
-      sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);
-
-      var missingGlyphs = {};
-      if (isTrueType) {
-        var isGlyphLocationsLong = int16(tables.head.data[50],
-                                         tables.head.data[51]);
-        missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf,
-                                               numGlyphs, isGlyphLocationsLong,
-                                               hintsValid, dupFirstEntry);
-      }
-
-      if (!tables.hhea) {
-        error('Required "hhea" table is not found');
-      }
-
-      // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
-      // Sometimes it's 0. That needs to be fixed
-      if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {
-        tables.hhea.data[10] = 0xFF;
-        tables.hhea.data[11] = 0xFF;
-      }
-
-      // The 'post' table has glyphs names.
-      if (tables.post) {
-        var valid = readPostScriptTable(tables.post, properties, numGlyphs);
-        if (!valid) {
-          tables.post = null;
-        }
-      }
-
-      var charCodeToGlyphId = [], charCode, toUnicode = properties.toUnicode;
-
-      function hasGlyph(glyphId, charCode) {
-        if (!missingGlyphs[glyphId]) {
-          return true;
-        }
-        if (charCode >= 0 && toUnicode.has(charCode)) {
-          return true;
-        }
-        return false;
-      }
-
-      if (properties.type === 'CIDFontType2') {
-        var cidToGidMap = properties.cidToGidMap || [];
-        var isCidToGidMapEmpty = cidToGidMap.length === 0;
-
-        properties.cMap.forEach(function(charCode, cid) {
-          assert(cid <= 0xffff, 'Max size of CID is 65,535');
-          var glyphId = -1;
-          if (isCidToGidMapEmpty) {
-            glyphId = charCode;
-          } else if (cidToGidMap[cid] !== undefined) {
-            glyphId = cidToGidMap[cid];
-          }
-
-          if (glyphId >= 0 && glyphId < numGlyphs &&
-              hasGlyph(glyphId, charCode)) {
-            charCodeToGlyphId[charCode] = glyphId;
-          }
-        });
-        if (dupFirstEntry) {
-          charCodeToGlyphId[0] = numGlyphs - 1;
-        }
-      } else {
-        // Most of the following logic in this code branch is based on the
-        // 9.6.6.4 of the PDF spec.
-        var cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont);
-        var cmapPlatformId = cmapTable.platformId;
-        var cmapEncodingId = cmapTable.encodingId;
-        var cmapMappings = cmapTable.mappings;
-        var cmapMappingsLength = cmapMappings.length;
-        var hasEncoding = properties.differences.length ||
-                          !!properties.baseEncodingName;
-
-        // The spec seems to imply that if the font is symbolic the encoding
-        // should be ignored, this doesn't appear to work for 'preistabelle.pdf'
-        // where the the font is symbolic and it has an encoding.
-        if (hasEncoding &&
-            (cmapPlatformId === 3 && cmapEncodingId === 1 ||
-             cmapPlatformId === 1 && cmapEncodingId === 0) ||
-            (cmapPlatformId === -1 && cmapEncodingId === -1 && // Temporary hack
-             !!Encodings[properties.baseEncodingName])) {      // Temporary hack
-          // When no preferred cmap table was found and |baseEncodingName| is
-          // one of the predefined encodings, we seem to obtain a better
-          // |charCodeToGlyphId| map from the code below (fixes bug 1057544).
-          // TODO: Note that this is a hack which should be removed as soon as
-          //       we have proper support for more exotic cmap tables.
-
-          var baseEncoding = [];
-          if (properties.baseEncodingName === 'MacRomanEncoding' ||
-              properties.baseEncodingName === 'WinAnsiEncoding') {
-            baseEncoding = Encodings[properties.baseEncodingName];
-          }
-          for (charCode = 0; charCode < 256; charCode++) {
-            var glyphName;
-            if (this.differences && charCode in this.differences) {
-              glyphName = this.differences[charCode];
-            } else if (charCode in baseEncoding &&
-                       baseEncoding[charCode] !== '') {
-              glyphName = baseEncoding[charCode];
-            } else {
-              glyphName = Encodings.StandardEncoding[charCode];
-            }
-            if (!glyphName) {
-              continue;
-            }
-            var unicodeOrCharCode;
-            if (cmapPlatformId === 3 && cmapEncodingId === 1) {
-              unicodeOrCharCode = GlyphsUnicode[glyphName];
-            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {
-              // TODO: the encoding needs to be updated with mac os table.
-              unicodeOrCharCode = Encodings.MacRomanEncoding.indexOf(glyphName);
-            }
-
-            var found = false;
-            for (i = 0; i < cmapMappingsLength; ++i) {
-              if (cmapMappings[i].charCode === unicodeOrCharCode &&
-                  hasGlyph(cmapMappings[i].glyphId, unicodeOrCharCode)) {
-                charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
-                found = true;
-                break;
-              }
-            }
-            if (!found && properties.glyphNames) {
-              // Try to map using the post table. There are currently no known
-              // pdfs that this fixes.
-              var glyphId = properties.glyphNames.indexOf(glyphName);
-              if (glyphId > 0 && hasGlyph(glyphId, -1)) {
-                charCodeToGlyphId[charCode] = glyphId;
-              }
-            }
-          }
-        } else if (cmapPlatformId === 0 && cmapEncodingId === 0) {
-          // Default Unicode semantics, use the charcodes as is.
-          for (i = 0; i < cmapMappingsLength; ++i) {
-            charCodeToGlyphId[cmapMappings[i].charCode] =
-              cmapMappings[i].glyphId;
-          }
-        } else {
-          // For (3, 0) cmap tables:
-          // The charcode key being stored in charCodeToGlyphId is the lower
-          // byte of the two-byte charcodes of the cmap table since according to
-          // the spec: 'each byte from the string shall be prepended with the
-          // high byte of the range [of charcodes in the cmap table], to form
-          // a two-byte character, which shall be used to select the
-          // associated glyph description from the subtable'.
-          //
-          // For (1, 0) cmap tables:
-          // 'single bytes from the string shall be used to look up the
-          // associated glyph descriptions from the subtable'. This means
-          // charcodes in the cmap will be single bytes, so no-op since
-          // glyph.charCode & 0xFF === glyph.charCode
-          for (i = 0; i < cmapMappingsLength; ++i) {
-            charCode = cmapMappings[i].charCode & 0xFF;
-            charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
-          }
-        }
-      }
-
-      if (charCodeToGlyphId.length === 0) {
-        // defines at least one glyph
-        charCodeToGlyphId[0] = 0;
-      }
-
-      // Converting glyphs and ids into font's cmap table
-      var newMapping = adjustMapping(charCodeToGlyphId, properties);
-      this.toFontChar = newMapping.toFontChar;
-      tables.cmap = {
-        tag: 'cmap',
-        data: createCmapTable(newMapping.charCodeToGlyphId)
-      };
-
-      if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {
-        // extract some more font properties from the OpenType head and
-        // hhea tables; yMin and descent value are always negative
-        var override = {
-          unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),
-          yMax: int16(tables.head.data[42], tables.head.data[43]),
-          yMin: int16(tables.head.data[38], tables.head.data[39]) - 0x10000,
-          ascent: int16(tables.hhea.data[4], tables.hhea.data[5]),
-          descent: int16(tables.hhea.data[6], tables.hhea.data[7]) - 0x10000
-        };
-
-        tables['OS/2'] = {
-          tag: 'OS/2',
-          data: createOS2Table(properties, newMapping.charCodeToGlyphId,
-                               override)
-        };
-      }
-
-      // Rewrite the 'post' table if needed
-      if (!tables.post) {
-        tables.post = {
-          tag: 'post',
-          data: createPostTable(properties)
-        };
-      }
-
-      if (!isTrueType) {
-        try {
-          // Trying to repair CFF file
-          cffFile = new Stream(tables['CFF '].data);
-          var parser = new CFFParser(cffFile, properties);
-          cff = parser.parse();
-          var compiler = new CFFCompiler(cff);
-          tables['CFF '].data = compiler.compile();
-        } catch (e) {
-          warn('Failed to compile font ' + properties.loadedName);
-        }
-      }
-
-      // Re-creating 'name' table
-      if (!tables.name) {
-        tables.name = {
-          tag: 'name',
-          data: createNameTable(this.name)
-        };
-      } else {
-        // ... using existing 'name' table as prototype
-        var namePrototype = readNameTable(tables.name);
-        tables.name.data = createNameTable(name, namePrototype);
-      }
-
-      var builder = new OpenTypeFileBuilder(header.version);
-      for (var tableTag in tables) {
-        builder.addTable(tableTag, tables[tableTag].data);
-      }
-      return builder.toArray();
-    },
-
-    convert: function Font_convert(fontName, font, properties) {
-      // TODO: Check the charstring widths to determine this.
-      properties.fixedPitch = false;
-
-      var mapping = font.getGlyphMapping(properties);
-      var newMapping = adjustMapping(mapping, properties);
-      this.toFontChar = newMapping.toFontChar;
-      var numGlyphs = font.numGlyphs;
-
-      function getCharCodes(charCodeToGlyphId, glyphId) {
-        var charCodes = null;
-        for (var charCode in charCodeToGlyphId) {
-          if (glyphId === charCodeToGlyphId[charCode]) {
-            if (!charCodes) {
-              charCodes = [];
-            }
-            charCodes.push(charCode | 0);
-          }
-        }
-        return charCodes;
-      }
-
-      function createCharCode(charCodeToGlyphId, glyphId) {
-        for (var charCode in charCodeToGlyphId) {
-          if (glyphId === charCodeToGlyphId[charCode]) {
-            return charCode | 0;
-          }
-        }
-        newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] =
-            glyphId;
-        return newMapping.nextAvailableFontCharCode++;
-      }
-
-      var seacs = font.seacs;
-      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {
-        var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX;
-        var charset = font.getCharset();
-        var seacMap = Object.create(null);
-        for (var glyphId in seacs) {
-          glyphId |= 0;
-          var seac = seacs[glyphId];
-          var baseGlyphName = Encodings.StandardEncoding[seac[2]];
-          var accentGlyphName = Encodings.StandardEncoding[seac[3]];
-          var baseGlyphId = charset.indexOf(baseGlyphName);
-          var accentGlyphId = charset.indexOf(accentGlyphName);
-          if (baseGlyphId < 0 || accentGlyphId < 0) {
-            continue;
-          }
-          var accentOffset = {
-            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],
-            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]
-          };
-
-          var charCodes = getCharCodes(mapping, glyphId);
-          if (!charCodes) {
-            // There's no point in mapping it if the char code was never mapped
-            // to begin with.
-            continue;
-          }
-          for (var i = 0, ii = charCodes.length; i < ii; i++) {
-            var charCode = charCodes[i];
-            // Find a fontCharCode that maps to the base and accent glyphs.
-            // If one doesn't exists, create it.
-            var charCodeToGlyphId = newMapping.charCodeToGlyphId;
-            var baseFontCharCode = createCharCode(charCodeToGlyphId,
-                                                  baseGlyphId);
-            var accentFontCharCode = createCharCode(charCodeToGlyphId,
-                                                    accentGlyphId);
-            seacMap[charCode] = {
-              baseFontCharCode: baseFontCharCode,
-              accentFontCharCode: accentFontCharCode,
-              accentOffset: accentOffset
-            };
-          }
-        }
-        properties.seacMap = seacMap;
-      }
-
-      var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0];
-
-      var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F');
-      // PostScript Font Program
-      builder.addTable('CFF ', font.data);
-      // OS/2 and Windows Specific metrics
-      builder.addTable('OS/2', createOS2Table(properties,
-                                              newMapping.charCodeToGlyphId));
-      // Character to glyphs mapping
-      builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId));
-      // Font header
-      builder.addTable('head',
-            '\x00\x01\x00\x00' + // Version number
-            '\x00\x00\x10\x00' + // fontRevision
-            '\x00\x00\x00\x00' + // checksumAdjustement
-            '\x5F\x0F\x3C\xF5' + // magicNumber
-            '\x00\x00' + // Flags
-            safeString16(unitsPerEm) + // unitsPerEM
-            '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
-            '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
-            '\x00\x00' + // xMin
-            safeString16(properties.descent) + // yMin
-            '\x0F\xFF' + // xMax
-            safeString16(properties.ascent) + // yMax
-            string16(properties.italicAngle ? 2 : 0) + // macStyle
-            '\x00\x11' + // lowestRecPPEM
-            '\x00\x00' + // fontDirectionHint
-            '\x00\x00' + // indexToLocFormat
-            '\x00\x00');  // glyphDataFormat
-
-      // Horizontal header
-      builder.addTable('hhea',
-            '\x00\x01\x00\x00' + // Version number
-            safeString16(properties.ascent) + // Typographic Ascent
-            safeString16(properties.descent) + // Typographic Descent
-            '\x00\x00' + // Line Gap
-            '\xFF\xFF' + // advanceWidthMax
-            '\x00\x00' + // minLeftSidebearing
-            '\x00\x00' + // minRightSidebearing
-            '\x00\x00' + // xMaxExtent
-            safeString16(properties.capHeight) + // caretSlopeRise
-            safeString16(Math.tan(properties.italicAngle) *
-                         properties.xHeight) + // caretSlopeRun
-            '\x00\x00' + // caretOffset
-            '\x00\x00' + // -reserved-
-            '\x00\x00' + // -reserved-
-            '\x00\x00' + // -reserved-
-            '\x00\x00' + // -reserved-
-            '\x00\x00' + // metricDataFormat
-            string16(numGlyphs)); // Number of HMetrics
-
-      // Horizontal metrics
-      builder.addTable('hmtx', (function fontFieldsHmtx() {
-          var charstrings = font.charstrings;
-          var cffWidths = font.cff ? font.cff.widths : null;
-          var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
-          for (var i = 1, ii = numGlyphs; i < ii; i++) {
-            var width = 0;
-            if (charstrings) {
-              var charstring = charstrings[i - 1];
-              width = 'width' in charstring ? charstring.width : 0;
-            } else if (cffWidths) {
-              width = Math.ceil(cffWidths[i] || 0);
-            }
-            hmtx += string16(width) + string16(0);
-          }
-          return hmtx;
-        })());
-
-      // Maximum profile
-      builder.addTable('maxp',
-            '\x00\x00\x50\x00' + // Version number
-            string16(numGlyphs)); // Num of glyphs
-
-      // Naming tables
-      builder.addTable('name', createNameTable(fontName));
-
-      // PostScript informations
-      builder.addTable('post', createPostTable(properties));
-
-      return builder.toArray();
-    },
-
-    /**
-     * Builds a char code to unicode map based on section 9.10 of the spec.
-     * @param {Object} properties Font properties object.
-     * @return {Object} A ToUnicodeMap object.
-     */
-    buildToUnicode: function Font_buildToUnicode(properties) {
-      // Section 9.10.2 Mapping Character Codes to Unicode Values
-      if (properties.toUnicode && properties.toUnicode.length !== 0) {
-        return properties.toUnicode;
-      }
-      // According to the spec if the font is a simple font we should only map
-      // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or
-      // the differences array only contains adobe standard or symbol set names,
-      // in pratice it seems better to always try to create a toUnicode
-      // map based of the default encoding.
-      var toUnicode, charcode;
-      if (!properties.composite /* is simple font */) {
-        toUnicode = [];
-        var encoding = properties.defaultEncoding.slice();
-        var baseEncodingName = properties.baseEncodingName;
-        // Merge in the differences array.
-        var differences = properties.differences;
-        for (charcode in differences) {
-          encoding[charcode] = differences[charcode];
-        }
-        for (charcode in encoding) {
-          // a) Map the character code to a character name.
-          var glyphName = encoding[charcode];
-          // b) Look up the character name in the Adobe Glyph List (see the
-          //    Bibliography) to obtain the corresponding Unicode value.
-          if (glyphName === '') {
-            continue;
-          } else if (GlyphsUnicode[glyphName] === undefined) {
-            // (undocumented) c) Few heuristics to recognize unknown glyphs
-            // NOTE: Adobe Reader does not do this step, but OSX Preview does
-            var code = 0;
-            switch (glyphName[0]) {
-              case 'G': // Gxx glyph
-                if (glyphName.length === 3) {
-                  code = parseInt(glyphName.substr(1), 16);
-                }
-                break;
-              case 'g': // g00xx glyph
-                if (glyphName.length === 5) {
-                  code = parseInt(glyphName.substr(1), 16);
-                }
-                break;
-              case 'C': // Cddd glyph
-              case 'c': // cddd glyph
-                if (glyphName.length >= 3) {
-                  code = +glyphName.substr(1);
-                }
-                break;
-            }
-            if (code) {
-              // If |baseEncodingName| is one the predefined encodings,
-              // and |code| equals |charcode|, using the glyph defined in the
-              // baseEncoding seems to yield a better |toUnicode| mapping
-              // (fixes issue 5070).
-              if (baseEncodingName && code === +charcode) {
-                var baseEncoding = Encodings[baseEncodingName];
-                if (baseEncoding && (glyphName = baseEncoding[charcode])) {
-                  toUnicode[charcode] =
-                    String.fromCharCode(GlyphsUnicode[glyphName]);
-                  continue;
-                }
-              }
-              toUnicode[charcode] = String.fromCharCode(code);
-            }
-            continue;
-          }
-          toUnicode[charcode] = String.fromCharCode(GlyphsUnicode[glyphName]);
-        }
-        return new ToUnicodeMap(toUnicode);
-      }
-      // If the font is a composite font that uses one of the predefined CMaps
-      // listed in Table 118 (except Identity–H and Identity–V) or whose
-      // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or
-      // Adobe-Korea1 character collection:
-      if (properties.composite && (
-           (properties.cMap.builtInCMap &&
-            !(properties.cMap instanceof IdentityCMap)) ||
-           (properties.cidSystemInfo.registry === 'Adobe' &&
-             (properties.cidSystemInfo.ordering === 'GB1' ||
-              properties.cidSystemInfo.ordering === 'CNS1' ||
-              properties.cidSystemInfo.ordering === 'Japan1' ||
-              properties.cidSystemInfo.ordering === 'Korea1')))) {
-        // Then:
-        // a) Map the character code to a character identifier (CID) according
-        // to the font’s CMap.
-        // b) Obtain the registry and ordering of the character collection used
-        // by the font’s CMap (for example, Adobe and Japan1) from its
-        // CIDSystemInfo dictionary.
-        var registry = properties.cidSystemInfo.registry;
-        var ordering = properties.cidSystemInfo.ordering;
-        // c) Construct a second CMap name by concatenating the registry and
-        // ordering obtained in step (b) in the format registry–ordering–UCS2
-        // (for example, Adobe–Japan1–UCS2).
-        var ucs2CMapName = new Name(registry + '-' + ordering + '-UCS2');
-        // d) Obtain the CMap with the name constructed in step (c) (available
-        // from the ASN Web site; see the Bibliography).
-        var ucs2CMap = CMapFactory.create(ucs2CMapName,
-          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);
-        var cMap = properties.cMap;
-        toUnicode = [];
-        cMap.forEach(function(charcode, cid) {
-          assert(cid <= 0xffff, 'Max size of CID is 65,535');
-          // e) Map the CID obtained in step (a) according to the CMap obtained
-          // in step (d), producing a Unicode value.
-          var ucs2 = ucs2CMap.lookup(cid);
-          if (ucs2) {
-            toUnicode[charcode] =
-              String.fromCharCode((ucs2.charCodeAt(0) << 8) +
-                                  ucs2.charCodeAt(1));
-          }
-        });
-        return new ToUnicodeMap(toUnicode);
-      }
-
-      // The viewer's choice, just use an identity map.
-      return new IdentityToUnicodeMap(properties.firstChar,
-                                      properties.lastChar);
-    },
-
-    get spaceWidth() {
-      if ('_shadowWidth' in this) {
-        return this._shadowWidth;
-      }
-
-      // trying to estimate space character width
-      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
-      var width;
-      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
-        var glyphName = possibleSpaceReplacements[i];
-        // if possible, getting width by glyph name
-        if (glyphName in this.widths) {
-          width = this.widths[glyphName];
-          break;
-        }
-        var glyphUnicode = GlyphsUnicode[glyphName];
-        // finding the charcode via unicodeToCID map
-        var charcode = 0;
-        if (this.composite) {
-          if (this.cMap.contains(glyphUnicode)) {
-            charcode = this.cMap.lookup(glyphUnicode);
-          }
-        }
-        // ... via toUnicode map
-        if (!charcode && 'toUnicode' in this) {
-          charcode = this.toUnicode.charCodeOf(glyphUnicode);
-        }
-        // setting it to unicode if negative or undefined
-        if (charcode <= 0) {
-          charcode = glyphUnicode;
-        }
-        // trying to get width via charcode
-        width = this.widths[charcode];
-        if (width) {
-          break; // the non-zero width found
-        }
-      }
-      width = width || this.defaultWidth;
-      // Do not shadow the property here. See discussion:
-      // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280
-      this._shadowWidth = width;
-      return width;
-    },
-
-    charToGlyph: function Font_charToGlyph(charcode) {
-      var fontCharCode, width, operatorListId;
-
-      var widthCode = charcode;
-      if (this.cMap && this.cMap.contains(charcode)) {
-        widthCode = this.cMap.lookup(charcode);
-      }
-      width = this.widths[widthCode];
-      width = isNum(width) ? width : this.defaultWidth;
-      var vmetric = this.vmetrics && this.vmetrics[widthCode];
-
-      var unicode = this.toUnicode.get(charcode) || charcode;
-      if (typeof unicode === 'number') {
-        unicode = String.fromCharCode(unicode);
-      }
-
-      // First try the toFontChar map, if it's not there then try falling
-      // back to the char code.
-      fontCharCode = this.toFontChar[charcode] || charcode;
-      if (this.missingFile) {
-        fontCharCode = mapSpecialUnicodeValues(fontCharCode);
-      }
-
-      if (this.isType3Font) {
-        // Font char code in this case is actually a glyph name.
-        operatorListId = fontCharCode;
-      }
-
-      var accent = null;
-      if (this.seacMap && this.seacMap[charcode]) {
-        var seac = this.seacMap[charcode];
-        fontCharCode = seac.baseFontCharCode;
-        accent = {
-          fontChar: String.fromCharCode(seac.accentFontCharCode),
-          offset: seac.accentOffset
-        };
-      }
-
-      var fontChar = String.fromCharCode(fontCharCode);
-
-      var glyph = this.glyphCache[charcode];
-      if (!glyph ||
-          !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,
-                                 operatorListId)) {
-        glyph = new Glyph(fontChar, unicode, accent, width, vmetric,
-                          operatorListId);
-        this.glyphCache[charcode] = glyph;
-      }
-      return glyph;
-    },
-
-    charsToGlyphs: function Font_charsToGlyphs(chars) {
-      var charsCache = this.charsCache;
-      var glyphs, glyph, charcode;
-
-      // if we translated this string before, just grab it from the cache
-      if (charsCache) {
-        glyphs = charsCache[chars];
-        if (glyphs) {
-          return glyphs;
-        }
-      }
-
-      // lazily create the translation cache
-      if (!charsCache) {
-        charsCache = this.charsCache = Object.create(null);
-      }
-
-      glyphs = [];
-      var charsCacheKey = chars;
-      var i = 0, ii;
-
-      if (this.cMap) {
-        // composite fonts have multi-byte strings convert the string from
-        // single-byte to multi-byte
-        var c = {};
-        while (i < chars.length) {
-          this.cMap.readCharCode(chars, i, c);
-          charcode = c.charcode;
-          var length = c.length;
-          i += length;
-          glyph = this.charToGlyph(charcode);
-          glyphs.push(glyph);
-          // placing null after each word break charcode (ASCII SPACE)
-          // Ignore occurences of 0x20 in multiple-byte codes.
-          if (length === 1 && chars.charCodeAt(i - 1) === 0x20) {
-            glyphs.push(null);
-          }
-        }
-      } else {
-        for (i = 0, ii = chars.length; i < ii; ++i) {
-          charcode = chars.charCodeAt(i);
-          glyph = this.charToGlyph(charcode);
-          glyphs.push(glyph);
-          if (charcode === 0x20) {
-            glyphs.push(null);
-          }
-        }
-      }
-
-      // Enter the translated string into the cache
-      return (charsCache[charsCacheKey] = glyphs);
-    }
-  };
-
-  return Font;
-})();
-
-var ErrorFont = (function ErrorFontClosure() {
-  function ErrorFont(error) {
-    this.error = error;
-    this.loadedName = 'g_font_error';
-    this.loading = false;
-  }
-
-  ErrorFont.prototype = {
-    charsToGlyphs: function ErrorFont_charsToGlyphs() {
-      return [];
-    },
-    exportData: function ErrorFont_exportData() {
-      return {error: this.error};
-    }
-  };
-
-  return ErrorFont;
-})();
-
-/**
- * Shared logic for building a char code to glyph id mapping for Type1 and
- * simple CFF fonts. See section 9.6.6.2 of the spec.
- * @param {Object} properties Font properties object.
- * @param {Object} builtInEncoding The encoding contained within the actual font
- * data.
- * @param {Array} Array of glyph names where the index is the glyph ID.
- * @returns {Object} A char code to glyph ID map.
- */
-function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
-  var charCodeToGlyphId = Object.create(null);
-  var glyphId, charCode, baseEncoding;
-
-  if (properties.baseEncodingName) {
-    // If a valid base encoding name was used, the mapping is initialized with
-    // that.
-    baseEncoding = Encodings[properties.baseEncodingName];
-    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
-      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
-      if (glyphId >= 0) {
-        charCodeToGlyphId[charCode] = glyphId;
-      } else {
-        charCodeToGlyphId[charCode] = 0; // notdef
-      }
-    }
-  } else if (!!(properties.flags & FontFlags.Symbolic)) {
-    // For a symbolic font the encoding should be the fonts built-in
-    // encoding.
-    for (charCode in builtInEncoding) {
-      charCodeToGlyphId[charCode] = builtInEncoding[charCode];
-    }
-  } else {
-    // For non-symbolic fonts that don't have a base encoding the standard
-    // encoding should be used.
-    baseEncoding = Encodings.StandardEncoding;
-    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
-      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
-      if (glyphId >= 0) {
-        charCodeToGlyphId[charCode] = glyphId;
-      } else {
-        charCodeToGlyphId[charCode] = 0; // notdef
-      }
-    }
-  }
-
-  // Lastly, merge in the differences.
-  var differences = properties.differences;
-  if (differences) {
-    for (charCode in differences) {
-      var glyphName = differences[charCode];
-      glyphId = glyphNames.indexOf(glyphName);
-      if (glyphId >= 0) {
-        charCodeToGlyphId[charCode] = glyphId;
-      } else {
-        charCodeToGlyphId[charCode] = 0; // notdef
-      }
-    }
-  }
-  return charCodeToGlyphId;
-}
-
-/*
- * CharStrings are encoded following the the CharString Encoding sequence
- * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
- * The value in a byte indicates a command, a number, or subsequent bytes
- * that are to be interpreted in a special way.
- *
- * CharString Number Encoding:
- *  A CharString byte containing the values from 32 through 255 inclusive
- *  indicate an integer. These values are decoded in four ranges.
- *
- * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
- * indicate the integer v - 139. Thus, the integer values from -107 through
- * 107 inclusive may be encoded in single byte.
- *
- * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
- * indicates an integer involving the next byte, w, according to the formula:
- * [(v - 247) x 256] + w + 108
- *
- * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
- * indicates an integer involving the next byte, w, according to the formula:
- * -[(v - 251) * 256] - w - 108
- *
- * 4. A CharString containing the value 255 indicates that the next 4 bytes
- * are a two complement signed integer. The first of these bytes contains the
- * highest order bits, the second byte contains the next higher order bits
- * and the fourth byte contain the lowest order bits.
- *
- *
- * CharString Command Encoding:
- *  CharStrings commands are encoded in 1 or 2 bytes.
- *
- *  Single byte commands are encoded in 1 byte that contains a value between
- *  0 and 31 inclusive.
- *  If a command byte contains the value 12, then the value in the next byte
- *  indicates a command. This "escape" mechanism allows many extra commands
- * to be encoded and this encoding technique helps to minimize the length of
- * the charStrings.
- */
-var Type1CharString = (function Type1CharStringClosure() {
-  var COMMAND_MAP = {
-    'hstem': [1],
-    'vstem': [3],
-    'vmoveto': [4],
-    'rlineto': [5],
-    'hlineto': [6],
-    'vlineto': [7],
-    'rrcurveto': [8],
-    'callsubr': [10],
-    'flex': [12, 35],
-    'drop' : [12, 18],
-    'endchar': [14],
-    'rmoveto': [21],
-    'hmoveto': [22],
-    'vhcurveto': [30],
-    'hvcurveto': [31]
-  };
-
-  function Type1CharString() {
-    this.width = 0;
-    this.lsb = 0;
-    this.flexing = false;
-    this.output = [];
-    this.stack = [];
-  }
-
-  Type1CharString.prototype = {
-    convert: function Type1CharString_convert(encoded, subrs) {
-      var count = encoded.length;
-      var error = false;
-      var wx, sbx, subrNumber;
-      for (var i = 0; i < count; i++) {
-        var value = encoded[i];
-        if (value < 32) {
-          if (value === 12) {
-            value = (value << 8) + encoded[++i];
-          }
-          switch (value) {
-            case 1: // hstem
-              if (!HINTING_ENABLED) {
-                this.stack = [];
-                break;
-              }
-              error = this.executeCommand(2, COMMAND_MAP.hstem);
-              break;
-            case 3: // vstem
-              if (!HINTING_ENABLED) {
-                this.stack = [];
-                break;
-              }
-              error = this.executeCommand(2, COMMAND_MAP.vstem);
-              break;
-            case 4: // vmoveto
-              if (this.flexing) {
-                if (this.stack.length < 1) {
-                  error = true;
-                  break;
-                }
-                // Add the dx for flex and but also swap the values so they are
-                // the right order.
-                var dy = this.stack.pop();
-                this.stack.push(0, dy);
-                break;
-              }
-              error = this.executeCommand(1, COMMAND_MAP.vmoveto);
-              break;
-            case 5: // rlineto
-              error = this.executeCommand(2, COMMAND_MAP.rlineto);
-              break;
-            case 6: // hlineto
-              error = this.executeCommand(1, COMMAND_MAP.hlineto);
-              break;
-            case 7: // vlineto
-              error = this.executeCommand(1, COMMAND_MAP.vlineto);
-              break;
-            case 8: // rrcurveto
-              error = this.executeCommand(6, COMMAND_MAP.rrcurveto);
-              break;
-            case 9: // closepath
-              // closepath is a Type1 command that does not take argument and is
-              // useless in Type2 and it can simply be ignored.
-              this.stack = [];
-              break;
-            case 10: // callsubr
-              if (this.stack.length < 1) {
-                error = true;
-                break;
-              }
-              subrNumber = this.stack.pop();
-              error = this.convert(subrs[subrNumber], subrs);
-              break;
-            case 11: // return
-              return error;
-            case 13: // hsbw
-              if (this.stack.length < 2) {
-                error = true;
-                break;
-              }
-              // To convert to type2 we have to move the width value to the
-              // first part of the charstring and then use hmoveto with lsb.
-              wx = this.stack.pop();
-              sbx = this.stack.pop();
-              this.lsb = sbx;
-              this.width = wx;
-              this.stack.push(wx, sbx);
-              error = this.executeCommand(2, COMMAND_MAP.hmoveto);
-              break;
-            case 14: // endchar
-              this.output.push(COMMAND_MAP.endchar[0]);
-              break;
-            case 21: // rmoveto
-              if (this.flexing) {
-                break;
-              }
-              error = this.executeCommand(2, COMMAND_MAP.rmoveto);
-              break;
-            case 22: // hmoveto
-              if (this.flexing) {
-                // Add the dy for flex.
-                this.stack.push(0);
-                break;
-              }
-              error = this.executeCommand(1, COMMAND_MAP.hmoveto);
-              break;
-            case 30: // vhcurveto
-              error = this.executeCommand(4, COMMAND_MAP.vhcurveto);
-              break;
-            case 31: // hvcurveto
-              error = this.executeCommand(4, COMMAND_MAP.hvcurveto);
-              break;
-            case (12 << 8) + 0: // dotsection
-              // dotsection is a Type1 command to specify some hinting feature
-              // for dots that do not take a parameter and it can safely be
-              // ignored for Type2.
-              this.stack = [];
-              break;
-            case (12 << 8) + 1: // vstem3
-              if (!HINTING_ENABLED) {
-                this.stack = [];
-                break;
-              }
-              // [vh]stem3 are Type1 only and Type2 supports [vh]stem with
-              // multiple parameters, so instead of returning [vh]stem3 take a
-              // shortcut and return [vhstem] instead.
-              error = this.executeCommand(2, COMMAND_MAP.vstem);
-              break;
-            case (12 << 8) + 2: // hstem3
-              if (!HINTING_ENABLED) {
-                 this.stack = [];
-                break;
-              }
-              // See vstem3.
-              error = this.executeCommand(2, COMMAND_MAP.hstem);
-              break;
-            case (12 << 8) + 6: // seac
-              // seac is like type 2's special endchar but it doesn't use the
-              // first argument asb, so remove it.
-              if (SEAC_ANALYSIS_ENABLED) {
-                this.seac = this.stack.splice(-4, 4);
-                error = this.executeCommand(0, COMMAND_MAP.endchar);
-              } else {
-                error = this.executeCommand(4, COMMAND_MAP.endchar);
-              }
-              break;
-            case (12 << 8) + 7: // sbw
-              if (this.stack.length < 4) {
-                error = true;
-                break;
-              }
-              // To convert to type2 we have to move the width value to the
-              // first part of the charstring and then use rmoveto with
-              // (dx, dy). The height argument will not be used for vmtx and
-              // vhea tables reconstruction -- ignoring it.
-              var wy = this.stack.pop();
-              wx = this.stack.pop();
-              var sby = this.stack.pop();
-              sbx = this.stack.pop();
-              this.lsb = sbx;
-              this.width = wx;
-              this.stack.push(wx, sbx, sby);
-              error = this.executeCommand(3, COMMAND_MAP.rmoveto);
-              break;
-            case (12 << 8) + 12: // div
-              if (this.stack.length < 2) {
-                error = true;
-                break;
-              }
-              var num2 = this.stack.pop();
-              var num1 = this.stack.pop();
-              this.stack.push(num1 / num2);
-              break;
-            case (12 << 8) + 16: // callothersubr
-              if (this.stack.length < 2) {
-                error = true;
-                break;
-              }
-              subrNumber = this.stack.pop();
-              var numArgs = this.stack.pop();
-              if (subrNumber === 0 && numArgs === 3) {
-                var flexArgs = this.stack.splice(this.stack.length - 17, 17);
-                this.stack.push(
-                  flexArgs[2] + flexArgs[0], // bcp1x + rpx
-                  flexArgs[3] + flexArgs[1], // bcp1y + rpy
-                  flexArgs[4], // bcp2x
-                  flexArgs[5], // bcp2y
-                  flexArgs[6], // p2x
-                  flexArgs[7], // p2y
-                  flexArgs[8], // bcp3x
-                  flexArgs[9], // bcp3y
-                  flexArgs[10], // bcp4x
-                  flexArgs[11], // bcp4y
-                  flexArgs[12], // p3x
-                  flexArgs[13], // p3y
-                  flexArgs[14] // flexDepth
-                  // 15 = finalx unused by flex
-                  // 16 = finaly unused by flex
-                );
-                error = this.executeCommand(13, COMMAND_MAP.flex, true);
-                this.flexing = false;
-                this.stack.push(flexArgs[15], flexArgs[16]);
-              } else if (subrNumber === 1 && numArgs === 0) {
-                this.flexing = true;
-              }
-              break;
-            case (12 << 8) + 17: // pop
-              // Ignore this since it is only used with othersubr.
-              break;
-            case (12 << 8) + 33: // setcurrentpoint
-              // Ignore for now.
-              this.stack = [];
-              break;
-            default:
-              warn('Unknown type 1 charstring command of "' + value + '"');
-              break;
-          }
-          if (error) {
-            break;
-          }
-          continue;
-        } else if (value <= 246) {
-          value = value - 139;
-        } else if (value <= 250) {
-          value = ((value - 247) * 256) + encoded[++i] + 108;
-        } else if (value <= 254) {
-          value = -((value - 251) * 256) - encoded[++i] - 108;
-        } else {
-          value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 |
-                  (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;
-        }
-        this.stack.push(value);
-      }
-      return error;
-    },
-
-    executeCommand: function(howManyArgs, command, keepStack) {
-      var stackLength = this.stack.length;
-      if (howManyArgs > stackLength) {
-        return true;
-      }
-      var start = stackLength - howManyArgs;
-      for (var i = start; i < stackLength; i++) {
-        var value = this.stack[i];
-        if (value === (value | 0)) { // int
-          this.output.push(28, (value >> 8) & 0xff, value & 0xff);
-        } else { // fixed point
-          value = (65536 * value) | 0;
-          this.output.push(255,
-                           (value >> 24) & 0xFF,
-                           (value >> 16) & 0xFF,
-                           (value >> 8) & 0xFF,
-                           value & 0xFF);
-        }
-      }
-      this.output.push.apply(this.output, command);
-      if (keepStack) {
-        this.stack.splice(start, howManyArgs);
-      } else {
-        this.stack.length = 0;
-      }
-      return false;
-    }
-  };
-
-  return Type1CharString;
-})();
-
-/*
- * Type1Parser encapsulate the needed code for parsing a Type1 font
- * program. Some of its logic depends on the Type2 charstrings
- * structure.
- * Note: this doesn't really parse the font since that would require evaluation
- * of PostScript, but it is possible in most cases to extract what we need
- * without a full parse.
- */
-var Type1Parser = (function Type1ParserClosure() {
-  /*
-   * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
-   * of Plaintext Bytes. The function took a key as a parameter which can be
-   * for decrypting the eexec block of for decoding charStrings.
-   */
-  var EEXEC_ENCRYPT_KEY = 55665;
-  var CHAR_STRS_ENCRYPT_KEY = 4330;
-
-  function isHexDigit(code) {
-    return code >= 48 && code <= 57 || // '0'-'9'
-           code >= 65 && code <= 70 || // 'A'-'F'
-           code >= 97 && code <= 102;  // 'a'-'f'
-  }
-
-  function decrypt(data, key, discardNumber) {
-    var r = key | 0, c1 = 52845, c2 = 22719;
-    var count = data.length;
-    var decrypted = new Uint8Array(count);
-    for (var i = 0; i < count; i++) {
-      var value = data[i];
-      decrypted[i] = value ^ (r >> 8);
-      r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
-    }
-    return Array.prototype.slice.call(decrypted, discardNumber);
-  }
-
-  function decryptAscii(data, key, discardNumber) {
-    var r = key | 0, c1 = 52845, c2 = 22719;
-    var count = data.length, maybeLength = count >>> 1;
-    var decrypted = new Uint8Array(maybeLength);
-    var i, j;
-    for (i = 0, j = 0; i < count; i++) {
-      var digit1 = data[i];
-      if (!isHexDigit(digit1)) {
-        continue;
-      }
-      i++;
-      var digit2;
-      while (i < count && !isHexDigit(digit2 = data[i])) {
-        i++;
-      }
-      if (i < count) {
-        var value = parseInt(String.fromCharCode(digit1, digit2), 16);
-        decrypted[j++] = value ^ (r >> 8);
-        r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
-      }
-    }
-    return Array.prototype.slice.call(decrypted, discardNumber, j);
-  }
-
-  function isSpecial(c) {
-    return c === 0x2F || // '/'
-           c === 0x5B || c === 0x5D || // '[', ']'
-           c === 0x7B || c === 0x7D || // '{', '}'
-           c === 0x28 || c === 0x29; // '(', ')'
-  }
-
-  function Type1Parser(stream, encrypted) {
-    if (encrypted) {
-      var data = stream.getBytes();
-      var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) &&
-                       isHexDigit(data[2]) && isHexDigit(data[3]));
-      stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) :
-                          decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));
-    }
-    this.stream = stream;
-    this.nextChar();
-  }
-
-  Type1Parser.prototype = {
-    readNumberArray: function Type1Parser_readNumberArray() {
-      this.getToken(); // read '[' or '{' (arrays can start with either)
-      var array = [];
-      while (true) {
-        var token = this.getToken();
-        if (token === null || token === ']' || token === '}') {
-          break;
-        }
-        array.push(parseFloat(token || 0));
-      }
-      return array;
-    },
-
-    readNumber: function Type1Parser_readNumber() {
-      var token = this.getToken();
-      return parseFloat(token || 0);
-    },
-
-    readInt: function Type1Parser_readInt() {
-      // Use '| 0' to prevent setting a double into length such as the double
-      // does not flow into the loop variable.
-      var token = this.getToken();
-      return parseInt(token || 0, 10) | 0;
-    },
-
-    readBoolean: function Type1Parser_readBoolean() {
-      var token = this.getToken();
-
-      // Use 1 and 0 since that's what type2 charstrings use.
-      return token === 'true' ? 1 : 0;
-    },
-
-    nextChar : function Type1_nextChar() {
-      return (this.currentChar = this.stream.getByte());
-    },
-
-    getToken: function Type1Parser_getToken() {
-      // Eat whitespace and comments.
-      var comment = false;
-      var ch = this.currentChar;
-      while (true) {
-        if (ch === -1) {
-          return null;
-        }
-
-        if (comment) {
-          if (ch === 0x0A || ch === 0x0D) {
-            comment = false;
-          }
-        } else if (ch === 0x25) { // '%'
-          comment = true;
-        } else if (!Lexer.isSpace(ch)) {
-          break;
-        }
-        ch = this.nextChar();
-      }
-      if (isSpecial(ch)) {
-        this.nextChar();
-        return String.fromCharCode(ch);
-      }
-      var token = '';
-      do {
-        token += String.fromCharCode(ch);
-        ch = this.nextChar();
-      } while (ch >= 0 && !Lexer.isSpace(ch) && !isSpecial(ch));
-      return token;
-    },
-
-    /*
-     * Returns an object containing a Subrs array and a CharStrings
-     * array extracted from and eexec encrypted block of data
-     */
-    extractFontProgram: function Type1Parser_extractFontProgram() {
-      var stream = this.stream;
-
-      var subrs = [], charstrings = [];
-      var program = {
-        subrs: [],
-        charstrings: [],
-        properties: {
-          'privateData': {
-            'lenIV': 4
-          }
-        }
-      };
-      var token, length, data, lenIV, encoded;
-      while ((token = this.getToken()) !== null) {
-        if (token !== '/') {
-          continue;
-        }
-        token = this.getToken();
-        switch (token) {
-          case 'CharStrings':
-            // The number immediately following CharStrings must be greater or
-            // equal to the number of CharStrings.
-            this.getToken();
-            this.getToken(); // read in 'dict'
-            this.getToken(); // read in 'dup'
-            this.getToken(); // read in 'begin'
-            while(true) {
-              token = this.getToken();
-              if (token === null || token === 'end') {
-                break;
-              }
-
-              if (token !== '/') {
-                continue;
-              }
-              var glyph = this.getToken();
-              length = this.readInt();
-              this.getToken(); // read in 'RD' or '-|'
-              data = stream.makeSubStream(stream.pos, length);
-              lenIV = program.properties.privateData['lenIV'];
-              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);
-              // Skip past the required space and binary data.
-              stream.skip(length);
-              this.nextChar();
-              token = this.getToken(); // read in 'ND' or '|-'
-              if (token === 'noaccess') {
-                this.getToken(); // read in 'def'
-              }
-              charstrings.push({
-                glyph: glyph,
-                encoded: encoded
-              });
-            }
-            break;
-          case 'Subrs':
-            var num = this.readInt();
-            this.getToken(); // read in 'array'
-            while ((token = this.getToken()) === 'dup') {
-              var index = this.readInt();
-              length = this.readInt();
-              this.getToken(); // read in 'RD' or '-|'
-              data = stream.makeSubStream(stream.pos, length);
-              lenIV = program.properties.privateData['lenIV'];
-              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);
-              // Skip past the required space and binary data.
-              stream.skip(length);
-              this.nextChar();
-              token = this.getToken(); // read in 'NP' or '|'
-              if (token === 'noaccess') {
-                this.getToken(); // read in 'put'
-              }
-              subrs[index] = encoded;
-            }
-            break;
-          case 'BlueValues':
-          case 'OtherBlues':
-          case 'FamilyBlues':
-          case 'FamilyOtherBlues':
-            var blueArray = this.readNumberArray();
-            // *Blue* values may contain invalid data: disables reading of
-            // those values when hinting is disabled.
-            if (blueArray.length > 0 && (blueArray.length % 2) === 0 &&
-                HINTING_ENABLED) {
-              program.properties.privateData[token] = blueArray;
-            }
-            break;
-          case 'StemSnapH':
-          case 'StemSnapV':
-            program.properties.privateData[token] = this.readNumberArray();
-            break;
-          case 'StdHW':
-          case 'StdVW':
-            program.properties.privateData[token] =
-              this.readNumberArray()[0];
-            break;
-          case 'BlueShift':
-          case 'lenIV':
-          case 'BlueFuzz':
-          case 'BlueScale':
-          case 'LanguageGroup':
-          case 'ExpansionFactor':
-            program.properties.privateData[token] = this.readNumber();
-            break;
-          case 'ForceBold':
-            program.properties.privateData[token] = this.readBoolean();
-            break;
-        }
-      }
-
-      for (var i = 0; i < charstrings.length; i++) {
-        glyph = charstrings[i].glyph;
-        encoded = charstrings[i].encoded;
-        var charString = new Type1CharString();
-        var error = charString.convert(encoded, subrs);
-        var output = charString.output;
-        if (error) {
-          // It seems when FreeType encounters an error while evaluating a glyph
-          // that it completely ignores the glyph so we'll mimic that behaviour
-          // here and put an endchar to make the validator happy.
-          output = [14];
-        }
-        program.charstrings.push({
-          glyphName: glyph,
-          charstring: output,
-          width: charString.width,
-          lsb: charString.lsb,
-          seac: charString.seac
-        });
-      }
-
-      return program;
-    },
-
-    extractFontHeader: function Type1Parser_extractFontHeader(properties) {
-      var token;
-      while ((token = this.getToken()) !== null) {
-        if (token !== '/') {
-          continue;
-        }
-        token = this.getToken();
-        switch (token) {
-          case 'FontMatrix':
-            var matrix = this.readNumberArray();
-            properties.fontMatrix = matrix;
-            break;
-          case 'Encoding':
-            var encodingArg = this.getToken();
-            var encoding;
-            if (!/^\d+$/.test(encodingArg)) {
-              // encoding name is specified
-              encoding = Encodings[encodingArg];
-            } else {
-              encoding = [];
-              var size = parseInt(encodingArg, 10) | 0;
-              this.getToken(); // read in 'array'
-
-              for (var j = 0; j < size; j++) {
-                token = this.getToken();
-                // skipping till first dup or def (e.g. ignoring for statement)
-                while (token !== 'dup' && token !== 'def') {
-                  token = this.getToken();
-                  if (token === null) {
-                    return; // invalid header
-                  }
-                }
-                if (token === 'def') {
-                  break; // read all array data
-                }
-                var index = this.readInt();
-                this.getToken(); // read in '/'
-                var glyph = this.getToken();
-                encoding[index] = glyph;
-                this.getToken(); // read the in 'put'
-              }
-            }
-            properties.builtInEncoding = encoding;
-            break;
-          case 'FontBBox':
-            var fontBBox = this.readNumberArray();
-            // adjusting ascent/descent
-            properties.ascent = fontBBox[3];
-            properties.descent = fontBBox[1];
-            properties.ascentScaled = true;
-            break;
-        }
-      }
-    }
-  };
-
-  return Type1Parser;
-})();
-
-/**
- * The CFF class takes a Type1 file and wrap it into a
- * 'Compact Font Format' which itself embed Type2 charstrings.
- */
-var CFFStandardStrings = [
-  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
-  'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
-  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
-  'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
-  'equal', 'greater', 'question', 'at', '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', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
-  'underscore', 'quoteleft', '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', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
-  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
-  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
-  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
-  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
-  'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
-  'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
-  'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
-  'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
-  'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
-  'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
-  'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
-  'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
-  'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
-  'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
-  'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
-  'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
-  'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
-  'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
-  'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
-  'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
-  'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
-  'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
-  'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
-  'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
-  'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
-  'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
-  'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
-  'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
-  'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
-  'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
-  'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
-  'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
-  'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
-  'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
-  'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
-  'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
-  'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
-  'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
-  'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
-  'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
-  'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
-  'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
-  'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
-  'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
-  'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
-  'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
-  'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
-  'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
-  'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
-  'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
-  'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
-  'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
-  'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
-  'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
-  'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
-];
-
-// Type1Font is also a CIDFontType0.
-var Type1Font = function Type1Font(name, file, properties) {
-  // Some bad generators embed pfb file as is, we have to strip 6-byte headers.
-  // Also, length1 and length2 might be off by 6 bytes as well.
-  // http://www.math.ubc.ca/~cass/piscript/type1.pdf
-  var PFB_HEADER_SIZE = 6;
-  var headerBlockLength = properties.length1;
-  var eexecBlockLength = properties.length2;
-  var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);
-  var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;
-  if (pfbHeaderPresent) {
-    file.skip(PFB_HEADER_SIZE);
-    headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |
-                        (pfbHeader[3] << 8) | pfbHeader[2];
-  }
-
-  // Get the data block containing glyphs and subrs informations
-  var headerBlock = new Stream(file.getBytes(headerBlockLength));
-  var headerBlockParser = new Type1Parser(headerBlock);
-  headerBlockParser.extractFontHeader(properties);
-
-  if (pfbHeaderPresent) {
-    pfbHeader = file.getBytes(PFB_HEADER_SIZE);
-    eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |
-                       (pfbHeader[3] << 8) | pfbHeader[2];
-  }
-
-  // Decrypt the data blocks and retrieve it's content
-  var eexecBlock = new Stream(file.getBytes(eexecBlockLength));
-  var eexecBlockParser = new Type1Parser(eexecBlock, true);
-  var data = eexecBlockParser.extractFontProgram();
-  for (var info in data.properties) {
-    properties[info] = data.properties[info];
-  }
-
-  var charstrings = data.charstrings;
-  var type2Charstrings = this.getType2Charstrings(charstrings);
-  var subrs = this.getType2Subrs(data.subrs);
-
-  this.charstrings = charstrings;
-  this.data = this.wrap(name, type2Charstrings, this.charstrings,
-                        subrs, properties);
-  this.seacs = this.getSeacs(data.charstrings);
-};
-
-Type1Font.prototype = {
-  get numGlyphs() {
-    return this.charstrings.length + 1;
-  },
-
-  getCharset: function Type1Font_getCharset() {
-    var charset = ['.notdef'];
-    var charstrings = this.charstrings;
-    for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {
-      charset.push(charstrings[glyphId].glyphName);
-    }
-    return charset;
-  },
-
-  getGlyphMapping: function Type1Font_getGlyphMapping(properties) {
-    var charstrings = this.charstrings;
-    var glyphNames = ['.notdef'], glyphId;
-    for (glyphId = 0; glyphId < charstrings.length; glyphId++) {
-      glyphNames.push(charstrings[glyphId].glyphName);
-    }
-    var encoding = properties.builtInEncoding;
-    if (encoding) {
-      var builtInEncoding = {};
-      for (var charCode in encoding) {
-        glyphId = glyphNames.indexOf(encoding[charCode]);
-        if (glyphId >= 0) {
-          builtInEncoding[charCode] = glyphId;
-        }
-      }
-    }
-
-    return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);
-  },
-
-  getSeacs: function Type1Font_getSeacs(charstrings) {
-    var i, ii;
-    var seacMap = [];
-    for (i = 0, ii = charstrings.length; i < ii; i++) {
-      var charstring = charstrings[i];
-      if (charstring.seac) {
-        // Offset by 1 for .notdef
-        seacMap[i + 1] = charstring.seac;
-      }
-    }
-    return seacMap;
-  },
-
-  getType2Charstrings: function Type1Font_getType2Charstrings(
-                                  type1Charstrings) {
-    var type2Charstrings = [];
-    for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {
-      type2Charstrings.push(type1Charstrings[i].charstring);
-    }
-    return type2Charstrings;
-  },
-
-  getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
-    var bias = 0;
-    var count = type1Subrs.length;
-    if (count < 1133) {
-      bias = 107;
-    } else if (count < 33769) {
-      bias = 1131;
-    } else {
-      bias = 32768;
-    }
-
-    // Add a bunch of empty subrs to deal with the Type2 bias
-    var type2Subrs = [];
-    var i;
-    for (i = 0; i < bias; i++) {
-      type2Subrs.push([0x0B]);
-    }
-
-    for (i = 0; i < count; i++) {
-      type2Subrs.push(type1Subrs[i]);
-    }
-
-    return type2Subrs;
-  },
-
-  wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
-    var cff = new CFF();
-    cff.header = new CFFHeader(1, 0, 4, 4);
-
-    cff.names = [name];
-
-    var topDict = new CFFTopDict();
-    // CFF strings IDs 0...390 are predefined names, so refering
-    // to entries in our own String INDEX starts at SID 391.
-    topDict.setByName('version', 391);
-    topDict.setByName('Notice', 392);
-    topDict.setByName('FullName', 393);
-    topDict.setByName('FamilyName', 394);
-    topDict.setByName('Weight', 395);
-    topDict.setByName('Encoding', null); // placeholder
-    topDict.setByName('FontMatrix', properties.fontMatrix);
-    topDict.setByName('FontBBox', properties.bbox);
-    topDict.setByName('charset', null); // placeholder
-    topDict.setByName('CharStrings', null); // placeholder
-    topDict.setByName('Private', null); // placeholder
-    cff.topDict = topDict;
-
-    var strings = new CFFStrings();
-    strings.add('Version 0.11'); // Version
-    strings.add('See original notice'); // Notice
-    strings.add(name); // FullName
-    strings.add(name); // FamilyName
-    strings.add('Medium'); // Weight
-    cff.strings = strings;
-
-    cff.globalSubrIndex = new CFFIndex();
-
-    var count = glyphs.length;
-    var charsetArray = [0];
-    var i, ii;
-    for (i = 0; i < count; i++) {
-      var index = CFFStandardStrings.indexOf(charstrings[i].glyphName);
-      // TODO: Insert the string and correctly map it.  Previously it was
-      // thought mapping names that aren't in the standard strings to .notdef
-      // was fine, however in issue818 when mapping them all to .notdef the
-      // adieresis glyph no longer worked.
-      if (index === -1) {
-        index = 0;
-      }
-      charsetArray.push((index >> 8) & 0xff, index & 0xff);
-    }
-    cff.charset = new CFFCharset(false, 0, [], charsetArray);
-
-    var charStringsIndex = new CFFIndex();
-    charStringsIndex.add([0x8B, 0x0E]); // .notdef
-    for (i = 0; i < count; i++) {
-      charStringsIndex.add(glyphs[i]);
-    }
-    cff.charStrings = charStringsIndex;
-
-    var privateDict = new CFFPrivateDict();
-    privateDict.setByName('Subrs', null); // placeholder
-    var fields = [
-      'BlueValues',
-      'OtherBlues',
-      'FamilyBlues',
-      'FamilyOtherBlues',
-      'StemSnapH',
-      'StemSnapV',
-      'BlueShift',
-      'BlueFuzz',
-      'BlueScale',
-      'LanguageGroup',
-      'ExpansionFactor',
-      'ForceBold',
-      'StdHW',
-      'StdVW'
-    ];
-    for (i = 0, ii = fields.length; i < ii; i++) {
-      var field = fields[i];
-      if (!properties.privateData.hasOwnProperty(field)) {
-        continue;
-      }
-      var value = properties.privateData[field];
-      if (isArray(value)) {
-        // All of the private dictionary array data in CFF must be stored as
-        // "delta-encoded" numbers.
-        for (var j = value.length - 1; j > 0; j--) {
-          value[j] -= value[j - 1]; // ... difference from previous value
-        }
-      }
-      privateDict.setByName(field, value);
-    }
-    cff.topDict.privateDict = privateDict;
-
-    var subrIndex = new CFFIndex();
-    for (i = 0, ii = subrs.length; i < ii; i++) {
-      subrIndex.add(subrs[i]);
-    }
-    privateDict.subrsIndex = subrIndex;
-
-    var compiler = new CFFCompiler(cff);
-    return compiler.compile();
-  }
-};
-
-var CFFFont = (function CFFFontClosure() {
-  function CFFFont(file, properties) {
-    this.properties = properties;
-
-    var parser = new CFFParser(file, properties);
-    this.cff = parser.parse();
-    var compiler = new CFFCompiler(this.cff);
-    this.seacs = this.cff.seacs;
-    try {
-      this.data = compiler.compile();
-    } catch (e) {
-      warn('Failed to compile font ' + properties.loadedName);
-      // There may have just been an issue with the compiler, set the data
-      // anyway and hope the font loaded.
-      this.data = file;
-    }
-  }
-
-  CFFFont.prototype = {
-    get numGlyphs() {
-      return this.cff.charStrings.count;
-    },
-    getCharset: function CFFFont_getCharset() {
-      return this.cff.charset.charset;
-    },
-    getGlyphMapping: function CFFFont_getGlyphMapping() {
-      var cff = this.cff;
-      var properties = this.properties;
-      var charsets = cff.charset.charset;
-      var charCodeToGlyphId;
-      var glyphId;
-
-      if (properties.composite) {
-        charCodeToGlyphId = Object.create(null);
-        if (cff.isCIDFont) {
-          // If the font is actually a CID font then we should use the charset
-          // to map CIDs to GIDs.
-          for (glyphId = 0; glyphId < charsets.length; glyphId++) {
-            var cid = charsets[glyphId];
-            var charCode = properties.cMap.charCodeOf(cid);
-            charCodeToGlyphId[charCode] = glyphId;
-          }
-        } else {
-          // If it is NOT actually a CID font then CIDs should be mapped
-          // directly to GIDs.
-          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {
-            charCodeToGlyphId[glyphId] = glyphId;
-          }
-        }
-        return charCodeToGlyphId;
-      }
-
-      var encoding = cff.encoding ? cff.encoding.encoding : null;
-      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);
-      return charCodeToGlyphId;
-    }
-  };
-
-  return CFFFont;
-})();
-
-var CFFParser = (function CFFParserClosure() {
-  var CharstringValidationData = [
-    null,
-    { id: 'hstem', min: 2, stackClearing: true, stem: true },
-    null,
-    { id: 'vstem', min: 2, stackClearing: true, stem: true },
-    { id: 'vmoveto', min: 1, stackClearing: true },
-    { id: 'rlineto', min: 2, resetStack: true },
-    { id: 'hlineto', min: 1, resetStack: true },
-    { id: 'vlineto', min: 1, resetStack: true },
-    { id: 'rrcurveto', min: 6, resetStack: true },
-    null,
-    { id: 'callsubr', min: 1, undefStack: true },
-    { id: 'return', min: 0, undefStack: true },
-    null, // 12
-    null,
-    { id: 'endchar', min: 0, stackClearing: true },
-    null,
-    null,
-    null,
-    { id: 'hstemhm', min: 2, stackClearing: true, stem: true },
-    { id: 'hintmask', min: 0, stackClearing: true },
-    { id: 'cntrmask', min: 0, stackClearing: true },
-    { id: 'rmoveto', min: 2, stackClearing: true },
-    { id: 'hmoveto', min: 1, stackClearing: true },
-    { id: 'vstemhm', min: 2, stackClearing: true, stem: true },
-    { id: 'rcurveline', min: 8, resetStack: true },
-    { id: 'rlinecurve', min: 8, resetStack: true },
-    { id: 'vvcurveto', min: 4, resetStack: true },
-    { id: 'hhcurveto', min: 4, resetStack: true },
-    null, // shortint
-    { id: 'callgsubr', min: 1, undefStack: true },
-    { id: 'vhcurveto', min: 4, resetStack: true },
-    { id: 'hvcurveto', min: 4, resetStack: true }
-  ];
-  var CharstringValidationData12 = [
-    null,
-    null,
-    null,
-    { id: 'and', min: 2, stackDelta: -1 },
-    { id: 'or', min: 2, stackDelta: -1 },
-    { id: 'not', min: 1, stackDelta: 0 },
-    null,
-    null,
-    null,
-    { id: 'abs', min: 1, stackDelta: 0 },
-    { id: 'add', min: 2, stackDelta: -1,
-      stackFn: function stack_div(stack, index) {
-        stack[index - 2] = stack[index - 2] + stack[index - 1];
-      }
-    },
-    { id: 'sub', min: 2, stackDelta: -1,
-      stackFn: function stack_div(stack, index) {
-        stack[index - 2] = stack[index - 2] - stack[index - 1];
-      }
-    },
-    { id: 'div', min: 2, stackDelta: -1,
-      stackFn: function stack_div(stack, index) {
-        stack[index - 2] = stack[index - 2] / stack[index - 1];
-      }
-    },
-    null,
-    { id: 'neg', min: 1, stackDelta: 0,
-      stackFn: function stack_div(stack, index) {
-        stack[index - 1] = -stack[index - 1];
-      }
-    },
-    { id: 'eq', min: 2, stackDelta: -1 },
-    null,
-    null,
-    { id: 'drop', min: 1, stackDelta: -1 },
-    null,
-    { id: 'put', min: 2, stackDelta: -2 },
-    { id: 'get', min: 1, stackDelta: 0 },
-    { id: 'ifelse', min: 4, stackDelta: -3 },
-    { id: 'random', min: 0, stackDelta: 1 },
-    { id: 'mul', min: 2, stackDelta: -1,
-      stackFn: function stack_div(stack, index) {
-        stack[index - 2] = stack[index - 2] * stack[index - 1];
-      }
-    },
-    null,
-    { id: 'sqrt', min: 1, stackDelta: 0 },
-    { id: 'dup', min: 1, stackDelta: 1 },
-    { id: 'exch', min: 2, stackDelta: 0 },
-    { id: 'index', min: 2, stackDelta: 0 },
-    { id: 'roll', min: 3, stackDelta: -2 },
-    null,
-    null,
-    null,
-    { id: 'hflex', min: 7, resetStack: true },
-    { id: 'flex', min: 13, resetStack: true },
-    { id: 'hflex1', min: 9, resetStack: true },
-    { id: 'flex1', min: 11, resetStack: true }
-  ];
-
-  function CFFParser(file, properties) {
-    this.bytes = file.getBytes();
-    this.properties = properties;
-  }
-  CFFParser.prototype = {
-    parse: function CFFParser_parse() {
-      var properties = this.properties;
-      var cff = new CFF();
-      this.cff = cff;
-
-      // The first five sections must be in order, all the others are reached
-      // via offsets contained in one of the below.
-      var header = this.parseHeader();
-      var nameIndex = this.parseIndex(header.endPos);
-      var topDictIndex = this.parseIndex(nameIndex.endPos);
-      var stringIndex = this.parseIndex(topDictIndex.endPos);
-      var globalSubrIndex = this.parseIndex(stringIndex.endPos);
-
-      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
-      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
-
-      cff.header = header.obj;
-      cff.names = this.parseNameIndex(nameIndex.obj);
-      cff.strings = this.parseStringIndex(stringIndex.obj);
-      cff.topDict = topDict;
-      cff.globalSubrIndex = globalSubrIndex.obj;
-
-      this.parsePrivateDict(cff.topDict);
-
-      cff.isCIDFont = topDict.hasName('ROS');
-
-      var charStringOffset = topDict.getByName('CharStrings');
-      var charStringsAndSeacs = this.parseCharStrings(charStringOffset);
-      cff.charStrings = charStringsAndSeacs.charStrings;
-      cff.seacs = charStringsAndSeacs.seacs;
-      cff.widths = charStringsAndSeacs.widths;
-
-      var fontMatrix = topDict.getByName('FontMatrix');
-      if (fontMatrix) {
-        properties.fontMatrix = fontMatrix;
-      }
-
-      var fontBBox = topDict.getByName('FontBBox');
-      if (fontBBox) {
-        // adjusting ascent/descent
-        properties.ascent = fontBBox[3];
-        properties.descent = fontBBox[1];
-        properties.ascentScaled = true;
-      }
-
-      var charset, encoding;
-      if (cff.isCIDFont) {
-        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
-        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
-          var dictRaw = fdArrayIndex.get(i);
-          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),
-                                         cff.strings);
-          this.parsePrivateDict(fontDict);
-          cff.fdArray.push(fontDict);
-        }
-        // cid fonts don't have an encoding
-        encoding = null;
-        charset = this.parseCharsets(topDict.getByName('charset'),
-                                     cff.charStrings.count, cff.strings, true);
-        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),
-                                             cff.charStrings.count);
-      } else {
-        charset = this.parseCharsets(topDict.getByName('charset'),
-                                     cff.charStrings.count, cff.strings, false);
-        encoding = this.parseEncoding(topDict.getByName('Encoding'),
-                                      properties,
-                                      cff.strings, charset.charset);
-      }
-      cff.charset = charset;
-      cff.encoding = encoding;
-
-      return cff;
-    },
-    parseHeader: function CFFParser_parseHeader() {
-      var bytes = this.bytes;
-      var bytesLength = bytes.length;
-      var offset = 0;
-
-      // Prevent an infinite loop, by checking that the offset is within the
-      // bounds of the bytes array. Necessary in empty, or invalid, font files.
-      while (offset < bytesLength && bytes[offset] !== 1) {
-        ++offset;
-      }
-      if (offset >= bytesLength) {
-        error('Invalid CFF header');
-      } else if (offset !== 0) {
-        info('cff data is shifted');
-        bytes = bytes.subarray(offset);
-        this.bytes = bytes;
-      }
-      var major = bytes[0];
-      var minor = bytes[1];
-      var hdrSize = bytes[2];
-      var offSize = bytes[3];
-      var header = new CFFHeader(major, minor, hdrSize, offSize);
-      return { obj: header, endPos: hdrSize };
-    },
-    parseDict: function CFFParser_parseDict(dict) {
-      var pos = 0;
-
-      function parseOperand() {
-        var value = dict[pos++];
-        if (value === 30) {
-          return parseFloatOperand(pos);
-        } else if (value === 28) {
-          value = dict[pos++];
-          value = ((value << 24) | (dict[pos++] << 16)) >> 16;
-          return value;
-        } else if (value === 29) {
-          value = dict[pos++];
-          value = (value << 8) | dict[pos++];
-          value = (value << 8) | dict[pos++];
-          value = (value << 8) | dict[pos++];
-          return value;
-        } else if (value >= 32 && value <= 246) {
-          return value - 139;
-        } else if (value >= 247 && value <= 250) {
-          return ((value - 247) * 256) + dict[pos++] + 108;
-        } else if (value >= 251 && value <= 254) {
-          return -((value - 251) * 256) - dict[pos++] - 108;
-        } else {
-          error('255 is not a valid DICT command');
-        }
-        return -1;
-      }
-
-      function parseFloatOperand() {
-        var str = '';
-        var eof = 15;
-        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
-            '9', '.', 'E', 'E-', null, '-'];
-        var length = dict.length;
-        while (pos < length) {
-          var b = dict[pos++];
-          var b1 = b >> 4;
-          var b2 = b & 15;
-
-          if (b1 === eof) {
-            break;
-          }
-          str += lookup[b1];
-
-          if (b2 === eof) {
-            break;
-          }
-          str += lookup[b2];
-        }
-        return parseFloat(str);
-      }
-
-      var operands = [];
-      var entries = [];
-
-      pos = 0;
-      var end = dict.length;
-      while (pos < end) {
-        var b = dict[pos];
-        if (b <= 21) {
-          if (b === 12) {
-            b = (b << 8) | dict[++pos];
-          }
-          entries.push([b, operands]);
-          operands = [];
-          ++pos;
-        } else {
-          operands.push(parseOperand());
-        }
-      }
-      return entries;
-    },
-    parseIndex: function CFFParser_parseIndex(pos) {
-      var cffIndex = new CFFIndex();
-      var bytes = this.bytes;
-      var count = (bytes[pos++] << 8) | bytes[pos++];
-      var offsets = [];
-      var end = pos;
-      var i, ii;
-
-      if (count !== 0) {
-        var offsetSize = bytes[pos++];
-        // add 1 for offset to determine size of last object
-        var startPos = pos + ((count + 1) * offsetSize) - 1;
-
-        for (i = 0, ii = count + 1; i < ii; ++i) {
-          var offset = 0;
-          for (var j = 0; j < offsetSize; ++j) {
-            offset <<= 8;
-            offset += bytes[pos++];
-          }
-          offsets.push(startPos + offset);
-        }
-        end = offsets[count];
-      }
-      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
-        var offsetStart = offsets[i];
-        var offsetEnd = offsets[i + 1];
-        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
-      }
-      return {obj: cffIndex, endPos: end};
-    },
-    parseNameIndex: function CFFParser_parseNameIndex(index) {
-      var names = [];
-      for (var i = 0, ii = index.count; i < ii; ++i) {
-        var name = index.get(i);
-        // OTS doesn't allow names to be over 127 characters.
-        var length = Math.min(name.length, 127);
-        var data = [];
-        // OTS also only permits certain characters in the name.
-        for (var j = 0; j < length; ++j) {
-          var c = name[j];
-          if (j === 0 && c === 0) {
-            data[j] = c;
-            continue;
-          }
-          if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||
-              c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||
-              c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||
-              c === 47 /* / */ || c === 37 /* % */ || c === 35 /* # */) {
-            data[j] = 95;
-            continue;
-          }
-          data[j] = c;
-        }
-        names.push(bytesToString(data));
-      }
-      return names;
-    },
-    parseStringIndex: function CFFParser_parseStringIndex(index) {
-      var strings = new CFFStrings();
-      for (var i = 0, ii = index.count; i < ii; ++i) {
-        var data = index.get(i);
-        strings.add(bytesToString(data));
-      }
-      return strings;
-    },
-    createDict: function CFFParser_createDict(Type, dict, strings) {
-      var cffDict = new Type(strings);
-      for (var i = 0, ii = dict.length; i < ii; ++i) {
-        var pair = dict[i];
-        var key = pair[0];
-        var value = pair[1];
-        cffDict.setByKey(key, value);
-      }
-      return cffDict;
-    },
-    parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {
-      var charStrings = this.parseIndex(charStringOffset).obj;
-      var seacs = [];
-      var widths = [];
-      var count = charStrings.count;
-      for (var i = 0; i < count; i++) {
-        var charstring = charStrings.get(i);
-
-        var stackSize = 0;
-        var stack = [];
-        var undefStack = true;
-        var hints = 0;
-        var valid = true;
-        var data = charstring;
-        var length = data.length;
-        var firstStackClearing = true;
-        for (var j = 0; j < length;) {
-          var value = data[j++];
-          var validationCommand = null;
-          if (value === 12) {
-            var q = data[j++];
-            if (q === 0) {
-              // The CFF specification state that the 'dotsection' command
-              // (12, 0) is deprecated and treated as a no-op, but all Type2
-              // charstrings processors should support them. Unfortunately
-              // the font sanitizer don't. As a workaround the sequence (12, 0)
-              // is replaced by a useless (0, hmoveto).
-              data[j - 2] = 139;
-              data[j - 1] = 22;
-              stackSize = 0;
-            } else {
-              validationCommand = CharstringValidationData12[q];
-            }
-          } else if (value === 28) { // number (16 bit)
-            stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16;
-            j += 2;
-            stackSize++;
-          } else if (value === 14) {
-            if (stackSize >= 4) {
-              stackSize -= 4;
-              if (SEAC_ANALYSIS_ENABLED) {
-                seacs[i] = stack.slice(stackSize, stackSize + 4);
-                valid = false;
-              }
-            }
-            validationCommand = CharstringValidationData[value];
-          } else if (value >= 32 && value <= 246) {  // number
-            stack[stackSize] = value - 139;
-            stackSize++;
-          } else if (value >= 247 && value <= 254) {  // number (+1 bytes)
-            stack[stackSize] = (value < 251 ?
-                                ((value - 247) << 8) + data[j] + 108 :
-                                -((value - 251) << 8) - data[j] - 108);
-            j++;
-            stackSize++;
-          } else if (value === 255) {  // number (32 bit)
-            stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) |
-                                (data[j + 2] << 8) | data[j + 3]) / 65536;
-            j += 4;
-            stackSize++;
-          } else if (value === 19 || value === 20) {
-            hints += stackSize >> 1;
-            j += (hints + 7) >> 3; // skipping right amount of hints flag data
-            stackSize %= 2;
-            validationCommand = CharstringValidationData[value];
-          } else {
-            validationCommand = CharstringValidationData[value];
-          }
-          if (validationCommand) {
-            if (validationCommand.stem) {
-              hints += stackSize >> 1;
-            }
-            if ('min' in validationCommand) {
-              if (!undefStack && stackSize < validationCommand.min) {
-                warn('Not enough parameters for ' + validationCommand.id +
-                     '; actual: ' + stackSize +
-                     ', expected: ' + validationCommand.min);
-                valid = false;
-                break;
-              }
-            }
-            if (firstStackClearing && validationCommand.stackClearing) {
-              firstStackClearing = false;
-              // the optional character width can be found before the first
-              // stack-clearing command arguments
-              stackSize -= validationCommand.min;
-              if (stackSize >= 2 && validationCommand.stem) {
-                // there are even amount of arguments for stem commands
-                stackSize %= 2;
-              } else if (stackSize > 1) {
-                warn('Found too many parameters for stack-clearing command');
-              }
-              if (stackSize > 0 && stack[stackSize - 1] >= 0) {
-                widths[i] = stack[stackSize - 1];
-              }
-            }
-            if ('stackDelta' in validationCommand) {
-              if ('stackFn' in validationCommand) {
-                validationCommand.stackFn(stack, stackSize);
-              }
-              stackSize += validationCommand.stackDelta;
-            } else if (validationCommand.stackClearing) {
-              stackSize = 0;
-            } else if (validationCommand.resetStack) {
-              stackSize = 0;
-              undefStack = false;
-            } else if (validationCommand.undefStack) {
-              stackSize = 0;
-              undefStack = true;
-              firstStackClearing = false;
-            }
-          }
-        }
-        if (!valid) {
-          // resetting invalid charstring to single 'endchar'
-          charStrings.set(i, new Uint8Array([14]));
-        }
-      }
-      return { charStrings: charStrings, seacs: seacs, widths: widths };
-    },
-    emptyPrivateDictionary:
-      function CFFParser_emptyPrivateDictionary(parentDict) {
-      var privateDict = this.createDict(CFFPrivateDict, [],
-                                        parentDict.strings);
-      parentDict.setByKey(18, [0, 0]);
-      parentDict.privateDict = privateDict;
-    },
-    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
-      // no private dict, do nothing
-      if (!parentDict.hasName('Private')) {
-        this.emptyPrivateDictionary(parentDict);
-        return;
-      }
-      var privateOffset = parentDict.getByName('Private');
-      // make sure the params are formatted correctly
-      if (!isArray(privateOffset) || privateOffset.length !== 2) {
-        parentDict.removeByName('Private');
-        return;
-      }
-      var size = privateOffset[0];
-      var offset = privateOffset[1];
-      // remove empty dicts or ones that refer to invalid location
-      if (size === 0 || offset >= this.bytes.length) {
-        this.emptyPrivateDictionary(parentDict);
-        return;
-      }
-
-      var privateDictEnd = offset + size;
-      var dictData = this.bytes.subarray(offset, privateDictEnd);
-      var dict = this.parseDict(dictData);
-      var privateDict = this.createDict(CFFPrivateDict, dict,
-                                        parentDict.strings);
-      parentDict.privateDict = privateDict;
-
-      // Parse the Subrs index also since it's relative to the private dict.
-      if (!privateDict.getByName('Subrs')) {
-        return;
-      }
-      var subrsOffset = privateDict.getByName('Subrs');
-      var relativeOffset = offset + subrsOffset;
-      // Validate the offset.
-      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
-        this.emptyPrivateDictionary(parentDict);
-        return;
-      }
-      var subrsIndex = this.parseIndex(relativeOffset);
-      privateDict.subrsIndex = subrsIndex.obj;
-    },
-    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
-      if (pos === 0) {
-        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
-                              ISOAdobeCharset);
-      } else if (pos === 1) {
-        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
-                              ExpertCharset);
-      } else if (pos === 2) {
-        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
-                              ExpertSubsetCharset);
-      }
-
-      var bytes = this.bytes;
-      var start = pos;
-      var format = bytes[pos++];
-      var charset = ['.notdef'];
-      var id, count, i;
-
-      // subtract 1 for the .notdef glyph
-      length -= 1;
-
-      switch (format) {
-        case 0:
-          for (i = 0; i < length; i++) {
-            id = (bytes[pos++] << 8) | bytes[pos++];
-            charset.push(cid ? id : strings.get(id));
-          }
-          break;
-        case 1:
-          while (charset.length <= length) {
-            id = (bytes[pos++] << 8) | bytes[pos++];
-            count = bytes[pos++];
-            for (i = 0; i <= count; i++) {
-              charset.push(cid ? id++ : strings.get(id++));
-            }
-          }
-          break;
-        case 2:
-          while (charset.length <= length) {
-            id = (bytes[pos++] << 8) | bytes[pos++];
-            count = (bytes[pos++] << 8) | bytes[pos++];
-            for (i = 0; i <= count; i++) {
-              charset.push(cid ? id++ : strings.get(id++));
-            }
-          }
-          break;
-        default:
-          error('Unknown charset format');
-      }
-      // Raw won't be needed if we actually compile the charset.
-      var end = pos;
-      var raw = bytes.subarray(start, end);
-
-      return new CFFCharset(false, format, charset, raw);
-    },
-    parseEncoding: function CFFParser_parseEncoding(pos,
-                                                    properties,
-                                                    strings,
-                                                    charset) {
-      var encoding = {};
-      var bytes = this.bytes;
-      var predefined = false;
-      var hasSupplement = false;
-      var format, i, ii;
-      var raw = null;
-
-      function readSupplement() {
-        var supplementsCount = bytes[pos++];
-        for (i = 0; i < supplementsCount; i++) {
-          var code = bytes[pos++];
-          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
-          encoding[code] = charset.indexOf(strings.get(sid));
-        }
-      }
-
-      if (pos === 0 || pos === 1) {
-        predefined = true;
-        format = pos;
-        var baseEncoding = pos ? Encodings.ExpertEncoding :
-                                 Encodings.StandardEncoding;
-        for (i = 0, ii = charset.length; i < ii; i++) {
-          var index = baseEncoding.indexOf(charset[i]);
-          if (index !== -1) {
-            encoding[index] = i;
-          }
-        }
-      } else {
-        var dataStart = pos;
-        format = bytes[pos++];
-        switch (format & 0x7f) {
-          case 0:
-            var glyphsCount = bytes[pos++];
-            for (i = 1; i <= glyphsCount; i++) {
-              encoding[bytes[pos++]] = i;
-            }
-            break;
-
-          case 1:
-            var rangesCount = bytes[pos++];
-            var gid = 1;
-            for (i = 0; i < rangesCount; i++) {
-              var start = bytes[pos++];
-              var left = bytes[pos++];
-              for (var j = start; j <= start + left; j++) {
-                encoding[j] = gid++;
-              }
-            }
-            break;
-
-          default:
-            error('Unknow encoding format: ' + format + ' in CFF');
-            break;
-        }
-        var dataEnd = pos;
-        if (format & 0x80) {
-          // The font sanitizer does not support CFF encoding with a
-          // supplement, since the encoding is not really used to map
-          // between gid to glyph, let's overwrite what is declared in
-          // the top dictionary to let the sanitizer think the font use
-          // StandardEncoding, that's a lie but that's ok.
-          bytes[dataStart] &= 0x7f;
-          readSupplement();
-          hasSupplement = true;
-        }
-        raw = bytes.subarray(dataStart, dataEnd);
-      }
-      format = format & 0x7f;
-      return new CFFEncoding(predefined, format, encoding, raw);
-    },
-    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
-      var start = pos;
-      var bytes = this.bytes;
-      var format = bytes[pos++];
-      var fdSelect = [];
-      var i;
-
-      switch (format) {
-        case 0:
-          for (i = 0; i < length; ++i) {
-            var id = bytes[pos++];
-            fdSelect.push(id);
-          }
-          break;
-        case 3:
-          var rangesCount = (bytes[pos++] << 8) | bytes[pos++];
-          for (i = 0; i < rangesCount; ++i) {
-            var first = (bytes[pos++] << 8) | bytes[pos++];
-            var fdIndex = bytes[pos++];
-            var next = (bytes[pos] << 8) | bytes[pos + 1];
-            for (var j = first; j < next; ++j) {
-              fdSelect.push(fdIndex);
-            }
-          }
-          // Advance past the sentinel(next).
-          pos += 2;
-          break;
-        default:
-          error('Unknown fdselect format ' + format);
-          break;
-      }
-      var end = pos;
-      return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
-    }
-  };
-  return CFFParser;
-})();
-
-// Compact Font Format
-var CFF = (function CFFClosure() {
-  function CFF() {
-    this.header = null;
-    this.names = [];
-    this.topDict = null;
-    this.strings = new CFFStrings();
-    this.globalSubrIndex = null;
-
-    // The following could really be per font, but since we only have one font
-    // store them here.
-    this.encoding = null;
-    this.charset = null;
-    this.charStrings = null;
-    this.fdArray = [];
-    this.fdSelect = null;
-
-    this.isCIDFont = false;
-  }
-  return CFF;
-})();
-
-var CFFHeader = (function CFFHeaderClosure() {
-  function CFFHeader(major, minor, hdrSize, offSize) {
-    this.major = major;
-    this.minor = minor;
-    this.hdrSize = hdrSize;
-    this.offSize = offSize;
-  }
-  return CFFHeader;
-})();
-
-var CFFStrings = (function CFFStringsClosure() {
-  function CFFStrings() {
-    this.strings = [];
-  }
-  CFFStrings.prototype = {
-    get: function CFFStrings_get(index) {
-      if (index >= 0 && index <= 390) {
-        return CFFStandardStrings[index];
-      }
-      if (index - 391 <= this.strings.length) {
-        return this.strings[index - 391];
-      }
-      return CFFStandardStrings[0];
-    },
-    add: function CFFStrings_add(value) {
-      this.strings.push(value);
-    },
-    get count() {
-      return this.strings.length;
-    }
-  };
-  return CFFStrings;
-})();
-
-var CFFIndex = (function CFFIndexClosure() {
-  function CFFIndex() {
-    this.objects = [];
-    this.length = 0;
-  }
-  CFFIndex.prototype = {
-    add: function CFFIndex_add(data) {
-      this.length += data.length;
-      this.objects.push(data);
-    },
-    set: function CFFIndex_set(index, data) {
-      this.length += data.length - this.objects[index].length;
-      this.objects[index] = data;
-    },
-    get: function CFFIndex_get(index) {
-      return this.objects[index];
-    },
-    get count() {
-      return this.objects.length;
-    }
-  };
-  return CFFIndex;
-})();
-
-var CFFDict = (function CFFDictClosure() {
-  function CFFDict(tables, strings) {
-    this.keyToNameMap = tables.keyToNameMap;
-    this.nameToKeyMap = tables.nameToKeyMap;
-    this.defaults = tables.defaults;
-    this.types = tables.types;
-    this.opcodes = tables.opcodes;
-    this.order = tables.order;
-    this.strings = strings;
-    this.values = {};
-  }
-  CFFDict.prototype = {
-    // value should always be an array
-    setByKey: function CFFDict_setByKey(key, value) {
-      if (!(key in this.keyToNameMap)) {
-        return false;
-      }
-      // ignore empty values
-      if (value.length === 0) {
-        return true;
-      }
-      var type = this.types[key];
-      // remove the array wrapping these types of values
-      if (type === 'num' || type === 'sid' || type === 'offset') {
-        value = value[0];
-      }
-      this.values[key] = value;
-      return true;
-    },
-    setByName: function CFFDict_setByName(name, value) {
-      if (!(name in this.nameToKeyMap)) {
-        error('Invalid dictionary name "' + name + '"');
-      }
-      this.values[this.nameToKeyMap[name]] = value;
-    },
-    hasName: function CFFDict_hasName(name) {
-      return this.nameToKeyMap[name] in this.values;
-    },
-    getByName: function CFFDict_getByName(name) {
-      if (!(name in this.nameToKeyMap)) {
-        error('Invalid dictionary name "' + name + '"');
-      }
-      var key = this.nameToKeyMap[name];
-      if (!(key in this.values)) {
-        return this.defaults[key];
-      }
-      return this.values[key];
-    },
-    removeByName: function CFFDict_removeByName(name) {
-      delete this.values[this.nameToKeyMap[name]];
-    }
-  };
-  CFFDict.createTables = function CFFDict_createTables(layout) {
-    var tables = {
-      keyToNameMap: {},
-      nameToKeyMap: {},
-      defaults: {},
-      types: {},
-      opcodes: {},
-      order: []
-    };
-    for (var i = 0, ii = layout.length; i < ii; ++i) {
-      var entry = layout[i];
-      var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
-      tables.keyToNameMap[key] = entry[1];
-      tables.nameToKeyMap[entry[1]] = key;
-      tables.types[key] = entry[2];
-      tables.defaults[key] = entry[3];
-      tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];
-      tables.order.push(key);
-    }
-    return tables;
-  };
-  return CFFDict;
-})();
-
-var CFFTopDict = (function CFFTopDictClosure() {
-  var layout = [
-    [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],
-    [[12, 20], 'SyntheticBase', 'num', null],
-    [0, 'version', 'sid', null],
-    [1, 'Notice', 'sid', null],
-    [[12, 0], 'Copyright', 'sid', null],
-    [2, 'FullName', 'sid', null],
-    [3, 'FamilyName', 'sid', null],
-    [4, 'Weight', 'sid', null],
-    [[12, 1], 'isFixedPitch', 'num', 0],
-    [[12, 2], 'ItalicAngle', 'num', 0],
-    [[12, 3], 'UnderlinePosition', 'num', -100],
-    [[12, 4], 'UnderlineThickness', 'num', 50],
-    [[12, 5], 'PaintType', 'num', 0],
-    [[12, 6], 'CharstringType', 'num', 2],
-    [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],
-                            [0.001, 0, 0, 0.001, 0, 0]],
-    [13, 'UniqueID', 'num', null],
-    [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],
-    [[12, 8], 'StrokeWidth', 'num', 0],
-    [14, 'XUID', 'array', null],
-    [15, 'charset', 'offset', 0],
-    [16, 'Encoding', 'offset', 0],
-    [17, 'CharStrings', 'offset', 0],
-    [18, 'Private', ['offset', 'offset'], null],
-    [[12, 21], 'PostScript', 'sid', null],
-    [[12, 22], 'BaseFontName', 'sid', null],
-    [[12, 23], 'BaseFontBlend', 'delta', null],
-    [[12, 31], 'CIDFontVersion', 'num', 0],
-    [[12, 32], 'CIDFontRevision', 'num', 0],
-    [[12, 33], 'CIDFontType', 'num', 0],
-    [[12, 34], 'CIDCount', 'num', 8720],
-    [[12, 35], 'UIDBase', 'num', null],
-    // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes
-    // before FDArray.
-    [[12, 37], 'FDSelect', 'offset', null],
-    [[12, 36], 'FDArray', 'offset', null],
-    [[12, 38], 'FontName', 'sid', null]
-  ];
-  var tables = null;
-  function CFFTopDict(strings) {
-    if (tables === null) {
-      tables = CFFDict.createTables(layout);
-    }
-    CFFDict.call(this, tables, strings);
-    this.privateDict = null;
-  }
-  CFFTopDict.prototype = Object.create(CFFDict.prototype);
-  return CFFTopDict;
-})();
-
-var CFFPrivateDict = (function CFFPrivateDictClosure() {
-  var layout = [
-    [6, 'BlueValues', 'delta', null],
-    [7, 'OtherBlues', 'delta', null],
-    [8, 'FamilyBlues', 'delta', null],
-    [9, 'FamilyOtherBlues', 'delta', null],
-    [[12, 9], 'BlueScale', 'num', 0.039625],
-    [[12, 10], 'BlueShift', 'num', 7],
-    [[12, 11], 'BlueFuzz', 'num', 1],
-    [10, 'StdHW', 'num', null],
-    [11, 'StdVW', 'num', null],
-    [[12, 12], 'StemSnapH', 'delta', null],
-    [[12, 13], 'StemSnapV', 'delta', null],
-    [[12, 14], 'ForceBold', 'num', 0],
-    [[12, 17], 'LanguageGroup', 'num', 0],
-    [[12, 18], 'ExpansionFactor', 'num', 0.06],
-    [[12, 19], 'initialRandomSeed', 'num', 0],
-    [20, 'defaultWidthX', 'num', 0],
-    [21, 'nominalWidthX', 'num', 0],
-    [19, 'Subrs', 'offset', null]
-  ];
-  var tables = null;
-  function CFFPrivateDict(strings) {
-    if (tables === null) {
-      tables = CFFDict.createTables(layout);
-    }
-    CFFDict.call(this, tables, strings);
-    this.subrsIndex = null;
-  }
-  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
-  return CFFPrivateDict;
-})();
-
-var CFFCharsetPredefinedTypes = {
-  ISO_ADOBE: 0,
-  EXPERT: 1,
-  EXPERT_SUBSET: 2
-};
-var CFFCharset = (function CFFCharsetClosure() {
-  function CFFCharset(predefined, format, charset, raw) {
-    this.predefined = predefined;
-    this.format = format;
-    this.charset = charset;
-    this.raw = raw;
-  }
-  return CFFCharset;
-})();
-
-var CFFEncoding = (function CFFEncodingClosure() {
-  function CFFEncoding(predefined, format, encoding, raw) {
-    this.predefined = predefined;
-    this.format = format;
-    this.encoding = encoding;
-    this.raw = raw;
-  }
-  return CFFEncoding;
-})();
-
-var CFFFDSelect = (function CFFFDSelectClosure() {
-  function CFFFDSelect(fdSelect, raw) {
-    this.fdSelect = fdSelect;
-    this.raw = raw;
-  }
-  return CFFFDSelect;
-})();
-
-// Helper class to keep track of where an offset is within the data and helps
-// filling in that offset once it's known.
-var CFFOffsetTracker = (function CFFOffsetTrackerClosure() {
-  function CFFOffsetTracker() {
-    this.offsets = {};
-  }
-  CFFOffsetTracker.prototype = {
-    isTracking: function CFFOffsetTracker_isTracking(key) {
-      return key in this.offsets;
-    },
-    track: function CFFOffsetTracker_track(key, location) {
-      if (key in this.offsets) {
-        error('Already tracking location of ' + key);
-      }
-      this.offsets[key] = location;
-    },
-    offset: function CFFOffsetTracker_offset(value) {
-      for (var key in this.offsets) {
-        this.offsets[key] += value;
-      }
-    },
-    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
-                                                                 values,
-                                                                 output) {
-      if (!(key in this.offsets)) {
-        error('Not tracking location of ' + key);
-      }
-      var data = output.data;
-      var dataOffset = this.offsets[key];
-      var size = 5;
-      for (var i = 0, ii = values.length; i < ii; ++i) {
-        var offset0 = i * size + dataOffset;
-        var offset1 = offset0 + 1;
-        var offset2 = offset0 + 2;
-        var offset3 = offset0 + 3;
-        var offset4 = offset0 + 4;
-        // It's easy to screw up offsets so perform this sanity check.
-        if (data[offset0] !== 0x1d || data[offset1] !== 0 ||
-            data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
-          error('writing to an offset that is not empty');
-        }
-        var value = values[i];
-        data[offset0] = 0x1d;
-        data[offset1] = (value >> 24) & 0xFF;
-        data[offset2] = (value >> 16) & 0xFF;
-        data[offset3] = (value >> 8) & 0xFF;
-        data[offset4] = value & 0xFF;
-      }
-    }
-  };
-  return CFFOffsetTracker;
-})();
-
-// Takes a CFF and converts it to the binary representation.
-var CFFCompiler = (function CFFCompilerClosure() {
-  function CFFCompiler(cff) {
-    this.cff = cff;
-  }
-  CFFCompiler.prototype = {
-    compile: function CFFCompiler_compile() {
-      var cff = this.cff;
-      var output = {
-        data: [],
-        length: 0,
-        add: function CFFCompiler_add(data) {
-          this.data = this.data.concat(data);
-          this.length = this.data.length;
-        }
-      };
-
-      // Compile the five entries that must be in order.
-      var header = this.compileHeader(cff.header);
-      output.add(header);
-
-      var nameIndex = this.compileNameIndex(cff.names);
-      output.add(nameIndex);
-
-      if (cff.isCIDFont) {
-        // The spec is unclear on how font matrices should relate to each other
-        // when there is one in the main top dict and the sub top dicts.
-        // Windows handles this differently than linux and osx so we have to
-        // normalize to work on all.
-        // Rules based off of some mailing list discussions:
-        // - If main font has a matrix and subfont doesn't, use the main matrix.
-        // - If no main font matrix and there is a subfont matrix, use the
-        //   subfont matrix.
-        // - If both have matrices, concat together.
-        // - If neither have matrices, use default.
-        // To make this work on all platforms we move the top matrix into each
-        // sub top dict and concat if necessary.
-        if (cff.topDict.hasName('FontMatrix')) {
-          var base = cff.topDict.getByName('FontMatrix');
-          cff.topDict.removeByName('FontMatrix');
-          for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
-            var subDict = cff.fdArray[i];
-            var matrix = base.slice(0);
-            if (subDict.hasName('FontMatrix')) {
-              matrix = Util.transform(matrix, subDict.getByName('FontMatrix'));
-            }
-            subDict.setByName('FontMatrix', matrix);
-          }
-        }
-      }
-
-      var compiled = this.compileTopDicts([cff.topDict],
-                                          output.length,
-                                          cff.isCIDFont);
-      output.add(compiled.output);
-      var topDictTracker = compiled.trackers[0];
-
-      var stringIndex = this.compileStringIndex(cff.strings.strings);
-      output.add(stringIndex);
-
-      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
-      output.add(globalSubrIndex);
-
-      // Now start on the other entries that have no specfic order.
-      if (cff.encoding && cff.topDict.hasName('Encoding')) {
-        if (cff.encoding.predefined) {
-          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],
-                                          output);
-        } else {
-          var encoding = this.compileEncoding(cff.encoding);
-          topDictTracker.setEntryLocation('Encoding', [output.length], output);
-          output.add(encoding);
-        }
-      }
-
-      if (cff.charset && cff.topDict.hasName('charset')) {
-        if (cff.charset.predefined) {
-          topDictTracker.setEntryLocation('charset', [cff.charset.format],
-                                          output);
-        } else {
-          var charset = this.compileCharset(cff.charset);
-          topDictTracker.setEntryLocation('charset', [output.length], output);
-          output.add(charset);
-        }
-      }
-
-      var charStrings = this.compileCharStrings(cff.charStrings);
-      topDictTracker.setEntryLocation('CharStrings', [output.length], output);
-      output.add(charStrings);
-
-      if (cff.isCIDFont) {
-        // For some reason FDSelect must be in front of FDArray on windows. OSX
-        // and linux don't seem to care.
-        topDictTracker.setEntryLocation('FDSelect', [output.length], output);
-        var fdSelect = this.compileFDSelect(cff.fdSelect.raw);
-        output.add(fdSelect);
-        // It is unclear if the sub font dictionary can have CID related
-        // dictionary keys, but the sanitizer doesn't like them so remove them.
-        compiled = this.compileTopDicts(cff.fdArray, output.length, true);
-        topDictTracker.setEntryLocation('FDArray', [output.length], output);
-        output.add(compiled.output);
-        var fontDictTrackers = compiled.trackers;
-
-        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
-      }
-
-      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
-
-      // If the font data ends with INDEX whose object data is zero-length,
-      // the sanitizer will bail out. Add a dummy byte to avoid that.
-      output.add([0]);
-
-      return output.data;
-    },
-    encodeNumber: function CFFCompiler_encodeNumber(value) {
-      if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { // isInt
-        return this.encodeInteger(value);
-      } else {
-        return this.encodeFloat(value);
-      }
-    },
-    encodeFloat: function CFFCompiler_encodeFloat(num) {
-      var value = num.toString();
-
-      // rounding inaccurate doubles
-      var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value);
-      if (m) {
-        var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));
-        value = (Math.round(num * epsilon) / epsilon).toString();
-      }
-
-      var nibbles = '';
-      var i, ii;
-      for (i = 0, ii = value.length; i < ii; ++i) {
-        var a = value[i];
-        if (a === 'e') {
-          nibbles += value[++i] === '-' ? 'c' : 'b';
-        } else if (a === '.') {
-          nibbles += 'a';
-        } else if (a === '-') {
-          nibbles += 'e';
-        } else {
-          nibbles += a;
-        }
-      }
-      nibbles += (nibbles.length & 1) ? 'f' : 'ff';
-      var out = [30];
-      for (i = 0, ii = nibbles.length; i < ii; i += 2) {
-        out.push(parseInt(nibbles.substr(i, 2), 16));
-      }
-      return out;
-    },
-    encodeInteger: function CFFCompiler_encodeInteger(value) {
-      var code;
-      if (value >= -107 && value <= 107) {
-        code = [value + 139];
-      } else if (value >= 108 && value <= 1131) {
-        value = [value - 108];
-        code = [(value >> 8) + 247, value & 0xFF];
-      } else if (value >= -1131 && value <= -108) {
-        value = -value - 108;
-        code = [(value >> 8) + 251, value & 0xFF];
-      } else if (value >= -32768 && value <= 32767) {
-        code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];
-      } else {
-        code = [0x1d,
-                (value >> 24) & 0xFF,
-                (value >> 16) & 0xFF,
-                (value >> 8) & 0xFF,
-                 value & 0xFF];
-      }
-      return code;
-    },
-    compileHeader: function CFFCompiler_compileHeader(header) {
-      return [
-        header.major,
-        header.minor,
-        header.hdrSize,
-        header.offSize
-      ];
-    },
-    compileNameIndex: function CFFCompiler_compileNameIndex(names) {
-      var nameIndex = new CFFIndex();
-      for (var i = 0, ii = names.length; i < ii; ++i) {
-        nameIndex.add(stringToBytes(names[i]));
-      }
-      return this.compileIndex(nameIndex);
-    },
-    compileTopDicts: function CFFCompiler_compileTopDicts(dicts,
-                                                          length,
-                                                          removeCidKeys) {
-      var fontDictTrackers = [];
-      var fdArrayIndex = new CFFIndex();
-      for (var i = 0, ii = dicts.length; i < ii; ++i) {
-        var fontDict = dicts[i];
-        if (removeCidKeys) {
-          fontDict.removeByName('CIDFontVersion');
-          fontDict.removeByName('CIDFontRevision');
-          fontDict.removeByName('CIDFontType');
-          fontDict.removeByName('CIDCount');
-          fontDict.removeByName('UIDBase');
-        }
-        var fontDictTracker = new CFFOffsetTracker();
-        var fontDictData = this.compileDict(fontDict, fontDictTracker);
-        fontDictTrackers.push(fontDictTracker);
-        fdArrayIndex.add(fontDictData);
-        fontDictTracker.offset(length);
-      }
-      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
-      return {
-        trackers: fontDictTrackers,
-        output: fdArrayIndex
-      };
-    },
-    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
-                                                                  trackers,
-                                                                  output) {
-      for (var i = 0, ii = dicts.length; i < ii; ++i) {
-        var fontDict = dicts[i];
-        assert(fontDict.privateDict && fontDict.hasName('Private'),
-               'There must be an private dictionary.');
-        var privateDict = fontDict.privateDict;
-        var privateDictTracker = new CFFOffsetTracker();
-        var privateDictData = this.compileDict(privateDict, privateDictTracker);
-
-        var outputLength = output.length;
-        privateDictTracker.offset(outputLength);
-        if (!privateDictData.length) {
-          // The private dictionary was empty, set the output length to zero to
-          // ensure the offset length isn't out of bounds in the eyes of the
-          // sanitizer.
-          outputLength = 0;
-        }
-
-        trackers[i].setEntryLocation('Private',
-                                     [privateDictData.length, outputLength],
-                                     output);
-        output.add(privateDictData);
-
-        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
-          var subrs = this.compileIndex(privateDict.subrsIndex);
-          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
-                                              output);
-          output.add(subrs);
-        }
-      }
-    },
-    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
-      var out = [];
-      // The dictionary keys must be in a certain order.
-      var order = dict.order;
-      for (var i = 0; i < order.length; ++i) {
-        var key = order[i];
-        if (!(key in dict.values)) {
-          continue;
-        }
-        var values = dict.values[key];
-        var types = dict.types[key];
-        if (!isArray(types)) {
-          types = [types];
-        }
-        if (!isArray(values)) {
-          values = [values];
-        }
-
-        // Remove any empty dict values.
-        if (values.length === 0) {
-          continue;
-        }
-
-        for (var j = 0, jj = types.length; j < jj; ++j) {
-          var type = types[j];
-          var value = values[j];
-          switch (type) {
-            case 'num':
-            case 'sid':
-              out = out.concat(this.encodeNumber(value));
-              break;
-            case 'offset':
-              // For offsets we just insert a 32bit integer so we don't have to
-              // deal with figuring out the length of the offset when it gets
-              // replaced later on by the compiler.
-              var name = dict.keyToNameMap[key];
-              // Some offsets have the offset and the length, so just record the
-              // position of the first one.
-              if (!offsetTracker.isTracking(name)) {
-                offsetTracker.track(name, out.length);
-              }
-              out = out.concat([0x1d, 0, 0, 0, 0]);
-              break;
-            case 'array':
-            case 'delta':
-              out = out.concat(this.encodeNumber(value));
-              for (var k = 1, kk = values.length; k < kk; ++k) {
-                out = out.concat(this.encodeNumber(values[k]));
-              }
-              break;
-            default:
-              error('Unknown data type of ' + type);
-              break;
-          }
-        }
-        out = out.concat(dict.opcodes[key]);
-      }
-      return out;
-    },
-    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
-      var stringIndex = new CFFIndex();
-      for (var i = 0, ii = strings.length; i < ii; ++i) {
-        stringIndex.add(stringToBytes(strings[i]));
-      }
-      return this.compileIndex(stringIndex);
-    },
-    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
-      var globalSubrIndex = this.cff.globalSubrIndex;
-      this.out.writeByteArray(this.compileIndex(globalSubrIndex));
-    },
-    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
-      return this.compileIndex(charStrings);
-    },
-    compileCharset: function CFFCompiler_compileCharset(charset) {
-      return this.compileTypedArray(charset.raw);
-    },
-    compileEncoding: function CFFCompiler_compileEncoding(encoding) {
-      return this.compileTypedArray(encoding.raw);
-    },
-    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
-      return this.compileTypedArray(fdSelect);
-    },
-    compileTypedArray: function CFFCompiler_compileTypedArray(data) {
-      var out = [];
-      for (var i = 0, ii = data.length; i < ii; ++i) {
-        out[i] = data[i];
-      }
-      return out;
-    },
-    compileIndex: function CFFCompiler_compileIndex(index, trackers) {
-      trackers = trackers || [];
-      var objects = index.objects;
-      // First 2 bytes contains the number of objects contained into this index
-      var count = objects.length;
-
-      // If there is no object, just create an index. This technically
-      // should just be [0, 0] but OTS has an issue with that.
-      if (count === 0) {
-        return [0, 0, 0];
-      }
-
-      var data = [(count >> 8) & 0xFF, count & 0xff];
-
-      var lastOffset = 1, i;
-      for (i = 0; i < count; ++i) {
-        lastOffset += objects[i].length;
-      }
-
-      var offsetSize;
-      if (lastOffset < 0x100) {
-        offsetSize = 1;
-      } else if (lastOffset < 0x10000) {
-        offsetSize = 2;
-      } else if (lastOffset < 0x1000000) {
-        offsetSize = 3;
-      } else {
-        offsetSize = 4;
-      }
-
-      // Next byte contains the offset size use to reference object in the file
-      data.push(offsetSize);
-
-      // Add another offset after this one because we need a new offset
-      var relativeOffset = 1;
-      for (i = 0; i < count + 1; i++) {
-        if (offsetSize === 1) {
-          data.push(relativeOffset & 0xFF);
-        } else if (offsetSize === 2) {
-          data.push((relativeOffset >> 8) & 0xFF,
-                     relativeOffset & 0xFF);
-        } else if (offsetSize === 3) {
-          data.push((relativeOffset >> 16) & 0xFF,
-                    (relativeOffset >> 8) & 0xFF,
-                     relativeOffset & 0xFF);
-        } else {
-          data.push((relativeOffset >>> 24) & 0xFF,
-                    (relativeOffset >> 16) & 0xFF,
-                    (relativeOffset >> 8) & 0xFF,
-                     relativeOffset & 0xFF);
-        }
-
-        if (objects[i]) {
-          relativeOffset += objects[i].length;
-        }
-      }
-
-      for (i = 0; i < count; i++) {
-        // Notify the tracker where the object will be offset in the data.
-        if (trackers[i]) {
-          trackers[i].offset(data.length);
-        }
-        for (var j = 0, jj = objects[i].length; j < jj; j++) {
-          data.push(objects[i][j]);
-        }
-      }
-      return data;
-    }
-  };
-  return CFFCompiler;
-})();
-
-// Workaround for seac on Windows.
-(function checkSeacSupport() {
-  if (/Windows/.test(navigator.userAgent)) {
-    SEAC_ANALYSIS_ENABLED = true;
-  }
-})();
-
-// Workaround for Private Use Area characters in Chrome on Windows
-// http://code.google.com/p/chromium/issues/detail?id=122465
-// https://github.com/mozilla/pdf.js/issues/1689
-(function checkChromeWindows() {
-  if (/Windows.*Chrome/.test(navigator.userAgent)) {
-    SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true;
-  }
-})();
-
-
-var FontRendererFactory = (function FontRendererFactoryClosure() {
-  function getLong(data, offset) {
-    return (data[offset] << 24) | (data[offset + 1] << 16) |
-           (data[offset + 2] << 8) | data[offset + 3];
-  }
-
-  function getUshort(data, offset) {
-    return (data[offset] << 8) | data[offset + 1];
-  }
-
-  function parseCmap(data, start, end) {
-    var offset = (getUshort(data, start + 2) === 1 ?
-                  getLong(data, start + 8) : getLong(data, start + 16));
-    var format = getUshort(data, start + offset);
-    var length, ranges, p, i;
-    if (format === 4) {
-      length = getUshort(data, start + offset + 2);
-      var segCount = getUshort(data, start + offset + 6) >> 1;
-      p = start + offset + 14;
-      ranges = [];
-      for (i = 0; i < segCount; i++, p += 2) {
-        ranges[i] = {end: getUshort(data, p)};
-      }
-      p += 2;
-      for (i = 0; i < segCount; i++, p += 2) {
-        ranges[i].start = getUshort(data, p);
-      }
-      for (i = 0; i < segCount; i++, p += 2) {
-        ranges[i].idDelta = getUshort(data, p);
-      }
-      for (i = 0; i < segCount; i++, p += 2) {
-        var idOffset = getUshort(data, p);
-        if (idOffset === 0) {
-          continue;
-        }
-        ranges[i].ids = [];
-        for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {
-          ranges[i].ids[j] = getUshort(data, p + idOffset);
-          idOffset += 2;
-        }
-      }
-      return ranges;
-    } else if (format === 12) {
-      length = getLong(data, start + offset + 4);
-      var groups = getLong(data, start + offset + 12);
-      p = start + offset + 16;
-      ranges = [];
-      for (i = 0; i < groups; i++) {
-        ranges.push({
-          start: getLong(data, p),
-          end: getLong(data, p + 4),
-          idDelta: getLong(data, p + 8) - getLong(data, p)
-        });
-        p += 12;
-      }
-      return ranges;
-    }
-    error('not supported cmap: ' + format);
-  }
-
-  function parseCff(data, start, end) {
-    var properties = {};
-    var parser = new CFFParser(new Stream(data, start, end - start),
-                               properties);
-    var cff = parser.parse();
-    return {
-      glyphs: cff.charStrings.objects,
-      subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex &&
-              cff.topDict.privateDict.subrsIndex.objects),
-      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects
-    };
-  }
-
-  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
-    var itemSize, itemDecode;
-    if (isGlyphLocationsLong) {
-      itemSize = 4;
-      itemDecode = function fontItemDecodeLong(data, offset) {
-        return (data[offset] << 24) | (data[offset + 1] << 16) |
-               (data[offset + 2] << 8) | data[offset + 3];
-      };
-    } else {
-      itemSize = 2;
-      itemDecode = function fontItemDecode(data, offset) {
-        return (data[offset] << 9) | (data[offset + 1] << 1);
-      };
-    }
-    var glyphs = [];
-    var startOffset = itemDecode(loca, 0);
-    for (var j = itemSize; j < loca.length; j += itemSize) {
-      var endOffset = itemDecode(loca, j);
-      glyphs.push(glyf.subarray(startOffset, endOffset));
-      startOffset = endOffset;
-    }
-    return glyphs;
-  }
-
-  function lookupCmap(ranges, unicode) {
-    var code = unicode.charCodeAt(0);
-    var l = 0, r = ranges.length - 1;
-    while (l < r) {
-      var c = (l + r + 1) >> 1;
-      if (code < ranges[c].start) {
-        r = c - 1;
-      } else {
-        l = c;
-      }
-    }
-    if (ranges[l].start <= code && code <= ranges[l].end) {
-      return (ranges[l].idDelta + (ranges[l].ids ?
-        ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF;
-    }
-    return 0;
-  }
-
-  function compileGlyf(code, js, font) {
-    function moveTo(x, y) {
-      js.push('c.moveTo(' + x + ',' + y + ');');
-    }
-    function lineTo(x, y) {
-      js.push('c.lineTo(' + x + ',' + y + ');');
-    }
-    function quadraticCurveTo(xa, ya, x, y) {
-      js.push('c.quadraticCurveTo(' + xa + ',' + ya + ',' +
-                                   x + ',' + y + ');');
-    }
-
-    var i = 0;
-    var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
-    var flags;
-    var x = 0, y = 0;
-    i += 10;
-    if (numberOfContours < 0) {
-      // composite glyph
-      do {
-        flags = (code[i] << 8) | code[i + 1];
-        var glyphIndex = (code[i + 2] << 8) | code[i + 3];
-        i += 4;
-        var arg1, arg2;
-        if ((flags & 0x01)) {
-          arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
-          arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16;
-          i += 4;
-        } else {
-          arg1 = code[i++]; arg2 = code[i++];
-        }
-        if ((flags & 0x02)) {
-           x = arg1;
-           y = arg2;
-        } else {
-           x = 0; y = 0; // TODO "they are points" ?
-        }
-        var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0;
-        if ((flags & 0x08)) {
-          scaleX =
-          scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;
-          i += 2;
-        } else if ((flags & 0x40)) {
-          scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;
-          scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;
-          i += 4;
-        } else if ((flags & 0x80)) {
-          scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;
-          scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;
-          scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824;
-          scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824;
-          i += 8;
-        }
-        var subglyph = font.glyphs[glyphIndex];
-        if (subglyph) {
-          js.push('c.save();');
-          js.push('c.transform(' + scaleX + ',' + scale01 + ',' +
-                  scale10 + ',' + scaleY + ',' + x + ',' + y + ');');
-          compileGlyf(subglyph, js, font);
-          js.push('c.restore();');
-        }
-      } while ((flags & 0x20));
-    } else {
-      // simple glyph
-      var endPtsOfContours = [];
-      var j, jj;
-      for (j = 0; j < numberOfContours; j++) {
-        endPtsOfContours.push((code[i] << 8) | code[i + 1]);
-        i += 2;
-      }
-      var instructionLength = (code[i] << 8) | code[i + 1];
-      i += 2 + instructionLength; // skipping the instructions
-      var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;
-      var points = [];
-      while (points.length < numberOfPoints) {
-        flags = code[i++];
-        var repeat = 1;
-        if ((flags & 0x08)) {
-          repeat += code[i++];
-        }
-        while (repeat-- > 0) {
-          points.push({flags: flags});
-        }
-      }
-      for (j = 0; j < numberOfPoints; j++) {
-        switch (points[j].flags & 0x12) {
-          case 0x00:
-            x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
-            i += 2;
-            break;
-          case 0x02:
-            x -= code[i++];
-            break;
-          case 0x12:
-            x += code[i++];
-            break;
-        }
-        points[j].x = x;
-      }
-      for (j = 0; j < numberOfPoints; j++) {
-        switch (points[j].flags & 0x24) {
-          case 0x00:
-            y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
-            i += 2;
-            break;
-          case 0x04:
-            y -= code[i++];
-            break;
-          case 0x24:
-            y += code[i++];
-            break;
-        }
-        points[j].y = y;
-      }
-
-      var startPoint = 0;
-      for (i = 0; i < numberOfContours; i++) {
-        var endPoint = endPtsOfContours[i];
-        // contours might have implicit points, which is located in the middle
-        // between two neighboring off-curve points
-        var contour = points.slice(startPoint, endPoint + 1);
-        if ((contour[0].flags & 1)) {
-          contour.push(contour[0]); // using start point at the contour end
-        } else if ((contour[contour.length - 1].flags & 1)) {
-          // first is off-curve point, trying to use one from the end
-          contour.unshift(contour[contour.length - 1]);
-        } else {
-          // start and end are off-curve points, creating implicit one
-          var p = {
-            flags: 1,
-            x: (contour[0].x + contour[contour.length - 1].x) / 2,
-            y: (contour[0].y + contour[contour.length - 1].y) / 2
-          };
-          contour.unshift(p);
-          contour.push(p);
-        }
-        moveTo(contour[0].x, contour[0].y);
-        for (j = 1, jj = contour.length; j < jj; j++) {
-          if ((contour[j].flags & 1)) {
-            lineTo(contour[j].x, contour[j].y);
-          } else if ((contour[j + 1].flags & 1)){
-            quadraticCurveTo(contour[j].x, contour[j].y,
-                             contour[j + 1].x, contour[j + 1].y);
-            j++;
-          } else {
-            quadraticCurveTo(contour[j].x, contour[j].y,
-              (contour[j].x + contour[j + 1].x) / 2,
-              (contour[j].y + contour[j + 1].y) / 2);
-          }
-        }
-        startPoint = endPoint + 1;
-      }
-    }
-  }
-
-  function compileCharString(code, js, font) {
-    var stack = [];
-    var x = 0, y = 0;
-    var stems = 0;
-
-    function moveTo(x, y) {
-      js.push('c.moveTo(' + x + ',' + y + ');');
-    }
-    function lineTo(x, y) {
-      js.push('c.lineTo(' + x + ',' + y + ');');
-    }
-    function bezierCurveTo(x1, y1, x2, y2, x, y) {
-      js.push('c.bezierCurveTo(' + x1 + ',' + y1 + ',' + x2 + ',' + y2 + ',' +
-                                   x + ',' + y + ');');
-    }
-
-    function parse(code) {
-      var i = 0;
-      while (i < code.length) {
-        var stackClean = false;
-        var v = code[i++];
-        var xa, xb, ya, yb, y1, y2, y3, n, subrCode;
-        switch (v) {
-          case 1: // hstem
-            stems += stack.length >> 1;
-            stackClean = true;
-            break;
-          case 3: // vstem
-            stems += stack.length >> 1;
-            stackClean = true;
-            break;
-          case 4: // vmoveto
-            y += stack.pop();
-            moveTo(x, y);
-            stackClean = true;
-            break;
-          case 5: // rlineto
-            while (stack.length > 0) {
-              x += stack.shift();
-              y += stack.shift();
-              lineTo(x, y);
-            }
-            break;
-          case 6: // hlineto
-            while (stack.length > 0) {
-              x += stack.shift();
-              lineTo(x, y);
-              if (stack.length === 0) {
-                break;
-              }
-              y += stack.shift();
-              lineTo(x, y);
-            }
-            break;
-          case 7: // vlineto
-            while (stack.length > 0) {
-              y += stack.shift();
-              lineTo(x, y);
-              if (stack.length === 0) {
-                break;
-              }
-              x += stack.shift();
-              lineTo(x, y);
-            }
-            break;
-          case 8: // rrcurveto
-            while (stack.length > 0) {
-              xa = x + stack.shift(); ya = y + stack.shift();
-              xb = xa + stack.shift(); yb = ya + stack.shift();
-              x = xb + stack.shift(); y = yb + stack.shift();
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
-            break;
-          case 10: // callsubr
-            n = stack.pop() + font.subrsBias;
-            subrCode = font.subrs[n];
-            if (subrCode) {
-              parse(subrCode);
-            }
-            break;
-          case 11: // return
-            return;
-          case 12:
-            v = code[i++];
-            switch (v) {
-              case 34: // flex
-                xa = x + stack.shift();
-                xb = xa + stack.shift(); y1 = y + stack.shift();
-                x = xb + stack.shift();
-                bezierCurveTo(xa, y, xb, y1, x, y1);
-                xa = x + stack.shift();
-                xb = xa + stack.shift();
-                x = xb + stack.shift();
-                bezierCurveTo(xa, y1, xb, y, x, y);
-                break;
-              case 35: // flex
-                xa = x + stack.shift(); ya = y + stack.shift();
-                xb = xa + stack.shift(); yb = ya + stack.shift();
-                x = xb + stack.shift(); y = yb + stack.shift();
-                bezierCurveTo(xa, ya, xb, yb, x, y);
-                xa = x + stack.shift(); ya = y + stack.shift();
-                xb = xa + stack.shift(); yb = ya + stack.shift();
-                x = xb + stack.shift(); y = yb + stack.shift();
-                bezierCurveTo(xa, ya, xb, yb, x, y);
-                stack.pop(); // fd
-                break;
-              case 36: // hflex1
-                xa = x + stack.shift(); y1 = y + stack.shift();
-                xb = xa + stack.shift(); y2 = y1 + stack.shift();
-                x = xb + stack.shift();
-                bezierCurveTo(xa, y1, xb, y2, x, y2);
-                xa = x + stack.shift();
-                xb = xa + stack.shift(); y3 = y2 + stack.shift();
-                x = xb + stack.shift();
-                bezierCurveTo(xa, y2, xb, y3, x, y);
-                break;
-              case 37: // flex1
-                var x0 = x, y0 = y;
-                xa = x + stack.shift(); ya = y + stack.shift();
-                xb = xa + stack.shift(); yb = ya + stack.shift();
-                x = xb + stack.shift(); y = yb + stack.shift();
-                bezierCurveTo(xa, ya, xb, yb, x, y);
-                xa = x + stack.shift(); ya = y + stack.shift();
-                xb = xa + stack.shift(); yb = ya + stack.shift();
-                x = xb; y = yb;
-                if (Math.abs(x - x0) > Math.abs(y - y0)) {
-                  x += stack.shift();
-                } else  {
-                  y += stack.shift();
-                }
-                bezierCurveTo(xa, ya, xb, yb, x, y);
-                break;
-              default:
-                error('unknown operator: 12 ' + v);
-            }
-            break;
-          case 14: // endchar
-            if (stack.length >= 4) {
-              var achar = stack.pop();
-              var bchar = stack.pop();
-              y = stack.pop();
-              x = stack.pop();
-              js.push('c.save();');
-              js.push('c.translate('+ x + ',' + y + ');');
-              var gid = lookupCmap(font.cmap, String.fromCharCode(
-                font.glyphNameMap[Encodings.StandardEncoding[achar]]));
-              compileCharString(font.glyphs[gid], js, font);
-              js.push('c.restore();');
-
-              gid = lookupCmap(font.cmap, String.fromCharCode(
-                font.glyphNameMap[Encodings.StandardEncoding[bchar]]));
-              compileCharString(font.glyphs[gid], js, font);
-            }
-            return;
-          case 18: // hstemhm
-            stems += stack.length >> 1;
-            stackClean = true;
-            break;
-          case 19: // hintmask
-            stems += stack.length >> 1;
-            i += (stems + 7) >> 3;
-            stackClean = true;
-            break;
-          case 20: // cntrmask
-            stems += stack.length >> 1;
-            i += (stems + 7) >> 3;
-            stackClean = true;
-            break;
-          case 21: // rmoveto
-            y += stack.pop();
-            x += stack.pop();
-            moveTo(x, y);
-            stackClean = true;
-            break;
-          case 22: // hmoveto
-            x += stack.pop();
-            moveTo(x, y);
-            stackClean = true;
-            break;
-          case 23: // vstemhm
-            stems += stack.length >> 1;
-            stackClean = true;
-            break;
-          case 24: // rcurveline
-            while (stack.length > 2) {
-              xa = x + stack.shift(); ya = y + stack.shift();
-              xb = xa + stack.shift(); yb = ya + stack.shift();
-              x = xb + stack.shift(); y = yb + stack.shift();
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
-            x += stack.shift();
-            y += stack.shift();
-            lineTo(x, y);
-            break;
-          case 25: // rlinecurve
-            while (stack.length > 6) {
-              x += stack.shift();
-              y += stack.shift();
-              lineTo(x, y);
-            }
-            xa = x + stack.shift(); ya = y + stack.shift();
-            xb = xa + stack.shift(); yb = ya + stack.shift();
-            x = xb + stack.shift(); y = yb + stack.shift();
-            bezierCurveTo(xa, ya, xb, yb, x, y);
-            break;
-          case 26: // vvcurveto
-            if (stack.length % 2) {
-              x += stack.shift();
-            }
-            while (stack.length > 0) {
-              xa = x; ya = y + stack.shift();
-              xb = xa + stack.shift(); yb = ya + stack.shift();
-              x = xb; y = yb + stack.shift();
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
-            break;
-          case 27: // hhcurveto
-            if (stack.length % 2) {
-              y += stack.shift();
-            }
-            while (stack.length > 0) {
-              xa = x + stack.shift(); ya = y;
-              xb = xa + stack.shift(); yb = ya + stack.shift();
-              x = xb + stack.shift(); y = yb;
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
-            break;
-          case 28:
-            stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16);
-            i += 2;
-            break;
-          case 29: // callgsubr
-            n = stack.pop() + font.gsubrsBias;
-            subrCode = font.gsubrs[n];
-            if (subrCode) {
-              parse(subrCode);
-            }
-            break;
-          case 30: // vhcurveto
-            while (stack.length > 0) {
-              xa = x; ya = y + stack.shift();
-              xb = xa + stack.shift(); yb = ya + stack.shift();
-              x = xb + stack.shift();
-              y = yb + (stack.length === 1 ? stack.shift() : 0);
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-              if (stack.length === 0) {
-                break;
-              }
-
-              xa = x + stack.shift(); ya = y;
-              xb = xa + stack.shift(); yb = ya + stack.shift();
-              y = yb + stack.shift();
-              x = xb + (stack.length === 1 ? stack.shift() : 0);
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
-            break;
-          case 31: // hvcurveto
-            while (stack.length > 0) {
-              xa = x + stack.shift(); ya = y;
-              xb = xa + stack.shift(); yb = ya + stack.shift();
-              y = yb + stack.shift();
-              x = xb + (stack.length === 1 ? stack.shift() : 0);
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-              if (stack.length === 0) {
-                break;
-              }
-
-              xa = x; ya = y + stack.shift();
-              xb = xa + stack.shift(); yb = ya + stack.shift();
-              x = xb + stack.shift();
-              y = yb + (stack.length === 1 ? stack.shift() : 0);
-              bezierCurveTo(xa, ya, xb, yb, x, y);
-            }
-            break;
-          default:
-            if (v < 32) {
-              error('unknown operator: ' + v);
-            }
-            if (v < 247) {
-              stack.push(v - 139);
-            } else if (v < 251) {
-              stack.push((v - 247) * 256 + code[i++] + 108);
-            } else if (v < 255) {
-              stack.push(-(v - 251) * 256 - code[i++] - 108);
-            } else {
-              stack.push(((code[i] << 24) | (code[i + 1] << 16) |
-                         (code[i + 2] << 8) | code[i + 3]) / 65536);
-              i += 4;
-            }
-            break;
-        }
-        if (stackClean) {
-          stack.length = 0;
-        }
-      }
-    }
-    parse(code);
-  }
-
-  var noop = '';
-
-  function CompiledFont(fontMatrix) {
-    this.compiledGlyphs = {};
-    this.fontMatrix = fontMatrix;
-  }
-  CompiledFont.prototype = {
-    getPathJs: function (unicode) {
-      var gid = lookupCmap(this.cmap, unicode);
-      var fn = this.compiledGlyphs[gid];
-      if (!fn) {
-        this.compiledGlyphs[gid] = fn = this.compileGlyph(this.glyphs[gid]);
-      }
-      return fn;
-    },
-
-    compileGlyph: function (code) {
-      if (!code || code.length === 0 || code[0] === 14) {
-        return noop;
-      }
-
-      var js = [];
-      js.push('c.save();');
-      js.push('c.transform(' + this.fontMatrix.join(',') + ');');
-      js.push('c.scale(size, -size);');
-
-      this.compileGlyphImpl(code, js);
-
-      js.push('c.restore();');
-
-      return js.join('\n');
-    },
-
-    compileGlyphImpl: function () {
-      error('Children classes should implement this.');
-    },
-
-    hasBuiltPath: function (unicode) {
-      var gid = lookupCmap(this.cmap, unicode);
-      return gid in this.compiledGlyphs;
-    }
-  };
-
-  function TrueTypeCompiled(glyphs, cmap, fontMatrix) {
-    fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0];
-    CompiledFont.call(this, fontMatrix);
-
-    this.glyphs = glyphs;
-    this.cmap = cmap;
-
-    this.compiledGlyphs = [];
-  }
-
-  Util.inherit(TrueTypeCompiled, CompiledFont, {
-    compileGlyphImpl: function (code, js) {
-      compileGlyf(code, js, this);
-    }
-  });
-
-  function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {
-    fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0];
-    CompiledFont.call(this, fontMatrix);
-    this.glyphs = cffInfo.glyphs;
-    this.gsubrs = cffInfo.gsubrs || [];
-    this.subrs = cffInfo.subrs || [];
-    this.cmap = cmap;
-    this.glyphNameMap = glyphNameMap || GlyphsUnicode;
-
-    this.compiledGlyphs = [];
-    this.gsubrsBias = (this.gsubrs.length < 1240 ?
-                       107 : (this.gsubrs.length < 33900 ? 1131 : 32768));
-    this.subrsBias = (this.subrs.length < 1240 ?
-                      107 : (this.subrs.length < 33900 ? 1131 : 32768));
-  }
-
-  Util.inherit(Type2Compiled, CompiledFont, {
-    compileGlyphImpl: function (code, js) {
-      compileCharString(code, js, this);
-    }
-  });
-
-
-  return {
-    create: function FontRendererFactory_create(font) {
-      var data = new Uint8Array(font.data);
-      var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
-      var numTables = getUshort(data, 4);
-      for (var i = 0, p = 12; i < numTables; i++, p += 16) {
-        var tag = bytesToString(data.subarray(p, p + 4));
-        var offset = getLong(data, p + 8);
-        var length = getLong(data, p + 12);
-        switch (tag) {
-          case 'cmap':
-            cmap = parseCmap(data, offset, offset + length);
-            break;
-          case 'glyf':
-            glyf = data.subarray(offset, offset + length);
-            break;
-          case 'loca':
-            loca = data.subarray(offset, offset + length);
-            break;
-          case 'head':
-            unitsPerEm = getUshort(data, offset + 18);
-            indexToLocFormat = getUshort(data, offset + 50);
-            break;
-          case 'CFF ':
-            cff = parseCff(data, offset, offset + length);
-            break;
-        }
-      }
-
-      if (glyf) {
-        var fontMatrix = (!unitsPerEm ? font.fontMatrix :
-                          [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]);
-        return new TrueTypeCompiled(
-          parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);
-      } else {
-        return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);
-      }
-    }
-  };
-})();
-
-
-var GlyphsUnicode = {
-  A: 0x0041,
-  AE: 0x00C6,
-  AEacute: 0x01FC,
-  AEmacron: 0x01E2,
-  AEsmall: 0xF7E6,
-  Aacute: 0x00C1,
-  Aacutesmall: 0xF7E1,
-  Abreve: 0x0102,
-  Abreveacute: 0x1EAE,
-  Abrevecyrillic: 0x04D0,
-  Abrevedotbelow: 0x1EB6,
-  Abrevegrave: 0x1EB0,
-  Abrevehookabove: 0x1EB2,
-  Abrevetilde: 0x1EB4,
-  Acaron: 0x01CD,
-  Acircle: 0x24B6,
-  Acircumflex: 0x00C2,
-  Acircumflexacute: 0x1EA4,
-  Acircumflexdotbelow: 0x1EAC,
-  Acircumflexgrave: 0x1EA6,
-  Acircumflexhookabove: 0x1EA8,
-  Acircumflexsmall: 0xF7E2,
-  Acircumflextilde: 0x1EAA,
-  Acute: 0xF6C9,
-  Acutesmall: 0xF7B4,
-  Acyrillic: 0x0410,
-  Adblgrave: 0x0200,
-  Adieresis: 0x00C4,
-  Adieresiscyrillic: 0x04D2,
-  Adieresismacron: 0x01DE,
-  Adieresissmall: 0xF7E4,
-  Adotbelow: 0x1EA0,
-  Adotmacron: 0x01E0,
-  Agrave: 0x00C0,
-  Agravesmall: 0xF7E0,
-  Ahookabove: 0x1EA2,
-  Aiecyrillic: 0x04D4,
-  Ainvertedbreve: 0x0202,
-  Alpha: 0x0391,
-  Alphatonos: 0x0386,
-  Amacron: 0x0100,
-  Amonospace: 0xFF21,
-  Aogonek: 0x0104,
-  Aring: 0x00C5,
-  Aringacute: 0x01FA,
-  Aringbelow: 0x1E00,
-  Aringsmall: 0xF7E5,
-  Asmall: 0xF761,
-  Atilde: 0x00C3,
-  Atildesmall: 0xF7E3,
-  Aybarmenian: 0x0531,
-  B: 0x0042,
-  Bcircle: 0x24B7,
-  Bdotaccent: 0x1E02,
-  Bdotbelow: 0x1E04,
-  Becyrillic: 0x0411,
-  Benarmenian: 0x0532,
-  Beta: 0x0392,
-  Bhook: 0x0181,
-  Blinebelow: 0x1E06,
-  Bmonospace: 0xFF22,
-  Brevesmall: 0xF6F4,
-  Bsmall: 0xF762,
-  Btopbar: 0x0182,
-  C: 0x0043,
-  Caarmenian: 0x053E,
-  Cacute: 0x0106,
-  Caron: 0xF6CA,
-  Caronsmall: 0xF6F5,
-  Ccaron: 0x010C,
-  Ccedilla: 0x00C7,
-  Ccedillaacute: 0x1E08,
-  Ccedillasmall: 0xF7E7,
-  Ccircle: 0x24B8,
-  Ccircumflex: 0x0108,
-  Cdot: 0x010A,
-  Cdotaccent: 0x010A,
-  Cedillasmall: 0xF7B8,
-  Chaarmenian: 0x0549,
-  Cheabkhasiancyrillic: 0x04BC,
-  Checyrillic: 0x0427,
-  Chedescenderabkhasiancyrillic: 0x04BE,
-  Chedescendercyrillic: 0x04B6,
-  Chedieresiscyrillic: 0x04F4,
-  Cheharmenian: 0x0543,
-  Chekhakassiancyrillic: 0x04CB,
-  Cheverticalstrokecyrillic: 0x04B8,
-  Chi: 0x03A7,
-  Chook: 0x0187,
-  Circumflexsmall: 0xF6F6,
-  Cmonospace: 0xFF23,
-  Coarmenian: 0x0551,
-  Csmall: 0xF763,
-  D: 0x0044,
-  DZ: 0x01F1,
-  DZcaron: 0x01C4,
-  Daarmenian: 0x0534,
-  Dafrican: 0x0189,
-  Dcaron: 0x010E,
-  Dcedilla: 0x1E10,
-  Dcircle: 0x24B9,
-  Dcircumflexbelow: 0x1E12,
-  Dcroat: 0x0110,
-  Ddotaccent: 0x1E0A,
-  Ddotbelow: 0x1E0C,
-  Decyrillic: 0x0414,
-  Deicoptic: 0x03EE,
-  Delta: 0x2206,
-  Deltagreek: 0x0394,
-  Dhook: 0x018A,
-  Dieresis: 0xF6CB,
-  DieresisAcute: 0xF6CC,
-  DieresisGrave: 0xF6CD,
-  Dieresissmall: 0xF7A8,
-  Digammagreek: 0x03DC,
-  Djecyrillic: 0x0402,
-  Dlinebelow: 0x1E0E,
-  Dmonospace: 0xFF24,
-  Dotaccentsmall: 0xF6F7,
-  Dslash: 0x0110,
-  Dsmall: 0xF764,
-  Dtopbar: 0x018B,
-  Dz: 0x01F2,
-  Dzcaron: 0x01C5,
-  Dzeabkhasiancyrillic: 0x04E0,
-  Dzecyrillic: 0x0405,
-  Dzhecyrillic: 0x040F,
-  E: 0x0045,
-  Eacute: 0x00C9,
-  Eacutesmall: 0xF7E9,
-  Ebreve: 0x0114,
-  Ecaron: 0x011A,
-  Ecedillabreve: 0x1E1C,
-  Echarmenian: 0x0535,
-  Ecircle: 0x24BA,
-  Ecircumflex: 0x00CA,
-  Ecircumflexacute: 0x1EBE,
-  Ecircumflexbelow: 0x1E18,
-  Ecircumflexdotbelow: 0x1EC6,
-  Ecircumflexgrave: 0x1EC0,
-  Ecircumflexhookabove: 0x1EC2,
-  Ecircumflexsmall: 0xF7EA,
-  Ecircumflextilde: 0x1EC4,
-  Ecyrillic: 0x0404,
-  Edblgrave: 0x0204,
-  Edieresis: 0x00CB,
-  Edieresissmall: 0xF7EB,
-  Edot: 0x0116,
-  Edotaccent: 0x0116,
-  Edotbelow: 0x1EB8,
-  Efcyrillic: 0x0424,
-  Egrave: 0x00C8,
-  Egravesmall: 0xF7E8,
-  Eharmenian: 0x0537,
-  Ehookabove: 0x1EBA,
-  Eightroman: 0x2167,
-  Einvertedbreve: 0x0206,
-  Eiotifiedcyrillic: 0x0464,
-  Elcyrillic: 0x041B,
-  Elevenroman: 0x216A,
-  Emacron: 0x0112,
-  Emacronacute: 0x1E16,
-  Emacrongrave: 0x1E14,
-  Emcyrillic: 0x041C,
-  Emonospace: 0xFF25,
-  Encyrillic: 0x041D,
-  Endescendercyrillic: 0x04A2,
-  Eng: 0x014A,
-  Enghecyrillic: 0x04A4,
-  Enhookcyrillic: 0x04C7,
-  Eogonek: 0x0118,
-  Eopen: 0x0190,
-  Epsilon: 0x0395,
-  Epsilontonos: 0x0388,
-  Ercyrillic: 0x0420,
-  Ereversed: 0x018E,
-  Ereversedcyrillic: 0x042D,
-  Escyrillic: 0x0421,
-  Esdescendercyrillic: 0x04AA,
-  Esh: 0x01A9,
-  Esmall: 0xF765,
-  Eta: 0x0397,
-  Etarmenian: 0x0538,
-  Etatonos: 0x0389,
-  Eth: 0x00D0,
-  Ethsmall: 0xF7F0,
-  Etilde: 0x1EBC,
-  Etildebelow: 0x1E1A,
-  Euro: 0x20AC,
-  Ezh: 0x01B7,
-  Ezhcaron: 0x01EE,
-  Ezhreversed: 0x01B8,
-  F: 0x0046,
-  Fcircle: 0x24BB,
-  Fdotaccent: 0x1E1E,
-  Feharmenian: 0x0556,
-  Feicoptic: 0x03E4,
-  Fhook: 0x0191,
-  Fitacyrillic: 0x0472,
-  Fiveroman: 0x2164,
-  Fmonospace: 0xFF26,
-  Fourroman: 0x2163,
-  Fsmall: 0xF766,
-  G: 0x0047,
-  GBsquare: 0x3387,
-  Gacute: 0x01F4,
-  Gamma: 0x0393,
-  Gammaafrican: 0x0194,
-  Gangiacoptic: 0x03EA,
-  Gbreve: 0x011E,
-  Gcaron: 0x01E6,
-  Gcedilla: 0x0122,
-  Gcircle: 0x24BC,
-  Gcircumflex: 0x011C,
-  Gcommaaccent: 0x0122,
-  Gdot: 0x0120,
-  Gdotaccent: 0x0120,
-  Gecyrillic: 0x0413,
-  Ghadarmenian: 0x0542,
-  Ghemiddlehookcyrillic: 0x0494,
-  Ghestrokecyrillic: 0x0492,
-  Gheupturncyrillic: 0x0490,
-  Ghook: 0x0193,
-  Gimarmenian: 0x0533,
-  Gjecyrillic: 0x0403,
-  Gmacron: 0x1E20,
-  Gmonospace: 0xFF27,
-  Grave: 0xF6CE,
-  Gravesmall: 0xF760,
-  Gsmall: 0xF767,
-  Gsmallhook: 0x029B,
-  Gstroke: 0x01E4,
-  H: 0x0048,
-  H18533: 0x25CF,
-  H18543: 0x25AA,
-  H18551: 0x25AB,
-  H22073: 0x25A1,
-  HPsquare: 0x33CB,
-  Haabkhasiancyrillic: 0x04A8,
-  Hadescendercyrillic: 0x04B2,
-  Hardsigncyrillic: 0x042A,
-  Hbar: 0x0126,
-  Hbrevebelow: 0x1E2A,
-  Hcedilla: 0x1E28,
-  Hcircle: 0x24BD,
-  Hcircumflex: 0x0124,
-  Hdieresis: 0x1E26,
-  Hdotaccent: 0x1E22,
-  Hdotbelow: 0x1E24,
-  Hmonospace: 0xFF28,
-  Hoarmenian: 0x0540,
-  Horicoptic: 0x03E8,
-  Hsmall: 0xF768,
-  Hungarumlaut: 0xF6CF,
-  Hungarumlautsmall: 0xF6F8,
-  Hzsquare: 0x3390,
-  I: 0x0049,
-  IAcyrillic: 0x042F,
-  IJ: 0x0132,
-  IUcyrillic: 0x042E,
-  Iacute: 0x00CD,
-  Iacutesmall: 0xF7ED,
-  Ibreve: 0x012C,
-  Icaron: 0x01CF,
-  Icircle: 0x24BE,
-  Icircumflex: 0x00CE,
-  Icircumflexsmall: 0xF7EE,
-  Icyrillic: 0x0406,
-  Idblgrave: 0x0208,
-  Idieresis: 0x00CF,
-  Idieresisacute: 0x1E2E,
-  Idieresiscyrillic: 0x04E4,
-  Idieresissmall: 0xF7EF,
-  Idot: 0x0130,
-  Idotaccent: 0x0130,
-  Idotbelow: 0x1ECA,
-  Iebrevecyrillic: 0x04D6,
-  Iecyrillic: 0x0415,
-  Ifraktur: 0x2111,
-  Igrave: 0x00CC,
-  Igravesmall: 0xF7EC,
-  Ihookabove: 0x1EC8,
-  Iicyrillic: 0x0418,
-  Iinvertedbreve: 0x020A,
-  Iishortcyrillic: 0x0419,
-  Imacron: 0x012A,
-  Imacroncyrillic: 0x04E2,
-  Imonospace: 0xFF29,
-  Iniarmenian: 0x053B,
-  Iocyrillic: 0x0401,
-  Iogonek: 0x012E,
-  Iota: 0x0399,
-  Iotaafrican: 0x0196,
-  Iotadieresis: 0x03AA,
-  Iotatonos: 0x038A,
-  Ismall: 0xF769,
-  Istroke: 0x0197,
-  Itilde: 0x0128,
-  Itildebelow: 0x1E2C,
-  Izhitsacyrillic: 0x0474,
-  Izhitsadblgravecyrillic: 0x0476,
-  J: 0x004A,
-  Jaarmenian: 0x0541,
-  Jcircle: 0x24BF,
-  Jcircumflex: 0x0134,
-  Jecyrillic: 0x0408,
-  Jheharmenian: 0x054B,
-  Jmonospace: 0xFF2A,
-  Jsmall: 0xF76A,
-  K: 0x004B,
-  KBsquare: 0x3385,
-  KKsquare: 0x33CD,
-  Kabashkircyrillic: 0x04A0,
-  Kacute: 0x1E30,
-  Kacyrillic: 0x041A,
-  Kadescendercyrillic: 0x049A,
-  Kahookcyrillic: 0x04C3,
-  Kappa: 0x039A,
-  Kastrokecyrillic: 0x049E,
-  Kaverticalstrokecyrillic: 0x049C,
-  Kcaron: 0x01E8,
-  Kcedilla: 0x0136,
-  Kcircle: 0x24C0,
-  Kcommaaccent: 0x0136,
-  Kdotbelow: 0x1E32,
-  Keharmenian: 0x0554,
-  Kenarmenian: 0x053F,
-  Khacyrillic: 0x0425,
-  Kheicoptic: 0x03E6,
-  Khook: 0x0198,
-  Kjecyrillic: 0x040C,
-  Klinebelow: 0x1E34,
-  Kmonospace: 0xFF2B,
-  Koppacyrillic: 0x0480,
-  Koppagreek: 0x03DE,
-  Ksicyrillic: 0x046E,
-  Ksmall: 0xF76B,
-  L: 0x004C,
-  LJ: 0x01C7,
-  LL: 0xF6BF,
-  Lacute: 0x0139,
-  Lambda: 0x039B,
-  Lcaron: 0x013D,
-  Lcedilla: 0x013B,
-  Lcircle: 0x24C1,
-  Lcircumflexbelow: 0x1E3C,
-  Lcommaaccent: 0x013B,
-  Ldot: 0x013F,
-  Ldotaccent: 0x013F,
-  Ldotbelow: 0x1E36,
-  Ldotbelowmacron: 0x1E38,
-  Liwnarmenian: 0x053C,
-  Lj: 0x01C8,
-  Ljecyrillic: 0x0409,
-  Llinebelow: 0x1E3A,
-  Lmonospace: 0xFF2C,
-  Lslash: 0x0141,
-  Lslashsmall: 0xF6F9,
-  Lsmall: 0xF76C,
-  M: 0x004D,
-  MBsquare: 0x3386,
-  Macron: 0xF6D0,
-  Macronsmall: 0xF7AF,
-  Macute: 0x1E3E,
-  Mcircle: 0x24C2,
-  Mdotaccent: 0x1E40,
-  Mdotbelow: 0x1E42,
-  Menarmenian: 0x0544,
-  Mmonospace: 0xFF2D,
-  Msmall: 0xF76D,
-  Mturned: 0x019C,
-  Mu: 0x039C,
-  N: 0x004E,
-  NJ: 0x01CA,
-  Nacute: 0x0143,
-  Ncaron: 0x0147,
-  Ncedilla: 0x0145,
-  Ncircle: 0x24C3,
-  Ncircumflexbelow: 0x1E4A,
-  Ncommaaccent: 0x0145,
-  Ndotaccent: 0x1E44,
-  Ndotbelow: 0x1E46,
-  Nhookleft: 0x019D,
-  Nineroman: 0x2168,
-  Nj: 0x01CB,
-  Njecyrillic: 0x040A,
-  Nlinebelow: 0x1E48,
-  Nmonospace: 0xFF2E,
-  Nowarmenian: 0x0546,
-  Nsmall: 0xF76E,
-  Ntilde: 0x00D1,
-  Ntildesmall: 0xF7F1,
-  Nu: 0x039D,
-  O: 0x004F,
-  OE: 0x0152,
-  OEsmall: 0xF6FA,
-  Oacute: 0x00D3,
-  Oacutesmall: 0xF7F3,
-  Obarredcyrillic: 0x04E8,
-  Obarreddieresiscyrillic: 0x04EA,
-  Obreve: 0x014E,
-  Ocaron: 0x01D1,
-  Ocenteredtilde: 0x019F,
-  Ocircle: 0x24C4,
-  Ocircumflex: 0x00D4,
-  Ocircumflexacute: 0x1ED0,
-  Ocircumflexdotbelow: 0x1ED8,
-  Ocircumflexgrave: 0x1ED2,
-  Ocircumflexhookabove: 0x1ED4,
-  Ocircumflexsmall: 0xF7F4,
-  Ocircumflextilde: 0x1ED6,
-  Ocyrillic: 0x041E,
-  Odblacute: 0x0150,
-  Odblgrave: 0x020C,
-  Odieresis: 0x00D6,
-  Odieresiscyrillic: 0x04E6,
-  Odieresissmall: 0xF7F6,
-  Odotbelow: 0x1ECC,
-  Ogoneksmall: 0xF6FB,
-  Ograve: 0x00D2,
-  Ogravesmall: 0xF7F2,
-  Oharmenian: 0x0555,
-  Ohm: 0x2126,
-  Ohookabove: 0x1ECE,
-  Ohorn: 0x01A0,
-  Ohornacute: 0x1EDA,
-  Ohorndotbelow: 0x1EE2,
-  Ohorngrave: 0x1EDC,
-  Ohornhookabove: 0x1EDE,
-  Ohorntilde: 0x1EE0,
-  Ohungarumlaut: 0x0150,
-  Oi: 0x01A2,
-  Oinvertedbreve: 0x020E,
-  Omacron: 0x014C,
-  Omacronacute: 0x1E52,
-  Omacrongrave: 0x1E50,
-  Omega: 0x2126,
-  Omegacyrillic: 0x0460,
-  Omegagreek: 0x03A9,
-  Omegaroundcyrillic: 0x047A,
-  Omegatitlocyrillic: 0x047C,
-  Omegatonos: 0x038F,
-  Omicron: 0x039F,
-  Omicrontonos: 0x038C,
-  Omonospace: 0xFF2F,
-  Oneroman: 0x2160,
-  Oogonek: 0x01EA,
-  Oogonekmacron: 0x01EC,
-  Oopen: 0x0186,
-  Oslash: 0x00D8,
-  Oslashacute: 0x01FE,
-  Oslashsmall: 0xF7F8,
-  Osmall: 0xF76F,
-  Ostrokeacute: 0x01FE,
-  Otcyrillic: 0x047E,
-  Otilde: 0x00D5,
-  Otildeacute: 0x1E4C,
-  Otildedieresis: 0x1E4E,
-  Otildesmall: 0xF7F5,
-  P: 0x0050,
-  Pacute: 0x1E54,
-  Pcircle: 0x24C5,
-  Pdotaccent: 0x1E56,
-  Pecyrillic: 0x041F,
-  Peharmenian: 0x054A,
-  Pemiddlehookcyrillic: 0x04A6,
-  Phi: 0x03A6,
-  Phook: 0x01A4,
-  Pi: 0x03A0,
-  Piwrarmenian: 0x0553,
-  Pmonospace: 0xFF30,
-  Psi: 0x03A8,
-  Psicyrillic: 0x0470,
-  Psmall: 0xF770,
-  Q: 0x0051,
-  Qcircle: 0x24C6,
-  Qmonospace: 0xFF31,
-  Qsmall: 0xF771,
-  R: 0x0052,
-  Raarmenian: 0x054C,
-  Racute: 0x0154,
-  Rcaron: 0x0158,
-  Rcedilla: 0x0156,
-  Rcircle: 0x24C7,
-  Rcommaaccent: 0x0156,
-  Rdblgrave: 0x0210,
-  Rdotaccent: 0x1E58,
-  Rdotbelow: 0x1E5A,
-  Rdotbelowmacron: 0x1E5C,
-  Reharmenian: 0x0550,
-  Rfraktur: 0x211C,
-  Rho: 0x03A1,
-  Ringsmall: 0xF6FC,
-  Rinvertedbreve: 0x0212,
-  Rlinebelow: 0x1E5E,
-  Rmonospace: 0xFF32,
-  Rsmall: 0xF772,
-  Rsmallinverted: 0x0281,
-  Rsmallinvertedsuperior: 0x02B6,
-  S: 0x0053,
-  SF010000: 0x250C,
-  SF020000: 0x2514,
-  SF030000: 0x2510,
-  SF040000: 0x2518,
-  SF050000: 0x253C,
-  SF060000: 0x252C,
-  SF070000: 0x2534,
-  SF080000: 0x251C,
-  SF090000: 0x2524,
-  SF100000: 0x2500,
-  SF110000: 0x2502,
-  SF190000: 0x2561,
-  SF200000: 0x2562,
-  SF210000: 0x2556,
-  SF220000: 0x2555,
-  SF230000: 0x2563,
-  SF240000: 0x2551,
-  SF250000: 0x2557,
-  SF260000: 0x255D,
-  SF270000: 0x255C,
-  SF280000: 0x255B,
-  SF360000: 0x255E,
-  SF370000: 0x255F,
-  SF380000: 0x255A,
-  SF390000: 0x2554,
-  SF400000: 0x2569,
-  SF410000: 0x2566,
-  SF420000: 0x2560,
-  SF430000: 0x2550,
-  SF440000: 0x256C,
-  SF450000: 0x2567,
-  SF460000: 0x2568,
-  SF470000: 0x2564,
-  SF480000: 0x2565,
-  SF490000: 0x2559,
-  SF500000: 0x2558,
-  SF510000: 0x2552,
-  SF520000: 0x2553,
-  SF530000: 0x256B,
-  SF540000: 0x256A,
-  Sacute: 0x015A,
-  Sacutedotaccent: 0x1E64,
-  Sampigreek: 0x03E0,
-  Scaron: 0x0160,
-  Scarondotaccent: 0x1E66,
-  Scaronsmall: 0xF6FD,
-  Scedilla: 0x015E,
-  Schwa: 0x018F,
-  Schwacyrillic: 0x04D8,
-  Schwadieresiscyrillic: 0x04DA,
-  Scircle: 0x24C8,
-  Scircumflex: 0x015C,
-  Scommaaccent: 0x0218,
-  Sdotaccent: 0x1E60,
-  Sdotbelow: 0x1E62,
-  Sdotbelowdotaccent: 0x1E68,
-  Seharmenian: 0x054D,
-  Sevenroman: 0x2166,
-  Shaarmenian: 0x0547,
-  Shacyrillic: 0x0428,
-  Shchacyrillic: 0x0429,
-  Sheicoptic: 0x03E2,
-  Shhacyrillic: 0x04BA,
-  Shimacoptic: 0x03EC,
-  Sigma: 0x03A3,
-  Sixroman: 0x2165,
-  Smonospace: 0xFF33,
-  Softsigncyrillic: 0x042C,
-  Ssmall: 0xF773,
-  Stigmagreek: 0x03DA,
-  T: 0x0054,
-  Tau: 0x03A4,
-  Tbar: 0x0166,
-  Tcaron: 0x0164,
-  Tcedilla: 0x0162,
-  Tcircle: 0x24C9,
-  Tcircumflexbelow: 0x1E70,
-  Tcommaaccent: 0x0162,
-  Tdotaccent: 0x1E6A,
-  Tdotbelow: 0x1E6C,
-  Tecyrillic: 0x0422,
-  Tedescendercyrillic: 0x04AC,
-  Tenroman: 0x2169,
-  Tetsecyrillic: 0x04B4,
-  Theta: 0x0398,
-  Thook: 0x01AC,
-  Thorn: 0x00DE,
-  Thornsmall: 0xF7FE,
-  Threeroman: 0x2162,
-  Tildesmall: 0xF6FE,
-  Tiwnarmenian: 0x054F,
-  Tlinebelow: 0x1E6E,
-  Tmonospace: 0xFF34,
-  Toarmenian: 0x0539,
-  Tonefive: 0x01BC,
-  Tonesix: 0x0184,
-  Tonetwo: 0x01A7,
-  Tretroflexhook: 0x01AE,
-  Tsecyrillic: 0x0426,
-  Tshecyrillic: 0x040B,
-  Tsmall: 0xF774,
-  Twelveroman: 0x216B,
-  Tworoman: 0x2161,
-  U: 0x0055,
-  Uacute: 0x00DA,
-  Uacutesmall: 0xF7FA,
-  Ubreve: 0x016C,
-  Ucaron: 0x01D3,
-  Ucircle: 0x24CA,
-  Ucircumflex: 0x00DB,
-  Ucircumflexbelow: 0x1E76,
-  Ucircumflexsmall: 0xF7FB,
-  Ucyrillic: 0x0423,
-  Udblacute: 0x0170,
-  Udblgrave: 0x0214,
-  Udieresis: 0x00DC,
-  Udieresisacute: 0x01D7,
-  Udieresisbelow: 0x1E72,
-  Udieresiscaron: 0x01D9,
-  Udieresiscyrillic: 0x04F0,
-  Udieresisgrave: 0x01DB,
-  Udieresismacron: 0x01D5,
-  Udieresissmall: 0xF7FC,
-  Udotbelow: 0x1EE4,
-  Ugrave: 0x00D9,
-  Ugravesmall: 0xF7F9,
-  Uhookabove: 0x1EE6,
-  Uhorn: 0x01AF,
-  Uhornacute: 0x1EE8,
-  Uhorndotbelow: 0x1EF0,
-  Uhorngrave: 0x1EEA,
-  Uhornhookabove: 0x1EEC,
-  Uhorntilde: 0x1EEE,
-  Uhungarumlaut: 0x0170,
-  Uhungarumlautcyrillic: 0x04F2,
-  Uinvertedbreve: 0x0216,
-  Ukcyrillic: 0x0478,
-  Umacron: 0x016A,
-  Umacroncyrillic: 0x04EE,
-  Umacrondieresis: 0x1E7A,
-  Umonospace: 0xFF35,
-  Uogonek: 0x0172,
-  Upsilon: 0x03A5,
-  Upsilon1: 0x03D2,
-  Upsilonacutehooksymbolgreek: 0x03D3,
-  Upsilonafrican: 0x01B1,
-  Upsilondieresis: 0x03AB,
-  Upsilondieresishooksymbolgreek: 0x03D4,
-  Upsilonhooksymbol: 0x03D2,
-  Upsilontonos: 0x038E,
-  Uring: 0x016E,
-  Ushortcyrillic: 0x040E,
-  Usmall: 0xF775,
-  Ustraightcyrillic: 0x04AE,
-  Ustraightstrokecyrillic: 0x04B0,
-  Utilde: 0x0168,
-  Utildeacute: 0x1E78,
-  Utildebelow: 0x1E74,
-  V: 0x0056,
-  Vcircle: 0x24CB,
-  Vdotbelow: 0x1E7E,
-  Vecyrillic: 0x0412,
-  Vewarmenian: 0x054E,
-  Vhook: 0x01B2,
-  Vmonospace: 0xFF36,
-  Voarmenian: 0x0548,
-  Vsmall: 0xF776,
-  Vtilde: 0x1E7C,
-  W: 0x0057,
-  Wacute: 0x1E82,
-  Wcircle: 0x24CC,
-  Wcircumflex: 0x0174,
-  Wdieresis: 0x1E84,
-  Wdotaccent: 0x1E86,
-  Wdotbelow: 0x1E88,
-  Wgrave: 0x1E80,
-  Wmonospace: 0xFF37,
-  Wsmall: 0xF777,
-  X: 0x0058,
-  Xcircle: 0x24CD,
-  Xdieresis: 0x1E8C,
-  Xdotaccent: 0x1E8A,
-  Xeharmenian: 0x053D,
-  Xi: 0x039E,
-  Xmonospace: 0xFF38,
-  Xsmall: 0xF778,
-  Y: 0x0059,
-  Yacute: 0x00DD,
-  Yacutesmall: 0xF7FD,
-  Yatcyrillic: 0x0462,
-  Ycircle: 0x24CE,
-  Ycircumflex: 0x0176,
-  Ydieresis: 0x0178,
-  Ydieresissmall: 0xF7FF,
-  Ydotaccent: 0x1E8E,
-  Ydotbelow: 0x1EF4,
-  Yericyrillic: 0x042B,
-  Yerudieresiscyrillic: 0x04F8,
-  Ygrave: 0x1EF2,
-  Yhook: 0x01B3,
-  Yhookabove: 0x1EF6,
-  Yiarmenian: 0x0545,
-  Yicyrillic: 0x0407,
-  Yiwnarmenian: 0x0552,
-  Ymonospace: 0xFF39,
-  Ysmall: 0xF779,
-  Ytilde: 0x1EF8,
-  Yusbigcyrillic: 0x046A,
-  Yusbigiotifiedcyrillic: 0x046C,
-  Yuslittlecyrillic: 0x0466,
-  Yuslittleiotifiedcyrillic: 0x0468,
-  Z: 0x005A,
-  Zaarmenian: 0x0536,
-  Zacute: 0x0179,
-  Zcaron: 0x017D,
-  Zcaronsmall: 0xF6FF,
-  Zcircle: 0x24CF,
-  Zcircumflex: 0x1E90,
-  Zdot: 0x017B,
-  Zdotaccent: 0x017B,
-  Zdotbelow: 0x1E92,
-  Zecyrillic: 0x0417,
-  Zedescendercyrillic: 0x0498,
-  Zedieresiscyrillic: 0x04DE,
-  Zeta: 0x0396,
-  Zhearmenian: 0x053A,
-  Zhebrevecyrillic: 0x04C1,
-  Zhecyrillic: 0x0416,
-  Zhedescendercyrillic: 0x0496,
-  Zhedieresiscyrillic: 0x04DC,
-  Zlinebelow: 0x1E94,
-  Zmonospace: 0xFF3A,
-  Zsmall: 0xF77A,
-  Zstroke: 0x01B5,
-  a: 0x0061,
-  aabengali: 0x0986,
-  aacute: 0x00E1,
-  aadeva: 0x0906,
-  aagujarati: 0x0A86,
-  aagurmukhi: 0x0A06,
-  aamatragurmukhi: 0x0A3E,
-  aarusquare: 0x3303,
-  aavowelsignbengali: 0x09BE,
-  aavowelsigndeva: 0x093E,
-  aavowelsigngujarati: 0x0ABE,
-  abbreviationmarkarmenian: 0x055F,
-  abbreviationsigndeva: 0x0970,
-  abengali: 0x0985,
-  abopomofo: 0x311A,
-  abreve: 0x0103,
-  abreveacute: 0x1EAF,
-  abrevecyrillic: 0x04D1,
-  abrevedotbelow: 0x1EB7,
-  abrevegrave: 0x1EB1,
-  abrevehookabove: 0x1EB3,
-  abrevetilde: 0x1EB5,
-  acaron: 0x01CE,
-  acircle: 0x24D0,
-  acircumflex: 0x00E2,
-  acircumflexacute: 0x1EA5,
-  acircumflexdotbelow: 0x1EAD,
-  acircumflexgrave: 0x1EA7,
-  acircumflexhookabove: 0x1EA9,
-  acircumflextilde: 0x1EAB,
-  acute: 0x00B4,
-  acutebelowcmb: 0x0317,
-  acutecmb: 0x0301,
-  acutecomb: 0x0301,
-  acutedeva: 0x0954,
-  acutelowmod: 0x02CF,
-  acutetonecmb: 0x0341,
-  acyrillic: 0x0430,
-  adblgrave: 0x0201,
-  addakgurmukhi: 0x0A71,
-  adeva: 0x0905,
-  adieresis: 0x00E4,
-  adieresiscyrillic: 0x04D3,
-  adieresismacron: 0x01DF,
-  adotbelow: 0x1EA1,
-  adotmacron: 0x01E1,
-  ae: 0x00E6,
-  aeacute: 0x01FD,
-  aekorean: 0x3150,
-  aemacron: 0x01E3,
-  afii00208: 0x2015,
-  afii08941: 0x20A4,
-  afii10017: 0x0410,
-  afii10018: 0x0411,
-  afii10019: 0x0412,
-  afii10020: 0x0413,
-  afii10021: 0x0414,
-  afii10022: 0x0415,
-  afii10023: 0x0401,
-  afii10024: 0x0416,
-  afii10025: 0x0417,
-  afii10026: 0x0418,
-  afii10027: 0x0419,
-  afii10028: 0x041A,
-  afii10029: 0x041B,
-  afii10030: 0x041C,
-  afii10031: 0x041D,
-  afii10032: 0x041E,
-  afii10033: 0x041F,
-  afii10034: 0x0420,
-  afii10035: 0x0421,
-  afii10036: 0x0422,
-  afii10037: 0x0423,
-  afii10038: 0x0424,
-  afii10039: 0x0425,
-  afii10040: 0x0426,
-  afii10041: 0x0427,
-  afii10042: 0x0428,
-  afii10043: 0x0429,
-  afii10044: 0x042A,
-  afii10045: 0x042B,
-  afii10046: 0x042C,
-  afii10047: 0x042D,
-  afii10048: 0x042E,
-  afii10049: 0x042F,
-  afii10050: 0x0490,
-  afii10051: 0x0402,
-  afii10052: 0x0403,
-  afii10053: 0x0404,
-  afii10054: 0x0405,
-  afii10055: 0x0406,
-  afii10056: 0x0407,
-  afii10057: 0x0408,
-  afii10058: 0x0409,
-  afii10059: 0x040A,
-  afii10060: 0x040B,
-  afii10061: 0x040C,
-  afii10062: 0x040E,
-  afii10063: 0xF6C4,
-  afii10064: 0xF6C5,
-  afii10065: 0x0430,
-  afii10066: 0x0431,
-  afii10067: 0x0432,
-  afii10068: 0x0433,
-  afii10069: 0x0434,
-  afii10070: 0x0435,
-  afii10071: 0x0451,
-  afii10072: 0x0436,
-  afii10073: 0x0437,
-  afii10074: 0x0438,
-  afii10075: 0x0439,
-  afii10076: 0x043A,
-  afii10077: 0x043B,
-  afii10078: 0x043C,
-  afii10079: 0x043D,
-  afii10080: 0x043E,
-  afii10081: 0x043F,
-  afii10082: 0x0440,
-  afii10083: 0x0441,
-  afii10084: 0x0442,
-  afii10085: 0x0443,
-  afii10086: 0x0444,
-  afii10087: 0x0445,
-  afii10088: 0x0446,
-  afii10089: 0x0447,
-  afii10090: 0x0448,
-  afii10091: 0x0449,
-  afii10092: 0x044A,
-  afii10093: 0x044B,
-  afii10094: 0x044C,
-  afii10095: 0x044D,
-  afii10096: 0x044E,
-  afii10097: 0x044F,
-  afii10098: 0x0491,
-  afii10099: 0x0452,
-  afii10100: 0x0453,
-  afii10101: 0x0454,
-  afii10102: 0x0455,
-  afii10103: 0x0456,
-  afii10104: 0x0457,
-  afii10105: 0x0458,
-  afii10106: 0x0459,
-  afii10107: 0x045A,
-  afii10108: 0x045B,
-  afii10109: 0x045C,
-  afii10110: 0x045E,
-  afii10145: 0x040F,
-  afii10146: 0x0462,
-  afii10147: 0x0472,
-  afii10148: 0x0474,
-  afii10192: 0xF6C6,
-  afii10193: 0x045F,
-  afii10194: 0x0463,
-  afii10195: 0x0473,
-  afii10196: 0x0475,
-  afii10831: 0xF6C7,
-  afii10832: 0xF6C8,
-  afii10846: 0x04D9,
-  afii299: 0x200E,
-  afii300: 0x200F,
-  afii301: 0x200D,
-  afii57381: 0x066A,
-  afii57388: 0x060C,
-  afii57392: 0x0660,
-  afii57393: 0x0661,
-  afii57394: 0x0662,
-  afii57395: 0x0663,
-  afii57396: 0x0664,
-  afii57397: 0x0665,
-  afii57398: 0x0666,
-  afii57399: 0x0667,
-  afii57400: 0x0668,
-  afii57401: 0x0669,
-  afii57403: 0x061B,
-  afii57407: 0x061F,
-  afii57409: 0x0621,
-  afii57410: 0x0622,
-  afii57411: 0x0623,
-  afii57412: 0x0624,
-  afii57413: 0x0625,
-  afii57414: 0x0626,
-  afii57415: 0x0627,
-  afii57416: 0x0628,
-  afii57417: 0x0629,
-  afii57418: 0x062A,
-  afii57419: 0x062B,
-  afii57420: 0x062C,
-  afii57421: 0x062D,
-  afii57422: 0x062E,
-  afii57423: 0x062F,
-  afii57424: 0x0630,
-  afii57425: 0x0631,
-  afii57426: 0x0632,
-  afii57427: 0x0633,
-  afii57428: 0x0634,
-  afii57429: 0x0635,
-  afii57430: 0x0636,
-  afii57431: 0x0637,
-  afii57432: 0x0638,
-  afii57433: 0x0639,
-  afii57434: 0x063A,
-  afii57440: 0x0640,
-  afii57441: 0x0641,
-  afii57442: 0x0642,
-  afii57443: 0x0643,
-  afii57444: 0x0644,
-  afii57445: 0x0645,
-  afii57446: 0x0646,
-  afii57448: 0x0648,
-  afii57449: 0x0649,
-  afii57450: 0x064A,
-  afii57451: 0x064B,
-  afii57452: 0x064C,
-  afii57453: 0x064D,
-  afii57454: 0x064E,
-  afii57455: 0x064F,
-  afii57456: 0x0650,
-  afii57457: 0x0651,
-  afii57458: 0x0652,
-  afii57470: 0x0647,
-  afii57505: 0x06A4,
-  afii57506: 0x067E,
-  afii57507: 0x0686,
-  afii57508: 0x0698,
-  afii57509: 0x06AF,
-  afii57511: 0x0679,
-  afii57512: 0x0688,
-  afii57513: 0x0691,
-  afii57514: 0x06BA,
-  afii57519: 0x06D2,
-  afii57534: 0x06D5,
-  afii57636: 0x20AA,
-  afii57645: 0x05BE,
-  afii57658: 0x05C3,
-  afii57664: 0x05D0,
-  afii57665: 0x05D1,
-  afii57666: 0x05D2,
-  afii57667: 0x05D3,
-  afii57668: 0x05D4,
-  afii57669: 0x05D5,
-  afii57670: 0x05D6,
-  afii57671: 0x05D7,
-  afii57672: 0x05D8,
-  afii57673: 0x05D9,
-  afii57674: 0x05DA,
-  afii57675: 0x05DB,
-  afii57676: 0x05DC,
-  afii57677: 0x05DD,
-  afii57678: 0x05DE,
-  afii57679: 0x05DF,
-  afii57680: 0x05E0,
-  afii57681: 0x05E1,
-  afii57682: 0x05E2,
-  afii57683: 0x05E3,
-  afii57684: 0x05E4,
-  afii57685: 0x05E5,
-  afii57686: 0x05E6,
-  afii57687: 0x05E7,
-  afii57688: 0x05E8,
-  afii57689: 0x05E9,
-  afii57690: 0x05EA,
-  afii57694: 0xFB2A,
-  afii57695: 0xFB2B,
-  afii57700: 0xFB4B,
-  afii57705: 0xFB1F,
-  afii57716: 0x05F0,
-  afii57717: 0x05F1,
-  afii57718: 0x05F2,
-  afii57723: 0xFB35,
-  afii57793: 0x05B4,
-  afii57794: 0x05B5,
-  afii57795: 0x05B6,
-  afii57796: 0x05BB,
-  afii57797: 0x05B8,
-  afii57798: 0x05B7,
-  afii57799: 0x05B0,
-  afii57800: 0x05B2,
-  afii57801: 0x05B1,
-  afii57802: 0x05B3,
-  afii57803: 0x05C2,
-  afii57804: 0x05C1,
-  afii57806: 0x05B9,
-  afii57807: 0x05BC,
-  afii57839: 0x05BD,
-  afii57841: 0x05BF,
-  afii57842: 0x05C0,
-  afii57929: 0x02BC,
-  afii61248: 0x2105,
-  afii61289: 0x2113,
-  afii61352: 0x2116,
-  afii61573: 0x202C,
-  afii61574: 0x202D,
-  afii61575: 0x202E,
-  afii61664: 0x200C,
-  afii63167: 0x066D,
-  afii64937: 0x02BD,
-  agrave: 0x00E0,
-  agujarati: 0x0A85,
-  agurmukhi: 0x0A05,
-  ahiragana: 0x3042,
-  ahookabove: 0x1EA3,
-  aibengali: 0x0990,
-  aibopomofo: 0x311E,
-  aideva: 0x0910,
-  aiecyrillic: 0x04D5,
-  aigujarati: 0x0A90,
-  aigurmukhi: 0x0A10,
-  aimatragurmukhi: 0x0A48,
-  ainarabic: 0x0639,
-  ainfinalarabic: 0xFECA,
-  aininitialarabic: 0xFECB,
-  ainmedialarabic: 0xFECC,
-  ainvertedbreve: 0x0203,
-  aivowelsignbengali: 0x09C8,
-  aivowelsigndeva: 0x0948,
-  aivowelsigngujarati: 0x0AC8,
-  akatakana: 0x30A2,
-  akatakanahalfwidth: 0xFF71,
-  akorean: 0x314F,
-  alef: 0x05D0,
-  alefarabic: 0x0627,
-  alefdageshhebrew: 0xFB30,
-  aleffinalarabic: 0xFE8E,
-  alefhamzaabovearabic: 0x0623,
-  alefhamzaabovefinalarabic: 0xFE84,
-  alefhamzabelowarabic: 0x0625,
-  alefhamzabelowfinalarabic: 0xFE88,
-  alefhebrew: 0x05D0,
-  aleflamedhebrew: 0xFB4F,
-  alefmaddaabovearabic: 0x0622,
-  alefmaddaabovefinalarabic: 0xFE82,
-  alefmaksuraarabic: 0x0649,
-  alefmaksurafinalarabic: 0xFEF0,
-  alefmaksurainitialarabic: 0xFEF3,
-  alefmaksuramedialarabic: 0xFEF4,
-  alefpatahhebrew: 0xFB2E,
-  alefqamatshebrew: 0xFB2F,
-  aleph: 0x2135,
-  allequal: 0x224C,
-  alpha: 0x03B1,
-  alphatonos: 0x03AC,
-  amacron: 0x0101,
-  amonospace: 0xFF41,
-  ampersand: 0x0026,
-  ampersandmonospace: 0xFF06,
-  ampersandsmall: 0xF726,
-  amsquare: 0x33C2,
-  anbopomofo: 0x3122,
-  angbopomofo: 0x3124,
-  angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
-  angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
-  angkhankhuthai: 0x0E5A,
-  angle: 0x2220,
-  anglebracketleft: 0x3008,
-  anglebracketleftvertical: 0xFE3F,
-  anglebracketright: 0x3009,
-  anglebracketrightvertical: 0xFE40,
-  angleleft: 0x2329,
-  angleright: 0x232A,
-  angstrom: 0x212B,
-  anoteleia: 0x0387,
-  anudattadeva: 0x0952,
-  anusvarabengali: 0x0982,
-  anusvaradeva: 0x0902,
-  anusvaragujarati: 0x0A82,
-  aogonek: 0x0105,
-  apaatosquare: 0x3300,
-  aparen: 0x249C,
-  apostrophearmenian: 0x055A,
-  apostrophemod: 0x02BC,
-  apple: 0xF8FF,
-  approaches: 0x2250,
-  approxequal: 0x2248,
-  approxequalorimage: 0x2252,
-  approximatelyequal: 0x2245,
-  araeaekorean: 0x318E,
-  araeakorean: 0x318D,
-  arc: 0x2312,
-  arighthalfring: 0x1E9A,
-  aring: 0x00E5,
-  aringacute: 0x01FB,
-  aringbelow: 0x1E01,
-  arrowboth: 0x2194,
-  arrowdashdown: 0x21E3,
-  arrowdashleft: 0x21E0,
-  arrowdashright: 0x21E2,
-  arrowdashup: 0x21E1,
-  arrowdblboth: 0x21D4,
-  arrowdbldown: 0x21D3,
-  arrowdblleft: 0x21D0,
-  arrowdblright: 0x21D2,
-  arrowdblup: 0x21D1,
-  arrowdown: 0x2193,
-  arrowdownleft: 0x2199,
-  arrowdownright: 0x2198,
-  arrowdownwhite: 0x21E9,
-  arrowheaddownmod: 0x02C5,
-  arrowheadleftmod: 0x02C2,
-  arrowheadrightmod: 0x02C3,
-  arrowheadupmod: 0x02C4,
-  arrowhorizex: 0xF8E7,
-  arrowleft: 0x2190,
-  arrowleftdbl: 0x21D0,
-  arrowleftdblstroke: 0x21CD,
-  arrowleftoverright: 0x21C6,
-  arrowleftwhite: 0x21E6,
-  arrowright: 0x2192,
-  arrowrightdblstroke: 0x21CF,
-  arrowrightheavy: 0x279E,
-  arrowrightoverleft: 0x21C4,
-  arrowrightwhite: 0x21E8,
-  arrowtableft: 0x21E4,
-  arrowtabright: 0x21E5,
-  arrowup: 0x2191,
-  arrowupdn: 0x2195,
-  arrowupdnbse: 0x21A8,
-  arrowupdownbase: 0x21A8,
-  arrowupleft: 0x2196,
-  arrowupleftofdown: 0x21C5,
-  arrowupright: 0x2197,
-  arrowupwhite: 0x21E7,
-  arrowvertex: 0xF8E6,
-  asciicircum: 0x005E,
-  asciicircummonospace: 0xFF3E,
-  asciitilde: 0x007E,
-  asciitildemonospace: 0xFF5E,
-  ascript: 0x0251,
-  ascriptturned: 0x0252,
-  asmallhiragana: 0x3041,
-  asmallkatakana: 0x30A1,
-  asmallkatakanahalfwidth: 0xFF67,
-  asterisk: 0x002A,
-  asteriskaltonearabic: 0x066D,
-  asteriskarabic: 0x066D,
-  asteriskmath: 0x2217,
-  asteriskmonospace: 0xFF0A,
-  asterisksmall: 0xFE61,
-  asterism: 0x2042,
-  asuperior: 0xF6E9,
-  asymptoticallyequal: 0x2243,
-  at: 0x0040,
-  atilde: 0x00E3,
-  atmonospace: 0xFF20,
-  atsmall: 0xFE6B,
-  aturned: 0x0250,
-  aubengali: 0x0994,
-  aubopomofo: 0x3120,
-  audeva: 0x0914,
-  augujarati: 0x0A94,
-  augurmukhi: 0x0A14,
-  aulengthmarkbengali: 0x09D7,
-  aumatragurmukhi: 0x0A4C,
-  auvowelsignbengali: 0x09CC,
-  auvowelsigndeva: 0x094C,
-  auvowelsigngujarati: 0x0ACC,
-  avagrahadeva: 0x093D,
-  aybarmenian: 0x0561,
-  ayin: 0x05E2,
-  ayinaltonehebrew: 0xFB20,
-  ayinhebrew: 0x05E2,
-  b: 0x0062,
-  babengali: 0x09AC,
-  backslash: 0x005C,
-  backslashmonospace: 0xFF3C,
-  badeva: 0x092C,
-  bagujarati: 0x0AAC,
-  bagurmukhi: 0x0A2C,
-  bahiragana: 0x3070,
-  bahtthai: 0x0E3F,
-  bakatakana: 0x30D0,
-  bar: 0x007C,
-  barmonospace: 0xFF5C,
-  bbopomofo: 0x3105,
-  bcircle: 0x24D1,
-  bdotaccent: 0x1E03,
-  bdotbelow: 0x1E05,
-  beamedsixteenthnotes: 0x266C,
-  because: 0x2235,
-  becyrillic: 0x0431,
-  beharabic: 0x0628,
-  behfinalarabic: 0xFE90,
-  behinitialarabic: 0xFE91,
-  behiragana: 0x3079,
-  behmedialarabic: 0xFE92,
-  behmeeminitialarabic: 0xFC9F,
-  behmeemisolatedarabic: 0xFC08,
-  behnoonfinalarabic: 0xFC6D,
-  bekatakana: 0x30D9,
-  benarmenian: 0x0562,
-  bet: 0x05D1,
-  beta: 0x03B2,
-  betasymbolgreek: 0x03D0,
-  betdagesh: 0xFB31,
-  betdageshhebrew: 0xFB31,
-  bethebrew: 0x05D1,
-  betrafehebrew: 0xFB4C,
-  bhabengali: 0x09AD,
-  bhadeva: 0x092D,
-  bhagujarati: 0x0AAD,
-  bhagurmukhi: 0x0A2D,
-  bhook: 0x0253,
-  bihiragana: 0x3073,
-  bikatakana: 0x30D3,
-  bilabialclick: 0x0298,
-  bindigurmukhi: 0x0A02,
-  birusquare: 0x3331,
-  blackcircle: 0x25CF,
-  blackdiamond: 0x25C6,
-  blackdownpointingtriangle: 0x25BC,
-  blackleftpointingpointer: 0x25C4,
-  blackleftpointingtriangle: 0x25C0,
-  blacklenticularbracketleft: 0x3010,
-  blacklenticularbracketleftvertical: 0xFE3B,
-  blacklenticularbracketright: 0x3011,
-  blacklenticularbracketrightvertical: 0xFE3C,
-  blacklowerlefttriangle: 0x25E3,
-  blacklowerrighttriangle: 0x25E2,
-  blackrectangle: 0x25AC,
-  blackrightpointingpointer: 0x25BA,
-  blackrightpointingtriangle: 0x25B6,
-  blacksmallsquare: 0x25AA,
-  blacksmilingface: 0x263B,
-  blacksquare: 0x25A0,
-  blackstar: 0x2605,
-  blackupperlefttriangle: 0x25E4,
-  blackupperrighttriangle: 0x25E5,
-  blackuppointingsmalltriangle: 0x25B4,
-  blackuppointingtriangle: 0x25B2,
-  blank: 0x2423,
-  blinebelow: 0x1E07,
-  block: 0x2588,
-  bmonospace: 0xFF42,
-  bobaimaithai: 0x0E1A,
-  bohiragana: 0x307C,
-  bokatakana: 0x30DC,
-  bparen: 0x249D,
-  bqsquare: 0x33C3,
-  braceex: 0xF8F4,
-  braceleft: 0x007B,
-  braceleftbt: 0xF8F3,
-  braceleftmid: 0xF8F2,
-  braceleftmonospace: 0xFF5B,
-  braceleftsmall: 0xFE5B,
-  bracelefttp: 0xF8F1,
-  braceleftvertical: 0xFE37,
-  braceright: 0x007D,
-  bracerightbt: 0xF8FE,
-  bracerightmid: 0xF8FD,
-  bracerightmonospace: 0xFF5D,
-  bracerightsmall: 0xFE5C,
-  bracerighttp: 0xF8FC,
-  bracerightvertical: 0xFE38,
-  bracketleft: 0x005B,
-  bracketleftbt: 0xF8F0,
-  bracketleftex: 0xF8EF,
-  bracketleftmonospace: 0xFF3B,
-  bracketlefttp: 0xF8EE,
-  bracketright: 0x005D,
-  bracketrightbt: 0xF8FB,
-  bracketrightex: 0xF8FA,
-  bracketrightmonospace: 0xFF3D,
-  bracketrighttp: 0xF8F9,
-  breve: 0x02D8,
-  brevebelowcmb: 0x032E,
-  brevecmb: 0x0306,
-  breveinvertedbelowcmb: 0x032F,
-  breveinvertedcmb: 0x0311,
-  breveinverteddoublecmb: 0x0361,
-  bridgebelowcmb: 0x032A,
-  bridgeinvertedbelowcmb: 0x033A,
-  brokenbar: 0x00A6,
-  bstroke: 0x0180,
-  bsuperior: 0xF6EA,
-  btopbar: 0x0183,
-  buhiragana: 0x3076,
-  bukatakana: 0x30D6,
-  bullet: 0x2022,
-  bulletinverse: 0x25D8,
-  bulletoperator: 0x2219,
-  bullseye: 0x25CE,
-  c: 0x0063,
-  caarmenian: 0x056E,
-  cabengali: 0x099A,
-  cacute: 0x0107,
-  cadeva: 0x091A,
-  cagujarati: 0x0A9A,
-  cagurmukhi: 0x0A1A,
-  calsquare: 0x3388,
-  candrabindubengali: 0x0981,
-  candrabinducmb: 0x0310,
-  candrabindudeva: 0x0901,
-  candrabindugujarati: 0x0A81,
-  capslock: 0x21EA,
-  careof: 0x2105,
-  caron: 0x02C7,
-  caronbelowcmb: 0x032C,
-  caroncmb: 0x030C,
-  carriagereturn: 0x21B5,
-  cbopomofo: 0x3118,
-  ccaron: 0x010D,
-  ccedilla: 0x00E7,
-  ccedillaacute: 0x1E09,
-  ccircle: 0x24D2,
-  ccircumflex: 0x0109,
-  ccurl: 0x0255,
-  cdot: 0x010B,
-  cdotaccent: 0x010B,
-  cdsquare: 0x33C5,
-  cedilla: 0x00B8,
-  cedillacmb: 0x0327,
-  cent: 0x00A2,
-  centigrade: 0x2103,
-  centinferior: 0xF6DF,
-  centmonospace: 0xFFE0,
-  centoldstyle: 0xF7A2,
-  centsuperior: 0xF6E0,
-  chaarmenian: 0x0579,
-  chabengali: 0x099B,
-  chadeva: 0x091B,
-  chagujarati: 0x0A9B,
-  chagurmukhi: 0x0A1B,
-  chbopomofo: 0x3114,
-  cheabkhasiancyrillic: 0x04BD,
-  checkmark: 0x2713,
-  checyrillic: 0x0447,
-  chedescenderabkhasiancyrillic: 0x04BF,
-  chedescendercyrillic: 0x04B7,
-  chedieresiscyrillic: 0x04F5,
-  cheharmenian: 0x0573,
-  chekhakassiancyrillic: 0x04CC,
-  cheverticalstrokecyrillic: 0x04B9,
-  chi: 0x03C7,
-  chieuchacirclekorean: 0x3277,
-  chieuchaparenkorean: 0x3217,
-  chieuchcirclekorean: 0x3269,
-  chieuchkorean: 0x314A,
-  chieuchparenkorean: 0x3209,
-  chochangthai: 0x0E0A,
-  chochanthai: 0x0E08,
-  chochingthai: 0x0E09,
-  chochoethai: 0x0E0C,
-  chook: 0x0188,
-  cieucacirclekorean: 0x3276,
-  cieucaparenkorean: 0x3216,
-  cieuccirclekorean: 0x3268,
-  cieuckorean: 0x3148,
-  cieucparenkorean: 0x3208,
-  cieucuparenkorean: 0x321C,
-  circle: 0x25CB,
-  circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
-  circlemultiply: 0x2297,
-  circleot: 0x2299,
-  circleplus: 0x2295,
-  circlepostalmark: 0x3036,
-  circlewithlefthalfblack: 0x25D0,
-  circlewithrighthalfblack: 0x25D1,
-  circumflex: 0x02C6,
-  circumflexbelowcmb: 0x032D,
-  circumflexcmb: 0x0302,
-  clear: 0x2327,
-  clickalveolar: 0x01C2,
-  clickdental: 0x01C0,
-  clicklateral: 0x01C1,
-  clickretroflex: 0x01C3,
-  club: 0x2663,
-  clubsuitblack: 0x2663,
-  clubsuitwhite: 0x2667,
-  cmcubedsquare: 0x33A4,
-  cmonospace: 0xFF43,
-  cmsquaredsquare: 0x33A0,
-  coarmenian: 0x0581,
-  colon: 0x003A,
-  colonmonetary: 0x20A1,
-  colonmonospace: 0xFF1A,
-  colonsign: 0x20A1,
-  colonsmall: 0xFE55,
-  colontriangularhalfmod: 0x02D1,
-  colontriangularmod: 0x02D0,
-  comma: 0x002C,
-  commaabovecmb: 0x0313,
-  commaaboverightcmb: 0x0315,
-  commaaccent: 0xF6C3,
-  commaarabic: 0x060C,
-  commaarmenian: 0x055D,
-  commainferior: 0xF6E1,
-  commamonospace: 0xFF0C,
-  commareversedabovecmb: 0x0314,
-  commareversedmod: 0x02BD,
-  commasmall: 0xFE50,
-  commasuperior: 0xF6E2,
-  commaturnedabovecmb: 0x0312,
-  commaturnedmod: 0x02BB,
-  compass: 0x263C,
-  congruent: 0x2245,
-  contourintegral: 0x222E,
-  control: 0x2303,
-  controlACK: 0x0006,
-  controlBEL: 0x0007,
-  controlBS: 0x0008,
-  controlCAN: 0x0018,
-  controlCR: 0x000D,
-  controlDC1: 0x0011,
-  controlDC2: 0x0012,
-  controlDC3: 0x0013,
-  controlDC4: 0x0014,
-  controlDEL: 0x007F,
-  controlDLE: 0x0010,
-  controlEM: 0x0019,
-  controlENQ: 0x0005,
-  controlEOT: 0x0004,
-  controlESC: 0x001B,
-  controlETB: 0x0017,
-  controlETX: 0x0003,
-  controlFF: 0x000C,
-  controlFS: 0x001C,
-  controlGS: 0x001D,
-  controlHT: 0x0009,
-  controlLF: 0x000A,
-  controlNAK: 0x0015,
-  controlRS: 0x001E,
-  controlSI: 0x000F,
-  controlSO: 0x000E,
-  controlSOT: 0x0002,
-  controlSTX: 0x0001,
-  controlSUB: 0x001A,
-  controlSYN: 0x0016,
-  controlUS: 0x001F,
-  controlVT: 0x000B,
-  copyright: 0x00A9,
-  copyrightsans: 0xF8E9,
-  copyrightserif: 0xF6D9,
-  cornerbracketleft: 0x300C,
-  cornerbracketlefthalfwidth: 0xFF62,
-  cornerbracketleftvertical: 0xFE41,
-  cornerbracketright: 0x300D,
-  cornerbracketrighthalfwidth: 0xFF63,
-  cornerbracketrightvertical: 0xFE42,
-  corporationsquare: 0x337F,
-  cosquare: 0x33C7,
-  coverkgsquare: 0x33C6,
-  cparen: 0x249E,
-  cruzeiro: 0x20A2,
-  cstretched: 0x0297,
-  curlyand: 0x22CF,
-  curlyor: 0x22CE,
-  currency: 0x00A4,
-  cyrBreve: 0xF6D1,
-  cyrFlex: 0xF6D2,
-  cyrbreve: 0xF6D4,
-  cyrflex: 0xF6D5,
-  d: 0x0064,
-  daarmenian: 0x0564,
-  dabengali: 0x09A6,
-  dadarabic: 0x0636,
-  dadeva: 0x0926,
-  dadfinalarabic: 0xFEBE,
-  dadinitialarabic: 0xFEBF,
-  dadmedialarabic: 0xFEC0,
-  dagesh: 0x05BC,
-  dageshhebrew: 0x05BC,
-  dagger: 0x2020,
-  daggerdbl: 0x2021,
-  dagujarati: 0x0AA6,
-  dagurmukhi: 0x0A26,
-  dahiragana: 0x3060,
-  dakatakana: 0x30C0,
-  dalarabic: 0x062F,
-  dalet: 0x05D3,
-  daletdagesh: 0xFB33,
-  daletdageshhebrew: 0xFB33,
-  dalethebrew: 0x05D3,
-  dalfinalarabic: 0xFEAA,
-  dammaarabic: 0x064F,
-  dammalowarabic: 0x064F,
-  dammatanaltonearabic: 0x064C,
-  dammatanarabic: 0x064C,
-  danda: 0x0964,
-  dargahebrew: 0x05A7,
-  dargalefthebrew: 0x05A7,
-  dasiapneumatacyrilliccmb: 0x0485,
-  dblGrave: 0xF6D3,
-  dblanglebracketleft: 0x300A,
-  dblanglebracketleftvertical: 0xFE3D,
-  dblanglebracketright: 0x300B,
-  dblanglebracketrightvertical: 0xFE3E,
-  dblarchinvertedbelowcmb: 0x032B,
-  dblarrowleft: 0x21D4,
-  dblarrowright: 0x21D2,
-  dbldanda: 0x0965,
-  dblgrave: 0xF6D6,
-  dblgravecmb: 0x030F,
-  dblintegral: 0x222C,
-  dbllowline: 0x2017,
-  dbllowlinecmb: 0x0333,
-  dbloverlinecmb: 0x033F,
-  dblprimemod: 0x02BA,
-  dblverticalbar: 0x2016,
-  dblverticallineabovecmb: 0x030E,
-  dbopomofo: 0x3109,
-  dbsquare: 0x33C8,
-  dcaron: 0x010F,
-  dcedilla: 0x1E11,
-  dcircle: 0x24D3,
-  dcircumflexbelow: 0x1E13,
-  dcroat: 0x0111,
-  ddabengali: 0x09A1,
-  ddadeva: 0x0921,
-  ddagujarati: 0x0AA1,
-  ddagurmukhi: 0x0A21,
-  ddalarabic: 0x0688,
-  ddalfinalarabic: 0xFB89,
-  dddhadeva: 0x095C,
-  ddhabengali: 0x09A2,
-  ddhadeva: 0x0922,
-  ddhagujarati: 0x0AA2,
-  ddhagurmukhi: 0x0A22,
-  ddotaccent: 0x1E0B,
-  ddotbelow: 0x1E0D,
-  decimalseparatorarabic: 0x066B,
-  decimalseparatorpersian: 0x066B,
-  decyrillic: 0x0434,
-  degree: 0x00B0,
-  dehihebrew: 0x05AD,
-  dehiragana: 0x3067,
-  deicoptic: 0x03EF,
-  dekatakana: 0x30C7,
-  deleteleft: 0x232B,
-  deleteright: 0x2326,
-  delta: 0x03B4,
-  deltaturned: 0x018D,
-  denominatorminusonenumeratorbengali: 0x09F8,
-  dezh: 0x02A4,
-  dhabengali: 0x09A7,
-  dhadeva: 0x0927,
-  dhagujarati: 0x0AA7,
-  dhagurmukhi: 0x0A27,
-  dhook: 0x0257,
-  dialytikatonos: 0x0385,
-  dialytikatonoscmb: 0x0344,
-  diamond: 0x2666,
-  diamondsuitwhite: 0x2662,
-  dieresis: 0x00A8,
-  dieresisacute: 0xF6D7,
-  dieresisbelowcmb: 0x0324,
-  dieresiscmb: 0x0308,
-  dieresisgrave: 0xF6D8,
-  dieresistonos: 0x0385,
-  dihiragana: 0x3062,
-  dikatakana: 0x30C2,
-  dittomark: 0x3003,
-  divide: 0x00F7,
-  divides: 0x2223,
-  divisionslash: 0x2215,
-  djecyrillic: 0x0452,
-  dkshade: 0x2593,
-  dlinebelow: 0x1E0F,
-  dlsquare: 0x3397,
-  dmacron: 0x0111,
-  dmonospace: 0xFF44,
-  dnblock: 0x2584,
-  dochadathai: 0x0E0E,
-  dodekthai: 0x0E14,
-  dohiragana: 0x3069,
-  dokatakana: 0x30C9,
-  dollar: 0x0024,
-  dollarinferior: 0xF6E3,
-  dollarmonospace: 0xFF04,
-  dollaroldstyle: 0xF724,
-  dollarsmall: 0xFE69,
-  dollarsuperior: 0xF6E4,
-  dong: 0x20AB,
-  dorusquare: 0x3326,
-  dotaccent: 0x02D9,
-  dotaccentcmb: 0x0307,
-  dotbelowcmb: 0x0323,
-  dotbelowcomb: 0x0323,
-  dotkatakana: 0x30FB,
-  dotlessi: 0x0131,
-  dotlessj: 0xF6BE,
-  dotlessjstrokehook: 0x0284,
-  dotmath: 0x22C5,
-  dottedcircle: 0x25CC,
-  doubleyodpatah: 0xFB1F,
-  doubleyodpatahhebrew: 0xFB1F,
-  downtackbelowcmb: 0x031E,
-  downtackmod: 0x02D5,
-  dparen: 0x249F,
-  dsuperior: 0xF6EB,
-  dtail: 0x0256,
-  dtopbar: 0x018C,
-  duhiragana: 0x3065,
-  dukatakana: 0x30C5,
-  dz: 0x01F3,
-  dzaltone: 0x02A3,
-  dzcaron: 0x01C6,
-  dzcurl: 0x02A5,
-  dzeabkhasiancyrillic: 0x04E1,
-  dzecyrillic: 0x0455,
-  dzhecyrillic: 0x045F,
-  e: 0x0065,
-  eacute: 0x00E9,
-  earth: 0x2641,
-  ebengali: 0x098F,
-  ebopomofo: 0x311C,
-  ebreve: 0x0115,
-  ecandradeva: 0x090D,
-  ecandragujarati: 0x0A8D,
-  ecandravowelsigndeva: 0x0945,
-  ecandravowelsigngujarati: 0x0AC5,
-  ecaron: 0x011B,
-  ecedillabreve: 0x1E1D,
-  echarmenian: 0x0565,
-  echyiwnarmenian: 0x0587,
-  ecircle: 0x24D4,
-  ecircumflex: 0x00EA,
-  ecircumflexacute: 0x1EBF,
-  ecircumflexbelow: 0x1E19,
-  ecircumflexdotbelow: 0x1EC7,
-  ecircumflexgrave: 0x1EC1,
-  ecircumflexhookabove: 0x1EC3,
-  ecircumflextilde: 0x1EC5,
-  ecyrillic: 0x0454,
-  edblgrave: 0x0205,
-  edeva: 0x090F,
-  edieresis: 0x00EB,
-  edot: 0x0117,
-  edotaccent: 0x0117,
-  edotbelow: 0x1EB9,
-  eegurmukhi: 0x0A0F,
-  eematragurmukhi: 0x0A47,
-  efcyrillic: 0x0444,
-  egrave: 0x00E8,
-  egujarati: 0x0A8F,
-  eharmenian: 0x0567,
-  ehbopomofo: 0x311D,
-  ehiragana: 0x3048,
-  ehookabove: 0x1EBB,
-  eibopomofo: 0x311F,
-  eight: 0x0038,
-  eightarabic: 0x0668,
-  eightbengali: 0x09EE,
-  eightcircle: 0x2467,
-  eightcircleinversesansserif: 0x2791,
-  eightdeva: 0x096E,
-  eighteencircle: 0x2471,
-  eighteenparen: 0x2485,
-  eighteenperiod: 0x2499,
-  eightgujarati: 0x0AEE,
-  eightgurmukhi: 0x0A6E,
-  eighthackarabic: 0x0668,
-  eighthangzhou: 0x3028,
-  eighthnotebeamed: 0x266B,
-  eightideographicparen: 0x3227,
-  eightinferior: 0x2088,
-  eightmonospace: 0xFF18,
-  eightoldstyle: 0xF738,
-  eightparen: 0x247B,
-  eightperiod: 0x248F,
-  eightpersian: 0x06F8,
-  eightroman: 0x2177,
-  eightsuperior: 0x2078,
-  eightthai: 0x0E58,
-  einvertedbreve: 0x0207,
-  eiotifiedcyrillic: 0x0465,
-  ekatakana: 0x30A8,
-  ekatakanahalfwidth: 0xFF74,
-  ekonkargurmukhi: 0x0A74,
-  ekorean: 0x3154,
-  elcyrillic: 0x043B,
-  element: 0x2208,
-  elevencircle: 0x246A,
-  elevenparen: 0x247E,
-  elevenperiod: 0x2492,
-  elevenroman: 0x217A,
-  ellipsis: 0x2026,
-  ellipsisvertical: 0x22EE,
-  emacron: 0x0113,
-  emacronacute: 0x1E17,
-  emacrongrave: 0x1E15,
-  emcyrillic: 0x043C,
-  emdash: 0x2014,
-  emdashvertical: 0xFE31,
-  emonospace: 0xFF45,
-  emphasismarkarmenian: 0x055B,
-  emptyset: 0x2205,
-  enbopomofo: 0x3123,
-  encyrillic: 0x043D,
-  endash: 0x2013,
-  endashvertical: 0xFE32,
-  endescendercyrillic: 0x04A3,
-  eng: 0x014B,
-  engbopomofo: 0x3125,
-  enghecyrillic: 0x04A5,
-  enhookcyrillic: 0x04C8,
-  enspace: 0x2002,
-  eogonek: 0x0119,
-  eokorean: 0x3153,
-  eopen: 0x025B,
-  eopenclosed: 0x029A,
-  eopenreversed: 0x025C,
-  eopenreversedclosed: 0x025E,
-  eopenreversedhook: 0x025D,
-  eparen: 0x24A0,
-  epsilon: 0x03B5,
-  epsilontonos: 0x03AD,
-  equal: 0x003D,
-  equalmonospace: 0xFF1D,
-  equalsmall: 0xFE66,
-  equalsuperior: 0x207C,
-  equivalence: 0x2261,
-  erbopomofo: 0x3126,
-  ercyrillic: 0x0440,
-  ereversed: 0x0258,
-  ereversedcyrillic: 0x044D,
-  escyrillic: 0x0441,
-  esdescendercyrillic: 0x04AB,
-  esh: 0x0283,
-  eshcurl: 0x0286,
-  eshortdeva: 0x090E,
-  eshortvowelsigndeva: 0x0946,
-  eshreversedloop: 0x01AA,
-  eshsquatreversed: 0x0285,
-  esmallhiragana: 0x3047,
-  esmallkatakana: 0x30A7,
-  esmallkatakanahalfwidth: 0xFF6A,
-  estimated: 0x212E,
-  esuperior: 0xF6EC,
-  eta: 0x03B7,
-  etarmenian: 0x0568,
-  etatonos: 0x03AE,
-  eth: 0x00F0,
-  etilde: 0x1EBD,
-  etildebelow: 0x1E1B,
-  etnahtafoukhhebrew: 0x0591,
-  etnahtafoukhlefthebrew: 0x0591,
-  etnahtahebrew: 0x0591,
-  etnahtalefthebrew: 0x0591,
-  eturned: 0x01DD,
-  eukorean: 0x3161,
-  euro: 0x20AC,
-  evowelsignbengali: 0x09C7,
-  evowelsigndeva: 0x0947,
-  evowelsigngujarati: 0x0AC7,
-  exclam: 0x0021,
-  exclamarmenian: 0x055C,
-  exclamdbl: 0x203C,
-  exclamdown: 0x00A1,
-  exclamdownsmall: 0xF7A1,
-  exclammonospace: 0xFF01,
-  exclamsmall: 0xF721,
-  existential: 0x2203,
-  ezh: 0x0292,
-  ezhcaron: 0x01EF,
-  ezhcurl: 0x0293,
-  ezhreversed: 0x01B9,
-  ezhtail: 0x01BA,
-  f: 0x0066,
-  fadeva: 0x095E,
-  fagurmukhi: 0x0A5E,
-  fahrenheit: 0x2109,
-  fathaarabic: 0x064E,
-  fathalowarabic: 0x064E,
-  fathatanarabic: 0x064B,
-  fbopomofo: 0x3108,
-  fcircle: 0x24D5,
-  fdotaccent: 0x1E1F,
-  feharabic: 0x0641,
-  feharmenian: 0x0586,
-  fehfinalarabic: 0xFED2,
-  fehinitialarabic: 0xFED3,
-  fehmedialarabic: 0xFED4,
-  feicoptic: 0x03E5,
-  female: 0x2640,
-  ff: 0xFB00,
-  ffi: 0xFB03,
-  ffl: 0xFB04,
-  fi: 0xFB01,
-  fifteencircle: 0x246E,
-  fifteenparen: 0x2482,
-  fifteenperiod: 0x2496,
-  figuredash: 0x2012,
-  filledbox: 0x25A0,
-  filledrect: 0x25AC,
-  finalkaf: 0x05DA,
-  finalkafdagesh: 0xFB3A,
-  finalkafdageshhebrew: 0xFB3A,
-  finalkafhebrew: 0x05DA,
-  finalmem: 0x05DD,
-  finalmemhebrew: 0x05DD,
-  finalnun: 0x05DF,
-  finalnunhebrew: 0x05DF,
-  finalpe: 0x05E3,
-  finalpehebrew: 0x05E3,
-  finaltsadi: 0x05E5,
-  finaltsadihebrew: 0x05E5,
-  firsttonechinese: 0x02C9,
-  fisheye: 0x25C9,
-  fitacyrillic: 0x0473,
-  five: 0x0035,
-  fivearabic: 0x0665,
-  fivebengali: 0x09EB,
-  fivecircle: 0x2464,
-  fivecircleinversesansserif: 0x278E,
-  fivedeva: 0x096B,
-  fiveeighths: 0x215D,
-  fivegujarati: 0x0AEB,
-  fivegurmukhi: 0x0A6B,
-  fivehackarabic: 0x0665,
-  fivehangzhou: 0x3025,
-  fiveideographicparen: 0x3224,
-  fiveinferior: 0x2085,
-  fivemonospace: 0xFF15,
-  fiveoldstyle: 0xF735,
-  fiveparen: 0x2478,
-  fiveperiod: 0x248C,
-  fivepersian: 0x06F5,
-  fiveroman: 0x2174,
-  fivesuperior: 0x2075,
-  fivethai: 0x0E55,
-  fl: 0xFB02,
-  florin: 0x0192,
-  fmonospace: 0xFF46,
-  fmsquare: 0x3399,
-  fofanthai: 0x0E1F,
-  fofathai: 0x0E1D,
-  fongmanthai: 0x0E4F,
-  forall: 0x2200,
-  four: 0x0034,
-  fourarabic: 0x0664,
-  fourbengali: 0x09EA,
-  fourcircle: 0x2463,
-  fourcircleinversesansserif: 0x278D,
-  fourdeva: 0x096A,
-  fourgujarati: 0x0AEA,
-  fourgurmukhi: 0x0A6A,
-  fourhackarabic: 0x0664,
-  fourhangzhou: 0x3024,
-  fourideographicparen: 0x3223,
-  fourinferior: 0x2084,
-  fourmonospace: 0xFF14,
-  fournumeratorbengali: 0x09F7,
-  fouroldstyle: 0xF734,
-  fourparen: 0x2477,
-  fourperiod: 0x248B,
-  fourpersian: 0x06F4,
-  fourroman: 0x2173,
-  foursuperior: 0x2074,
-  fourteencircle: 0x246D,
-  fourteenparen: 0x2481,
-  fourteenperiod: 0x2495,
-  fourthai: 0x0E54,
-  fourthtonechinese: 0x02CB,
-  fparen: 0x24A1,
-  fraction: 0x2044,
-  franc: 0x20A3,
-  g: 0x0067,
-  gabengali: 0x0997,
-  gacute: 0x01F5,
-  gadeva: 0x0917,
-  gafarabic: 0x06AF,
-  gaffinalarabic: 0xFB93,
-  gafinitialarabic: 0xFB94,
-  gafmedialarabic: 0xFB95,
-  gagujarati: 0x0A97,
-  gagurmukhi: 0x0A17,
-  gahiragana: 0x304C,
-  gakatakana: 0x30AC,
-  gamma: 0x03B3,
-  gammalatinsmall: 0x0263,
-  gammasuperior: 0x02E0,
-  gangiacoptic: 0x03EB,
-  gbopomofo: 0x310D,
-  gbreve: 0x011F,
-  gcaron: 0x01E7,
-  gcedilla: 0x0123,
-  gcircle: 0x24D6,
-  gcircumflex: 0x011D,
-  gcommaaccent: 0x0123,
-  gdot: 0x0121,
-  gdotaccent: 0x0121,
-  gecyrillic: 0x0433,
-  gehiragana: 0x3052,
-  gekatakana: 0x30B2,
-  geometricallyequal: 0x2251,
-  gereshaccenthebrew: 0x059C,
-  gereshhebrew: 0x05F3,
-  gereshmuqdamhebrew: 0x059D,
-  germandbls: 0x00DF,
-  gershayimaccenthebrew: 0x059E,
-  gershayimhebrew: 0x05F4,
-  getamark: 0x3013,
-  ghabengali: 0x0998,
-  ghadarmenian: 0x0572,
-  ghadeva: 0x0918,
-  ghagujarati: 0x0A98,
-  ghagurmukhi: 0x0A18,
-  ghainarabic: 0x063A,
-  ghainfinalarabic: 0xFECE,
-  ghaininitialarabic: 0xFECF,
-  ghainmedialarabic: 0xFED0,
-  ghemiddlehookcyrillic: 0x0495,
-  ghestrokecyrillic: 0x0493,
-  gheupturncyrillic: 0x0491,
-  ghhadeva: 0x095A,
-  ghhagurmukhi: 0x0A5A,
-  ghook: 0x0260,
-  ghzsquare: 0x3393,
-  gihiragana: 0x304E,
-  gikatakana: 0x30AE,
-  gimarmenian: 0x0563,
-  gimel: 0x05D2,
-  gimeldagesh: 0xFB32,
-  gimeldageshhebrew: 0xFB32,
-  gimelhebrew: 0x05D2,
-  gjecyrillic: 0x0453,
-  glottalinvertedstroke: 0x01BE,
-  glottalstop: 0x0294,
-  glottalstopinverted: 0x0296,
-  glottalstopmod: 0x02C0,
-  glottalstopreversed: 0x0295,
-  glottalstopreversedmod: 0x02C1,
-  glottalstopreversedsuperior: 0x02E4,
-  glottalstopstroke: 0x02A1,
-  glottalstopstrokereversed: 0x02A2,
-  gmacron: 0x1E21,
-  gmonospace: 0xFF47,
-  gohiragana: 0x3054,
-  gokatakana: 0x30B4,
-  gparen: 0x24A2,
-  gpasquare: 0x33AC,
-  gradient: 0x2207,
-  grave: 0x0060,
-  gravebelowcmb: 0x0316,
-  gravecmb: 0x0300,
-  gravecomb: 0x0300,
-  gravedeva: 0x0953,
-  gravelowmod: 0x02CE,
-  gravemonospace: 0xFF40,
-  gravetonecmb: 0x0340,
-  greater: 0x003E,
-  greaterequal: 0x2265,
-  greaterequalorless: 0x22DB,
-  greatermonospace: 0xFF1E,
-  greaterorequivalent: 0x2273,
-  greaterorless: 0x2277,
-  greateroverequal: 0x2267,
-  greatersmall: 0xFE65,
-  gscript: 0x0261,
-  gstroke: 0x01E5,
-  guhiragana: 0x3050,
-  guillemotleft: 0x00AB,
-  guillemotright: 0x00BB,
-  guilsinglleft: 0x2039,
-  guilsinglright: 0x203A,
-  gukatakana: 0x30B0,
-  guramusquare: 0x3318,
-  gysquare: 0x33C9,
-  h: 0x0068,
-  haabkhasiancyrillic: 0x04A9,
-  haaltonearabic: 0x06C1,
-  habengali: 0x09B9,
-  hadescendercyrillic: 0x04B3,
-  hadeva: 0x0939,
-  hagujarati: 0x0AB9,
-  hagurmukhi: 0x0A39,
-  haharabic: 0x062D,
-  hahfinalarabic: 0xFEA2,
-  hahinitialarabic: 0xFEA3,
-  hahiragana: 0x306F,
-  hahmedialarabic: 0xFEA4,
-  haitusquare: 0x332A,
-  hakatakana: 0x30CF,
-  hakatakanahalfwidth: 0xFF8A,
-  halantgurmukhi: 0x0A4D,
-  hamzaarabic: 0x0621,
-  hamzalowarabic: 0x0621,
-  hangulfiller: 0x3164,
-  hardsigncyrillic: 0x044A,
-  harpoonleftbarbup: 0x21BC,
-  harpoonrightbarbup: 0x21C0,
-  hasquare: 0x33CA,
-  hatafpatah: 0x05B2,
-  hatafpatah16: 0x05B2,
-  hatafpatah23: 0x05B2,
-  hatafpatah2f: 0x05B2,
-  hatafpatahhebrew: 0x05B2,
-  hatafpatahnarrowhebrew: 0x05B2,
-  hatafpatahquarterhebrew: 0x05B2,
-  hatafpatahwidehebrew: 0x05B2,
-  hatafqamats: 0x05B3,
-  hatafqamats1b: 0x05B3,
-  hatafqamats28: 0x05B3,
-  hatafqamats34: 0x05B3,
-  hatafqamatshebrew: 0x05B3,
-  hatafqamatsnarrowhebrew: 0x05B3,
-  hatafqamatsquarterhebrew: 0x05B3,
-  hatafqamatswidehebrew: 0x05B3,
-  hatafsegol: 0x05B1,
-  hatafsegol17: 0x05B1,
-  hatafsegol24: 0x05B1,
-  hatafsegol30: 0x05B1,
-  hatafsegolhebrew: 0x05B1,
-  hatafsegolnarrowhebrew: 0x05B1,
-  hatafsegolquarterhebrew: 0x05B1,
-  hatafsegolwidehebrew: 0x05B1,
-  hbar: 0x0127,
-  hbopomofo: 0x310F,
-  hbrevebelow: 0x1E2B,
-  hcedilla: 0x1E29,
-  hcircle: 0x24D7,
-  hcircumflex: 0x0125,
-  hdieresis: 0x1E27,
-  hdotaccent: 0x1E23,
-  hdotbelow: 0x1E25,
-  he: 0x05D4,
-  heart: 0x2665,
-  heartsuitblack: 0x2665,
-  heartsuitwhite: 0x2661,
-  hedagesh: 0xFB34,
-  hedageshhebrew: 0xFB34,
-  hehaltonearabic: 0x06C1,
-  heharabic: 0x0647,
-  hehebrew: 0x05D4,
-  hehfinalaltonearabic: 0xFBA7,
-  hehfinalalttwoarabic: 0xFEEA,
-  hehfinalarabic: 0xFEEA,
-  hehhamzaabovefinalarabic: 0xFBA5,
-  hehhamzaaboveisolatedarabic: 0xFBA4,
-  hehinitialaltonearabic: 0xFBA8,
-  hehinitialarabic: 0xFEEB,
-  hehiragana: 0x3078,
-  hehmedialaltonearabic: 0xFBA9,
-  hehmedialarabic: 0xFEEC,
-  heiseierasquare: 0x337B,
-  hekatakana: 0x30D8,
-  hekatakanahalfwidth: 0xFF8D,
-  hekutaarusquare: 0x3336,
-  henghook: 0x0267,
-  herutusquare: 0x3339,
-  het: 0x05D7,
-  hethebrew: 0x05D7,
-  hhook: 0x0266,
-  hhooksuperior: 0x02B1,
-  hieuhacirclekorean: 0x327B,
-  hieuhaparenkorean: 0x321B,
-  hieuhcirclekorean: 0x326D,
-  hieuhkorean: 0x314E,
-  hieuhparenkorean: 0x320D,
-  hihiragana: 0x3072,
-  hikatakana: 0x30D2,
-  hikatakanahalfwidth: 0xFF8B,
-  hiriq: 0x05B4,
-  hiriq14: 0x05B4,
-  hiriq21: 0x05B4,
-  hiriq2d: 0x05B4,
-  hiriqhebrew: 0x05B4,
-  hiriqnarrowhebrew: 0x05B4,
-  hiriqquarterhebrew: 0x05B4,
-  hiriqwidehebrew: 0x05B4,
-  hlinebelow: 0x1E96,
-  hmonospace: 0xFF48,
-  hoarmenian: 0x0570,
-  hohipthai: 0x0E2B,
-  hohiragana: 0x307B,
-  hokatakana: 0x30DB,
-  hokatakanahalfwidth: 0xFF8E,
-  holam: 0x05B9,
-  holam19: 0x05B9,
-  holam26: 0x05B9,
-  holam32: 0x05B9,
-  holamhebrew: 0x05B9,
-  holamnarrowhebrew: 0x05B9,
-  holamquarterhebrew: 0x05B9,
-  holamwidehebrew: 0x05B9,
-  honokhukthai: 0x0E2E,
-  hookabovecomb: 0x0309,
-  hookcmb: 0x0309,
-  hookpalatalizedbelowcmb: 0x0321,
-  hookretroflexbelowcmb: 0x0322,
-  hoonsquare: 0x3342,
-  horicoptic: 0x03E9,
-  horizontalbar: 0x2015,
-  horncmb: 0x031B,
-  hotsprings: 0x2668,
-  house: 0x2302,
-  hparen: 0x24A3,
-  hsuperior: 0x02B0,
-  hturned: 0x0265,
-  huhiragana: 0x3075,
-  huiitosquare: 0x3333,
-  hukatakana: 0x30D5,
-  hukatakanahalfwidth: 0xFF8C,
-  hungarumlaut: 0x02DD,
-  hungarumlautcmb: 0x030B,
-  hv: 0x0195,
-  hyphen: 0x002D,
-  hypheninferior: 0xF6E5,
-  hyphenmonospace: 0xFF0D,
-  hyphensmall: 0xFE63,
-  hyphensuperior: 0xF6E6,
-  hyphentwo: 0x2010,
-  i: 0x0069,
-  iacute: 0x00ED,
-  iacyrillic: 0x044F,
-  ibengali: 0x0987,
-  ibopomofo: 0x3127,
-  ibreve: 0x012D,
-  icaron: 0x01D0,
-  icircle: 0x24D8,
-  icircumflex: 0x00EE,
-  icyrillic: 0x0456,
-  idblgrave: 0x0209,
-  ideographearthcircle: 0x328F,
-  ideographfirecircle: 0x328B,
-  ideographicallianceparen: 0x323F,
-  ideographiccallparen: 0x323A,
-  ideographiccentrecircle: 0x32A5,
-  ideographicclose: 0x3006,
-  ideographiccomma: 0x3001,
-  ideographiccommaleft: 0xFF64,
-  ideographiccongratulationparen: 0x3237,
-  ideographiccorrectcircle: 0x32A3,
-  ideographicearthparen: 0x322F,
-  ideographicenterpriseparen: 0x323D,
-  ideographicexcellentcircle: 0x329D,
-  ideographicfestivalparen: 0x3240,
-  ideographicfinancialcircle: 0x3296,
-  ideographicfinancialparen: 0x3236,
-  ideographicfireparen: 0x322B,
-  ideographichaveparen: 0x3232,
-  ideographichighcircle: 0x32A4,
-  ideographiciterationmark: 0x3005,
-  ideographiclaborcircle: 0x3298,
-  ideographiclaborparen: 0x3238,
-  ideographicleftcircle: 0x32A7,
-  ideographiclowcircle: 0x32A6,
-  ideographicmedicinecircle: 0x32A9,
-  ideographicmetalparen: 0x322E,
-  ideographicmoonparen: 0x322A,
-  ideographicnameparen: 0x3234,
-  ideographicperiod: 0x3002,
-  ideographicprintcircle: 0x329E,
-  ideographicreachparen: 0x3243,
-  ideographicrepresentparen: 0x3239,
-  ideographicresourceparen: 0x323E,
-  ideographicrightcircle: 0x32A8,
-  ideographicsecretcircle: 0x3299,
-  ideographicselfparen: 0x3242,
-  ideographicsocietyparen: 0x3233,
-  ideographicspace: 0x3000,
-  ideographicspecialparen: 0x3235,
-  ideographicstockparen: 0x3231,
-  ideographicstudyparen: 0x323B,
-  ideographicsunparen: 0x3230,
-  ideographicsuperviseparen: 0x323C,
-  ideographicwaterparen: 0x322C,
-  ideographicwoodparen: 0x322D,
-  ideographiczero: 0x3007,
-  ideographmetalcircle: 0x328E,
-  ideographmooncircle: 0x328A,
-  ideographnamecircle: 0x3294,
-  ideographsuncircle: 0x3290,
-  ideographwatercircle: 0x328C,
-  ideographwoodcircle: 0x328D,
-  ideva: 0x0907,
-  idieresis: 0x00EF,
-  idieresisacute: 0x1E2F,
-  idieresiscyrillic: 0x04E5,
-  idotbelow: 0x1ECB,
-  iebrevecyrillic: 0x04D7,
-  iecyrillic: 0x0435,
-  ieungacirclekorean: 0x3275,
-  ieungaparenkorean: 0x3215,
-  ieungcirclekorean: 0x3267,
-  ieungkorean: 0x3147,
-  ieungparenkorean: 0x3207,
-  igrave: 0x00EC,
-  igujarati: 0x0A87,
-  igurmukhi: 0x0A07,
-  ihiragana: 0x3044,
-  ihookabove: 0x1EC9,
-  iibengali: 0x0988,
-  iicyrillic: 0x0438,
-  iideva: 0x0908,
-  iigujarati: 0x0A88,
-  iigurmukhi: 0x0A08,
-  iimatragurmukhi: 0x0A40,
-  iinvertedbreve: 0x020B,
-  iishortcyrillic: 0x0439,
-  iivowelsignbengali: 0x09C0,
-  iivowelsigndeva: 0x0940,
-  iivowelsigngujarati: 0x0AC0,
-  ij: 0x0133,
-  ikatakana: 0x30A4,
-  ikatakanahalfwidth: 0xFF72,
-  ikorean: 0x3163,
-  ilde: 0x02DC,
-  iluyhebrew: 0x05AC,
-  imacron: 0x012B,
-  imacroncyrillic: 0x04E3,
-  imageorapproximatelyequal: 0x2253,
-  imatragurmukhi: 0x0A3F,
-  imonospace: 0xFF49,
-  increment: 0x2206,
-  infinity: 0x221E,
-  iniarmenian: 0x056B,
-  integral: 0x222B,
-  integralbottom: 0x2321,
-  integralbt: 0x2321,
-  integralex: 0xF8F5,
-  integraltop: 0x2320,
-  integraltp: 0x2320,
-  intersection: 0x2229,
-  intisquare: 0x3305,
-  invbullet: 0x25D8,
-  invcircle: 0x25D9,
-  invsmileface: 0x263B,
-  iocyrillic: 0x0451,
-  iogonek: 0x012F,
-  iota: 0x03B9,
-  iotadieresis: 0x03CA,
-  iotadieresistonos: 0x0390,
-  iotalatin: 0x0269,
-  iotatonos: 0x03AF,
-  iparen: 0x24A4,
-  irigurmukhi: 0x0A72,
-  ismallhiragana: 0x3043,
-  ismallkatakana: 0x30A3,
-  ismallkatakanahalfwidth: 0xFF68,
-  issharbengali: 0x09FA,
-  istroke: 0x0268,
-  isuperior: 0xF6ED,
-  iterationhiragana: 0x309D,
-  iterationkatakana: 0x30FD,
-  itilde: 0x0129,
-  itildebelow: 0x1E2D,
-  iubopomofo: 0x3129,
-  iucyrillic: 0x044E,
-  ivowelsignbengali: 0x09BF,
-  ivowelsigndeva: 0x093F,
-  ivowelsigngujarati: 0x0ABF,
-  izhitsacyrillic: 0x0475,
-  izhitsadblgravecyrillic: 0x0477,
-  j: 0x006A,
-  jaarmenian: 0x0571,
-  jabengali: 0x099C,
-  jadeva: 0x091C,
-  jagujarati: 0x0A9C,
-  jagurmukhi: 0x0A1C,
-  jbopomofo: 0x3110,
-  jcaron: 0x01F0,
-  jcircle: 0x24D9,
-  jcircumflex: 0x0135,
-  jcrossedtail: 0x029D,
-  jdotlessstroke: 0x025F,
-  jecyrillic: 0x0458,
-  jeemarabic: 0x062C,
-  jeemfinalarabic: 0xFE9E,
-  jeeminitialarabic: 0xFE9F,
-  jeemmedialarabic: 0xFEA0,
-  jeharabic: 0x0698,
-  jehfinalarabic: 0xFB8B,
-  jhabengali: 0x099D,
-  jhadeva: 0x091D,
-  jhagujarati: 0x0A9D,
-  jhagurmukhi: 0x0A1D,
-  jheharmenian: 0x057B,
-  jis: 0x3004,
-  jmonospace: 0xFF4A,
-  jparen: 0x24A5,
-  jsuperior: 0x02B2,
-  k: 0x006B,
-  kabashkircyrillic: 0x04A1,
-  kabengali: 0x0995,
-  kacute: 0x1E31,
-  kacyrillic: 0x043A,
-  kadescendercyrillic: 0x049B,
-  kadeva: 0x0915,
-  kaf: 0x05DB,
-  kafarabic: 0x0643,
-  kafdagesh: 0xFB3B,
-  kafdageshhebrew: 0xFB3B,
-  kaffinalarabic: 0xFEDA,
-  kafhebrew: 0x05DB,
-  kafinitialarabic: 0xFEDB,
-  kafmedialarabic: 0xFEDC,
-  kafrafehebrew: 0xFB4D,
-  kagujarati: 0x0A95,
-  kagurmukhi: 0x0A15,
-  kahiragana: 0x304B,
-  kahookcyrillic: 0x04C4,
-  kakatakana: 0x30AB,
-  kakatakanahalfwidth: 0xFF76,
-  kappa: 0x03BA,
-  kappasymbolgreek: 0x03F0,
-  kapyeounmieumkorean: 0x3171,
-  kapyeounphieuphkorean: 0x3184,
-  kapyeounpieupkorean: 0x3178,
-  kapyeounssangpieupkorean: 0x3179,
-  karoriisquare: 0x330D,
-  kashidaautoarabic: 0x0640,
-  kashidaautonosidebearingarabic: 0x0640,
-  kasmallkatakana: 0x30F5,
-  kasquare: 0x3384,
-  kasraarabic: 0x0650,
-  kasratanarabic: 0x064D,
-  kastrokecyrillic: 0x049F,
-  katahiraprolongmarkhalfwidth: 0xFF70,
-  kaverticalstrokecyrillic: 0x049D,
-  kbopomofo: 0x310E,
-  kcalsquare: 0x3389,
-  kcaron: 0x01E9,
-  kcedilla: 0x0137,
-  kcircle: 0x24DA,
-  kcommaaccent: 0x0137,
-  kdotbelow: 0x1E33,
-  keharmenian: 0x0584,
-  kehiragana: 0x3051,
-  kekatakana: 0x30B1,
-  kekatakanahalfwidth: 0xFF79,
-  kenarmenian: 0x056F,
-  kesmallkatakana: 0x30F6,
-  kgreenlandic: 0x0138,
-  khabengali: 0x0996,
-  khacyrillic: 0x0445,
-  khadeva: 0x0916,
-  khagujarati: 0x0A96,
-  khagurmukhi: 0x0A16,
-  khaharabic: 0x062E,
-  khahfinalarabic: 0xFEA6,
-  khahinitialarabic: 0xFEA7,
-  khahmedialarabic: 0xFEA8,
-  kheicoptic: 0x03E7,
-  khhadeva: 0x0959,
-  khhagurmukhi: 0x0A59,
-  khieukhacirclekorean: 0x3278,
-  khieukhaparenkorean: 0x3218,
-  khieukhcirclekorean: 0x326A,
-  khieukhkorean: 0x314B,
-  khieukhparenkorean: 0x320A,
-  khokhaithai: 0x0E02,
-  khokhonthai: 0x0E05,
-  khokhuatthai: 0x0E03,
-  khokhwaithai: 0x0E04,
-  khomutthai: 0x0E5B,
-  khook: 0x0199,
-  khorakhangthai: 0x0E06,
-  khzsquare: 0x3391,
-  kihiragana: 0x304D,
-  kikatakana: 0x30AD,
-  kikatakanahalfwidth: 0xFF77,
-  kiroguramusquare: 0x3315,
-  kiromeetorusquare: 0x3316,
-  kirosquare: 0x3314,
-  kiyeokacirclekorean: 0x326E,
-  kiyeokaparenkorean: 0x320E,
-  kiyeokcirclekorean: 0x3260,
-  kiyeokkorean: 0x3131,
-  kiyeokparenkorean: 0x3200,
-  kiyeoksioskorean: 0x3133,
-  kjecyrillic: 0x045C,
-  klinebelow: 0x1E35,
-  klsquare: 0x3398,
-  kmcubedsquare: 0x33A6,
-  kmonospace: 0xFF4B,
-  kmsquaredsquare: 0x33A2,
-  kohiragana: 0x3053,
-  kohmsquare: 0x33C0,
-  kokaithai: 0x0E01,
-  kokatakana: 0x30B3,
-  kokatakanahalfwidth: 0xFF7A,
-  kooposquare: 0x331E,
-  koppacyrillic: 0x0481,
-  koreanstandardsymbol: 0x327F,
-  koroniscmb: 0x0343,
-  kparen: 0x24A6,
-  kpasquare: 0x33AA,
-  ksicyrillic: 0x046F,
-  ktsquare: 0x33CF,
-  kturned: 0x029E,
-  kuhiragana: 0x304F,
-  kukatakana: 0x30AF,
-  kukatakanahalfwidth: 0xFF78,
-  kvsquare: 0x33B8,
-  kwsquare: 0x33BE,
-  l: 0x006C,
-  labengali: 0x09B2,
-  lacute: 0x013A,
-  ladeva: 0x0932,
-  lagujarati: 0x0AB2,
-  lagurmukhi: 0x0A32,
-  lakkhangyaothai: 0x0E45,
-  lamaleffinalarabic: 0xFEFC,
-  lamalefhamzaabovefinalarabic: 0xFEF8,
-  lamalefhamzaaboveisolatedarabic: 0xFEF7,
-  lamalefhamzabelowfinalarabic: 0xFEFA,
-  lamalefhamzabelowisolatedarabic: 0xFEF9,
-  lamalefisolatedarabic: 0xFEFB,
-  lamalefmaddaabovefinalarabic: 0xFEF6,
-  lamalefmaddaaboveisolatedarabic: 0xFEF5,
-  lamarabic: 0x0644,
-  lambda: 0x03BB,
-  lambdastroke: 0x019B,
-  lamed: 0x05DC,
-  lameddagesh: 0xFB3C,
-  lameddageshhebrew: 0xFB3C,
-  lamedhebrew: 0x05DC,
-  lamfinalarabic: 0xFEDE,
-  lamhahinitialarabic: 0xFCCA,
-  laminitialarabic: 0xFEDF,
-  lamjeeminitialarabic: 0xFCC9,
-  lamkhahinitialarabic: 0xFCCB,
-  lamlamhehisolatedarabic: 0xFDF2,
-  lammedialarabic: 0xFEE0,
-  lammeemhahinitialarabic: 0xFD88,
-  lammeeminitialarabic: 0xFCCC,
-  largecircle: 0x25EF,
-  lbar: 0x019A,
-  lbelt: 0x026C,
-  lbopomofo: 0x310C,
-  lcaron: 0x013E,
-  lcedilla: 0x013C,
-  lcircle: 0x24DB,
-  lcircumflexbelow: 0x1E3D,
-  lcommaaccent: 0x013C,
-  ldot: 0x0140,
-  ldotaccent: 0x0140,
-  ldotbelow: 0x1E37,
-  ldotbelowmacron: 0x1E39,
-  leftangleabovecmb: 0x031A,
-  lefttackbelowcmb: 0x0318,
-  less: 0x003C,
-  lessequal: 0x2264,
-  lessequalorgreater: 0x22DA,
-  lessmonospace: 0xFF1C,
-  lessorequivalent: 0x2272,
-  lessorgreater: 0x2276,
-  lessoverequal: 0x2266,
-  lesssmall: 0xFE64,
-  lezh: 0x026E,
-  lfblock: 0x258C,
-  lhookretroflex: 0x026D,
-  lira: 0x20A4,
-  liwnarmenian: 0x056C,
-  lj: 0x01C9,
-  ljecyrillic: 0x0459,
-  ll: 0xF6C0,
-  lladeva: 0x0933,
-  llagujarati: 0x0AB3,
-  llinebelow: 0x1E3B,
-  llladeva: 0x0934,
-  llvocalicbengali: 0x09E1,
-  llvocalicdeva: 0x0961,
-  llvocalicvowelsignbengali: 0x09E3,
-  llvocalicvowelsigndeva: 0x0963,
-  lmiddletilde: 0x026B,
-  lmonospace: 0xFF4C,
-  lmsquare: 0x33D0,
-  lochulathai: 0x0E2C,
-  logicaland: 0x2227,
-  logicalnot: 0x00AC,
-  logicalnotreversed: 0x2310,
-  logicalor: 0x2228,
-  lolingthai: 0x0E25,
-  longs: 0x017F,
-  lowlinecenterline: 0xFE4E,
-  lowlinecmb: 0x0332,
-  lowlinedashed: 0xFE4D,
-  lozenge: 0x25CA,
-  lparen: 0x24A7,
-  lslash: 0x0142,
-  lsquare: 0x2113,
-  lsuperior: 0xF6EE,
-  ltshade: 0x2591,
-  luthai: 0x0E26,
-  lvocalicbengali: 0x098C,
-  lvocalicdeva: 0x090C,
-  lvocalicvowelsignbengali: 0x09E2,
-  lvocalicvowelsigndeva: 0x0962,
-  lxsquare: 0x33D3,
-  m: 0x006D,
-  mabengali: 0x09AE,
-  macron: 0x00AF,
-  macronbelowcmb: 0x0331,
-  macroncmb: 0x0304,
-  macronlowmod: 0x02CD,
-  macronmonospace: 0xFFE3,
-  macute: 0x1E3F,
-  madeva: 0x092E,
-  magujarati: 0x0AAE,
-  magurmukhi: 0x0A2E,
-  mahapakhhebrew: 0x05A4,
-  mahapakhlefthebrew: 0x05A4,
-  mahiragana: 0x307E,
-  maichattawalowleftthai: 0xF895,
-  maichattawalowrightthai: 0xF894,
-  maichattawathai: 0x0E4B,
-  maichattawaupperleftthai: 0xF893,
-  maieklowleftthai: 0xF88C,
-  maieklowrightthai: 0xF88B,
-  maiekthai: 0x0E48,
-  maiekupperleftthai: 0xF88A,
-  maihanakatleftthai: 0xF884,
-  maihanakatthai: 0x0E31,
-  maitaikhuleftthai: 0xF889,
-  maitaikhuthai: 0x0E47,
-  maitholowleftthai: 0xF88F,
-  maitholowrightthai: 0xF88E,
-  maithothai: 0x0E49,
-  maithoupperleftthai: 0xF88D,
-  maitrilowleftthai: 0xF892,
-  maitrilowrightthai: 0xF891,
-  maitrithai: 0x0E4A,
-  maitriupperleftthai: 0xF890,
-  maiyamokthai: 0x0E46,
-  makatakana: 0x30DE,
-  makatakanahalfwidth: 0xFF8F,
-  male: 0x2642,
-  mansyonsquare: 0x3347,
-  maqafhebrew: 0x05BE,
-  mars: 0x2642,
-  masoracirclehebrew: 0x05AF,
-  masquare: 0x3383,
-  mbopomofo: 0x3107,
-  mbsquare: 0x33D4,
-  mcircle: 0x24DC,
-  mcubedsquare: 0x33A5,
-  mdotaccent: 0x1E41,
-  mdotbelow: 0x1E43,
-  meemarabic: 0x0645,
-  meemfinalarabic: 0xFEE2,
-  meeminitialarabic: 0xFEE3,
-  meemmedialarabic: 0xFEE4,
-  meemmeeminitialarabic: 0xFCD1,
-  meemmeemisolatedarabic: 0xFC48,
-  meetorusquare: 0x334D,
-  mehiragana: 0x3081,
-  meizierasquare: 0x337E,
-  mekatakana: 0x30E1,
-  mekatakanahalfwidth: 0xFF92,
-  mem: 0x05DE,
-  memdagesh: 0xFB3E,
-  memdageshhebrew: 0xFB3E,
-  memhebrew: 0x05DE,
-  menarmenian: 0x0574,
-  merkhahebrew: 0x05A5,
-  merkhakefulahebrew: 0x05A6,
-  merkhakefulalefthebrew: 0x05A6,
-  merkhalefthebrew: 0x05A5,
-  mhook: 0x0271,
-  mhzsquare: 0x3392,
-  middledotkatakanahalfwidth: 0xFF65,
-  middot: 0x00B7,
-  mieumacirclekorean: 0x3272,
-  mieumaparenkorean: 0x3212,
-  mieumcirclekorean: 0x3264,
-  mieumkorean: 0x3141,
-  mieumpansioskorean: 0x3170,
-  mieumparenkorean: 0x3204,
-  mieumpieupkorean: 0x316E,
-  mieumsioskorean: 0x316F,
-  mihiragana: 0x307F,
-  mikatakana: 0x30DF,
-  mikatakanahalfwidth: 0xFF90,
-  minus: 0x2212,
-  minusbelowcmb: 0x0320,
-  minuscircle: 0x2296,
-  minusmod: 0x02D7,
-  minusplus: 0x2213,
-  minute: 0x2032,
-  miribaarusquare: 0x334A,
-  mirisquare: 0x3349,
-  mlonglegturned: 0x0270,
-  mlsquare: 0x3396,
-  mmcubedsquare: 0x33A3,
-  mmonospace: 0xFF4D,
-  mmsquaredsquare: 0x339F,
-  mohiragana: 0x3082,
-  mohmsquare: 0x33C1,
-  mokatakana: 0x30E2,
-  mokatakanahalfwidth: 0xFF93,
-  molsquare: 0x33D6,
-  momathai: 0x0E21,
-  moverssquare: 0x33A7,
-  moverssquaredsquare: 0x33A8,
-  mparen: 0x24A8,
-  mpasquare: 0x33AB,
-  mssquare: 0x33B3,
-  msuperior: 0xF6EF,
-  mturned: 0x026F,
-  mu: 0x00B5,
-  mu1: 0x00B5,
-  muasquare: 0x3382,
-  muchgreater: 0x226B,
-  muchless: 0x226A,
-  mufsquare: 0x338C,
-  mugreek: 0x03BC,
-  mugsquare: 0x338D,
-  muhiragana: 0x3080,
-  mukatakana: 0x30E0,
-  mukatakanahalfwidth: 0xFF91,
-  mulsquare: 0x3395,
-  multiply: 0x00D7,
-  mumsquare: 0x339B,
-  munahhebrew: 0x05A3,
-  munahlefthebrew: 0x05A3,
-  musicalnote: 0x266A,
-  musicalnotedbl: 0x266B,
-  musicflatsign: 0x266D,
-  musicsharpsign: 0x266F,
-  mussquare: 0x33B2,
-  muvsquare: 0x33B6,
-  muwsquare: 0x33BC,
-  mvmegasquare: 0x33B9,
-  mvsquare: 0x33B7,
-  mwmegasquare: 0x33BF,
-  mwsquare: 0x33BD,
-  n: 0x006E,
-  nabengali: 0x09A8,
-  nabla: 0x2207,
-  nacute: 0x0144,
-  nadeva: 0x0928,
-  nagujarati: 0x0AA8,
-  nagurmukhi: 0x0A28,
-  nahiragana: 0x306A,
-  nakatakana: 0x30CA,
-  nakatakanahalfwidth: 0xFF85,
-  napostrophe: 0x0149,
-  nasquare: 0x3381,
-  nbopomofo: 0x310B,
-  nbspace: 0x00A0,
-  ncaron: 0x0148,
-  ncedilla: 0x0146,
-  ncircle: 0x24DD,
-  ncircumflexbelow: 0x1E4B,
-  ncommaaccent: 0x0146,
-  ndotaccent: 0x1E45,
-  ndotbelow: 0x1E47,
-  nehiragana: 0x306D,
-  nekatakana: 0x30CD,
-  nekatakanahalfwidth: 0xFF88,
-  newsheqelsign: 0x20AA,
-  nfsquare: 0x338B,
-  ngabengali: 0x0999,
-  ngadeva: 0x0919,
-  ngagujarati: 0x0A99,
-  ngagurmukhi: 0x0A19,
-  ngonguthai: 0x0E07,
-  nhiragana: 0x3093,
-  nhookleft: 0x0272,
-  nhookretroflex: 0x0273,
-  nieunacirclekorean: 0x326F,
-  nieunaparenkorean: 0x320F,
-  nieuncieuckorean: 0x3135,
-  nieuncirclekorean: 0x3261,
-  nieunhieuhkorean: 0x3136,
-  nieunkorean: 0x3134,
-  nieunpansioskorean: 0x3168,
-  nieunparenkorean: 0x3201,
-  nieunsioskorean: 0x3167,
-  nieuntikeutkorean: 0x3166,
-  nihiragana: 0x306B,
-  nikatakana: 0x30CB,
-  nikatakanahalfwidth: 0xFF86,
-  nikhahitleftthai: 0xF899,
-  nikhahitthai: 0x0E4D,
-  nine: 0x0039,
-  ninearabic: 0x0669,
-  ninebengali: 0x09EF,
-  ninecircle: 0x2468,
-  ninecircleinversesansserif: 0x2792,
-  ninedeva: 0x096F,
-  ninegujarati: 0x0AEF,
-  ninegurmukhi: 0x0A6F,
-  ninehackarabic: 0x0669,
-  ninehangzhou: 0x3029,
-  nineideographicparen: 0x3228,
-  nineinferior: 0x2089,
-  ninemonospace: 0xFF19,
-  nineoldstyle: 0xF739,
-  nineparen: 0x247C,
-  nineperiod: 0x2490,
-  ninepersian: 0x06F9,
-  nineroman: 0x2178,
-  ninesuperior: 0x2079,
-  nineteencircle: 0x2472,
-  nineteenparen: 0x2486,
-  nineteenperiod: 0x249A,
-  ninethai: 0x0E59,
-  nj: 0x01CC,
-  njecyrillic: 0x045A,
-  nkatakana: 0x30F3,
-  nkatakanahalfwidth: 0xFF9D,
-  nlegrightlong: 0x019E,
-  nlinebelow: 0x1E49,
-  nmonospace: 0xFF4E,
-  nmsquare: 0x339A,
-  nnabengali: 0x09A3,
-  nnadeva: 0x0923,
-  nnagujarati: 0x0AA3,
-  nnagurmukhi: 0x0A23,
-  nnnadeva: 0x0929,
-  nohiragana: 0x306E,
-  nokatakana: 0x30CE,
-  nokatakanahalfwidth: 0xFF89,
-  nonbreakingspace: 0x00A0,
-  nonenthai: 0x0E13,
-  nonuthai: 0x0E19,
-  noonarabic: 0x0646,
-  noonfinalarabic: 0xFEE6,
-  noonghunnaarabic: 0x06BA,
-  noonghunnafinalarabic: 0xFB9F,
-  nooninitialarabic: 0xFEE7,
-  noonjeeminitialarabic: 0xFCD2,
-  noonjeemisolatedarabic: 0xFC4B,
-  noonmedialarabic: 0xFEE8,
-  noonmeeminitialarabic: 0xFCD5,
-  noonmeemisolatedarabic: 0xFC4E,
-  noonnoonfinalarabic: 0xFC8D,
-  notcontains: 0x220C,
-  notelement: 0x2209,
-  notelementof: 0x2209,
-  notequal: 0x2260,
-  notgreater: 0x226F,
-  notgreaternorequal: 0x2271,
-  notgreaternorless: 0x2279,
-  notidentical: 0x2262,
-  notless: 0x226E,
-  notlessnorequal: 0x2270,
-  notparallel: 0x2226,
-  notprecedes: 0x2280,
-  notsubset: 0x2284,
-  notsucceeds: 0x2281,
-  notsuperset: 0x2285,
-  nowarmenian: 0x0576,
-  nparen: 0x24A9,
-  nssquare: 0x33B1,
-  nsuperior: 0x207F,
-  ntilde: 0x00F1,
-  nu: 0x03BD,
-  nuhiragana: 0x306C,
-  nukatakana: 0x30CC,
-  nukatakanahalfwidth: 0xFF87,
-  nuktabengali: 0x09BC,
-  nuktadeva: 0x093C,
-  nuktagujarati: 0x0ABC,
-  nuktagurmukhi: 0x0A3C,
-  numbersign: 0x0023,
-  numbersignmonospace: 0xFF03,
-  numbersignsmall: 0xFE5F,
-  numeralsigngreek: 0x0374,
-  numeralsignlowergreek: 0x0375,
-  numero: 0x2116,
-  nun: 0x05E0,
-  nundagesh: 0xFB40,
-  nundageshhebrew: 0xFB40,
-  nunhebrew: 0x05E0,
-  nvsquare: 0x33B5,
-  nwsquare: 0x33BB,
-  nyabengali: 0x099E,
-  nyadeva: 0x091E,
-  nyagujarati: 0x0A9E,
-  nyagurmukhi: 0x0A1E,
-  o: 0x006F,
-  oacute: 0x00F3,
-  oangthai: 0x0E2D,
-  obarred: 0x0275,
-  obarredcyrillic: 0x04E9,
-  obarreddieresiscyrillic: 0x04EB,
-  obengali: 0x0993,
-  obopomofo: 0x311B,
-  obreve: 0x014F,
-  ocandradeva: 0x0911,
-  ocandragujarati: 0x0A91,
-  ocandravowelsigndeva: 0x0949,
-  ocandravowelsigngujarati: 0x0AC9,
-  ocaron: 0x01D2,
-  ocircle: 0x24DE,
-  ocircumflex: 0x00F4,
-  ocircumflexacute: 0x1ED1,
-  ocircumflexdotbelow: 0x1ED9,
-  ocircumflexgrave: 0x1ED3,
-  ocircumflexhookabove: 0x1ED5,
-  ocircumflextilde: 0x1ED7,
-  ocyrillic: 0x043E,
-  odblacute: 0x0151,
-  odblgrave: 0x020D,
-  odeva: 0x0913,
-  odieresis: 0x00F6,
-  odieresiscyrillic: 0x04E7,
-  odotbelow: 0x1ECD,
-  oe: 0x0153,
-  oekorean: 0x315A,
-  ogonek: 0x02DB,
-  ogonekcmb: 0x0328,
-  ograve: 0x00F2,
-  ogujarati: 0x0A93,
-  oharmenian: 0x0585,
-  ohiragana: 0x304A,
-  ohookabove: 0x1ECF,
-  ohorn: 0x01A1,
-  ohornacute: 0x1EDB,
-  ohorndotbelow: 0x1EE3,
-  ohorngrave: 0x1EDD,
-  ohornhookabove: 0x1EDF,
-  ohorntilde: 0x1EE1,
-  ohungarumlaut: 0x0151,
-  oi: 0x01A3,
-  oinvertedbreve: 0x020F,
-  okatakana: 0x30AA,
-  okatakanahalfwidth: 0xFF75,
-  okorean: 0x3157,
-  olehebrew: 0x05AB,
-  omacron: 0x014D,
-  omacronacute: 0x1E53,
-  omacrongrave: 0x1E51,
-  omdeva: 0x0950,
-  omega: 0x03C9,
-  omega1: 0x03D6,
-  omegacyrillic: 0x0461,
-  omegalatinclosed: 0x0277,
-  omegaroundcyrillic: 0x047B,
-  omegatitlocyrillic: 0x047D,
-  omegatonos: 0x03CE,
-  omgujarati: 0x0AD0,
-  omicron: 0x03BF,
-  omicrontonos: 0x03CC,
-  omonospace: 0xFF4F,
-  one: 0x0031,
-  onearabic: 0x0661,
-  onebengali: 0x09E7,
-  onecircle: 0x2460,
-  onecircleinversesansserif: 0x278A,
-  onedeva: 0x0967,
-  onedotenleader: 0x2024,
-  oneeighth: 0x215B,
-  onefitted: 0xF6DC,
-  onegujarati: 0x0AE7,
-  onegurmukhi: 0x0A67,
-  onehackarabic: 0x0661,
-  onehalf: 0x00BD,
-  onehangzhou: 0x3021,
-  oneideographicparen: 0x3220,
-  oneinferior: 0x2081,
-  onemonospace: 0xFF11,
-  onenumeratorbengali: 0x09F4,
-  oneoldstyle: 0xF731,
-  oneparen: 0x2474,
-  oneperiod: 0x2488,
-  onepersian: 0x06F1,
-  onequarter: 0x00BC,
-  oneroman: 0x2170,
-  onesuperior: 0x00B9,
-  onethai: 0x0E51,
-  onethird: 0x2153,
-  oogonek: 0x01EB,
-  oogonekmacron: 0x01ED,
-  oogurmukhi: 0x0A13,
-  oomatragurmukhi: 0x0A4B,
-  oopen: 0x0254,
-  oparen: 0x24AA,
-  openbullet: 0x25E6,
-  option: 0x2325,
-  ordfeminine: 0x00AA,
-  ordmasculine: 0x00BA,
-  orthogonal: 0x221F,
-  oshortdeva: 0x0912,
-  oshortvowelsigndeva: 0x094A,
-  oslash: 0x00F8,
-  oslashacute: 0x01FF,
-  osmallhiragana: 0x3049,
-  osmallkatakana: 0x30A9,
-  osmallkatakanahalfwidth: 0xFF6B,
-  ostrokeacute: 0x01FF,
-  osuperior: 0xF6F0,
-  otcyrillic: 0x047F,
-  otilde: 0x00F5,
-  otildeacute: 0x1E4D,
-  otildedieresis: 0x1E4F,
-  oubopomofo: 0x3121,
-  overline: 0x203E,
-  overlinecenterline: 0xFE4A,
-  overlinecmb: 0x0305,
-  overlinedashed: 0xFE49,
-  overlinedblwavy: 0xFE4C,
-  overlinewavy: 0xFE4B,
-  overscore: 0x00AF,
-  ovowelsignbengali: 0x09CB,
-  ovowelsigndeva: 0x094B,
-  ovowelsigngujarati: 0x0ACB,
-  p: 0x0070,
-  paampssquare: 0x3380,
-  paasentosquare: 0x332B,
-  pabengali: 0x09AA,
-  pacute: 0x1E55,
-  padeva: 0x092A,
-  pagedown: 0x21DF,
-  pageup: 0x21DE,
-  pagujarati: 0x0AAA,
-  pagurmukhi: 0x0A2A,
-  pahiragana: 0x3071,
-  paiyannoithai: 0x0E2F,
-  pakatakana: 0x30D1,
-  palatalizationcyrilliccmb: 0x0484,
-  palochkacyrillic: 0x04C0,
-  pansioskorean: 0x317F,
-  paragraph: 0x00B6,
-  parallel: 0x2225,
-  parenleft: 0x0028,
-  parenleftaltonearabic: 0xFD3E,
-  parenleftbt: 0xF8ED,
-  parenleftex: 0xF8EC,
-  parenleftinferior: 0x208D,
-  parenleftmonospace: 0xFF08,
-  parenleftsmall: 0xFE59,
-  parenleftsuperior: 0x207D,
-  parenlefttp: 0xF8EB,
-  parenleftvertical: 0xFE35,
-  parenright: 0x0029,
-  parenrightaltonearabic: 0xFD3F,
-  parenrightbt: 0xF8F8,
-  parenrightex: 0xF8F7,
-  parenrightinferior: 0x208E,
-  parenrightmonospace: 0xFF09,
-  parenrightsmall: 0xFE5A,
-  parenrightsuperior: 0x207E,
-  parenrighttp: 0xF8F6,
-  parenrightvertical: 0xFE36,
-  partialdiff: 0x2202,
-  paseqhebrew: 0x05C0,
-  pashtahebrew: 0x0599,
-  pasquare: 0x33A9,
-  patah: 0x05B7,
-  patah11: 0x05B7,
-  patah1d: 0x05B7,
-  patah2a: 0x05B7,
-  patahhebrew: 0x05B7,
-  patahnarrowhebrew: 0x05B7,
-  patahquarterhebrew: 0x05B7,
-  patahwidehebrew: 0x05B7,
-  pazerhebrew: 0x05A1,
-  pbopomofo: 0x3106,
-  pcircle: 0x24DF,
-  pdotaccent: 0x1E57,
-  pe: 0x05E4,
-  pecyrillic: 0x043F,
-  pedagesh: 0xFB44,
-  pedageshhebrew: 0xFB44,
-  peezisquare: 0x333B,
-  pefinaldageshhebrew: 0xFB43,
-  peharabic: 0x067E,
-  peharmenian: 0x057A,
-  pehebrew: 0x05E4,
-  pehfinalarabic: 0xFB57,
-  pehinitialarabic: 0xFB58,
-  pehiragana: 0x307A,
-  pehmedialarabic: 0xFB59,
-  pekatakana: 0x30DA,
-  pemiddlehookcyrillic: 0x04A7,
-  perafehebrew: 0xFB4E,
-  percent: 0x0025,
-  percentarabic: 0x066A,
-  percentmonospace: 0xFF05,
-  percentsmall: 0xFE6A,
-  period: 0x002E,
-  periodarmenian: 0x0589,
-  periodcentered: 0x00B7,
-  periodhalfwidth: 0xFF61,
-  periodinferior: 0xF6E7,
-  periodmonospace: 0xFF0E,
-  periodsmall: 0xFE52,
-  periodsuperior: 0xF6E8,
-  perispomenigreekcmb: 0x0342,
-  perpendicular: 0x22A5,
-  perthousand: 0x2030,
-  peseta: 0x20A7,
-  pfsquare: 0x338A,
-  phabengali: 0x09AB,
-  phadeva: 0x092B,
-  phagujarati: 0x0AAB,
-  phagurmukhi: 0x0A2B,
-  phi: 0x03C6,
-  phi1: 0x03D5,
-  phieuphacirclekorean: 0x327A,
-  phieuphaparenkorean: 0x321A,
-  phieuphcirclekorean: 0x326C,
-  phieuphkorean: 0x314D,
-  phieuphparenkorean: 0x320C,
-  philatin: 0x0278,
-  phinthuthai: 0x0E3A,
-  phisymbolgreek: 0x03D5,
-  phook: 0x01A5,
-  phophanthai: 0x0E1E,
-  phophungthai: 0x0E1C,
-  phosamphaothai: 0x0E20,
-  pi: 0x03C0,
-  pieupacirclekorean: 0x3273,
-  pieupaparenkorean: 0x3213,
-  pieupcieuckorean: 0x3176,
-  pieupcirclekorean: 0x3265,
-  pieupkiyeokkorean: 0x3172,
-  pieupkorean: 0x3142,
-  pieupparenkorean: 0x3205,
-  pieupsioskiyeokkorean: 0x3174,
-  pieupsioskorean: 0x3144,
-  pieupsiostikeutkorean: 0x3175,
-  pieupthieuthkorean: 0x3177,
-  pieuptikeutkorean: 0x3173,
-  pihiragana: 0x3074,
-  pikatakana: 0x30D4,
-  pisymbolgreek: 0x03D6,
-  piwrarmenian: 0x0583,
-  plus: 0x002B,
-  plusbelowcmb: 0x031F,
-  pluscircle: 0x2295,
-  plusminus: 0x00B1,
-  plusmod: 0x02D6,
-  plusmonospace: 0xFF0B,
-  plussmall: 0xFE62,
-  plussuperior: 0x207A,
-  pmonospace: 0xFF50,
-  pmsquare: 0x33D8,
-  pohiragana: 0x307D,
-  pointingindexdownwhite: 0x261F,
-  pointingindexleftwhite: 0x261C,
-  pointingindexrightwhite: 0x261E,
-  pointingindexupwhite: 0x261D,
-  pokatakana: 0x30DD,
-  poplathai: 0x0E1B,
-  postalmark: 0x3012,
-  postalmarkface: 0x3020,
-  pparen: 0x24AB,
-  precedes: 0x227A,
-  prescription: 0x211E,
-  primemod: 0x02B9,
-  primereversed: 0x2035,
-  product: 0x220F,
-  projective: 0x2305,
-  prolongedkana: 0x30FC,
-  propellor: 0x2318,
-  propersubset: 0x2282,
-  propersuperset: 0x2283,
-  proportion: 0x2237,
-  proportional: 0x221D,
-  psi: 0x03C8,
-  psicyrillic: 0x0471,
-  psilipneumatacyrilliccmb: 0x0486,
-  pssquare: 0x33B0,
-  puhiragana: 0x3077,
-  pukatakana: 0x30D7,
-  pvsquare: 0x33B4,
-  pwsquare: 0x33BA,
-  q: 0x0071,
-  qadeva: 0x0958,
-  qadmahebrew: 0x05A8,
-  qafarabic: 0x0642,
-  qaffinalarabic: 0xFED6,
-  qafinitialarabic: 0xFED7,
-  qafmedialarabic: 0xFED8,
-  qamats: 0x05B8,
-  qamats10: 0x05B8,
-  qamats1a: 0x05B8,
-  qamats1c: 0x05B8,
-  qamats27: 0x05B8,
-  qamats29: 0x05B8,
-  qamats33: 0x05B8,
-  qamatsde: 0x05B8,
-  qamatshebrew: 0x05B8,
-  qamatsnarrowhebrew: 0x05B8,
-  qamatsqatanhebrew: 0x05B8,
-  qamatsqatannarrowhebrew: 0x05B8,
-  qamatsqatanquarterhebrew: 0x05B8,
-  qamatsqatanwidehebrew: 0x05B8,
-  qamatsquarterhebrew: 0x05B8,
-  qamatswidehebrew: 0x05B8,
-  qarneyparahebrew: 0x059F,
-  qbopomofo: 0x3111,
-  qcircle: 0x24E0,
-  qhook: 0x02A0,
-  qmonospace: 0xFF51,
-  qof: 0x05E7,
-  qofdagesh: 0xFB47,
-  qofdageshhebrew: 0xFB47,
-  qofhebrew: 0x05E7,
-  qparen: 0x24AC,
-  quarternote: 0x2669,
-  qubuts: 0x05BB,
-  qubuts18: 0x05BB,
-  qubuts25: 0x05BB,
-  qubuts31: 0x05BB,
-  qubutshebrew: 0x05BB,
-  qubutsnarrowhebrew: 0x05BB,
-  qubutsquarterhebrew: 0x05BB,
-  qubutswidehebrew: 0x05BB,
-  question: 0x003F,
-  questionarabic: 0x061F,
-  questionarmenian: 0x055E,
-  questiondown: 0x00BF,
-  questiondownsmall: 0xF7BF,
-  questiongreek: 0x037E,
-  questionmonospace: 0xFF1F,
-  questionsmall: 0xF73F,
-  quotedbl: 0x0022,
-  quotedblbase: 0x201E,
-  quotedblleft: 0x201C,
-  quotedblmonospace: 0xFF02,
-  quotedblprime: 0x301E,
-  quotedblprimereversed: 0x301D,
-  quotedblright: 0x201D,
-  quoteleft: 0x2018,
-  quoteleftreversed: 0x201B,
-  quotereversed: 0x201B,
-  quoteright: 0x2019,
-  quoterightn: 0x0149,
-  quotesinglbase: 0x201A,
-  quotesingle: 0x0027,
-  quotesinglemonospace: 0xFF07,
-  r: 0x0072,
-  raarmenian: 0x057C,
-  rabengali: 0x09B0,
-  racute: 0x0155,
-  radeva: 0x0930,
-  radical: 0x221A,
-  radicalex: 0xF8E5,
-  radoverssquare: 0x33AE,
-  radoverssquaredsquare: 0x33AF,
-  radsquare: 0x33AD,
-  rafe: 0x05BF,
-  rafehebrew: 0x05BF,
-  ragujarati: 0x0AB0,
-  ragurmukhi: 0x0A30,
-  rahiragana: 0x3089,
-  rakatakana: 0x30E9,
-  rakatakanahalfwidth: 0xFF97,
-  ralowerdiagonalbengali: 0x09F1,
-  ramiddlediagonalbengali: 0x09F0,
-  ramshorn: 0x0264,
-  ratio: 0x2236,
-  rbopomofo: 0x3116,
-  rcaron: 0x0159,
-  rcedilla: 0x0157,
-  rcircle: 0x24E1,
-  rcommaaccent: 0x0157,
-  rdblgrave: 0x0211,
-  rdotaccent: 0x1E59,
-  rdotbelow: 0x1E5B,
-  rdotbelowmacron: 0x1E5D,
-  referencemark: 0x203B,
-  reflexsubset: 0x2286,
-  reflexsuperset: 0x2287,
-  registered: 0x00AE,
-  registersans: 0xF8E8,
-  registerserif: 0xF6DA,
-  reharabic: 0x0631,
-  reharmenian: 0x0580,
-  rehfinalarabic: 0xFEAE,
-  rehiragana: 0x308C,
-  rekatakana: 0x30EC,
-  rekatakanahalfwidth: 0xFF9A,
-  resh: 0x05E8,
-  reshdageshhebrew: 0xFB48,
-  reshhebrew: 0x05E8,
-  reversedtilde: 0x223D,
-  reviahebrew: 0x0597,
-  reviamugrashhebrew: 0x0597,
-  revlogicalnot: 0x2310,
-  rfishhook: 0x027E,
-  rfishhookreversed: 0x027F,
-  rhabengali: 0x09DD,
-  rhadeva: 0x095D,
-  rho: 0x03C1,
-  rhook: 0x027D,
-  rhookturned: 0x027B,
-  rhookturnedsuperior: 0x02B5,
-  rhosymbolgreek: 0x03F1,
-  rhotichookmod: 0x02DE,
-  rieulacirclekorean: 0x3271,
-  rieulaparenkorean: 0x3211,
-  rieulcirclekorean: 0x3263,
-  rieulhieuhkorean: 0x3140,
-  rieulkiyeokkorean: 0x313A,
-  rieulkiyeoksioskorean: 0x3169,
-  rieulkorean: 0x3139,
-  rieulmieumkorean: 0x313B,
-  rieulpansioskorean: 0x316C,
-  rieulparenkorean: 0x3203,
-  rieulphieuphkorean: 0x313F,
-  rieulpieupkorean: 0x313C,
-  rieulpieupsioskorean: 0x316B,
-  rieulsioskorean: 0x313D,
-  rieulthieuthkorean: 0x313E,
-  rieultikeutkorean: 0x316A,
-  rieulyeorinhieuhkorean: 0x316D,
-  rightangle: 0x221F,
-  righttackbelowcmb: 0x0319,
-  righttriangle: 0x22BF,
-  rihiragana: 0x308A,
-  rikatakana: 0x30EA,
-  rikatakanahalfwidth: 0xFF98,
-  ring: 0x02DA,
-  ringbelowcmb: 0x0325,
-  ringcmb: 0x030A,
-  ringhalfleft: 0x02BF,
-  ringhalfleftarmenian: 0x0559,
-  ringhalfleftbelowcmb: 0x031C,
-  ringhalfleftcentered: 0x02D3,
-  ringhalfright: 0x02BE,
-  ringhalfrightbelowcmb: 0x0339,
-  ringhalfrightcentered: 0x02D2,
-  rinvertedbreve: 0x0213,
-  rittorusquare: 0x3351,
-  rlinebelow: 0x1E5F,
-  rlongleg: 0x027C,
-  rlonglegturned: 0x027A,
-  rmonospace: 0xFF52,
-  rohiragana: 0x308D,
-  rokatakana: 0x30ED,
-  rokatakanahalfwidth: 0xFF9B,
-  roruathai: 0x0E23,
-  rparen: 0x24AD,
-  rrabengali: 0x09DC,
-  rradeva: 0x0931,
-  rragurmukhi: 0x0A5C,
-  rreharabic: 0x0691,
-  rrehfinalarabic: 0xFB8D,
-  rrvocalicbengali: 0x09E0,
-  rrvocalicdeva: 0x0960,
-  rrvocalicgujarati: 0x0AE0,
-  rrvocalicvowelsignbengali: 0x09C4,
-  rrvocalicvowelsigndeva: 0x0944,
-  rrvocalicvowelsigngujarati: 0x0AC4,
-  rsuperior: 0xF6F1,
-  rtblock: 0x2590,
-  rturned: 0x0279,
-  rturnedsuperior: 0x02B4,
-  ruhiragana: 0x308B,
-  rukatakana: 0x30EB,
-  rukatakanahalfwidth: 0xFF99,
-  rupeemarkbengali: 0x09F2,
-  rupeesignbengali: 0x09F3,
-  rupiah: 0xF6DD,
-  ruthai: 0x0E24,
-  rvocalicbengali: 0x098B,
-  rvocalicdeva: 0x090B,
-  rvocalicgujarati: 0x0A8B,
-  rvocalicvowelsignbengali: 0x09C3,
-  rvocalicvowelsigndeva: 0x0943,
-  rvocalicvowelsigngujarati: 0x0AC3,
-  s: 0x0073,
-  sabengali: 0x09B8,
-  sacute: 0x015B,
-  sacutedotaccent: 0x1E65,
-  sadarabic: 0x0635,
-  sadeva: 0x0938,
-  sadfinalarabic: 0xFEBA,
-  sadinitialarabic: 0xFEBB,
-  sadmedialarabic: 0xFEBC,
-  sagujarati: 0x0AB8,
-  sagurmukhi: 0x0A38,
-  sahiragana: 0x3055,
-  sakatakana: 0x30B5,
-  sakatakanahalfwidth: 0xFF7B,
-  sallallahoualayhewasallamarabic: 0xFDFA,
-  samekh: 0x05E1,
-  samekhdagesh: 0xFB41,
-  samekhdageshhebrew: 0xFB41,
-  samekhhebrew: 0x05E1,
-  saraaathai: 0x0E32,
-  saraaethai: 0x0E41,
-  saraaimaimalaithai: 0x0E44,
-  saraaimaimuanthai: 0x0E43,
-  saraamthai: 0x0E33,
-  saraathai: 0x0E30,
-  saraethai: 0x0E40,
-  saraiileftthai: 0xF886,
-  saraiithai: 0x0E35,
-  saraileftthai: 0xF885,
-  saraithai: 0x0E34,
-  saraothai: 0x0E42,
-  saraueeleftthai: 0xF888,
-  saraueethai: 0x0E37,
-  saraueleftthai: 0xF887,
-  sarauethai: 0x0E36,
-  sarauthai: 0x0E38,
-  sarauuthai: 0x0E39,
-  sbopomofo: 0x3119,
-  scaron: 0x0161,
-  scarondotaccent: 0x1E67,
-  scedilla: 0x015F,
-  schwa: 0x0259,
-  schwacyrillic: 0x04D9,
-  schwadieresiscyrillic: 0x04DB,
-  schwahook: 0x025A,
-  scircle: 0x24E2,
-  scircumflex: 0x015D,
-  scommaaccent: 0x0219,
-  sdotaccent: 0x1E61,
-  sdotbelow: 0x1E63,
-  sdotbelowdotaccent: 0x1E69,
-  seagullbelowcmb: 0x033C,
-  second: 0x2033,
-  secondtonechinese: 0x02CA,
-  section: 0x00A7,
-  seenarabic: 0x0633,
-  seenfinalarabic: 0xFEB2,
-  seeninitialarabic: 0xFEB3,
-  seenmedialarabic: 0xFEB4,
-  segol: 0x05B6,
-  segol13: 0x05B6,
-  segol1f: 0x05B6,
-  segol2c: 0x05B6,
-  segolhebrew: 0x05B6,
-  segolnarrowhebrew: 0x05B6,
-  segolquarterhebrew: 0x05B6,
-  segoltahebrew: 0x0592,
-  segolwidehebrew: 0x05B6,
-  seharmenian: 0x057D,
-  sehiragana: 0x305B,
-  sekatakana: 0x30BB,
-  sekatakanahalfwidth: 0xFF7E,
-  semicolon: 0x003B,
-  semicolonarabic: 0x061B,
-  semicolonmonospace: 0xFF1B,
-  semicolonsmall: 0xFE54,
-  semivoicedmarkkana: 0x309C,
-  semivoicedmarkkanahalfwidth: 0xFF9F,
-  sentisquare: 0x3322,
-  sentosquare: 0x3323,
-  seven: 0x0037,
-  sevenarabic: 0x0667,
-  sevenbengali: 0x09ED,
-  sevencircle: 0x2466,
-  sevencircleinversesansserif: 0x2790,
-  sevendeva: 0x096D,
-  seveneighths: 0x215E,
-  sevengujarati: 0x0AED,
-  sevengurmukhi: 0x0A6D,
-  sevenhackarabic: 0x0667,
-  sevenhangzhou: 0x3027,
-  sevenideographicparen: 0x3226,
-  seveninferior: 0x2087,
-  sevenmonospace: 0xFF17,
-  sevenoldstyle: 0xF737,
-  sevenparen: 0x247A,
-  sevenperiod: 0x248E,
-  sevenpersian: 0x06F7,
-  sevenroman: 0x2176,
-  sevensuperior: 0x2077,
-  seventeencircle: 0x2470,
-  seventeenparen: 0x2484,
-  seventeenperiod: 0x2498,
-  seventhai: 0x0E57,
-  sfthyphen: 0x00AD,
-  shaarmenian: 0x0577,
-  shabengali: 0x09B6,
-  shacyrillic: 0x0448,
-  shaddaarabic: 0x0651,
-  shaddadammaarabic: 0xFC61,
-  shaddadammatanarabic: 0xFC5E,
-  shaddafathaarabic: 0xFC60,
-  shaddakasraarabic: 0xFC62,
-  shaddakasratanarabic: 0xFC5F,
-  shade: 0x2592,
-  shadedark: 0x2593,
-  shadelight: 0x2591,
-  shademedium: 0x2592,
-  shadeva: 0x0936,
-  shagujarati: 0x0AB6,
-  shagurmukhi: 0x0A36,
-  shalshelethebrew: 0x0593,
-  shbopomofo: 0x3115,
-  shchacyrillic: 0x0449,
-  sheenarabic: 0x0634,
-  sheenfinalarabic: 0xFEB6,
-  sheeninitialarabic: 0xFEB7,
-  sheenmedialarabic: 0xFEB8,
-  sheicoptic: 0x03E3,
-  sheqel: 0x20AA,
-  sheqelhebrew: 0x20AA,
-  sheva: 0x05B0,
-  sheva115: 0x05B0,
-  sheva15: 0x05B0,
-  sheva22: 0x05B0,
-  sheva2e: 0x05B0,
-  shevahebrew: 0x05B0,
-  shevanarrowhebrew: 0x05B0,
-  shevaquarterhebrew: 0x05B0,
-  shevawidehebrew: 0x05B0,
-  shhacyrillic: 0x04BB,
-  shimacoptic: 0x03ED,
-  shin: 0x05E9,
-  shindagesh: 0xFB49,
-  shindageshhebrew: 0xFB49,
-  shindageshshindot: 0xFB2C,
-  shindageshshindothebrew: 0xFB2C,
-  shindageshsindot: 0xFB2D,
-  shindageshsindothebrew: 0xFB2D,
-  shindothebrew: 0x05C1,
-  shinhebrew: 0x05E9,
-  shinshindot: 0xFB2A,
-  shinshindothebrew: 0xFB2A,
-  shinsindot: 0xFB2B,
-  shinsindothebrew: 0xFB2B,
-  shook: 0x0282,
-  sigma: 0x03C3,
-  sigma1: 0x03C2,
-  sigmafinal: 0x03C2,
-  sigmalunatesymbolgreek: 0x03F2,
-  sihiragana: 0x3057,
-  sikatakana: 0x30B7,
-  sikatakanahalfwidth: 0xFF7C,
-  siluqhebrew: 0x05BD,
-  siluqlefthebrew: 0x05BD,
-  similar: 0x223C,
-  sindothebrew: 0x05C2,
-  siosacirclekorean: 0x3274,
-  siosaparenkorean: 0x3214,
-  sioscieuckorean: 0x317E,
-  sioscirclekorean: 0x3266,
-  sioskiyeokkorean: 0x317A,
-  sioskorean: 0x3145,
-  siosnieunkorean: 0x317B,
-  siosparenkorean: 0x3206,
-  siospieupkorean: 0x317D,
-  siostikeutkorean: 0x317C,
-  six: 0x0036,
-  sixarabic: 0x0666,
-  sixbengali: 0x09EC,
-  sixcircle: 0x2465,
-  sixcircleinversesansserif: 0x278F,
-  sixdeva: 0x096C,
-  sixgujarati: 0x0AEC,
-  sixgurmukhi: 0x0A6C,
-  sixhackarabic: 0x0666,
-  sixhangzhou: 0x3026,
-  sixideographicparen: 0x3225,
-  sixinferior: 0x2086,
-  sixmonospace: 0xFF16,
-  sixoldstyle: 0xF736,
-  sixparen: 0x2479,
-  sixperiod: 0x248D,
-  sixpersian: 0x06F6,
-  sixroman: 0x2175,
-  sixsuperior: 0x2076,
-  sixteencircle: 0x246F,
-  sixteencurrencydenominatorbengali: 0x09F9,
-  sixteenparen: 0x2483,
-  sixteenperiod: 0x2497,
-  sixthai: 0x0E56,
-  slash: 0x002F,
-  slashmonospace: 0xFF0F,
-  slong: 0x017F,
-  slongdotaccent: 0x1E9B,
-  smileface: 0x263A,
-  smonospace: 0xFF53,
-  sofpasuqhebrew: 0x05C3,
-  softhyphen: 0x00AD,
-  softsigncyrillic: 0x044C,
-  sohiragana: 0x305D,
-  sokatakana: 0x30BD,
-  sokatakanahalfwidth: 0xFF7F,
-  soliduslongoverlaycmb: 0x0338,
-  solidusshortoverlaycmb: 0x0337,
-  sorusithai: 0x0E29,
-  sosalathai: 0x0E28,
-  sosothai: 0x0E0B,
-  sosuathai: 0x0E2A,
-  space: 0x0020,
-  spacehackarabic: 0x0020,
-  spade: 0x2660,
-  spadesuitblack: 0x2660,
-  spadesuitwhite: 0x2664,
-  sparen: 0x24AE,
-  squarebelowcmb: 0x033B,
-  squarecc: 0x33C4,
-  squarecm: 0x339D,
-  squarediagonalcrosshatchfill: 0x25A9,
-  squarehorizontalfill: 0x25A4,
-  squarekg: 0x338F,
-  squarekm: 0x339E,
-  squarekmcapital: 0x33CE,
-  squareln: 0x33D1,
-  squarelog: 0x33D2,
-  squaremg: 0x338E,
-  squaremil: 0x33D5,
-  squaremm: 0x339C,
-  squaremsquared: 0x33A1,
-  squareorthogonalcrosshatchfill: 0x25A6,
-  squareupperlefttolowerrightfill: 0x25A7,
-  squareupperrighttolowerleftfill: 0x25A8,
-  squareverticalfill: 0x25A5,
-  squarewhitewithsmallblack: 0x25A3,
-  srsquare: 0x33DB,
-  ssabengali: 0x09B7,
-  ssadeva: 0x0937,
-  ssagujarati: 0x0AB7,
-  ssangcieuckorean: 0x3149,
-  ssanghieuhkorean: 0x3185,
-  ssangieungkorean: 0x3180,
-  ssangkiyeokkorean: 0x3132,
-  ssangnieunkorean: 0x3165,
-  ssangpieupkorean: 0x3143,
-  ssangsioskorean: 0x3146,
-  ssangtikeutkorean: 0x3138,
-  ssuperior: 0xF6F2,
-  sterling: 0x00A3,
-  sterlingmonospace: 0xFFE1,
-  strokelongoverlaycmb: 0x0336,
-  strokeshortoverlaycmb: 0x0335,
-  subset: 0x2282,
-  subsetnotequal: 0x228A,
-  subsetorequal: 0x2286,
-  succeeds: 0x227B,
-  suchthat: 0x220B,
-  suhiragana: 0x3059,
-  sukatakana: 0x30B9,
-  sukatakanahalfwidth: 0xFF7D,
-  sukunarabic: 0x0652,
-  summation: 0x2211,
-  sun: 0x263C,
-  superset: 0x2283,
-  supersetnotequal: 0x228B,
-  supersetorequal: 0x2287,
-  svsquare: 0x33DC,
-  syouwaerasquare: 0x337C,
-  t: 0x0074,
-  tabengali: 0x09A4,
-  tackdown: 0x22A4,
-  tackleft: 0x22A3,
-  tadeva: 0x0924,
-  tagujarati: 0x0AA4,
-  tagurmukhi: 0x0A24,
-  taharabic: 0x0637,
-  tahfinalarabic: 0xFEC2,
-  tahinitialarabic: 0xFEC3,
-  tahiragana: 0x305F,
-  tahmedialarabic: 0xFEC4,
-  taisyouerasquare: 0x337D,
-  takatakana: 0x30BF,
-  takatakanahalfwidth: 0xFF80,
-  tatweelarabic: 0x0640,
-  tau: 0x03C4,
-  tav: 0x05EA,
-  tavdages: 0xFB4A,
-  tavdagesh: 0xFB4A,
-  tavdageshhebrew: 0xFB4A,
-  tavhebrew: 0x05EA,
-  tbar: 0x0167,
-  tbopomofo: 0x310A,
-  tcaron: 0x0165,
-  tccurl: 0x02A8,
-  tcedilla: 0x0163,
-  tcheharabic: 0x0686,
-  tchehfinalarabic: 0xFB7B,
-  tchehinitialarabic: 0xFB7C,
-  tchehmedialarabic: 0xFB7D,
-  tcircle: 0x24E3,
-  tcircumflexbelow: 0x1E71,
-  tcommaaccent: 0x0163,
-  tdieresis: 0x1E97,
-  tdotaccent: 0x1E6B,
-  tdotbelow: 0x1E6D,
-  tecyrillic: 0x0442,
-  tedescendercyrillic: 0x04AD,
-  teharabic: 0x062A,
-  tehfinalarabic: 0xFE96,
-  tehhahinitialarabic: 0xFCA2,
-  tehhahisolatedarabic: 0xFC0C,
-  tehinitialarabic: 0xFE97,
-  tehiragana: 0x3066,
-  tehjeeminitialarabic: 0xFCA1,
-  tehjeemisolatedarabic: 0xFC0B,
-  tehmarbutaarabic: 0x0629,
-  tehmarbutafinalarabic: 0xFE94,
-  tehmedialarabic: 0xFE98,
-  tehmeeminitialarabic: 0xFCA4,
-  tehmeemisolatedarabic: 0xFC0E,
-  tehnoonfinalarabic: 0xFC73,
-  tekatakana: 0x30C6,
-  tekatakanahalfwidth: 0xFF83,
-  telephone: 0x2121,
-  telephoneblack: 0x260E,
-  telishagedolahebrew: 0x05A0,
-  telishaqetanahebrew: 0x05A9,
-  tencircle: 0x2469,
-  tenideographicparen: 0x3229,
-  tenparen: 0x247D,
-  tenperiod: 0x2491,
-  tenroman: 0x2179,
-  tesh: 0x02A7,
-  tet: 0x05D8,
-  tetdagesh: 0xFB38,
-  tetdageshhebrew: 0xFB38,
-  tethebrew: 0x05D8,
-  tetsecyrillic: 0x04B5,
-  tevirhebrew: 0x059B,
-  tevirlefthebrew: 0x059B,
-  thabengali: 0x09A5,
-  thadeva: 0x0925,
-  thagujarati: 0x0AA5,
-  thagurmukhi: 0x0A25,
-  thalarabic: 0x0630,
-  thalfinalarabic: 0xFEAC,
-  thanthakhatlowleftthai: 0xF898,
-  thanthakhatlowrightthai: 0xF897,
-  thanthakhatthai: 0x0E4C,
-  thanthakhatupperleftthai: 0xF896,
-  theharabic: 0x062B,
-  thehfinalarabic: 0xFE9A,
-  thehinitialarabic: 0xFE9B,
-  thehmedialarabic: 0xFE9C,
-  thereexists: 0x2203,
-  therefore: 0x2234,
-  theta: 0x03B8,
-  theta1: 0x03D1,
-  thetasymbolgreek: 0x03D1,
-  thieuthacirclekorean: 0x3279,
-  thieuthaparenkorean: 0x3219,
-  thieuthcirclekorean: 0x326B,
-  thieuthkorean: 0x314C,
-  thieuthparenkorean: 0x320B,
-  thirteencircle: 0x246C,
-  thirteenparen: 0x2480,
-  thirteenperiod: 0x2494,
-  thonangmonthothai: 0x0E11,
-  thook: 0x01AD,
-  thophuthaothai: 0x0E12,
-  thorn: 0x00FE,
-  thothahanthai: 0x0E17,
-  thothanthai: 0x0E10,
-  thothongthai: 0x0E18,
-  thothungthai: 0x0E16,
-  thousandcyrillic: 0x0482,
-  thousandsseparatorarabic: 0x066C,
-  thousandsseparatorpersian: 0x066C,
-  three: 0x0033,
-  threearabic: 0x0663,
-  threebengali: 0x09E9,
-  threecircle: 0x2462,
-  threecircleinversesansserif: 0x278C,
-  threedeva: 0x0969,
-  threeeighths: 0x215C,
-  threegujarati: 0x0AE9,
-  threegurmukhi: 0x0A69,
-  threehackarabic: 0x0663,
-  threehangzhou: 0x3023,
-  threeideographicparen: 0x3222,
-  threeinferior: 0x2083,
-  threemonospace: 0xFF13,
-  threenumeratorbengali: 0x09F6,
-  threeoldstyle: 0xF733,
-  threeparen: 0x2476,
-  threeperiod: 0x248A,
-  threepersian: 0x06F3,
-  threequarters: 0x00BE,
-  threequartersemdash: 0xF6DE,
-  threeroman: 0x2172,
-  threesuperior: 0x00B3,
-  threethai: 0x0E53,
-  thzsquare: 0x3394,
-  tihiragana: 0x3061,
-  tikatakana: 0x30C1,
-  tikatakanahalfwidth: 0xFF81,
-  tikeutacirclekorean: 0x3270,
-  tikeutaparenkorean: 0x3210,
-  tikeutcirclekorean: 0x3262,
-  tikeutkorean: 0x3137,
-  tikeutparenkorean: 0x3202,
-  tilde: 0x02DC,
-  tildebelowcmb: 0x0330,
-  tildecmb: 0x0303,
-  tildecomb: 0x0303,
-  tildedoublecmb: 0x0360,
-  tildeoperator: 0x223C,
-  tildeoverlaycmb: 0x0334,
-  tildeverticalcmb: 0x033E,
-  timescircle: 0x2297,
-  tipehahebrew: 0x0596,
-  tipehalefthebrew: 0x0596,
-  tippigurmukhi: 0x0A70,
-  titlocyrilliccmb: 0x0483,
-  tiwnarmenian: 0x057F,
-  tlinebelow: 0x1E6F,
-  tmonospace: 0xFF54,
-  toarmenian: 0x0569,
-  tohiragana: 0x3068,
-  tokatakana: 0x30C8,
-  tokatakanahalfwidth: 0xFF84,
-  tonebarextrahighmod: 0x02E5,
-  tonebarextralowmod: 0x02E9,
-  tonebarhighmod: 0x02E6,
-  tonebarlowmod: 0x02E8,
-  tonebarmidmod: 0x02E7,
-  tonefive: 0x01BD,
-  tonesix: 0x0185,
-  tonetwo: 0x01A8,
-  tonos: 0x0384,
-  tonsquare: 0x3327,
-  topatakthai: 0x0E0F,
-  tortoiseshellbracketleft: 0x3014,
-  tortoiseshellbracketleftsmall: 0xFE5D,
-  tortoiseshellbracketleftvertical: 0xFE39,
-  tortoiseshellbracketright: 0x3015,
-  tortoiseshellbracketrightsmall: 0xFE5E,
-  tortoiseshellbracketrightvertical: 0xFE3A,
-  totaothai: 0x0E15,
-  tpalatalhook: 0x01AB,
-  tparen: 0x24AF,
-  trademark: 0x2122,
-  trademarksans: 0xF8EA,
-  trademarkserif: 0xF6DB,
-  tretroflexhook: 0x0288,
-  triagdn: 0x25BC,
-  triaglf: 0x25C4,
-  triagrt: 0x25BA,
-  triagup: 0x25B2,
-  ts: 0x02A6,
-  tsadi: 0x05E6,
-  tsadidagesh: 0xFB46,
-  tsadidageshhebrew: 0xFB46,
-  tsadihebrew: 0x05E6,
-  tsecyrillic: 0x0446,
-  tsere: 0x05B5,
-  tsere12: 0x05B5,
-  tsere1e: 0x05B5,
-  tsere2b: 0x05B5,
-  tserehebrew: 0x05B5,
-  tserenarrowhebrew: 0x05B5,
-  tserequarterhebrew: 0x05B5,
-  tserewidehebrew: 0x05B5,
-  tshecyrillic: 0x045B,
-  tsuperior: 0xF6F3,
-  ttabengali: 0x099F,
-  ttadeva: 0x091F,
-  ttagujarati: 0x0A9F,
-  ttagurmukhi: 0x0A1F,
-  tteharabic: 0x0679,
-  ttehfinalarabic: 0xFB67,
-  ttehinitialarabic: 0xFB68,
-  ttehmedialarabic: 0xFB69,
-  tthabengali: 0x09A0,
-  tthadeva: 0x0920,
-  tthagujarati: 0x0AA0,
-  tthagurmukhi: 0x0A20,
-  tturned: 0x0287,
-  tuhiragana: 0x3064,
-  tukatakana: 0x30C4,
-  tukatakanahalfwidth: 0xFF82,
-  tusmallhiragana: 0x3063,
-  tusmallkatakana: 0x30C3,
-  tusmallkatakanahalfwidth: 0xFF6F,
-  twelvecircle: 0x246B,
-  twelveparen: 0x247F,
-  twelveperiod: 0x2493,
-  twelveroman: 0x217B,
-  twentycircle: 0x2473,
-  twentyhangzhou: 0x5344,
-  twentyparen: 0x2487,
-  twentyperiod: 0x249B,
-  two: 0x0032,
-  twoarabic: 0x0662,
-  twobengali: 0x09E8,
-  twocircle: 0x2461,
-  twocircleinversesansserif: 0x278B,
-  twodeva: 0x0968,
-  twodotenleader: 0x2025,
-  twodotleader: 0x2025,
-  twodotleadervertical: 0xFE30,
-  twogujarati: 0x0AE8,
-  twogurmukhi: 0x0A68,
-  twohackarabic: 0x0662,
-  twohangzhou: 0x3022,
-  twoideographicparen: 0x3221,
-  twoinferior: 0x2082,
-  twomonospace: 0xFF12,
-  twonumeratorbengali: 0x09F5,
-  twooldstyle: 0xF732,
-  twoparen: 0x2475,
-  twoperiod: 0x2489,
-  twopersian: 0x06F2,
-  tworoman: 0x2171,
-  twostroke: 0x01BB,
-  twosuperior: 0x00B2,
-  twothai: 0x0E52,
-  twothirds: 0x2154,
-  u: 0x0075,
-  uacute: 0x00FA,
-  ubar: 0x0289,
-  ubengali: 0x0989,
-  ubopomofo: 0x3128,
-  ubreve: 0x016D,
-  ucaron: 0x01D4,
-  ucircle: 0x24E4,
-  ucircumflex: 0x00FB,
-  ucircumflexbelow: 0x1E77,
-  ucyrillic: 0x0443,
-  udattadeva: 0x0951,
-  udblacute: 0x0171,
-  udblgrave: 0x0215,
-  udeva: 0x0909,
-  udieresis: 0x00FC,
-  udieresisacute: 0x01D8,
-  udieresisbelow: 0x1E73,
-  udieresiscaron: 0x01DA,
-  udieresiscyrillic: 0x04F1,
-  udieresisgrave: 0x01DC,
-  udieresismacron: 0x01D6,
-  udotbelow: 0x1EE5,
-  ugrave: 0x00F9,
-  ugujarati: 0x0A89,
-  ugurmukhi: 0x0A09,
-  uhiragana: 0x3046,
-  uhookabove: 0x1EE7,
-  uhorn: 0x01B0,
-  uhornacute: 0x1EE9,
-  uhorndotbelow: 0x1EF1,
-  uhorngrave: 0x1EEB,
-  uhornhookabove: 0x1EED,
-  uhorntilde: 0x1EEF,
-  uhungarumlaut: 0x0171,
-  uhungarumlautcyrillic: 0x04F3,
-  uinvertedbreve: 0x0217,
-  ukatakana: 0x30A6,
-  ukatakanahalfwidth: 0xFF73,
-  ukcyrillic: 0x0479,
-  ukorean: 0x315C,
-  umacron: 0x016B,
-  umacroncyrillic: 0x04EF,
-  umacrondieresis: 0x1E7B,
-  umatragurmukhi: 0x0A41,
-  umonospace: 0xFF55,
-  underscore: 0x005F,
-  underscoredbl: 0x2017,
-  underscoremonospace: 0xFF3F,
-  underscorevertical: 0xFE33,
-  underscorewavy: 0xFE4F,
-  union: 0x222A,
-  universal: 0x2200,
-  uogonek: 0x0173,
-  uparen: 0x24B0,
-  upblock: 0x2580,
-  upperdothebrew: 0x05C4,
-  upsilon: 0x03C5,
-  upsilondieresis: 0x03CB,
-  upsilondieresistonos: 0x03B0,
-  upsilonlatin: 0x028A,
-  upsilontonos: 0x03CD,
-  uptackbelowcmb: 0x031D,
-  uptackmod: 0x02D4,
-  uragurmukhi: 0x0A73,
-  uring: 0x016F,
-  ushortcyrillic: 0x045E,
-  usmallhiragana: 0x3045,
-  usmallkatakana: 0x30A5,
-  usmallkatakanahalfwidth: 0xFF69,
-  ustraightcyrillic: 0x04AF,
-  ustraightstrokecyrillic: 0x04B1,
-  utilde: 0x0169,
-  utildeacute: 0x1E79,
-  utildebelow: 0x1E75,
-  uubengali: 0x098A,
-  uudeva: 0x090A,
-  uugujarati: 0x0A8A,
-  uugurmukhi: 0x0A0A,
-  uumatragurmukhi: 0x0A42,
-  uuvowelsignbengali: 0x09C2,
-  uuvowelsigndeva: 0x0942,
-  uuvowelsigngujarati: 0x0AC2,
-  uvowelsignbengali: 0x09C1,
-  uvowelsigndeva: 0x0941,
-  uvowelsigngujarati: 0x0AC1,
-  v: 0x0076,
-  vadeva: 0x0935,
-  vagujarati: 0x0AB5,
-  vagurmukhi: 0x0A35,
-  vakatakana: 0x30F7,
-  vav: 0x05D5,
-  vavdagesh: 0xFB35,
-  vavdagesh65: 0xFB35,
-  vavdageshhebrew: 0xFB35,
-  vavhebrew: 0x05D5,
-  vavholam: 0xFB4B,
-  vavholamhebrew: 0xFB4B,
-  vavvavhebrew: 0x05F0,
-  vavyodhebrew: 0x05F1,
-  vcircle: 0x24E5,
-  vdotbelow: 0x1E7F,
-  vecyrillic: 0x0432,
-  veharabic: 0x06A4,
-  vehfinalarabic: 0xFB6B,
-  vehinitialarabic: 0xFB6C,
-  vehmedialarabic: 0xFB6D,
-  vekatakana: 0x30F9,
-  venus: 0x2640,
-  verticalbar: 0x007C,
-  verticallineabovecmb: 0x030D,
-  verticallinebelowcmb: 0x0329,
-  verticallinelowmod: 0x02CC,
-  verticallinemod: 0x02C8,
-  vewarmenian: 0x057E,
-  vhook: 0x028B,
-  vikatakana: 0x30F8,
-  viramabengali: 0x09CD,
-  viramadeva: 0x094D,
-  viramagujarati: 0x0ACD,
-  visargabengali: 0x0983,
-  visargadeva: 0x0903,
-  visargagujarati: 0x0A83,
-  vmonospace: 0xFF56,
-  voarmenian: 0x0578,
-  voicediterationhiragana: 0x309E,
-  voicediterationkatakana: 0x30FE,
-  voicedmarkkana: 0x309B,
-  voicedmarkkanahalfwidth: 0xFF9E,
-  vokatakana: 0x30FA,
-  vparen: 0x24B1,
-  vtilde: 0x1E7D,
-  vturned: 0x028C,
-  vuhiragana: 0x3094,
-  vukatakana: 0x30F4,
-  w: 0x0077,
-  wacute: 0x1E83,
-  waekorean: 0x3159,
-  wahiragana: 0x308F,
-  wakatakana: 0x30EF,
-  wakatakanahalfwidth: 0xFF9C,
-  wakorean: 0x3158,
-  wasmallhiragana: 0x308E,
-  wasmallkatakana: 0x30EE,
-  wattosquare: 0x3357,
-  wavedash: 0x301C,
-  wavyunderscorevertical: 0xFE34,
-  wawarabic: 0x0648,
-  wawfinalarabic: 0xFEEE,
-  wawhamzaabovearabic: 0x0624,
-  wawhamzaabovefinalarabic: 0xFE86,
-  wbsquare: 0x33DD,
-  wcircle: 0x24E6,
-  wcircumflex: 0x0175,
-  wdieresis: 0x1E85,
-  wdotaccent: 0x1E87,
-  wdotbelow: 0x1E89,
-  wehiragana: 0x3091,
-  weierstrass: 0x2118,
-  wekatakana: 0x30F1,
-  wekorean: 0x315E,
-  weokorean: 0x315D,
-  wgrave: 0x1E81,
-  whitebullet: 0x25E6,
-  whitecircle: 0x25CB,
-  whitecircleinverse: 0x25D9,
-  whitecornerbracketleft: 0x300E,
-  whitecornerbracketleftvertical: 0xFE43,
-  whitecornerbracketright: 0x300F,
-  whitecornerbracketrightvertical: 0xFE44,
-  whitediamond: 0x25C7,
-  whitediamondcontainingblacksmalldiamond: 0x25C8,
-  whitedownpointingsmalltriangle: 0x25BF,
-  whitedownpointingtriangle: 0x25BD,
-  whiteleftpointingsmalltriangle: 0x25C3,
-  whiteleftpointingtriangle: 0x25C1,
-  whitelenticularbracketleft: 0x3016,
-  whitelenticularbracketright: 0x3017,
-  whiterightpointingsmalltriangle: 0x25B9,
-  whiterightpointingtriangle: 0x25B7,
-  whitesmallsquare: 0x25AB,
-  whitesmilingface: 0x263A,
-  whitesquare: 0x25A1,
-  whitestar: 0x2606,
-  whitetelephone: 0x260F,
-  whitetortoiseshellbracketleft: 0x3018,
-  whitetortoiseshellbracketright: 0x3019,
-  whiteuppointingsmalltriangle: 0x25B5,
-  whiteuppointingtriangle: 0x25B3,
-  wihiragana: 0x3090,
-  wikatakana: 0x30F0,
-  wikorean: 0x315F,
-  wmonospace: 0xFF57,
-  wohiragana: 0x3092,
-  wokatakana: 0x30F2,
-  wokatakanahalfwidth: 0xFF66,
-  won: 0x20A9,
-  wonmonospace: 0xFFE6,
-  wowaenthai: 0x0E27,
-  wparen: 0x24B2,
-  wring: 0x1E98,
-  wsuperior: 0x02B7,
-  wturned: 0x028D,
-  wynn: 0x01BF,
-  x: 0x0078,
-  xabovecmb: 0x033D,
-  xbopomofo: 0x3112,
-  xcircle: 0x24E7,
-  xdieresis: 0x1E8D,
-  xdotaccent: 0x1E8B,
-  xeharmenian: 0x056D,
-  xi: 0x03BE,
-  xmonospace: 0xFF58,
-  xparen: 0x24B3,
-  xsuperior: 0x02E3,
-  y: 0x0079,
-  yaadosquare: 0x334E,
-  yabengali: 0x09AF,
-  yacute: 0x00FD,
-  yadeva: 0x092F,
-  yaekorean: 0x3152,
-  yagujarati: 0x0AAF,
-  yagurmukhi: 0x0A2F,
-  yahiragana: 0x3084,
-  yakatakana: 0x30E4,
-  yakatakanahalfwidth: 0xFF94,
-  yakorean: 0x3151,
-  yamakkanthai: 0x0E4E,
-  yasmallhiragana: 0x3083,
-  yasmallkatakana: 0x30E3,
-  yasmallkatakanahalfwidth: 0xFF6C,
-  yatcyrillic: 0x0463,
-  ycircle: 0x24E8,
-  ycircumflex: 0x0177,
-  ydieresis: 0x00FF,
-  ydotaccent: 0x1E8F,
-  ydotbelow: 0x1EF5,
-  yeharabic: 0x064A,
-  yehbarreearabic: 0x06D2,
-  yehbarreefinalarabic: 0xFBAF,
-  yehfinalarabic: 0xFEF2,
-  yehhamzaabovearabic: 0x0626,
-  yehhamzaabovefinalarabic: 0xFE8A,
-  yehhamzaaboveinitialarabic: 0xFE8B,
-  yehhamzaabovemedialarabic: 0xFE8C,
-  yehinitialarabic: 0xFEF3,
-  yehmedialarabic: 0xFEF4,
-  yehmeeminitialarabic: 0xFCDD,
-  yehmeemisolatedarabic: 0xFC58,
-  yehnoonfinalarabic: 0xFC94,
-  yehthreedotsbelowarabic: 0x06D1,
-  yekorean: 0x3156,
-  yen: 0x00A5,
-  yenmonospace: 0xFFE5,
-  yeokorean: 0x3155,
-  yeorinhieuhkorean: 0x3186,
-  yerahbenyomohebrew: 0x05AA,
-  yerahbenyomolefthebrew: 0x05AA,
-  yericyrillic: 0x044B,
-  yerudieresiscyrillic: 0x04F9,
-  yesieungkorean: 0x3181,
-  yesieungpansioskorean: 0x3183,
-  yesieungsioskorean: 0x3182,
-  yetivhebrew: 0x059A,
-  ygrave: 0x1EF3,
-  yhook: 0x01B4,
-  yhookabove: 0x1EF7,
-  yiarmenian: 0x0575,
-  yicyrillic: 0x0457,
-  yikorean: 0x3162,
-  yinyang: 0x262F,
-  yiwnarmenian: 0x0582,
-  ymonospace: 0xFF59,
-  yod: 0x05D9,
-  yoddagesh: 0xFB39,
-  yoddageshhebrew: 0xFB39,
-  yodhebrew: 0x05D9,
-  yodyodhebrew: 0x05F2,
-  yodyodpatahhebrew: 0xFB1F,
-  yohiragana: 0x3088,
-  yoikorean: 0x3189,
-  yokatakana: 0x30E8,
-  yokatakanahalfwidth: 0xFF96,
-  yokorean: 0x315B,
-  yosmallhiragana: 0x3087,
-  yosmallkatakana: 0x30E7,
-  yosmallkatakanahalfwidth: 0xFF6E,
-  yotgreek: 0x03F3,
-  yoyaekorean: 0x3188,
-  yoyakorean: 0x3187,
-  yoyakthai: 0x0E22,
-  yoyingthai: 0x0E0D,
-  yparen: 0x24B4,
-  ypogegrammeni: 0x037A,
-  ypogegrammenigreekcmb: 0x0345,
-  yr: 0x01A6,
-  yring: 0x1E99,
-  ysuperior: 0x02B8,
-  ytilde: 0x1EF9,
-  yturned: 0x028E,
-  yuhiragana: 0x3086,
-  yuikorean: 0x318C,
-  yukatakana: 0x30E6,
-  yukatakanahalfwidth: 0xFF95,
-  yukorean: 0x3160,
-  yusbigcyrillic: 0x046B,
-  yusbigiotifiedcyrillic: 0x046D,
-  yuslittlecyrillic: 0x0467,
-  yuslittleiotifiedcyrillic: 0x0469,
-  yusmallhiragana: 0x3085,
-  yusmallkatakana: 0x30E5,
-  yusmallkatakanahalfwidth: 0xFF6D,
-  yuyekorean: 0x318B,
-  yuyeokorean: 0x318A,
-  yyabengali: 0x09DF,
-  yyadeva: 0x095F,
-  z: 0x007A,
-  zaarmenian: 0x0566,
-  zacute: 0x017A,
-  zadeva: 0x095B,
-  zagurmukhi: 0x0A5B,
-  zaharabic: 0x0638,
-  zahfinalarabic: 0xFEC6,
-  zahinitialarabic: 0xFEC7,
-  zahiragana: 0x3056,
-  zahmedialarabic: 0xFEC8,
-  zainarabic: 0x0632,
-  zainfinalarabic: 0xFEB0,
-  zakatakana: 0x30B6,
-  zaqefgadolhebrew: 0x0595,
-  zaqefqatanhebrew: 0x0594,
-  zarqahebrew: 0x0598,
-  zayin: 0x05D6,
-  zayindagesh: 0xFB36,
-  zayindageshhebrew: 0xFB36,
-  zayinhebrew: 0x05D6,
-  zbopomofo: 0x3117,
-  zcaron: 0x017E,
-  zcircle: 0x24E9,
-  zcircumflex: 0x1E91,
-  zcurl: 0x0291,
-  zdot: 0x017C,
-  zdotaccent: 0x017C,
-  zdotbelow: 0x1E93,
-  zecyrillic: 0x0437,
-  zedescendercyrillic: 0x0499,
-  zedieresiscyrillic: 0x04DF,
-  zehiragana: 0x305C,
-  zekatakana: 0x30BC,
-  zero: 0x0030,
-  zeroarabic: 0x0660,
-  zerobengali: 0x09E6,
-  zerodeva: 0x0966,
-  zerogujarati: 0x0AE6,
-  zerogurmukhi: 0x0A66,
-  zerohackarabic: 0x0660,
-  zeroinferior: 0x2080,
-  zeromonospace: 0xFF10,
-  zerooldstyle: 0xF730,
-  zeropersian: 0x06F0,
-  zerosuperior: 0x2070,
-  zerothai: 0x0E50,
-  zerowidthjoiner: 0xFEFF,
-  zerowidthnonjoiner: 0x200C,
-  zerowidthspace: 0x200B,
-  zeta: 0x03B6,
-  zhbopomofo: 0x3113,
-  zhearmenian: 0x056A,
-  zhebrevecyrillic: 0x04C2,
-  zhecyrillic: 0x0436,
-  zhedescendercyrillic: 0x0497,
-  zhedieresiscyrillic: 0x04DD,
-  zihiragana: 0x3058,
-  zikatakana: 0x30B8,
-  zinorhebrew: 0x05AE,
-  zlinebelow: 0x1E95,
-  zmonospace: 0xFF5A,
-  zohiragana: 0x305E,
-  zokatakana: 0x30BE,
-  zparen: 0x24B5,
-  zretroflexhook: 0x0290,
-  zstroke: 0x01B6,
-  zuhiragana: 0x305A,
-  zukatakana: 0x30BA,
-  '.notdef': 0x0000
-};
-
-var DingbatsGlyphsUnicode = {
-  space: 0x0020,
-  a1: 0x2701,
-  a2: 0x2702,
-  a202: 0x2703,
-  a3: 0x2704,
-  a4: 0x260E,
-  a5: 0x2706,
-  a119: 0x2707,
-  a118: 0x2708,
-  a117: 0x2709,
-  a11: 0x261B,
-  a12: 0x261E,
-  a13: 0x270C,
-  a14: 0x270D,
-  a15: 0x270E,
-  a16: 0x270F,
-  a105: 0x2710,
-  a17: 0x2711,
-  a18: 0x2712,
-  a19: 0x2713,
-  a20: 0x2714,
-  a21: 0x2715,
-  a22: 0x2716,
-  a23: 0x2717,
-  a24: 0x2718,
-  a25: 0x2719,
-  a26: 0x271A,
-  a27: 0x271B,
-  a28: 0x271C,
-  a6: 0x271D,
-  a7: 0x271E,
-  a8: 0x271F,
-  a9: 0x2720,
-  a10: 0x2721,
-  a29: 0x2722,
-  a30: 0x2723,
-  a31: 0x2724,
-  a32: 0x2725,
-  a33: 0x2726,
-  a34: 0x2727,
-  a35: 0x2605,
-  a36: 0x2729,
-  a37: 0x272A,
-  a38: 0x272B,
-  a39: 0x272C,
-  a40: 0x272D,
-  a41: 0x272E,
-  a42: 0x272F,
-  a43: 0x2730,
-  a44: 0x2731,
-  a45: 0x2732,
-  a46: 0x2733,
-  a47: 0x2734,
-  a48: 0x2735,
-  a49: 0x2736,
-  a50: 0x2737,
-  a51: 0x2738,
-  a52: 0x2739,
-  a53: 0x273A,
-  a54: 0x273B,
-  a55: 0x273C,
-  a56: 0x273D,
-  a57: 0x273E,
-  a58: 0x273F,
-  a59: 0x2740,
-  a60: 0x2741,
-  a61: 0x2742,
-  a62: 0x2743,
-  a63: 0x2744,
-  a64: 0x2745,
-  a65: 0x2746,
-  a66: 0x2747,
-  a67: 0x2748,
-  a68: 0x2749,
-  a69: 0x274A,
-  a70: 0x274B,
-  a71: 0x25CF,
-  a72: 0x274D,
-  a73: 0x25A0,
-  a74: 0x274F,
-  a203: 0x2750,
-  a75: 0x2751,
-  a204: 0x2752,
-  a76: 0x25B2,
-  a77: 0x25BC,
-  a78: 0x25C6,
-  a79: 0x2756,
-  a81: 0x25D7,
-  a82: 0x2758,
-  a83: 0x2759,
-  a84: 0x275A,
-  a97: 0x275B,
-  a98: 0x275C,
-  a99: 0x275D,
-  a100: 0x275E,
-  a101: 0x2761,
-  a102: 0x2762,
-  a103: 0x2763,
-  a104: 0x2764,
-  a106: 0x2765,
-  a107: 0x2766,
-  a108: 0x2767,
-  a112: 0x2663,
-  a111: 0x2666,
-  a110: 0x2665,
-  a109: 0x2660,
-  a120: 0x2460,
-  a121: 0x2461,
-  a122: 0x2462,
-  a123: 0x2463,
-  a124: 0x2464,
-  a125: 0x2465,
-  a126: 0x2466,
-  a127: 0x2467,
-  a128: 0x2468,
-  a129: 0x2469,
-  a130: 0x2776,
-  a131: 0x2777,
-  a132: 0x2778,
-  a133: 0x2779,
-  a134: 0x277A,
-  a135: 0x277B,
-  a136: 0x277C,
-  a137: 0x277D,
-  a138: 0x277E,
-  a139: 0x277F,
-  a140: 0x2780,
-  a141: 0x2781,
-  a142: 0x2782,
-  a143: 0x2783,
-  a144: 0x2784,
-  a145: 0x2785,
-  a146: 0x2786,
-  a147: 0x2787,
-  a148: 0x2788,
-  a149: 0x2789,
-  a150: 0x278A,
-  a151: 0x278B,
-  a152: 0x278C,
-  a153: 0x278D,
-  a154: 0x278E,
-  a155: 0x278F,
-  a156: 0x2790,
-  a157: 0x2791,
-  a158: 0x2792,
-  a159: 0x2793,
-  a160: 0x2794,
-  a161: 0x2192,
-  a163: 0x2194,
-  a164: 0x2195,
-  a196: 0x2798,
-  a165: 0x2799,
-  a192: 0x279A,
-  a166: 0x279B,
-  a167: 0x279C,
-  a168: 0x279D,
-  a169: 0x279E,
-  a170: 0x279F,
-  a171: 0x27A0,
-  a172: 0x27A1,
-  a173: 0x27A2,
-  a162: 0x27A3,
-  a174: 0x27A4,
-  a175: 0x27A5,
-  a176: 0x27A6,
-  a177: 0x27A7,
-  a178: 0x27A8,
-  a179: 0x27A9,
-  a193: 0x27AA,
-  a180: 0x27AB,
-  a199: 0x27AC,
-  a181: 0x27AD,
-  a200: 0x27AE,
-  a182: 0x27AF,
-  a201: 0x27B1,
-  a183: 0x27B2,
-  a184: 0x27B3,
-  a197: 0x27B4,
-  a185: 0x27B5,
-  a194: 0x27B6,
-  a198: 0x27B7,
-  a186: 0x27B8,
-  a195: 0x27B9,
-  a187: 0x27BA,
-  a188: 0x27BB,
-  a189: 0x27BC,
-  a190: 0x27BD,
-  a191: 0x27BE,
-  a89: 0x2768, // 0xF8D7
-  a90: 0x2769, // 0xF8D8
-  a93: 0x276A, // 0xF8D9
-  a94: 0x276B, // 0xF8DA
-  a91: 0x276C, // 0xF8DB
-  a92: 0x276D, // 0xF8DC
-  a205: 0x276E, // 0xF8DD
-  a85: 0x276F, // 0xF8DE
-  a206: 0x2770, // 0xF8DF
-  a86: 0x2771, // 0xF8E0
-  a87: 0x2772, // 0xF8E1
-  a88: 0x2773, // 0xF8E2
-  a95: 0x2774, // 0xF8E3
-  a96: 0x2775, // 0xF8E4
-  '.notdef': 0x0000
-};
-
-
-var PDFImage = (function PDFImageClosure() {
-  /**
-   * Decode the image in the main thread if it supported. Resovles the promise
-   * when the image data is ready.
-   */
-  function handleImageData(handler, xref, res, image) {
-    if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {
-      // For natively supported jpegs send them to the main thread for decoding.
-      var dict = image.dict;
-      var colorSpace = dict.get('ColorSpace', 'CS');
-      colorSpace = ColorSpace.parse(colorSpace, xref, res);
-      var numComps = colorSpace.numComps;
-      var decodePromise = handler.sendWithPromise('JpegDecode',
-                                                  [image.getIR(), numComps]);
-      return decodePromise.then(function (message) {
-        var data = message.data;
-        return new Stream(data, 0, data.length, image.dict);
-      });
-    } else {
-      return Promise.resolve(image);
-    }
-  }
-
-  /**
-   * Decode and clamp a value. The formula is different from the spec because we
-   * don't decode to float range [0,1], we decode it in the [0,max] range.
-   */
-  function decodeAndClamp(value, addend, coefficient, max) {
-    value = addend + value * coefficient;
-    // Clamp the value to the range
-    return (value < 0 ? 0 : (value > max ? max : value));
-  }
-
-  function PDFImage(xref, res, image, inline, smask, mask, isMask) {
-    this.image = image;
-    var dict = image.dict;
-    if (dict.has('Filter')) {
-      var filter = dict.get('Filter').name;
-      if (filter === 'JPXDecode') {
-        var jpxImage = new JpxImage();
-        jpxImage.parseImageProperties(image.stream);
-        image.stream.reset();
-        image.bitsPerComponent = jpxImage.bitsPerComponent;
-        image.numComps = jpxImage.componentsCount;
-      } else if (filter === 'JBIG2Decode') {
-        image.bitsPerComponent = 1;
-        image.numComps = 1;
-      }
-    }
-    // TODO cache rendered images?
-
-    this.width = dict.get('Width', 'W');
-    this.height = dict.get('Height', 'H');
-
-    if (this.width < 1 || this.height < 1) {
-      error('Invalid image width: ' + this.width + ' or height: ' +
-            this.height);
-    }
-
-    this.interpolate = dict.get('Interpolate', 'I') || false;
-    this.imageMask = dict.get('ImageMask', 'IM') || false;
-    this.matte = dict.get('Matte') || false;
-
-    var bitsPerComponent = image.bitsPerComponent;
-    if (!bitsPerComponent) {
-      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
-      if (!bitsPerComponent) {
-        if (this.imageMask) {
-          bitsPerComponent = 1;
-        } else {
-          error('Bits per component missing in image: ' + this.imageMask);
-        }
-      }
-    }
-    this.bpc = bitsPerComponent;
-
-    if (!this.imageMask) {
-      var colorSpace = dict.get('ColorSpace', 'CS');
-      if (!colorSpace) {
-        info('JPX images (which do not require color spaces)');
-        switch (image.numComps) {
-          case 1:
-            colorSpace = Name.get('DeviceGray');
-            break;
-          case 3:
-            colorSpace = Name.get('DeviceRGB');
-            break;
-          case 4:
-            colorSpace = Name.get('DeviceCMYK');
-            break;
-          default:
-            error('JPX images with ' + this.numComps +
-                  ' color components not supported.');
-        }
-      }
-      this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
-      this.numComps = this.colorSpace.numComps;
-    }
-
-    this.decode = dict.get('Decode', 'D');
-    this.needsDecode = false;
-    if (this.decode &&
-        ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) ||
-         (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) {
-      this.needsDecode = true;
-      // Do some preprocessing to avoid more math.
-      var max = (1 << bitsPerComponent) - 1;
-      this.decodeCoefficients = [];
-      this.decodeAddends = [];
-      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
-        var dmin = this.decode[i];
-        var dmax = this.decode[i + 1];
-        this.decodeCoefficients[j] = dmax - dmin;
-        this.decodeAddends[j] = max * dmin;
-      }
-    }
-
-    if (smask) {
-      this.smask = new PDFImage(xref, res, smask, false);
-    } else if (mask) {
-      if (isStream(mask)) {
-        this.mask = new PDFImage(xref, res, mask, false, null, null, true);
-      } else {
-        // Color key mask (just an array).
-        this.mask = mask;
-      }
-    }
-  }
-  /**
-   * Handles processing of image data and returns the Promise that is resolved
-   * with a PDFImage when the image is ready to be used.
-   */
-  PDFImage.buildImage = function PDFImage_buildImage(handler, xref,
-                                                     res, image, inline) {
-    var imagePromise = handleImageData(handler, xref, res, image);
-    var smaskPromise;
-    var maskPromise;
-
-    var smask = image.dict.get('SMask');
-    var mask = image.dict.get('Mask');
-
-    if (smask) {
-      smaskPromise = handleImageData(handler, xref, res, smask);
-      maskPromise = Promise.resolve(null);
-    } else {
-      smaskPromise = Promise.resolve(null);
-      if (mask) {
-        if (isStream(mask)) {
-          maskPromise = handleImageData(handler, xref, res, mask);
-        } else if (isArray(mask)) {
-          maskPromise = Promise.resolve(mask);
-        } else {
-          warn('Unsupported mask format.');
-          maskPromise = Promise.resolve(null);
-        }
-      } else {
-        maskPromise = Promise.resolve(null);
-      }
-    }
-    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(
-      function(results) {
-        var imageData = results[0];
-        var smaskData = results[1];
-        var maskData = results[2];
-        return new PDFImage(xref, res, imageData, inline, smaskData, maskData);
-      });
-  };
-
-  /**
-   * Resize an image using the nearest neighbor algorithm. Currently only
-   * supports one and three component images.
-   * @param {TypedArray} pixels The original image with one component.
-   * @param {Number} bpc Number of bits per component.
-   * @param {Number} components Number of color components, 1 or 3 is supported.
-   * @param {Number} w1 Original width.
-   * @param {Number} h1 Original height.
-   * @param {Number} w2 New width.
-   * @param {Number} h2 New height.
-   * @param {TypedArray} dest (Optional) The destination buffer.
-   * @param {Number} alpha01 (Optional) Size reserved for the alpha channel.
-   * @return {TypedArray} Resized image data.
-   */
-  PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
-                                             w1, h1, w2, h2, dest, alpha01) {
-
-    if (components !== 1 && components !== 3) {
-      error('Unsupported component count for resizing.');
-    }
-
-    var length = w2 * h2 * components;
-    var temp = dest ? dest : (bpc <= 8 ? new Uint8Array(length) :
-        (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));
-    var xRatio = w1 / w2;
-    var yRatio = h1 / h2;
-    var i, j, py, newIndex = 0, oldIndex;
-    var xScaled = new Uint16Array(w2);
-    var w1Scanline = w1 * components;
-    if (alpha01 !== 1) {
-      alpha01 = 0;
-    }
-
-    for (j = 0; j < w2; j++) {
-      xScaled[j] = Math.floor(j * xRatio) * components;
-    }
-
-    if (components === 1) {
-      for (i = 0; i < h2; i++) {
-        py = Math.floor(i * yRatio) * w1Scanline;
-        for (j = 0; j < w2; j++) {
-          oldIndex = py + xScaled[j];
-          temp[newIndex++] = pixels[oldIndex];
-        }
-      }
-    } else if (components === 3) {
-      for (i = 0; i < h2; i++) {
-        py = Math.floor(i * yRatio) * w1Scanline;
-        for (j = 0; j < w2; j++) {
-          oldIndex = py + xScaled[j];
-          temp[newIndex++] = pixels[oldIndex++];
-          temp[newIndex++] = pixels[oldIndex++];
-          temp[newIndex++] = pixels[oldIndex++];
-          newIndex += alpha01;
-        }
-      }
-    }
-    return temp;
-  };
-
-  PDFImage.createMask =
-      function PDFImage_createMask(imgArray, width, height,
-                                   imageIsFromDecodeStream, inverseDecode) {
-
-    // |imgArray| might not contain full data for every pixel of the mask, so
-    // we need to distinguish between |computedLength| and |actualLength|.
-    // In particular, if inverseDecode is true, then the array we return must
-    // have a length of |computedLength|.
-
-    var computedLength = ((width + 7) >> 3) * height;
-    var actualLength = imgArray.byteLength;
-    var haveFullData = computedLength === actualLength;
-    var data, i;
-
-    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
-      // imgArray came from a DecodeStream and its data is in an appropriate
-      // form, so we can just transfer it.
-      data = imgArray;
-    } else if (!inverseDecode) {
-      data = new Uint8Array(actualLength);
-      data.set(imgArray);
-    } else {
-      data = new Uint8Array(computedLength);
-      data.set(imgArray);
-      for (i = actualLength; i < computedLength; i++) {
-        data[i] = 0xff;
-      }
-    }
-
-    // If necessary, invert the original mask data (but not any extra we might
-    // have added above). It's safe to modify the array -- whether it's the
-    // original or a copy, we're about to transfer it anyway, so nothing else
-    // in this thread can be relying on its contents.
-    if (inverseDecode) {
-      for (i = 0; i < actualLength; i++) {
-        data[i] = ~data[i];
-      }
-    }
-
-    return {data: data, width: width, height: height};
-  };
-
-  PDFImage.prototype = {
-    get drawWidth() {
-      return Math.max(this.width,
-                      this.smask && this.smask.width || 0,
-                      this.mask && this.mask.width || 0);
-    },
-
-    get drawHeight() {
-      return Math.max(this.height,
-                      this.smask && this.smask.height || 0,
-                      this.mask && this.mask.height || 0);
-    },
-
-    decodeBuffer: function PDFImage_decodeBuffer(buffer) {
-      var bpc = this.bpc;
-      var numComps = this.numComps;
-
-      var decodeAddends = this.decodeAddends;
-      var decodeCoefficients = this.decodeCoefficients;
-      var max = (1 << bpc) - 1;
-      var i, ii;
-
-      if (bpc === 1) {
-        // If the buffer needed decode that means it just needs to be inverted.
-        for (i = 0, ii = buffer.length; i < ii; i++) {
-          buffer[i] = +!(buffer[i]);
-        }
-        return;
-      }
-      var index = 0;
-      for (i = 0, ii = this.width * this.height; i < ii; i++) {
-        for (var j = 0; j < numComps; j++) {
-          buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j],
-                                         decodeCoefficients[j], max);
-          index++;
-        }
-      }
-    },
-
-    getComponents: function PDFImage_getComponents(buffer) {
-      var bpc = this.bpc;
-
-      // This image doesn't require any extra work.
-      if (bpc === 8) {
-        return buffer;
-      }
-
-      var width = this.width;
-      var height = this.height;
-      var numComps = this.numComps;
-
-      var length = width * height * numComps;
-      var bufferPos = 0;
-      var output = (bpc <= 8 ? new Uint8Array(length) :
-        (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));
-      var rowComps = width * numComps;
-
-      var max = (1 << bpc) - 1;
-      var i = 0, ii, buf;
-
-      if (bpc === 1) {
-        // Optimization for reading 1 bpc images.
-        var mask, loop1End, loop2End;
-        for (var j = 0; j < height; j++) {
-          loop1End = i + (rowComps & ~7);
-          loop2End = i + rowComps;
-
-          // unroll loop for all full bytes
-          while (i < loop1End) {
-            buf = buffer[bufferPos++];
-            output[i] = (buf >> 7) & 1;
-            output[i + 1] = (buf >> 6) & 1;
-            output[i + 2] = (buf >> 5) & 1;
-            output[i + 3] = (buf >> 4) & 1;
-            output[i + 4] = (buf >> 3) & 1;
-            output[i + 5] = (buf >> 2) & 1;
-            output[i + 6] = (buf >> 1) & 1;
-            output[i + 7] = buf & 1;
-            i += 8;
-          }
-
-          // handle remaing bits
-          if (i < loop2End) {
-            buf = buffer[bufferPos++];
-            mask = 128;
-            while (i < loop2End) {
-              output[i++] = +!!(buf & mask);
-              mask >>= 1;
-            }
-          }
-        }
-      } else {
-        // The general case that handles all other bpc values.
-        var bits = 0;
-        buf = 0;
-        for (i = 0, ii = length; i < ii; ++i) {
-          if (i % rowComps === 0) {
-            buf = 0;
-            bits = 0;
-          }
-
-          while (bits < bpc) {
-            buf = (buf << 8) | buffer[bufferPos++];
-            bits += 8;
-          }
-
-          var remainingBits = bits - bpc;
-          var value = buf >> remainingBits;
-          output[i] = (value < 0 ? 0 : (value > max ? max : value));
-          buf = buf & ((1 << remainingBits) - 1);
-          bits = remainingBits;
-        }
-      }
-      return output;
-    },
-
-    fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height,
-                                               actualHeight, image) {
-      var smask = this.smask;
-      var mask = this.mask;
-      var alphaBuf, sw, sh, i, ii, j;
-
-      if (smask) {
-        sw = smask.width;
-        sh = smask.height;
-        alphaBuf = new Uint8Array(sw * sh);
-        smask.fillGrayBuffer(alphaBuf);
-        if (sw !== width || sh !== height) {
-          alphaBuf = PDFImage.resize(alphaBuf, smask.bpc, 1, sw, sh, width,
-                                     height);
-        }
-      } else if (mask) {
-        if (mask instanceof PDFImage) {
-          sw = mask.width;
-          sh = mask.height;
-          alphaBuf = new Uint8Array(sw * sh);
-          mask.numComps = 1;
-          mask.fillGrayBuffer(alphaBuf);
-
-          // Need to invert values in rgbaBuf
-          for (i = 0, ii = sw * sh; i < ii; ++i) {
-            alphaBuf[i] = 255 - alphaBuf[i];
-          }
-
-          if (sw !== width || sh !== height) {
-            alphaBuf = PDFImage.resize(alphaBuf, mask.bpc, 1, sw, sh, width,
-                                       height);
-          }
-        } else if (isArray(mask)) {
-          // Color key mask: if any of the compontents are outside the range
-          // then they should be painted.
-          alphaBuf = new Uint8Array(width * height);
-          var numComps = this.numComps;
-          for (i = 0, ii = width * height; i < ii; ++i) {
-            var opacity = 0;
-            var imageOffset = i * numComps;
-            for (j = 0; j < numComps; ++j) {
-              var color = image[imageOffset + j];
-              var maskOffset = j * 2;
-              if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
-                opacity = 255;
-                break;
-              }
-            }
-            alphaBuf[i] = opacity;
-          }
-        } else {
-          error('Unknown mask format.');
-        }
-      }
-
-      if (alphaBuf) {
-        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
-          rgbaBuf[j] = alphaBuf[i];
-        }
-      } else {
-        // No mask.
-        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
-          rgbaBuf[j] = 255;
-        }
-      }
-    },
-
-    undoPreblend: function PDFImage_undoPreblend(buffer, width, height) {
-      var matte = this.smask && this.smask.matte;
-      if (!matte) {
-        return;
-      }
-      var matteRgb = this.colorSpace.getRgb(matte, 0);
-      var matteR = matteRgb[0];
-      var matteG = matteRgb[1];
-      var matteB = matteRgb[2];
-      var length = width * height * 4;
-      var r, g, b;
-      for (var i = 0; i < length; i += 4) {
-        var alpha = buffer[i + 3];
-        if (alpha === 0) {
-          // according formula we have to get Infinity in all components
-          // making it white (typical paper color) should be okay
-          buffer[i] = 255;
-          buffer[i + 1] = 255;
-          buffer[i + 2] = 255;
-          continue;
-        }
-        var k = 255 / alpha;
-        r = (buffer[i] - matteR) * k + matteR;
-        g = (buffer[i + 1] - matteG) * k + matteG;
-        b = (buffer[i + 2] - matteB) * k + matteB;
-        buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0;
-        buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0;
-        buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0;
-      }
-    },
-
-    createImageData: function PDFImage_createImageData(forceRGBA) {
-      var drawWidth = this.drawWidth;
-      var drawHeight = this.drawHeight;
-      var imgData = { // other fields are filled in below
-        width: drawWidth,
-        height: drawHeight
-      };
-
-      var numComps = this.numComps;
-      var originalWidth = this.width;
-      var originalHeight = this.height;
-      var bpc = this.bpc;
-
-      // Rows start at byte boundary.
-      var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;
-      var imgArray;
-
-      if (!forceRGBA) {
-        // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image
-        // without any complications, we pass a same-sized copy to the main
-        // thread rather than expanding by 32x to RGBA form. This saves *lots*
-        // of memory for many scanned documents. It's also much faster.
-        //
-        // Similarly, if it is a 24-bit-per pixel RGB image without any
-        // complications, we avoid expanding by 1.333x to RGBA form.
-        var kind;
-        if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {
-          kind = ImageKind.GRAYSCALE_1BPP;
-        } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 &&
-                   !this.needsDecode) {
-          kind = ImageKind.RGB_24BPP;
-        }
-        if (kind && !this.smask && !this.mask &&
-            drawWidth === originalWidth && drawHeight === originalHeight) {
-          imgData.kind = kind;
-
-          imgArray = this.getImageBytes(originalHeight * rowBytes);
-          // If imgArray came from a DecodeStream, we're safe to transfer it
-          // (and thus neuter it) because it will constitute the entire
-          // DecodeStream's data.  But if it came from a Stream, we need to
-          // copy it because it'll only be a portion of the Stream's data, and
-          // the rest will be read later on.
-          if (this.image instanceof DecodeStream) {
-            imgData.data = imgArray;
-          } else {
-            var newArray = new Uint8Array(imgArray.length);
-            newArray.set(imgArray);
-            imgData.data = newArray;
-          }
-          if (this.needsDecode) {
-            // Invert the buffer (which must be grayscale if we reached here).
-            assert(kind === ImageKind.GRAYSCALE_1BPP);
-            var buffer = imgData.data;
-            for (var i = 0, ii = buffer.length; i < ii; i++) {
-              buffer[i] ^= 0xff;
-            }
-          }
-          return imgData;
-        }
-        if (this.image instanceof JpegStream && !this.smask && !this.mask) {
-          imgData.kind = ImageKind.RGB_24BPP;
-          imgData.data = this.getImageBytes(originalHeight * rowBytes,
-                                            drawWidth, drawHeight, true);
-          return imgData;
-        }
-      }
-
-      imgArray = this.getImageBytes(originalHeight * rowBytes);
-      // imgArray can be incomplete (e.g. after CCITT fax encoding).
-      var actualHeight = 0 | (imgArray.length / rowBytes *
-                         drawHeight / originalHeight);
-
-      var comps = this.getComponents(imgArray);
-
-      // If opacity data is present, use RGBA_32BPP form. Otherwise, use the
-      // more compact RGB_24BPP form if allowable.
-      var alpha01, maybeUndoPreblend;
-      if (!forceRGBA && !this.smask && !this.mask) {
-        imgData.kind = ImageKind.RGB_24BPP;
-        imgData.data = new Uint8Array(drawWidth * drawHeight * 3);
-        alpha01 = 0;
-        maybeUndoPreblend = false;
-      } else {
-        imgData.kind = ImageKind.RGBA_32BPP;
-        imgData.data = new Uint8Array(drawWidth * drawHeight * 4);
-        alpha01 = 1;
-        maybeUndoPreblend = true;
-
-        // Color key masking (opacity) must be performed before decoding.
-        this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight,
-                         comps);
-      }
-
-      if (this.needsDecode) {
-        this.decodeBuffer(comps);
-      }
-      this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight,
-                              drawWidth, drawHeight, actualHeight, bpc, comps,
-                              alpha01);
-      if (maybeUndoPreblend) {
-        this.undoPreblend(imgData.data, drawWidth, actualHeight);
-      }
-
-      return imgData;
-    },
-
-    fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
-      var numComps = this.numComps;
-      if (numComps !== 1) {
-        error('Reading gray scale from a color image: ' + numComps);
-      }
-
-      var width = this.width;
-      var height = this.height;
-      var bpc = this.bpc;
-
-      // rows start at byte boundary
-      var rowBytes = (width * numComps * bpc + 7) >> 3;
-      var imgArray = this.getImageBytes(height * rowBytes);
-
-      var comps = this.getComponents(imgArray);
-      var i, length;
-
-      if (bpc === 1) {
-        // inline decoding (= inversion) for 1 bpc images
-        length = width * height;
-        if (this.needsDecode) {
-          // invert and scale to {0, 255}
-          for (i = 0; i < length; ++i) {
-            buffer[i] = (comps[i] - 1) & 255;
-          }
-        } else {
-          // scale to {0, 255}
-          for (i = 0; i < length; ++i) {
-            buffer[i] = (-comps[i]) & 255;
-          }
-        }
-        return;
-      }
-
-      if (this.needsDecode) {
-        this.decodeBuffer(comps);
-      }
-      length = width * height;
-      // we aren't using a colorspace so we need to scale the value
-      var scale = 255 / ((1 << bpc) - 1);
-      for (i = 0; i < length; ++i) {
-        buffer[i] = (scale * comps[i]) | 0;
-      }
-    },
-
-    getImageBytes: function PDFImage_getImageBytes(length,
-                                                   drawWidth, drawHeight,
-                                                   forceRGB) {
-      this.image.reset();
-      this.image.drawWidth = drawWidth || this.width;
-      this.image.drawHeight = drawHeight || this.height;
-      this.image.forceRGB = !!forceRGB;
-      return this.image.getBytes(length);
-    }
-  };
-  return PDFImage;
-})();
-
-
-// The Metrics object contains glyph widths (in glyph space units).
-// As per PDF spec, for most fonts (Type 3 being an exception) a glyph
-// space unit corresponds to 1/1000th of text space unit.
-var Metrics = {
-  'Courier': 600,
-  'Courier-Bold': 600,
-  'Courier-BoldOblique': 600,
-  'Courier-Oblique': 600,
-  'Helvetica' : {
-    'space': 278,
-    'exclam': 278,
-    'quotedbl': 355,
-    'numbersign': 556,
-    'dollar': 556,
-    'percent': 889,
-    'ampersand': 667,
-    'quoteright': 222,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 389,
-    'plus': 584,
-    'comma': 278,
-    'hyphen': 333,
-    'period': 278,
-    'slash': 278,
-    'zero': 556,
-    'one': 556,
-    'two': 556,
-    'three': 556,
-    'four': 556,
-    'five': 556,
-    'six': 556,
-    'seven': 556,
-    'eight': 556,
-    'nine': 556,
-    'colon': 278,
-    'semicolon': 278,
-    'less': 584,
-    'equal': 584,
-    'greater': 584,
-    'question': 556,
-    'at': 1015,
-    'A': 667,
-    'B': 667,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 722,
-    'I': 278,
-    'J': 500,
-    'K': 667,
-    'L': 556,
-    'M': 833,
-    'N': 722,
-    'O': 778,
-    'P': 667,
-    'Q': 778,
-    'R': 722,
-    'S': 667,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 944,
-    'X': 667,
-    'Y': 667,
-    'Z': 611,
-    'bracketleft': 278,
-    'backslash': 278,
-    'bracketright': 278,
-    'asciicircum': 469,
-    'underscore': 556,
-    'quoteleft': 222,
-    'a': 556,
-    'b': 556,
-    'c': 500,
-    'd': 556,
-    'e': 556,
-    'f': 278,
-    'g': 556,
-    'h': 556,
-    'i': 222,
-    'j': 222,
-    'k': 500,
-    'l': 222,
-    'm': 833,
-    'n': 556,
-    'o': 556,
-    'p': 556,
-    'q': 556,
-    'r': 333,
-    's': 500,
-    't': 278,
-    'u': 556,
-    'v': 500,
-    'w': 722,
-    'x': 500,
-    'y': 500,
-    'z': 500,
-    'braceleft': 334,
-    'bar': 260,
-    'braceright': 334,
-    'asciitilde': 584,
-    'exclamdown': 333,
-    'cent': 556,
-    'sterling': 556,
-    'fraction': 167,
-    'yen': 556,
-    'florin': 556,
-    'section': 556,
-    'currency': 556,
-    'quotesingle': 191,
-    'quotedblleft': 333,
-    'guillemotleft': 556,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 500,
-    'fl': 500,
-    'endash': 556,
-    'dagger': 556,
-    'daggerdbl': 556,
-    'periodcentered': 278,
-    'paragraph': 537,
-    'bullet': 350,
-    'quotesinglbase': 222,
-    'quotedblbase': 333,
-    'quotedblright': 333,
-    'guillemotright': 556,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 611,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 370,
-    'Lslash': 556,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 365,
-    'ae': 889,
-    'dotlessi': 278,
-    'lslash': 222,
-    'oslash': 611,
-    'oe': 944,
-    'germandbls': 611,
-    'Idieresis': 278,
-    'eacute': 556,
-    'abreve': 556,
-    'uhungarumlaut': 556,
-    'ecaron': 556,
-    'Ydieresis': 667,
-    'divide': 584,
-    'Yacute': 667,
-    'Acircumflex': 667,
-    'aacute': 556,
-    'Ucircumflex': 722,
-    'yacute': 500,
-    'scommaaccent': 500,
-    'ecircumflex': 556,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 556,
-    'Uacute': 722,
-    'uogonek': 556,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 737,
-    'Emacron': 667,
-    'ccaron': 500,
-    'aring': 556,
-    'Ncommaaccent': 722,
-    'lacute': 222,
-    'agrave': 556,
-    'Tcommaaccent': 611,
-    'Cacute': 722,
-    'atilde': 556,
-    'Edotaccent': 667,
-    'scaron': 500,
-    'scedilla': 500,
-    'iacute': 278,
-    'lozenge': 471,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 556,
-    'acircumflex': 556,
-    'Amacron': 667,
-    'rcaron': 333,
-    'ccedilla': 500,
-    'Zdotaccent': 611,
-    'Thorn': 667,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 667,
-    'dcaron': 643,
-    'Umacron': 722,
-    'uring': 556,
-    'threesuperior': 333,
-    'Ograve': 778,
-    'Agrave': 667,
-    'Abreve': 667,
-    'multiply': 584,
-    'uacute': 556,
-    'Tcaron': 611,
-    'partialdiff': 476,
-    'ydieresis': 500,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 556,
-    'edieresis': 556,
-    'cacute': 500,
-    'nacute': 556,
-    'umacron': 556,
-    'Ncaron': 722,
-    'Iacute': 278,
-    'plusminus': 584,
-    'brokenbar': 260,
-    'registered': 737,
-    'Gbreve': 778,
-    'Idotaccent': 278,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 333,
-    'omacron': 556,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 222,
-    'tcaron': 317,
-    'eogonek': 556,
-    'Uogonek': 722,
-    'Aacute': 667,
-    'Adieresis': 667,
-    'egrave': 556,
-    'zacute': 500,
-    'iogonek': 222,
-    'Oacute': 778,
-    'oacute': 556,
-    'amacron': 556,
-    'sacute': 500,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 556,
-    'twosuperior': 333,
-    'Odieresis': 778,
-    'mu': 556,
-    'igrave': 278,
-    'ohungarumlaut': 556,
-    'Eogonek': 667,
-    'dcroat': 556,
-    'threequarters': 834,
-    'Scedilla': 667,
-    'lcaron': 299,
-    'Kcommaaccent': 667,
-    'Lacute': 556,
-    'trademark': 1000,
-    'edotaccent': 556,
-    'Igrave': 278,
-    'Imacron': 278,
-    'Lcaron': 556,
-    'onehalf': 834,
-    'lessequal': 549,
-    'ocircumflex': 556,
-    'ntilde': 556,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 556,
-    'gbreve': 556,
-    'onequarter': 834,
-    'Scaron': 667,
-    'Scommaaccent': 667,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 556,
-    'Ccaron': 722,
-    'ugrave': 556,
-    'radical': 453,
-    'Dcaron': 722,
-    'rcommaaccent': 333,
-    'Ntilde': 722,
-    'otilde': 556,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 556,
-    'Atilde': 667,
-    'Aogonek': 667,
-    'Aring': 667,
-    'Otilde': 778,
-    'zdotaccent': 500,
-    'Ecaron': 667,
-    'Iogonek': 278,
-    'kcommaaccent': 500,
-    'minus': 584,
-    'Icircumflex': 278,
-    'ncaron': 556,
-    'tcommaaccent': 278,
-    'logicalnot': 584,
-    'odieresis': 556,
-    'udieresis': 556,
-    'notequal': 549,
-    'gcommaaccent': 556,
-    'eth': 556,
-    'zcaron': 500,
-    'ncommaaccent': 556,
-    'onesuperior': 333,
-    'imacron': 278,
-    'Euro': 556
-  },
-  'Helvetica-Bold': {
-    'space': 278,
-    'exclam': 333,
-    'quotedbl': 474,
-    'numbersign': 556,
-    'dollar': 556,
-    'percent': 889,
-    'ampersand': 722,
-    'quoteright': 278,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 389,
-    'plus': 584,
-    'comma': 278,
-    'hyphen': 333,
-    'period': 278,
-    'slash': 278,
-    'zero': 556,
-    'one': 556,
-    'two': 556,
-    'three': 556,
-    'four': 556,
-    'five': 556,
-    'six': 556,
-    'seven': 556,
-    'eight': 556,
-    'nine': 556,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 584,
-    'equal': 584,
-    'greater': 584,
-    'question': 611,
-    'at': 975,
-    'A': 722,
-    'B': 722,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 722,
-    'I': 278,
-    'J': 556,
-    'K': 722,
-    'L': 611,
-    'M': 833,
-    'N': 722,
-    'O': 778,
-    'P': 667,
-    'Q': 778,
-    'R': 722,
-    'S': 667,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 944,
-    'X': 667,
-    'Y': 667,
-    'Z': 611,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 584,
-    'underscore': 556,
-    'quoteleft': 278,
-    'a': 556,
-    'b': 611,
-    'c': 556,
-    'd': 611,
-    'e': 556,
-    'f': 333,
-    'g': 611,
-    'h': 611,
-    'i': 278,
-    'j': 278,
-    'k': 556,
-    'l': 278,
-    'm': 889,
-    'n': 611,
-    'o': 611,
-    'p': 611,
-    'q': 611,
-    'r': 389,
-    's': 556,
-    't': 333,
-    'u': 611,
-    'v': 556,
-    'w': 778,
-    'x': 556,
-    'y': 556,
-    'z': 500,
-    'braceleft': 389,
-    'bar': 280,
-    'braceright': 389,
-    'asciitilde': 584,
-    'exclamdown': 333,
-    'cent': 556,
-    'sterling': 556,
-    'fraction': 167,
-    'yen': 556,
-    'florin': 556,
-    'section': 556,
-    'currency': 556,
-    'quotesingle': 238,
-    'quotedblleft': 500,
-    'guillemotleft': 556,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 611,
-    'fl': 611,
-    'endash': 556,
-    'dagger': 556,
-    'daggerdbl': 556,
-    'periodcentered': 278,
-    'paragraph': 556,
-    'bullet': 350,
-    'quotesinglbase': 278,
-    'quotedblbase': 500,
-    'quotedblright': 500,
-    'guillemotright': 556,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 611,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 370,
-    'Lslash': 611,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 365,
-    'ae': 889,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 611,
-    'oe': 944,
-    'germandbls': 611,
-    'Idieresis': 278,
-    'eacute': 556,
-    'abreve': 556,
-    'uhungarumlaut': 611,
-    'ecaron': 556,
-    'Ydieresis': 667,
-    'divide': 584,
-    'Yacute': 667,
-    'Acircumflex': 722,
-    'aacute': 556,
-    'Ucircumflex': 722,
-    'yacute': 556,
-    'scommaaccent': 556,
-    'ecircumflex': 556,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 556,
-    'Uacute': 722,
-    'uogonek': 611,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 737,
-    'Emacron': 667,
-    'ccaron': 556,
-    'aring': 556,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 556,
-    'Tcommaaccent': 611,
-    'Cacute': 722,
-    'atilde': 556,
-    'Edotaccent': 667,
-    'scaron': 556,
-    'scedilla': 556,
-    'iacute': 278,
-    'lozenge': 494,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 611,
-    'acircumflex': 556,
-    'Amacron': 722,
-    'rcaron': 389,
-    'ccedilla': 556,
-    'Zdotaccent': 611,
-    'Thorn': 667,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 667,
-    'dcaron': 743,
-    'Umacron': 722,
-    'uring': 611,
-    'threesuperior': 333,
-    'Ograve': 778,
-    'Agrave': 722,
-    'Abreve': 722,
-    'multiply': 584,
-    'uacute': 611,
-    'Tcaron': 611,
-    'partialdiff': 494,
-    'ydieresis': 556,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 556,
-    'edieresis': 556,
-    'cacute': 556,
-    'nacute': 611,
-    'umacron': 611,
-    'Ncaron': 722,
-    'Iacute': 278,
-    'plusminus': 584,
-    'brokenbar': 280,
-    'registered': 737,
-    'Gbreve': 778,
-    'Idotaccent': 278,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 389,
-    'omacron': 611,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 278,
-    'tcaron': 389,
-    'eogonek': 556,
-    'Uogonek': 722,
-    'Aacute': 722,
-    'Adieresis': 722,
-    'egrave': 556,
-    'zacute': 500,
-    'iogonek': 278,
-    'Oacute': 778,
-    'oacute': 611,
-    'amacron': 556,
-    'sacute': 556,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 611,
-    'twosuperior': 333,
-    'Odieresis': 778,
-    'mu': 611,
-    'igrave': 278,
-    'ohungarumlaut': 611,
-    'Eogonek': 667,
-    'dcroat': 611,
-    'threequarters': 834,
-    'Scedilla': 667,
-    'lcaron': 400,
-    'Kcommaaccent': 722,
-    'Lacute': 611,
-    'trademark': 1000,
-    'edotaccent': 556,
-    'Igrave': 278,
-    'Imacron': 278,
-    'Lcaron': 611,
-    'onehalf': 834,
-    'lessequal': 549,
-    'ocircumflex': 611,
-    'ntilde': 611,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 556,
-    'gbreve': 611,
-    'onequarter': 834,
-    'Scaron': 667,
-    'Scommaaccent': 667,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 611,
-    'Ccaron': 722,
-    'ugrave': 611,
-    'radical': 549,
-    'Dcaron': 722,
-    'rcommaaccent': 389,
-    'Ntilde': 722,
-    'otilde': 611,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 611,
-    'Atilde': 722,
-    'Aogonek': 722,
-    'Aring': 722,
-    'Otilde': 778,
-    'zdotaccent': 500,
-    'Ecaron': 667,
-    'Iogonek': 278,
-    'kcommaaccent': 556,
-    'minus': 584,
-    'Icircumflex': 278,
-    'ncaron': 611,
-    'tcommaaccent': 333,
-    'logicalnot': 584,
-    'odieresis': 611,
-    'udieresis': 611,
-    'notequal': 549,
-    'gcommaaccent': 611,
-    'eth': 611,
-    'zcaron': 500,
-    'ncommaaccent': 611,
-    'onesuperior': 333,
-    'imacron': 278,
-    'Euro': 556
-  },
-  'Helvetica-BoldOblique': {
-    'space': 278,
-    'exclam': 333,
-    'quotedbl': 474,
-    'numbersign': 556,
-    'dollar': 556,
-    'percent': 889,
-    'ampersand': 722,
-    'quoteright': 278,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 389,
-    'plus': 584,
-    'comma': 278,
-    'hyphen': 333,
-    'period': 278,
-    'slash': 278,
-    'zero': 556,
-    'one': 556,
-    'two': 556,
-    'three': 556,
-    'four': 556,
-    'five': 556,
-    'six': 556,
-    'seven': 556,
-    'eight': 556,
-    'nine': 556,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 584,
-    'equal': 584,
-    'greater': 584,
-    'question': 611,
-    'at': 975,
-    'A': 722,
-    'B': 722,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 722,
-    'I': 278,
-    'J': 556,
-    'K': 722,
-    'L': 611,
-    'M': 833,
-    'N': 722,
-    'O': 778,
-    'P': 667,
-    'Q': 778,
-    'R': 722,
-    'S': 667,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 944,
-    'X': 667,
-    'Y': 667,
-    'Z': 611,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 584,
-    'underscore': 556,
-    'quoteleft': 278,
-    'a': 556,
-    'b': 611,
-    'c': 556,
-    'd': 611,
-    'e': 556,
-    'f': 333,
-    'g': 611,
-    'h': 611,
-    'i': 278,
-    'j': 278,
-    'k': 556,
-    'l': 278,
-    'm': 889,
-    'n': 611,
-    'o': 611,
-    'p': 611,
-    'q': 611,
-    'r': 389,
-    's': 556,
-    't': 333,
-    'u': 611,
-    'v': 556,
-    'w': 778,
-    'x': 556,
-    'y': 556,
-    'z': 500,
-    'braceleft': 389,
-    'bar': 280,
-    'braceright': 389,
-    'asciitilde': 584,
-    'exclamdown': 333,
-    'cent': 556,
-    'sterling': 556,
-    'fraction': 167,
-    'yen': 556,
-    'florin': 556,
-    'section': 556,
-    'currency': 556,
-    'quotesingle': 238,
-    'quotedblleft': 500,
-    'guillemotleft': 556,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 611,
-    'fl': 611,
-    'endash': 556,
-    'dagger': 556,
-    'daggerdbl': 556,
-    'periodcentered': 278,
-    'paragraph': 556,
-    'bullet': 350,
-    'quotesinglbase': 278,
-    'quotedblbase': 500,
-    'quotedblright': 500,
-    'guillemotright': 556,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 611,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 370,
-    'Lslash': 611,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 365,
-    'ae': 889,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 611,
-    'oe': 944,
-    'germandbls': 611,
-    'Idieresis': 278,
-    'eacute': 556,
-    'abreve': 556,
-    'uhungarumlaut': 611,
-    'ecaron': 556,
-    'Ydieresis': 667,
-    'divide': 584,
-    'Yacute': 667,
-    'Acircumflex': 722,
-    'aacute': 556,
-    'Ucircumflex': 722,
-    'yacute': 556,
-    'scommaaccent': 556,
-    'ecircumflex': 556,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 556,
-    'Uacute': 722,
-    'uogonek': 611,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 737,
-    'Emacron': 667,
-    'ccaron': 556,
-    'aring': 556,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 556,
-    'Tcommaaccent': 611,
-    'Cacute': 722,
-    'atilde': 556,
-    'Edotaccent': 667,
-    'scaron': 556,
-    'scedilla': 556,
-    'iacute': 278,
-    'lozenge': 494,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 611,
-    'acircumflex': 556,
-    'Amacron': 722,
-    'rcaron': 389,
-    'ccedilla': 556,
-    'Zdotaccent': 611,
-    'Thorn': 667,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 667,
-    'dcaron': 743,
-    'Umacron': 722,
-    'uring': 611,
-    'threesuperior': 333,
-    'Ograve': 778,
-    'Agrave': 722,
-    'Abreve': 722,
-    'multiply': 584,
-    'uacute': 611,
-    'Tcaron': 611,
-    'partialdiff': 494,
-    'ydieresis': 556,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 556,
-    'edieresis': 556,
-    'cacute': 556,
-    'nacute': 611,
-    'umacron': 611,
-    'Ncaron': 722,
-    'Iacute': 278,
-    'plusminus': 584,
-    'brokenbar': 280,
-    'registered': 737,
-    'Gbreve': 778,
-    'Idotaccent': 278,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 389,
-    'omacron': 611,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 278,
-    'tcaron': 389,
-    'eogonek': 556,
-    'Uogonek': 722,
-    'Aacute': 722,
-    'Adieresis': 722,
-    'egrave': 556,
-    'zacute': 500,
-    'iogonek': 278,
-    'Oacute': 778,
-    'oacute': 611,
-    'amacron': 556,
-    'sacute': 556,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 611,
-    'twosuperior': 333,
-    'Odieresis': 778,
-    'mu': 611,
-    'igrave': 278,
-    'ohungarumlaut': 611,
-    'Eogonek': 667,
-    'dcroat': 611,
-    'threequarters': 834,
-    'Scedilla': 667,
-    'lcaron': 400,
-    'Kcommaaccent': 722,
-    'Lacute': 611,
-    'trademark': 1000,
-    'edotaccent': 556,
-    'Igrave': 278,
-    'Imacron': 278,
-    'Lcaron': 611,
-    'onehalf': 834,
-    'lessequal': 549,
-    'ocircumflex': 611,
-    'ntilde': 611,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 556,
-    'gbreve': 611,
-    'onequarter': 834,
-    'Scaron': 667,
-    'Scommaaccent': 667,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 611,
-    'Ccaron': 722,
-    'ugrave': 611,
-    'radical': 549,
-    'Dcaron': 722,
-    'rcommaaccent': 389,
-    'Ntilde': 722,
-    'otilde': 611,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 611,
-    'Atilde': 722,
-    'Aogonek': 722,
-    'Aring': 722,
-    'Otilde': 778,
-    'zdotaccent': 500,
-    'Ecaron': 667,
-    'Iogonek': 278,
-    'kcommaaccent': 556,
-    'minus': 584,
-    'Icircumflex': 278,
-    'ncaron': 611,
-    'tcommaaccent': 333,
-    'logicalnot': 584,
-    'odieresis': 611,
-    'udieresis': 611,
-    'notequal': 549,
-    'gcommaaccent': 611,
-    'eth': 611,
-    'zcaron': 500,
-    'ncommaaccent': 611,
-    'onesuperior': 333,
-    'imacron': 278,
-    'Euro': 556
-  },
-  'Helvetica-Oblique' : {
-    'space': 278,
-    'exclam': 278,
-    'quotedbl': 355,
-    'numbersign': 556,
-    'dollar': 556,
-    'percent': 889,
-    'ampersand': 667,
-    'quoteright': 222,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 389,
-    'plus': 584,
-    'comma': 278,
-    'hyphen': 333,
-    'period': 278,
-    'slash': 278,
-    'zero': 556,
-    'one': 556,
-    'two': 556,
-    'three': 556,
-    'four': 556,
-    'five': 556,
-    'six': 556,
-    'seven': 556,
-    'eight': 556,
-    'nine': 556,
-    'colon': 278,
-    'semicolon': 278,
-    'less': 584,
-    'equal': 584,
-    'greater': 584,
-    'question': 556,
-    'at': 1015,
-    'A': 667,
-    'B': 667,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 722,
-    'I': 278,
-    'J': 500,
-    'K': 667,
-    'L': 556,
-    'M': 833,
-    'N': 722,
-    'O': 778,
-    'P': 667,
-    'Q': 778,
-    'R': 722,
-    'S': 667,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 944,
-    'X': 667,
-    'Y': 667,
-    'Z': 611,
-    'bracketleft': 278,
-    'backslash': 278,
-    'bracketright': 278,
-    'asciicircum': 469,
-    'underscore': 556,
-    'quoteleft': 222,
-    'a': 556,
-    'b': 556,
-    'c': 500,
-    'd': 556,
-    'e': 556,
-    'f': 278,
-    'g': 556,
-    'h': 556,
-    'i': 222,
-    'j': 222,
-    'k': 500,
-    'l': 222,
-    'm': 833,
-    'n': 556,
-    'o': 556,
-    'p': 556,
-    'q': 556,
-    'r': 333,
-    's': 500,
-    't': 278,
-    'u': 556,
-    'v': 500,
-    'w': 722,
-    'x': 500,
-    'y': 500,
-    'z': 500,
-    'braceleft': 334,
-    'bar': 260,
-    'braceright': 334,
-    'asciitilde': 584,
-    'exclamdown': 333,
-    'cent': 556,
-    'sterling': 556,
-    'fraction': 167,
-    'yen': 556,
-    'florin': 556,
-    'section': 556,
-    'currency': 556,
-    'quotesingle': 191,
-    'quotedblleft': 333,
-    'guillemotleft': 556,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 500,
-    'fl': 500,
-    'endash': 556,
-    'dagger': 556,
-    'daggerdbl': 556,
-    'periodcentered': 278,
-    'paragraph': 537,
-    'bullet': 350,
-    'quotesinglbase': 222,
-    'quotedblbase': 333,
-    'quotedblright': 333,
-    'guillemotright': 556,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 611,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 370,
-    'Lslash': 556,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 365,
-    'ae': 889,
-    'dotlessi': 278,
-    'lslash': 222,
-    'oslash': 611,
-    'oe': 944,
-    'germandbls': 611,
-    'Idieresis': 278,
-    'eacute': 556,
-    'abreve': 556,
-    'uhungarumlaut': 556,
-    'ecaron': 556,
-    'Ydieresis': 667,
-    'divide': 584,
-    'Yacute': 667,
-    'Acircumflex': 667,
-    'aacute': 556,
-    'Ucircumflex': 722,
-    'yacute': 500,
-    'scommaaccent': 500,
-    'ecircumflex': 556,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 556,
-    'Uacute': 722,
-    'uogonek': 556,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 737,
-    'Emacron': 667,
-    'ccaron': 500,
-    'aring': 556,
-    'Ncommaaccent': 722,
-    'lacute': 222,
-    'agrave': 556,
-    'Tcommaaccent': 611,
-    'Cacute': 722,
-    'atilde': 556,
-    'Edotaccent': 667,
-    'scaron': 500,
-    'scedilla': 500,
-    'iacute': 278,
-    'lozenge': 471,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 556,
-    'acircumflex': 556,
-    'Amacron': 667,
-    'rcaron': 333,
-    'ccedilla': 500,
-    'Zdotaccent': 611,
-    'Thorn': 667,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 667,
-    'dcaron': 643,
-    'Umacron': 722,
-    'uring': 556,
-    'threesuperior': 333,
-    'Ograve': 778,
-    'Agrave': 667,
-    'Abreve': 667,
-    'multiply': 584,
-    'uacute': 556,
-    'Tcaron': 611,
-    'partialdiff': 476,
-    'ydieresis': 500,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 556,
-    'edieresis': 556,
-    'cacute': 500,
-    'nacute': 556,
-    'umacron': 556,
-    'Ncaron': 722,
-    'Iacute': 278,
-    'plusminus': 584,
-    'brokenbar': 260,
-    'registered': 737,
-    'Gbreve': 778,
-    'Idotaccent': 278,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 333,
-    'omacron': 556,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 222,
-    'tcaron': 317,
-    'eogonek': 556,
-    'Uogonek': 722,
-    'Aacute': 667,
-    'Adieresis': 667,
-    'egrave': 556,
-    'zacute': 500,
-    'iogonek': 222,
-    'Oacute': 778,
-    'oacute': 556,
-    'amacron': 556,
-    'sacute': 500,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 556,
-    'twosuperior': 333,
-    'Odieresis': 778,
-    'mu': 556,
-    'igrave': 278,
-    'ohungarumlaut': 556,
-    'Eogonek': 667,
-    'dcroat': 556,
-    'threequarters': 834,
-    'Scedilla': 667,
-    'lcaron': 299,
-    'Kcommaaccent': 667,
-    'Lacute': 556,
-    'trademark': 1000,
-    'edotaccent': 556,
-    'Igrave': 278,
-    'Imacron': 278,
-    'Lcaron': 556,
-    'onehalf': 834,
-    'lessequal': 549,
-    'ocircumflex': 556,
-    'ntilde': 556,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 556,
-    'gbreve': 556,
-    'onequarter': 834,
-    'Scaron': 667,
-    'Scommaaccent': 667,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 556,
-    'Ccaron': 722,
-    'ugrave': 556,
-    'radical': 453,
-    'Dcaron': 722,
-    'rcommaaccent': 333,
-    'Ntilde': 722,
-    'otilde': 556,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 556,
-    'Atilde': 667,
-    'Aogonek': 667,
-    'Aring': 667,
-    'Otilde': 778,
-    'zdotaccent': 500,
-    'Ecaron': 667,
-    'Iogonek': 278,
-    'kcommaaccent': 500,
-    'minus': 584,
-    'Icircumflex': 278,
-    'ncaron': 556,
-    'tcommaaccent': 278,
-    'logicalnot': 584,
-    'odieresis': 556,
-    'udieresis': 556,
-    'notequal': 549,
-    'gcommaaccent': 556,
-    'eth': 556,
-    'zcaron': 500,
-    'ncommaaccent': 556,
-    'onesuperior': 333,
-    'imacron': 278,
-    'Euro': 556
-  },
-  'Symbol': {
-    'space': 250,
-    'exclam': 333,
-    'universal': 713,
-    'numbersign': 500,
-    'existential': 549,
-    'percent': 833,
-    'ampersand': 778,
-    'suchthat': 439,
-    'parenleft': 333,
-    'parenright': 333,
-    'asteriskmath': 500,
-    'plus': 549,
-    'comma': 250,
-    'minus': 549,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 278,
-    'semicolon': 278,
-    'less': 549,
-    'equal': 549,
-    'greater': 549,
-    'question': 444,
-    'congruent': 549,
-    'Alpha': 722,
-    'Beta': 667,
-    'Chi': 722,
-    'Delta': 612,
-    'Epsilon': 611,
-    'Phi': 763,
-    'Gamma': 603,
-    'Eta': 722,
-    'Iota': 333,
-    'theta1': 631,
-    'Kappa': 722,
-    'Lambda': 686,
-    'Mu': 889,
-    'Nu': 722,
-    'Omicron': 722,
-    'Pi': 768,
-    'Theta': 741,
-    'Rho': 556,
-    'Sigma': 592,
-    'Tau': 611,
-    'Upsilon': 690,
-    'sigma1': 439,
-    'Omega': 768,
-    'Xi': 645,
-    'Psi': 795,
-    'Zeta': 611,
-    'bracketleft': 333,
-    'therefore': 863,
-    'bracketright': 333,
-    'perpendicular': 658,
-    'underscore': 500,
-    'radicalex': 500,
-    'alpha': 631,
-    'beta': 549,
-    'chi': 549,
-    'delta': 494,
-    'epsilon': 439,
-    'phi': 521,
-    'gamma': 411,
-    'eta': 603,
-    'iota': 329,
-    'phi1': 603,
-    'kappa': 549,
-    'lambda': 549,
-    'mu': 576,
-    'nu': 521,
-    'omicron': 549,
-    'pi': 549,
-    'theta': 521,
-    'rho': 549,
-    'sigma': 603,
-    'tau': 439,
-    'upsilon': 576,
-    'omega1': 713,
-    'omega': 686,
-    'xi': 493,
-    'psi': 686,
-    'zeta': 494,
-    'braceleft': 480,
-    'bar': 200,
-    'braceright': 480,
-    'similar': 549,
-    'Euro': 750,
-    'Upsilon1': 620,
-    'minute': 247,
-    'lessequal': 549,
-    'fraction': 167,
-    'infinity': 713,
-    'florin': 500,
-    'club': 753,
-    'diamond': 753,
-    'heart': 753,
-    'spade': 753,
-    'arrowboth': 1042,
-    'arrowleft': 987,
-    'arrowup': 603,
-    'arrowright': 987,
-    'arrowdown': 603,
-    'degree': 400,
-    'plusminus': 549,
-    'second': 411,
-    'greaterequal': 549,
-    'multiply': 549,
-    'proportional': 713,
-    'partialdiff': 494,
-    'bullet': 460,
-    'divide': 549,
-    'notequal': 549,
-    'equivalence': 549,
-    'approxequal': 549,
-    'ellipsis': 1000,
-    'arrowvertex': 603,
-    'arrowhorizex': 1000,
-    'carriagereturn': 658,
-    'aleph': 823,
-    'Ifraktur': 686,
-    'Rfraktur': 795,
-    'weierstrass': 987,
-    'circlemultiply': 768,
-    'circleplus': 768,
-    'emptyset': 823,
-    'intersection': 768,
-    'union': 768,
-    'propersuperset': 713,
-    'reflexsuperset': 713,
-    'notsubset': 713,
-    'propersubset': 713,
-    'reflexsubset': 713,
-    'element': 713,
-    'notelement': 713,
-    'angle': 768,
-    'gradient': 713,
-    'registerserif': 790,
-    'copyrightserif': 790,
-    'trademarkserif': 890,
-    'product': 823,
-    'radical': 549,
-    'dotmath': 250,
-    'logicalnot': 713,
-    'logicaland': 603,
-    'logicalor': 603,
-    'arrowdblboth': 1042,
-    'arrowdblleft': 987,
-    'arrowdblup': 603,
-    'arrowdblright': 987,
-    'arrowdbldown': 603,
-    'lozenge': 494,
-    'angleleft': 329,
-    'registersans': 790,
-    'copyrightsans': 790,
-    'trademarksans': 786,
-    'summation': 713,
-    'parenlefttp': 384,
-    'parenleftex': 384,
-    'parenleftbt': 384,
-    'bracketlefttp': 384,
-    'bracketleftex': 384,
-    'bracketleftbt': 384,
-    'bracelefttp': 494,
-    'braceleftmid': 494,
-    'braceleftbt': 494,
-    'braceex': 494,
-    'angleright': 329,
-    'integral': 274,
-    'integraltp': 686,
-    'integralex': 686,
-    'integralbt': 686,
-    'parenrighttp': 384,
-    'parenrightex': 384,
-    'parenrightbt': 384,
-    'bracketrighttp': 384,
-    'bracketrightex': 384,
-    'bracketrightbt': 384,
-    'bracerighttp': 494,
-    'bracerightmid': 494,
-    'bracerightbt': 494,
-    'apple': 790
-  },
-  'Times-Roman': {
-    'space': 250,
-    'exclam': 333,
-    'quotedbl': 408,
-    'numbersign': 500,
-    'dollar': 500,
-    'percent': 833,
-    'ampersand': 778,
-    'quoteright': 333,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 500,
-    'plus': 564,
-    'comma': 250,
-    'hyphen': 333,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 278,
-    'semicolon': 278,
-    'less': 564,
-    'equal': 564,
-    'greater': 564,
-    'question': 444,
-    'at': 921,
-    'A': 722,
-    'B': 667,
-    'C': 667,
-    'D': 722,
-    'E': 611,
-    'F': 556,
-    'G': 722,
-    'H': 722,
-    'I': 333,
-    'J': 389,
-    'K': 722,
-    'L': 611,
-    'M': 889,
-    'N': 722,
-    'O': 722,
-    'P': 556,
-    'Q': 722,
-    'R': 667,
-    'S': 556,
-    'T': 611,
-    'U': 722,
-    'V': 722,
-    'W': 944,
-    'X': 722,
-    'Y': 722,
-    'Z': 611,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 469,
-    'underscore': 500,
-    'quoteleft': 333,
-    'a': 444,
-    'b': 500,
-    'c': 444,
-    'd': 500,
-    'e': 444,
-    'f': 333,
-    'g': 500,
-    'h': 500,
-    'i': 278,
-    'j': 278,
-    'k': 500,
-    'l': 278,
-    'm': 778,
-    'n': 500,
-    'o': 500,
-    'p': 500,
-    'q': 500,
-    'r': 333,
-    's': 389,
-    't': 278,
-    'u': 500,
-    'v': 500,
-    'w': 722,
-    'x': 500,
-    'y': 500,
-    'z': 444,
-    'braceleft': 480,
-    'bar': 200,
-    'braceright': 480,
-    'asciitilde': 541,
-    'exclamdown': 333,
-    'cent': 500,
-    'sterling': 500,
-    'fraction': 167,
-    'yen': 500,
-    'florin': 500,
-    'section': 500,
-    'currency': 500,
-    'quotesingle': 180,
-    'quotedblleft': 444,
-    'guillemotleft': 500,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 556,
-    'fl': 556,
-    'endash': 500,
-    'dagger': 500,
-    'daggerdbl': 500,
-    'periodcentered': 250,
-    'paragraph': 453,
-    'bullet': 350,
-    'quotesinglbase': 333,
-    'quotedblbase': 444,
-    'quotedblright': 444,
-    'guillemotright': 500,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 444,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 889,
-    'ordfeminine': 276,
-    'Lslash': 611,
-    'Oslash': 722,
-    'OE': 889,
-    'ordmasculine': 310,
-    'ae': 667,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 500,
-    'oe': 722,
-    'germandbls': 500,
-    'Idieresis': 333,
-    'eacute': 444,
-    'abreve': 444,
-    'uhungarumlaut': 500,
-    'ecaron': 444,
-    'Ydieresis': 722,
-    'divide': 564,
-    'Yacute': 722,
-    'Acircumflex': 722,
-    'aacute': 444,
-    'Ucircumflex': 722,
-    'yacute': 500,
-    'scommaaccent': 389,
-    'ecircumflex': 444,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 444,
-    'Uacute': 722,
-    'uogonek': 500,
-    'Edieresis': 611,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 760,
-    'Emacron': 611,
-    'ccaron': 444,
-    'aring': 444,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 444,
-    'Tcommaaccent': 611,
-    'Cacute': 667,
-    'atilde': 444,
-    'Edotaccent': 611,
-    'scaron': 389,
-    'scedilla': 389,
-    'iacute': 278,
-    'lozenge': 471,
-    'Rcaron': 667,
-    'Gcommaaccent': 722,
-    'ucircumflex': 500,
-    'acircumflex': 444,
-    'Amacron': 722,
-    'rcaron': 333,
-    'ccedilla': 444,
-    'Zdotaccent': 611,
-    'Thorn': 556,
-    'Omacron': 722,
-    'Racute': 667,
-    'Sacute': 556,
-    'dcaron': 588,
-    'Umacron': 722,
-    'uring': 500,
-    'threesuperior': 300,
-    'Ograve': 722,
-    'Agrave': 722,
-    'Abreve': 722,
-    'multiply': 564,
-    'uacute': 500,
-    'Tcaron': 611,
-    'partialdiff': 476,
-    'ydieresis': 500,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 611,
-    'adieresis': 444,
-    'edieresis': 444,
-    'cacute': 444,
-    'nacute': 500,
-    'umacron': 500,
-    'Ncaron': 722,
-    'Iacute': 333,
-    'plusminus': 564,
-    'brokenbar': 200,
-    'registered': 760,
-    'Gbreve': 722,
-    'Idotaccent': 333,
-    'summation': 600,
-    'Egrave': 611,
-    'racute': 333,
-    'omacron': 500,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 667,
-    'lcommaaccent': 278,
-    'tcaron': 326,
-    'eogonek': 444,
-    'Uogonek': 722,
-    'Aacute': 722,
-    'Adieresis': 722,
-    'egrave': 444,
-    'zacute': 444,
-    'iogonek': 278,
-    'Oacute': 722,
-    'oacute': 500,
-    'amacron': 444,
-    'sacute': 389,
-    'idieresis': 278,
-    'Ocircumflex': 722,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 500,
-    'twosuperior': 300,
-    'Odieresis': 722,
-    'mu': 500,
-    'igrave': 278,
-    'ohungarumlaut': 500,
-    'Eogonek': 611,
-    'dcroat': 500,
-    'threequarters': 750,
-    'Scedilla': 556,
-    'lcaron': 344,
-    'Kcommaaccent': 722,
-    'Lacute': 611,
-    'trademark': 980,
-    'edotaccent': 444,
-    'Igrave': 333,
-    'Imacron': 333,
-    'Lcaron': 611,
-    'onehalf': 750,
-    'lessequal': 549,
-    'ocircumflex': 500,
-    'ntilde': 500,
-    'Uhungarumlaut': 722,
-    'Eacute': 611,
-    'emacron': 444,
-    'gbreve': 500,
-    'onequarter': 750,
-    'Scaron': 556,
-    'Scommaaccent': 556,
-    'Ohungarumlaut': 722,
-    'degree': 400,
-    'ograve': 500,
-    'Ccaron': 667,
-    'ugrave': 500,
-    'radical': 453,
-    'Dcaron': 722,
-    'rcommaaccent': 333,
-    'Ntilde': 722,
-    'otilde': 500,
-    'Rcommaaccent': 667,
-    'Lcommaaccent': 611,
-    'Atilde': 722,
-    'Aogonek': 722,
-    'Aring': 722,
-    'Otilde': 722,
-    'zdotaccent': 444,
-    'Ecaron': 611,
-    'Iogonek': 333,
-    'kcommaaccent': 500,
-    'minus': 564,
-    'Icircumflex': 333,
-    'ncaron': 500,
-    'tcommaaccent': 278,
-    'logicalnot': 564,
-    'odieresis': 500,
-    'udieresis': 500,
-    'notequal': 549,
-    'gcommaaccent': 500,
-    'eth': 500,
-    'zcaron': 444,
-    'ncommaaccent': 500,
-    'onesuperior': 300,
-    'imacron': 278,
-    'Euro': 500
-  },
-  'Times-Bold': {
-    'space': 250,
-    'exclam': 333,
-    'quotedbl': 555,
-    'numbersign': 500,
-    'dollar': 500,
-    'percent': 1000,
-    'ampersand': 833,
-    'quoteright': 333,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 500,
-    'plus': 570,
-    'comma': 250,
-    'hyphen': 333,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 570,
-    'equal': 570,
-    'greater': 570,
-    'question': 500,
-    'at': 930,
-    'A': 722,
-    'B': 667,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 778,
-    'I': 389,
-    'J': 500,
-    'K': 778,
-    'L': 667,
-    'M': 944,
-    'N': 722,
-    'O': 778,
-    'P': 611,
-    'Q': 778,
-    'R': 722,
-    'S': 556,
-    'T': 667,
-    'U': 722,
-    'V': 722,
-    'W': 1000,
-    'X': 722,
-    'Y': 722,
-    'Z': 667,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 581,
-    'underscore': 500,
-    'quoteleft': 333,
-    'a': 500,
-    'b': 556,
-    'c': 444,
-    'd': 556,
-    'e': 444,
-    'f': 333,
-    'g': 500,
-    'h': 556,
-    'i': 278,
-    'j': 333,
-    'k': 556,
-    'l': 278,
-    'm': 833,
-    'n': 556,
-    'o': 500,
-    'p': 556,
-    'q': 556,
-    'r': 444,
-    's': 389,
-    't': 333,
-    'u': 556,
-    'v': 500,
-    'w': 722,
-    'x': 500,
-    'y': 500,
-    'z': 444,
-    'braceleft': 394,
-    'bar': 220,
-    'braceright': 394,
-    'asciitilde': 520,
-    'exclamdown': 333,
-    'cent': 500,
-    'sterling': 500,
-    'fraction': 167,
-    'yen': 500,
-    'florin': 500,
-    'section': 500,
-    'currency': 500,
-    'quotesingle': 278,
-    'quotedblleft': 500,
-    'guillemotleft': 500,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 556,
-    'fl': 556,
-    'endash': 500,
-    'dagger': 500,
-    'daggerdbl': 500,
-    'periodcentered': 250,
-    'paragraph': 540,
-    'bullet': 350,
-    'quotesinglbase': 333,
-    'quotedblbase': 500,
-    'quotedblright': 500,
-    'guillemotright': 500,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 500,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 300,
-    'Lslash': 667,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 330,
-    'ae': 722,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 500,
-    'oe': 722,
-    'germandbls': 556,
-    'Idieresis': 389,
-    'eacute': 444,
-    'abreve': 500,
-    'uhungarumlaut': 556,
-    'ecaron': 444,
-    'Ydieresis': 722,
-    'divide': 570,
-    'Yacute': 722,
-    'Acircumflex': 722,
-    'aacute': 500,
-    'Ucircumflex': 722,
-    'yacute': 500,
-    'scommaaccent': 389,
-    'ecircumflex': 444,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 500,
-    'Uacute': 722,
-    'uogonek': 556,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 747,
-    'Emacron': 667,
-    'ccaron': 444,
-    'aring': 500,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 500,
-    'Tcommaaccent': 667,
-    'Cacute': 722,
-    'atilde': 500,
-    'Edotaccent': 667,
-    'scaron': 389,
-    'scedilla': 389,
-    'iacute': 278,
-    'lozenge': 494,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 556,
-    'acircumflex': 500,
-    'Amacron': 722,
-    'rcaron': 444,
-    'ccedilla': 444,
-    'Zdotaccent': 667,
-    'Thorn': 611,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 556,
-    'dcaron': 672,
-    'Umacron': 722,
-    'uring': 556,
-    'threesuperior': 300,
-    'Ograve': 778,
-    'Agrave': 722,
-    'Abreve': 722,
-    'multiply': 570,
-    'uacute': 556,
-    'Tcaron': 667,
-    'partialdiff': 494,
-    'ydieresis': 500,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 500,
-    'edieresis': 444,
-    'cacute': 444,
-    'nacute': 556,
-    'umacron': 556,
-    'Ncaron': 722,
-    'Iacute': 389,
-    'plusminus': 570,
-    'brokenbar': 220,
-    'registered': 747,
-    'Gbreve': 778,
-    'Idotaccent': 389,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 444,
-    'omacron': 500,
-    'Zacute': 667,
-    'Zcaron': 667,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 278,
-    'tcaron': 416,
-    'eogonek': 444,
-    'Uogonek': 722,
-    'Aacute': 722,
-    'Adieresis': 722,
-    'egrave': 444,
-    'zacute': 444,
-    'iogonek': 278,
-    'Oacute': 778,
-    'oacute': 500,
-    'amacron': 500,
-    'sacute': 389,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 556,
-    'twosuperior': 300,
-    'Odieresis': 778,
-    'mu': 556,
-    'igrave': 278,
-    'ohungarumlaut': 500,
-    'Eogonek': 667,
-    'dcroat': 556,
-    'threequarters': 750,
-    'Scedilla': 556,
-    'lcaron': 394,
-    'Kcommaaccent': 778,
-    'Lacute': 667,
-    'trademark': 1000,
-    'edotaccent': 444,
-    'Igrave': 389,
-    'Imacron': 389,
-    'Lcaron': 667,
-    'onehalf': 750,
-    'lessequal': 549,
-    'ocircumflex': 500,
-    'ntilde': 556,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 444,
-    'gbreve': 500,
-    'onequarter': 750,
-    'Scaron': 556,
-    'Scommaaccent': 556,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 500,
-    'Ccaron': 722,
-    'ugrave': 556,
-    'radical': 549,
-    'Dcaron': 722,
-    'rcommaaccent': 444,
-    'Ntilde': 722,
-    'otilde': 500,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 667,
-    'Atilde': 722,
-    'Aogonek': 722,
-    'Aring': 722,
-    'Otilde': 778,
-    'zdotaccent': 444,
-    'Ecaron': 667,
-    'Iogonek': 389,
-    'kcommaaccent': 556,
-    'minus': 570,
-    'Icircumflex': 389,
-    'ncaron': 556,
-    'tcommaaccent': 333,
-    'logicalnot': 570,
-    'odieresis': 500,
-    'udieresis': 556,
-    'notequal': 549,
-    'gcommaaccent': 500,
-    'eth': 500,
-    'zcaron': 444,
-    'ncommaaccent': 556,
-    'onesuperior': 300,
-    'imacron': 278,
-    'Euro': 500
-  },
-  'Times-BoldItalic': {
-    'space': 250,
-    'exclam': 389,
-    'quotedbl': 555,
-    'numbersign': 500,
-    'dollar': 500,
-    'percent': 833,
-    'ampersand': 778,
-    'quoteright': 333,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 500,
-    'plus': 570,
-    'comma': 250,
-    'hyphen': 333,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 570,
-    'equal': 570,
-    'greater': 570,
-    'question': 500,
-    'at': 832,
-    'A': 667,
-    'B': 667,
-    'C': 667,
-    'D': 722,
-    'E': 667,
-    'F': 667,
-    'G': 722,
-    'H': 778,
-    'I': 389,
-    'J': 500,
-    'K': 667,
-    'L': 611,
-    'M': 889,
-    'N': 722,
-    'O': 722,
-    'P': 611,
-    'Q': 722,
-    'R': 667,
-    'S': 556,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 889,
-    'X': 667,
-    'Y': 611,
-    'Z': 611,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 570,
-    'underscore': 500,
-    'quoteleft': 333,
-    'a': 500,
-    'b': 500,
-    'c': 444,
-    'd': 500,
-    'e': 444,
-    'f': 333,
-    'g': 500,
-    'h': 556,
-    'i': 278,
-    'j': 278,
-    'k': 500,
-    'l': 278,
-    'm': 778,
-    'n': 556,
-    'o': 500,
-    'p': 500,
-    'q': 500,
-    'r': 389,
-    's': 389,
-    't': 278,
-    'u': 556,
-    'v': 444,
-    'w': 667,
-    'x': 500,
-    'y': 444,
-    'z': 389,
-    'braceleft': 348,
-    'bar': 220,
-    'braceright': 348,
-    'asciitilde': 570,
-    'exclamdown': 389,
-    'cent': 500,
-    'sterling': 500,
-    'fraction': 167,
-    'yen': 500,
-    'florin': 500,
-    'section': 500,
-    'currency': 500,
-    'quotesingle': 278,
-    'quotedblleft': 500,
-    'guillemotleft': 500,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 556,
-    'fl': 556,
-    'endash': 500,
-    'dagger': 500,
-    'daggerdbl': 500,
-    'periodcentered': 250,
-    'paragraph': 500,
-    'bullet': 350,
-    'quotesinglbase': 333,
-    'quotedblbase': 500,
-    'quotedblright': 500,
-    'guillemotright': 500,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 500,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 944,
-    'ordfeminine': 266,
-    'Lslash': 611,
-    'Oslash': 722,
-    'OE': 944,
-    'ordmasculine': 300,
-    'ae': 722,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 500,
-    'oe': 722,
-    'germandbls': 500,
-    'Idieresis': 389,
-    'eacute': 444,
-    'abreve': 500,
-    'uhungarumlaut': 556,
-    'ecaron': 444,
-    'Ydieresis': 611,
-    'divide': 570,
-    'Yacute': 611,
-    'Acircumflex': 667,
-    'aacute': 500,
-    'Ucircumflex': 722,
-    'yacute': 444,
-    'scommaaccent': 389,
-    'ecircumflex': 444,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 500,
-    'Uacute': 722,
-    'uogonek': 556,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 747,
-    'Emacron': 667,
-    'ccaron': 444,
-    'aring': 500,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 500,
-    'Tcommaaccent': 611,
-    'Cacute': 667,
-    'atilde': 500,
-    'Edotaccent': 667,
-    'scaron': 389,
-    'scedilla': 389,
-    'iacute': 278,
-    'lozenge': 494,
-    'Rcaron': 667,
-    'Gcommaaccent': 722,
-    'ucircumflex': 556,
-    'acircumflex': 500,
-    'Amacron': 667,
-    'rcaron': 389,
-    'ccedilla': 444,
-    'Zdotaccent': 611,
-    'Thorn': 611,
-    'Omacron': 722,
-    'Racute': 667,
-    'Sacute': 556,
-    'dcaron': 608,
-    'Umacron': 722,
-    'uring': 556,
-    'threesuperior': 300,
-    'Ograve': 722,
-    'Agrave': 667,
-    'Abreve': 667,
-    'multiply': 570,
-    'uacute': 556,
-    'Tcaron': 611,
-    'partialdiff': 494,
-    'ydieresis': 444,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 500,
-    'edieresis': 444,
-    'cacute': 444,
-    'nacute': 556,
-    'umacron': 556,
-    'Ncaron': 722,
-    'Iacute': 389,
-    'plusminus': 570,
-    'brokenbar': 220,
-    'registered': 747,
-    'Gbreve': 722,
-    'Idotaccent': 389,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 389,
-    'omacron': 500,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 667,
-    'lcommaaccent': 278,
-    'tcaron': 366,
-    'eogonek': 444,
-    'Uogonek': 722,
-    'Aacute': 667,
-    'Adieresis': 667,
-    'egrave': 444,
-    'zacute': 389,
-    'iogonek': 278,
-    'Oacute': 722,
-    'oacute': 500,
-    'amacron': 500,
-    'sacute': 389,
-    'idieresis': 278,
-    'Ocircumflex': 722,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 500,
-    'twosuperior': 300,
-    'Odieresis': 722,
-    'mu': 576,
-    'igrave': 278,
-    'ohungarumlaut': 500,
-    'Eogonek': 667,
-    'dcroat': 500,
-    'threequarters': 750,
-    'Scedilla': 556,
-    'lcaron': 382,
-    'Kcommaaccent': 667,
-    'Lacute': 611,
-    'trademark': 1000,
-    'edotaccent': 444,
-    'Igrave': 389,
-    'Imacron': 389,
-    'Lcaron': 611,
-    'onehalf': 750,
-    'lessequal': 549,
-    'ocircumflex': 500,
-    'ntilde': 556,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 444,
-    'gbreve': 500,
-    'onequarter': 750,
-    'Scaron': 556,
-    'Scommaaccent': 556,
-    'Ohungarumlaut': 722,
-    'degree': 400,
-    'ograve': 500,
-    'Ccaron': 667,
-    'ugrave': 556,
-    'radical': 549,
-    'Dcaron': 722,
-    'rcommaaccent': 389,
-    'Ntilde': 722,
-    'otilde': 500,
-    'Rcommaaccent': 667,
-    'Lcommaaccent': 611,
-    'Atilde': 667,
-    'Aogonek': 667,
-    'Aring': 667,
-    'Otilde': 722,
-    'zdotaccent': 389,
-    'Ecaron': 667,
-    'Iogonek': 389,
-    'kcommaaccent': 500,
-    'minus': 606,
-    'Icircumflex': 389,
-    'ncaron': 556,
-    'tcommaaccent': 278,
-    'logicalnot': 606,
-    'odieresis': 500,
-    'udieresis': 556,
-    'notequal': 549,
-    'gcommaaccent': 500,
-    'eth': 500,
-    'zcaron': 389,
-    'ncommaaccent': 556,
-    'onesuperior': 300,
-    'imacron': 278,
-    'Euro': 500
-  },
-  'Times-Italic': {
-    'space': 250,
-    'exclam': 333,
-    'quotedbl': 420,
-    'numbersign': 500,
-    'dollar': 500,
-    'percent': 833,
-    'ampersand': 778,
-    'quoteright': 333,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 500,
-    'plus': 675,
-    'comma': 250,
-    'hyphen': 333,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 675,
-    'equal': 675,
-    'greater': 675,
-    'question': 500,
-    'at': 920,
-    'A': 611,
-    'B': 611,
-    'C': 667,
-    'D': 722,
-    'E': 611,
-    'F': 611,
-    'G': 722,
-    'H': 722,
-    'I': 333,
-    'J': 444,
-    'K': 667,
-    'L': 556,
-    'M': 833,
-    'N': 667,
-    'O': 722,
-    'P': 611,
-    'Q': 722,
-    'R': 611,
-    'S': 500,
-    'T': 556,
-    'U': 722,
-    'V': 611,
-    'W': 833,
-    'X': 611,
-    'Y': 556,
-    'Z': 556,
-    'bracketleft': 389,
-    'backslash': 278,
-    'bracketright': 389,
-    'asciicircum': 422,
-    'underscore': 500,
-    'quoteleft': 333,
-    'a': 500,
-    'b': 500,
-    'c': 444,
-    'd': 500,
-    'e': 444,
-    'f': 278,
-    'g': 500,
-    'h': 500,
-    'i': 278,
-    'j': 278,
-    'k': 444,
-    'l': 278,
-    'm': 722,
-    'n': 500,
-    'o': 500,
-    'p': 500,
-    'q': 500,
-    'r': 389,
-    's': 389,
-    't': 278,
-    'u': 500,
-    'v': 444,
-    'w': 667,
-    'x': 444,
-    'y': 444,
-    'z': 389,
-    'braceleft': 400,
-    'bar': 275,
-    'braceright': 400,
-    'asciitilde': 541,
-    'exclamdown': 389,
-    'cent': 500,
-    'sterling': 500,
-    'fraction': 167,
-    'yen': 500,
-    'florin': 500,
-    'section': 500,
-    'currency': 500,
-    'quotesingle': 214,
-    'quotedblleft': 556,
-    'guillemotleft': 500,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 500,
-    'fl': 500,
-    'endash': 500,
-    'dagger': 500,
-    'daggerdbl': 500,
-    'periodcentered': 250,
-    'paragraph': 523,
-    'bullet': 350,
-    'quotesinglbase': 333,
-    'quotedblbase': 556,
-    'quotedblright': 556,
-    'guillemotright': 500,
-    'ellipsis': 889,
-    'perthousand': 1000,
-    'questiondown': 500,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 889,
-    'AE': 889,
-    'ordfeminine': 276,
-    'Lslash': 556,
-    'Oslash': 722,
-    'OE': 944,
-    'ordmasculine': 310,
-    'ae': 667,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 500,
-    'oe': 667,
-    'germandbls': 500,
-    'Idieresis': 333,
-    'eacute': 444,
-    'abreve': 500,
-    'uhungarumlaut': 500,
-    'ecaron': 444,
-    'Ydieresis': 556,
-    'divide': 675,
-    'Yacute': 556,
-    'Acircumflex': 611,
-    'aacute': 500,
-    'Ucircumflex': 722,
-    'yacute': 444,
-    'scommaaccent': 389,
-    'ecircumflex': 444,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 500,
-    'Uacute': 722,
-    'uogonek': 500,
-    'Edieresis': 611,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 760,
-    'Emacron': 611,
-    'ccaron': 444,
-    'aring': 500,
-    'Ncommaaccent': 667,
-    'lacute': 278,
-    'agrave': 500,
-    'Tcommaaccent': 556,
-    'Cacute': 667,
-    'atilde': 500,
-    'Edotaccent': 611,
-    'scaron': 389,
-    'scedilla': 389,
-    'iacute': 278,
-    'lozenge': 471,
-    'Rcaron': 611,
-    'Gcommaaccent': 722,
-    'ucircumflex': 500,
-    'acircumflex': 500,
-    'Amacron': 611,
-    'rcaron': 389,
-    'ccedilla': 444,
-    'Zdotaccent': 556,
-    'Thorn': 611,
-    'Omacron': 722,
-    'Racute': 611,
-    'Sacute': 500,
-    'dcaron': 544,
-    'Umacron': 722,
-    'uring': 500,
-    'threesuperior': 300,
-    'Ograve': 722,
-    'Agrave': 611,
-    'Abreve': 611,
-    'multiply': 675,
-    'uacute': 500,
-    'Tcaron': 556,
-    'partialdiff': 476,
-    'ydieresis': 444,
-    'Nacute': 667,
-    'icircumflex': 278,
-    'Ecircumflex': 611,
-    'adieresis': 500,
-    'edieresis': 444,
-    'cacute': 444,
-    'nacute': 500,
-    'umacron': 500,
-    'Ncaron': 667,
-    'Iacute': 333,
-    'plusminus': 675,
-    'brokenbar': 275,
-    'registered': 760,
-    'Gbreve': 722,
-    'Idotaccent': 333,
-    'summation': 600,
-    'Egrave': 611,
-    'racute': 389,
-    'omacron': 500,
-    'Zacute': 556,
-    'Zcaron': 556,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 667,
-    'lcommaaccent': 278,
-    'tcaron': 300,
-    'eogonek': 444,
-    'Uogonek': 722,
-    'Aacute': 611,
-    'Adieresis': 611,
-    'egrave': 444,
-    'zacute': 389,
-    'iogonek': 278,
-    'Oacute': 722,
-    'oacute': 500,
-    'amacron': 500,
-    'sacute': 389,
-    'idieresis': 278,
-    'Ocircumflex': 722,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 500,
-    'twosuperior': 300,
-    'Odieresis': 722,
-    'mu': 500,
-    'igrave': 278,
-    'ohungarumlaut': 500,
-    'Eogonek': 611,
-    'dcroat': 500,
-    'threequarters': 750,
-    'Scedilla': 500,
-    'lcaron': 300,
-    'Kcommaaccent': 667,
-    'Lacute': 556,
-    'trademark': 980,
-    'edotaccent': 444,
-    'Igrave': 333,
-    'Imacron': 333,
-    'Lcaron': 611,
-    'onehalf': 750,
-    'lessequal': 549,
-    'ocircumflex': 500,
-    'ntilde': 500,
-    'Uhungarumlaut': 722,
-    'Eacute': 611,
-    'emacron': 444,
-    'gbreve': 500,
-    'onequarter': 750,
-    'Scaron': 500,
-    'Scommaaccent': 500,
-    'Ohungarumlaut': 722,
-    'degree': 400,
-    'ograve': 500,
-    'Ccaron': 667,
-    'ugrave': 500,
-    'radical': 453,
-    'Dcaron': 722,
-    'rcommaaccent': 389,
-    'Ntilde': 667,
-    'otilde': 500,
-    'Rcommaaccent': 611,
-    'Lcommaaccent': 556,
-    'Atilde': 611,
-    'Aogonek': 611,
-    'Aring': 611,
-    'Otilde': 722,
-    'zdotaccent': 389,
-    'Ecaron': 611,
-    'Iogonek': 333,
-    'kcommaaccent': 444,
-    'minus': 675,
-    'Icircumflex': 333,
-    'ncaron': 500,
-    'tcommaaccent': 278,
-    'logicalnot': 675,
-    'odieresis': 500,
-    'udieresis': 500,
-    'notequal': 549,
-    'gcommaaccent': 500,
-    'eth': 500,
-    'zcaron': 389,
-    'ncommaaccent': 500,
-    'onesuperior': 300,
-    'imacron': 278,
-    'Euro': 500
-  },
-  'ZapfDingbats': {
-    'space': 278,
-    'a1': 974,
-    'a2': 961,
-    'a202': 974,
-    'a3': 980,
-    'a4': 719,
-    'a5': 789,
-    'a119': 790,
-    'a118': 791,
-    'a117': 690,
-    'a11': 960,
-    'a12': 939,
-    'a13': 549,
-    'a14': 855,
-    'a15': 911,
-    'a16': 933,
-    'a105': 911,
-    'a17': 945,
-    'a18': 974,
-    'a19': 755,
-    'a20': 846,
-    'a21': 762,
-    'a22': 761,
-    'a23': 571,
-    'a24': 677,
-    'a25': 763,
-    'a26': 760,
-    'a27': 759,
-    'a28': 754,
-    'a6': 494,
-    'a7': 552,
-    'a8': 537,
-    'a9': 577,
-    'a10': 692,
-    'a29': 786,
-    'a30': 788,
-    'a31': 788,
-    'a32': 790,
-    'a33': 793,
-    'a34': 794,
-    'a35': 816,
-    'a36': 823,
-    'a37': 789,
-    'a38': 841,
-    'a39': 823,
-    'a40': 833,
-    'a41': 816,
-    'a42': 831,
-    'a43': 923,
-    'a44': 744,
-    'a45': 723,
-    'a46': 749,
-    'a47': 790,
-    'a48': 792,
-    'a49': 695,
-    'a50': 776,
-    'a51': 768,
-    'a52': 792,
-    'a53': 759,
-    'a54': 707,
-    'a55': 708,
-    'a56': 682,
-    'a57': 701,
-    'a58': 826,
-    'a59': 815,
-    'a60': 789,
-    'a61': 789,
-    'a62': 707,
-    'a63': 687,
-    'a64': 696,
-    'a65': 689,
-    'a66': 786,
-    'a67': 787,
-    'a68': 713,
-    'a69': 791,
-    'a70': 785,
-    'a71': 791,
-    'a72': 873,
-    'a73': 761,
-    'a74': 762,
-    'a203': 762,
-    'a75': 759,
-    'a204': 759,
-    'a76': 892,
-    'a77': 892,
-    'a78': 788,
-    'a79': 784,
-    'a81': 438,
-    'a82': 138,
-    'a83': 277,
-    'a84': 415,
-    'a97': 392,
-    'a98': 392,
-    'a99': 668,
-    'a100': 668,
-    'a89': 390,
-    'a90': 390,
-    'a93': 317,
-    'a94': 317,
-    'a91': 276,
-    'a92': 276,
-    'a205': 509,
-    'a85': 509,
-    'a206': 410,
-    'a86': 410,
-    'a87': 234,
-    'a88': 234,
-    'a95': 334,
-    'a96': 334,
-    'a101': 732,
-    'a102': 544,
-    'a103': 544,
-    'a104': 910,
-    'a106': 667,
-    'a107': 760,
-    'a108': 760,
-    'a112': 776,
-    'a111': 595,
-    'a110': 694,
-    'a109': 626,
-    'a120': 788,
-    'a121': 788,
-    'a122': 788,
-    'a123': 788,
-    'a124': 788,
-    'a125': 788,
-    'a126': 788,
-    'a127': 788,
-    'a128': 788,
-    'a129': 788,
-    'a130': 788,
-    'a131': 788,
-    'a132': 788,
-    'a133': 788,
-    'a134': 788,
-    'a135': 788,
-    'a136': 788,
-    'a137': 788,
-    'a138': 788,
-    'a139': 788,
-    'a140': 788,
-    'a141': 788,
-    'a142': 788,
-    'a143': 788,
-    'a144': 788,
-    'a145': 788,
-    'a146': 788,
-    'a147': 788,
-    'a148': 788,
-    'a149': 788,
-    'a150': 788,
-    'a151': 788,
-    'a152': 788,
-    'a153': 788,
-    'a154': 788,
-    'a155': 788,
-    'a156': 788,
-    'a157': 788,
-    'a158': 788,
-    'a159': 788,
-    'a160': 894,
-    'a161': 838,
-    'a163': 1016,
-    'a164': 458,
-    'a196': 748,
-    'a165': 924,
-    'a192': 748,
-    'a166': 918,
-    'a167': 927,
-    'a168': 928,
-    'a169': 928,
-    'a170': 834,
-    'a171': 873,
-    'a172': 828,
-    'a173': 924,
-    'a162': 924,
-    'a174': 917,
-    'a175': 930,
-    'a176': 931,
-    'a177': 463,
-    'a178': 883,
-    'a179': 836,
-    'a193': 836,
-    'a180': 867,
-    'a199': 867,
-    'a181': 696,
-    'a200': 696,
-    'a182': 874,
-    'a201': 874,
-    'a183': 760,
-    'a184': 946,
-    'a197': 771,
-    'a185': 865,
-    'a194': 771,
-    'a198': 888,
-    'a186': 967,
-    'a195': 888,
-    'a187': 831,
-    'a188': 873,
-    'a189': 927,
-    'a190': 970,
-    'a191': 918
-  }
-};
-
-
-var EOF = {};
-
-function isEOF(v) {
-  return (v === EOF);
-}
-
-var MAX_LENGTH_TO_CACHE = 1000;
-
-var Parser = (function ParserClosure() {
-  function Parser(lexer, allowStreams, xref) {
-    this.lexer = lexer;
-    this.allowStreams = allowStreams;
-    this.xref = xref;
-    this.imageCache = {};
-    this.refill();
-  }
-
-  Parser.prototype = {
-    refill: function Parser_refill() {
-      this.buf1 = this.lexer.getObj();
-      this.buf2 = this.lexer.getObj();
-    },
-    shift: function Parser_shift() {
-      if (isCmd(this.buf2, 'ID')) {
-        this.buf1 = this.buf2;
-        this.buf2 = null;
-      } else {
-        this.buf1 = this.buf2;
-        this.buf2 = this.lexer.getObj();
-      }
-    },
-    getObj: function Parser_getObj(cipherTransform) {
-      var buf1 = this.buf1;
-      this.shift();
-
-      if (buf1 instanceof Cmd) {
-        switch (buf1.cmd) {
-          case 'BI': // inline image
-            return this.makeInlineImage(cipherTransform);
-          case '[': // array
-            var array = [];
-            while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) {
-              array.push(this.getObj(cipherTransform));
-            }
-            if (isEOF(this.buf1)) {
-              error('End of file inside array');
-            }
-            this.shift();
-            return array;
-          case '<<': // dictionary or stream
-            var dict = new Dict(this.xref);
-            while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
-              if (!isName(this.buf1)) {
-                info('Malformed dictionary: key must be a name object');
-                this.shift();
-                continue;
-              }
-
-              var key = this.buf1.name;
-              this.shift();
-              if (isEOF(this.buf1)) {
-                break;
-              }
-              dict.set(key, this.getObj(cipherTransform));
-            }
-            if (isEOF(this.buf1)) {
-              error('End of file inside dictionary');
-            }
-
-            // Stream objects are not allowed inside content streams or
-            // object streams.
-            if (isCmd(this.buf2, 'stream')) {
-              return (this.allowStreams ?
-                      this.makeStream(dict, cipherTransform) : dict);
-            }
-            this.shift();
-            return dict;
-          default: // simple object
-            return buf1;
-        }
-      }
-
-      if (isInt(buf1)) { // indirect reference or integer
-        var num = buf1;
-        if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
-          var ref = new Ref(num, this.buf1);
-          this.shift();
-          this.shift();
-          return ref;
-        }
-        return num;
-      }
-
-      if (isString(buf1)) { // string
-        var str = buf1;
-        if (cipherTransform) {
-          str = cipherTransform.decryptString(str);
-        }
-        return str;
-      }
-
-      // simple object
-      return buf1;
-    },
-    /**
-     * Find the end of the stream by searching for the /EI\s/.
-     * @returns {number} The inline stream length.
-     */
-    findDefaultInlineStreamEnd:
-        function Parser_findDefaultInlineStreamEnd(stream) {
-      var E = 0x45, I = 0x49, SPACE = 0x20, LF = 0xA, CR = 0xD;
-      var startPos = stream.pos, state = 0, ch, i, n, followingBytes;
-      while ((ch = stream.getByte()) !== -1) {
-        if (state === 0) {
-          state = (ch === E) ? 1 : 0;
-        } else if (state === 1) {
-          state = (ch === I) ? 2 : 0;
-        } else {
-          assert(state === 2);
-          if (ch === SPACE || ch === LF || ch === CR) {
-            // Let's check the next five bytes are ASCII... just be sure.
-            n = 5;
-            followingBytes = stream.peekBytes(n);
-            for (i = 0; i < n; i++) {
-              ch = followingBytes[i];
-              if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) {
-                // Not a LF, CR, SPACE or any visible ASCII character, i.e.
-                // it's binary stuff. Resetting the state.
-                state = 0;
-                break;
-              }
-            }
-            if (state === 2) {
-              break;  // Finished!
-            }
-          } else {
-            state = 0;
-          }
-        }
-      }
-      return ((stream.pos - 4) - startPos);
-    },
-    /**
-     * Find the EOI (end-of-image) marker 0xFFD9 of the stream.
-     * @returns {number} The inline stream length.
-     */
-    findDCTDecodeInlineStreamEnd:
-        function Parser_findDCTDecodeInlineStreamEnd(stream) {
-      var startPos = stream.pos, foundEOI = false, b, markerLength, length;
-      while ((b = stream.getByte()) !== -1) {
-        if (b !== 0xFF) { // Not a valid marker.
-          continue;
-        }
-        switch (stream.getByte()) {
-          case 0x00: // Byte stuffing.
-            // 0xFF00 appears to be a very common byte sequence in JPEG images.
-            break;
-
-          case 0xFF: // Fill byte.
-            // Avoid skipping a valid marker, resetting the stream position.
-            stream.skip(-1);
-            break;
-
-          case 0xD9: // EOI
-            foundEOI = true;
-            break;
-
-          case 0xC0: // SOF0
-          case 0xC1: // SOF1
-          case 0xC2: // SOF2
-          case 0xC3: // SOF3
-
-          case 0xC5: // SOF5
-          case 0xC6: // SOF6
-          case 0xC7: // SOF7
-
-          case 0xC9: // SOF9
-          case 0xCA: // SOF10
-          case 0xCB: // SOF11
-
-          case 0xCD: // SOF13
-          case 0xCE: // SOF14
-          case 0xCF: // SOF15
-
-          case 0xC4: // DHT
-          case 0xCC: // DAC
-
-          case 0xDA: // SOS
-          case 0xDB: // DQT
-          case 0xDC: // DNL
-          case 0xDD: // DRI
-          case 0xDE: // DHP
-          case 0xDF: // EXP
-
-          case 0xE0: // APP0
-          case 0xE1: // APP1
-          case 0xE2: // APP2
-          case 0xE3: // APP3
-          case 0xE4: // APP4
-          case 0xE5: // APP5
-          case 0xE6: // APP6
-          case 0xE7: // APP7
-          case 0xE8: // APP8
-          case 0xE9: // APP9
-          case 0xEA: // APP10
-          case 0xEB: // APP11
-          case 0xEC: // APP12
-          case 0xED: // APP13
-          case 0xEE: // APP14
-          case 0xEF: // APP15
-
-          case 0xFE: // COM
-            // The marker should be followed by the length of the segment.
-            markerLength = stream.getUint16();
-            if (markerLength > 2) {
-              // |markerLength| contains the byte length of the marker segment,
-              // including its own length (2 bytes) and excluding the marker.
-              stream.skip(markerLength - 2); // Jump to the next marker.
-            } else {
-              // The marker length is invalid, resetting the stream position.
-              stream.skip(-2);
-            }
-            break;
-        }
-        if (foundEOI) {
-          break;
-        }
-      }
-      length = stream.pos - startPos;
-      if (b === -1) {
-        warn('Inline DCTDecode image stream: ' +
-             'EOI marker not found, searching for /EI/ instead.');
-        stream.skip(-length); // Reset the stream position.
-        return this.findDefaultInlineStreamEnd(stream);
-      }
-      this.inlineStreamSkipEI(stream);
-      return length;
-    },
-    /**
-     * Find the EOD (end-of-data) marker '~>' (i.e. TILDE + GT) of the stream.
-     * @returns {number} The inline stream length.
-     */
-    findASCII85DecodeInlineStreamEnd:
-        function Parser_findASCII85DecodeInlineStreamEnd(stream) {
-      var TILDE = 0x7E, GT = 0x3E;
-      var startPos = stream.pos, ch, length;
-      while ((ch = stream.getByte()) !== -1) {
-        if (ch === TILDE && stream.peekByte() === GT) {
-          stream.skip();
-          break;
-        }
-      }
-      length = stream.pos - startPos;
-      if (ch === -1) {
-        warn('Inline ASCII85Decode image stream: ' +
-             'EOD marker not found, searching for /EI/ instead.');
-        stream.skip(-length); // Reset the stream position.
-        return this.findDefaultInlineStreamEnd(stream);
-      }
-      this.inlineStreamSkipEI(stream);
-      return length;
-    },
-    /**
-     * Find the EOD (end-of-data) marker '>' (i.e. GT) of the stream.
-     * @returns {number} The inline stream length.
-     */
-    findASCIIHexDecodeInlineStreamEnd:
-        function Parser_findASCIIHexDecodeInlineStreamEnd(stream) {
-      var GT = 0x3E;
-      var startPos = stream.pos, ch, length;
-      while ((ch = stream.getByte()) !== -1) {
-        if (ch === GT) {
-          break;
-        }
-      }
-      length = stream.pos - startPos;
-      if (ch === -1) {
-        warn('Inline ASCIIHexDecode image stream: ' +
-             'EOD marker not found, searching for /EI/ instead.');
-        stream.skip(-length); // Reset the stream position.
-        return this.findDefaultInlineStreamEnd(stream);
-      }
-      this.inlineStreamSkipEI(stream);
-      return length;
-    },
-    /**
-     * Skip over the /EI/ for streams where we search for an EOD marker.
-     */
-    inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) {
-      var E = 0x45, I = 0x49;
-      var state = 0, ch;
-      while ((ch = stream.getByte()) !== -1) {
-        if (state === 0) {
-          state = (ch === E) ? 1 : 0;
-        } else if (state === 1) {
-          state = (ch === I) ? 2 : 0;
-        } else if (state === 2) {
-          break;
-        }
-      }
-    },
-    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
-      var lexer = this.lexer;
-      var stream = lexer.stream;
-
-      // Parse dictionary.
-      var dict = new Dict(null);
-      while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
-        if (!isName(this.buf1)) {
-          error('Dictionary key must be a name object');
-        }
-        var key = this.buf1.name;
-        this.shift();
-        if (isEOF(this.buf1)) {
-          break;
-        }
-        dict.set(key, this.getObj(cipherTransform));
-      }
-
-      // Extract the name of the first (i.e. the current) image filter.
-      var filter = this.fetchIfRef(dict.get('Filter', 'F')), filterName;
-      if (isName(filter)) {
-        filterName = filter.name;
-      } else if (isArray(filter) && isName(filter[0])) {
-        filterName = filter[0].name;
-      }
-
-      // Parse image stream.
-      var startPos = stream.pos, length, i, ii;
-      if (filterName === 'DCTDecode' || filterName === 'DCT') {
-        length = this.findDCTDecodeInlineStreamEnd(stream);
-      } else if (filterName === 'ASCII85Decide' || filterName === 'A85') {
-        length = this.findASCII85DecodeInlineStreamEnd(stream);
-      } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') {
-        length = this.findASCIIHexDecodeInlineStreamEnd(stream);
-      } else {
-        length = this.findDefaultInlineStreamEnd(stream);
-      }
-      var imageStream = stream.makeSubStream(startPos, length, dict);
-
-      // Cache all images below the MAX_LENGTH_TO_CACHE threshold by their
-      // adler32 checksum.
-      var adler32;
-      if (length < MAX_LENGTH_TO_CACHE) {
-        var imageBytes = imageStream.getBytes();
-        imageStream.reset();
-
-        var a = 1;
-        var b = 0;
-        for (i = 0, ii = imageBytes.length; i < ii; ++i) {
-          // No modulo required in the loop if imageBytes.length < 5552.
-          a += imageBytes[i] & 0xff;
-          b += a;
-        }
-        adler32 = ((b % 65521) << 16) | (a % 65521);
-
-        if (this.imageCache.adler32 === adler32) {
-          this.buf2 = Cmd.get('EI');
-          this.shift();
-
-          this.imageCache[adler32].reset();
-          return this.imageCache[adler32];
-        }
-      }
-
-      if (cipherTransform) {
-        imageStream = cipherTransform.createStream(imageStream, length);
-      }
-
-      imageStream = this.filter(imageStream, dict, length);
-      imageStream.dict = dict;
-      if (adler32 !== undefined) {
-        imageStream.cacheKey = 'inline_' + length + '_' + adler32;
-        this.imageCache[adler32] = imageStream;
-      }
-
-      this.buf2 = Cmd.get('EI');
-      this.shift();
-
-      return imageStream;
-    },
-    fetchIfRef: function Parser_fetchIfRef(obj) {
-      // not relying on the xref.fetchIfRef -- xref might not be set
-      return (isRef(obj) ? this.xref.fetch(obj) : obj);
-    },
-    makeStream: function Parser_makeStream(dict, cipherTransform) {
-      var lexer = this.lexer;
-      var stream = lexer.stream;
-
-      // get stream start position
-      lexer.skipToNextLine();
-      var pos = stream.pos - 1;
-
-      // get length
-      var length = this.fetchIfRef(dict.get('Length'));
-      if (!isInt(length)) {
-        info('Bad ' + length + ' attribute in stream');
-        length = 0;
-      }
-
-      // skip over the stream data
-      stream.pos = pos + length;
-      lexer.nextChar();
-
-      this.shift(); // '>>'
-      this.shift(); // 'stream'
-      if (!isCmd(this.buf1, 'endstream')) {
-        // bad stream length, scanning for endstream
-        stream.pos = pos;
-        var SCAN_BLOCK_SIZE = 2048;
-        var ENDSTREAM_SIGNATURE_LENGTH = 9;
-        var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65,
-                                   0x61, 0x6D];
-        var skipped = 0, found = false, i, j;
-        while (stream.pos < stream.end) {
-          var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE);
-          var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH;
-          if (scanLength <= 0) {
-            break;
-          }
-          found = false;
-          for (i = 0, j = 0; i < scanLength; i++) {
-            var b = scanBytes[i];
-            if (b !== ENDSTREAM_SIGNATURE[j]) {
-              i -= j;
-              j = 0;
-            } else {
-              j++;
-              if (j >= ENDSTREAM_SIGNATURE_LENGTH) {
-                i++;
-                found = true;
-                break;
-              }
-            }
-          }
-          if (found) {
-            skipped += i - ENDSTREAM_SIGNATURE_LENGTH;
-            stream.pos += i - ENDSTREAM_SIGNATURE_LENGTH;
-            break;
-          }
-          skipped += scanLength;
-          stream.pos += scanLength;
-        }
-        if (!found) {
-          error('Missing endstream');
-        }
-        length = skipped;
-
-        lexer.nextChar();
-        this.shift();
-        this.shift();
-      }
-      this.shift(); // 'endstream'
-
-      stream = stream.makeSubStream(pos, length, dict);
-      if (cipherTransform) {
-        stream = cipherTransform.createStream(stream, length);
-      }
-      stream = this.filter(stream, dict, length);
-      stream.dict = dict;
-      return stream;
-    },
-    filter: function Parser_filter(stream, dict, length) {
-      var filter = this.fetchIfRef(dict.get('Filter', 'F'));
-      var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
-      if (isName(filter)) {
-        return this.makeFilter(stream, filter.name, length, params);
-      }
-
-      var maybeLength = length;
-      if (isArray(filter)) {
-        var filterArray = filter;
-        var paramsArray = params;
-        for (var i = 0, ii = filterArray.length; i < ii; ++i) {
-          filter = filterArray[i];
-          if (!isName(filter)) {
-            error('Bad filter name: ' + filter);
-          }
-
-          params = null;
-          if (isArray(paramsArray) && (i in paramsArray)) {
-            params = paramsArray[i];
-          }
-          stream = this.makeFilter(stream, filter.name, maybeLength, params);
-          // after the first stream the length variable is invalid
-          maybeLength = null;
-        }
-      }
-      return stream;
-    },
-    makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) {
-      if (stream.dict.get('Length') === 0) {
-        return new NullStream(stream);
-      }
-      try {
-        if (params) {
-          params = this.fetchIfRef(params);
-        }
-        var xrefStreamStats = this.xref.stats.streamTypes;
-        if (name === 'FlateDecode' || name === 'Fl') {
-          xrefStreamStats[StreamType.FLATE] = true;
-          if (params) {
-            return new PredictorStream(new FlateStream(stream, maybeLength),
-                                       maybeLength, params);
-          }
-          return new FlateStream(stream, maybeLength);
-        }
-        if (name === 'LZWDecode' || name === 'LZW') {
-          xrefStreamStats[StreamType.LZW] = true;
-          var earlyChange = 1;
-          if (params) {
-            if (params.has('EarlyChange')) {
-              earlyChange = params.get('EarlyChange');
-            }
-            return new PredictorStream(
-              new LZWStream(stream, maybeLength, earlyChange),
-              maybeLength, params);
-          }
-          return new LZWStream(stream, maybeLength, earlyChange);
-        }
-        if (name === 'DCTDecode' || name === 'DCT') {
-          xrefStreamStats[StreamType.DCT] = true;
-          return new JpegStream(stream, maybeLength, stream.dict, this.xref);
-        }
-        if (name === 'JPXDecode' || name === 'JPX') {
-          xrefStreamStats[StreamType.JPX] = true;
-          return new JpxStream(stream, maybeLength, stream.dict);
-        }
-        if (name === 'ASCII85Decode' || name === 'A85') {
-          xrefStreamStats[StreamType.A85] = true;
-          return new Ascii85Stream(stream, maybeLength);
-        }
-        if (name === 'ASCIIHexDecode' || name === 'AHx') {
-          xrefStreamStats[StreamType.AHX] = true;
-          return new AsciiHexStream(stream, maybeLength);
-        }
-        if (name === 'CCITTFaxDecode' || name === 'CCF') {
-          xrefStreamStats[StreamType.CCF] = true;
-          return new CCITTFaxStream(stream, maybeLength, params);
-        }
-        if (name === 'RunLengthDecode' || name === 'RL') {
-          xrefStreamStats[StreamType.RL] = true;
-          return new RunLengthStream(stream, maybeLength);
-        }
-        if (name === 'JBIG2Decode') {
-          xrefStreamStats[StreamType.JBIG] = true;
-          return new Jbig2Stream(stream, maybeLength, stream.dict);
-        }
-        warn('filter "' + name + '" not supported yet');
-        return stream;
-      } catch (ex) {
-        if (ex instanceof MissingDataException) {
-          throw ex;
-        }
-        warn('Invalid stream: \"' + ex + '\"');
-        return new NullStream(stream);
-      }
-    }
-  };
-
-  return Parser;
-})();
-
-var Lexer = (function LexerClosure() {
-  function Lexer(stream, knownCommands) {
-    this.stream = stream;
-    this.nextChar();
-
-    // While lexing, we build up many strings one char at a time. Using += for
-    // this can result in lots of garbage strings. It's better to build an
-    // array of single-char strings and then join() them together at the end.
-    // And reusing a single array (i.e. |this.strBuf|) over and over for this
-    // purpose uses less memory than using a new array for each string.
-    this.strBuf = [];
-
-    // The PDFs might have "glued" commands with other commands, operands or
-    // literals, e.g. "q1". The knownCommands is a dictionary of the valid
-    // commands and their prefixes. The prefixes are built the following way:
-    // if there a command that is a prefix of the other valid command or
-    // literal (e.g. 'f' and 'false') the following prefixes must be included,
-    // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no
-    // other commands or literals as a prefix. The knowCommands is optional.
-    this.knownCommands = knownCommands;
-  }
-
-  Lexer.isSpace = function Lexer_isSpace(ch) {
-    // Space is one of the following characters: SPACE, TAB, CR or LF.
-    return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A);
-  };
-
-  // A '1' in this array means the character is white space. A '1' or
-  // '2' means the character ends a name or command.
-  var specialChars = [
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
-    1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  // fx
-  ];
-
-  function toHexDigit(ch) {
-    if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'
-      return ch & 0x0F;
-    }
-    if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {
-      // 'A'-'F', 'a'-'f'
-      return (ch & 0x0F) + 9;
-    }
-    return -1;
-  }
-
-  Lexer.prototype = {
-    nextChar: function Lexer_nextChar() {
-      return (this.currentChar = this.stream.getByte());
-    },
-    peekChar: function Lexer_peekChar() {
-      return this.stream.peekByte();
-    },
-    getNumber: function Lexer_getNumber() {
-      var ch = this.currentChar;
-      var eNotation = false;
-      var divideBy = 0; // different from 0 if it's a floating point value
-      var sign = 1;
-
-      if (ch === 0x2D) { // '-'
-        sign = -1;
-        ch = this.nextChar();
-      } else if (ch === 0x2B) { // '+'
-        ch = this.nextChar();
-      }
-      if (ch === 0x2E) { // '.'
-        divideBy = 10;
-        ch = this.nextChar();
-      }
-      if (ch < 0x30 || ch > 0x39) { // '0' - '9'
-        error('Invalid number: ' + String.fromCharCode(ch));
-        return 0;
-      }
-
-      var baseValue = ch - 0x30; // '0'
-      var powerValue = 0;
-      var powerValueSign = 1;
-
-      while ((ch = this.nextChar()) >= 0) {
-        if (0x30 <= ch && ch <= 0x39) { // '0' - '9'
-          var currentDigit = ch - 0x30; // '0'
-          if (eNotation) { // We are after an 'e' or 'E'
-            powerValue = powerValue * 10 + currentDigit;
-          } else {
-            if (divideBy !== 0) { // We are after a point
-              divideBy *= 10;
-            }
-            baseValue = baseValue * 10 + currentDigit;
-          }
-        } else if (ch === 0x2E) { // '.'
-          if (divideBy === 0) {
-            divideBy = 1;
-          } else {
-            // A number can have only one '.'
-            break;
-          }
-        } else if (ch === 0x2D) { // '-'
-          // ignore minus signs in the middle of numbers to match
-          // Adobe's behavior
-          warn('Badly formated number');
-        } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e'
-          // 'E' can be either a scientific notation or the beginning of a new
-          // operator
-          ch = this.peekChar();
-          if (ch === 0x2B || ch === 0x2D) { // '+', '-'
-            powerValueSign = (ch === 0x2D) ? -1 : 1;
-            this.nextChar(); // Consume the sign character
-          } else if (ch < 0x30 || ch > 0x39) { // '0' - '9'
-            // The 'E' must be the beginning of a new operator
-            break;
-          }
-          eNotation = true;
-        } else {
-          // the last character doesn't belong to us
-          break;
-        }
-      }
-
-      if (divideBy !== 0) {
-        baseValue /= divideBy;
-      }
-      if (eNotation) {
-        baseValue *= Math.pow(10, powerValueSign * powerValue);
-      }
-      return sign * baseValue;
-    },
-    getString: function Lexer_getString() {
-      var numParen = 1;
-      var done = false;
-      var strBuf = this.strBuf;
-      strBuf.length = 0;
-
-      var ch = this.nextChar();
-      while (true) {
-        var charBuffered = false;
-        switch (ch | 0) {
-          case -1:
-            warn('Unterminated string');
-            done = true;
-            break;
-          case 0x28: // '('
-            ++numParen;
-            strBuf.push('(');
-            break;
-          case 0x29: // ')'
-            if (--numParen === 0) {
-              this.nextChar(); // consume strings ')'
-              done = true;
-            } else {
-              strBuf.push(')');
-            }
-            break;
-          case 0x5C: // '\\'
-            ch = this.nextChar();
-            switch (ch) {
-              case -1:
-                warn('Unterminated string');
-                done = true;
-                break;
-              case 0x6E: // 'n'
-                strBuf.push('\n');
-                break;
-              case 0x72: // 'r'
-                strBuf.push('\r');
-                break;
-              case 0x74: // 't'
-                strBuf.push('\t');
-                break;
-              case 0x62: // 'b'
-                strBuf.push('\b');
-                break;
-              case 0x66: // 'f'
-                strBuf.push('\f');
-                break;
-              case 0x5C: // '\'
-              case 0x28: // '('
-              case 0x29: // ')'
-                strBuf.push(String.fromCharCode(ch));
-                break;
-              case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3'
-              case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7'
-                var x = ch & 0x0F;
-                ch = this.nextChar();
-                charBuffered = true;
-                if (ch >= 0x30 && ch <= 0x37) { // '0'-'7'
-                  x = (x << 3) + (ch & 0x0F);
-                  ch = this.nextChar();
-                  if (ch >= 0x30 && ch <= 0x37) {  // '0'-'7'
-                    charBuffered = false;
-                    x = (x << 3) + (ch & 0x0F);
-                  }
-                }
-                strBuf.push(String.fromCharCode(x));
-                break;
-              case 0x0D: // CR
-                if (this.peekChar() === 0x0A) { // LF
-                  this.nextChar();
-                }
-                break;
-              case 0x0A: // LF
-                break;
-              default:
-                strBuf.push(String.fromCharCode(ch));
-                break;
-            }
-            break;
-          default:
-            strBuf.push(String.fromCharCode(ch));
-            break;
-        }
-        if (done) {
-          break;
-        }
-        if (!charBuffered) {
-          ch = this.nextChar();
-        }
-      }
-      return strBuf.join('');
-    },
-    getName: function Lexer_getName() {
-      var ch;
-      var strBuf = this.strBuf;
-      strBuf.length = 0;
-      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
-        if (ch === 0x23) { // '#'
-          ch = this.nextChar();
-          var x = toHexDigit(ch);
-          if (x !== -1) {
-            var x2 = toHexDigit(this.nextChar());
-            if (x2 === -1) {
-              error('Illegal digit in hex char in name: ' + x2);
-            }
-            strBuf.push(String.fromCharCode((x << 4) | x2));
-          } else {
-            strBuf.push('#', String.fromCharCode(ch));
-          }
-        } else {
-          strBuf.push(String.fromCharCode(ch));
-        }
-      }
-      if (strBuf.length > 128) {
-        error('Warning: name token is longer than allowed by the spec: ' +
-              strBuf.length);
-      }
-      return Name.get(strBuf.join(''));
-    },
-    getHexString: function Lexer_getHexString() {
-      var strBuf = this.strBuf;
-      strBuf.length = 0;
-      var ch = this.currentChar;
-      var isFirstHex = true;
-      var firstDigit;
-      var secondDigit;
-      while (true) {
-        if (ch < 0) {
-          warn('Unterminated hex string');
-          break;
-        } else if (ch === 0x3E) { // '>'
-          this.nextChar();
-          break;
-        } else if (specialChars[ch] === 1) {
-          ch = this.nextChar();
-          continue;
-        } else {
-          if (isFirstHex) {
-            firstDigit = toHexDigit(ch);
-            if (firstDigit === -1) {
-              warn('Ignoring invalid character "' + ch + '" in hex string');
-              ch = this.nextChar();
-              continue;
-            }
-          } else {
-            secondDigit = toHexDigit(ch);
-            if (secondDigit === -1) {
-              warn('Ignoring invalid character "' + ch + '" in hex string');
-              ch = this.nextChar();
-              continue;
-            }
-            strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit));
-          }
-          isFirstHex = !isFirstHex;
-          ch = this.nextChar();
-        }
-      }
-      return strBuf.join('');
-    },
-    getObj: function Lexer_getObj() {
-      // skip whitespace and comments
-      var comment = false;
-      var ch = this.currentChar;
-      while (true) {
-        if (ch < 0) {
-          return EOF;
-        }
-        if (comment) {
-          if (ch === 0x0A || ch === 0x0D) { // LF, CR
-            comment = false;
-          }
-        } else if (ch === 0x25) { // '%'
-          comment = true;
-        } else if (specialChars[ch] !== 1) {
-          break;
-        }
-        ch = this.nextChar();
-      }
-
-      // start reading token
-      switch (ch | 0) {
-        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'
-        case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'
-        case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'
-          return this.getNumber();
-        case 0x28: // '('
-          return this.getString();
-        case 0x2F: // '/'
-          return this.getName();
-        // array punctuation
-        case 0x5B: // '['
-          this.nextChar();
-          return Cmd.get('[');
-        case 0x5D: // ']'
-          this.nextChar();
-          return Cmd.get(']');
-        // hex string or dict punctuation
-        case 0x3C: // '<'
-          ch = this.nextChar();
-          if (ch === 0x3C) {
-            // dict punctuation
-            this.nextChar();
-            return Cmd.get('<<');
-          }
-          return this.getHexString();
-        // dict punctuation
-        case 0x3E: // '>'
-          ch = this.nextChar();
-          if (ch === 0x3E) {
-            this.nextChar();
-            return Cmd.get('>>');
-          }
-          return Cmd.get('>');
-        case 0x7B: // '{'
-          this.nextChar();
-          return Cmd.get('{');
-        case 0x7D: // '}'
-          this.nextChar();
-          return Cmd.get('}');
-        case 0x29: // ')'
-          error('Illegal character: ' + ch);
-          break;
-      }
-
-      // command
-      var str = String.fromCharCode(ch);
-      var knownCommands = this.knownCommands;
-      var knownCommandFound = knownCommands && knownCommands[str] !== undefined;
-      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
-        // stop if known command is found and next character does not make
-        // the str a command
-        var possibleCommand = str + String.fromCharCode(ch);
-        if (knownCommandFound && knownCommands[possibleCommand] === undefined) {
-          break;
-        }
-        if (str.length === 128) {
-          error('Command token too long: ' + str.length);
-        }
-        str = possibleCommand;
-        knownCommandFound = knownCommands && knownCommands[str] !== undefined;
-      }
-      if (str === 'true') {
-        return true;
-      }
-      if (str === 'false') {
-        return false;
-      }
-      if (str === 'null') {
-        return null;
-      }
-      return Cmd.get(str);
-    },
-    skipToNextLine: function Lexer_skipToNextLine() {
-      var ch = this.currentChar;
-      while (ch >= 0) {
-        if (ch === 0x0D) { // CR
-          ch = this.nextChar();
-          if (ch === 0x0A) { // LF
-            this.nextChar();
-          }
-          break;
-        } else if (ch === 0x0A) { // LF
-          this.nextChar();
-          break;
-        }
-        ch = this.nextChar();
-      }
-    }
-  };
-
-  return Lexer;
-})();
-
-var Linearization = {
-  create: function LinearizationCreate(stream) {
-    function getInt(name, allowZeroValue) {
-      var obj = linDict.get(name);
-      if (isInt(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {
-        return obj;
-      }
-      throw new Error('The "' + name + '" parameter in the linearization ' +
-                      'dictionary is invalid.');
-    }
-    function getHints() {
-      var hints = linDict.get('H'), hintsLength, item;
-      if (isArray(hints) &&
-          ((hintsLength = hints.length) === 2 || hintsLength === 4)) {
-        for (var index = 0; index < hintsLength; index++) {
-          if (!(isInt(item = hints[index]) && item > 0)) {
-            throw new Error('Hint (' + index +
-                            ') in the linearization dictionary is invalid.');
-          }
-        }
-        return hints;
-      }
-      throw new Error('Hint array in the linearization dictionary is invalid.');
-    }
-    var parser = new Parser(new Lexer(stream), false, null);
-    var obj1 = parser.getObj();
-    var obj2 = parser.getObj();
-    var obj3 = parser.getObj();
-    var linDict = parser.getObj();
-    var obj, length;
-    if (!(isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && isDict(linDict) &&
-          isNum(obj = linDict.get('Linearized')) && obj > 0)) {
-      return null; // No valid linearization dictionary found.
-    } else if ((length = getInt('L')) !== stream.length) {
-      throw new Error('The "L" parameter in the linearization dictionary ' +
-                      'does not equal the stream length.');
-    }
-    return {
-      length: length,
-      hints: getHints(),
-      objectNumberFirst: getInt('O'),
-      endFirst: getInt('E'),
-      numPages: getInt('N'),
-      mainXRefEntriesOffset: getInt('T'),
-      pageFirst: (linDict.has('P') ? getInt('P', true) : 0)
-    };
-  }
-};
-
-
-var PostScriptParser = (function PostScriptParserClosure() {
-  function PostScriptParser(lexer) {
-    this.lexer = lexer;
-    this.operators = [];
-    this.token = null;
-    this.prev = null;
-  }
-  PostScriptParser.prototype = {
-    nextToken: function PostScriptParser_nextToken() {
-      this.prev = this.token;
-      this.token = this.lexer.getToken();
-    },
-    accept: function PostScriptParser_accept(type) {
-      if (this.token.type === type) {
-        this.nextToken();
-        return true;
-      }
-      return false;
-    },
-    expect: function PostScriptParser_expect(type) {
-      if (this.accept(type)) {
-        return true;
-      }
-      error('Unexpected symbol: found ' + this.token.type + ' expected ' +
-        type + '.');
-    },
-    parse: function PostScriptParser_parse() {
-      this.nextToken();
-      this.expect(PostScriptTokenTypes.LBRACE);
-      this.parseBlock();
-      this.expect(PostScriptTokenTypes.RBRACE);
-      return this.operators;
-    },
-    parseBlock: function PostScriptParser_parseBlock() {
-      while (true) {
-        if (this.accept(PostScriptTokenTypes.NUMBER)) {
-          this.operators.push(this.prev.value);
-        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
-          this.operators.push(this.prev.value);
-        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-          this.parseCondition();
-        } else {
-          return;
-        }
-      }
-    },
-    parseCondition: function PostScriptParser_parseCondition() {
-      // Add two place holders that will be updated later
-      var conditionLocation = this.operators.length;
-      this.operators.push(null, null);
-
-      this.parseBlock();
-      this.expect(PostScriptTokenTypes.RBRACE);
-      if (this.accept(PostScriptTokenTypes.IF)) {
-        // The true block is right after the 'if' so it just falls through on
-        // true else it jumps and skips the true block.
-        this.operators[conditionLocation] = this.operators.length;
-        this.operators[conditionLocation + 1] = 'jz';
-      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-        var jumpLocation = this.operators.length;
-        this.operators.push(null, null);
-        var endOfTrue = this.operators.length;
-        this.parseBlock();
-        this.expect(PostScriptTokenTypes.RBRACE);
-        this.expect(PostScriptTokenTypes.IFELSE);
-        // The jump is added at the end of the true block to skip the false
-        // block.
-        this.operators[jumpLocation] = this.operators.length;
-        this.operators[jumpLocation + 1] = 'j';
-
-        this.operators[conditionLocation] = endOfTrue;
-        this.operators[conditionLocation + 1] = 'jz';
-      } else {
-        error('PS Function: error parsing conditional.');
-      }
-    }
-  };
-  return PostScriptParser;
-})();
-
-var PostScriptTokenTypes = {
-  LBRACE: 0,
-  RBRACE: 1,
-  NUMBER: 2,
-  OPERATOR: 3,
-  IF: 4,
-  IFELSE: 5
-};
-
-var PostScriptToken = (function PostScriptTokenClosure() {
-  function PostScriptToken(type, value) {
-    this.type = type;
-    this.value = value;
-  }
-
-  var opCache = {};
-
-  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
-    var opValue = opCache[op];
-    if (opValue) {
-      return opValue;
-    }
-    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
-  };
-
-  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
-    '{');
-  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
-    '}');
-  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
-  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
-    'IFELSE');
-  return PostScriptToken;
-})();
-
-var PostScriptLexer = (function PostScriptLexerClosure() {
-  function PostScriptLexer(stream) {
-    this.stream = stream;
-    this.nextChar();
-
-    this.strBuf = [];
-  }
-  PostScriptLexer.prototype = {
-    nextChar: function PostScriptLexer_nextChar() {
-      return (this.currentChar = this.stream.getByte());
-    },
-    getToken: function PostScriptLexer_getToken() {
-      var comment = false;
-      var ch = this.currentChar;
-
-      // skip comments
-      while (true) {
-        if (ch < 0) {
-          return EOF;
-        }
-
-        if (comment) {
-          if (ch === 0x0A || ch === 0x0D) {
-            comment = false;
-          }
-        } else if (ch === 0x25) { // '%'
-          comment = true;
-        } else if (!Lexer.isSpace(ch)) {
-          break;
-        }
-        ch = this.nextChar();
-      }
-      switch (ch | 0) {
-        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'
-        case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'
-        case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'
-          return new PostScriptToken(PostScriptTokenTypes.NUMBER,
-                                     this.getNumber());
-        case 0x7B: // '{'
-          this.nextChar();
-          return PostScriptToken.LBRACE;
-        case 0x7D: // '}'
-          this.nextChar();
-          return PostScriptToken.RBRACE;
-      }
-      // operator
-      var strBuf = this.strBuf;
-      strBuf.length = 0;
-      strBuf[0] = String.fromCharCode(ch);
-
-      while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z'
-             ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) {
-        strBuf.push(String.fromCharCode(ch));
-      }
-      var str = strBuf.join('');
-      switch (str.toLowerCase()) {
-        case 'if':
-          return PostScriptToken.IF;
-        case 'ifelse':
-          return PostScriptToken.IFELSE;
-        default:
-          return PostScriptToken.getOperator(str);
-      }
-    },
-    getNumber: function PostScriptLexer_getNumber() {
-      var ch = this.currentChar;
-      var strBuf = this.strBuf;
-      strBuf.length = 0;
-      strBuf[0] = String.fromCharCode(ch);
-
-      while ((ch = this.nextChar()) >= 0) {
-        if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9'
-            ch === 0x2D || ch === 0x2E) { // '-', '.'
-          strBuf.push(String.fromCharCode(ch));
-        } else {
-          break;
-        }
-      }
-      var value = parseFloat(strBuf.join(''));
-      if (isNaN(value)) {
-        error('Invalid floating point number: ' + value);
-      }
-      return value;
-    }
-  };
-  return PostScriptLexer;
-})();
-
-
-var Stream = (function StreamClosure() {
-  function Stream(arrayBuffer, start, length, dict) {
-    this.bytes = (arrayBuffer instanceof Uint8Array ?
-                  arrayBuffer : new Uint8Array(arrayBuffer));
-    this.start = start || 0;
-    this.pos = this.start;
-    this.end = (start + length) || this.bytes.length;
-    this.dict = dict;
-  }
-
-  // required methods for a stream. if a particular stream does not
-  // implement these, an error should be thrown
-  Stream.prototype = {
-    get length() {
-      return this.end - this.start;
-    },
-    get isEmpty() {
-      return this.length === 0;
-    },
-    getByte: function Stream_getByte() {
-      if (this.pos >= this.end) {
-        return -1;
-      }
-      return this.bytes[this.pos++];
-    },
-    getUint16: function Stream_getUint16() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-      if (b0 === -1 || b1 === -1) {
-        return -1;
-      }
-      return (b0 << 8) + b1;
-    },
-    getInt32: function Stream_getInt32() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-      var b2 = this.getByte();
-      var b3 = this.getByte();
-      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
-    },
-    // returns subarray of original buffer
-    // should only be read
-    getBytes: function Stream_getBytes(length) {
-      var bytes = this.bytes;
-      var pos = this.pos;
-      var strEnd = this.end;
-
-      if (!length) {
-        return bytes.subarray(pos, strEnd);
-      }
-      var end = pos + length;
-      if (end > strEnd) {
-        end = strEnd;
-      }
-      this.pos = end;
-      return bytes.subarray(pos, end);
-    },
-    peekByte: function Stream_peekByte() {
-      var peekedByte = this.getByte();
-      this.pos--;
-      return peekedByte;
-    },
-    peekBytes: function Stream_peekBytes(length) {
-      var bytes = this.getBytes(length);
-      this.pos -= bytes.length;
-      return bytes;
-    },
-    skip: function Stream_skip(n) {
-      if (!n) {
-        n = 1;
-      }
-      this.pos += n;
-    },
-    reset: function Stream_reset() {
-      this.pos = this.start;
-    },
-    moveStart: function Stream_moveStart() {
-      this.start = this.pos;
-    },
-    makeSubStream: function Stream_makeSubStream(start, length, dict) {
-      return new Stream(this.bytes.buffer, start, length, dict);
-    },
-    isStream: true
-  };
-
-  return Stream;
-})();
-
-var StringStream = (function StringStreamClosure() {
-  function StringStream(str) {
-    var length = str.length;
-    var bytes = new Uint8Array(length);
-    for (var n = 0; n < length; ++n) {
-      bytes[n] = str.charCodeAt(n);
-    }
-    Stream.call(this, bytes);
-  }
-
-  StringStream.prototype = Stream.prototype;
-
-  return StringStream;
-})();
-
-// super class for the decoding streams
-var DecodeStream = (function DecodeStreamClosure() {
-  // Lots of DecodeStreams are created whose buffers are never used.  For these
-  // we share a single empty buffer. This is (a) space-efficient and (b) avoids
-  // having special cases that would be required if we used |null| for an empty
-  // buffer.
-  var emptyBuffer = new Uint8Array(0);
-
-  function DecodeStream(maybeMinBufferLength) {
-    this.pos = 0;
-    this.bufferLength = 0;
-    this.eof = false;
-    this.buffer = emptyBuffer;
-    this.minBufferLength = 512;
-    if (maybeMinBufferLength) {
-      // Compute the first power of two that is as big as maybeMinBufferLength.
-      while (this.minBufferLength < maybeMinBufferLength) {
-        this.minBufferLength *= 2;
-      }
-    }
-  }
-
-  DecodeStream.prototype = {
-    get isEmpty() {
-      while (!this.eof && this.bufferLength === 0) {
-        this.readBlock();
-      }
-      return this.bufferLength === 0;
-    },
-    ensureBuffer: function DecodeStream_ensureBuffer(requested) {
-      var buffer = this.buffer;
-      if (requested <= buffer.byteLength) {
-        return buffer;
-      }
-      var size = this.minBufferLength;
-      while (size < requested) {
-        size *= 2;
-      }
-      var buffer2 = new Uint8Array(size);
-      buffer2.set(buffer);
-      return (this.buffer = buffer2);
-    },
-    getByte: function DecodeStream_getByte() {
-      var pos = this.pos;
-      while (this.bufferLength <= pos) {
-        if (this.eof) {
-          return -1;
-        }
-        this.readBlock();
-      }
-      return this.buffer[this.pos++];
-    },
-    getUint16: function DecodeStream_getUint16() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-      if (b0 === -1 || b1 === -1) {
-        return -1;
-      }
-      return (b0 << 8) + b1;
-    },
-    getInt32: function DecodeStream_getInt32() {
-      var b0 = this.getByte();
-      var b1 = this.getByte();
-      var b2 = this.getByte();
-      var b3 = this.getByte();
-      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
-    },
-    getBytes: function DecodeStream_getBytes(length) {
-      var end, pos = this.pos;
-
-      if (length) {
-        this.ensureBuffer(pos + length);
-        end = pos + length;
-
-        while (!this.eof && this.bufferLength < end) {
-          this.readBlock();
-        }
-        var bufEnd = this.bufferLength;
-        if (end > bufEnd) {
-          end = bufEnd;
-        }
-      } else {
-        while (!this.eof) {
-          this.readBlock();
-        }
-        end = this.bufferLength;
-      }
-
-      this.pos = end;
-      return this.buffer.subarray(pos, end);
-    },
-    peekByte: function DecodeStream_peekByte() {
-      var peekedByte = this.getByte();
-      this.pos--;
-      return peekedByte;
-    },
-    peekBytes: function DecodeStream_peekBytes(length) {
-      var bytes = this.getBytes(length);
-      this.pos -= bytes.length;
-      return bytes;
-    },
-    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
-      var end = start + length;
-      while (this.bufferLength <= end && !this.eof) {
-        this.readBlock();
-      }
-      return new Stream(this.buffer, start, length, dict);
-    },
-    skip: function DecodeStream_skip(n) {
-      if (!n) {
-        n = 1;
-      }
-      this.pos += n;
-    },
-    reset: function DecodeStream_reset() {
-      this.pos = 0;
-    },
-    getBaseStreams: function DecodeStream_getBaseStreams() {
-      if (this.str && this.str.getBaseStreams) {
-        return this.str.getBaseStreams();
-      }
-      return [];
-    }
-  };
-
-  return DecodeStream;
-})();
-
-var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
-  function StreamsSequenceStream(streams) {
-    this.streams = streams;
-    DecodeStream.call(this, /* maybeLength = */ null);
-  }
-
-  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
-
-  StreamsSequenceStream.prototype.readBlock =
-      function streamSequenceStreamReadBlock() {
-
-    var streams = this.streams;
-    if (streams.length === 0) {
-      this.eof = true;
-      return;
-    }
-    var stream = streams.shift();
-    var chunk = stream.getBytes();
-    var bufferLength = this.bufferLength;
-    var newLength = bufferLength + chunk.length;
-    var buffer = this.ensureBuffer(newLength);
-    buffer.set(chunk, bufferLength);
-    this.bufferLength = newLength;
-  };
-
-  StreamsSequenceStream.prototype.getBaseStreams =
-    function StreamsSequenceStream_getBaseStreams() {
-
-    var baseStreams = [];
-    for (var i = 0, ii = this.streams.length; i < ii; i++) {
-      var stream = this.streams[i];
-      if (stream.getBaseStreams) {
-        Util.appendToArray(baseStreams, stream.getBaseStreams());
-      }
-    }
-    return baseStreams;
-  };
-
-  return StreamsSequenceStream;
-})();
-
-var FlateStream = (function FlateStreamClosure() {
-  var codeLenCodeMap = new Int32Array([
-    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
-  ]);
-
-  var lengthDecode = new Int32Array([
-    0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
-    0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
-    0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
-    0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
-  ]);
-
-  var distDecode = new Int32Array([
-    0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
-    0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
-    0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
-    0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
-  ]);
-
-  var fixedLitCodeTab = [new Int32Array([
-    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
-    0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
-    0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
-    0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
-    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
-    0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
-    0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
-    0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
-    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
-    0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
-    0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
-    0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
-    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
-    0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
-    0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
-    0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
-    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
-    0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
-    0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
-    0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
-    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
-    0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
-    0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
-    0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
-    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
-    0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
-    0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
-    0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
-    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
-    0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
-    0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
-    0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
-    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
-    0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
-    0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
-    0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
-    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
-    0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
-    0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
-    0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
-    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
-    0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
-    0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
-    0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
-    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
-    0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
-    0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
-    0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
-    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
-    0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
-    0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
-    0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
-    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
-    0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
-    0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
-    0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
-    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
-    0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
-    0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
-    0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
-    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
-    0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
-    0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
-    0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
-  ]), 9];
-
-  var fixedDistCodeTab = [new Int32Array([
-    0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
-    0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
-    0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
-    0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
-  ]), 5];
-
-  function FlateStream(str, maybeLength) {
-    this.str = str;
-    this.dict = str.dict;
-
-    var cmf = str.getByte();
-    var flg = str.getByte();
-    if (cmf === -1 || flg === -1) {
-      error('Invalid header in flate stream: ' + cmf + ', ' + flg);
-    }
-    if ((cmf & 0x0f) !== 0x08) {
-      error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
-    }
-    if ((((cmf << 8) + flg) % 31) !== 0) {
-      error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
-    }
-    if (flg & 0x20) {
-      error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
-    }
-
-    this.codeSize = 0;
-    this.codeBuf = 0;
-
-    DecodeStream.call(this, maybeLength);
-  }
-
-  FlateStream.prototype = Object.create(DecodeStream.prototype);
-
-  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
-    var str = this.str;
-    var codeSize = this.codeSize;
-    var codeBuf = this.codeBuf;
-
-    var b;
-    while (codeSize < bits) {
-      if ((b = str.getByte()) === -1) {
-        error('Bad encoding in flate stream');
-      }
-      codeBuf |= b << codeSize;
-      codeSize += 8;
-    }
-    b = codeBuf & ((1 << bits) - 1);
-    this.codeBuf = codeBuf >> bits;
-    this.codeSize = codeSize -= bits;
-
-    return b;
-  };
-
-  FlateStream.prototype.getCode = function FlateStream_getCode(table) {
-    var str = this.str;
-    var codes = table[0];
-    var maxLen = table[1];
-    var codeSize = this.codeSize;
-    var codeBuf = this.codeBuf;
-
-    var b;
-    while (codeSize < maxLen) {
-      if ((b = str.getByte()) === -1) {
-        // premature end of stream. code might however still be valid.
-        // codeSize < codeLen check below guards against incomplete codeVal.
-        break;
-      }
-      codeBuf |= (b << codeSize);
-      codeSize += 8;
-    }
-    var code = codes[codeBuf & ((1 << maxLen) - 1)];
-    var codeLen = code >> 16;
-    var codeVal = code & 0xffff;
-    if (codeLen < 1 || codeSize < codeLen) {
-      error('Bad encoding in flate stream');
-    }
-    this.codeBuf = (codeBuf >> codeLen);
-    this.codeSize = (codeSize - codeLen);
-    return codeVal;
-  };
-
-  FlateStream.prototype.generateHuffmanTable =
-      function flateStreamGenerateHuffmanTable(lengths) {
-    var n = lengths.length;
-
-    // find max code length
-    var maxLen = 0;
-    var i;
-    for (i = 0; i < n; ++i) {
-      if (lengths[i] > maxLen) {
-        maxLen = lengths[i];
-      }
-    }
-
-    // build the table
-    var size = 1 << maxLen;
-    var codes = new Int32Array(size);
-    for (var len = 1, code = 0, skip = 2;
-         len <= maxLen;
-         ++len, code <<= 1, skip <<= 1) {
-      for (var val = 0; val < n; ++val) {
-        if (lengths[val] === len) {
-          // bit-reverse the code
-          var code2 = 0;
-          var t = code;
-          for (i = 0; i < len; ++i) {
-            code2 = (code2 << 1) | (t & 1);
-            t >>= 1;
-          }
-
-          // fill the table entries
-          for (i = code2; i < size; i += skip) {
-            codes[i] = (len << 16) | val;
-          }
-          ++code;
-        }
-      }
-    }
-
-    return [codes, maxLen];
-  };
-
-  FlateStream.prototype.readBlock = function FlateStream_readBlock() {
-    var buffer, len;
-    var str = this.str;
-    // read block header
-    var hdr = this.getBits(3);
-    if (hdr & 1) {
-      this.eof = true;
-    }
-    hdr >>= 1;
-
-    if (hdr === 0) { // uncompressed block
-      var b;
-
-      if ((b = str.getByte()) === -1) {
-        error('Bad block header in flate stream');
-      }
-      var blockLen = b;
-      if ((b = str.getByte()) === -1) {
-        error('Bad block header in flate stream');
-      }
-      blockLen |= (b << 8);
-      if ((b = str.getByte()) === -1) {
-        error('Bad block header in flate stream');
-      }
-      var check = b;
-      if ((b = str.getByte()) === -1) {
-        error('Bad block header in flate stream');
-      }
-      check |= (b << 8);
-      if (check !== (~blockLen & 0xffff) &&
-          (blockLen !== 0 || check !== 0)) {
-        // Ignoring error for bad "empty" block (see issue 1277)
-        error('Bad uncompressed block length in flate stream');
-      }
-
-      this.codeBuf = 0;
-      this.codeSize = 0;
-
-      var bufferLength = this.bufferLength;
-      buffer = this.ensureBuffer(bufferLength + blockLen);
-      var end = bufferLength + blockLen;
-      this.bufferLength = end;
-      if (blockLen === 0) {
-        if (str.peekByte() === -1) {
-          this.eof = true;
-        }
-      } else {
-        for (var n = bufferLength; n < end; ++n) {
-          if ((b = str.getByte()) === -1) {
-            this.eof = true;
-            break;
-          }
-          buffer[n] = b;
-        }
-      }
-      return;
-    }
-
-    var litCodeTable;
-    var distCodeTable;
-    if (hdr === 1) { // compressed block, fixed codes
-      litCodeTable = fixedLitCodeTab;
-      distCodeTable = fixedDistCodeTab;
-    } else if (hdr === 2) { // compressed block, dynamic codes
-      var numLitCodes = this.getBits(5) + 257;
-      var numDistCodes = this.getBits(5) + 1;
-      var numCodeLenCodes = this.getBits(4) + 4;
-
-      // build the code lengths code table
-      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
-
-      var i;
-      for (i = 0; i < numCodeLenCodes; ++i) {
-        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
-      }
-      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
-
-      // build the literal and distance code tables
-      len = 0;
-      i = 0;
-      var codes = numLitCodes + numDistCodes;
-      var codeLengths = new Uint8Array(codes);
-      var bitsLength, bitsOffset, what;
-      while (i < codes) {
-        var code = this.getCode(codeLenCodeTab);
-        if (code === 16) {
-          bitsLength = 2; bitsOffset = 3; what = len;
-        } else if (code === 17) {
-          bitsLength = 3; bitsOffset = 3; what = (len = 0);
-        } else if (code === 18) {
-          bitsLength = 7; bitsOffset = 11; what = (len = 0);
-        } else {
-          codeLengths[i++] = len = code;
-          continue;
-        }
-
-        var repeatLength = this.getBits(bitsLength) + bitsOffset;
-        while (repeatLength-- > 0) {
-          codeLengths[i++] = what;
-        }
-      }
-
-      litCodeTable =
-        this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
-      distCodeTable =
-        this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
-    } else {
-      error('Unknown block type in flate stream');
-    }
-
-    buffer = this.buffer;
-    var limit = buffer ? buffer.length : 0;
-    var pos = this.bufferLength;
-    while (true) {
-      var code1 = this.getCode(litCodeTable);
-      if (code1 < 256) {
-        if (pos + 1 >= limit) {
-          buffer = this.ensureBuffer(pos + 1);
-          limit = buffer.length;
-        }
-        buffer[pos++] = code1;
-        continue;
-      }
-      if (code1 === 256) {
-        this.bufferLength = pos;
-        return;
-      }
-      code1 -= 257;
-      code1 = lengthDecode[code1];
-      var code2 = code1 >> 16;
-      if (code2 > 0) {
-        code2 = this.getBits(code2);
-      }
-      len = (code1 & 0xffff) + code2;
-      code1 = this.getCode(distCodeTable);
-      code1 = distDecode[code1];
-      code2 = code1 >> 16;
-      if (code2 > 0) {
-        code2 = this.getBits(code2);
-      }
-      var dist = (code1 & 0xffff) + code2;
-      if (pos + len >= limit) {
-        buffer = this.ensureBuffer(pos + len);
-        limit = buffer.length;
-      }
-      for (var k = 0; k < len; ++k, ++pos) {
-        buffer[pos] = buffer[pos - dist];
-      }
-    }
-  };
-
-  return FlateStream;
-})();
-
-var PredictorStream = (function PredictorStreamClosure() {
-  function PredictorStream(str, maybeLength, params) {
-    var predictor = this.predictor = params.get('Predictor') || 1;
-
-    if (predictor <= 1) {
-      return str; // no prediction
-    }
-    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {
-      error('Unsupported predictor: ' + predictor);
-    }
-
-    if (predictor === 2) {
-      this.readBlock = this.readBlockTiff;
-    } else {
-      this.readBlock = this.readBlockPng;
-    }
-
-    this.str = str;
-    this.dict = str.dict;
-
-    var colors = this.colors = params.get('Colors') || 1;
-    var bits = this.bits = params.get('BitsPerComponent') || 8;
-    var columns = this.columns = params.get('Columns') || 1;
-
-    this.pixBytes = (colors * bits + 7) >> 3;
-    this.rowBytes = (columns * colors * bits + 7) >> 3;
-
-    DecodeStream.call(this, maybeLength);
-    return this;
-  }
-
-  PredictorStream.prototype = Object.create(DecodeStream.prototype);
-
-  PredictorStream.prototype.readBlockTiff =
-      function predictorStreamReadBlockTiff() {
-    var rowBytes = this.rowBytes;
-
-    var bufferLength = this.bufferLength;
-    var buffer = this.ensureBuffer(bufferLength + rowBytes);
-
-    var bits = this.bits;
-    var colors = this.colors;
-
-    var rawBytes = this.str.getBytes(rowBytes);
-    this.eof = !rawBytes.length;
-    if (this.eof) {
-      return;
-    }
-
-    var inbuf = 0, outbuf = 0;
-    var inbits = 0, outbits = 0;
-    var pos = bufferLength;
-    var i;
-
-    if (bits === 1) {
-      for (i = 0; i < rowBytes; ++i) {
-        var c = rawBytes[i];
-        inbuf = (inbuf << 8) | c;
-        // bitwise addition is exclusive or
-        // first shift inbuf and then add
-        buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;
-        // truncate inbuf (assumes colors < 16)
-        inbuf &= 0xFFFF;
-      }
-    } else if (bits === 8) {
-      for (i = 0; i < colors; ++i) {
-        buffer[pos++] = rawBytes[i];
-      }
-      for (; i < rowBytes; ++i) {
-        buffer[pos] = buffer[pos - colors] + rawBytes[i];
-        pos++;
-      }
-    } else {
-      var compArray = new Uint8Array(colors + 1);
-      var bitMask = (1 << bits) - 1;
-      var j = 0, k = bufferLength;
-      var columns = this.columns;
-      for (i = 0; i < columns; ++i) {
-        for (var kk = 0; kk < colors; ++kk) {
-          if (inbits < bits) {
-            inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
-            inbits += 8;
-          }
-          compArray[kk] = (compArray[kk] +
-                           (inbuf >> (inbits - bits))) & bitMask;
-          inbits -= bits;
-          outbuf = (outbuf << bits) | compArray[kk];
-          outbits += bits;
-          if (outbits >= 8) {
-            buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
-            outbits -= 8;
-          }
-        }
-      }
-      if (outbits > 0) {
-        buffer[k++] = (outbuf << (8 - outbits)) +
-                      (inbuf & ((1 << (8 - outbits)) - 1));
-      }
-    }
-    this.bufferLength += rowBytes;
-  };
-
-  PredictorStream.prototype.readBlockPng =
-      function predictorStreamReadBlockPng() {
-
-    var rowBytes = this.rowBytes;
-    var pixBytes = this.pixBytes;
-
-    var predictor = this.str.getByte();
-    var rawBytes = this.str.getBytes(rowBytes);
-    this.eof = !rawBytes.length;
-    if (this.eof) {
-      return;
-    }
-
-    var bufferLength = this.bufferLength;
-    var buffer = this.ensureBuffer(bufferLength + rowBytes);
-
-    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
-    if (prevRow.length === 0) {
-      prevRow = new Uint8Array(rowBytes);
-    }
-
-    var i, j = bufferLength, up, c;
-    switch (predictor) {
-      case 0:
-        for (i = 0; i < rowBytes; ++i) {
-          buffer[j++] = rawBytes[i];
-        }
-        break;
-      case 1:
-        for (i = 0; i < pixBytes; ++i) {
-          buffer[j++] = rawBytes[i];
-        }
-        for (; i < rowBytes; ++i) {
-          buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;
-          j++;
-        }
-        break;
-      case 2:
-        for (i = 0; i < rowBytes; ++i) {
-          buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
-        }
-        break;
-      case 3:
-        for (i = 0; i < pixBytes; ++i) {
-          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
-        }
-        for (; i < rowBytes; ++i) {
-          buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +
-                           rawBytes[i]) & 0xFF;
-          j++;
-        }
-        break;
-      case 4:
-        // we need to save the up left pixels values. the simplest way
-        // is to create a new buffer
-        for (i = 0; i < pixBytes; ++i) {
-          up = prevRow[i];
-          c = rawBytes[i];
-          buffer[j++] = up + c;
-        }
-        for (; i < rowBytes; ++i) {
-          up = prevRow[i];
-          var upLeft = prevRow[i - pixBytes];
-          var left = buffer[j - pixBytes];
-          var p = left + up - upLeft;
-
-          var pa = p - left;
-          if (pa < 0) {
-            pa = -pa;
-          }
-          var pb = p - up;
-          if (pb < 0) {
-            pb = -pb;
-          }
-          var pc = p - upLeft;
-          if (pc < 0) {
-            pc = -pc;
-          }
-
-          c = rawBytes[i];
-          if (pa <= pb && pa <= pc) {
-            buffer[j++] = left + c;
-          } else if (pb <= pc) {
-            buffer[j++] = up + c;
-          } else {
-            buffer[j++] = upLeft + c;
-          }
-        }
-        break;
-      default:
-        error('Unsupported predictor: ' + predictor);
-    }
-    this.bufferLength += rowBytes;
-  };
-
-  return PredictorStream;
-})();
-
-/**
- * Depending on the type of JPEG a JpegStream is handled in different ways. For
- * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
- * data is stored and then loaded by the browser.  For unsupported JPEG's we use
- * a library to decode these images and the stream behaves like all the other
- * DecodeStreams.
- */
-var JpegStream = (function JpegStreamClosure() {
-  function JpegStream(stream, maybeLength, dict, xref) {
-    // Some images may contain 'junk' before the SOI (start-of-image) marker.
-    // Note: this seems to mainly affect inline images.
-    var ch;
-    while ((ch = stream.getByte()) !== -1) {
-      if (ch === 0xFF) { // Find the first byte of the SOI marker (0xFFD8).
-        stream.skip(-1); // Reset the stream position to the SOI.
-        break;
-      }
-    }
-    this.stream = stream;
-    this.maybeLength = maybeLength;
-    this.dict = dict;
-
-    DecodeStream.call(this, maybeLength);
-  }
-
-  JpegStream.prototype = Object.create(DecodeStream.prototype);
-
-  Object.defineProperty(JpegStream.prototype, 'bytes', {
-    get: function JpegStream_bytes() {
-      // If this.maybeLength is null, we'll get the entire stream.
-      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));
-    },
-    configurable: true
-  });
-
-  JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
-    if (this.bufferLength) {
-      return;
-    }
-    try {
-      var jpegImage = new JpegImage();
-
-      // checking if values needs to be transformed before conversion
-      if (this.forceRGB && this.dict && isArray(this.dict.get('Decode'))) {
-        var decodeArr = this.dict.get('Decode');
-        var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;
-        var decodeArrLength = decodeArr.length;
-        var transform = new Int32Array(decodeArrLength);
-        var transformNeeded = false;
-        var maxValue = (1 << bitsPerComponent) - 1;
-        for (var i = 0; i < decodeArrLength; i += 2) {
-          transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0;
-          transform[i + 1] = (decodeArr[i] * maxValue) | 0;
-          if (transform[i] !== 256 || transform[i + 1] !== 0) {
-            transformNeeded = true;
-          }
-        }
-        if (transformNeeded) {
-          jpegImage.decodeTransform = transform;
-        }
-      }
-
-      jpegImage.parse(this.bytes);
-      var data = jpegImage.getData(this.drawWidth, this.drawHeight,
-                                   this.forceRGB);
-      this.buffer = data;
-      this.bufferLength = data.length;
-      this.eof = true;
-    } catch (e) {
-      error('JPEG error: ' + e);
-    }
-  };
-
-  JpegStream.prototype.getBytes = function JpegStream_getBytes(length) {
-    this.ensureBuffer();
-    return this.buffer;
-  };
-
-  JpegStream.prototype.getIR = function JpegStream_getIR() {
-    return PDFJS.createObjectURL(this.bytes, 'image/jpeg');
-  };
-  /**
-   * Checks if the image can be decoded and displayed by the browser without any
-   * further processing such as color space conversions.
-   */
-  JpegStream.prototype.isNativelySupported =
-      function JpegStream_isNativelySupported(xref, res) {
-//#if FIREFOX
-//  // Workaround for:
-//  //  - https://bugzilla.mozilla.org/show_bug.cgi?id=1164199.
-//  //  - https://github.com/mozilla/pdf.js/issues/6017.
-//  // TODO: Remove this no later than July 1, 2015.
-//  if (/\bFirefox\/4[01].0/.test(navigator.userAgent)) {
-//    return false;
-//  }
-//#endif
-    var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);
-    return cs.name === 'DeviceGray' || cs.name === 'DeviceRGB';
-  };
-  /**
-   * Checks if the image can be decoded by the browser.
-   */
-  JpegStream.prototype.isNativelyDecodable =
-      function JpegStream_isNativelyDecodable(xref, res) {
-//#if FIREFOX
-//  // Workaround for:
-//  //  - https://bugzilla.mozilla.org/show_bug.cgi?id=1164199.
-//  //  - https://github.com/mozilla/pdf.js/issues/6017.
-//  // TODO: Remove this no later than July 1, 2015.
-//  if (/\bFirefox\/4[01].0/.test(navigator.userAgent)) {
-//    return false;
-//  }
-//#endif
-    var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);
-    var numComps = cs.numComps;
-    return numComps === 1 || numComps === 3;
-  };
-
-  return JpegStream;
-})();
-
-/**
- * For JPEG 2000's we use a library to decode these images and
- * the stream behaves like all the other DecodeStreams.
- */
-var JpxStream = (function JpxStreamClosure() {
-  function JpxStream(stream, maybeLength, dict) {
-    this.stream = stream;
-    this.maybeLength = maybeLength;
-    this.dict = dict;
-
-    DecodeStream.call(this, maybeLength);
-  }
-
-  JpxStream.prototype = Object.create(DecodeStream.prototype);
-
-  Object.defineProperty(JpxStream.prototype, 'bytes', {
-    get: function JpxStream_bytes() {
-      // If this.maybeLength is null, we'll get the entire stream.
-      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));
-    },
-    configurable: true
-  });
-
-  JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
-    if (this.bufferLength) {
-      return;
-    }
-
-    var jpxImage = new JpxImage();
-    jpxImage.parse(this.bytes);
-
-    var width = jpxImage.width;
-    var height = jpxImage.height;
-    var componentsCount = jpxImage.componentsCount;
-    var tileCount = jpxImage.tiles.length;
-    if (tileCount === 1) {
-      this.buffer = jpxImage.tiles[0].items;
-    } else {
-      var data = new Uint8Array(width * height * componentsCount);
-
-      for (var k = 0; k < tileCount; k++) {
-        var tileComponents = jpxImage.tiles[k];
-        var tileWidth = tileComponents.width;
-        var tileHeight = tileComponents.height;
-        var tileLeft = tileComponents.left;
-        var tileTop = tileComponents.top;
-
-        var src = tileComponents.items;
-        var srcPosition = 0;
-        var dataPosition = (width * tileTop + tileLeft) * componentsCount;
-        var imgRowSize = width * componentsCount;
-        var tileRowSize = tileWidth * componentsCount;
-
-        for (var j = 0; j < tileHeight; j++) {
-          var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);
-          data.set(rowBytes, dataPosition);
-          srcPosition += tileRowSize;
-          dataPosition += imgRowSize;
-        }
-      }
-      this.buffer = data;
-    }
-    this.bufferLength = this.buffer.length;
-    this.eof = true;
-  };
-
-  return JpxStream;
-})();
-
-/**
- * For JBIG2's we use a library to decode these images and
- * the stream behaves like all the other DecodeStreams.
- */
-var Jbig2Stream = (function Jbig2StreamClosure() {
-  function Jbig2Stream(stream, maybeLength, dict) {
-    this.stream = stream;
-    this.maybeLength = maybeLength;
-    this.dict = dict;
-
-    DecodeStream.call(this, maybeLength);
-  }
-
-  Jbig2Stream.prototype = Object.create(DecodeStream.prototype);
-
-  Object.defineProperty(Jbig2Stream.prototype, 'bytes', {
-    get: function Jbig2Stream_bytes() {
-      // If this.maybeLength is null, we'll get the entire stream.
-      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));
-    },
-    configurable: true
-  });
-
-  Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) {
-    if (this.bufferLength) {
-      return;
-    }
-
-    var jbig2Image = new Jbig2Image();
-
-    var chunks = [], xref = this.dict.xref;
-    var decodeParams = xref.fetchIfRef(this.dict.get('DecodeParms'));
-
-    // According to the PDF specification, DecodeParms can be either
-    // a dictionary, or an array whose elements are dictionaries.
-    if (isArray(decodeParams)) {
-      if (decodeParams.length > 1) {
-        warn('JBIG2 - \'DecodeParms\' array with multiple elements ' +
-             'not supported.');
-      }
-      decodeParams = xref.fetchIfRef(decodeParams[0]);
-    }
-    if (decodeParams && decodeParams.has('JBIG2Globals')) {
-      var globalsStream = decodeParams.get('JBIG2Globals');
-      var globals = globalsStream.getBytes();
-      chunks.push({data: globals, start: 0, end: globals.length});
-    }
-    chunks.push({data: this.bytes, start: 0, end: this.bytes.length});
-    var data = jbig2Image.parseChunks(chunks);
-    var dataLength = data.length;
-
-    // JBIG2 had black as 1 and white as 0, inverting the colors
-    for (var i = 0; i < dataLength; i++) {
-      data[i] ^= 0xFF;
-    }
-
-    this.buffer = data;
-    this.bufferLength = dataLength;
-    this.eof = true;
-  };
-
-  return Jbig2Stream;
-})();
-
-var DecryptStream = (function DecryptStreamClosure() {
-  function DecryptStream(str, maybeLength, decrypt) {
-    this.str = str;
-    this.dict = str.dict;
-    this.decrypt = decrypt;
-    this.nextChunk = null;
-    this.initialized = false;
-
-    DecodeStream.call(this, maybeLength);
-  }
-
-  var chunkSize = 512;
-
-  DecryptStream.prototype = Object.create(DecodeStream.prototype);
-
-  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
-    var chunk;
-    if (this.initialized) {
-      chunk = this.nextChunk;
-    } else {
-      chunk = this.str.getBytes(chunkSize);
-      this.initialized = true;
-    }
-    if (!chunk || chunk.length === 0) {
-      this.eof = true;
-      return;
-    }
-    this.nextChunk = this.str.getBytes(chunkSize);
-    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;
-
-    var decrypt = this.decrypt;
-    chunk = decrypt(chunk, !hasMoreData);
-
-    var bufferLength = this.bufferLength;
-    var i, n = chunk.length;
-    var buffer = this.ensureBuffer(bufferLength + n);
-    for (i = 0; i < n; i++) {
-      buffer[bufferLength++] = chunk[i];
-    }
-    this.bufferLength = bufferLength;
-  };
-
-  return DecryptStream;
-})();
-
-var Ascii85Stream = (function Ascii85StreamClosure() {
-  function Ascii85Stream(str, maybeLength) {
-    this.str = str;
-    this.dict = str.dict;
-    this.input = new Uint8Array(5);
-
-    // Most streams increase in size when decoded, but Ascii85 streams
-    // typically shrink by ~20%.
-    if (maybeLength) {
-      maybeLength = 0.8 * maybeLength;
-    }
-    DecodeStream.call(this, maybeLength);
-  }
-
-  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
-
-  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
-    var TILDA_CHAR = 0x7E; // '~'
-    var Z_LOWER_CHAR = 0x7A; // 'z'
-    var EOF = -1;
-
-    var str = this.str;
-
-    var c = str.getByte();
-    while (Lexer.isSpace(c)) {
-      c = str.getByte();
-    }
-
-    if (c === EOF || c === TILDA_CHAR) {
-      this.eof = true;
-      return;
-    }
-
-    var bufferLength = this.bufferLength, buffer;
-    var i;
-
-    // special code for z
-    if (c === Z_LOWER_CHAR) {
-      buffer = this.ensureBuffer(bufferLength + 4);
-      for (i = 0; i < 4; ++i) {
-        buffer[bufferLength + i] = 0;
-      }
-      this.bufferLength += 4;
-    } else {
-      var input = this.input;
-      input[0] = c;
-      for (i = 1; i < 5; ++i) {
-        c = str.getByte();
-        while (Lexer.isSpace(c)) {
-          c = str.getByte();
-        }
-
-        input[i] = c;
-
-        if (c === EOF || c === TILDA_CHAR) {
-          break;
-        }
-      }
-      buffer = this.ensureBuffer(bufferLength + i - 1);
-      this.bufferLength += i - 1;
-
-      // partial ending;
-      if (i < 5) {
-        for (; i < 5; ++i) {
-          input[i] = 0x21 + 84;
-        }
-        this.eof = true;
-      }
-      var t = 0;
-      for (i = 0; i < 5; ++i) {
-        t = t * 85 + (input[i] - 0x21);
-      }
-
-      for (i = 3; i >= 0; --i) {
-        buffer[bufferLength + i] = t & 0xFF;
-        t >>= 8;
-      }
-    }
-  };
-
-  return Ascii85Stream;
-})();
-
-var AsciiHexStream = (function AsciiHexStreamClosure() {
-  function AsciiHexStream(str, maybeLength) {
-    this.str = str;
-    this.dict = str.dict;
-
-    this.firstDigit = -1;
-
-    // Most streams increase in size when decoded, but AsciiHex streams shrink
-    // by 50%.
-    if (maybeLength) {
-      maybeLength = 0.5 * maybeLength;
-    }
-    DecodeStream.call(this, maybeLength);
-  }
-
-  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
-
-  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
-    var UPSTREAM_BLOCK_SIZE = 8000;
-    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);
-    if (!bytes.length) {
-      this.eof = true;
-      return;
-    }
-
-    var maxDecodeLength = (bytes.length + 1) >> 1;
-    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);
-    var bufferLength = this.bufferLength;
-
-    var firstDigit = this.firstDigit;
-    for (var i = 0, ii = bytes.length; i < ii; i++) {
-      var ch = bytes[i], digit;
-      if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'
-        digit = ch & 0x0F;
-      } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {
-        // 'A'-'Z', 'a'-'z'
-        digit = (ch & 0x0F) + 9;
-      } else if (ch === 0x3E) { // '>'
-        this.eof = true;
-        break;
-      } else { // probably whitespace
-        continue; // ignoring
-      }
-      if (firstDigit < 0) {
-        firstDigit = digit;
-      } else {
-        buffer[bufferLength++] = (firstDigit << 4) | digit;
-        firstDigit = -1;
-      }
-    }
-    if (firstDigit >= 0 && this.eof) {
-      // incomplete byte
-      buffer[bufferLength++] = (firstDigit << 4);
-      firstDigit = -1;
-    }
-    this.firstDigit = firstDigit;
-    this.bufferLength = bufferLength;
-  };
-
-  return AsciiHexStream;
-})();
-
-var RunLengthStream = (function RunLengthStreamClosure() {
-  function RunLengthStream(str, maybeLength) {
-    this.str = str;
-    this.dict = str.dict;
-
-    DecodeStream.call(this, maybeLength);
-  }
-
-  RunLengthStream.prototype = Object.create(DecodeStream.prototype);
-
-  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
-    // The repeatHeader has following format. The first byte defines type of run
-    // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes
-    // (in addition to the second byte from the header), n = 129 through 255 -
-    // duplicate the second byte from the header (257 - n) times, n = 128 - end.
-    var repeatHeader = this.str.getBytes(2);
-    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {
-      this.eof = true;
-      return;
-    }
-
-    var buffer;
-    var bufferLength = this.bufferLength;
-    var n = repeatHeader[0];
-    if (n < 128) {
-      // copy n bytes
-      buffer = this.ensureBuffer(bufferLength + n + 1);
-      buffer[bufferLength++] = repeatHeader[1];
-      if (n > 0) {
-        var source = this.str.getBytes(n);
-        buffer.set(source, bufferLength);
-        bufferLength += n;
-      }
-    } else {
-      n = 257 - n;
-      var b = repeatHeader[1];
-      buffer = this.ensureBuffer(bufferLength + n + 1);
-      for (var i = 0; i < n; i++) {
-        buffer[bufferLength++] = b;
-      }
-    }
-    this.bufferLength = bufferLength;
-  };
-
-  return RunLengthStream;
-})();
-
-var CCITTFaxStream = (function CCITTFaxStreamClosure() {
-
-  var ccittEOL = -2;
-  var twoDimPass = 0;
-  var twoDimHoriz = 1;
-  var twoDimVert0 = 2;
-  var twoDimVertR1 = 3;
-  var twoDimVertL1 = 4;
-  var twoDimVertR2 = 5;
-  var twoDimVertL2 = 6;
-  var twoDimVertR3 = 7;
-  var twoDimVertL3 = 8;
-
-  var twoDimTable = [
-    [-1, -1], [-1, -1],                   // 000000x
-    [7, twoDimVertL3],                    // 0000010
-    [7, twoDimVertR3],                    // 0000011
-    [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
-    [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
-    [4, twoDimPass], [4, twoDimPass],     // 0001xxx
-    [4, twoDimPass], [4, twoDimPass],
-    [4, twoDimPass], [4, twoDimPass],
-    [4, twoDimPass], [4, twoDimPass],
-    [3, twoDimHoriz], [3, twoDimHoriz],   // 001xxxx
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [1, twoDimVert0], [1, twoDimVert0],   // 1xxxxxx
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0]
-  ];
-
-  var whiteTable1 = [
-    [-1, -1],                               // 00000
-    [12, ccittEOL],                         // 00001
-    [-1, -1], [-1, -1],                     // 0001x
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
-    [11, 1792], [11, 1792],                 // 1000x
-    [12, 1984],                             // 10010
-    [12, 2048],                             // 10011
-    [12, 2112],                             // 10100
-    [12, 2176],                             // 10101
-    [12, 2240],                             // 10110
-    [12, 2304],                             // 10111
-    [11, 1856], [11, 1856],                 // 1100x
-    [11, 1920], [11, 1920],                 // 1101x
-    [12, 2368],                             // 11100
-    [12, 2432],                             // 11101
-    [12, 2496],                             // 11110
-    [12, 2560]                              // 11111
-  ];
-
-  var whiteTable2 = [
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],     // 0000000xx
-    [8, 29], [8, 29],                           // 00000010x
-    [8, 30], [8, 30],                           // 00000011x
-    [8, 45], [8, 45],                           // 00000100x
-    [8, 46], [8, 46],                           // 00000101x
-    [7, 22], [7, 22], [7, 22], [7, 22],         // 0000011xx
-    [7, 23], [7, 23], [7, 23], [7, 23],         // 0000100xx
-    [8, 47], [8, 47],                           // 00001010x
-    [8, 48], [8, 48],                           // 00001011x
-    [6, 13], [6, 13], [6, 13], [6, 13],         // 000011xxx
-    [6, 13], [6, 13], [6, 13], [6, 13],
-    [7, 20], [7, 20], [7, 20], [7, 20],         // 0001000xx
-    [8, 33], [8, 33],                           // 00010010x
-    [8, 34], [8, 34],                           // 00010011x
-    [8, 35], [8, 35],                           // 00010100x
-    [8, 36], [8, 36],                           // 00010101x
-    [8, 37], [8, 37],                           // 00010110x
-    [8, 38], [8, 38],                           // 00010111x
-    [7, 19], [7, 19], [7, 19], [7, 19],         // 0001100xx
-    [8, 31], [8, 31],                           // 00011010x
-    [8, 32], [8, 32],                           // 00011011x
-    [6, 1], [6, 1], [6, 1], [6, 1],             // 000111xxx
-    [6, 1], [6, 1], [6, 1], [6, 1],
-    [6, 12], [6, 12], [6, 12], [6, 12],         // 001000xxx
-    [6, 12], [6, 12], [6, 12], [6, 12],
-    [8, 53], [8, 53],                           // 00100100x
-    [8, 54], [8, 54],                           // 00100101x
-    [7, 26], [7, 26], [7, 26], [7, 26],         // 0010011xx
-    [8, 39], [8, 39],                           // 00101000x
-    [8, 40], [8, 40],                           // 00101001x
-    [8, 41], [8, 41],                           // 00101010x
-    [8, 42], [8, 42],                           // 00101011x
-    [8, 43], [8, 43],                           // 00101100x
-    [8, 44], [8, 44],                           // 00101101x
-    [7, 21], [7, 21], [7, 21], [7, 21],         // 0010111xx
-    [7, 28], [7, 28], [7, 28], [7, 28],         // 0011000xx
-    [8, 61], [8, 61],                           // 00110010x
-    [8, 62], [8, 62],                           // 00110011x
-    [8, 63], [8, 63],                           // 00110100x
-    [8, 0], [8, 0],                             // 00110101x
-    [8, 320], [8, 320],                         // 00110110x
-    [8, 384], [8, 384],                         // 00110111x
-    [5, 10], [5, 10], [5, 10], [5, 10],         // 00111xxxx
-    [5, 10], [5, 10], [5, 10], [5, 10],
-    [5, 10], [5, 10], [5, 10], [5, 10],
-    [5, 10], [5, 10], [5, 10], [5, 10],
-    [5, 11], [5, 11], [5, 11], [5, 11],         // 01000xxxx
-    [5, 11], [5, 11], [5, 11], [5, 11],
-    [5, 11], [5, 11], [5, 11], [5, 11],
-    [5, 11], [5, 11], [5, 11], [5, 11],
-    [7, 27], [7, 27], [7, 27], [7, 27],         // 0100100xx
-    [8, 59], [8, 59],                           // 01001010x
-    [8, 60], [8, 60],                           // 01001011x
-    [9, 1472],                                  // 010011000
-    [9, 1536],                                  // 010011001
-    [9, 1600],                                  // 010011010
-    [9, 1728],                                  // 010011011
-    [7, 18], [7, 18], [7, 18], [7, 18],         // 0100111xx
-    [7, 24], [7, 24], [7, 24], [7, 24],         // 0101000xx
-    [8, 49], [8, 49],                           // 01010010x
-    [8, 50], [8, 50],                           // 01010011x
-    [8, 51], [8, 51],                           // 01010100x
-    [8, 52], [8, 52],                           // 01010101x
-    [7, 25], [7, 25], [7, 25], [7, 25],         // 0101011xx
-    [8, 55], [8, 55],                           // 01011000x
-    [8, 56], [8, 56],                           // 01011001x
-    [8, 57], [8, 57],                           // 01011010x
-    [8, 58], [8, 58],                           // 01011011x
-    [6, 192], [6, 192], [6, 192], [6, 192],     // 010111xxx
-    [6, 192], [6, 192], [6, 192], [6, 192],
-    [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
-    [6, 1664], [6, 1664], [6, 1664], [6, 1664],
-    [8, 448], [8, 448],                         // 01100100x
-    [8, 512], [8, 512],                         // 01100101x
-    [9, 704],                                   // 011001100
-    [9, 768],                                   // 011001101
-    [8, 640], [8, 640],                         // 01100111x
-    [8, 576], [8, 576],                         // 01101000x
-    [9, 832],                                   // 011010010
-    [9, 896],                                   // 011010011
-    [9, 960],                                   // 011010100
-    [9, 1024],                                  // 011010101
-    [9, 1088],                                  // 011010110
-    [9, 1152],                                  // 011010111
-    [9, 1216],                                  // 011011000
-    [9, 1280],                                  // 011011001
-    [9, 1344],                                  // 011011010
-    [9, 1408],                                  // 011011011
-    [7, 256], [7, 256], [7, 256], [7, 256],     // 0110111xx
-    [4, 2], [4, 2], [4, 2], [4, 2],             // 0111xxxxx
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 3], [4, 3], [4, 3], [4, 3],             // 1000xxxxx
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [5, 128], [5, 128], [5, 128], [5, 128],     // 10010xxxx
-    [5, 128], [5, 128], [5, 128], [5, 128],
-    [5, 128], [5, 128], [5, 128], [5, 128],
-    [5, 128], [5, 128], [5, 128], [5, 128],
-    [5, 8], [5, 8], [5, 8], [5, 8],             // 10011xxxx
-    [5, 8], [5, 8], [5, 8], [5, 8],
-    [5, 8], [5, 8], [5, 8], [5, 8],
-    [5, 8], [5, 8], [5, 8], [5, 8],
-    [5, 9], [5, 9], [5, 9], [5, 9],             // 10100xxxx
-    [5, 9], [5, 9], [5, 9], [5, 9],
-    [5, 9], [5, 9], [5, 9], [5, 9],
-    [5, 9], [5, 9], [5, 9], [5, 9],
-    [6, 16], [6, 16], [6, 16], [6, 16],         // 101010xxx
-    [6, 16], [6, 16], [6, 16], [6, 16],
-    [6, 17], [6, 17], [6, 17], [6, 17],         // 101011xxx
-    [6, 17], [6, 17], [6, 17], [6, 17],
-    [4, 4], [4, 4], [4, 4], [4, 4],             // 1011xxxxx
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 5], [4, 5], [4, 5], [4, 5],             // 1100xxxxx
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [6, 14], [6, 14], [6, 14], [6, 14],         // 110100xxx
-    [6, 14], [6, 14], [6, 14], [6, 14],
-    [6, 15], [6, 15], [6, 15], [6, 15],         // 110101xxx
-    [6, 15], [6, 15], [6, 15], [6, 15],
-    [5, 64], [5, 64], [5, 64], [5, 64],         // 11011xxxx
-    [5, 64], [5, 64], [5, 64], [5, 64],
-    [5, 64], [5, 64], [5, 64], [5, 64],
-    [5, 64], [5, 64], [5, 64], [5, 64],
-    [4, 6], [4, 6], [4, 6], [4, 6],             // 1110xxxxx
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 7], [4, 7], [4, 7], [4, 7],             // 1111xxxxx
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7]
-  ];
-
-  var blackTable1 = [
-    [-1, -1], [-1, -1],                             // 000000000000x
-    [12, ccittEOL], [12, ccittEOL],                 // 000000000001x
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000001xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000010xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000011xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000100xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000101xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000110xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000111xx
-    [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
-    [12, 1984], [12, 1984],                         // 000000010010x
-    [12, 2048], [12, 2048],                         // 000000010011x
-    [12, 2112], [12, 2112],                         // 000000010100x
-    [12, 2176], [12, 2176],                         // 000000010101x
-    [12, 2240], [12, 2240],                         // 000000010110x
-    [12, 2304], [12, 2304],                         // 000000010111x
-    [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
-    [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
-    [12, 2368], [12, 2368],                         // 000000011100x
-    [12, 2432], [12, 2432],                         // 000000011101x
-    [12, 2496], [12, 2496],                         // 000000011110x
-    [12, 2560], [12, 2560],                         // 000000011111x
-    [10, 18], [10, 18], [10, 18], [10, 18],         // 0000001000xxx
-    [10, 18], [10, 18], [10, 18], [10, 18],
-    [12, 52], [12, 52],                             // 000000100100x
-    [13, 640],                                      // 0000001001010
-    [13, 704],                                      // 0000001001011
-    [13, 768],                                      // 0000001001100
-    [13, 832],                                      // 0000001001101
-    [12, 55], [12, 55],                             // 000000100111x
-    [12, 56], [12, 56],                             // 000000101000x
-    [13, 1280],                                     // 0000001010010
-    [13, 1344],                                     // 0000001010011
-    [13, 1408],                                     // 0000001010100
-    [13, 1472],                                     // 0000001010101
-    [12, 59], [12, 59],                             // 000000101011x
-    [12, 60], [12, 60],                             // 000000101100x
-    [13, 1536],                                     // 0000001011010
-    [13, 1600],                                     // 0000001011011
-    [11, 24], [11, 24], [11, 24], [11, 24],         // 00000010111xx
-    [11, 25], [11, 25], [11, 25], [11, 25],         // 00000011000xx
-    [13, 1664],                                     // 0000001100100
-    [13, 1728],                                     // 0000001100101
-    [12, 320], [12, 320],                           // 000000110011x
-    [12, 384], [12, 384],                           // 000000110100x
-    [12, 448], [12, 448],                           // 000000110101x
-    [13, 512],                                      // 0000001101100
-    [13, 576],                                      // 0000001101101
-    [12, 53], [12, 53],                             // 000000110111x
-    [12, 54], [12, 54],                             // 000000111000x
-    [13, 896],                                      // 0000001110010
-    [13, 960],                                      // 0000001110011
-    [13, 1024],                                     // 0000001110100
-    [13, 1088],                                     // 0000001110101
-    [13, 1152],                                     // 0000001110110
-    [13, 1216],                                     // 0000001110111
-    [10, 64], [10, 64], [10, 64], [10, 64],         // 0000001111xxx
-    [10, 64], [10, 64], [10, 64], [10, 64]
-  ];
-
-  var blackTable2 = [
-    [8, 13], [8, 13], [8, 13], [8, 13],     // 00000100xxxx
-    [8, 13], [8, 13], [8, 13], [8, 13],
-    [8, 13], [8, 13], [8, 13], [8, 13],
-    [8, 13], [8, 13], [8, 13], [8, 13],
-    [11, 23], [11, 23],                     // 00000101000x
-    [12, 50],                               // 000001010010
-    [12, 51],                               // 000001010011
-    [12, 44],                               // 000001010100
-    [12, 45],                               // 000001010101
-    [12, 46],                               // 000001010110
-    [12, 47],                               // 000001010111
-    [12, 57],                               // 000001011000
-    [12, 58],                               // 000001011001
-    [12, 61],                               // 000001011010
-    [12, 256],                              // 000001011011
-    [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
-    [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
-    [12, 48],                               // 000001100100
-    [12, 49],                               // 000001100101
-    [12, 62],                               // 000001100110
-    [12, 63],                               // 000001100111
-    [12, 30],                               // 000001101000
-    [12, 31],                               // 000001101001
-    [12, 32],                               // 000001101010
-    [12, 33],                               // 000001101011
-    [12, 40],                               // 000001101100
-    [12, 41],                               // 000001101101
-    [11, 22], [11, 22],                     // 00000110111x
-    [8, 14], [8, 14], [8, 14], [8, 14],     // 00000111xxxx
-    [8, 14], [8, 14], [8, 14], [8, 14],
-    [8, 14], [8, 14], [8, 14], [8, 14],
-    [8, 14], [8, 14], [8, 14], [8, 14],
-    [7, 10], [7, 10], [7, 10], [7, 10],     // 0000100xxxxx
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 11], [7, 11], [7, 11], [7, 11],     // 0000101xxxxx
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [9, 15], [9, 15], [9, 15], [9, 15],     // 000011000xxx
-    [9, 15], [9, 15], [9, 15], [9, 15],
-    [12, 128],                              // 000011001000
-    [12, 192],                              // 000011001001
-    [12, 26],                               // 000011001010
-    [12, 27],                               // 000011001011
-    [12, 28],                               // 000011001100
-    [12, 29],                               // 000011001101
-    [11, 19], [11, 19],                     // 00001100111x
-    [11, 20], [11, 20],                     // 00001101000x
-    [12, 34],                               // 000011010010
-    [12, 35],                               // 000011010011
-    [12, 36],                               // 000011010100
-    [12, 37],                               // 000011010101
-    [12, 38],                               // 000011010110
-    [12, 39],                               // 000011010111
-    [11, 21], [11, 21],                     // 00001101100x
-    [12, 42],                               // 000011011010
-    [12, 43],                               // 000011011011
-    [10, 0], [10, 0], [10, 0], [10, 0],     // 0000110111xx
-    [7, 12], [7, 12], [7, 12], [7, 12],     // 0000111xxxxx
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12]
-  ];
-
-  var blackTable3 = [
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
-    [6, 9],                                 // 000100
-    [6, 8],                                 // 000101
-    [5, 7], [5, 7],                         // 00011x
-    [4, 6], [4, 6], [4, 6], [4, 6],         // 0010xx
-    [4, 5], [4, 5], [4, 5], [4, 5],         // 0011xx
-    [3, 1], [3, 1], [3, 1], [3, 1],         // 010xxx
-    [3, 1], [3, 1], [3, 1], [3, 1],
-    [3, 4], [3, 4], [3, 4], [3, 4],         // 011xxx
-    [3, 4], [3, 4], [3, 4], [3, 4],
-    [2, 3], [2, 3], [2, 3], [2, 3],         // 10xxxx
-    [2, 3], [2, 3], [2, 3], [2, 3],
-    [2, 3], [2, 3], [2, 3], [2, 3],
-    [2, 3], [2, 3], [2, 3], [2, 3],
-    [2, 2], [2, 2], [2, 2], [2, 2],         // 11xxxx
-    [2, 2], [2, 2], [2, 2], [2, 2],
-    [2, 2], [2, 2], [2, 2], [2, 2],
-    [2, 2], [2, 2], [2, 2], [2, 2]
-  ];
-
-  function CCITTFaxStream(str, maybeLength, params) {
-    this.str = str;
-    this.dict = str.dict;
-
-    params = params || Dict.empty;
-
-    this.encoding = params.get('K') || 0;
-    this.eoline = params.get('EndOfLine') || false;
-    this.byteAlign = params.get('EncodedByteAlign') || false;
-    this.columns = params.get('Columns') || 1728;
-    this.rows = params.get('Rows') || 0;
-    var eoblock = params.get('EndOfBlock');
-    if (eoblock === null || eoblock === undefined) {
-      eoblock = true;
-    }
-    this.eoblock = eoblock;
-    this.black = params.get('BlackIs1') || false;
-
-    this.codingLine = new Uint32Array(this.columns + 1);
-    this.refLine = new Uint32Array(this.columns + 2);
-
-    this.codingLine[0] = this.columns;
-    this.codingPos = 0;
-
-    this.row = 0;
-    this.nextLine2D = this.encoding < 0;
-    this.inputBits = 0;
-    this.inputBuf = 0;
-    this.outputBits = 0;
-
-    var code1;
-    while ((code1 = this.lookBits(12)) === 0) {
-      this.eatBits(1);
-    }
-    if (code1 === 1) {
-      this.eatBits(12);
-    }
-    if (this.encoding > 0) {
-      this.nextLine2D = !this.lookBits(1);
-      this.eatBits(1);
-    }
-
-    DecodeStream.call(this, maybeLength);
-  }
-
-  CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
-
-  CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
-    while (!this.eof) {
-      var c = this.lookChar();
-      this.ensureBuffer(this.bufferLength + 1);
-      this.buffer[this.bufferLength++] = c;
-    }
-  };
-
-  CCITTFaxStream.prototype.addPixels =
-      function ccittFaxStreamAddPixels(a1, blackPixels) {
-    var codingLine = this.codingLine;
-    var codingPos = this.codingPos;
-
-    if (a1 > codingLine[codingPos]) {
-      if (a1 > this.columns) {
-        info('row is wrong length');
-        this.err = true;
-        a1 = this.columns;
-      }
-      if ((codingPos & 1) ^ blackPixels) {
-        ++codingPos;
-      }
-
-      codingLine[codingPos] = a1;
-    }
-    this.codingPos = codingPos;
-  };
-
-  CCITTFaxStream.prototype.addPixelsNeg =
-      function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
-    var codingLine = this.codingLine;
-    var codingPos = this.codingPos;
-
-    if (a1 > codingLine[codingPos]) {
-      if (a1 > this.columns) {
-        info('row is wrong length');
-        this.err = true;
-        a1 = this.columns;
-      }
-      if ((codingPos & 1) ^ blackPixels) {
-        ++codingPos;
-      }
-
-      codingLine[codingPos] = a1;
-    } else if (a1 < codingLine[codingPos]) {
-      if (a1 < 0) {
-        info('invalid code');
-        this.err = true;
-        a1 = 0;
-      }
-      while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {
-        --codingPos;
-      }
-      codingLine[codingPos] = a1;
-    }
-
-    this.codingPos = codingPos;
-  };
-
-  CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
-    var refLine = this.refLine;
-    var codingLine = this.codingLine;
-    var columns = this.columns;
-
-    var refPos, blackPixels, bits, i;
-
-    if (this.outputBits === 0) {
-      if (this.eof) {
-        return null;
-      }
-      this.err = false;
-
-      var code1, code2, code3;
-      if (this.nextLine2D) {
-        for (i = 0; codingLine[i] < columns; ++i) {
-          refLine[i] = codingLine[i];
-        }
-        refLine[i++] = columns;
-        refLine[i] = columns;
-        codingLine[0] = 0;
-        this.codingPos = 0;
-        refPos = 0;
-        blackPixels = 0;
-
-        while (codingLine[this.codingPos] < columns) {
-          code1 = this.getTwoDimCode();
-          switch (code1) {
-            case twoDimPass:
-              this.addPixels(refLine[refPos + 1], blackPixels);
-              if (refLine[refPos + 1] < columns) {
-                refPos += 2;
-              }
-              break;
-            case twoDimHoriz:
-              code1 = code2 = 0;
-              if (blackPixels) {
-                do {
-                  code1 += (code3 = this.getBlackCode());
-                } while (code3 >= 64);
-                do {
-                  code2 += (code3 = this.getWhiteCode());
-                } while (code3 >= 64);
-              } else {
-                do {
-                  code1 += (code3 = this.getWhiteCode());
-                } while (code3 >= 64);
-                do {
-                  code2 += (code3 = this.getBlackCode());
-                } while (code3 >= 64);
-              }
-              this.addPixels(codingLine[this.codingPos] +
-                             code1, blackPixels);
-              if (codingLine[this.codingPos] < columns) {
-                this.addPixels(codingLine[this.codingPos] + code2,
-                               blackPixels ^ 1);
-              }
-              while (refLine[refPos] <= codingLine[this.codingPos] &&
-                     refLine[refPos] < columns) {
-                refPos += 2;
-              }
-              break;
-            case twoDimVertR3:
-              this.addPixels(refLine[refPos] + 3, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns) {
-                  refPos += 2;
-                }
-              }
-              break;
-            case twoDimVertR2:
-              this.addPixels(refLine[refPos] + 2, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns) {
-                  refPos += 2;
-                }
-              }
-              break;
-            case twoDimVertR1:
-              this.addPixels(refLine[refPos] + 1, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns) {
-                  refPos += 2;
-                }
-              }
-              break;
-            case twoDimVert0:
-              this.addPixels(refLine[refPos], blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns) {
-                  refPos += 2;
-                }
-              }
-              break;
-            case twoDimVertL3:
-              this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                if (refPos > 0) {
-                  --refPos;
-                } else {
-                  ++refPos;
-                }
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns) {
-                  refPos += 2;
-                }
-              }
-              break;
-            case twoDimVertL2:
-              this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                if (refPos > 0) {
-                  --refPos;
-                } else {
-                  ++refPos;
-                }
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns) {
-                  refPos += 2;
-                }
-              }
-              break;
-            case twoDimVertL1:
-              this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                if (refPos > 0) {
-                  --refPos;
-                } else {
-                  ++refPos;
-                }
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns) {
-                  refPos += 2;
-                }
-              }
-              break;
-            case EOF:
-              this.addPixels(columns, 0);
-              this.eof = true;
-              break;
-            default:
-              info('bad 2d code');
-              this.addPixels(columns, 0);
-              this.err = true;
-          }
-        }
-      } else {
-        codingLine[0] = 0;
-        this.codingPos = 0;
-        blackPixels = 0;
-        while (codingLine[this.codingPos] < columns) {
-          code1 = 0;
-          if (blackPixels) {
-            do {
-              code1 += (code3 = this.getBlackCode());
-            } while (code3 >= 64);
-          } else {
-            do {
-              code1 += (code3 = this.getWhiteCode());
-            } while (code3 >= 64);
-          }
-          this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
-          blackPixels ^= 1;
-        }
-      }
-
-      var gotEOL = false;
-
-      if (this.byteAlign) {
-        this.inputBits &= ~7;
-      }
-
-      if (!this.eoblock && this.row === this.rows - 1) {
-        this.eof = true;
-      } else {
-        code1 = this.lookBits(12);
-        if (this.eoline) {
-          while (code1 !== EOF && code1 !== 1) {
-            this.eatBits(1);
-            code1 = this.lookBits(12);
-          }
-        } else {
-          while (code1 === 0) {
-            this.eatBits(1);
-            code1 = this.lookBits(12);
-          }
-        }
-        if (code1 === 1) {
-          this.eatBits(12);
-          gotEOL = true;
-        } else if (code1 === EOF) {
-          this.eof = true;
-        }
-      }
-
-      if (!this.eof && this.encoding > 0) {
-        this.nextLine2D = !this.lookBits(1);
-        this.eatBits(1);
-      }
-
-      if (this.eoblock && gotEOL && this.byteAlign) {
-        code1 = this.lookBits(12);
-        if (code1 === 1) {
-          this.eatBits(12);
-          if (this.encoding > 0) {
-            this.lookBits(1);
-            this.eatBits(1);
-          }
-          if (this.encoding >= 0) {
-            for (i = 0; i < 4; ++i) {
-              code1 = this.lookBits(12);
-              if (code1 !== 1) {
-                info('bad rtc code: ' + code1);
-              }
-              this.eatBits(12);
-              if (this.encoding > 0) {
-                this.lookBits(1);
-                this.eatBits(1);
-              }
-            }
-          }
-          this.eof = true;
-        }
-      } else if (this.err && this.eoline) {
-        while (true) {
-          code1 = this.lookBits(13);
-          if (code1 === EOF) {
-            this.eof = true;
-            return null;
-          }
-          if ((code1 >> 1) === 1) {
-            break;
-          }
-          this.eatBits(1);
-        }
-        this.eatBits(12);
-        if (this.encoding > 0) {
-          this.eatBits(1);
-          this.nextLine2D = !(code1 & 1);
-        }
-      }
-
-      if (codingLine[0] > 0) {
-        this.outputBits = codingLine[this.codingPos = 0];
-      } else {
-        this.outputBits = codingLine[this.codingPos = 1];
-      }
-      this.row++;
-    }
-
-    var c;
-    if (this.outputBits >= 8) {
-      c = (this.codingPos & 1) ? 0 : 0xFF;
-      this.outputBits -= 8;
-      if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {
-        this.codingPos++;
-        this.outputBits = (codingLine[this.codingPos] -
-                           codingLine[this.codingPos - 1]);
-      }
-    } else {
-      bits = 8;
-      c = 0;
-      do {
-        if (this.outputBits > bits) {
-          c <<= bits;
-          if (!(this.codingPos & 1)) {
-            c |= 0xFF >> (8 - bits);
-          }
-          this.outputBits -= bits;
-          bits = 0;
-        } else {
-          c <<= this.outputBits;
-          if (!(this.codingPos & 1)) {
-            c |= 0xFF >> (8 - this.outputBits);
-          }
-          bits -= this.outputBits;
-          this.outputBits = 0;
-          if (codingLine[this.codingPos] < columns) {
-            this.codingPos++;
-            this.outputBits = (codingLine[this.codingPos] -
-                               codingLine[this.codingPos - 1]);
-          } else if (bits > 0) {
-            c <<= bits;
-            bits = 0;
-          }
-        }
-      } while (bits);
-    }
-    if (this.black) {
-      c ^= 0xFF;
-    }
-    return c;
-  };
-
-  // This functions returns the code found from the table.
-  // The start and end parameters set the boundaries for searching the table.
-  // The limit parameter is optional. Function returns an array with three
-  // values. The first array element indicates whether a valid code is being
-  // returned. The second array element is the actual code. The third array
-  // element indicates whether EOF was reached.
-  CCITTFaxStream.prototype.findTableCode =
-      function ccittFaxStreamFindTableCode(start, end, table, limit) {
-
-    var limitValue = limit || 0;
-    for (var i = start; i <= end; ++i) {
-      var code = this.lookBits(i);
-      if (code === EOF) {
-        return [true, 1, false];
-      }
-      if (i < end) {
-        code <<= end - i;
-      }
-      if (!limitValue || code >= limitValue) {
-        var p = table[code - limitValue];
-        if (p[0] === i) {
-          this.eatBits(i);
-          return [true, p[1], true];
-        }
-      }
-    }
-    return [false, 0, false];
-  };
-
-  CCITTFaxStream.prototype.getTwoDimCode =
-      function ccittFaxStreamGetTwoDimCode() {
-
-    var code = 0;
-    var p;
-    if (this.eoblock) {
-      code = this.lookBits(7);
-      p = twoDimTable[code];
-      if (p && p[0] > 0) {
-        this.eatBits(p[0]);
-        return p[1];
-      }
-    } else {
-      var result = this.findTableCode(1, 7, twoDimTable);
-      if (result[0] && result[2]) {
-        return result[1];
-      }
-    }
-    info('Bad two dim code');
-    return EOF;
-  };
-
-  CCITTFaxStream.prototype.getWhiteCode =
-      function ccittFaxStreamGetWhiteCode() {
-
-    var code = 0;
-    var p;
-    if (this.eoblock) {
-      code = this.lookBits(12);
-      if (code === EOF) {
-        return 1;
-      }
-
-      if ((code >> 5) === 0) {
-        p = whiteTable1[code];
-      } else {
-        p = whiteTable2[code >> 3];
-      }
-
-      if (p[0] > 0) {
-        this.eatBits(p[0]);
-        return p[1];
-      }
-    } else {
-      var result = this.findTableCode(1, 9, whiteTable2);
-      if (result[0]) {
-        return result[1];
-      }
-
-      result = this.findTableCode(11, 12, whiteTable1);
-      if (result[0]) {
-        return result[1];
-      }
-    }
-    info('bad white code');
-    this.eatBits(1);
-    return 1;
-  };
-
-  CCITTFaxStream.prototype.getBlackCode =
-      function ccittFaxStreamGetBlackCode() {
-
-    var code, p;
-    if (this.eoblock) {
-      code = this.lookBits(13);
-      if (code === EOF) {
-        return 1;
-      }
-      if ((code >> 7) === 0) {
-        p = blackTable1[code];
-      } else if ((code >> 9) === 0 && (code >> 7) !== 0) {
-        p = blackTable2[(code >> 1) - 64];
-      } else {
-        p = blackTable3[code >> 7];
-      }
-
-      if (p[0] > 0) {
-        this.eatBits(p[0]);
-        return p[1];
-      }
-    } else {
-      var result = this.findTableCode(2, 6, blackTable3);
-      if (result[0]) {
-        return result[1];
-      }
-
-      result = this.findTableCode(7, 12, blackTable2, 64);
-      if (result[0]) {
-        return result[1];
-      }
-
-      result = this.findTableCode(10, 13, blackTable1);
-      if (result[0]) {
-        return result[1];
-      }
-    }
-    info('bad black code');
-    this.eatBits(1);
-    return 1;
-  };
-
-  CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
-    var c;
-    while (this.inputBits < n) {
-      if ((c = this.str.getByte()) === -1) {
-        if (this.inputBits === 0) {
-          return EOF;
-        }
-        return ((this.inputBuf << (n - this.inputBits)) &
-                (0xFFFF >> (16 - n)));
-      }
-      this.inputBuf = (this.inputBuf << 8) + c;
-      this.inputBits += 8;
-    }
-    return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
-  };
-
-  CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
-    if ((this.inputBits -= n) < 0) {
-      this.inputBits = 0;
-    }
-  };
-
-  return CCITTFaxStream;
-})();
-
-var LZWStream = (function LZWStreamClosure() {
-  function LZWStream(str, maybeLength, earlyChange) {
-    this.str = str;
-    this.dict = str.dict;
-    this.cachedData = 0;
-    this.bitsCached = 0;
-
-    var maxLzwDictionarySize = 4096;
-    var lzwState = {
-      earlyChange: earlyChange,
-      codeLength: 9,
-      nextCode: 258,
-      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
-      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
-      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
-      currentSequence: new Uint8Array(maxLzwDictionarySize),
-      currentSequenceLength: 0
-    };
-    for (var i = 0; i < 256; ++i) {
-      lzwState.dictionaryValues[i] = i;
-      lzwState.dictionaryLengths[i] = 1;
-    }
-    this.lzwState = lzwState;
-
-    DecodeStream.call(this, maybeLength);
-  }
-
-  LZWStream.prototype = Object.create(DecodeStream.prototype);
-
-  LZWStream.prototype.readBits = function LZWStream_readBits(n) {
-    var bitsCached = this.bitsCached;
-    var cachedData = this.cachedData;
-    while (bitsCached < n) {
-      var c = this.str.getByte();
-      if (c === -1) {
-        this.eof = true;
-        return null;
-      }
-      cachedData = (cachedData << 8) | c;
-      bitsCached += 8;
-    }
-    this.bitsCached = (bitsCached -= n);
-    this.cachedData = cachedData;
-    this.lastCode = null;
-    return (cachedData >>> bitsCached) & ((1 << n) - 1);
-  };
-
-  LZWStream.prototype.readBlock = function LZWStream_readBlock() {
-    var blockSize = 512;
-    var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
-    var i, j, q;
-
-    var lzwState = this.lzwState;
-    if (!lzwState) {
-      return; // eof was found
-    }
-
-    var earlyChange = lzwState.earlyChange;
-    var nextCode = lzwState.nextCode;
-    var dictionaryValues = lzwState.dictionaryValues;
-    var dictionaryLengths = lzwState.dictionaryLengths;
-    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
-    var codeLength = lzwState.codeLength;
-    var prevCode = lzwState.prevCode;
-    var currentSequence = lzwState.currentSequence;
-    var currentSequenceLength = lzwState.currentSequenceLength;
-
-    var decodedLength = 0;
-    var currentBufferLength = this.bufferLength;
-    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
-
-    for (i = 0; i < blockSize; i++) {
-      var code = this.readBits(codeLength);
-      var hasPrev = currentSequenceLength > 0;
-      if (code < 256) {
-        currentSequence[0] = code;
-        currentSequenceLength = 1;
-      } else if (code >= 258) {
-        if (code < nextCode) {
-          currentSequenceLength = dictionaryLengths[code];
-          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
-            currentSequence[j] = dictionaryValues[q];
-            q = dictionaryPrevCodes[q];
-          }
-        } else {
-          currentSequence[currentSequenceLength++] = currentSequence[0];
-        }
-      } else if (code === 256) {
-        codeLength = 9;
-        nextCode = 258;
-        currentSequenceLength = 0;
-        continue;
-      } else {
-        this.eof = true;
-        delete this.lzwState;
-        break;
-      }
-
-      if (hasPrev) {
-        dictionaryPrevCodes[nextCode] = prevCode;
-        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
-        dictionaryValues[nextCode] = currentSequence[0];
-        nextCode++;
-        codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
-          codeLength : Math.min(Math.log(nextCode + earlyChange) /
-          0.6931471805599453 + 1, 12) | 0;
-      }
-      prevCode = code;
-
-      decodedLength += currentSequenceLength;
-      if (estimatedDecodedSize < decodedLength) {
-        do {
-          estimatedDecodedSize += decodedSizeDelta;
-        } while (estimatedDecodedSize < decodedLength);
-        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
-      }
-      for (j = 0; j < currentSequenceLength; j++) {
-        buffer[currentBufferLength++] = currentSequence[j];
-      }
-    }
-    lzwState.nextCode = nextCode;
-    lzwState.codeLength = codeLength;
-    lzwState.prevCode = prevCode;
-    lzwState.currentSequenceLength = currentSequenceLength;
-
-    this.bufferLength = currentBufferLength;
-  };
-
-  return LZWStream;
-})();
-
-var NullStream = (function NullStreamClosure() {
-  function NullStream() {
-    Stream.call(this, new Uint8Array(0));
-  }
-
-  NullStream.prototype = Stream.prototype;
-
-  return NullStream;
-})();
-
-
-var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
-  setup: function wphSetup(handler) {
-    var pdfManager;
-
-    function loadDocument(recoveryMode) {
-      var loadDocumentCapability = createPromiseCapability();
-
-      var parseSuccess = function parseSuccess() {
-        var numPagesPromise = pdfManager.ensureDoc('numPages');
-        var fingerprintPromise = pdfManager.ensureDoc('fingerprint');
-        var encryptedPromise = pdfManager.ensureXRef('encrypt');
-        Promise.all([numPagesPromise, fingerprintPromise,
-                     encryptedPromise]).then(function onDocReady(results) {
-          var doc = {
-            numPages: results[0],
-            fingerprint: results[1],
-            encrypted: !!results[2],
-          };
-          loadDocumentCapability.resolve(doc);
-        },
-        parseFailure);
-      };
-
-      var parseFailure = function parseFailure(e) {
-        loadDocumentCapability.reject(e);
-      };
-
-      pdfManager.ensureDoc('checkHeader', []).then(function() {
-        pdfManager.ensureDoc('parseStartXRef', []).then(function() {
-          pdfManager.ensureDoc('parse', [recoveryMode]).then(
-            parseSuccess, parseFailure);
-        }, parseFailure);
-      }, parseFailure);
-
-      return loadDocumentCapability.promise;
-    }
-
-    function getPdfManager(data) {
-      var pdfManagerCapability = createPromiseCapability();
-
-      var source = data.source;
-      var disableRange = data.disableRange;
-      if (source.data) {
-        try {
-          pdfManager = new LocalPdfManager(source.data, source.password);
-          pdfManagerCapability.resolve();
-        } catch (ex) {
-          pdfManagerCapability.reject(ex);
-        }
-        return pdfManagerCapability.promise;
-      } else if (source.chunkedViewerLoading) {
-        try {
-          pdfManager = new NetworkPdfManager(source, handler);
-          pdfManagerCapability.resolve();
-        } catch (ex) {
-          pdfManagerCapability.reject(ex);
-        }
-        return pdfManagerCapability.promise;
-      }
-
-      var networkManager = new NetworkManager(source.url, {
-        httpHeaders: source.httpHeaders,
-        withCredentials: source.withCredentials
-      });
-      var cachedChunks = [];
-      var fullRequestXhrId = networkManager.requestFull({
-        onHeadersReceived: function onHeadersReceived() {
-          if (disableRange) {
-            return;
-          }
-
-          var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);
-          if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {
-            return;
-          }
-
-          var contentEncoding =
-            fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';
-          if (contentEncoding !== 'identity') {
-            return;
-          }
-
-          var length = fullRequestXhr.getResponseHeader('Content-Length');
-          length = parseInt(length, 10);
-          if (!isInt(length)) {
-            return;
-          }
-          source.length = length;
-          if (length <= 2 * RANGE_CHUNK_SIZE) {
-            // The file size is smaller than the size of two chunks, so it does
-            // not make any sense to abort the request and retry with a range
-            // request.
-            return;
-          }
-
-          if (networkManager.isStreamingRequest(fullRequestXhrId)) {
-            // We can continue fetching when progressive loading is enabled,
-            // and we don't need the autoFetch feature.
-            source.disableAutoFetch = true;
-          } else {
-            // NOTE: by cancelling the full request, and then issuing range
-            // requests, there will be an issue for sites where you can only
-            // request the pdf once. However, if this is the case, then the
-            // server should not be returning that it can support range
-            // requests.
-            networkManager.abortRequest(fullRequestXhrId);
-          }
-
-          try {
-            pdfManager = new NetworkPdfManager(source, handler);
-            pdfManagerCapability.resolve(pdfManager);
-          } catch (ex) {
-            pdfManagerCapability.reject(ex);
-          }
-        },
-
-        onProgressiveData: source.disableStream ? null :
-            function onProgressiveData(chunk) {
-          if (!pdfManager) {
-            cachedChunks.push(chunk);
-            return;
-          }
-          pdfManager.sendProgressiveData(chunk);
-        },
-
-        onDone: function onDone(args) {
-          if (pdfManager) {
-            return; // already processed
-          }
-
-          var pdfFile;
-          if (args === null) {
-            // TODO add some streaming manager, e.g. for unknown length files.
-            // The data was returned in the onProgressiveData, combining...
-            var pdfFileLength = 0, pos = 0;
-            cachedChunks.forEach(function (chunk) {
-              pdfFileLength += chunk.byteLength;
-            });
-            if (source.length && pdfFileLength !== source.length) {
-              warn('reported HTTP length is different from actual');
-            }
-            var pdfFileArray = new Uint8Array(pdfFileLength);
-            cachedChunks.forEach(function (chunk) {
-              pdfFileArray.set(new Uint8Array(chunk), pos);
-              pos += chunk.byteLength;
-            });
-            pdfFile = pdfFileArray.buffer;
-          } else {
-            pdfFile = args.chunk;
-          }
-
-          // the data is array, instantiating directly from it
-          try {
-            pdfManager = new LocalPdfManager(pdfFile, source.password);
-            pdfManagerCapability.resolve();
-          } catch (ex) {
-            pdfManagerCapability.reject(ex);
-          }
-        },
-
-        onError: function onError(status) {
-          var exception;
-          if (status === 404) {
-            exception = new MissingPDFException('Missing PDF "' +
-                                                source.url + '".');
-            handler.send('MissingPDF', exception);
-          } else {
-            exception = new UnexpectedResponseException(
-              'Unexpected server response (' + status +
-              ') while retrieving PDF "' + source.url + '".', status);
-            handler.send('UnexpectedResponse', exception);
-          }
-        },
-
-        onProgress: function onProgress(evt) {
-          handler.send('DocProgress', {
-            loaded: evt.loaded,
-            total: evt.lengthComputable ? evt.total : source.length
-          });
-        }
-      });
-
-      return pdfManagerCapability.promise;
-    }
-
-    handler.on('test', function wphSetupTest(data) {
-      // check if Uint8Array can be sent to worker
-      if (!(data instanceof Uint8Array)) {
-        handler.send('test', false);
-        return;
-      }
-      // making sure postMessage transfers are working
-      var supportTransfers = data[0] === 255;
-      handler.postMessageTransfers = supportTransfers;
-      // check if the response property is supported by xhr
-      var xhr = new XMLHttpRequest();
-      var responseExists = 'response' in xhr;
-      // check if the property is actually implemented
-      try {
-        var dummy = xhr.responseType;
-      } catch (e) {
-        responseExists = false;
-      }
-      if (!responseExists) {
-        handler.send('test', false);
-        return;
-      }
-      handler.send('test', {
-        supportTypedArray: true,
-        supportTransfers: supportTransfers
-      });
-    });
-
-    handler.on('GetDocRequest', function wphSetupDoc(data) {
-
-      var onSuccess = function(doc) {
-        handler.send('GetDoc', { pdfInfo: doc });
-      };
-
-      var onFailure = function(e) {
-        if (e instanceof PasswordException) {
-          if (e.code === PasswordResponses.NEED_PASSWORD) {
-            handler.send('NeedPassword', e);
-          } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) {
-            handler.send('IncorrectPassword', e);
-          }
-        } else if (e instanceof InvalidPDFException) {
-          handler.send('InvalidPDF', e);
-        } else if (e instanceof MissingPDFException) {
-          handler.send('MissingPDF', e);
-        } else if (e instanceof UnexpectedResponseException) {
-          handler.send('UnexpectedResponse', e);
-        } else {
-          handler.send('UnknownError',
-                       new UnknownErrorException(e.message, e.toString()));
-        }
-      };
-
-      PDFJS.maxImageSize = data.maxImageSize === undefined ?
-                           -1 : data.maxImageSize;
-      PDFJS.disableFontFace = data.disableFontFace;
-      PDFJS.disableCreateObjectURL = data.disableCreateObjectURL;
-      PDFJS.verbosity = data.verbosity;
-      PDFJS.cMapUrl = data.cMapUrl === undefined ?
-                           null : data.cMapUrl;
-      PDFJS.cMapPacked = data.cMapPacked === true;
-
-      getPdfManager(data).then(function () {
-        handler.send('PDFManagerReady', null);
-        pdfManager.onLoadedStream().then(function(stream) {
-          handler.send('DataLoaded', { length: stream.bytes.byteLength });
-        });
-      }).then(function pdfManagerReady() {
-        loadDocument(false).then(onSuccess, function loadFailure(ex) {
-          // Try again with recoveryMode == true
-          if (!(ex instanceof XRefParseException)) {
-            if (ex instanceof PasswordException) {
-              // after password exception prepare to receive a new password
-              // to repeat loading
-              pdfManager.passwordChanged().then(pdfManagerReady);
-            }
-
-            onFailure(ex);
-            return;
-          }
-
-          pdfManager.requestLoadedStream();
-          pdfManager.onLoadedStream().then(function() {
-            loadDocument(true).then(onSuccess, onFailure);
-          });
-        }, onFailure);
-      }, onFailure);
-    });
-
-    handler.on('GetPage', function wphSetupGetPage(data) {
-      return pdfManager.getPage(data.pageIndex).then(function(page) {
-        var rotatePromise = pdfManager.ensure(page, 'rotate');
-        var refPromise = pdfManager.ensure(page, 'ref');
-        var viewPromise = pdfManager.ensure(page, 'view');
-
-        return Promise.all([rotatePromise, refPromise, viewPromise]).then(
-            function(results) {
-          return {
-            rotate: results[0],
-            ref: results[1],
-            view: results[2]
-          };
-        });
-      });
-    });
-
-    handler.on('GetPageIndex', function wphSetupGetPageIndex(data) {
-      var ref = new Ref(data.ref.num, data.ref.gen);
-      var catalog = pdfManager.pdfDocument.catalog;
-      return catalog.getPageIndex(ref);
-    });
-
-    handler.on('GetDestinations',
-      function wphSetupGetDestinations(data) {
-        return pdfManager.ensureCatalog('destinations');
-      }
-    );
-
-    handler.on('GetDestination',
-      function wphSetupGetDestination(data) {
-        return pdfManager.ensureCatalog('getDestination', [ data.id ]);
-      }
-    );
-
-    handler.on('GetAttachments',
-      function wphSetupGetAttachments(data) {
-        return pdfManager.ensureCatalog('attachments');
-      }
-    );
-
-    handler.on('GetJavaScript',
-      function wphSetupGetJavaScript(data) {
-        return pdfManager.ensureCatalog('javaScript');
-      }
-    );
-
-    handler.on('GetOutline',
-      function wphSetupGetOutline(data) {
-        return pdfManager.ensureCatalog('documentOutline');
-      }
-    );
-
-    handler.on('GetMetadata',
-      function wphSetupGetMetadata(data) {
-        return Promise.all([pdfManager.ensureDoc('documentInfo'),
-                            pdfManager.ensureCatalog('metadata')]);
-      }
-    );
-
-    handler.on('GetData', function wphSetupGetData(data) {
-      pdfManager.requestLoadedStream();
-      return pdfManager.onLoadedStream().then(function(stream) {
-        return stream.bytes;
-      });
-    });
-
-    handler.on('GetStats',
-      function wphSetupGetStats(data) {
-        return pdfManager.pdfDocument.xref.stats;
-      }
-    );
-
-    handler.on('UpdatePassword', function wphSetupUpdatePassword(data) {
-      pdfManager.updatePassword(data);
-    });
-
-    handler.on('GetAnnotations', function wphSetupGetAnnotations(data) {
-      return pdfManager.getPage(data.pageIndex).then(function(page) {
-        return pdfManager.ensure(page, 'getAnnotationsData', []);
-      });
-    });
-
-    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
-      pdfManager.getPage(data.pageIndex).then(function(page) {
-
-        var pageNum = data.pageIndex + 1;
-        var start = Date.now();
-        // Pre compile the pdf page and fetch the fonts/images.
-        page.getOperatorList(handler, data.intent).then(function(operatorList) {
-
-          info('page=' + pageNum + ' - getOperatorList: time=' +
-               (Date.now() - start) + 'ms, len=' + operatorList.fnArray.length);
-
-        }, function(e) {
-
-          var minimumStackMessage =
-            'worker.js: while trying to getPage() and getOperatorList()';
-
-          var wrappedException;
-
-          // Turn the error into an obj that can be serialized
-          if (typeof e === 'string') {
-            wrappedException = {
-              message: e,
-              stack: minimumStackMessage
-            };
-          } else if (typeof e === 'object') {
-            wrappedException = {
-              message: e.message || e.toString(),
-              stack: e.stack || minimumStackMessage
-            };
-          } else {
-            wrappedException = {
-              message: 'Unknown exception type: ' + (typeof e),
-              stack: minimumStackMessage
-            };
-          }
-
-          handler.send('PageError', {
-            pageNum: pageNum,
-            error: wrappedException,
-            intent: data.intent
-          });
-        });
-      });
-    }, this);
-
-    handler.on('GetTextContent', function wphExtractText(data) {
-      return pdfManager.getPage(data.pageIndex).then(function(page) {
-        var pageNum = data.pageIndex + 1;
-        var start = Date.now();
-        return page.extractTextContent().then(function(textContent) {
-          info('text indexing: page=' + pageNum + ' - time=' +
-               (Date.now() - start) + 'ms');
-          return textContent;
-        });
-      });
-    });
-
-    handler.on('Cleanup', function wphCleanup(data) {
-      return pdfManager.cleanup();
-    });
-
-    handler.on('Terminate', function wphTerminate(data) {
-      pdfManager.terminate();
-    });
-  }
-};
-
-var consoleTimer = {};
-
-var workerConsole = {
-  log: function log() {
-    var args = Array.prototype.slice.call(arguments);
-    globalScope.postMessage({
-      action: 'console_log',
-      data: args
-    });
-  },
-
-  error: function error() {
-    var args = Array.prototype.slice.call(arguments);
-    globalScope.postMessage({
-      action: 'console_error',
-      data: args
-    });
-    throw 'pdf.js execution error';
-  },
-
-  time: function time(name) {
-    consoleTimer[name] = Date.now();
-  },
-
-  timeEnd: function timeEnd(name) {
-    var time = consoleTimer[name];
-    if (!time) {
-      error('Unknown timer name ' + name);
-    }
-    this.log('Timer:', name, Date.now() - time);
-  }
-};
-
-
-// Worker thread?
-if (typeof window === 'undefined') {
-  if (!('console' in globalScope)) {
-    globalScope.console = workerConsole;
-  }
-
-  // Listen for unsupported features so we can pass them on to the main thread.
-  PDFJS.UnsupportedManager.listen(function (msg) {
-    globalScope.postMessage({
-      action: '_unsupported_feature',
-      data: msg
-    });
-  });
-
-  var handler = new MessageHandler('worker_processor', this);
-  WorkerMessageHandler.setup(handler);
-}
-
-
-/* This class implements the QM Coder decoding as defined in
- *   JPEG 2000 Part I Final Committee Draft Version 1.0
- *   Annex C.3 Arithmetic decoding procedure
- * available at http://www.jpeg.org/public/fcd15444-1.pdf
- *
- * The arithmetic decoder is used in conjunction with context models to decode
- * JPEG2000 and JBIG2 streams.
- */
-var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
-  // Table C-2
-  var QeTable = [
-    {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
-    {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
-    {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
-    {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
-    {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
-    {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
-    {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
-    {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
-    {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
-    {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
-    {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
-    {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
-    {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
-    {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
-    {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
-    {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
-    {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
-    {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
-    {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
-    {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
-    {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
-    {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
-    {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
-    {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
-    {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
-    {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
-    {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
-    {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
-    {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
-    {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
-    {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
-    {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
-    {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
-    {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
-    {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
-    {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
-    {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
-    {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
-    {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
-    {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
-    {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
-    {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
-    {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
-    {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
-    {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
-    {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
-    {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
-  ];
-
-  // C.3.5 Initialisation of the decoder (INITDEC)
-  function ArithmeticDecoder(data, start, end) {
-    this.data = data;
-    this.bp = start;
-    this.dataEnd = end;
-
-    this.chigh = data[start];
-    this.clow = 0;
-
-    this.byteIn();
-
-    this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
-    this.clow = (this.clow << 7) & 0xFFFF;
-    this.ct -= 7;
-    this.a = 0x8000;
-  }
-
-  ArithmeticDecoder.prototype = {
-    // C.3.4 Compressed data input (BYTEIN)
-    byteIn: function ArithmeticDecoder_byteIn() {
-      var data = this.data;
-      var bp = this.bp;
-      if (data[bp] === 0xFF) {
-        var b1 = data[bp + 1];
-        if (b1 > 0x8F) {
-          this.clow += 0xFF00;
-          this.ct = 8;
-        } else {
-          bp++;
-          this.clow += (data[bp] << 9);
-          this.ct = 7;
-          this.bp = bp;
-        }
-      } else {
-        bp++;
-        this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
-        this.ct = 8;
-        this.bp = bp;
-      }
-      if (this.clow > 0xFFFF) {
-        this.chigh += (this.clow >> 16);
-        this.clow &= 0xFFFF;
-      }
-    },
-    // C.3.2 Decoding a decision (DECODE)
-    readBit: function ArithmeticDecoder_readBit(contexts, pos) {
-      // contexts are packed into 1 byte:
-      // highest 7 bits carry cx.index, lowest bit carries cx.mps
-      var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1;
-      var qeTableIcx = QeTable[cx_index];
-      var qeIcx = qeTableIcx.qe;
-      var d;
-      var a = this.a - qeIcx;
-
-      if (this.chigh < qeIcx) {
-        // exchangeLps
-        if (a < qeIcx) {
-          a = qeIcx;
-          d = cx_mps;
-          cx_index = qeTableIcx.nmps;
-        } else {
-          a = qeIcx;
-          d = 1 ^ cx_mps;
-          if (qeTableIcx.switchFlag === 1) {
-            cx_mps = d;
-          }
-          cx_index = qeTableIcx.nlps;
-        }
-      } else {
-        this.chigh -= qeIcx;
-        if ((a & 0x8000) !== 0) {
-          this.a = a;
-          return cx_mps;
-        }
-        // exchangeMps
-        if (a < qeIcx) {
-          d = 1 ^ cx_mps;
-          if (qeTableIcx.switchFlag === 1) {
-            cx_mps = d;
-          }
-          cx_index = qeTableIcx.nlps;
-        } else {
-          d = cx_mps;
-          cx_index = qeTableIcx.nmps;
-        }
-      }
-      // C.3.3 renormD;
-      do {
-        if (this.ct === 0) {
-          this.byteIn();
-        }
-
-        a <<= 1;
-        this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
-        this.clow = (this.clow << 1) & 0xFFFF;
-        this.ct--;
-      } while ((a & 0x8000) === 0);
-      this.a = a;
-
-      contexts[pos] = cx_index << 1 | cx_mps;
-      return d;
-    }
-  };
-
-  return ArithmeticDecoder;
-})();
-
-
-var JpegImage = (function jpegImage() {
-  var dctZigZag = new Uint8Array([
-     0,
-     1,  8,
-    16,  9,  2,
-     3, 10, 17, 24,
-    32, 25, 18, 11, 4,
-     5, 12, 19, 26, 33, 40,
-    48, 41, 34, 27, 20, 13,  6,
-     7, 14, 21, 28, 35, 42, 49, 56,
-    57, 50, 43, 36, 29, 22, 15,
-    23, 30, 37, 44, 51, 58,
-    59, 52, 45, 38, 31,
-    39, 46, 53, 60,
-    61, 54, 47,
-    55, 62,
-    63
-  ]);
-
-  var dctCos1  =  4017;   // cos(pi/16)
-  var dctSin1  =   799;   // sin(pi/16)
-  var dctCos3  =  3406;   // cos(3*pi/16)
-  var dctSin3  =  2276;   // sin(3*pi/16)
-  var dctCos6  =  1567;   // cos(6*pi/16)
-  var dctSin6  =  3784;   // sin(6*pi/16)
-  var dctSqrt2 =  5793;   // sqrt(2)
-  var dctSqrt1d2 = 2896;  // sqrt(2) / 2
-
-  function constructor() {
-  }
-
-  function buildHuffmanTable(codeLengths, values) {
-    var k = 0, code = [], i, j, length = 16;
-    while (length > 0 && !codeLengths[length - 1]) {
-      length--;
-    }
-    code.push({children: [], index: 0});
-    var p = code[0], q;
-    for (i = 0; i < length; i++) {
-      for (j = 0; j < codeLengths[i]; j++) {
-        p = code.pop();
-        p.children[p.index] = values[k];
-        while (p.index > 0) {
-          p = code.pop();
-        }
-        p.index++;
-        code.push(p);
-        while (code.length <= i) {
-          code.push(q = {children: [], index: 0});
-          p.children[p.index] = q.children;
-          p = q;
-        }
-        k++;
-      }
-      if (i + 1 < length) {
-        // p here points to last code
-        code.push(q = {children: [], index: 0});
-        p.children[p.index] = q.children;
-        p = q;
-      }
-    }
-    return code[0].children;
-  }
-
-  function getBlockBufferOffset(component, row, col) {
-    return 64 * ((component.blocksPerLine + 1) * row + col);
-  }
-
-  function decodeScan(data, offset, frame, components, resetInterval,
-                      spectralStart, spectralEnd, successivePrev, successive) {
-    var precision = frame.precision;
-    var samplesPerLine = frame.samplesPerLine;
-    var scanLines = frame.scanLines;
-    var mcusPerLine = frame.mcusPerLine;
-    var progressive = frame.progressive;
-    var maxH = frame.maxH, maxV = frame.maxV;
-
-    var startOffset = offset, bitsData = 0, bitsCount = 0;
-
-    function readBit() {
-      if (bitsCount > 0) {
-        bitsCount--;
-        return (bitsData >> bitsCount) & 1;
-      }
-      bitsData = data[offset++];
-      if (bitsData === 0xFF) {
-        var nextByte = data[offset++];
-        if (nextByte) {
-          throw 'unexpected marker: ' +
-            ((bitsData << 8) | nextByte).toString(16);
-        }
-        // unstuff 0
-      }
-      bitsCount = 7;
-      return bitsData >>> 7;
-    }
-
-    function decodeHuffman(tree) {
-      var node = tree;
-      while (true) {
-        node = node[readBit()];
-        if (typeof node === 'number') {
-          return node;
-        }
-        if (typeof node !== 'object') {
-          throw 'invalid huffman sequence';
-        }
-      }
-    }
-
-    function receive(length) {
-      var n = 0;
-      while (length > 0) {
-        n = (n << 1) | readBit();
-        length--;
-      }
-      return n;
-    }
-
-    function receiveAndExtend(length) {
-      if (length === 1) {
-        return readBit() === 1 ? 1 : -1;
-      }
-      var n = receive(length);
-      if (n >= 1 << (length - 1)) {
-        return n;
-      }
-      return n + (-1 << length) + 1;
-    }
-
-    function decodeBaseline(component, offset) {
-      var t = decodeHuffman(component.huffmanTableDC);
-      var diff = t === 0 ? 0 : receiveAndExtend(t);
-      component.blockData[offset] = (component.pred += diff);
-      var k = 1;
-      while (k < 64) {
-        var rs = decodeHuffman(component.huffmanTableAC);
-        var s = rs & 15, r = rs >> 4;
-        if (s === 0) {
-          if (r < 15) {
-            break;
-          }
-          k += 16;
-          continue;
-        }
-        k += r;
-        var z = dctZigZag[k];
-        component.blockData[offset + z] = receiveAndExtend(s);
-        k++;
-      }
-    }
-
-    function decodeDCFirst(component, offset) {
-      var t = decodeHuffman(component.huffmanTableDC);
-      var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
-      component.blockData[offset] = (component.pred += diff);
-    }
-
-    function decodeDCSuccessive(component, offset) {
-      component.blockData[offset] |= readBit() << successive;
-    }
-
-    var eobrun = 0;
-    function decodeACFirst(component, offset) {
-      if (eobrun > 0) {
-        eobrun--;
-        return;
-      }
-      var k = spectralStart, e = spectralEnd;
-      while (k <= e) {
-        var rs = decodeHuffman(component.huffmanTableAC);
-        var s = rs & 15, r = rs >> 4;
-        if (s === 0) {
-          if (r < 15) {
-            eobrun = receive(r) + (1 << r) - 1;
-            break;
-          }
-          k += 16;
-          continue;
-        }
-        k += r;
-        var z = dctZigZag[k];
-        component.blockData[offset + z] =
-          receiveAndExtend(s) * (1 << successive);
-        k++;
-      }
-    }
-
-    var successiveACState = 0, successiveACNextValue;
-    function decodeACSuccessive(component, offset) {
-      var k = spectralStart;
-      var e = spectralEnd;
-      var r = 0;
-      var s;
-      var rs;
-      while (k <= e) {
-        var z = dctZigZag[k];
-        switch (successiveACState) {
-        case 0: // initial state
-          rs = decodeHuffman(component.huffmanTableAC);
-          s = rs & 15;
-          r = rs >> 4;
-          if (s === 0) {
-            if (r < 15) {
-              eobrun = receive(r) + (1 << r);
-              successiveACState = 4;
-            } else {
-              r = 16;
-              successiveACState = 1;
-            }
-          } else {
-            if (s !== 1) {
-              throw 'invalid ACn encoding';
-            }
-            successiveACNextValue = receiveAndExtend(s);
-            successiveACState = r ? 2 : 3;
-          }
-          continue;
-        case 1: // skipping r zero items
-        case 2:
-          if (component.blockData[offset + z]) {
-            component.blockData[offset + z] += (readBit() << successive);
-          } else {
-            r--;
-            if (r === 0) {
-              successiveACState = successiveACState === 2 ? 3 : 0;
-            }
-          }
-          break;
-        case 3: // set value for a zero item
-          if (component.blockData[offset + z]) {
-            component.blockData[offset + z] += (readBit() << successive);
-          } else {
-            component.blockData[offset + z] =
-              successiveACNextValue << successive;
-            successiveACState = 0;
-          }
-          break;
-        case 4: // eob
-          if (component.blockData[offset + z]) {
-            component.blockData[offset + z] += (readBit() << successive);
-          }
-          break;
-        }
-        k++;
-      }
-      if (successiveACState === 4) {
-        eobrun--;
-        if (eobrun === 0) {
-          successiveACState = 0;
-        }
-      }
-    }
-
-    function decodeMcu(component, decode, mcu, row, col) {
-      var mcuRow = (mcu / mcusPerLine) | 0;
-      var mcuCol = mcu % mcusPerLine;
-      var blockRow = mcuRow * component.v + row;
-      var blockCol = mcuCol * component.h + col;
-      var offset = getBlockBufferOffset(component, blockRow, blockCol);
-      decode(component, offset);
-    }
-
-    function decodeBlock(component, decode, mcu) {
-      var blockRow = (mcu / component.blocksPerLine) | 0;
-      var blockCol = mcu % component.blocksPerLine;
-      var offset = getBlockBufferOffset(component, blockRow, blockCol);
-      decode(component, offset);
-    }
-
-    var componentsLength = components.length;
-    var component, i, j, k, n;
-    var decodeFn;
-    if (progressive) {
-      if (spectralStart === 0) {
-        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
-      } else {
-        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
-      }
-    } else {
-      decodeFn = decodeBaseline;
-    }
-
-    var mcu = 0, marker;
-    var mcuExpected;
-    if (componentsLength === 1) {
-      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
-    } else {
-      mcuExpected = mcusPerLine * frame.mcusPerColumn;
-    }
-    if (!resetInterval) {
-      resetInterval = mcuExpected;
-    }
-
-    var h, v;
-    while (mcu < mcuExpected) {
-      // reset interval stuff
-      for (i = 0; i < componentsLength; i++) {
-        components[i].pred = 0;
-      }
-      eobrun = 0;
-
-      if (componentsLength === 1) {
-        component = components[0];
-        for (n = 0; n < resetInterval; n++) {
-          decodeBlock(component, decodeFn, mcu);
-          mcu++;
-        }
-      } else {
-        for (n = 0; n < resetInterval; n++) {
-          for (i = 0; i < componentsLength; i++) {
-            component = components[i];
-            h = component.h;
-            v = component.v;
-            for (j = 0; j < v; j++) {
-              for (k = 0; k < h; k++) {
-                decodeMcu(component, decodeFn, mcu, j, k);
-              }
-            }
-          }
-          mcu++;
-        }
-      }
-
-      // find marker
-      bitsCount = 0;
-      marker = (data[offset] << 8) | data[offset + 1];
-      if (marker <= 0xFF00) {
-        throw 'marker was not found';
-      }
-
-      if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
-        offset += 2;
-      } else {
-        break;
-      }
-    }
-
-    return offset - startOffset;
-  }
-
-  // A port of poppler's IDCT method which in turn is taken from:
-  //   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
-  //   'Practical Fast 1-D DCT Algorithms with 11 Multiplications',
-  //   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
-  //   988-991.
-  function quantizeAndInverse(component, blockBufferOffset, p) {
-    var qt = component.quantizationTable, blockData = component.blockData;
-    var v0, v1, v2, v3, v4, v5, v6, v7;
-    var p0, p1, p2, p3, p4, p5, p6, p7;
-    var t;
-
-    // inverse DCT on rows
-    for (var row = 0; row < 64; row += 8) {
-      // gather block data
-      p0 = blockData[blockBufferOffset + row];
-      p1 = blockData[blockBufferOffset + row + 1];
-      p2 = blockData[blockBufferOffset + row + 2];
-      p3 = blockData[blockBufferOffset + row + 3];
-      p4 = blockData[blockBufferOffset + row + 4];
-      p5 = blockData[blockBufferOffset + row + 5];
-      p6 = blockData[blockBufferOffset + row + 6];
-      p7 = blockData[blockBufferOffset + row + 7];
-
-      // dequant p0
-      p0 *= qt[row];
-
-      // check for all-zero AC coefficients
-      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
-        t = (dctSqrt2 * p0 + 512) >> 10;
-        p[row] = t;
-        p[row + 1] = t;
-        p[row + 2] = t;
-        p[row + 3] = t;
-        p[row + 4] = t;
-        p[row + 5] = t;
-        p[row + 6] = t;
-        p[row + 7] = t;
-        continue;
-      }
-      // dequant p1 ... p7
-      p1 *= qt[row + 1];
-      p2 *= qt[row + 2];
-      p3 *= qt[row + 3];
-      p4 *= qt[row + 4];
-      p5 *= qt[row + 5];
-      p6 *= qt[row + 6];
-      p7 *= qt[row + 7];
-
-      // stage 4
-      v0 = (dctSqrt2 * p0 + 128) >> 8;
-      v1 = (dctSqrt2 * p4 + 128) >> 8;
-      v2 = p2;
-      v3 = p6;
-      v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8;
-      v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8;
-      v5 = p3 << 4;
-      v6 = p5 << 4;
-
-      // stage 3
-      v0 = (v0 + v1 + 1) >> 1;
-      v1 = v0 - v1;
-      t  = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
-      v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
-      v3 = t;
-      v4 = (v4 + v6 + 1) >> 1;
-      v6 = v4 - v6;
-      v7 = (v7 + v5 + 1) >> 1;
-      v5 = v7 - v5;
-
-      // stage 2
-      v0 = (v0 + v3 + 1) >> 1;
-      v3 = v0 - v3;
-      v1 = (v1 + v2 + 1) >> 1;
-      v2 = v1 - v2;
-      t  = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
-      v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
-      v7 = t;
-      t  = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
-      v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
-      v6 = t;
-
-      // stage 1
-      p[row] = v0 + v7;
-      p[row + 7] = v0 - v7;
-      p[row + 1] = v1 + v6;
-      p[row + 6] = v1 - v6;
-      p[row + 2] = v2 + v5;
-      p[row + 5] = v2 - v5;
-      p[row + 3] = v3 + v4;
-      p[row + 4] = v3 - v4;
-    }
-
-    // inverse DCT on columns
-    for (var col = 0; col < 8; ++col) {
-      p0 = p[col];
-      p1 = p[col +  8];
-      p2 = p[col + 16];
-      p3 = p[col + 24];
-      p4 = p[col + 32];
-      p5 = p[col + 40];
-      p6 = p[col + 48];
-      p7 = p[col + 56];
-
-      // check for all-zero AC coefficients
-      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
-        t = (dctSqrt2 * p0 + 8192) >> 14;
-        // convert to 8 bit
-        t = (t < -2040) ? 0 : (t >= 2024) ? 255 : (t + 2056) >> 4;
-        blockData[blockBufferOffset + col] = t;
-        blockData[blockBufferOffset + col +  8] = t;
-        blockData[blockBufferOffset + col + 16] = t;
-        blockData[blockBufferOffset + col + 24] = t;
-        blockData[blockBufferOffset + col + 32] = t;
-        blockData[blockBufferOffset + col + 40] = t;
-        blockData[blockBufferOffset + col + 48] = t;
-        blockData[blockBufferOffset + col + 56] = t;
-        continue;
-      }
-
-      // stage 4
-      v0 = (dctSqrt2 * p0 + 2048) >> 12;
-      v1 = (dctSqrt2 * p4 + 2048) >> 12;
-      v2 = p2;
-      v3 = p6;
-      v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12;
-      v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12;
-      v5 = p3;
-      v6 = p5;
-
-      // stage 3
-      // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when
-      // converting to UInt8 range later.
-      v0 = ((v0 + v1 + 1) >> 1) + 4112;
-      v1 = v0 - v1;
-      t  = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
-      v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
-      v3 = t;
-      v4 = (v4 + v6 + 1) >> 1;
-      v6 = v4 - v6;
-      v7 = (v7 + v5 + 1) >> 1;
-      v5 = v7 - v5;
-
-      // stage 2
-      v0 = (v0 + v3 + 1) >> 1;
-      v3 = v0 - v3;
-      v1 = (v1 + v2 + 1) >> 1;
-      v2 = v1 - v2;
-      t  = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
-      v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
-      v7 = t;
-      t  = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
-      v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
-      v6 = t;
-
-      // stage 1
-      p0 = v0 + v7;
-      p7 = v0 - v7;
-      p1 = v1 + v6;
-      p6 = v1 - v6;
-      p2 = v2 + v5;
-      p5 = v2 - v5;
-      p3 = v3 + v4;
-      p4 = v3 - v4;
-
-      // convert to 8-bit integers
-      p0 = (p0 < 16) ? 0 : (p0 >= 4080) ? 255 : p0 >> 4;
-      p1 = (p1 < 16) ? 0 : (p1 >= 4080) ? 255 : p1 >> 4;
-      p2 = (p2 < 16) ? 0 : (p2 >= 4080) ? 255 : p2 >> 4;
-      p3 = (p3 < 16) ? 0 : (p3 >= 4080) ? 255 : p3 >> 4;
-      p4 = (p4 < 16) ? 0 : (p4 >= 4080) ? 255 : p4 >> 4;
-      p5 = (p5 < 16) ? 0 : (p5 >= 4080) ? 255 : p5 >> 4;
-      p6 = (p6 < 16) ? 0 : (p6 >= 4080) ? 255 : p6 >> 4;
-      p7 = (p7 < 16) ? 0 : (p7 >= 4080) ? 255 : p7 >> 4;
-
-      // store block data
-      blockData[blockBufferOffset + col] = p0;
-      blockData[blockBufferOffset + col +  8] = p1;
-      blockData[blockBufferOffset + col + 16] = p2;
-      blockData[blockBufferOffset + col + 24] = p3;
-      blockData[blockBufferOffset + col + 32] = p4;
-      blockData[blockBufferOffset + col + 40] = p5;
-      blockData[blockBufferOffset + col + 48] = p6;
-      blockData[blockBufferOffset + col + 56] = p7;
-    }
-  }
-
-  function buildComponentData(frame, component) {
-    var blocksPerLine = component.blocksPerLine;
-    var blocksPerColumn = component.blocksPerColumn;
-    var computationBuffer = new Int16Array(64);
-
-    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
-      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
-        var offset = getBlockBufferOffset(component, blockRow, blockCol);
-        quantizeAndInverse(component, offset, computationBuffer);
-      }
-    }
-    return component.blockData;
-  }
-
-  function clamp0to255(a) {
-    return a <= 0 ? 0 : a >= 255 ? 255 : a;
-  }
-
-  constructor.prototype = {
-    parse: function parse(data) {
-
-      function readUint16() {
-        var value = (data[offset] << 8) | data[offset + 1];
-        offset += 2;
-        return value;
-      }
-
-      function readDataBlock() {
-        var length = readUint16();
-        var array = data.subarray(offset, offset + length - 2);
-        offset += array.length;
-        return array;
-      }
-
-      function prepareComponents(frame) {
-        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
-        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
-        for (var i = 0; i < frame.components.length; i++) {
-          component = frame.components[i];
-          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) *
-                                        component.h / frame.maxH);
-          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines  / 8) *
-                                          component.v / frame.maxV);
-          var blocksPerLineForMcu = mcusPerLine * component.h;
-          var blocksPerColumnForMcu = mcusPerColumn * component.v;
-
-          var blocksBufferSize = 64 * blocksPerColumnForMcu *
-                                      (blocksPerLineForMcu + 1);
-          component.blockData = new Int16Array(blocksBufferSize);
-          component.blocksPerLine = blocksPerLine;
-          component.blocksPerColumn = blocksPerColumn;
-        }
-        frame.mcusPerLine = mcusPerLine;
-        frame.mcusPerColumn = mcusPerColumn;
-      }
-
-      var offset = 0, length = data.length;
-      var jfif = null;
-      var adobe = null;
-      var pixels = null;
-      var frame, resetInterval;
-      var quantizationTables = [];
-      var huffmanTablesAC = [], huffmanTablesDC = [];
-      var fileMarker = readUint16();
-      if (fileMarker !== 0xFFD8) { // SOI (Start of Image)
-        throw 'SOI not found';
-      }
-
-      fileMarker = readUint16();
-      while (fileMarker !== 0xFFD9) { // EOI (End of image)
-        var i, j, l;
-        switch(fileMarker) {
-          case 0xFFE0: // APP0 (Application Specific)
-          case 0xFFE1: // APP1
-          case 0xFFE2: // APP2
-          case 0xFFE3: // APP3
-          case 0xFFE4: // APP4
-          case 0xFFE5: // APP5
-          case 0xFFE6: // APP6
-          case 0xFFE7: // APP7
-          case 0xFFE8: // APP8
-          case 0xFFE9: // APP9
-          case 0xFFEA: // APP10
-          case 0xFFEB: // APP11
-          case 0xFFEC: // APP12
-          case 0xFFED: // APP13
-          case 0xFFEE: // APP14
-          case 0xFFEF: // APP15
-          case 0xFFFE: // COM (Comment)
-            var appData = readDataBlock();
-
-            if (fileMarker === 0xFFE0) {
-              if (appData[0] === 0x4A && appData[1] === 0x46 &&
-                  appData[2] === 0x49 && appData[3] === 0x46 &&
-                  appData[4] === 0) { // 'JFIF\x00'
-                jfif = {
-                  version: { major: appData[5], minor: appData[6] },
-                  densityUnits: appData[7],
-                  xDensity: (appData[8] << 8) | appData[9],
-                  yDensity: (appData[10] << 8) | appData[11],
-                  thumbWidth: appData[12],
-                  thumbHeight: appData[13],
-                  thumbData: appData.subarray(14, 14 +
-                                              3 * appData[12] * appData[13])
-                };
-              }
-            }
-            // TODO APP1 - Exif
-            if (fileMarker === 0xFFEE) {
-              if (appData[0] === 0x41 && appData[1] === 0x64 &&
-                  appData[2] === 0x6F && appData[3] === 0x62 &&
-                  appData[4] === 0x65) { // 'Adobe'
-                adobe = {
-                  version: (appData[5] << 8) | appData[6],
-                  flags0: (appData[7] << 8) | appData[8],
-                  flags1: (appData[9] << 8) | appData[10],
-                  transformCode: appData[11]
-                };
-              }
-            }
-            break;
-
-          case 0xFFDB: // DQT (Define Quantization Tables)
-            var quantizationTablesLength = readUint16();
-            var quantizationTablesEnd = quantizationTablesLength + offset - 2;
-            var z;
-            while (offset < quantizationTablesEnd) {
-              var quantizationTableSpec = data[offset++];
-              var tableData = new Uint16Array(64);
-              if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
-                for (j = 0; j < 64; j++) {
-                  z = dctZigZag[j];
-                  tableData[z] = data[offset++];
-                }
-              } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
-                for (j = 0; j < 64; j++) {
-                  z = dctZigZag[j];
-                  tableData[z] = readUint16();
-                }
-              } else {
-                throw 'DQT: invalid table spec';
-              }
-              quantizationTables[quantizationTableSpec & 15] = tableData;
-            }
-            break;
-
-          case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
-          case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)
-          case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
-            if (frame) {
-              throw 'Only single frame JPEGs supported';
-            }
-            readUint16(); // skip data length
-            frame = {};
-            frame.extended = (fileMarker === 0xFFC1);
-            frame.progressive = (fileMarker === 0xFFC2);
-            frame.precision = data[offset++];
-            frame.scanLines = readUint16();
-            frame.samplesPerLine = readUint16();
-            frame.components = [];
-            frame.componentIds = {};
-            var componentsCount = data[offset++], componentId;
-            var maxH = 0, maxV = 0;
-            for (i = 0; i < componentsCount; i++) {
-              componentId = data[offset];
-              var h = data[offset + 1] >> 4;
-              var v = data[offset + 1] & 15;
-              if (maxH < h) {
-                maxH = h;
-              }
-              if (maxV < v) {
-                maxV = v;
-              }
-              var qId = data[offset + 2];
-              l = frame.components.push({
-                h: h,
-                v: v,
-                quantizationTable: quantizationTables[qId]
-              });
-              frame.componentIds[componentId] = l - 1;
-              offset += 3;
-            }
-            frame.maxH = maxH;
-            frame.maxV = maxV;
-            prepareComponents(frame);
-            break;
-
-          case 0xFFC4: // DHT (Define Huffman Tables)
-            var huffmanLength = readUint16();
-            for (i = 2; i < huffmanLength;) {
-              var huffmanTableSpec = data[offset++];
-              var codeLengths = new Uint8Array(16);
-              var codeLengthSum = 0;
-              for (j = 0; j < 16; j++, offset++) {
-                codeLengthSum += (codeLengths[j] = data[offset]);
-              }
-              var huffmanValues = new Uint8Array(codeLengthSum);
-              for (j = 0; j < codeLengthSum; j++, offset++) {
-                huffmanValues[j] = data[offset];
-              }
-              i += 17 + codeLengthSum;
-
-              ((huffmanTableSpec >> 4) === 0 ?
-                huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
-                buildHuffmanTable(codeLengths, huffmanValues);
-            }
-            break;
-
-          case 0xFFDD: // DRI (Define Restart Interval)
-            readUint16(); // skip data length
-            resetInterval = readUint16();
-            break;
-
-          case 0xFFDA: // SOS (Start of Scan)
-            var scanLength = readUint16();
-            var selectorsCount = data[offset++];
-            var components = [], component;
-            for (i = 0; i < selectorsCount; i++) {
-              var componentIndex = frame.componentIds[data[offset++]];
-              component = frame.components[componentIndex];
-              var tableSpec = data[offset++];
-              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
-              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
-              components.push(component);
-            }
-            var spectralStart = data[offset++];
-            var spectralEnd = data[offset++];
-            var successiveApproximation = data[offset++];
-            var processed = decodeScan(data, offset,
-              frame, components, resetInterval,
-              spectralStart, spectralEnd,
-              successiveApproximation >> 4, successiveApproximation & 15);
-            offset += processed;
-            break;
-
-          case 0xFFFF: // Fill bytes
-            if (data[offset] !== 0xFF) { // Avoid skipping a valid marker.
-              offset--;
-            }
-            break;
-
-          default:
-            if (data[offset - 3] === 0xFF &&
-                data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
-              // could be incorrect encoding -- last 0xFF byte of the previous
-              // block was eaten by the encoder
-              offset -= 3;
-              break;
-            }
-            throw 'unknown JPEG marker ' + fileMarker.toString(16);
-        }
-        fileMarker = readUint16();
-      }
-
-      this.width = frame.samplesPerLine;
-      this.height = frame.scanLines;
-      this.jfif = jfif;
-      this.adobe = adobe;
-      this.components = [];
-      for (i = 0; i < frame.components.length; i++) {
-        component = frame.components[i];
-        this.components.push({
-          output: buildComponentData(frame, component),
-          scaleX: component.h / frame.maxH,
-          scaleY: component.v / frame.maxV,
-          blocksPerLine: component.blocksPerLine,
-          blocksPerColumn: component.blocksPerColumn
-        });
-      }
-      this.numComponents = this.components.length;
-    },
-
-    _getLinearizedBlockData: function getLinearizedBlockData(width, height) {
-      var scaleX = this.width / width, scaleY = this.height / height;
-
-      var component, componentScaleX, componentScaleY, blocksPerScanline;
-      var x, y, i, j, k;
-      var index;
-      var offset = 0;
-      var output;
-      var numComponents = this.components.length;
-      var dataLength = width * height * numComponents;
-      var data = new Uint8Array(dataLength);
-      var xScaleBlockOffset = new Uint32Array(width);
-      var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs
-
-      for (i = 0; i < numComponents; i++) {
-        component = this.components[i];
-        componentScaleX = component.scaleX * scaleX;
-        componentScaleY = component.scaleY * scaleY;
-        offset = i;
-        output = component.output;
-        blocksPerScanline = (component.blocksPerLine + 1) << 3;
-        // precalculate the xScaleBlockOffset
-        for (x = 0; x < width; x++) {
-          j = 0 | (x * componentScaleX);
-          xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7);
-        }
-        // linearize the blocks of the component
-        for (y = 0; y < height; y++) {
-          j = 0 | (y * componentScaleY);
-          index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3);
-          for (x = 0; x < width; x++) {
-            data[offset] = output[index + xScaleBlockOffset[x]];
-            offset += numComponents;
-          }
-        }
-      }
-
-      // decodeTransform contains pairs of multiplier (-256..256) and additive
-      var transform = this.decodeTransform;
-      if (transform) {
-        for (i = 0; i < dataLength;) {
-          for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
-            data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1];
-          }
-        }
-      }
-      return data;
-    },
-
-    _isColorConversionNeeded: function isColorConversionNeeded() {
-      if (this.adobe && this.adobe.transformCode) {
-        // The adobe transform marker overrides any previous setting
-        return true;
-      } else if (this.numComponents === 3) {
-        return true;
-      } else {
-        return false;
-      }
-    },
-
-    _convertYccToRgb: function convertYccToRgb(data) {
-      var Y, Cb, Cr;
-      for (var i = 0, length = data.length; i < length; i += 3) {
-        Y  = data[i    ];
-        Cb = data[i + 1];
-        Cr = data[i + 2];
-        data[i    ] = clamp0to255(Y - 179.456 + 1.402 * Cr);
-        data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr);
-        data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb);
-      }
-      return data;
-    },
-
-    _convertYcckToRgb: function convertYcckToRgb(data) {
-      var Y, Cb, Cr, k;
-      var offset = 0;
-      for (var i = 0, length = data.length; i < length; i += 4) {
-        Y  = data[i];
-        Cb = data[i + 1];
-        Cr = data[i + 2];
-        k = data[i + 3];
-
-        var r = -122.67195406894 +
-          Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr -
-                5.4080610064599e-5 * Y + 0.00048449797120281 * k -
-                0.154362151871126) +
-          Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y -
-                0.00477271405408747 * k + 1.53380253221734) +
-          Y * (0.000961250184130688 * Y - 0.00266257332283933 * k +
-               0.48357088451265) +
-          k * (-0.000336197177618394 * k + 0.484791561490776);
-
-        var g = 107.268039397724 +
-          Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr +
-                0.000659397001245577 * Y + 0.000426105652938837 * k -
-                0.176491792462875) +
-          Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y +
-                0.000770482631801132 * k - 0.151051492775562) +
-          Y * (0.00126935368114843 * Y - 0.00265090189010898 * k +
-               0.25802910206845) +
-          k * (-0.000318913117588328 * k - 0.213742400323665);
-
-        var b = -20.810012546947 +
-          Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr +
-                0.0020741088115012 * Y - 0.00288260236853442 * k +
-                0.814272968359295) +
-          Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y +
-                0.000560833691242812 * k - 0.195152027534049) +
-          Y * (0.00174418132927582 * Y - 0.00255243321439347 * k +
-               0.116935020465145) +
-          k * (-0.000343531996510555 * k + 0.24165260232407);
-
-        data[offset++] = clamp0to255(r);
-        data[offset++] = clamp0to255(g);
-        data[offset++] = clamp0to255(b);
-      }
-      return data;
-    },
-
-    _convertYcckToCmyk: function convertYcckToCmyk(data) {
-      var Y, Cb, Cr;
-      for (var i = 0, length = data.length; i < length; i += 4) {
-        Y  = data[i];
-        Cb = data[i + 1];
-        Cr = data[i + 2];
-        data[i    ] = clamp0to255(434.456 - Y - 1.402 * Cr);
-        data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr);
-        data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb);
-        // K in data[i + 3] is unchanged
-      }
-      return data;
-    },
-
-    _convertCmykToRgb: function convertCmykToRgb(data) {
-      var c, m, y, k;
-      var offset = 0;
-      var min = -255 * 255 * 255;
-      var scale = 1 / 255 / 255;
-      for (var i = 0, length = data.length; i < length; i += 4) {
-        c = data[i];
-        m = data[i + 1];
-        y = data[i + 2];
-        k = data[i + 3];
-
-        var r =
-          c * (-4.387332384609988 * c + 54.48615194189176 * m +
-               18.82290502165302 * y + 212.25662451639585 * k -
-               72734.4411664936) +
-          m * (1.7149763477362134 * m - 5.6096736904047315 * y -
-               17.873870861415444 * k - 1401.7366389350734) +
-          y * (-2.5217340131683033 * y - 21.248923337353073 * k +
-               4465.541406466231) -
-          k * (21.86122147463605 * k + 48317.86113160301);
-        var g =
-          c * (8.841041422036149 * c + 60.118027045597366 * m +
-               6.871425592049007 * y + 31.159100130055922 * k -
-               20220.756542821975) +
-          m * (-15.310361306967817 * m + 17.575251261109482 * y +
-               131.35250912493976 * k - 48691.05921601825) +
-          y * (4.444339102852739 * y + 9.8632861493405 * k -
-               6341.191035517494) -
-          k * (20.737325471181034 * k + 47890.15695978492);
-        var b =
-          c * (0.8842522430003296 * c + 8.078677503112928 * m +
-               30.89978309703729 * y - 0.23883238689178934 * k -
-               3616.812083916688) +
-          m * (10.49593273432072 * m + 63.02378494754052 * y +
-               50.606957656360734 * k - 28620.90484698408) +
-          y * (0.03296041114873217 * y + 115.60384449646641 * k -
-               49363.43385999684) -
-          k * (22.33816807309886 * k + 45932.16563550634);
-
-        data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0;
-        data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0;
-        data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0;
-      }
-      return data;
-    },
-
-    getData: function getData(width, height, forceRGBoutput) {
-      if (this.numComponents > 4) {
-        throw 'Unsupported color mode';
-      }
-      // type of data: Uint8Array(width * height * numComponents)
-      var data = this._getLinearizedBlockData(width, height);
-
-      if (this.numComponents === 3) {
-        return this._convertYccToRgb(data);
-      } else if (this.numComponents === 4) {
-        if (this._isColorConversionNeeded()) {
-          if (forceRGBoutput) {
-            return this._convertYcckToRgb(data);
-          } else {
-            return this._convertYcckToCmyk(data);
-          }
-        } else if (forceRGBoutput) {
-          return this._convertCmykToRgb(data);
-        }
-      }
-      return data;
-    }
-  };
-
-  return constructor;
-})();
-
-
-var JpxImage = (function JpxImageClosure() {
-  // Table E.1
-  var SubbandsGainLog2 = {
-    'LL': 0,
-    'LH': 1,
-    'HL': 1,
-    'HH': 2
-  };
-  function JpxImage() {
-    this.failOnCorruptedImage = false;
-  }
-  JpxImage.prototype = {
-    parse: function JpxImage_parse(data) {
-
-      var head = readUint16(data, 0);
-      // No box header, immediate start of codestream (SOC)
-      if (head === 0xFF4F) {
-        this.parseCodestream(data, 0, data.length);
-        return;
-      }
-
-      var position = 0, length = data.length;
-      while (position < length) {
-        var headerSize = 8;
-        var lbox = readUint32(data, position);
-        var tbox = readUint32(data, position + 4);
-        position += headerSize;
-        if (lbox === 1) {
-          // XLBox: read UInt64 according to spec.
-          // JavaScript's int precision of 53 bit should be sufficient here.
-          lbox = readUint32(data, position) * 4294967296 +
-                 readUint32(data, position + 4);
-          position += 8;
-          headerSize += 8;
-        }
-        if (lbox === 0) {
-          lbox = length - position + headerSize;
-        }
-        if (lbox < headerSize) {
-          throw new Error('JPX Error: Invalid box field size');
-        }
-        var dataLength = lbox - headerSize;
-        var jumpDataLength = true;
-        switch (tbox) {
-          case 0x6A703268: // 'jp2h'
-            jumpDataLength = false; // parsing child boxes
-            break;
-          case 0x636F6C72: // 'colr'
-            // Colorspaces are not used, the CS from the PDF is used.
-            var method = data[position];
-            var precedence = data[position + 1];
-            var approximation = data[position + 2];
-            if (method === 1) {
-              // enumerated colorspace
-              var colorspace = readUint32(data, position + 3);
-              switch (colorspace) {
-                case 16: // this indicates a sRGB colorspace
-                case 17: // this indicates a grayscale colorspace
-                case 18: // this indicates a YUV colorspace
-                  break;
-                default:
-                  warn('Unknown colorspace ' + colorspace);
-                  break;
-              }
-            } else if (method === 2) {
-              info('ICC profile not supported');
-            }
-            break;
-          case 0x6A703263: // 'jp2c'
-            this.parseCodestream(data, position, position + dataLength);
-            break;
-          case 0x6A502020: // 'jP\024\024'
-            if (0x0d0a870a !== readUint32(data, position)) {
-              warn('Invalid JP2 signature');
-            }
-            break;
-          // The following header types are valid but currently not used:
-          case 0x6A501A1A: // 'jP\032\032'
-          case 0x66747970: // 'ftyp'
-          case 0x72726571: // 'rreq'
-          case 0x72657320: // 'res '
-          case 0x69686472: // 'ihdr'
-            break;
-          default:
-            var headerType = String.fromCharCode((tbox >> 24) & 0xFF,
-                                                 (tbox >> 16) & 0xFF,
-                                                 (tbox >> 8) & 0xFF,
-                                                 tbox & 0xFF);
-            warn('Unsupported header type ' + tbox + ' (' + headerType + ')');
-            break;
-        }
-        if (jumpDataLength) {
-          position += dataLength;
-        }
-      }
-    },
-    parseImageProperties: function JpxImage_parseImageProperties(stream) {
-      var newByte = stream.getByte();
-      while (newByte >= 0) {
-        var oldByte = newByte;
-        newByte = stream.getByte();
-        var code = (oldByte << 8) | newByte;
-        // Image and tile size (SIZ)
-        if (code === 0xFF51) {
-          stream.skip(4);
-          var Xsiz = stream.getInt32() >>> 0; // Byte 4
-          var Ysiz = stream.getInt32() >>> 0; // Byte 8
-          var XOsiz = stream.getInt32() >>> 0; // Byte 12
-          var YOsiz = stream.getInt32() >>> 0; // Byte 16
-          stream.skip(16);
-          var Csiz = stream.getUint16(); // Byte 36
-          this.width = Xsiz - XOsiz;
-          this.height = Ysiz - YOsiz;
-          this.componentsCount = Csiz;
-          // Results are always returned as Uint8Arrays
-          this.bitsPerComponent = 8;
-          return;
-        }
-      }
-      throw new Error('JPX Error: No size marker found in JPX stream');
-    },
-    parseCodestream: function JpxImage_parseCodestream(data, start, end) {
-      var context = {};
-      try {
-        var doNotRecover = false;
-        var position = start;
-        while (position + 1 < end) {
-          var code = readUint16(data, position);
-          position += 2;
-
-          var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile;
-          switch (code) {
-            case 0xFF4F: // Start of codestream (SOC)
-              context.mainHeader = true;
-              break;
-            case 0xFFD9: // End of codestream (EOC)
-              break;
-            case 0xFF51: // Image and tile size (SIZ)
-              length = readUint16(data, position);
-              var siz = {};
-              siz.Xsiz = readUint32(data, position + 4);
-              siz.Ysiz = readUint32(data, position + 8);
-              siz.XOsiz = readUint32(data, position + 12);
-              siz.YOsiz = readUint32(data, position + 16);
-              siz.XTsiz = readUint32(data, position + 20);
-              siz.YTsiz = readUint32(data, position + 24);
-              siz.XTOsiz = readUint32(data, position + 28);
-              siz.YTOsiz = readUint32(data, position + 32);
-              var componentsCount = readUint16(data, position + 36);
-              siz.Csiz = componentsCount;
-              var components = [];
-              j = position + 38;
-              for (var i = 0; i < componentsCount; i++) {
-                var component = {
-                  precision: (data[j] & 0x7F) + 1,
-                  isSigned: !!(data[j] & 0x80),
-                  XRsiz: data[j + 1],
-                  YRsiz: data[j + 1]
-                };
-                calculateComponentDimensions(component, siz);
-                components.push(component);
-              }
-              context.SIZ = siz;
-              context.components = components;
-              calculateTileGrids(context, components);
-              context.QCC = [];
-              context.COC = [];
-              break;
-            case 0xFF5C: // Quantization default (QCD)
-              length = readUint16(data, position);
-              var qcd = {};
-              j = position + 2;
-              sqcd = data[j++];
-              switch (sqcd & 0x1F) {
-                case 0:
-                  spqcdSize = 8;
-                  scalarExpounded = true;
-                  break;
-                case 1:
-                  spqcdSize = 16;
-                  scalarExpounded = false;
-                  break;
-                case 2:
-                  spqcdSize = 16;
-                  scalarExpounded = true;
-                  break;
-                default:
-                  throw new Error('JPX Error: Invalid SQcd value ' + sqcd);
-              }
-              qcd.noQuantization = (spqcdSize === 8);
-              qcd.scalarExpounded = scalarExpounded;
-              qcd.guardBits = sqcd >> 5;
-              spqcds = [];
-              while (j < length + position) {
-                var spqcd = {};
-                if (spqcdSize === 8) {
-                  spqcd.epsilon = data[j++] >> 3;
-                  spqcd.mu = 0;
-                } else {
-                  spqcd.epsilon = data[j] >> 3;
-                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
-                  j += 2;
-                }
-                spqcds.push(spqcd);
-              }
-              qcd.SPqcds = spqcds;
-              if (context.mainHeader) {
-                context.QCD = qcd;
-              } else {
-                context.currentTile.QCD = qcd;
-                context.currentTile.QCC = [];
-              }
-              break;
-            case 0xFF5D: // Quantization component (QCC)
-              length = readUint16(data, position);
-              var qcc = {};
-              j = position + 2;
-              var cqcc;
-              if (context.SIZ.Csiz < 257) {
-                cqcc = data[j++];
-              } else {
-                cqcc = readUint16(data, j);
-                j += 2;
-              }
-              sqcd = data[j++];
-              switch (sqcd & 0x1F) {
-                case 0:
-                  spqcdSize = 8;
-                  scalarExpounded = true;
-                  break;
-                case 1:
-                  spqcdSize = 16;
-                  scalarExpounded = false;
-                  break;
-                case 2:
-                  spqcdSize = 16;
-                  scalarExpounded = true;
-                  break;
-                default:
-                  throw new Error('JPX Error: Invalid SQcd value ' + sqcd);
-              }
-              qcc.noQuantization = (spqcdSize === 8);
-              qcc.scalarExpounded = scalarExpounded;
-              qcc.guardBits = sqcd >> 5;
-              spqcds = [];
-              while (j < (length + position)) {
-                spqcd = {};
-                if (spqcdSize === 8) {
-                  spqcd.epsilon = data[j++] >> 3;
-                  spqcd.mu = 0;
-                } else {
-                  spqcd.epsilon = data[j] >> 3;
-                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
-                  j += 2;
-                }
-                spqcds.push(spqcd);
-              }
-              qcc.SPqcds = spqcds;
-              if (context.mainHeader) {
-                context.QCC[cqcc] = qcc;
-              } else {
-                context.currentTile.QCC[cqcc] = qcc;
-              }
-              break;
-            case 0xFF52: // Coding style default (COD)
-              length = readUint16(data, position);
-              var cod = {};
-              j = position + 2;
-              var scod = data[j++];
-              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
-              cod.sopMarkerUsed = !!(scod & 2);
-              cod.ephMarkerUsed = !!(scod & 4);
-              cod.progressionOrder = data[j++];
-              cod.layersCount = readUint16(data, j);
-              j += 2;
-              cod.multipleComponentTransform = data[j++];
-
-              cod.decompositionLevelsCount = data[j++];
-              cod.xcb = (data[j++] & 0xF) + 2;
-              cod.ycb = (data[j++] & 0xF) + 2;
-              var blockStyle = data[j++];
-              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
-              cod.resetContextProbabilities = !!(blockStyle & 2);
-              cod.terminationOnEachCodingPass = !!(blockStyle & 4);
-              cod.verticalyStripe = !!(blockStyle & 8);
-              cod.predictableTermination = !!(blockStyle & 16);
-              cod.segmentationSymbolUsed = !!(blockStyle & 32);
-              cod.reversibleTransformation = data[j++];
-              if (cod.entropyCoderWithCustomPrecincts) {
-                var precinctsSizes = [];
-                while (j < length + position) {
-                  var precinctsSize = data[j++];
-                  precinctsSizes.push({
-                    PPx: precinctsSize & 0xF,
-                    PPy: precinctsSize >> 4
-                  });
-                }
-                cod.precinctsSizes = precinctsSizes;
-              }
-              var unsupported = [];
-              if (cod.selectiveArithmeticCodingBypass) {
-                unsupported.push('selectiveArithmeticCodingBypass');
-              }
-              if (cod.resetContextProbabilities) {
-                unsupported.push('resetContextProbabilities');
-              }
-              if (cod.terminationOnEachCodingPass) {
-                unsupported.push('terminationOnEachCodingPass');
-              }
-              if (cod.verticalyStripe) {
-                unsupported.push('verticalyStripe');
-              }
-              if (cod.predictableTermination) {
-                unsupported.push('predictableTermination');
-              }
-              if (unsupported.length > 0) {
-                doNotRecover = true;
-                throw new Error('JPX Error: Unsupported COD options (' +
-                                unsupported.join(', ') + ')');
-              }
-              if (context.mainHeader) {
-                context.COD = cod;
-              } else {
-                context.currentTile.COD = cod;
-                context.currentTile.COC = [];
-              }
-              break;
-            case 0xFF90: // Start of tile-part (SOT)
-              length = readUint16(data, position);
-              tile = {};
-              tile.index = readUint16(data, position + 2);
-              tile.length = readUint32(data, position + 4);
-              tile.dataEnd = tile.length + position - 2;
-              tile.partIndex = data[position + 8];
-              tile.partsCount = data[position + 9];
-
-              context.mainHeader = false;
-              if (tile.partIndex === 0) {
-                // reset component specific settings
-                tile.COD = context.COD;
-                tile.COC = context.COC.slice(0); // clone of the global COC
-                tile.QCD = context.QCD;
-                tile.QCC = context.QCC.slice(0); // clone of the global COC
-              }
-              context.currentTile = tile;
-              break;
-            case 0xFF93: // Start of data (SOD)
-              tile = context.currentTile;
-              if (tile.partIndex === 0) {
-                initializeTile(context, tile.index);
-                buildPackets(context);
-              }
-
-              // moving to the end of the data
-              length = tile.dataEnd - position;
-              parseTilePackets(context, data, position, length);
-              break;
-            case 0xFF55: // Tile-part lengths, main header (TLM)
-            case 0xFF57: // Packet length, main header (PLM)
-            case 0xFF58: // Packet length, tile-part header (PLT)
-            case 0xFF64: // Comment (COM)
-              length = readUint16(data, position);
-              // skipping content
-              break;
-            case 0xFF53: // Coding style component (COC)
-              throw new Error('JPX Error: Codestream code 0xFF53 (COC) is ' +
-                              'not implemented');
-            default:
-              throw new Error('JPX Error: Unknown codestream code: ' +
-                              code.toString(16));
-          }
-          position += length;
-        }
-      } catch (e) {
-        if (doNotRecover || this.failOnCorruptedImage) {
-          throw e;
-        } else {
-          warn('Trying to recover from ' + e.message);
-        }
-      }
-      this.tiles = transformComponents(context);
-      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
-      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
-      this.componentsCount = context.SIZ.Csiz;
-    }
-  };
-  function calculateComponentDimensions(component, siz) {
-    // Section B.2 Component mapping
-    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
-    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
-    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
-    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
-    component.width = component.x1 - component.x0;
-    component.height = component.y1 - component.y0;
-  }
-  function calculateTileGrids(context, components) {
-    var siz = context.SIZ;
-    // Section B.3 Division into tile and tile-components
-    var tile, tiles = [];
-    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
-    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
-    for (var q = 0; q < numYtiles; q++) {
-      for (var p = 0; p < numXtiles; p++) {
-        tile = {};
-        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
-        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
-        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
-        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
-        tile.width = tile.tx1 - tile.tx0;
-        tile.height = tile.ty1 - tile.ty0;
-        tile.components = [];
-        tiles.push(tile);
-      }
-    }
-    context.tiles = tiles;
-
-    var componentsCount = siz.Csiz;
-    for (var i = 0, ii = componentsCount; i < ii; i++) {
-      var component = components[i];
-      for (var j = 0, jj = tiles.length; j < jj; j++) {
-        var tileComponent = {};
-        tile = tiles[j];
-        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
-        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
-        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
-        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
-        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
-        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
-        tile.components[i] = tileComponent;
-      }
-    }
-  }
-  function getBlocksDimensions(context, component, r) {
-    var codOrCoc = component.codingStyleParameters;
-    var result = {};
-    if (!codOrCoc.entropyCoderWithCustomPrecincts) {
-      result.PPx = 15;
-      result.PPy = 15;
-    } else {
-      result.PPx = codOrCoc.precinctsSizes[r].PPx;
-      result.PPy = codOrCoc.precinctsSizes[r].PPy;
-    }
-    // calculate codeblock size as described in section B.7
-    result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :
-                   Math.min(codOrCoc.xcb, result.PPx));
-    result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :
-                   Math.min(codOrCoc.ycb, result.PPy));
-    return result;
-  }
-  function buildPrecincts(context, resolution, dimensions) {
-    // Section B.6 Division resolution to precincts
-    var precinctWidth = 1 << dimensions.PPx;
-    var precinctHeight = 1 << dimensions.PPy;
-    // Jasper introduces codeblock groups for mapping each subband codeblocks
-    // to precincts. Precinct partition divides a resolution according to width
-    // and height parameters. The subband that belongs to the resolution level
-    // has a different size than the level, unless it is the zero resolution.
-
-    // From Jasper documentation: jpeg2000.pdf, section K: Tier-2 coding:
-    // The precinct partitioning for a particular subband is derived from a
-    // partitioning of its parent LL band (i.e., the LL band at the next higher
-    // resolution level)... The LL band associated with each resolution level is
-    // divided into precincts... Each of the resulting precinct regions is then
-    // mapped into its child subbands (if any) at the next lower resolution
-    // level. This is accomplished by using the coordinate transformation
-    // (u, v) = (ceil(x/2), ceil(y/2)) where (x, y) and (u, v) are the
-    // coordinates of a point in the LL band and child subband, respectively.
-    var isZeroRes = resolution.resLevel === 0;
-    var precinctWidthInSubband = 1 << (dimensions.PPx + (isZeroRes ? 0 : -1));
-    var precinctHeightInSubband = 1 << (dimensions.PPy + (isZeroRes ? 0 : -1));
-    var numprecinctswide = (resolution.trx1 > resolution.trx0 ?
-      Math.ceil(resolution.trx1 / precinctWidth) -
-      Math.floor(resolution.trx0 / precinctWidth) : 0);
-    var numprecinctshigh = (resolution.try1 > resolution.try0 ?
-      Math.ceil(resolution.try1 / precinctHeight) -
-      Math.floor(resolution.try0 / precinctHeight) : 0);
-    var numprecincts = numprecinctswide * numprecinctshigh;
-
-    resolution.precinctParameters = {
-      precinctWidth: precinctWidth,
-      precinctHeight: precinctHeight,
-      numprecinctswide: numprecinctswide,
-      numprecinctshigh: numprecinctshigh,
-      numprecincts: numprecincts,
-      precinctWidthInSubband: precinctWidthInSubband,
-      precinctHeightInSubband: precinctHeightInSubband
-    };
-  }
-  function buildCodeblocks(context, subband, dimensions) {
-    // Section B.7 Division sub-band into code-blocks
-    var xcb_ = dimensions.xcb_;
-    var ycb_ = dimensions.ycb_;
-    var codeblockWidth = 1 << xcb_;
-    var codeblockHeight = 1 << ycb_;
-    var cbx0 = subband.tbx0 >> xcb_;
-    var cby0 = subband.tby0 >> ycb_;
-    var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_;
-    var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_;
-    var precinctParameters = subband.resolution.precinctParameters;
-    var codeblocks = [];
-    var precincts = [];
-    var i, j, codeblock, precinctNumber;
-    for (j = cby0; j < cby1; j++) {
-      for (i = cbx0; i < cbx1; i++) {
-        codeblock = {
-          cbx: i,
-          cby: j,
-          tbx0: codeblockWidth * i,
-          tby0: codeblockHeight * j,
-          tbx1: codeblockWidth * (i + 1),
-          tby1: codeblockHeight * (j + 1)
-        };
-
-        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
-        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
-        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
-        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
-
-        // Calculate precinct number for this codeblock, codeblock position
-        // should be relative to its subband, use actual dimension and position
-        // See comment about codeblock group width and height
-        var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) /
-          precinctParameters.precinctWidthInSubband);
-        var pj = Math.floor((codeblock.tby0_ - subband.tby0) /
-          precinctParameters.precinctHeightInSubband);
-        precinctNumber = pi + (pj * precinctParameters.numprecinctswide);
-
-        codeblock.precinctNumber = precinctNumber;
-        codeblock.subbandType = subband.type;
-        codeblock.Lblock = 3;
-
-        if (codeblock.tbx1_ <= codeblock.tbx0_ ||
-            codeblock.tby1_ <= codeblock.tby0_) {
-          continue;
-        }
-        codeblocks.push(codeblock);
-        // building precinct for the sub-band
-        var precinct = precincts[precinctNumber];
-        if (precinct !== undefined) {
-          if (i < precinct.cbxMin) {
-            precinct.cbxMin = i;
-          } else if (i > precinct.cbxMax) {
-            precinct.cbxMax = i;
-          }
-          if (j < precinct.cbyMin) {
-            precinct.cbxMin = j;
-          } else if (j > precinct.cbyMax) {
-            precinct.cbyMax = j;
-          }
-        } else {
-          precincts[precinctNumber] = precinct = {
-            cbxMin: i,
-            cbyMin: j,
-            cbxMax: i,
-            cbyMax: j
-          };
-        }
-        codeblock.precinct = precinct;
-      }
-    }
-    subband.codeblockParameters = {
-      codeblockWidth: xcb_,
-      codeblockHeight: ycb_,
-      numcodeblockwide: cbx1 - cbx0 + 1,
-      numcodeblockhigh: cby1 - cby0 + 1
-    };
-    subband.codeblocks = codeblocks;
-    subband.precincts = precincts;
-  }
-  function createPacket(resolution, precinctNumber, layerNumber) {
-    var precinctCodeblocks = [];
-    // Section B.10.8 Order of info in packet
-    var subbands = resolution.subbands;
-    // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence
-    for (var i = 0, ii = subbands.length; i < ii; i++) {
-      var subband = subbands[i];
-      var codeblocks = subband.codeblocks;
-      for (var j = 0, jj = codeblocks.length; j < jj; j++) {
-        var codeblock = codeblocks[j];
-        if (codeblock.precinctNumber !== precinctNumber) {
-          continue;
-        }
-        precinctCodeblocks.push(codeblock);
-      }
-    }
-    return {
-      layerNumber: layerNumber,
-      codeblocks: precinctCodeblocks
-    };
-  }
-  function LayerResolutionComponentPositionIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var maxDecompositionLevelsCount = 0;
-    for (var q = 0; q < componentsCount; q++) {
-      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
-        tile.components[q].codingStyleParameters.decompositionLevelsCount);
-    }
-
-    var l = 0, r = 0, i = 0, k = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      // Section B.12.1.1 Layer-resolution-component-position
-      for (; l < layersCount; l++) {
-        for (; r <= maxDecompositionLevelsCount; r++) {
-          for (; i < componentsCount; i++) {
-            var component = tile.components[i];
-            if (r > component.codingStyleParameters.decompositionLevelsCount) {
-              continue;
-            }
-
-            var resolution = component.resolutions[r];
-            var numprecincts = resolution.precinctParameters.numprecincts;
-            for (; k < numprecincts;) {
-              var packet = createPacket(resolution, k, l);
-              k++;
-              return packet;
-            }
-            k = 0;
-          }
-          i = 0;
-        }
-        r = 0;
-      }
-      throw new Error('JPX Error: Out of packets');
-    };
-  }
-  function ResolutionLayerComponentPositionIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var maxDecompositionLevelsCount = 0;
-    for (var q = 0; q < componentsCount; q++) {
-      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
-        tile.components[q].codingStyleParameters.decompositionLevelsCount);
-    }
-
-    var r = 0, l = 0, i = 0, k = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      // Section B.12.1.2 Resolution-layer-component-position
-      for (; r <= maxDecompositionLevelsCount; r++) {
-        for (; l < layersCount; l++) {
-          for (; i < componentsCount; i++) {
-            var component = tile.components[i];
-            if (r > component.codingStyleParameters.decompositionLevelsCount) {
-              continue;
-            }
-
-            var resolution = component.resolutions[r];
-            var numprecincts = resolution.precinctParameters.numprecincts;
-            for (; k < numprecincts;) {
-              var packet = createPacket(resolution, k, l);
-              k++;
-              return packet;
-            }
-            k = 0;
-          }
-          i = 0;
-        }
-        l = 0;
-      }
-      throw new Error('JPX Error: Out of packets');
-    };
-  }
-  function ResolutionPositionComponentLayerIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var l, r, c, p;
-    var maxDecompositionLevelsCount = 0;
-    for (c = 0; c < componentsCount; c++) {
-      var component = tile.components[c];
-      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
-        component.codingStyleParameters.decompositionLevelsCount);
-    }
-    var maxNumPrecinctsInLevel = new Int32Array(
-      maxDecompositionLevelsCount + 1);
-    for (r = 0; r <= maxDecompositionLevelsCount; ++r) {
-      var maxNumPrecincts = 0;
-      for (c = 0; c < componentsCount; ++c) {
-        var resolutions = tile.components[c].resolutions;
-        if (r < resolutions.length) {
-          maxNumPrecincts = Math.max(maxNumPrecincts,
-            resolutions[r].precinctParameters.numprecincts);
-        }
-      }
-      maxNumPrecinctsInLevel[r] = maxNumPrecincts;
-    }
-    l = 0;
-    r = 0;
-    c = 0;
-    p = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      // Section B.12.1.3 Resolution-position-component-layer
-      for (; r <= maxDecompositionLevelsCount; r++) {
-        for (; p < maxNumPrecinctsInLevel[r]; p++) {
-          for (; c < componentsCount; c++) {
-            var component = tile.components[c];
-            if (r > component.codingStyleParameters.decompositionLevelsCount) {
-              continue;
-            }
-            var resolution = component.resolutions[r];
-            var numprecincts = resolution.precinctParameters.numprecincts;
-            if (p >= numprecincts) {
-              continue;
-            }
-            for (; l < layersCount;) {
-              var packet = createPacket(resolution, p, l);
-              l++;
-              return packet;
-            }
-            l = 0;
-          }
-          c = 0;
-        }
-        p = 0;
-      }
-      throw new Error('JPX Error: Out of packets');
-    };
-  }
-  function PositionComponentResolutionLayerIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var precinctsSizes = getPrecinctSizesInImageScale(tile);
-    var precinctsIterationSizes = precinctsSizes;
-    var l = 0, r = 0, c = 0, px = 0, py = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      // Section B.12.1.4 Position-component-resolution-layer
-      for (; py < precinctsIterationSizes.maxNumHigh; py++) {
-        for (; px < precinctsIterationSizes.maxNumWide; px++) {
-          for (; c < componentsCount; c++) {
-            var component = tile.components[c];
-            var decompositionLevelsCount =
-              component.codingStyleParameters.decompositionLevelsCount;
-            for (; r <= decompositionLevelsCount; r++) {
-              var resolution = component.resolutions[r];
-              var sizeInImageScale =
-                precinctsSizes.components[c].resolutions[r];
-              var k = getPrecinctIndexIfExist(
-                px,
-                py,
-                sizeInImageScale,
-                precinctsIterationSizes,
-                resolution);
-              if (k === null) {
-                continue;
-              }
-              for (; l < layersCount;) {
-                var packet = createPacket(resolution, k, l);
-                l++;
-                return packet;
-              }
-              l = 0;
-            }
-            r = 0;
-          }
-          c = 0;
-        }
-        px = 0;
-      }
-      throw new Error('JPX Error: Out of packets');
-    };
-  }
-  function ComponentPositionResolutionLayerIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var precinctsSizes = getPrecinctSizesInImageScale(tile);
-    var l = 0, r = 0, c = 0, px = 0, py = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      // Section B.12.1.5 Component-position-resolution-layer
-      for (; c < componentsCount; ++c) {
-        var component = tile.components[c];
-        var precinctsIterationSizes = precinctsSizes.components[c];
-        var decompositionLevelsCount =
-          component.codingStyleParameters.decompositionLevelsCount;
-        for (; py < precinctsIterationSizes.maxNumHigh; py++) {
-          for (; px < precinctsIterationSizes.maxNumWide; px++) {
-            for (; r <= decompositionLevelsCount; r++) {
-              var resolution = component.resolutions[r];
-              var sizeInImageScale = precinctsIterationSizes.resolutions[r];
-              var k = getPrecinctIndexIfExist(
-                px,
-                py,
-                sizeInImageScale,
-                precinctsIterationSizes,
-                resolution);
-              if (k === null) {
-                continue;
-              }
-              for (; l < layersCount;) {
-                var packet = createPacket(resolution, k, l);
-                l++;
-                return packet;
-              }
-              l = 0;
-            }
-            r = 0;
-          }
-          px = 0;
-        }
-        py = 0;
-      }
-      throw new Error('JPX Error: Out of packets');
-    };
-  }
-  function getPrecinctIndexIfExist(
-    pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {
-    var posX = pxIndex * precinctIterationSizes.minWidth;
-    var posY = pyIndex * precinctIterationSizes.minHeight;
-    if (posX % sizeInImageScale.width !== 0 ||
-        posY % sizeInImageScale.height !== 0) {
-      return null;
-    }
-    var startPrecinctRowIndex =
-      (posY / sizeInImageScale.width) *
-      resolution.precinctParameters.numprecinctswide;
-    return (posX / sizeInImageScale.height) + startPrecinctRowIndex;
-  }
-  function getPrecinctSizesInImageScale(tile) {
-    var componentsCount = tile.components.length;
-    var minWidth = Number.MAX_VALUE;
-    var minHeight = Number.MAX_VALUE;
-    var maxNumWide = 0;
-    var maxNumHigh = 0;
-    var sizePerComponent = new Array(componentsCount);
-    for (var c = 0; c < componentsCount; c++) {
-      var component = tile.components[c];
-      var decompositionLevelsCount =
-        component.codingStyleParameters.decompositionLevelsCount;
-      var sizePerResolution = new Array(decompositionLevelsCount + 1);
-      var minWidthCurrentComponent = Number.MAX_VALUE;
-      var minHeightCurrentComponent = Number.MAX_VALUE;
-      var maxNumWideCurrentComponent = 0;
-      var maxNumHighCurrentComponent = 0;
-      var scale = 1;
-      for (var r = decompositionLevelsCount; r >= 0; --r) {
-        var resolution = component.resolutions[r];
-        var widthCurrentResolution =
-          scale * resolution.precinctParameters.precinctWidth;
-        var heightCurrentResolution =
-          scale * resolution.precinctParameters.precinctHeight;
-        minWidthCurrentComponent = Math.min(
-          minWidthCurrentComponent,
-          widthCurrentResolution);
-        minHeightCurrentComponent = Math.min(
-          minHeightCurrentComponent,
-          heightCurrentResolution);
-        maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent,
-          resolution.precinctParameters.numprecinctswide);
-        maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent,
-          resolution.precinctParameters.numprecinctshigh);
-        sizePerResolution[r] = {
-          width: widthCurrentResolution,
-          height: heightCurrentResolution
-        };
-        scale <<= 1;
-      }
-      minWidth = Math.min(minWidth, minWidthCurrentComponent);
-      minHeight = Math.min(minHeight, minHeightCurrentComponent);
-      maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);
-      maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);
-      sizePerComponent[c] = {
-        resolutions: sizePerResolution,
-        minWidth: minWidthCurrentComponent,
-        minHeight: minHeightCurrentComponent,
-        maxNumWide: maxNumWideCurrentComponent,
-        maxNumHigh: maxNumHighCurrentComponent
-      };
-    }
-    return {
-      components: sizePerComponent,
-      minWidth: minWidth,
-      minHeight: minHeight,
-      maxNumWide: maxNumWide,
-      maxNumHigh: maxNumHigh
-    };
-  }
-  function buildPackets(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var componentsCount = siz.Csiz;
-    // Creating resolutions and sub-bands for each component
-    for (var c = 0; c < componentsCount; c++) {
-      var component = tile.components[c];
-      var decompositionLevelsCount =
-        component.codingStyleParameters.decompositionLevelsCount;
-      // Section B.5 Resolution levels and sub-bands
-      var resolutions = [];
-      var subbands = [];
-      for (var r = 0; r <= decompositionLevelsCount; r++) {
-        var blocksDimensions = getBlocksDimensions(context, component, r);
-        var resolution = {};
-        var scale = 1 << (decompositionLevelsCount - r);
-        resolution.trx0 = Math.ceil(component.tcx0 / scale);
-        resolution.try0 = Math.ceil(component.tcy0 / scale);
-        resolution.trx1 = Math.ceil(component.tcx1 / scale);
-        resolution.try1 = Math.ceil(component.tcy1 / scale);
-        resolution.resLevel = r;
-        buildPrecincts(context, resolution, blocksDimensions);
-        resolutions.push(resolution);
-
-        var subband;
-        if (r === 0) {
-          // one sub-band (LL) with last decomposition
-          subband = {};
-          subband.type = 'LL';
-          subband.tbx0 = Math.ceil(component.tcx0 / scale);
-          subband.tby0 = Math.ceil(component.tcy0 / scale);
-          subband.tbx1 = Math.ceil(component.tcx1 / scale);
-          subband.tby1 = Math.ceil(component.tcy1 / scale);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolution.subbands = [subband];
-        } else {
-          var bscale = 1 << (decompositionLevelsCount - r + 1);
-          var resolutionSubbands = [];
-          // three sub-bands (HL, LH and HH) with rest of decompositions
-          subband = {};
-          subband.type = 'HL';
-          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
-          subband.tby0 = Math.ceil(component.tcy0 / bscale);
-          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
-          subband.tby1 = Math.ceil(component.tcy1 / bscale);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolutionSubbands.push(subband);
-
-          subband = {};
-          subband.type = 'LH';
-          subband.tbx0 = Math.ceil(component.tcx0 / bscale);
-          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
-          subband.tbx1 = Math.ceil(component.tcx1 / bscale);
-          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolutionSubbands.push(subband);
-
-          subband = {};
-          subband.type = 'HH';
-          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
-          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
-          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
-          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolutionSubbands.push(subband);
-
-          resolution.subbands = resolutionSubbands;
-        }
-      }
-      component.resolutions = resolutions;
-      component.subbands = subbands;
-    }
-    // Generate the packets sequence
-    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
-    switch (progressionOrder) {
-      case 0:
-        tile.packetsIterator =
-          new LayerResolutionComponentPositionIterator(context);
-        break;
-      case 1:
-        tile.packetsIterator =
-          new ResolutionLayerComponentPositionIterator(context);
-        break;
-      case 2:
-        tile.packetsIterator =
-          new ResolutionPositionComponentLayerIterator(context);
-        break;
-      case 3:
-        tile.packetsIterator =
-          new PositionComponentResolutionLayerIterator(context);
-        break;
-      case 4:
-        tile.packetsIterator =
-          new ComponentPositionResolutionLayerIterator(context);
-        break;
-      default:
-        throw new Error('JPX Error: Unsupported progression order ' +
-                        progressionOrder);
-    }
-  }
-  function parseTilePackets(context, data, offset, dataLength) {
-    var position = 0;
-    var buffer, bufferSize = 0, skipNextBit = false;
-    function readBits(count) {
-      while (bufferSize < count) {
-        var b = data[offset + position];
-        position++;
-        if (skipNextBit) {
-          buffer = (buffer << 7) | b;
-          bufferSize += 7;
-          skipNextBit = false;
-        } else {
-          buffer = (buffer << 8) | b;
-          bufferSize += 8;
-        }
-        if (b === 0xFF) {
-          skipNextBit = true;
-        }
-      }
-      bufferSize -= count;
-      return (buffer >>> bufferSize) & ((1 << count) - 1);
-    }
-    function skipMarkerIfEqual(value) {
-      if (data[offset + position - 1] === 0xFF &&
-          data[offset + position] === value) {
-        skipBytes(1);
-        return true;
-      } else if (data[offset + position] === 0xFF &&
-                 data[offset + position + 1] === value) {
-        skipBytes(2);
-        return true;
-      }
-      return false;
-    }
-    function skipBytes(count) {
-      position += count;
-    }
-    function alignToByte() {
-      bufferSize = 0;
-      if (skipNextBit) {
-        position++;
-        skipNextBit = false;
-      }
-    }
-    function readCodingpasses() {
-      if (readBits(1) === 0) {
-        return 1;
-      }
-      if (readBits(1) === 0) {
-        return 2;
-      }
-      var value = readBits(2);
-      if (value < 3) {
-        return value + 3;
-      }
-      value = readBits(5);
-      if (value < 31) {
-        return value + 6;
-      }
-      value = readBits(7);
-      return value + 37;
-    }
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var sopMarkerUsed = context.COD.sopMarkerUsed;
-    var ephMarkerUsed = context.COD.ephMarkerUsed;
-    var packetsIterator = tile.packetsIterator;
-    while (position < dataLength) {
-      alignToByte();
-      if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {
-        // Skip also marker segment length and packet sequence ID
-        skipBytes(4);
-      }
-      var packet = packetsIterator.nextPacket();
-      if (!readBits(1)) {
-        continue;
-      }
-      var layerNumber = packet.layerNumber;
-      var queue = [], codeblock;
-      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
-        codeblock = packet.codeblocks[i];
-        var precinct = codeblock.precinct;
-        var codeblockColumn = codeblock.cbx - precinct.cbxMin;
-        var codeblockRow = codeblock.cby - precinct.cbyMin;
-        var codeblockIncluded = false;
-        var firstTimeInclusion = false;
-        var valueReady;
-        if (codeblock['included'] !== undefined) {
-          codeblockIncluded = !!readBits(1);
-        } else {
-          // reading inclusion tree
-          precinct = codeblock.precinct;
-          var inclusionTree, zeroBitPlanesTree;
-          if (precinct['inclusionTree'] !== undefined) {
-            inclusionTree = precinct.inclusionTree;
-          } else {
-            // building inclusion and zero bit-planes trees
-            var width = precinct.cbxMax - precinct.cbxMin + 1;
-            var height = precinct.cbyMax - precinct.cbyMin + 1;
-            inclusionTree = new InclusionTree(width, height, layerNumber);
-            zeroBitPlanesTree = new TagTree(width, height);
-            precinct.inclusionTree = inclusionTree;
-            precinct.zeroBitPlanesTree = zeroBitPlanesTree;
-          }
-
-          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
-            while (true) {
-              if (readBits(1)) {
-                valueReady = !inclusionTree.nextLevel();
-                if (valueReady) {
-                  codeblock.included = true;
-                  codeblockIncluded = firstTimeInclusion = true;
-                  break;
-                }
-              } else {
-                inclusionTree.incrementValue(layerNumber);
-                break;
-              }
-            }
-          }
-        }
-        if (!codeblockIncluded) {
-          continue;
-        }
-        if (firstTimeInclusion) {
-          zeroBitPlanesTree = precinct.zeroBitPlanesTree;
-          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
-          while (true) {
-            if (readBits(1)) {
-              valueReady = !zeroBitPlanesTree.nextLevel();
-              if (valueReady) {
-                break;
-              }
-            } else {
-              zeroBitPlanesTree.incrementValue();
-            }
-          }
-          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
-        }
-        var codingpasses = readCodingpasses();
-        while (readBits(1)) {
-          codeblock.Lblock++;
-        }
-        var codingpassesLog2 = log2(codingpasses);
-        // rounding down log2
-        var bits = ((codingpasses < (1 << codingpassesLog2)) ?
-          codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
-        var codedDataLength = readBits(bits);
-        queue.push({
-          codeblock: codeblock,
-          codingpasses: codingpasses,
-          dataLength: codedDataLength
-        });
-      }
-      alignToByte();
-      if (ephMarkerUsed) {
-        skipMarkerIfEqual(0x92);
-      }
-      while (queue.length > 0) {
-        var packetItem = queue.shift();
-        codeblock = packetItem.codeblock;
-        if (codeblock['data'] === undefined) {
-          codeblock.data = [];
-        }
-        codeblock.data.push({
-          data: data,
-          start: offset + position,
-          end: offset + position + packetItem.dataLength,
-          codingpasses: packetItem.codingpasses
-        });
-        position += packetItem.dataLength;
-      }
-    }
-    return position;
-  }
-  function copyCoefficients(coefficients, levelWidth, levelHeight, subband,
-                            delta, mb, reversible, segmentationSymbolUsed) {
-    var x0 = subband.tbx0;
-    var y0 = subband.tby0;
-    var width = subband.tbx1 - subband.tbx0;
-    var codeblocks = subband.codeblocks;
-    var right = subband.type.charAt(0) === 'H' ? 1 : 0;
-    var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;
-
-    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
-      var codeblock = codeblocks[i];
-      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
-      var blockHeight = codeblock.tby1_ - codeblock.tby0_;
-      if (blockWidth === 0 || blockHeight === 0) {
-        continue;
-      }
-      if (codeblock['data'] === undefined) {
-        continue;
-      }
-
-      var bitModel, currentCodingpassType;
-      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
-                              codeblock.zeroBitPlanes, mb);
-      currentCodingpassType = 2; // first bit plane starts from cleanup
-
-      // collect data
-      var data = codeblock.data, totalLength = 0, codingpasses = 0;
-      var j, jj, dataItem;
-      for (j = 0, jj = data.length; j < jj; j++) {
-        dataItem = data[j];
-        totalLength += dataItem.end - dataItem.start;
-        codingpasses += dataItem.codingpasses;
-      }
-      var encodedData = new Uint8Array(totalLength);
-      var position = 0;
-      for (j = 0, jj = data.length; j < jj; j++) {
-        dataItem = data[j];
-        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
-        encodedData.set(chunk, position);
-        position += chunk.length;
-      }
-      // decoding the item
-      var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);
-      bitModel.setDecoder(decoder);
-
-      for (j = 0; j < codingpasses; j++) {
-        switch (currentCodingpassType) {
-          case 0:
-            bitModel.runSignificancePropogationPass();
-            break;
-          case 1:
-            bitModel.runMagnitudeRefinementPass();
-            break;
-          case 2:
-            bitModel.runCleanupPass();
-            if (segmentationSymbolUsed) {
-              bitModel.checkSegmentationSymbol();
-            }
-            break;
-        }
-        currentCodingpassType = (currentCodingpassType + 1) % 3;
-      }
-
-      var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
-      var sign = bitModel.coefficentsSign;
-      var magnitude = bitModel.coefficentsMagnitude;
-      var bitsDecoded = bitModel.bitsDecoded;
-      var magnitudeCorrection = reversible ? 0 : 0.5;
-      var k, n, nb;
-      position = 0;
-      // Do the interleaving of Section F.3.3 here, so we do not need
-      // to copy later. LL level is not interleaved, just copied.
-      var interleave = (subband.type !== 'LL');
-      for (j = 0; j < blockHeight; j++) {
-        var row = (offset / width) | 0; // row in the non-interleaved subband
-        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;
-        for (k = 0; k < blockWidth; k++) {
-          n = magnitude[position];
-          if (n !== 0) {
-            n = (n + magnitudeCorrection) * delta;
-            if (sign[position] !== 0) {
-              n = -n;
-            }
-            nb = bitsDecoded[position];
-            var pos = interleave ? (levelOffset + (offset << 1)) : offset;
-            if (reversible && (nb >= mb)) {
-              coefficients[pos] = n;
-            } else {
-              coefficients[pos] = n * (1 << (mb - nb));
-            }
-          }
-          offset++;
-          position++;
-        }
-        offset += width - blockWidth;
-      }
-    }
-  }
-  function transformTile(context, tile, c) {
-    var component = tile.components[c];
-    var codingStyleParameters = component.codingStyleParameters;
-    var quantizationParameters = component.quantizationParameters;
-    var decompositionLevelsCount =
-      codingStyleParameters.decompositionLevelsCount;
-    var spqcds = quantizationParameters.SPqcds;
-    var scalarExpounded = quantizationParameters.scalarExpounded;
-    var guardBits = quantizationParameters.guardBits;
-    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
-    var precision = context.components[c].precision;
-
-    var reversible = codingStyleParameters.reversibleTransformation;
-    var transform = (reversible ? new ReversibleTransform() :
-                                  new IrreversibleTransform());
-
-    var subbandCoefficients = [];
-    var b = 0;
-    for (var i = 0; i <= decompositionLevelsCount; i++) {
-      var resolution = component.resolutions[i];
-
-      var width = resolution.trx1 - resolution.trx0;
-      var height = resolution.try1 - resolution.try0;
-      // Allocate space for the whole sublevel.
-      var coefficients = new Float32Array(width * height);
-
-      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
-        var mu, epsilon;
-        if (!scalarExpounded) {
-          // formula E-5
-          mu = spqcds[0].mu;
-          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
-        } else {
-          mu = spqcds[b].mu;
-          epsilon = spqcds[b].epsilon;
-          b++;
-        }
-
-        var subband = resolution.subbands[j];
-        var gainLog2 = SubbandsGainLog2[subband.type];
-
-        // calulate quantization coefficient (Section E.1.1.1)
-        var delta = (reversible ? 1 :
-          Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048));
-        var mb = (guardBits + epsilon - 1);
-
-        // In the first resolution level, copyCoefficients will fill the
-        // whole array with coefficients. In the succeding passes,
-        // copyCoefficients will consecutively fill in the values that belong
-        // to the interleaved positions of the HL, LH, and HH coefficients.
-        // The LL coefficients will then be interleaved in Transform.iterate().
-        copyCoefficients(coefficients, width, height, subband, delta, mb,
-                         reversible, segmentationSymbolUsed);
-      }
-      subbandCoefficients.push({
-        width: width,
-        height: height,
-        items: coefficients
-      });
-    }
-
-    var result = transform.calculate(subbandCoefficients,
-                                     component.tcx0, component.tcy0);
-    return {
-      left: component.tcx0,
-      top: component.tcy0,
-      width: result.width,
-      height: result.height,
-      items: result.items
-    };
-  }
-  function transformComponents(context) {
-    var siz = context.SIZ;
-    var components = context.components;
-    var componentsCount = siz.Csiz;
-    var resultImages = [];
-    for (var i = 0, ii = context.tiles.length; i < ii; i++) {
-      var tile = context.tiles[i];
-      var transformedTiles = [];
-      var c;
-      for (c = 0; c < componentsCount; c++) {
-        transformedTiles[c] = transformTile(context, tile, c);
-      }
-      var tile0 = transformedTiles[0];
-      var out = new Uint8Array(tile0.items.length * componentsCount);
-      var result = {
-        left: tile0.left,
-        top: tile0.top,
-        width: tile0.width,
-        height: tile0.height,
-        items: out
-      };
-
-      // Section G.2.2 Inverse multi component transform
-      var shift, offset, max, min, maxK;
-      var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val;
-      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
-        var fourComponents = componentsCount === 4;
-        var y0items = transformedTiles[0].items;
-        var y1items = transformedTiles[1].items;
-        var y2items = transformedTiles[2].items;
-        var y3items = fourComponents ? transformedTiles[3].items : null;
-
-        // HACK: The multiple component transform formulas below assume that
-        // all components have the same precision. With this in mind, we
-        // compute shift and offset only once.
-        shift = components[0].precision - 8;
-        offset = (128 << shift) + 0.5;
-        max = 255 * (1 << shift);
-        maxK = max * 0.5;
-        min = -maxK;
-
-        var component0 = tile.components[0];
-        var alpha01 = componentsCount - 3;
-        jj = y0items.length;
-        if (!component0.codingStyleParameters.reversibleTransformation) {
-          // inverse irreversible multiple component transform
-          for (j = 0; j < jj; j++, pos += alpha01) {
-            y0 = y0items[j] + offset;
-            y1 = y1items[j];
-            y2 = y2items[j];
-            r = y0 + 1.402 * y2;
-            g = y0 - 0.34413 * y1 - 0.71414 * y2;
-            b = y0 + 1.772 * y1;
-            out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;
-            out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;
-            out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;
-          }
-        } else {
-          // inverse reversible multiple component transform
-          for (j = 0; j < jj; j++, pos += alpha01) {
-            y0 = y0items[j] + offset;
-            y1 = y1items[j];
-            y2 = y2items[j];
-            g = y0 - ((y2 + y1) >> 2);
-            r = g + y2;
-            b = g + y1;
-            out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;
-            out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;
-            out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;
-          }
-        }
-        if (fourComponents) {
-          for (j = 0, pos = 3; j < jj; j++, pos += 4) {
-            k = y3items[j];
-            out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift;
-          }
-        }
-      } else { // no multi-component transform
-        for (c = 0; c < componentsCount; c++) {
-          var items = transformedTiles[c].items;
-          shift = components[c].precision - 8;
-          offset = (128 << shift) + 0.5;
-          max = (127.5 * (1 << shift));
-          min = -max;
-          for (pos = c, j = 0, jj = items.length; j < jj; j++) {
-            val = items[j];
-            out[pos] = val <= min ? 0 :
-                       val >= max ? 255 : (val + offset) >> shift;
-            pos += componentsCount;
-          }
-        }
-      }
-      resultImages.push(result);
-    }
-    return resultImages;
-  }
-  function initializeTile(context, tileIndex) {
-    var siz = context.SIZ;
-    var componentsCount = siz.Csiz;
-    var tile = context.tiles[tileIndex];
-    for (var c = 0; c < componentsCount; c++) {
-      var component = tile.components[c];
-      var qcdOrQcc = (context.currentTile.QCC[c] !== undefined ?
-        context.currentTile.QCC[c] : context.currentTile.QCD);
-      component.quantizationParameters = qcdOrQcc;
-      var codOrCoc = (context.currentTile.COC[c] !== undefined  ?
-        context.currentTile.COC[c] : context.currentTile.COD);
-      component.codingStyleParameters = codOrCoc;
-    }
-    tile.codingStyleDefaultParameters = context.currentTile.COD;
-  }
-
-  // Section B.10.2 Tag trees
-  var TagTree = (function TagTreeClosure() {
-    function TagTree(width, height) {
-      var levelsLength = log2(Math.max(width, height)) + 1;
-      this.levels = [];
-      for (var i = 0; i < levelsLength; i++) {
-        var level = {
-          width: width,
-          height: height,
-          items: []
-        };
-        this.levels.push(level);
-        width = Math.ceil(width / 2);
-        height = Math.ceil(height / 2);
-      }
-    }
-    TagTree.prototype = {
-      reset: function TagTree_reset(i, j) {
-        var currentLevel = 0, value = 0, level;
-        while (currentLevel < this.levels.length) {
-          level = this.levels[currentLevel];
-          var index = i + j * level.width;
-          if (level.items[index] !== undefined) {
-            value = level.items[index];
-            break;
-          }
-          level.index = index;
-          i >>= 1;
-          j >>= 1;
-          currentLevel++;
-        }
-        currentLevel--;
-        level = this.levels[currentLevel];
-        level.items[level.index] = value;
-        this.currentLevel = currentLevel;
-        delete this.value;
-      },
-      incrementValue: function TagTree_incrementValue() {
-        var level = this.levels[this.currentLevel];
-        level.items[level.index]++;
-      },
-      nextLevel: function TagTree_nextLevel() {
-        var currentLevel = this.currentLevel;
-        var level = this.levels[currentLevel];
-        var value = level.items[level.index];
-        currentLevel--;
-        if (currentLevel < 0) {
-          this.value = value;
-          return false;
-        }
-
-        this.currentLevel = currentLevel;
-        level = this.levels[currentLevel];
-        level.items[level.index] = value;
-        return true;
-      }
-    };
-    return TagTree;
-  })();
-
-  var InclusionTree = (function InclusionTreeClosure() {
-    function InclusionTree(width, height,  defaultValue) {
-      var levelsLength = log2(Math.max(width, height)) + 1;
-      this.levels = [];
-      for (var i = 0; i < levelsLength; i++) {
-        var items = new Uint8Array(width * height);
-        for (var j = 0, jj = items.length; j < jj; j++) {
-          items[j] = defaultValue;
-        }
-
-        var level = {
-          width: width,
-          height: height,
-          items: items
-        };
-        this.levels.push(level);
-
-        width = Math.ceil(width / 2);
-        height = Math.ceil(height / 2);
-      }
-    }
-    InclusionTree.prototype = {
-      reset: function InclusionTree_reset(i, j, stopValue) {
-        var currentLevel = 0;
-        while (currentLevel < this.levels.length) {
-          var level = this.levels[currentLevel];
-          var index = i + j * level.width;
-          level.index = index;
-          var value = level.items[index];
-
-          if (value === 0xFF) {
-            break;
-          }
-
-          if (value > stopValue) {
-            this.currentLevel = currentLevel;
-            // already know about this one, propagating the value to top levels
-            this.propagateValues();
-            return false;
-          }
-
-          i >>= 1;
-          j >>= 1;
-          currentLevel++;
-        }
-        this.currentLevel = currentLevel - 1;
-        return true;
-      },
-      incrementValue: function InclusionTree_incrementValue(stopValue) {
-        var level = this.levels[this.currentLevel];
-        level.items[level.index] = stopValue + 1;
-        this.propagateValues();
-      },
-      propagateValues: function InclusionTree_propagateValues() {
-        var levelIndex = this.currentLevel;
-        var level = this.levels[levelIndex];
-        var currentValue = level.items[level.index];
-        while (--levelIndex >= 0) {
-          level = this.levels[levelIndex];
-          level.items[level.index] = currentValue;
-        }
-      },
-      nextLevel: function InclusionTree_nextLevel() {
-        var currentLevel = this.currentLevel;
-        var level = this.levels[currentLevel];
-        var value = level.items[level.index];
-        level.items[level.index] = 0xFF;
-        currentLevel--;
-        if (currentLevel < 0) {
-          return false;
-        }
-
-        this.currentLevel = currentLevel;
-        level = this.levels[currentLevel];
-        level.items[level.index] = value;
-        return true;
-      }
-    };
-    return InclusionTree;
-  })();
-
-  // Section D. Coefficient bit modeling
-  var BitModel = (function BitModelClosure() {
-    var UNIFORM_CONTEXT = 17;
-    var RUNLENGTH_CONTEXT = 18;
-    // Table D-1
-    // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),
-    // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)
-    var LLAndLHContextsLabel = new Uint8Array([
-      0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,
-      7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,
-      8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8
-    ]);
-    var HLContextLabel = new Uint8Array([
-      0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,
-      8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,
-      4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8
-    ]);
-    var HHContextLabel = new Uint8Array([
-      0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,
-      5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,
-      8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8
-    ]);
-
-    function BitModel(width, height, subband, zeroBitPlanes, mb) {
-      this.width = width;
-      this.height = height;
-
-      this.contextLabelTable = (subband === 'HH' ? HHContextLabel :
-        (subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel));
-
-      var coefficientCount = width * height;
-
-      // coefficients outside the encoding region treated as insignificant
-      // add border state cells for significanceState
-      this.neighborsSignificance = new Uint8Array(coefficientCount);
-      this.coefficentsSign = new Uint8Array(coefficientCount);
-      this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) :
-                                  mb > 6 ? new Uint16Array(coefficientCount) :
-                                  new Uint8Array(coefficientCount);
-      this.processingFlags = new Uint8Array(coefficientCount);
-
-      var bitsDecoded = new Uint8Array(coefficientCount);
-      if (zeroBitPlanes !== 0) {
-        for (var i = 0; i < coefficientCount; i++) {
-          bitsDecoded[i] = zeroBitPlanes;
-        }
-      }
-      this.bitsDecoded = bitsDecoded;
-
-      this.reset();
-    }
-
-    BitModel.prototype = {
-      setDecoder: function BitModel_setDecoder(decoder) {
-        this.decoder = decoder;
-      },
-      reset: function BitModel_reset() {
-        // We have 17 contexts that are accessed via context labels,
-        // plus the uniform and runlength context.
-        this.contexts = new Int8Array(19);
-
-        // Contexts are packed into 1 byte:
-        // highest 7 bits carry the index, lowest bit carries mps
-        this.contexts[0] = (4 << 1) | 0;
-        this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0;
-        this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0;
-      },
-      setNeighborsSignificance:
-        function BitModel_setNeighborsSignificance(row, column, index) {
-        var neighborsSignificance = this.neighborsSignificance;
-        var width = this.width, height = this.height;
-        var left = (column > 0);
-        var right = (column + 1 < width);
-        var i;
-
-        if (row > 0) {
-          i = index - width;
-          if (left) {
-            neighborsSignificance[i - 1] += 0x10;
-          }
-          if (right) {
-            neighborsSignificance[i + 1] += 0x10;
-          }
-          neighborsSignificance[i] += 0x04;
-        }
-
-        if (row + 1 < height) {
-          i = index + width;
-          if (left) {
-            neighborsSignificance[i - 1] += 0x10;
-          }
-          if (right) {
-            neighborsSignificance[i + 1] += 0x10;
-          }
-          neighborsSignificance[i] += 0x04;
-        }
-
-        if (left) {
-          neighborsSignificance[index - 1] += 0x01;
-        }
-        if (right) {
-          neighborsSignificance[index + 1] += 0x01;
-        }
-        neighborsSignificance[index] |= 0x80;
-      },
-      runSignificancePropogationPass:
-        function BitModel_runSignificancePropogationPass() {
-        var decoder = this.decoder;
-        var width = this.width, height = this.height;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var coefficentsSign = this.coefficentsSign;
-        var neighborsSignificance = this.neighborsSignificance;
-        var processingFlags = this.processingFlags;
-        var contexts = this.contexts;
-        var labels = this.contextLabelTable;
-        var bitsDecoded = this.bitsDecoded;
-        var processedInverseMask = ~1;
-        var processedMask = 1;
-        var firstMagnitudeBitMask = 2;
-
-        for (var i0 = 0; i0 < height; i0 += 4) {
-          for (var j = 0; j < width; j++) {
-            var index = i0 * width + j;
-            for (var i1 = 0; i1 < 4; i1++, index += width) {
-              var i = i0 + i1;
-              if (i >= height) {
-                break;
-              }
-              // clear processed flag first
-              processingFlags[index] &= processedInverseMask;
-
-              if (coefficentsMagnitude[index] ||
-                  !neighborsSignificance[index]) {
-                continue;
-              }
-
-              var contextLabel = labels[neighborsSignificance[index]];
-              var decision = decoder.readBit(contexts, contextLabel);
-              if (decision) {
-                var sign = this.decodeSignBit(i, j, index);
-                coefficentsSign[index] = sign;
-                coefficentsMagnitude[index] = 1;
-                this.setNeighborsSignificance(i, j, index);
-                processingFlags[index] |= firstMagnitudeBitMask;
-              }
-              bitsDecoded[index]++;
-              processingFlags[index] |= processedMask;
-            }
-          }
-        }
-      },
-      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {
-        var width = this.width, height = this.height;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var coefficentsSign = this.coefficentsSign;
-        var contribution, sign0, sign1, significance1;
-        var contextLabel, decoded;
-
-        // calculate horizontal contribution
-        significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0);
-        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {
-          sign1 = coefficentsSign[index + 1];
-          if (significance1) {
-            sign0 = coefficentsSign[index - 1];
-            contribution = 1 - sign1 - sign0;
-          } else {
-            contribution = 1 - sign1 - sign1;
-          }
-        } else if (significance1) {
-          sign0 = coefficentsSign[index - 1];
-          contribution = 1 - sign0 - sign0;
-        } else {
-          contribution = 0;
-        }
-        var horizontalContribution = 3 * contribution;
-
-        // calculate vertical contribution and combine with the horizontal
-        significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0);
-        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {
-          sign1 = coefficentsSign[index + width];
-          if (significance1) {
-            sign0 = coefficentsSign[index - width];
-            contribution = 1 - sign1 - sign0 + horizontalContribution;
-          } else {
-            contribution = 1 - sign1 - sign1 + horizontalContribution;
-          }
-        } else if (significance1) {
-          sign0 = coefficentsSign[index - width];
-          contribution = 1 - sign0 - sign0 + horizontalContribution;
-        } else {
-          contribution = horizontalContribution;
-        }
-
-        if (contribution >= 0) {
-          contextLabel = 9 + contribution;
-          decoded = this.decoder.readBit(this.contexts, contextLabel);
-        } else {
-          contextLabel = 9 - contribution;
-          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;
-        }
-        return decoded;
-      },
-      runMagnitudeRefinementPass:
-        function BitModel_runMagnitudeRefinementPass() {
-        var decoder = this.decoder;
-        var width = this.width, height = this.height;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var neighborsSignificance = this.neighborsSignificance;
-        var contexts = this.contexts;
-        var bitsDecoded = this.bitsDecoded;
-        var processingFlags = this.processingFlags;
-        var processedMask = 1;
-        var firstMagnitudeBitMask = 2;
-        var length = width * height;
-        var width4 = width * 4;
-
-        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {
-          indexNext = Math.min(length, index0 + width4);
-          for (var j = 0; j < width; j++) {
-            for (var index = index0 + j; index < indexNext; index += width) {
-
-              // significant but not those that have just become
-              if (!coefficentsMagnitude[index] ||
-                (processingFlags[index] & processedMask) !== 0) {
-                continue;
-              }
-
-              var contextLabel = 16;
-              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {
-                processingFlags[index] ^= firstMagnitudeBitMask;
-                // first refinement
-               var significance = neighborsSignificance[index] & 127;
-               contextLabel = significance === 0 ? 15 : 14;
-              }
-
-              var bit = decoder.readBit(contexts, contextLabel);
-              coefficentsMagnitude[index] =
-                (coefficentsMagnitude[index] << 1) | bit;
-              bitsDecoded[index]++;
-              processingFlags[index] |= processedMask;
-            }
-          }
-        }
-      },
-      runCleanupPass: function BitModel_runCleanupPass() {
-        var decoder = this.decoder;
-        var width = this.width, height = this.height;
-        var neighborsSignificance = this.neighborsSignificance;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var coefficentsSign = this.coefficentsSign;
-        var contexts = this.contexts;
-        var labels = this.contextLabelTable;
-        var bitsDecoded = this.bitsDecoded;
-        var processingFlags = this.processingFlags;
-        var processedMask = 1;
-        var firstMagnitudeBitMask = 2;
-        var oneRowDown = width;
-        var twoRowsDown = width * 2;
-        var threeRowsDown = width * 3;
-        var iNext;
-        for (var i0 = 0; i0 < height; i0 = iNext) {
-          iNext = Math.min(i0 + 4, height);
-          var indexBase = i0 * width;
-          var checkAllEmpty = i0 + 3 < height;
-          for (var j = 0; j < width; j++) {
-            var index0 = indexBase + j;
-            // using the property: labels[neighborsSignificance[index]] === 0
-            // when neighborsSignificance[index] === 0
-            var allEmpty = (checkAllEmpty &&
-              processingFlags[index0] === 0 &&
-              processingFlags[index0 + oneRowDown] === 0 &&
-              processingFlags[index0 + twoRowsDown] === 0 &&
-              processingFlags[index0 + threeRowsDown] === 0 &&
-              neighborsSignificance[index0] === 0 &&
-              neighborsSignificance[index0 + oneRowDown] === 0 &&
-              neighborsSignificance[index0 + twoRowsDown] === 0 &&
-              neighborsSignificance[index0 + threeRowsDown] === 0);
-            var i1 = 0, index = index0;
-            var i = i0, sign;
-            if (allEmpty) {
-              var hasSignificantCoefficent =
-                decoder.readBit(contexts, RUNLENGTH_CONTEXT);
-              if (!hasSignificantCoefficent) {
-                bitsDecoded[index0]++;
-                bitsDecoded[index0 + oneRowDown]++;
-                bitsDecoded[index0 + twoRowsDown]++;
-                bitsDecoded[index0 + threeRowsDown]++;
-                continue; // next column
-              }
-              i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |
-                    decoder.readBit(contexts, UNIFORM_CONTEXT);
-              if (i1 !== 0) {
-                i = i0 + i1;
-                index += i1 * width;
-              }
-
-              sign = this.decodeSignBit(i, j, index);
-              coefficentsSign[index] = sign;
-              coefficentsMagnitude[index] = 1;
-              this.setNeighborsSignificance(i, j, index);
-              processingFlags[index] |= firstMagnitudeBitMask;
-
-              index = index0;
-              for (var i2 = i0; i2 <= i; i2++, index += width) {
-                bitsDecoded[index]++;
-              }
-
-              i1++;
-            }
-            for (i = i0 + i1; i < iNext; i++, index += width) {
-              if (coefficentsMagnitude[index] ||
-                (processingFlags[index] & processedMask) !== 0) {
-                continue;
-              }
-
-              var contextLabel = labels[neighborsSignificance[index]];
-              var decision = decoder.readBit(contexts, contextLabel);
-              if (decision === 1) {
-                sign = this.decodeSignBit(i, j, index);
-                coefficentsSign[index] = sign;
-                coefficentsMagnitude[index] = 1;
-                this.setNeighborsSignificance(i, j, index);
-                processingFlags[index] |= firstMagnitudeBitMask;
-              }
-              bitsDecoded[index]++;
-            }
-          }
-        }
-      },
-      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
-        var decoder = this.decoder;
-        var contexts = this.contexts;
-        var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) |
-                     (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) |
-                     (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |
-                      decoder.readBit(contexts, UNIFORM_CONTEXT);
-        if (symbol !== 0xA) {
-          throw new Error('JPX Error: Invalid segmentation symbol');
-        }
-      }
-    };
-
-    return BitModel;
-  })();
-
-  // Section F, Discrete wavelet transformation
-  var Transform = (function TransformClosure() {
-    function Transform() {}
-
-    Transform.prototype.calculate =
-      function transformCalculate(subbands, u0, v0) {
-      var ll = subbands[0];
-      for (var i = 1, ii = subbands.length; i < ii; i++) {
-        ll = this.iterate(ll, subbands[i], u0, v0);
-      }
-      return ll;
-    };
-    Transform.prototype.extend = function extend(buffer, offset, size) {
-      // Section F.3.7 extending... using max extension of 4
-      var i1 = offset - 1, j1 = offset + 1;
-      var i2 = offset + size - 2, j2 = offset + size;
-      buffer[i1--] = buffer[j1++];
-      buffer[j2++] = buffer[i2--];
-      buffer[i1--] = buffer[j1++];
-      buffer[j2++] = buffer[i2--];
-      buffer[i1--] = buffer[j1++];
-      buffer[j2++] = buffer[i2--];
-      buffer[i1] = buffer[j1];
-      buffer[j2] = buffer[i2];
-    };
-    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh,
-                                                             u0, v0) {
-      var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;
-      var width = hl_lh_hh.width;
-      var height = hl_lh_hh.height;
-      var items = hl_lh_hh.items;
-      var i, j, k, l, u, v;
-
-      // Interleave LL according to Section F.3.3
-      for (k = 0, i = 0; i < llHeight; i++) {
-        l = i * 2 * width;
-        for (j = 0; j < llWidth; j++, k++, l += 2) {
-          items[l] = llItems[k];
-        }
-      }
-      // The LL band is not needed anymore.
-      llItems = ll.items = null;
-
-      var bufferPadding = 4;
-      var rowBuffer = new Float32Array(width + 2 * bufferPadding);
-
-      // Section F.3.4 HOR_SR
-      if (width === 1) {
-        // if width = 1, when u0 even keep items as is, when odd divide by 2
-        if ((u0 & 1) !== 0) {
-          for (v = 0, k = 0; v < height; v++, k += width) {
-            items[k] *= 0.5;
-          }
-        }
-      } else {
-        for (v = 0, k = 0; v < height; v++, k += width) {
-          rowBuffer.set(items.subarray(k, k + width), bufferPadding);
-
-          this.extend(rowBuffer, bufferPadding, width);
-          this.filter(rowBuffer, bufferPadding, width);
-
-          items.set(
-            rowBuffer.subarray(bufferPadding, bufferPadding + width),
-            k);
-        }
-      }
-
-      // Accesses to the items array can take long, because it may not fit into
-      // CPU cache and has to be fetched from main memory. Since subsequent
-      // accesses to the items array are not local when reading columns, we
-      // have a cache miss every time. To reduce cache misses, get up to
-      // 'numBuffers' items at a time and store them into the individual
-      // buffers. The colBuffers should be small enough to fit into CPU cache.
-      var numBuffers = 16;
-      var colBuffers = [];
-      for (i = 0; i < numBuffers; i++) {
-        colBuffers.push(new Float32Array(height + 2 * bufferPadding));
-      }
-      var b, currentBuffer = 0;
-      ll = bufferPadding + height;
-
-      // Section F.3.5 VER_SR
-      if (height === 1) {
-          // if height = 1, when v0 even keep items as is, when odd divide by 2
-        if ((v0 & 1) !== 0) {
-          for (u = 0; u < width; u++) {
-            items[u] *= 0.5;
-          }
-        }
-      } else {
-        for (u = 0; u < width; u++) {
-          // if we ran out of buffers, copy several image columns at once
-          if (currentBuffer === 0) {
-            numBuffers = Math.min(width - u, numBuffers);
-            for (k = u, l = bufferPadding; l < ll; k += width, l++) {
-              for (b = 0; b < numBuffers; b++) {
-                colBuffers[b][l] = items[k + b];
-              }
-            }
-            currentBuffer = numBuffers;
-          }
-
-          currentBuffer--;
-          var buffer = colBuffers[currentBuffer];
-          this.extend(buffer, bufferPadding, height);
-          this.filter(buffer, bufferPadding, height);
-
-          // If this is last buffer in this group of buffers, flush all buffers.
-          if (currentBuffer === 0) {
-            k = u - numBuffers + 1;
-            for (l = bufferPadding; l < ll; k += width, l++) {
-              for (b = 0; b < numBuffers; b++) {
-                items[k + b] = colBuffers[b][l];
-              }
-            }
-          }
-        }
-      }
-
-      return {
-        width: width,
-        height: height,
-        items: items
-      };
-    };
-    return Transform;
-  })();
-
-  // Section 3.8.2 Irreversible 9-7 filter
-  var IrreversibleTransform = (function IrreversibleTransformClosure() {
-    function IrreversibleTransform() {
-      Transform.call(this);
-    }
-
-    IrreversibleTransform.prototype = Object.create(Transform.prototype);
-    IrreversibleTransform.prototype.filter =
-      function irreversibleTransformFilter(x, offset, length) {
-      var len = length >> 1;
-      offset = offset | 0;
-      var j, n, current, next;
-
-      var alpha = -1.586134342059924;
-      var beta = -0.052980118572961;
-      var gamma = 0.882911075530934;
-      var delta = 0.443506852043971;
-      var K = 1.230174104914001;
-      var K_ = 1 / K;
-
-      // step 1 is combined with step 3
-
-      // step 2
-      j = offset - 3;
-      for (n = len + 4; n--; j += 2) {
-        x[j] *= K_;
-      }
-
-      // step 1 & 3
-      j = offset - 2;
-      current = delta * x[j -1];
-      for (n = len + 3; n--; j += 2) {
-        next = delta * x[j + 1];
-        x[j] = K * x[j] - current - next;
-        if (n--) {
-          j += 2;
-          current = delta * x[j + 1];
-          x[j] = K * x[j] - current - next;
-        } else {
-          break;
-        }
-      }
-
-      // step 4
-      j = offset - 1;
-      current = gamma * x[j - 1];
-      for (n = len + 2; n--; j += 2) {
-        next = gamma * x[j + 1];
-        x[j] -= current + next;
-        if (n--) {
-          j += 2;
-          current = gamma * x[j + 1];
-          x[j] -= current + next;
-        } else {
-          break;
-        }
-      }
-
-      // step 5
-      j = offset;
-      current = beta * x[j - 1];
-      for (n = len + 1; n--; j += 2) {
-        next = beta * x[j + 1];
-        x[j] -= current + next;
-        if (n--) {
-          j += 2;
-          current = beta * x[j + 1];
-          x[j] -= current + next;
-        } else {
-          break;
-        }
-      }
-
-      // step 6
-      if (len !== 0) {
-        j = offset + 1;
-        current = alpha * x[j - 1];
-        for (n = len; n--; j += 2) {
-          next = alpha * x[j + 1];
-          x[j] -= current + next;
-          if (n--) {
-            j += 2;
-            current = alpha * x[j + 1];
-            x[j] -= current + next;
-          } else {
-            break;
-          }
-        }
-      }
-    };
-
-    return IrreversibleTransform;
-  })();
-
-  // Section 3.8.1 Reversible 5-3 filter
-  var ReversibleTransform = (function ReversibleTransformClosure() {
-    function ReversibleTransform() {
-      Transform.call(this);
-    }
-
-    ReversibleTransform.prototype = Object.create(Transform.prototype);
-    ReversibleTransform.prototype.filter =
-      function reversibleTransformFilter(x, offset, length) {
-      var len = length >> 1;
-      offset = offset | 0;
-      var j, n;
-
-      for (j = offset, n = len + 1; n--; j += 2) {
-        x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2;
-      }
-
-      for (j = offset + 1, n = len; n--; j += 2) {
-        x[j] += (x[j - 1] + x[j + 1]) >> 1;
-      }
-    };
-
-    return ReversibleTransform;
-  })();
-
-  return JpxImage;
-})();
-
-
-var Jbig2Image = (function Jbig2ImageClosure() {
-  // Utility data structures
-  function ContextCache() {}
-
-  ContextCache.prototype = {
-    getContexts: function(id) {
-      if (id in this) {
-        return this[id];
-      }
-      return (this[id] = new Int8Array(1 << 16));
-    }
-  };
-
-  function DecodingContext(data, start, end) {
-    this.data = data;
-    this.start = start;
-    this.end = end;
-  }
-
-  DecodingContext.prototype = {
-    get decoder() {
-      var decoder = new ArithmeticDecoder(this.data, this.start, this.end);
-      return shadow(this, 'decoder', decoder);
-    },
-    get contextCache() {
-      var cache = new ContextCache();
-      return shadow(this, 'contextCache', cache);
-    }
-  };
-
-  // Annex A. Arithmetic Integer Decoding Procedure
-  // A.2 Procedure for decoding values
-  function decodeInteger(contextCache, procedure, decoder) {
-    var contexts = contextCache.getContexts(procedure);
-    var prev = 1;
-
-    function readBits(length) {
-      var v = 0;
-      for (var i = 0; i < length; i++) {
-        var bit = decoder.readBit(contexts, prev);
-        prev = (prev < 256 ? (prev << 1) | bit :
-                (((prev << 1) | bit) & 511) | 256);
-        v = (v << 1) | bit;
-      }
-      return v >>> 0;
-    }
-
-    var sign = readBits(1);
-    var value = readBits(1) ?
-                  (readBits(1) ?
-                    (readBits(1) ?
-                      (readBits(1) ?
-                        (readBits(1) ?
-                          (readBits(32) + 4436) :
-                        readBits(12) + 340) :
-                      readBits(8) + 84) :
-                    readBits(6) + 20) :
-                  readBits(4) + 4) :
-                readBits(2);
-    return (sign === 0 ? value : (value > 0 ? -value : null));
-  }
-
-  // A.3 The IAID decoding procedure
-  function decodeIAID(contextCache, decoder, codeLength) {
-    var contexts = contextCache.getContexts('IAID');
-
-    var prev = 1;
-    for (var i = 0; i < codeLength; i++) {
-      var bit = decoder.readBit(contexts, prev);
-      prev = (prev << 1) | bit;
-    }
-    if (codeLength < 31) {
-      return prev & ((1 << codeLength) - 1);
-    }
-    return prev & 0x7FFFFFFF;
-  }
-
-  // 7.3 Segment types
-  var SegmentTypes = [
-    'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null,
-    'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null,
-    null, null, null, null, null, 'patternDictionary', null, null, null,
-    'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion',
-    'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null,
-    null, null, null, null, null, 'IntermediateGenericRegion', null,
-    'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion',
-    'IntermediateGenericRefinementRegion', null,
-    'ImmediateGenericRefinementRegion',
-    'ImmediateLosslessGenericRefinementRegion', null, null, null, null,
-    'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles',
-    'Tables', null, null, null, null, null, null, null, null,
-    'Extension'
-  ];
-
-  var CodingTemplates = [
-    [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},
-     {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1},
-     {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],
-    [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: 2, y: -2},
-     {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1},
-     {x: 2, y: -1}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],
-    [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},
-     {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0},
-     {x: -1, y: 0}],
-    [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1},
-     {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}]
-  ];
-
-  var RefinementTemplates = [
-    {
-      coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],
-      reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0},
-                  {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}]
-    },
-    {
-      coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],
-      reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0},
-                  {x: 0, y: 1}, {x: 1, y: 1}]
-    }
-  ];
-
-  // See 6.2.5.7 Decoding the bitmap.
-  var ReusedContexts = [
-    0x9B25, // 10011 0110010 0101
-    0x0795, // 0011 110010 101
-    0x00E5, // 001 11001 01
-    0x0195  // 011001 0101
-  ];
-
-  var RefinementReusedContexts = [
-    0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference)
-    0x0008  // '0000' + '001000'
-  ];
-
-  function decodeBitmapTemplate0(width, height, decodingContext) {
-    var decoder = decodingContext.decoder;
-    var contexts = decodingContext.contextCache.getContexts('GB');
-    var contextLabel, i, j, pixel, row, row1, row2, bitmap = [];
-
-    // ...ooooo....
-    // ..ooooooo... Context template for current pixel (X)
-    // .ooooX...... (concatenate values of 'o'-pixels to get contextLabel)
-    var OLD_PIXEL_MASK = 0x7BF7; // 01111 0111111 0111
-
-    for (i = 0; i < height; i++) {
-      row = bitmap[i] = new Uint8Array(width);
-      row1 = (i < 1) ? row : bitmap[i - 1];
-      row2 = (i < 2) ? row : bitmap[i - 2];
-
-      // At the beginning of each row:
-      // Fill contextLabel with pixels that are above/right of (X)
-      contextLabel = (row2[0] << 13) | (row2[1] << 12) | (row2[2] << 11) |
-                     (row1[0] << 7) | (row1[1] << 6) | (row1[2] << 5) |
-                     (row1[3] << 4);
-
-      for (j = 0; j < width; j++) {
-        row[j] = pixel = decoder.readBit(contexts, contextLabel);
-
-        // At each pixel: Clear contextLabel pixels that are shifted
-        // out of the context, then add new ones.
-        contextLabel = ((contextLabel & OLD_PIXEL_MASK) << 1) |
-                       (j + 3 < width ? row2[j + 3] << 11 : 0) |
-                       (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;
-      }
-    }
-
-    return bitmap;
-  }
-
-  // 6.2 Generic Region Decoding Procedure
-  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at,
-                        decodingContext) {
-    if (mmr) {
-      error('JBIG2 error: MMR encoding is not supported');
-    }
-
-    // Use optimized version for the most common case
-    if (templateIndex === 0 && !skip && !prediction && at.length === 4 &&
-        at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 &&
-        at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {
-      return decodeBitmapTemplate0(width, height, decodingContext);
-    }
-
-    var useskip = !!skip;
-    var template = CodingTemplates[templateIndex].concat(at);
-
-    // Sorting is non-standard, and it is not required. But sorting increases
-    // the number of template bits that can be reused from the previous
-    // contextLabel in the main loop.
-    template.sort(function (a, b) {
-      return (a.y - b.y) || (a.x - b.x);
-    });
-
-    var templateLength = template.length;
-    var templateX = new Int8Array(templateLength);
-    var templateY = new Int8Array(templateLength);
-    var changingTemplateEntries = [];
-    var reuseMask = 0, minX = 0, maxX = 0, minY = 0;
-    var c, k;
-
-    for (k = 0; k < templateLength; k++) {
-      templateX[k] = template[k].x;
-      templateY[k] = template[k].y;
-      minX = Math.min(minX, template[k].x);
-      maxX = Math.max(maxX, template[k].x);
-      minY = Math.min(minY, template[k].y);
-      // Check if the template pixel appears in two consecutive context labels,
-      // so it can be reused. Otherwise, we add it to the list of changing
-      // template entries.
-      if (k < templateLength - 1 &&
-          template[k].y === template[k + 1].y &&
-          template[k].x === template[k + 1].x - 1) {
-        reuseMask |= 1 << (templateLength - 1 - k);
-      } else {
-        changingTemplateEntries.push(k);
-      }
-    }
-    var changingEntriesLength = changingTemplateEntries.length;
-
-    var changingTemplateX = new Int8Array(changingEntriesLength);
-    var changingTemplateY = new Int8Array(changingEntriesLength);
-    var changingTemplateBit = new Uint16Array(changingEntriesLength);
-    for (c = 0; c < changingEntriesLength; c++) {
-      k = changingTemplateEntries[c];
-      changingTemplateX[c] = template[k].x;
-      changingTemplateY[c] = template[k].y;
-      changingTemplateBit[c] = 1 << (templateLength - 1 - k);
-    }
-
-    // Get the safe bounding box edges from the width, height, minX, maxX, minY
-    var sbb_left = -minX;
-    var sbb_top = -minY;
-    var sbb_right = width - maxX;
-
-    var pseudoPixelContext = ReusedContexts[templateIndex];
-    var row = new Uint8Array(width);
-    var bitmap = [];
-
-    var decoder = decodingContext.decoder;
-    var contexts = decodingContext.contextCache.getContexts('GB');
-
-    var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift;
-    for (var i = 0; i < height; i++) {
-      if (prediction) {
-        var sltp = decoder.readBit(contexts, pseudoPixelContext);
-        ltp ^= sltp;
-        if (ltp) {
-          bitmap.push(row); // duplicate previous row
-          continue;
-        }
-      }
-      row = new Uint8Array(row);
-      bitmap.push(row);
-      for (j = 0; j < width; j++) {
-        if (useskip && skip[i][j]) {
-          row[j] = 0;
-          continue;
-        }
-        // Are we in the middle of a scanline, so we can reuse contextLabel
-        // bits?
-        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {
-          // If yes, we can just shift the bits that are reusable and only
-          // fetch the remaining ones.
-          contextLabel = (contextLabel << 1) & reuseMask;
-          for (k = 0; k < changingEntriesLength; k++) {
-            i0 = i + changingTemplateY[k];
-            j0 = j + changingTemplateX[k];
-            bit = bitmap[i0][j0];
-            if (bit) {
-              bit = changingTemplateBit[k];
-              contextLabel |= bit;
-            }
-          }
-        } else {
-          // compute the contextLabel from scratch
-          contextLabel = 0;
-          shift = templateLength - 1;
-          for (k = 0; k < templateLength; k++, shift--) {
-            j0 = j + templateX[k];
-            if (j0 >= 0 && j0 < width) {
-              i0 = i + templateY[k];
-              if (i0 >= 0) {
-                bit = bitmap[i0][j0];
-                if (bit) {
-                  contextLabel |= bit << shift;
-                }
-              }
-            }
-          }
-        }
-        var pixel = decoder.readBit(contexts, contextLabel);
-        row[j] = pixel;
-      }
-    }
-    return bitmap;
-  }
-
-  // 6.3.2 Generic Refinement Region Decoding Procedure
-  function decodeRefinement(width, height, templateIndex, referenceBitmap,
-                            offsetX, offsetY, prediction, at,
-                            decodingContext) {
-    var codingTemplate = RefinementTemplates[templateIndex].coding;
-    if (templateIndex === 0) {
-      codingTemplate = codingTemplate.concat([at[0]]);
-    }
-    var codingTemplateLength = codingTemplate.length;
-    var codingTemplateX = new Int32Array(codingTemplateLength);
-    var codingTemplateY = new Int32Array(codingTemplateLength);
-    var k;
-    for (k = 0; k < codingTemplateLength; k++) {
-      codingTemplateX[k] = codingTemplate[k].x;
-      codingTemplateY[k] = codingTemplate[k].y;
-    }
-
-    var referenceTemplate = RefinementTemplates[templateIndex].reference;
-    if (templateIndex === 0) {
-      referenceTemplate = referenceTemplate.concat([at[1]]);
-    }
-    var referenceTemplateLength = referenceTemplate.length;
-    var referenceTemplateX = new Int32Array(referenceTemplateLength);
-    var referenceTemplateY = new Int32Array(referenceTemplateLength);
-    for (k = 0; k < referenceTemplateLength; k++) {
-      referenceTemplateX[k] = referenceTemplate[k].x;
-      referenceTemplateY[k] = referenceTemplate[k].y;
-    }
-    var referenceWidth = referenceBitmap[0].length;
-    var referenceHeight = referenceBitmap.length;
-
-    var pseudoPixelContext = RefinementReusedContexts[templateIndex];
-    var bitmap = [];
-
-    var decoder = decodingContext.decoder;
-    var contexts = decodingContext.contextCache.getContexts('GR');
-
-    var ltp = 0;
-    for (var i = 0; i < height; i++) {
-      if (prediction) {
-        var sltp = decoder.readBit(contexts, pseudoPixelContext);
-        ltp ^= sltp;
-        if (ltp) {
-          error('JBIG2 error: prediction is not supported');
-        }
-      }
-      var row = new Uint8Array(width);
-      bitmap.push(row);
-      for (var j = 0; j < width; j++) {
-        var i0, j0;
-        var contextLabel = 0;
-        for (k = 0; k < codingTemplateLength; k++) {
-          i0 = i + codingTemplateY[k];
-          j0 = j + codingTemplateX[k];
-          if (i0 < 0 || j0 < 0 || j0 >= width) {
-            contextLabel <<= 1; // out of bound pixel
-          } else {
-            contextLabel = (contextLabel << 1) | bitmap[i0][j0];
-          }
-        }
-        for (k = 0; k < referenceTemplateLength; k++) {
-          i0 = i + referenceTemplateY[k] + offsetY;
-          j0 = j + referenceTemplateX[k] + offsetX;
-          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 ||
-              j0 >= referenceWidth) {
-            contextLabel <<= 1; // out of bound pixel
-          } else {
-            contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0];
-          }
-        }
-        var pixel = decoder.readBit(contexts, contextLabel);
-        row[j] = pixel;
-      }
-    }
-
-    return bitmap;
-  }
-
-  // 6.5.5 Decoding the symbol dictionary
-  function decodeSymbolDictionary(huffman, refinement, symbols,
-                                  numberOfNewSymbols, numberOfExportedSymbols,
-                                  huffmanTables, templateIndex, at,
-                                  refinementTemplateIndex, refinementAt,
-                                  decodingContext) {
-    if (huffman) {
-      error('JBIG2 error: huffman is not supported');
-    }
-
-    var newSymbols = [];
-    var currentHeight = 0;
-    var symbolCodeLength = log2(symbols.length + numberOfNewSymbols);
-
-    var decoder = decodingContext.decoder;
-    var contextCache = decodingContext.contextCache;
-
-    while (newSymbols.length < numberOfNewSymbols) {
-      var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6
-      currentHeight += deltaHeight;
-      var currentWidth = 0;
-      var totalWidth = 0;
-      while (true) {
-        var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7
-        if (deltaWidth === null) {
-          break; // OOB
-        }
-        currentWidth += deltaWidth;
-        totalWidth += currentWidth;
-        var bitmap;
-        if (refinement) {
-          // 6.5.8.2 Refinement/aggregate-coded symbol bitmap
-          var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);
-          if (numberOfInstances > 1) {
-            bitmap = decodeTextRegion(huffman, refinement,
-                                      currentWidth, currentHeight, 0,
-                                      numberOfInstances, 1, //strip size
-                                      symbols.concat(newSymbols),
-                                      symbolCodeLength,
-                                      0, //transposed
-                                      0, //ds offset
-                                      1, //top left 7.4.3.1.1
-                                      0, //OR operator
-                                      huffmanTables,
-                                      refinementTemplateIndex, refinementAt,
-                                      decodingContext);
-          } else {
-            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
-            var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3
-            var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4
-            var symbol = (symbolId < symbols.length ? symbols[symbolId] :
-                          newSymbols[symbolId - symbols.length]);
-            bitmap = decodeRefinement(currentWidth, currentHeight,
-            refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt,
-            decodingContext);
-          }
-        } else {
-          // 6.5.8.1 Direct-coded symbol bitmap
-          bitmap = decodeBitmap(false, currentWidth, currentHeight,
-            templateIndex, false, null, at, decodingContext);
-        }
-        newSymbols.push(bitmap);
-      }
-    }
-    // 6.5.10 Exported symbols
-    var exportedSymbols = [];
-    var flags = [], currentFlag = false;
-    var totalSymbolsLength = symbols.length + numberOfNewSymbols;
-    while (flags.length < totalSymbolsLength) {
-      var runLength = decodeInteger(contextCache, 'IAEX', decoder);
-      while (runLength--) {
-        flags.push(currentFlag);
-      }
-      currentFlag = !currentFlag;
-    }
-    for (var i = 0, ii = symbols.length; i < ii; i++) {
-      if (flags[i]) {
-        exportedSymbols.push(symbols[i]);
-      }
-    }
-    for (var j = 0; j < numberOfNewSymbols; i++, j++) {
-      if (flags[i]) {
-        exportedSymbols.push(newSymbols[j]);
-      }
-    }
-    return exportedSymbols;
-  }
-
-  function decodeTextRegion(huffman, refinement, width, height,
-                            defaultPixelValue, numberOfSymbolInstances,
-                            stripSize, inputSymbols, symbolCodeLength,
-                            transposed, dsOffset, referenceCorner,
-                            combinationOperator, huffmanTables,
-                            refinementTemplateIndex, refinementAt,
-                            decodingContext) {
-    if (huffman) {
-      error('JBIG2 error: huffman is not supported');
-    }
-
-    // Prepare bitmap
-    var bitmap = [];
-    var i, row;
-    for (i = 0; i < height; i++) {
-      row = new Uint8Array(width);
-      if (defaultPixelValue) {
-        for (var j = 0; j < width; j++) {
-          row[j] = defaultPixelValue;
-        }
-      }
-      bitmap.push(row);
-    }
-
-    var decoder = decodingContext.decoder;
-    var contextCache = decodingContext.contextCache;
-    var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6
-    var firstS = 0;
-    i = 0;
-    while (i < numberOfSymbolInstances) {
-      var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6
-      stripT += deltaT;
-
-      var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7
-      firstS += deltaFirstS;
-      var currentS = firstS;
-      do {
-        var currentT = (stripSize === 1 ? 0 :
-                        decodeInteger(contextCache, 'IAIT', decoder)); // 6.4.9
-        var t = stripSize * stripT + currentT;
-        var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
-        var applyRefinement = (refinement &&
-                               decodeInteger(contextCache, 'IARI', decoder));
-        var symbolBitmap = inputSymbols[symbolId];
-        var symbolWidth = symbolBitmap[0].length;
-        var symbolHeight = symbolBitmap.length;
-        if (applyRefinement) {
-          var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1
-          var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2
-          var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3
-          var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4
-          symbolWidth += rdw;
-          symbolHeight += rdh;
-          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight,
-            refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx,
-            (rdh >> 1) + rdy, false, refinementAt,
-            decodingContext);
-        }
-        var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight);
-        var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0);
-        var s2, t2, symbolRow;
-        if (transposed) {
-          // Place Symbol Bitmap from T1,S1
-          for (s2 = 0; s2 < symbolHeight; s2++) {
-            row = bitmap[offsetS + s2];
-            if (!row) {
-              continue;
-            }
-            symbolRow = symbolBitmap[s2];
-            // To ignore Parts of Symbol bitmap which goes
-            // outside bitmap region
-            var maxWidth = Math.min(width - offsetT, symbolWidth);
-            switch (combinationOperator) {
-              case 0: // OR
-                for (t2 = 0; t2 < maxWidth; t2++) {
-                  row[offsetT + t2] |= symbolRow[t2];
-                }
-                break;
-              case 2: // XOR
-                for (t2 = 0; t2 < maxWidth; t2++) {
-                  row[offsetT + t2] ^= symbolRow[t2];
-                }
-                break;
-              default:
-                error('JBIG2 error: operator ' + combinationOperator +
-                      ' is not supported');
-            }
-          }
-          currentS += symbolHeight - 1;
-        } else {
-          for (t2 = 0; t2 < symbolHeight; t2++) {
-            row = bitmap[offsetT + t2];
-            if (!row) {
-              continue;
-            }
-            symbolRow = symbolBitmap[t2];
-            switch (combinationOperator) {
-              case 0: // OR
-                for (s2 = 0; s2 < symbolWidth; s2++) {
-                  row[offsetS + s2] |= symbolRow[s2];
-                }
-                break;
-              case 2: // XOR
-                for (s2 = 0; s2 < symbolWidth; s2++) {
-                  row[offsetS + s2] ^= symbolRow[s2];
-                }
-                break;
-              default:
-                error('JBIG2 error: operator ' + combinationOperator +
-                      ' is not supported');
-            }
-          }
-          currentS += symbolWidth - 1;
-        }
-        i++;
-        var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8
-        if (deltaS === null) {
-          break; // OOB
-        }
-        currentS += deltaS + dsOffset;
-      } while (true);
-    }
-    return bitmap;
-  }
-
-  function readSegmentHeader(data, start) {
-    var segmentHeader = {};
-    segmentHeader.number = readUint32(data, start);
-    var flags = data[start + 4];
-    var segmentType = flags & 0x3F;
-    if (!SegmentTypes[segmentType]) {
-      error('JBIG2 error: invalid segment type: ' + segmentType);
-    }
-    segmentHeader.type = segmentType;
-    segmentHeader.typeName = SegmentTypes[segmentType];
-    segmentHeader.deferredNonRetain = !!(flags & 0x80);
-
-    var pageAssociationFieldSize = !!(flags & 0x40);
-    var referredFlags = data[start + 5];
-    var referredToCount = (referredFlags >> 5) & 7;
-    var retainBits = [referredFlags & 31];
-    var position = start + 6;
-    if (referredFlags === 7) {
-      referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF;
-      position += 3;
-      var bytes = (referredToCount + 7) >> 3;
-      retainBits[0] = data[position++];
-      while (--bytes > 0) {
-        retainBits.push(data[position++]);
-      }
-    } else if (referredFlags === 5 || referredFlags === 6) {
-      error('JBIG2 error: invalid referred-to flags');
-    }
-
-    segmentHeader.retainBits = retainBits;
-    var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 :
-      (segmentHeader.number <= 65536 ? 2 : 4));
-    var referredTo = [];
-    var i, ii;
-    for (i = 0; i < referredToCount; i++) {
-      var number = (referredToSegmentNumberSize === 1 ? data[position] :
-        (referredToSegmentNumberSize === 2 ? readUint16(data, position) :
-        readUint32(data, position)));
-      referredTo.push(number);
-      position += referredToSegmentNumberSize;
-    }
-    segmentHeader.referredTo = referredTo;
-    if (!pageAssociationFieldSize) {
-      segmentHeader.pageAssociation = data[position++];
-    } else {
-      segmentHeader.pageAssociation = readUint32(data, position);
-      position += 4;
-    }
-    segmentHeader.length = readUint32(data, position);
-    position += 4;
-
-    if (segmentHeader.length === 0xFFFFFFFF) {
-      // 7.2.7 Segment data length, unknown segment length
-      if (segmentType === 38) { // ImmediateGenericRegion
-        var genericRegionInfo = readRegionSegmentInformation(data, position);
-        var genericRegionSegmentFlags = data[position +
-          RegionSegmentInformationFieldLength];
-        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);
-        // searching for the segment end
-        var searchPatternLength = 6;
-        var searchPattern = new Uint8Array(searchPatternLength);
-        if (!genericRegionMmr) {
-          searchPattern[0] = 0xFF;
-          searchPattern[1] = 0xAC;
-        }
-        searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF;
-        searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF;
-        searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF;
-        searchPattern[5] = genericRegionInfo.height & 0xFF;
-        for (i = position, ii = data.length; i < ii; i++) {
-          var j = 0;
-          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {
-            j++;
-          }
-          if (j === searchPatternLength) {
-            segmentHeader.length = i + searchPatternLength;
-            break;
-          }
-        }
-        if (segmentHeader.length === 0xFFFFFFFF) {
-          error('JBIG2 error: segment end was not found');
-        }
-      } else {
-        error('JBIG2 error: invalid unknown segment length');
-      }
-    }
-    segmentHeader.headerEnd = position;
-    return segmentHeader;
-  }
-
-  function readSegments(header, data, start, end) {
-    var segments = [];
-    var position = start;
-    while (position < end) {
-      var segmentHeader = readSegmentHeader(data, position);
-      position = segmentHeader.headerEnd;
-      var segment = {
-        header: segmentHeader,
-        data: data
-      };
-      if (!header.randomAccess) {
-        segment.start = position;
-        position += segmentHeader.length;
-        segment.end = position;
-      }
-      segments.push(segment);
-      if (segmentHeader.type === 51) {
-        break; // end of file is found
-      }
-    }
-    if (header.randomAccess) {
-      for (var i = 0, ii = segments.length; i < ii; i++) {
-        segments[i].start = position;
-        position += segments[i].header.length;
-        segments[i].end = position;
-      }
-    }
-    return segments;
-  }
-
-  // 7.4.1 Region segment information field
-  function readRegionSegmentInformation(data, start) {
-    return {
-      width: readUint32(data, start),
-      height: readUint32(data, start + 4),
-      x: readUint32(data, start + 8),
-      y: readUint32(data, start + 12),
-      combinationOperator: data[start + 16] & 7
-    };
-  }
-  var RegionSegmentInformationFieldLength = 17;
-
-  function processSegment(segment, visitor) {
-    var header = segment.header;
-
-    var data = segment.data, position = segment.start, end = segment.end;
-    var args, at, i, atLength;
-    switch (header.type) {
-      case 0: // SymbolDictionary
-        // 7.4.2 Symbol dictionary segment syntax
-        var dictionary = {};
-        var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1
-        dictionary.huffman = !!(dictionaryFlags & 1);
-        dictionary.refinement = !!(dictionaryFlags & 2);
-        dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3;
-        dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3;
-        dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1;
-        dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1;
-        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);
-        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);
-        dictionary.template = (dictionaryFlags >> 10) & 3;
-        dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1;
-        position += 2;
-        if (!dictionary.huffman) {
-          atLength = dictionary.template === 0 ? 4 : 1;
-          at = [];
-          for (i = 0; i < atLength; i++) {
-            at.push({
-              x: readInt8(data, position),
-              y: readInt8(data, position + 1)
-            });
-            position += 2;
-          }
-          dictionary.at = at;
-        }
-        if (dictionary.refinement && !dictionary.refinementTemplate) {
-          at = [];
-          for (i = 0; i < 2; i++) {
-            at.push({
-              x: readInt8(data, position),
-              y: readInt8(data, position + 1)
-            });
-            position += 2;
-          }
-          dictionary.refinementAt = at;
-        }
-        dictionary.numberOfExportedSymbols = readUint32(data, position);
-        position += 4;
-        dictionary.numberOfNewSymbols = readUint32(data, position);
-        position += 4;
-        args = [dictionary, header.number, header.referredTo,
-                data, position, end];
-        break;
-      case 6: // ImmediateTextRegion
-      case 7: // ImmediateLosslessTextRegion
-        var textRegion = {};
-        textRegion.info = readRegionSegmentInformation(data, position);
-        position += RegionSegmentInformationFieldLength;
-        var textRegionSegmentFlags = readUint16(data, position);
-        position += 2;
-        textRegion.huffman = !!(textRegionSegmentFlags & 1);
-        textRegion.refinement = !!(textRegionSegmentFlags & 2);
-        textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3);
-        textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3;
-        textRegion.transposed = !!(textRegionSegmentFlags & 64);
-        textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3;
-        textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1;
-        textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27;
-        textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1;
-        if (textRegion.huffman) {
-          var textRegionHuffmanFlags = readUint16(data, position);
-          position += 2;
-          textRegion.huffmanFS = (textRegionHuffmanFlags) & 3;
-          textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3;
-          textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3;
-          textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3;
-          textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3;
-          textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3;
-          textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3;
-          textRegion.huffmanRefinementSizeSelector =
-            !!(textRegionHuffmanFlags & 14);
-        }
-        if (textRegion.refinement && !textRegion.refinementTemplate) {
-          at = [];
-          for (i = 0; i < 2; i++) {
-            at.push({
-              x: readInt8(data, position),
-              y: readInt8(data, position + 1)
-            });
-            position += 2;
-          }
-          textRegion.refinementAt = at;
-        }
-        textRegion.numberOfSymbolInstances = readUint32(data, position);
-        position += 4;
-        // TODO 7.4.3.1.7 Symbol ID Huffman table decoding
-        if (textRegion.huffman) {
-          error('JBIG2 error: huffman is not supported');
-        }
-        args = [textRegion, header.referredTo, data, position, end];
-        break;
-      case 38: // ImmediateGenericRegion
-      case 39: // ImmediateLosslessGenericRegion
-        var genericRegion = {};
-        genericRegion.info = readRegionSegmentInformation(data, position);
-        position += RegionSegmentInformationFieldLength;
-        var genericRegionSegmentFlags = data[position++];
-        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
-        genericRegion.template = (genericRegionSegmentFlags >> 1) & 3;
-        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);
-        if (!genericRegion.mmr) {
-          atLength = genericRegion.template === 0 ? 4 : 1;
-          at = [];
-          for (i = 0; i < atLength; i++) {
-            at.push({
-              x: readInt8(data, position),
-              y: readInt8(data, position + 1)
-            });
-            position += 2;
-          }
-          genericRegion.at = at;
-        }
-        args = [genericRegion, data, position, end];
-        break;
-      case 48: // PageInformation
-        var pageInfo = {
-          width: readUint32(data, position),
-          height: readUint32(data, position + 4),
-          resolutionX: readUint32(data, position + 8),
-          resolutionY: readUint32(data, position + 12)
-        };
-        if (pageInfo.height === 0xFFFFFFFF) {
-          delete pageInfo.height;
-        }
-        var pageSegmentFlags = data[position + 16];
-        var pageStripingInformatiom = readUint16(data, position + 17);
-        pageInfo.lossless = !!(pageSegmentFlags & 1);
-        pageInfo.refinement = !!(pageSegmentFlags & 2);
-        pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1;
-        pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3;
-        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);
-        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
-        args = [pageInfo];
-        break;
-      case 49: // EndOfPage
-        break;
-      case 50: // EndOfStripe
-        break;
-      case 51: // EndOfFile
-        break;
-      case 62: // 7.4.15 defines 2 extension types which
-               // are comments and can be ignored.
-        break;
-      default:
-        error('JBIG2 error: segment type ' + header.typeName + '(' +
-              header.type + ') is not implemented');
-    }
-    var callbackName = 'on' + header.typeName;
-    if (callbackName in visitor) {
-      visitor[callbackName].apply(visitor, args);
-    }
-  }
-
-  function processSegments(segments, visitor) {
-    for (var i = 0, ii = segments.length; i < ii; i++) {
-      processSegment(segments[i], visitor);
-    }
-  }
-
-  function parseJbig2(data, start, end) {
-    var position = start;
-    if (data[position] !== 0x97 || data[position + 1] !== 0x4A ||
-        data[position + 2] !== 0x42 || data[position + 3] !== 0x32 ||
-        data[position + 4] !== 0x0D || data[position + 5] !== 0x0A ||
-        data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {
-      error('JBIG2 error: invalid header');
-    }
-    var header = {};
-    position += 8;
-    var flags = data[position++];
-    header.randomAccess = !(flags & 1);
-    if (!(flags & 2)) {
-      header.numberOfPages = readUint32(data, position);
-      position += 4;
-    }
-    var segments = readSegments(header, data, position, end);
-    error('Not implemented');
-    // processSegments(segments, new SimpleSegmentVisitor());
-  }
-
-  function parseJbig2Chunks(chunks) {
-    var visitor = new SimpleSegmentVisitor();
-    for (var i = 0, ii = chunks.length; i < ii; i++) {
-      var chunk = chunks[i];
-      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);
-      processSegments(segments, visitor);
-    }
-    return visitor.buffer;
-  }
-
-  function SimpleSegmentVisitor() {}
-
-  SimpleSegmentVisitor.prototype = {
-    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
-      this.currentPageInfo = info;
-      var rowSize = (info.width + 7) >> 3;
-      var buffer = new Uint8Array(rowSize * info.height);
-      // The contents of ArrayBuffers are initialized to 0.
-      // Fill the buffer with 0xFF only if info.defaultPixelValue is set
-      if (info.defaultPixelValue) {
-        for (var i = 0, ii = buffer.length; i < ii; i++) {
-          buffer[i] = 0xFF;
-        }
-      }
-      this.buffer = buffer;
-    },
-    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {
-      var pageInfo = this.currentPageInfo;
-      var width = regionInfo.width, height = regionInfo.height;
-      var rowSize = (pageInfo.width + 7) >> 3;
-      var combinationOperator = pageInfo.combinationOperatorOverride ?
-        regionInfo.combinationOperator : pageInfo.combinationOperator;
-      var buffer = this.buffer;
-      var mask0 =  128 >> (regionInfo.x & 7);
-      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
-      var i, j, mask, offset;
-      switch (combinationOperator) {
-        case 0: // OR
-          for (i = 0; i < height; i++) {
-            mask = mask0;
-            offset = offset0;
-            for (j = 0; j < width; j++) {
-              if (bitmap[i][j]) {
-                buffer[offset] |= mask;
-              }
-              mask >>= 1;
-              if (!mask) {
-                mask = 128;
-                offset++;
-              }
-            }
-            offset0 += rowSize;
-          }
-        break;
-        case 2: // XOR
-          for (i = 0; i < height; i++) {
-            mask = mask0;
-            offset = offset0;
-            for (j = 0; j < width; j++) {
-              if (bitmap[i][j]) {
-                buffer[offset] ^= mask;
-              }
-              mask >>= 1;
-              if (!mask) {
-                mask = 128;
-                offset++;
-              }
-            }
-            offset0 += rowSize;
-          }
-          break;
-        default:
-          error('JBIG2 error: operator ' + combinationOperator +
-                ' is not supported');
-      }
-    },
-    onImmediateGenericRegion:
-      function SimpleSegmentVisitor_onImmediateGenericRegion(region, data,
-                                                             start, end) {
-      var regionInfo = region.info;
-      var decodingContext = new DecodingContext(data, start, end);
-      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height,
-                                region.template, region.prediction, null,
-                                region.at, decodingContext);
-      this.drawBitmap(regionInfo, bitmap);
-    },
-    onImmediateLosslessGenericRegion:
-      function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {
-      this.onImmediateGenericRegion.apply(this, arguments);
-    },
-    onSymbolDictionary:
-      function SimpleSegmentVisitor_onSymbolDictionary(dictionary,
-                                                       currentSegment,
-                                                       referredSegments,
-                                                       data, start, end) {
-      var huffmanTables;
-      if (dictionary.huffman) {
-        error('JBIG2 error: huffman is not supported');
-      }
-
-      // Combines exported symbols from all referred segments
-      var symbols = this.symbols;
-      if (!symbols) {
-        this.symbols = symbols = {};
-      }
-
-      var inputSymbols = [];
-      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
-        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);
-      }
-
-      var decodingContext = new DecodingContext(data, start, end);
-      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman,
-        dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols,
-        dictionary.numberOfExportedSymbols, huffmanTables,
-        dictionary.template, dictionary.at,
-        dictionary.refinementTemplate, dictionary.refinementAt,
-        decodingContext);
-    },
-    onImmediateTextRegion:
-      function SimpleSegmentVisitor_onImmediateTextRegion(region,
-                                                          referredSegments,
-                                                          data, start, end) {
-      var regionInfo = region.info;
-      var huffmanTables;
-
-      // Combines exported symbols from all referred segments
-      var symbols = this.symbols;
-      var inputSymbols = [];
-      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
-        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);
-      }
-      var symbolCodeLength = log2(inputSymbols.length);
-
-      var decodingContext = new DecodingContext(data, start, end);
-      var bitmap = decodeTextRegion(region.huffman, region.refinement,
-        regionInfo.width, regionInfo.height, region.defaultPixelValue,
-        region.numberOfSymbolInstances, region.stripSize, inputSymbols,
-        symbolCodeLength, region.transposed, region.dsOffset,
-        region.referenceCorner, region.combinationOperator, huffmanTables,
-        region.refinementTemplate, region.refinementAt, decodingContext);
-      this.drawBitmap(regionInfo, bitmap);
-    },
-    onImmediateLosslessTextRegion:
-      function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {
-      this.onImmediateTextRegion.apply(this, arguments);
-    }
-  };
-
-  function Jbig2Image() {}
-
-  Jbig2Image.prototype = {
-    parseChunks: function Jbig2Image_parseChunks(chunks) {
-      return parseJbig2Chunks(chunks);
-    }
-  };
-
-  return Jbig2Image;
-})();
-
-
-var bidi = PDFJS.bidi = (function bidiClosure() {
-  // Character types for symbols from 0000 to 00FF.
-  var baseTypes = [
-    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',
-    'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
-    'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',
-    'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',
-    'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',
-    'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',
-    'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',
-    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
-    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
-    'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',
-    'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',
-    'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
-  ];
-
-  // Character types for symbols from 0600 to 06FF
-  var arabicTypes = [
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
-    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',
-    'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
-    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',
-    'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'
-  ];
-
-  function isOdd(i) {
-    return (i & 1) !== 0;
-  }
-
-  function isEven(i) {
-    return (i & 1) === 0;
-  }
-
-  function findUnequal(arr, start, value) {
-    for (var j = start, jj = arr.length; j < jj; ++j) {
-      if (arr[j] !== value) {
-        return j;
-      }
-    }
-    return j;
-  }
-
-  function setValues(arr, start, end, value) {
-    for (var j = start; j < end; ++j) {
-      arr[j] = value;
-    }
-  }
-
-  function reverseValues(arr, start, end) {
-    for (var i = start, j = end - 1; i < j; ++i, --j) {
-      var temp = arr[i];
-      arr[i] = arr[j];
-      arr[j] = temp;
-    }
-  }
-
-  function createBidiText(str, isLTR, vertical) {
-    return {
-      str: str,
-      dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl'))
-    };
-  }
-
-  // These are used in bidi(), which is called frequently. We re-use them on
-  // each call to avoid unnecessary allocations.
-  var chars = [];
-  var types = [];
-
-  function bidi(str, startLevel, vertical) {
-    var isLTR = true;
-    var strLength = str.length;
-    if (strLength === 0 || vertical) {
-      return createBidiText(str, isLTR, vertical);
-    }
-
-    // Get types and fill arrays
-    chars.length = strLength;
-    types.length = strLength;
-    var numBidi = 0;
-
-    var i, ii;
-    for (i = 0; i < strLength; ++i) {
-      chars[i] = str.charAt(i);
-
-      var charCode = str.charCodeAt(i);
-      var charType = 'L';
-      if (charCode <= 0x00ff) {
-        charType = baseTypes[charCode];
-      } else if (0x0590 <= charCode && charCode <= 0x05f4) {
-        charType = 'R';
-      } else if (0x0600 <= charCode && charCode <= 0x06ff) {
-        charType = arabicTypes[charCode & 0xff];
-      } else if (0x0700 <= charCode && charCode <= 0x08AC) {
-        charType = 'AL';
-      }
-      if (charType === 'R' || charType === 'AL' || charType === 'AN') {
-        numBidi++;
-      }
-      types[i] = charType;
-    }
-
-    // Detect the bidi method
-    // - If there are no rtl characters then no bidi needed
-    // - If less than 30% chars are rtl then string is primarily ltr
-    // - If more than 30% chars are rtl then string is primarily rtl
-    if (numBidi === 0) {
-      isLTR = true;
-      return createBidiText(str, isLTR);
-    }
-
-    if (startLevel === -1) {
-      if ((strLength / numBidi) < 0.3) {
-        isLTR = true;
-        startLevel = 0;
-      } else {
-        isLTR = false;
-        startLevel = 1;
-      }
-    }
-
-    var levels = [];
-    for (i = 0; i < strLength; ++i) {
-      levels[i] = startLevel;
-    }
-
-    /*
-     X1-X10: skip most of this, since we are NOT doing the embeddings.
-     */
-    var e = (isOdd(startLevel) ? 'R' : 'L');
-    var sor = e;
-    var eor = sor;
-
-    /*
-     W1. Examine each non-spacing mark (NSM) in the level run, and change the
-     type of the NSM to the type of the previous character. If the NSM is at the
-     start of the level run, it will get the type of sor.
-     */
-    var lastType = sor;
-    for (i = 0; i < strLength; ++i) {
-      if (types[i] === 'NSM') {
-        types[i] = lastType;
-      } else {
-        lastType = types[i];
-      }
-    }
-
-    /*
-     W2. Search backwards from each instance of a European number until the
-     first strong type (R, L, AL, or sor) is found.  If an AL is found, change
-     the type of the European number to Arabic number.
-     */
-    lastType = sor;
-    var t;
-    for (i = 0; i < strLength; ++i) {
-      t = types[i];
-      if (t === 'EN') {
-        types[i] = (lastType === 'AL') ? 'AN' : 'EN';
-      } else if (t === 'R' || t === 'L' || t === 'AL') {
-        lastType = t;
-      }
-    }
-
-    /*
-     W3. Change all ALs to R.
-     */
-    for (i = 0; i < strLength; ++i) {
-      t = types[i];
-      if (t === 'AL') {
-        types[i] = 'R';
-      }
-    }
-
-    /*
-     W4. A single European separator between two European numbers changes to a
-     European number. A single common separator between two numbers of the same
-     type changes to that type:
-     */
-    for (i = 1; i < strLength - 1; ++i) {
-      if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {
-        types[i] = 'EN';
-      }
-      if (types[i] === 'CS' &&
-          (types[i - 1] === 'EN' || types[i - 1] === 'AN') &&
-          types[i + 1] === types[i - 1]) {
-        types[i] = types[i - 1];
-      }
-    }
-
-    /*
-     W5. A sequence of European terminators adjacent to European numbers changes
-     to all European numbers:
-     */
-    for (i = 0; i < strLength; ++i) {
-      if (types[i] === 'EN') {
-        // do before
-        var j;
-        for (j = i - 1; j >= 0; --j) {
-          if (types[j] !== 'ET') {
-            break;
-          }
-          types[j] = 'EN';
-        }
-        // do after
-        for (j = i + 1; j < strLength; --j) {
-          if (types[j] !== 'ET') {
-            break;
-          }
-          types[j] = 'EN';
-        }
-      }
-    }
-
-    /*
-     W6. Otherwise, separators and terminators change to Other Neutral:
-     */
-    for (i = 0; i < strLength; ++i) {
-      t = types[i];
-      if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') {
-        types[i] = 'ON';
-      }
-    }
-
-    /*
-     W7. Search backwards from each instance of a European number until the
-     first strong type (R, L, or sor) is found. If an L is found,  then change
-     the type of the European number to L.
-     */
-    lastType = sor;
-    for (i = 0; i < strLength; ++i) {
-      t = types[i];
-      if (t === 'EN') {
-        types[i] = ((lastType === 'L') ? 'L' : 'EN');
-      } else if (t === 'R' || t === 'L') {
-        lastType = t;
-      }
-    }
-
-    /*
-     N1. A sequence of neutrals takes the direction of the surrounding strong
-     text if the text on both sides has the same direction. European and Arabic
-     numbers are treated as though they were R. Start-of-level-run (sor) and
-     end-of-level-run (eor) are used at level run boundaries.
-     */
-    for (i = 0; i < strLength; ++i) {
-      if (types[i] === 'ON') {
-        var end = findUnequal(types, i + 1, 'ON');
-        var before = sor;
-        if (i > 0) {
-          before = types[i - 1];
-        }
-
-        var after = eor;
-        if (end + 1 < strLength) {
-          after = types[end + 1];
-        }
-        if (before !== 'L') {
-          before = 'R';
-        }
-        if (after !== 'L') {
-          after = 'R';
-        }
-        if (before === after) {
-          setValues(types, i, end, before);
-        }
-        i = end - 1; // reset to end (-1 so next iteration is ok)
-      }
-    }
-
-    /*
-     N2. Any remaining neutrals take the embedding direction.
-     */
-    for (i = 0; i < strLength; ++i) {
-      if (types[i] === 'ON') {
-        types[i] = e;
-      }
-    }
-
-    /*
-     I1. For all characters with an even (left-to-right) embedding direction,
-     those of type R go up one level and those of type AN or EN go up two
-     levels.
-     I2. For all characters with an odd (right-to-left) embedding direction,
-     those of type L, EN or AN go up one level.
-     */
-    for (i = 0; i < strLength; ++i) {
-      t = types[i];
-      if (isEven(levels[i])) {
-        if (t === 'R') {
-          levels[i] += 1;
-        } else if (t === 'AN' || t === 'EN') {
-          levels[i] += 2;
-        }
-      } else { // isOdd
-        if (t === 'L' || t === 'AN' || t === 'EN') {
-          levels[i] += 1;
-        }
-      }
-    }
-
-    /*
-     L1. On each line, reset the embedding level of the following characters to
-     the paragraph embedding level:
-
-     segment separators,
-     paragraph separators,
-     any sequence of whitespace characters preceding a segment separator or
-     paragraph separator, and any sequence of white space characters at the end
-     of the line.
-     */
-
-    // don't bother as text is only single line
-
-    /*
-     L2. From the highest level found in the text to the lowest odd level on
-     each line, reverse any contiguous sequence of characters that are at that
-     level or higher.
-     */
-
-    // find highest level & lowest odd level
-    var highestLevel = -1;
-    var lowestOddLevel = 99;
-    var level;
-    for (i = 0, ii = levels.length; i < ii; ++i) {
-      level = levels[i];
-      if (highestLevel < level) {
-        highestLevel = level;
-      }
-      if (lowestOddLevel > level && isOdd(level)) {
-        lowestOddLevel = level;
-      }
-    }
-
-    // now reverse between those limits
-    for (level = highestLevel; level >= lowestOddLevel; --level) {
-      // find segments to reverse
-      var start = -1;
-      for (i = 0, ii = levels.length; i < ii; ++i) {
-        if (levels[i] < level) {
-          if (start >= 0) {
-            reverseValues(chars, start, i);
-            start = -1;
-          }
-        } else if (start < 0) {
-          start = i;
-        }
-      }
-      if (start >= 0) {
-        reverseValues(chars, start, levels.length);
-      }
-    }
-
-    /*
-     L3. Combining marks applied to a right-to-left base character will at this
-     point precede their base character. If the rendering engine expects them to
-     follow the base characters in the final display process, then the ordering
-     of the marks and the base character must be reversed.
-     */
-
-    // don't bother for now
-
-    /*
-     L4. A character that possesses the mirrored property as specified by
-     Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved
-     directionality of that character is R.
-     */
-
-    // don't mirror as characters are already mirrored in the pdf
-
-    // Finally, return string
-    var result = '';
-    for (i = 0, ii = chars.length; i < ii; ++i) {
-      var ch = chars[i];
-      if (ch !== '<' && ch !== '>') {
-        result += ch;
-      }
-    }
-    return createBidiText(result, isLTR);
-  }
-
-  return bidi;
-})();
-
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-/* Copyright 2014 Opera Software ASA
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.
- * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.
- */
-/* globals Uint32ArrayView */
-
-'use strict';
-
-var MurmurHash3_64 = (function MurmurHash3_64Closure (seed) {
-  // Workaround for missing math precison in JS.
-  var MASK_HIGH = 0xffff0000;
-  var MASK_LOW = 0xffff;
-
-  function MurmurHash3_64 (seed) {
-    var SEED = 0xc3d2e1f0;
-    this.h1 = seed ? seed & 0xffffffff : SEED;
-    this.h2 = seed ? seed & 0xffffffff : SEED;
-  }
-
-  var alwaysUseUint32ArrayView = false;
-//#if !(FIREFOX || MOZCENTRAL || B2G || CHROME)
-  // old webkits have issues with non-aligned arrays
-  try {
-    new Uint32Array(new Uint8Array(5).buffer, 0, 1);
-  } catch (e) {
-    alwaysUseUint32ArrayView = true;
-  }
-//#endif
-
-  MurmurHash3_64.prototype = {
-    update: function MurmurHash3_64_update(input) {
-      var useUint32ArrayView = alwaysUseUint32ArrayView;
-      var i;
-      if (typeof input === 'string') {
-        var data = new Uint8Array(input.length * 2);
-        var length = 0;
-        for (i = 0; i < input.length; i++) {
-          var code = input.charCodeAt(i);
-          if (code <= 0xff) {
-            data[length++] = code;
-          }
-          else {
-            data[length++] = code >>> 8;
-            data[length++] = code & 0xff;
-          }
-        }
-      } else if (input instanceof Uint8Array) {
-        data = input;
-        length = data.length;
-      } else if (typeof input === 'object' && ('length' in input)) {
-        // processing regular arrays as well, e.g. for IE9
-        data = input;
-        length = data.length;
-        useUint32ArrayView = true;
-      } else {
-        throw new Error('Wrong data format in MurmurHash3_64_update. ' +
-                        'Input must be a string or array.');
-      }
-
-      var blockCounts = length >> 2;
-      var tailLength = length - blockCounts * 4;
-      // we don't care about endianness here
-      var dataUint32 = useUint32ArrayView ?
-        new Uint32ArrayView(data, blockCounts) :
-        new Uint32Array(data.buffer, 0, blockCounts);
-      var k1 = 0;
-      var k2 = 0;
-      var h1 = this.h1;
-      var h2 = this.h2;
-      var C1 = 0xcc9e2d51;
-      var C2 = 0x1b873593;
-      var C1_LOW = C1 & MASK_LOW;
-      var C2_LOW = C2 & MASK_LOW;
-
-      for (i = 0; i < blockCounts; i++) {
-        if (i & 1) {
-          k1 = dataUint32[i];
-          k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);
-          k1 = k1 << 15 | k1 >>> 17;
-          k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);
-          h1 ^= k1;
-          h1 = h1 << 13 | h1 >>> 19;
-          h1 = h1 * 5 + 0xe6546b64;
-        } else {
-          k2 = dataUint32[i];
-          k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW);
-          k2 = k2 << 15 | k2 >>> 17;
-          k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW);
-          h2 ^= k2;
-          h2 = h2 << 13 | h2 >>> 19;
-          h2 = h2 * 5 + 0xe6546b64;
-        }
-      }
-
-      k1 = 0;
-
-      switch (tailLength) {
-        case 3:
-          k1 ^= data[blockCounts * 4 + 2] << 16;
-          /* falls through */
-        case 2:
-          k1 ^= data[blockCounts * 4 + 1] << 8;
-          /* falls through */
-        case 1:
-          k1 ^= data[blockCounts * 4];
-          /* falls through */
-        k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);
-        k1 = k1 << 15 | k1 >>> 17;
-        k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);
-        if (blockCounts & 1) {
-          h1 ^= k1;
-        } else {
-          h2 ^= k1;
-        }
-      }
-
-      this.h1 = h1;
-      this.h2 = h2;
-      return this;
-    },
-
-    hexdigest: function MurmurHash3_64_hexdigest () {
-      var h1 = this.h1;
-      var h2 = this.h2;
-
-      h1 ^= h2 >>> 1;
-      h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW);
-      h2 = (h2 * 0xff51afd7 & MASK_HIGH) |
-           (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16);
-      h1 ^= h2 >>> 1;
-      h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW);
-      h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) |
-           (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16);
-      h1 ^= h2 >>> 1;
-
-      for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) {
-        var hex = (arr[i] >>> 0).toString(16);
-        while (hex.length < 8) {
-          hex = '0' + hex;
-        }
-        str += hex;
-      }
-
-      return str;
-    }
-  };
-
-  return MurmurHash3_64;
-})();
-
-
-}).call((typeof window === 'undefined') ? this : window);
-
-if (!PDFJS.workerSrc && typeof document !== 'undefined') {
-  // workerSrc is not set -- using last script url to define default location
-  PDFJS.workerSrc = (function () {
-    'use strict';
-    var scriptTagContainer = document.body ||
-                             document.getElementsByTagName('head')[0];
-    var pdfjsSrc = scriptTagContainer.lastChild.src;
-    return pdfjsSrc && pdfjsSrc.replace(/\.js$/i, '.worker.js');
-  })();
-}
-

--
Gitblit v1.9.3